VUE應用產品之iShow H5編輯器

什麼都不說,先上demohtml

github地址:github.com/qiuyaofan/i… vue

文檔:qiuyaofan.github.io/iShow/ git

網站在線地址:qiuyaofan.github.io/ishowPagegithub

今年年初,開始斷斷續續打磨本身的vue編輯器,到如今也有半年有餘。目前是ishow1.0版本,後續會不斷完善,也歡迎你們貢獻本身的想法,共同進步。若是喜歡這個項目,記得star哦~vuex


編輯器長這樣的:json

ishow的界面以下所示:

ishow
ishow

json渲染的手機端示例(iphone6爲例)

ishow
ishow

ishow編輯器的主要功能以下:

ishow v1.0功能列表
一:字體編輯
1.普通樣式:背景顏色,文字顏色,字體,對齊,透明度,邊距,行高,大小,加粗,傾斜,下劃線,清除格式
2.邊框樣式:寬度,顏色,類型,圓角
3.陰影樣式:陰影顏色,大小,半徑,方向
4.點擊可修改文字,拖拽改變位置

二:圖片編輯
基本編輯:參考字體編輯
添加圖片,替換圖片
拉伸改變大小,旋轉
上傳圖片
圖片選擇彈層有:預覽,裁切(後臺未接),選擇,刪除等功能

三:動畫效果
打字機,漸變,淡入淡出,旋轉,縮放等,動畫種類參考易企秀
時間,延時,添加動畫,預覽動畫,清除動畫
多個動畫
次數,循環(1.0暫不實現)

四:左側頁面總預覽
添加新一頁,刪除,排序(1.0暫不實現)

五:鍵盤操做
左右鍵移動元素
刪除鍵刪除選中元素
撤銷ctrl+z(最多緩存40個操做)

六:層級調整(還需完善優化)

七:表單配置添加
目前支持表單類型:輸入框,單選,多選,下拉,按鈕
支持添加驗證

八:h5提交配置
標題,封面等


九:保存,發佈(模版,h5 json)


十:多媒體
背景添加
音頻添加
視頻添加(1.0暫不實現)


十一:模版管理(1.0暫不實現,須要後臺配合)
編輯模版,搜索模版

十二:手機端渲染
根據json完成動畫播放,翻頁,音頻播放,屏幕適配等
表單提交後臺(未實現)複製代碼

ishow調用的外部插件

IUI組件部分api

swiper:www.swiper.com.cn/api/index.h… 數組

餓了麼element:element.eleme.io/#/zh-CN/com… 緩存

參考的開源架子:github.com/PanJiaChen/…bash

開發思路

編輯器最終生成的是json配置,手機端經過json配置渲染出相應的樣式,動畫等。

mock.js

目前編輯器是用mock實現模擬接口,若是須要換回本身的接口

1.去除config.js的mock調用

2.修改utils/fetch.js代碼

//mock.js
resolve(res);
//沒有mock
// if (res.code === 40001) {
//   // 登出
//   store.dispatch('FedLogOut').then(() => {
//     router.push({ path: '/login' })
//   });
// } else if (res.code !== 200) {
//   Message({
//     message: res.msg,
//     type: 'error',
//     duration: 5 * 1000
//   });
//   reject(res);
// } else {
//   resolve(res);
// }

註釋掉resolve(res);
下面的取消註釋便可複製代碼

json格式以下所示

var JSON={
    "page":[
        {
            "page": 1,
            "json": [
                {
                  /***
                      控件類型
                      "1":"text",
                      "2":"img",
                      "3":"textarea",
                      "4":"radio",
                      "5":"checkbox",
                      "6":"select",
                      "7":"button"
                  ***/
                    "type": 2,
                    "content": "https://img.kxz.com/assets/kxz/fixedInputCover1_20170630/fb7bf5d8-56d6-46ea-a01b-35e6943647da_demo1-4.png",
                    // 位置
                    "position": {
                        "top": 360,
                        "left": 201
                    },
                    "width": 175,
                    "height": 125.2680965147453,
                    //基本樣式屬性
                    "text": {
                        "backgroundColor": "rgba(0,0,0,0)",
                        "opacity": 100,
                        "padding": 0,
                        "rotate": 94,
                        "borderWidth": 0,
                        "borderRadius": 0,
                        "borderColor": "rgba(204, 204, 204,1)",
                        "borderStyle": "solid",
                        "shadowColor": "rgba(204, 204, 204,1)",
                        "shadowWidth": 0,
                        "shadowRadius": 10,
                        "shadowDire": 0
                    },
                    //動畫類型,支持多動畫
                    "animate": [
                        {
                            "animationName": "fadeIn",
                            "animationDuration": 2,
                            "animationTimingFunction": "ease",
                            "animationDelay": 0.4,
                            "animationFillMode": "both",
                            "animationPlayState": "initial",
                            "isOut": false
                        }
                    ],
                    "id": 1501745923909,
                    //層級
                    "zIndex": 6
                }

            ],
            //這一頁的背景圖片
            "bgImage": {
                "backgroundColor": "",
                "coord": "",
                "url": ""
            }
        },

    ],
    //配置
    "setting": {
        //背景音樂
        "bgMusic": {
            "url": "ttp://192.168.1.100:8080/uploadfile/3/15/5/8765a93f-351e-4984-8a03-6ef746ea36fd_bg.mp3",
            "name": "enemy2_down.mp3"
        }
    }
};複製代碼

