Vue 前端可視化活動(dòng)編輯器

先看效果晤揣,為一個(gè)可視化活動(dòng)編輯器。


9759194b0cce40f59c39a0b004008454_tplv-k3u1fbpfcp-zoom-1.png

演示地址:https://form.lljj.me/vue-editor.html#/editor

項(xiàng)目地址:https://github.com/lljj-x/vue-json-schema-form/

基于 JSON Schema 開箱即用的簡單活動(dòng)可視化編輯器空免。

背景

在做生成一個(gè)可視化店鋪裝修系統(tǒng)的時(shí)候,需要解決配置數(shù)據(jù)表單的通用性踩蔚,參閱了一些現(xiàn)用的解決方案砚嘴,最終通過 JSON Schema 來生成對(duì)應(yīng)的表單和校驗(yàn)規(guī)則。

參考資料:https://github.com/CntChen/cntchen.github.io/issues/15

JSON Schema 主要運(yùn)用在如下幾點(diǎn):

  • 基于 JSON Schema 來動(dòng)態(tài)生成數(shù)據(jù)配置表單和數(shù)據(jù)校驗(yàn)
  • 結(jié)合發(fā)布流程同步 JSON Schema 到后端系統(tǒng)做接口數(shù)據(jù)校驗(yàn)
  • 一個(gè)活動(dòng)版塊對(duì)應(yīng)一個(gè) JSON Schema 和一份視圖 View組件 即可

實(shí)現(xiàn)

首先可視化編輯器需要做到板塊的管理照瘾,這些板塊支持可視化的編輯配置和效果展示匈棘,最終相互組裝為一個(gè)頁面。

每個(gè)板塊我們不可避免的需要一個(gè) View組件 來做展示析命,因?yàn)槊總€(gè)板塊都長得不一樣主卫。板塊配置表單和數(shù)據(jù)校驗(yàn)都通過 JSON Schema 來實(shí)現(xiàn),然后再通過一個(gè)拖動(dòng)的容器來承載這些板塊以及一些其它的數(shù)據(jù)配置鹃愤。

如下圖:


52ec87b534aa4ecaa7da3a38e17c6f7d_tplv-k3u1fbpfcp-zoom-1.jpg

這樣當(dāng)我們在添加新的板塊時(shí)簇搅,只需要開發(fā)一個(gè) View組件 ,和書寫一份 JSON Schema 來定義數(shù)據(jù)即可软吐。

功能介紹

基于Vue瘩将,依賴 ElementUi、vuedraggable、@lljj/vue-json-schema-form

  • 板塊支持配置化
  • 支持可添加數(shù)姿现,是否可刪除肠仪,置頂,置底备典,圖標(biāo)配置
  • 支持拖動(dòng)或者點(diǎn)擊上下移動(dòng)异旧,復(fù)制刪除等調(diào)整頁面布局
  • 支持頁面預(yù)覽模式
  • 支持編輯還原數(shù)據(jù)和默認(rèn)板塊數(shù)據(jù)配置
  • 視圖組件支持異步加載
  • 不支持嵌套組件
  • ...

添加新的板塊只需要在 config/tools.js 導(dǎo)入新增的板塊,并且配置好工具欄即可提佣,如:

import * as componentPackFlashSaleGoodsList from '../viewComponents/FlashSaleGoodsList';

const tools = [
    {
        groupName: '圖文類',
        componentList: [{
            // 比如這里添加新增的模塊
            title: '秒殺商品', // 板塊標(biāo)題
            maxNum: 3, // 最多可添加次數(shù)
            icon: 'el-icon-picture', // 工具欄圖標(biāo)類名
            componentPack: componentPackFlashSaleGoodsList, // 重點(diǎn)是這個(gè)當(dāng)前板塊的組件包
            additional: {
                bottomDisplay: true, // 是否置底顯示
                topDisplay: true, // 是否置頂顯示
                unRemove: true // 是否為不可移除
            }
        }]
    }
]

新增板塊文件結(jié)構(gòu)如下:( viewComponents/FlashSaleGoodsList/index.js 這里對(duì)應(yīng)上面工具欄配置導(dǎo)入的組件包文件)

import propsSchema from './schema.json';
import uiSchema from './uiSchema.js';
import errorSchema from './errorSchema.js';

// 這里可以異步導(dǎo)入
const View = () => import('./View.vue');

const NAME = propsSchema.id;
const componentViewName = `${NAME}View`;

