VUE應用產品之iShow H5編輯器

飯妖精發表於2017-09-11

什麼都不說,先上demo

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

文件:qiuyaofan.github.io/iShow/

網站線上地址:qiuyaofan.github.io/ishowPage

今年年初,開始斷斷續續打磨自己的vue編輯器,到現在也有半年有餘。目前是ishow1.0版本,後續會不斷完善,也歡迎大家貢獻自己的想法,共同進步。如果喜歡這個專案,記得star哦~


編輯器長這樣的:

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元件部分

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

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

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

開發思路

編輯器最終生成的是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'
        }
     }
 }複製程式碼

今天就分享到這裡啦~~

相關文章