使用vue+element開發的部分經驗總結

使用vue以來遇到的一些問題及解決辦法,分享給你們,但願對你有幫助

1.element date組件

報錯內容:TypeError: value.getTime is not a function複製代碼

原理:插件生成和默認值須要是Fri Sep 08 2017 16:25:00 GMT+0800 (CST)這種格式,但項目中一般是YYYY-MM-DD hh:mm:ss格式,因此報錯.

解決辦法:

後臺修改存儲類型,或者

//提交時
momentChange(date) {
    return date?this.moment(date).format('YYYY-MM-DD'):'';
},
//獲取默認值回填前
dateChange(date){
  return date?new Date(date):'';
}複製代碼

2.組件間調用

//子組件調用
<main-editor ref="chileComponentName"></main-editor>
層級少可使用this.$refs.chileComponentName.method

層級多借助bus.js或者vuex

//父組件調用
this.$parent.method

// 當前父元素
this.$el複製代碼

3.element驗證的坑

常常加了type="number"報錯,而後搜到答案v-model.number="",而後發現 11.ee竟然驗證經過?!
實際上是v-model.number會自動把11.ee轉爲11去驗證

解決辦法:

<el-form-item label="手機號碼" class="mb20 is-required" prop="mobile">
    <el-input v-model.number="mobile" :maxlength="11"></el-input>
 </el-form-item>

 data() {
     let validateMobile = (rule, value, callback) => {
        if (!value||(value + '').length !== 11) {
          callback(new Error('手機號碼必須爲11位純數字'));
        } else {
          callback();
        }
     };
     return {
         mobile:'',
         rules: {
              mobile: [
                {validator: validateMobile, trigger: 'blur'}
             ]
         }
     }
 }複製代碼

4.經過el-upload上傳七牛

<el-upload action="http://up-z1.qiniu.com/" :data="uploadForm" list-type="picture-card"
       :file-list="fileList"
       :on-preview="preview"
       :on-remove="remove"
       :before-upload="beforeUpload"
       name="file"
       :on-change="upload"
       :thumbnail-mode="true"
       :on-success="handleSuccess">
</el-upload>

//獲取token接口函數
import {getUploadToken} from 'api';
method:{
    beforeUpload(file) {
        //拿到token
        return getUploadToken().then(response => {
            //後臺根據七牛的密鑰生成的token
          this.uploadForm.token = response.data.token;
          //咱們生成惟一的key
          this.uploadForm.key = this.createKey(file);
          //前綴:在線路徑的前綴
          this.prefix = response.data.prefix;
        }).catch(err => {
          console.info(err)
        });
    },
    createKey(file) {
        let curr = this.moment().format('YYYYMMDD').toString();
        let prefix = this.moment(file.lastModified).format('HHmmss').toString();
        let suffix = file.name;
        let key = encodeURI(`${curr}/${prefix}_${suffix}`);
        return key;
    },
    handleSuccess(response, file, fileList) {
         //拼接成能訪問的在線連接
        console.info(this.prefix + response.key);
    }
}複製代碼

5.vue屬性

1.添加background-image時
 <div :style="{ 'background-image': 'url(' + imageUrl + ')' }"> </div>

2.添加數組到style
 <div :style="[textJson,animateJson]"></div>

 //data舉例
 data() {
     return {
         textJson:{
            "backgroundColor": "rgba(0,0,0,0)",
            "opacity": 100,
            "padding": 0,
            "rotate": 0,
            "borderWidth": 0,
            "borderRadius": 100,
            "borderStyle": "solid",
            "shadowColor": "rgba(204, 204, 204,1)",
            "shadowWidth": 0,
            "shadowRadius": 10,
            "shadowDire": 0,
            "borderColor": "rgba(204, 204, 204,1)"
        },
        animateJson:{
            animationName:'fadeIn'
        }
     }
 }複製代碼

今天就分享到這裏啦~~

相關文章
相關標籤/搜索