export {
    propsSchema, // JSON Schema 定義數(shù)據(jù)結(jié)構(gòu)和生成表單 vue-json-schema-form 參數(shù)    
    componentViewName,  // 視圖View組件name吮蛹,需要自己保持唯一
    View, // 視圖View組件
    uiSchema, // uiSchema 輔助增強(qiáng)表單樣式 不必須 vue-json-schema-form 參數(shù)
    errorSchema, // 輔助增強(qiáng)表單校驗(yàn)錯(cuò)誤提示 不必須 vue-json-schema-form 參數(shù)
    // customRule, // 自定義的校驗(yàn)規(guī)則 vue-json-schema-form 參數(shù) (需要更多的vue-json-schema-form 參數(shù)參數(shù)可自己添加)
};

導(dǎo)出模塊解釋如下:

  • propsSchemarequired JSON Schema配置,必須包含一個(gè) id 的屬性拌屏,并且要保證唯一潮针,在保存和編輯數(shù)據(jù)時(shí)用來標(biāo)識(shí)當(dāng)前組件。傳遞給 vue-json-schema-form 生成表單槐壳;
  • componentViewNamerequired 板塊View組件名然低,唯一帅韧,建議通過 id + View 拼接满哪,只是為了在注冊組件時(shí)的組件名,其實(shí)我也可以幫你生成任柜,但是我沒有枫笛;
  • Viewrequired required 板塊View組件吨灭,需要異步導(dǎo)入就 () => import('./xxx.vue'),View 組件必須包含一個(gè)名為 formData 的props接受當(dāng)前表單數(shù)據(jù)刑巧;
  • uiSchema: 傳遞給 vue-json-schema-form 生成表單喧兄,用于增強(qiáng)生成表單的樣式,可選啊楚;
  • errorSchema: 傳遞給 vue-json-schema-form 生成表單吠冤,用于增強(qiáng)表單的校驗(yàn)提示信息
  • customRule: 傳遞給 vue-json-schema-form 生成表單,用于自定義校驗(yàn)表單數(shù)據(jù)

如果需要更多 vue-json-schema-form 參數(shù)可直接在 packages/demo/src/vue-editor/views/editor/Editor.vue 渲染 VueElementForm 組件時(shí)添加即可恭理。

  • 新增板塊可參見 /packages/demo/src/vue-editor/views/editor/viewComponents 內(nèi)現(xiàn)有板塊
  • 工具欄和默認(rèn)數(shù)據(jù)配置在 /packages/demo/src/vue-editor/views/editor/config 文件夾內(nèi)

整個(gè)實(shí)現(xiàn)相對(duì)比較簡單拯辙,感興趣的可以花上兩個(gè)小時(shí)看下源碼,歡迎討論提問颜价。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涯保,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子周伦,更是在濱河造成了極大的恐慌夕春,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件专挪,死亡現(xiàn)場離奇詭異及志,居然都是意外死亡片排,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門速侈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來划纽,“玉大人,你說我怎么就攤上這事锌畸。” “怎么了靖避?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵潭枣,是天一觀的道長。 經(jīng)常有香客問我幻捏,道長盆犁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任篡九,我火速辦了婚禮谐岁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榛臼。我一直安慰自己伊佃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布沛善。 她就那樣靜靜地躺著航揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪金刁。 梳的紋絲不亂的頭發(fā)上帅涂,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音尤蛮,去河邊找鬼媳友。 笑死,一個(gè)胖子當(dāng)著我的面吹牛产捞,可吹牛的內(nèi)容都是我干的醇锚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼轧葛,長吁一口氣:“原來是場噩夢啊……” “哼搂抒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尿扯,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤求晶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衷笋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芳杏,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矩屁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爵赵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吝秕。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖空幻,靈堂內(nèi)的尸體忽然破棺而出烁峭,到底是詐尸還是另有隱情,我是刑警寧澤秕铛,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布约郁,位于F島的核電站,受9級(jí)特大地震影響但两,放射性物質(zhì)發(fā)生泄漏鬓梅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一谨湘、第九天 我趴在偏房一處隱蔽的房頂上張望绽快。 院中可真熱鬧,春花似錦紧阔、人聲如沸坊罢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艘绍。三九已至,卻和暖如春秫筏,著一層夾襖步出監(jiān)牢的瞬間诱鞠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工这敬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航夺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓崔涂,卻偏偏與公主長得像阳掐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冷蚂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353