From a6740bae038464c60f8c28f16bb62f7e01df8d40 Mon Sep 17 00:00:00 2001 From: we452366 <996925662@qq.com> Date: Wed, 12 Jun 2024 17:09:24 +0800 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=E6=96=B0=E5=A2=9Evue2=E7=9A=84tem?= =?UTF-8?q?plate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - template/component/.gitignore | 31 ++ template/component/README.md | 3 + template/component/babel.config.js | 3 + template/component/base.config.js | 8 + template/component/lcd.component.json | 9 + template/component/package.json | 44 ++ template/component/public/favicon.ico | Bin 0 -> 4286 bytes template/component/public/index.html | 17 + template/component/publish.sh | 1 + template/component/src/App.vue | 40 ++ template/component/src/api/component.js | 8 + template/component/src/assets/logo.png | Bin 0 -> 43261 bytes template/component/src/main.js | 16 + template/component/src/store/index.js | 20 + template/component/src/store/xxx/actions.js | 1 + template/component/src/store/xxx/getters.js | 0 template/component/src/store/xxx/index.js | 12 + template/component/src/store/xxx/mutations.js | 4 + template/component/src/store/xxx/state.js | 4 + template/component/src/utils/http.js | 33 ++ template/component/vue.config.js | 68 +++ template/project/.gitignore | 69 +++ template/project/README.md | 49 ++ template/project/babel.config.js | 9 + template/project/base.config.js | 8 + template/project/build/chainWebpack.js | 55 +++ template/project/build/configureWebpack.js | 5 + template/project/build/dev/config.json | 4 + .../project/build/dev/configureWebpack.js | 17 + template/project/build/devServer.js | 24 + template/project/build/index.js | 11 + template/project/build/postCSSPlugin.js | 142 ++++++ template/project/build/production/config.json | 6 + .../build/production/configureWebpack.js | 43 ++ template/project/package.json | 55 +++ template/project/public/favicon.ico | Bin 0 -> 4286 bytes template/project/public/index.html | 21 + template/project/src/App.vue | 30 ++ template/project/src/api/auth.js | 11 + template/project/src/api/editor.js | 17 + template/project/src/api/home.js | 12 + template/project/src/api/monitor.js | 11 + template/project/src/assets/logo.png | Bin 0 -> 43261 bytes template/project/src/directives/button.js | 33 ++ template/project/src/directives/loading.js | 53 +++ template/project/src/lcd.engine.js | 248 ++++++++++ template/project/src/main.js | 206 ++++++++ template/project/src/mixins/htmlCanvas.js | 38 ++ template/project/src/mixins/renderer.js | 36 ++ template/project/src/mixins/router.js | 14 + template/project/src/mixins/setter.js | 94 ++++ template/project/src/mixins/sider.js | 45 ++ template/project/src/mixins/tooler.js | 33 ++ template/project/src/mixins/viewer.js | 41 ++ template/project/src/mixins/window.js | 29 ++ template/project/src/router/index.js | 68 +++ template/project/src/setter/index.js | 3 + .../src/setter/lcd-setter-xxx/constant.js | 1 + .../src/setter/lcd-setter-xxx/index.js | 8 + .../src/setter/lcd-setter-xxx/index.vue | 94 ++++ .../src/setter/lcd-setter-xxx/validator.js | 0 template/project/src/sider/index.js | 3 + .../project/src/sider/lcd-sider-xxx/index.js | 10 + .../project/src/sider/lcd-sider-xxx/index.vue | 37 ++ template/project/src/store/editor.js | 439 ++++++++++++++++++ template/project/src/store/home.js | 12 + template/project/src/store/index.js | 22 + template/project/src/store/modules/index.js | 1 + template/project/src/store/modules/xxx.js | 1 + template/project/src/store/monitor.js | 17 + template/project/src/store/preview.js | 7 + template/project/src/styles/cover.less | 254 ++++++++++ template/project/src/styles/index.less | 61 +++ template/project/src/styles/vars.less | 57 +++ template/project/src/utils/deep.js | 16 + template/project/src/utils/http.js | 40 ++ template/project/src/utils/image.js | 13 + template/project/src/utils/index.js | 9 + template/project/src/utils/is.js | 17 + template/project/src/utils/merge.js | 36 ++ template/project/src/utils/useKeyBoard.js | 100 ++++ template/project/src/views/Login.vue | 146 ++++++ template/project/src/views/NotFound.vue | 21 + .../views/editor/components/RenderBottom.vue | 68 +++ .../src/views/editor/components/RenderTop.vue | 414 +++++++++++++++++ .../views/editor/components/SetterContent.vue | 35 ++ .../views/editor/components/SetterFloat.vue | 45 ++ .../views/editor/components/SetterHeader.vue | 99 ++++ .../src/views/editor/components/SiderMain.vue | 132 ++++++ .../src/views/editor/components/ToolLeft.vue | 228 +++++++++ .../src/views/editor/components/ToolRight.vue | 153 ++++++ template/project/src/views/editor/index.vue | 271 +++++++++++ .../src/views/home/components/CreateModal.vue | 261 +++++++++++ .../src/views/home/components/List.vue | 317 +++++++++++++ .../src/views/home/components/MoreModel.vue | 349 ++++++++++++++ .../src/views/home/components/Search.vue | 139 ++++++ template/project/src/views/home/index.vue | 216 +++++++++ .../views/monitor/components/ViewSwitch.vue | 121 +++++ template/project/src/views/monitor/index.vue | 159 +++++++ template/project/src/views/preview/index.vue | 119 +++++ template/project/vue.config.js | 100 ++++ template/setter/constant.js | 1 + template/setter/index.js | 8 + template/setter/index.vue | 94 ++++ template/setter/validator.js | 0 template/sider/index.js | 10 + template/sider/index.vue | 37 ++ 108 files changed, 6660 insertions(+), 1 deletion(-) create mode 100644 template/component/.gitignore create mode 100644 template/component/README.md create mode 100644 template/component/babel.config.js create mode 100644 template/component/base.config.js create mode 100644 template/component/lcd.component.json create mode 100644 template/component/package.json create mode 100644 template/component/public/favicon.ico create mode 100644 template/component/public/index.html create mode 100644 template/component/publish.sh create mode 100644 template/component/src/App.vue create mode 100644 template/component/src/api/component.js create mode 100644 template/component/src/assets/logo.png create mode 100644 template/component/src/main.js create mode 100644 template/component/src/store/index.js create mode 100644 template/component/src/store/xxx/actions.js create mode 100644 template/component/src/store/xxx/getters.js create mode 100644 template/component/src/store/xxx/index.js create mode 100644 template/component/src/store/xxx/mutations.js create mode 100644 template/component/src/store/xxx/state.js create mode 100644 template/component/src/utils/http.js create mode 100644 template/component/vue.config.js create mode 100644 template/project/.gitignore create mode 100644 template/project/README.md create mode 100644 template/project/babel.config.js create mode 100644 template/project/base.config.js create mode 100644 template/project/build/chainWebpack.js create mode 100644 template/project/build/configureWebpack.js create mode 100644 template/project/build/dev/config.json create mode 100644 template/project/build/dev/configureWebpack.js create mode 100644 template/project/build/devServer.js create mode 100644 template/project/build/index.js create mode 100644 template/project/build/postCSSPlugin.js create mode 100644 template/project/build/production/config.json create mode 100644 template/project/build/production/configureWebpack.js create mode 100644 template/project/package.json create mode 100644 template/project/public/favicon.ico create mode 100644 template/project/public/index.html create mode 100644 template/project/src/App.vue create mode 100644 template/project/src/api/auth.js create mode 100644 template/project/src/api/editor.js create mode 100644 template/project/src/api/home.js create mode 100644 template/project/src/api/monitor.js create mode 100644 template/project/src/assets/logo.png create mode 100644 template/project/src/directives/button.js create mode 100644 template/project/src/directives/loading.js create mode 100644 template/project/src/lcd.engine.js create mode 100644 template/project/src/main.js create mode 100644 template/project/src/mixins/htmlCanvas.js create mode 100644 template/project/src/mixins/renderer.js create mode 100644 template/project/src/mixins/router.js create mode 100644 template/project/src/mixins/setter.js create mode 100644 template/project/src/mixins/sider.js create mode 100644 template/project/src/mixins/tooler.js create mode 100644 template/project/src/mixins/viewer.js create mode 100644 template/project/src/mixins/window.js create mode 100644 template/project/src/router/index.js create mode 100644 template/project/src/setter/index.js create mode 100644 template/project/src/setter/lcd-setter-xxx/constant.js create mode 100644 template/project/src/setter/lcd-setter-xxx/index.js create mode 100644 template/project/src/setter/lcd-setter-xxx/index.vue create mode 100644 template/project/src/setter/lcd-setter-xxx/validator.js create mode 100644 template/project/src/sider/index.js create mode 100644 template/project/src/sider/lcd-sider-xxx/index.js create mode 100644 template/project/src/sider/lcd-sider-xxx/index.vue create mode 100644 template/project/src/store/editor.js create mode 100644 template/project/src/store/home.js create mode 100644 template/project/src/store/index.js create mode 100644 template/project/src/store/modules/index.js create mode 100644 template/project/src/store/modules/xxx.js create mode 100644 template/project/src/store/monitor.js create mode 100644 template/project/src/store/preview.js create mode 100644 template/project/src/styles/cover.less create mode 100644 template/project/src/styles/index.less create mode 100644 template/project/src/styles/vars.less create mode 100644 template/project/src/utils/deep.js create mode 100644 template/project/src/utils/http.js create mode 100644 template/project/src/utils/image.js create mode 100644 template/project/src/utils/index.js create mode 100644 template/project/src/utils/is.js create mode 100644 template/project/src/utils/merge.js create mode 100644 template/project/src/utils/useKeyBoard.js create mode 100644 template/project/src/views/Login.vue create mode 100644 template/project/src/views/NotFound.vue create mode 100644 template/project/src/views/editor/components/RenderBottom.vue create mode 100644 template/project/src/views/editor/components/RenderTop.vue create mode 100644 template/project/src/views/editor/components/SetterContent.vue create mode 100644 template/project/src/views/editor/components/SetterFloat.vue create mode 100644 template/project/src/views/editor/components/SetterHeader.vue create mode 100644 template/project/src/views/editor/components/SiderMain.vue create mode 100644 template/project/src/views/editor/components/ToolLeft.vue create mode 100644 template/project/src/views/editor/components/ToolRight.vue create mode 100644 template/project/src/views/editor/index.vue create mode 100644 template/project/src/views/home/components/CreateModal.vue create mode 100644 template/project/src/views/home/components/List.vue create mode 100644 template/project/src/views/home/components/MoreModel.vue create mode 100644 template/project/src/views/home/components/Search.vue create mode 100644 template/project/src/views/home/index.vue create mode 100644 template/project/src/views/monitor/components/ViewSwitch.vue create mode 100644 template/project/src/views/monitor/index.vue create mode 100644 template/project/src/views/preview/index.vue create mode 100644 template/project/vue.config.js create mode 100644 template/setter/constant.js create mode 100644 template/setter/index.js create mode 100644 template/setter/index.vue create mode 100644 template/setter/validator.js create mode 100644 template/sider/index.js create mode 100644 template/sider/index.vue diff --git a/.gitignore b/.gitignore index f4d0fe0..be52143 100644 --- a/.gitignore +++ b/.gitignore @@ -79,7 +79,6 @@ web_modules/ # Next.js build output .next out -template # Nuxt.js build / generate output .nuxt diff --git a/template/component/.gitignore b/template/component/.gitignore new file mode 100644 index 0000000..34734ec --- /dev/null +++ b/template/component/.gitignore @@ -0,0 +1,31 @@ +.DS_Store +node_modules +# /dist + +#submodule +/subLibrary + +# lock +#package-lock.json +yarn.lock + +# local env files +.env.local +.env.*.local + +package-lock.json + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/template/component/README.md b/template/component/README.md new file mode 100644 index 0000000..66a58d0 --- /dev/null +++ b/template/component/README.md @@ -0,0 +1,3 @@ +# lcd-component-xxx + +> 一款基于Vue的xxx组件 \ No newline at end of file diff --git a/template/component/babel.config.js b/template/component/babel.config.js new file mode 100644 index 0000000..1d248fc --- /dev/null +++ b/template/component/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@vue/app"], +}; diff --git a/template/component/base.config.js b/template/component/base.config.js new file mode 100644 index 0000000..3034d66 --- /dev/null +++ b/template/component/base.config.js @@ -0,0 +1,8 @@ +module.exports = { + // 开发代理前缀配置 + baseUrl: "api_target", + // 项目名称 最多不超过12个汉字 + title: "lcd-component-xxx", + // 默认主题色 + defaultColor: "#1890ff", +}; diff --git a/template/component/lcd.component.json b/template/component/lcd.component.json new file mode 100644 index 0000000..8c120c6 --- /dev/null +++ b/template/component/lcd.component.json @@ -0,0 +1,9 @@ +{ + "name": "xxx", + "key": "xxx", + "version": "2.0.0", + "description": "一款基于Vue的xxx组件", + "cover": "", + "repository": "", + "author": "we452366" +} \ No newline at end of file diff --git a/template/component/package.json b/template/component/package.json new file mode 100644 index 0000000..0b3b4bb --- /dev/null +++ b/template/component/package.json @@ -0,0 +1,44 @@ +{ + "name": "lcd-component-xxx", + "version": "2.0.0", + "description": "一款基于Vue的xxx组件", + "main": "dist/lcd-component-xxx.common.js", + "browser": "dist/lcd-component-xxx.umd.js", + "scripts": { + "serve": "cross-env VUE_APP_MODE=dev && vue-cli-service serve", + "build": "vue-cli-service build --target lib --name lcd-component-xxx" + }, + "dependencies": { + "ant-design-vue": "^1.7.8", + "axios": "^0.24.0", + "core-js": "^3.31.1", + "file-loader": "^6.2.0", + "moment": "^2.30.1", + "echarts": "^5.4.2", + "postcss-plugin-px2rem": "^0.8.1", + "postcss-px2rem-exclude": "0.0.6", + "qs": "^6.11.2", + "screenfull": "^5.1.0", + "url-loader": "^4.1.1", + "vue": "^2.7.14", + "vue-draggable-resizable": "^2.3.0", + "vue-loading-overlay": "^3.4.3", + "vuex": "^3.4.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "babel-eslint": "^10.1.0", + "babel-plugin-import": "^1.13.6", + "browserlist": "^1.0.1", + "cross-env": "^7.0.3", + "less": "^3.0.4", + "less-loader": "^5.0.0", + "vue-template-compiler": "^2.7.14" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/template/component/public/favicon.ico b/template/component/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea8f82c6d45b773de7cf5cbf6aa74e1fec87a879 GIT binary patch literal 4286 zcmbuBZD>?i8po&Ekd+W(a7D6Pi9w`DKM3tMGk0e0%!EZsS(g1EHcivCtCKi+Gw*Mc z_iC(eH;t~f8f}`Usr7BGEF$6uk+z7q60#!8(u$N_2_hkgmJr4;j%R<*nR~C3G2M2% zH{8t3Ip^Nz$N%|1&p9sFGyD}6y5zs>WS+~l%H?vc=Vr)N%q`>kV(zD2HFcic>Kdc8 zy2>+JwaqgbsqoB3wtC{*{@{*RzUjVKS?->yC@UJPc->uAQR@CbA}uDYYxb_IZ8XMe z>y7!EIzz#rU{Ek97!(W&1_gtve8a6O%D7A2vG8l|iEv4g$ncY{hNyR0eTOl$z116s zLBXJ4P$>*?81BJvFS6AwI;1lw;>W|U7VYQG{$C&(dwqos-M)X+cY4+KcJ5ZMf*}FJ zg_`X~WlgQIzPj4Ttg7<3i0_Jo-I(YO>yyMTZ$6&~V z;e11v_Z53=dz-fq9eUB>GP$@B$~THO!f+v6>ULto@f5GD zZ++LF)3V2Zqh+_xiD$p3q1(H%KI$DK7jY{Wi~K190RM~7N;xYfMNmuTMUSHzDs z_WQ2k%MN_GQr4hDJ`88jVOsZx1|vttsZHsVsXa>jgSsfhlU8jO&Ed=J=t!Wv^I$;1 zpgP_+&&u=Yu!>y7EI+8`U4CUTC>Um7*d*)hYkP|~qpr!jxvt63p2G`+X??QNUQ2&C ziw?;?`Fhc&=#jt}3`!U}KQOn*I&^4D=0f{HJZUrBL5IS|e(wqxhUpJCsEeuk4)1V% zyP-9%Ycw*c&6_EGa*kX$`vE=bt(0DUuxm6h1%uKIhXT(@d~)%{6F-=@TL0)Dq$WyQ zcKO#g?bKeli4O6`9^YB&;xu&;gW>D?c5faUY)I?X-SSQtbZ^0rg-)+7cVFoq3*Li4 z!4Qug4rE3TnJ#ki9SjK=qWEEv@5sfT=AFI-I&75p%EeycgCP#Xp1KyVtFGDj)?&Db z4*GdK`Mc_fCmSzjaK|i$yWQi#I1CDgS$S9INFYb&;y|E5e#_Oq*L1bLXBzSy9VY3M zm*sovg$|b`7c!Qt3*$Vw(0-IL{BW+i+Ot}|Q=4~SkbN`OGeP|Epn^fiM}yqxVe?8S zI>?0%S?F*SKYS&>$;Bjocq%@An8Xj0vWB`a*)NT5j0ZEL9|khIJ`9w|y6B;RZ7n=^1^wEoE)lpY1gZ)J^Kiw=7Ab#ftlx9k_!g$fM{Q)+Xv?|5jm_gF}2 zhEIb|oeBe{%B2)^4vKTJd`r(I7R$W-NX&#U{7;?~|q?$*+u~!^`M!8wTl7l8aOZ**Dk9 zI&}CexvB5u`Y3>|b|f?*5>B@BJXLdPTyUdVyrTblt- z*2=hCZ}K7jnKTOyY{eKBP#~n{H1cgKI z|2>}sHc%J$HN!{25qmwJ+yR4n!eCxNhkSc}sZaVtF*+n*5I@M7);TB1`u@|QVHlKV zI1##NzXKg!M2Be@X1m6M*)mR#Tn$4km4Wla9KIZ*F2eMO&EzA@-tC;b^jYr7c~X1H zjv=1|pBHDt@J|?S^q&mr{neg_VI>SlyFU)@=hnm2MRZYZI_C#70mB*ULialR9r$rY zLyvcgy10oBPG7X=<+K0u;&lV3i=Ehg$Af0?@sRGjGEeO1yFU)-_eMv|3>YRX201@W z;mLRLq@yc3Y=pzvC-4IMrdRKA^1lCep+m6mWN;2I#PQ?^b)kD_>NC_t20bzthDEiA z9}CIFgw>ez@a$z_EL&C02r%xvLiv>J6LywxFKP;s5NvAGgSU`s% zbkM$CD$Wm$5q|^y;RFl|R*y>d>Li2go3eK&dz5vKqAupqVH6#7FZ-bwKV}|=mGtT@ zcya%csW|Gva;4sWMm?qkA1!|ndc@!3hXVum zzx;LV>I3ie)kpc$dmgXex_9~N7vB5%!{*gFMl|2ZfB4I}zdd|*?%Frc9=QI^nqU0u z@S6OB{DOj}{Jm@b{lZ@3LGx~7;P%!0(DdbxmS4X6_n+NWkC&^*p+`D~#FCg2`#*EW B6(9fr literal 0 HcmV?d00001 diff --git a/template/component/public/index.html b/template/component/public/index.html new file mode 100644 index 0000000..a27dc24 --- /dev/null +++ b/template/component/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + + diff --git a/template/component/publish.sh b/template/component/publish.sh new file mode 100644 index 0000000..fcbe3eb --- /dev/null +++ b/template/component/publish.sh @@ -0,0 +1 @@ +npm install --verbose && npm run build && npm publish \ No newline at end of file diff --git a/template/component/src/App.vue b/template/component/src/App.vue new file mode 100644 index 0000000..516e027 --- /dev/null +++ b/template/component/src/App.vue @@ -0,0 +1,40 @@ + + + + diff --git a/template/component/src/api/component.js b/template/component/src/api/component.js new file mode 100644 index 0000000..41a2679 --- /dev/null +++ b/template/component/src/api/component.js @@ -0,0 +1,8 @@ +const { baseUrl } = require('../../base.config'); +import BaseAxios from '@/utils/http'; + +const APIComponent = async params => await BaseAxios.get(`${baseUrl}/component`, params); + +export { + APIComponent +} \ No newline at end of file diff --git a/template/component/src/assets/logo.png b/template/component/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..172038aab1384ba7bfc24c482f00e2e909aee2d2 GIT binary patch literal 43261 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 literal 0 HcmV?d00001 diff --git a/template/component/src/main.js b/template/component/src/main.js new file mode 100644 index 0000000..f780569 --- /dev/null +++ b/template/component/src/main.js @@ -0,0 +1,16 @@ +import Vue from "vue"; +import App from "./App.vue"; +import Antd from "ant-design-vue"; +import "ant-design-vue/dist/antd.min.css"; +import store from "./store"; +Vue.config.productionTip = false; + +// 环境模式挂载 +Vue.prototype.$mode = process.env.VUE_APP_MODE; + +Vue.use(Antd); + +new Vue({ + store, + render: (h) => h(App), +}).$mount("#app"); diff --git a/template/component/src/store/index.js b/template/component/src/store/index.js new file mode 100644 index 0000000..e2fb137 --- /dev/null +++ b/template/component/src/store/index.js @@ -0,0 +1,20 @@ +import Vue from "vue"; +import Vuex from "vuex"; +import xxx from "./xxx"; + +export { + xxx +} + +Vue.use(Vuex); + +let modules = { + editor: { + modules: { + xxx + }, + }, +}; +export default new Vuex.Store({ + modules, +}); diff --git a/template/component/src/store/xxx/actions.js b/template/component/src/store/xxx/actions.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/template/component/src/store/xxx/actions.js @@ -0,0 +1 @@ + diff --git a/template/component/src/store/xxx/getters.js b/template/component/src/store/xxx/getters.js new file mode 100644 index 0000000..e69de29 diff --git a/template/component/src/store/xxx/index.js b/template/component/src/store/xxx/index.js new file mode 100644 index 0000000..6e98f0a --- /dev/null +++ b/template/component/src/store/xxx/index.js @@ -0,0 +1,12 @@ +import state from "./state"; +import * as getters from "./getters"; +import mutations from "./mutations"; +import actions from "./actions"; + +export default { + namespaced: true, + state, + getters, + mutations, + actions, +}; diff --git a/template/component/src/store/xxx/mutations.js b/template/component/src/store/xxx/mutations.js new file mode 100644 index 0000000..e7a3f72 --- /dev/null +++ b/template/component/src/store/xxx/mutations.js @@ -0,0 +1,4 @@ +const mutations = { + +}; +export default mutations; diff --git a/template/component/src/store/xxx/state.js b/template/component/src/store/xxx/state.js new file mode 100644 index 0000000..618e2d7 --- /dev/null +++ b/template/component/src/store/xxx/state.js @@ -0,0 +1,4 @@ +const state = { + +}; +export default state; diff --git a/template/component/src/utils/http.js b/template/component/src/utils/http.js new file mode 100644 index 0000000..0c24052 --- /dev/null +++ b/template/component/src/utils/http.js @@ -0,0 +1,33 @@ +import axios from 'axios'; + +const BaseAxios = axios.create({ + timeout: 60000 +}); + +// 请求拦截 +BaseAxios.interceptors.request.use(async config => { + if (sessionStorage.getItem('token')) { + config.headers.Token = sessionStorage.getItem('token'); + config.headers.Authorization = `Bearer ${sessionStorage.getItem('token')}`; + } + return config; +}, err => { + return Promise.reject(err); +}); + +// 响应拦截 +BaseAxios.interceptors.response.use( res => { + if(res.data.success || + res.data.FLAG === "SUCCESS" || + res.data.retCode === "200" || + res.status === 200){ + return res.data + } else { + message.error(res.data.msg || res.data.MESSAGE || res.data.message || "Error"); + return Promise.reject(res.data) + } +}, err => { + return Promise.reject(err) +}); + +export default BaseAxios; \ No newline at end of file diff --git a/template/component/vue.config.js b/template/component/vue.config.js new file mode 100644 index 0000000..254a8ff --- /dev/null +++ b/template/component/vue.config.js @@ -0,0 +1,68 @@ +const { baseUrl } = require("./base.config.js"); + +module.exports = { + parallel: false, + lintOnSave: false, + productionSourceMap: false, + chainWebpack: (wpConfig) => { + // 测试环境对组件进行测试 + if (process.env.VUE_APP_MODE == "dev") { + wpConfig.plugin("html").tap((args) => { + args[0].title = "lcd-component-xxx"; + return args; + }); + } + }, + configureWebpack: (wpConfig) => { + // 删除vue-cli已有的images配置 + wpConfig.module.rules.splice(2, 1); + // 区分src下使用url-loader和file-loader + wpConfig.module.rules.push( + // src的图片全部转化为base64 + { + test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, + include: path.resolve(__dirname, "src"), + use: [ + { + loader: "url-loader", + options: { + esModule: false + } + } + ], + }, + // 非src下全部使用图片地址 + { + test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, + exclude: path.resolve(__dirname, "src"), + use: [ + { + loader: "file-loader", + options: { + name: "img/[name].[hash:8].[ext]", + }, + }, + ], + } + ); + }, + css: { + loaderOptions: { + // 向 CSS 相关的 loader 传递选项 + less: {}, + }, + }, + devServer: { + port: 8888, + // 反向代理配置 + proxy: { + ["^/" + baseUrl]: { + // 后台接口域名 联调更改此处IP即可 + target: "http://localhost:4000", + pathRewrite: { + ["^/" + baseUrl]: "", + }, + } + }, + }, +}; diff --git a/template/project/.gitignore b/template/project/.gitignore new file mode 100644 index 0000000..7c1cba4 --- /dev/null +++ b/template/project/.gitignore @@ -0,0 +1,69 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +demo/bundle +docs/docus +dist/ + +# Dependency directories +node_modules/ +jspm_packages/ +.npmrc + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm +.npmrc + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# lock +package-lock.json +yarn.lock +pnpm-lock.yaml + diff --git a/template/project/README.md b/template/project/README.md new file mode 100644 index 0000000..3d8904d --- /dev/null +++ b/template/project/README.md @@ -0,0 +1,49 @@ +

logo

+ +# vue-lcd-engine + +> 一款基于vue-lcd-engine实现的低代码编辑器 + +## 功能 + +|功能|模块|名称|备注| +|:-:|:-:|:-:|:-:| +|上一步|tooler|Undo|[√]| +|上一步(快捷键)|share|Ctrl + Z|[√]| +|下一步|tooler|Redo|[√]| +|下一步(快捷键)|share|Ctrl + Alt + Z|[√]| +|保存|tooler|Save|[√]| +|预览|tooler|Preview|[√]| +|放大|renderer|ZoomIn|[√]| +|缩小|renderer|ZoomOut|[√]| +|标尺|renderer|Ruler|[√]| +|参考线|renderer|ComponentBox|[√]| +|拖拽|share|Drag|[√]| +|大小|share|Resize|[√]| + +## 目录 + +``` +├─README.md +├─packages // 组件放置目录 +| ├─lcd-component-xx // 组件需以lcd-component进行开头 +├─src // 编辑器所在主目录 +| ├─setter // 设置器模块 +| ├─lcd-setter-xx // 组件需以lcd-setter进行开头 +| ├─sider // 侧边器模块 +| ├─lcd-setter-xx // 组件需以lcd-sider进行开头 +├─build // 打包文件夹 +``` + +## 依赖 + +|依赖|依赖包|备注| +|:-:|:-:|:-:| +|vue|[vue 2.x](https://www.npmjs.com/package/vue)|基于vue2的运行时进行构建| +|ant-design-vue|[ant-design-vue 1.x](https://www.npmjs.com/package/ant-design-vue)|基于ant-design-vue的组件库进行构建,主题色修改等请参考ant-desgin-vue的官方文档| +|vue-lcd-engine|[vue-lcd-engine 2.x](https://www.npmjs.com/package/vue-lcd-engine)|基于vue-lcd-engine进行低代码应用构建| + +## 参考 + +- [Vue 2.x官方文档](https://v2.cn.vuejs.org/) +- [Ant-Design-Vue 1.x官方文档](https://1x.antdv.com/docs/vue/introduce-cn/) \ No newline at end of file diff --git a/template/project/babel.config.js b/template/project/babel.config.js new file mode 100644 index 0000000..bf18b72 --- /dev/null +++ b/template/project/babel.config.js @@ -0,0 +1,9 @@ +module.exports = { + presets: ["@vue/babel-preset-app"], + plugins: [ + [ + "import", + { libraryName: "ant-design-vue", libraryDirectory: "es", style: true }, + ] + ] + }; \ No newline at end of file diff --git a/template/project/base.config.js b/template/project/base.config.js new file mode 100644 index 0000000..ef685c5 --- /dev/null +++ b/template/project/base.config.js @@ -0,0 +1,8 @@ +module.exports = { + // 云平台所需转发代理 + tgName: "tgcos", + // 数据代理前缀配置 + baseName: "api_target", + // 项目名称 最多不超过12个汉字 + title: "vue-lcd-engine", +}; diff --git a/template/project/build/chainWebpack.js b/template/project/build/chainWebpack.js new file mode 100644 index 0000000..5a506ea --- /dev/null +++ b/template/project/build/chainWebpack.js @@ -0,0 +1,55 @@ +// cdn资源 +const cdn = { + js: [], +}; + +const chainWebpack = (config) => { + config.mode = process.env.VUE_APP_MODE; + // html-webpack-plugin插件 + config.plugin("html").tap((args) => { + // 页面标题部分 + args[0].title = require("../base.config.js")["title"]; + (process.env.VUE_APP_MODE === "production") && + (args[0].cdn = cdn); + return args; + }); + config.plugins.delete("prefetch"); + // splitChunks优化 + config.optimization.splitChunks({ + chunks: "async", + minSize: 30000, + maxSize: 1024 * 1024, // 单位是字节 + minChunks: 1, + maxAsyncRequests: 6, + maxInitialRequests: 4, + automaticNameDelimiter: "~", + cacheGroups: { + moment: { + name: "moment", + priority: 20, + test: /[\\/]node_modules[\\/]_?moment(.*)/, + chunks: "all", + reuseExistingChunk: true, + // enforce: true + }, + "ant-design-vue": { + name: "ant-design-vue", + priority: 20, + test: /[\\/]node_modules[\\/]_?ant-design-vue(.*)/, + chunks: "all", + reuseExistingChunk: true, + // enforce: true + }, + axios: { + name: "axios", + priority: 20, + test: /[\\/]node_modules[\\/]_?axios(.*)/, + chunks: "all", + reuseExistingChunk: true, + // enforce: true + }, + }, + }); +}; + +module.exports = chainWebpack; \ No newline at end of file diff --git a/template/project/build/configureWebpack.js b/template/project/build/configureWebpack.js new file mode 100644 index 0000000..ad71f67 --- /dev/null +++ b/template/project/build/configureWebpack.js @@ -0,0 +1,5 @@ +const configureWebpack = require(`./${ + process.env.VUE_APP_MODE || "dev" +}/configureWebpack.js`); + +module.exports = configureWebpack; diff --git a/template/project/build/dev/config.json b/template/project/build/dev/config.json new file mode 100644 index 0000000..4d0f29e --- /dev/null +++ b/template/project/build/dev/config.json @@ -0,0 +1,4 @@ +{ + "env": "dev", + "proxyUrl": "http://localhost:4000" +} \ No newline at end of file diff --git a/template/project/build/dev/configureWebpack.js b/template/project/build/dev/configureWebpack.js new file mode 100644 index 0000000..31dcb23 --- /dev/null +++ b/template/project/build/dev/configureWebpack.js @@ -0,0 +1,17 @@ +const SpeedMeasurePlugin = require("speed-measure-webpack-plugin"); +const path = require('path'); + +const configureWebpack = (config) => { + config.externals = {}; + + // 配置别名 + Object.assign(config.resolve.alias, { + '$root': path.resolve(__dirname, '../../'), + }); + + config.plugins.push( + new SpeedMeasurePlugin(), + ); +}; + +module.exports = configureWebpack; diff --git a/template/project/build/devServer.js b/template/project/build/devServer.js new file mode 100644 index 0000000..0ca103b --- /dev/null +++ b/template/project/build/devServer.js @@ -0,0 +1,24 @@ +const { baseName } = require("../base.config.js"); + +console.log("VUE_APP_MODE", process.env.VUE_APP_MODE); + +const config = require(`./${process.env.VUE_APP_MODE || "dev"}/config.json`) + +console.log("devServer config", config); + +const devServer = { + host: "0.0.0.0", + hot: true, + port: 8085, + proxy: { + ["^/" + baseName]: { + // 后台接口域名 联调更改此处IP即可 + target: config.proxyUrl, + pathRewrite: { + ["^/" + baseName]: "", + }, + } + }, +}; + +module.exports = devServer; diff --git a/template/project/build/index.js b/template/project/build/index.js new file mode 100644 index 0000000..baa96b2 --- /dev/null +++ b/template/project/build/index.js @@ -0,0 +1,11 @@ +const devServer = require("./devServer"); +const configureWebpack = require("./configureWebpack"); +const chainWebpack = require("./chainWebpack"); +const postCSSPlugin = require('./postCSSPlugin'); + +module.exports = { + devServer, + configureWebpack, + chainWebpack, + postCSSPlugin +}; \ No newline at end of file diff --git a/template/project/build/postCSSPlugin.js b/template/project/build/postCSSPlugin.js new file mode 100644 index 0000000..eaebb25 --- /dev/null +++ b/template/project/build/postCSSPlugin.js @@ -0,0 +1,142 @@ +const postcss = require("postcss"); +const css = require("css"); +const extend = require("extend"); + +const pxRegExp = /\b(\d+(\.\d+)?)px\b/; + +class Pcx2rem { + constructor(config) { + this.config = {}; + this.config = extend( + this.config, + { + baseDpr: 1, // 设备像素比 + remUnit: 10, // 自定义rem单位 + remPrecision: 6, // 精度 + forcePxComment: "px", // 只换算px + keepComment: "no", // 是否保留单位 + ignoreEntry: null, // 忽略规则实例载体 + }, + config + ); + } + generateRem(cssText) { + const self = this; + const config = self.config; + const astObj = css.parse(cssText); + // prettier-ignore + function processRules(rules) {//NOSONAR + for (let i = 0; i < rules.length; i++) { + let rule = rules[i]; + if (rule.type === "media") { + processRules(rule.rules); + continue; + } else if (rule.type === "keyframes") { + processRules(rule.keyframes); + continue; + } else if (rule.type !== "rule" && rule.type !== "keyframe") { + continue; + } + + // 处理 px 到 rem 的转化 + let declarations = rule.declarations; + for (let j = 0; j < declarations.length; j++) { + let declaration = declarations[j]; + // 转化px + if ( + declaration.type === "declaration" && + pxRegExp.test(declaration.value) + ) { + let nextDeclaration = declarations[j + 1]; + if (nextDeclaration && nextDeclaration.type === "comment") { + if (nextDeclaration.comment.trim() === config.forcePxComment) { + // 不转化`0px` + if (declaration.value === "0px") { + declaration.value = "0"; + declarations.splice(j + 1, 1); + continue; + } + declaration.value = self._getCalcValue( + "rem", + declaration.value + ); + declarations.splice(j + 1, 1); + } else if ( + nextDeclaration.comment.trim() === config.keepComment + ) { + declarations.splice(j + 1, 1); + } else { + declaration.value = self._getCalcValue( + "rem", + declaration.value + ); + } + } else { + declaration.value = self._getCalcValue("rem", declaration.value); + } + } + } + + if (!rules[i].declarations.length) { + rules.splice(i, 1); + i--; //NOSONAR + } + } + } + + processRules(astObj.stylesheet.rules); + + return css.stringify(astObj); + } + _getCalcValue(type, value, dpr) { + const config = this.config; + + // 验证是否符合 忽略规则 + if (config.ignoreEntry && config.ignoreEntry.test(value)) { + return config.ignoreEntry.getRealPx(value); + } + + const pxGlobalRegExp = new RegExp(pxRegExp.source, "g"); + + function getValue(val) { + val = parseFloat(val.toFixed(config.remPrecision)); // 精度控制 + return val === 0 ? val : val + type; + } + + return value.replace(pxGlobalRegExp, function ($0, $1) { + return type === "px" + ? getValue(($1 * dpr) / config.baseDpr) + : getValue($1 / config.remUnit); + }); + } +} + +class PxIgnore { + constructor() { + this.RegExp = /^excl\(([\s\S]+)\)$/; + } + // 匹配 是否符合 忽略转义的规则 + test(pxData) { + return this.RegExp.test(pxData); + } + // 获取真实像素值 + getRealPx(pxData) { + return pxData.match(this.RegExp)[1]; + } +} + +const postcss_pcx2rem = postcss.plugin("postcss-pcx2rem", function (options) { + return function (CSS, result) { + // 配置参数 合入 忽略策略方法 + options.ignoreEntry = new PxIgnore(); + // new 一个Pcx2rem的实例 + const pcx2rem = new Pcx2rem(options); + const oldCssText = CSS.toString(); + const newCssText = pcx2rem.generateRem(oldCssText); + result.root = postcss.parse(newCssText); + }; +}); + +module.exports = { + "postcss-pcx2rem": postcss_pcx2rem, +}; diff --git a/template/project/build/production/config.json b/template/project/build/production/config.json new file mode 100644 index 0000000..8e35475 --- /dev/null +++ b/template/project/build/production/config.json @@ -0,0 +1,6 @@ +{ + "env": "production", + "proxyUrl": "http://172.24.123.86:11000", + "cosUrl": "http://172.24.123.4:8148", + "tmpUrl": "http://172.24.127.247:80" +} \ No newline at end of file diff --git a/template/project/build/production/configureWebpack.js b/template/project/build/production/configureWebpack.js new file mode 100644 index 0000000..610062b --- /dev/null +++ b/template/project/build/production/configureWebpack.js @@ -0,0 +1,43 @@ +const CompressionPlugin = require("compression-webpack-plugin"); +const path = require('path'); + +const configureWebpack = (config) => { + config.externals = { + // vue: "Vue", + // vuex: "Vuex", + // axios: "axios", + // "vue-router": "VueRouter", + // moment: "moment", + }; + + // 配置别名 + Object.assign(config.resolve.alias, { + '$root': path.resolve(__dirname, '../../'), + }); + + // 需要对打包进行分析的配置 + if (process.env.VUE_APP_ANALYZE == "true") { + const BundleAnalyzerPlugin = + require("webpack-bundle-analyzer").BundleAnalyzerPlugin; + config.plugins.push(new BundleAnalyzerPlugin()); + } + + // 开启gzip压缩 + config.plugins.push( + new CompressionPlugin({ + test: /\.js$|\.html$|.\css/, // 匹配文件名 + threshold: 10240, // 超过10k就压缩 + deleteOriginalAssets: false, + }) + ); + + // 对console.log等日志文件进行清除 + config.optimization.minimizer[0].options.terserOptions.compress.warnings = false; + config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true; + config.optimization.minimizer[0].options.terserOptions.compress.drop_debugger = true; + config.optimization.minimizer[0].options.terserOptions.compress.pure_funcs = [ + "console.log", + ]; +}; + +module.exports = configureWebpack; \ No newline at end of file diff --git a/template/project/package.json b/template/project/package.json new file mode 100644 index 0000000..243b994 --- /dev/null +++ b/template/project/package.json @@ -0,0 +1,55 @@ +{ + "name": "vue-lcd-engine", + "version": "2.0.0", + "description": "一款基于vue-lcd-engine实现的低代码编辑器", + "main": "index.js", + "scripts": { + "serve": "cross-env VUE_APP_MODE=dev vue-cli-service serve", + "build": "cross-env VUE_APP_MODE=production vue-cli-service build" + }, + "keywords": [ + "low code", + "editor" + ], + "author": "we452366", + "license": "MIT", + "dependencies": { + "ant-design-vue": "^1.7.7", + "axios": "^0.21.4", + "core-js": "^3.6.5", + "echarts": "^5.4.2", + "html2canvas": "^1.4.1", + "keymaster": "^1.6.2", + "lodash": "^4.17.21", + "moment": "^2.29.3", + "vue": "^2.6.11", + "vue-lcd-engine": "^2.0.0", + "vue-router": "^3.6.5", + "vuex": "^3.4.0", + "vuex-persistedstate": "^4.1.0" + }, + "devDependencies": { + "@ant-design/colors": "^3.2.2", + "@babel/preset-env": "^7.23.8", + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-router": "~4.5.0", + "@vue/cli-plugin-vuex": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "babel-plugin-import": "^1.13.3", + "compression-webpack-plugin": "^5.0.2", + "cross-env": "^7.0.3", + "css": "^3.0.0", + "hard-source-webpack-plugin": "^0.13.1", + "less": "^3.0.4", + "less-loader": "^5.0.0", + "postcss": "^7.0.39", + "speed-measure-webpack-plugin": "^1.5.0", + "vue-template-compiler": "^2.6.11", + "webpack-bundle-analyzer": "^4.5.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/template/project/public/favicon.ico b/template/project/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea8f82c6d45b773de7cf5cbf6aa74e1fec87a879 GIT binary patch literal 4286 zcmbuBZD>?i8po&Ekd+W(a7D6Pi9w`DKM3tMGk0e0%!EZsS(g1EHcivCtCKi+Gw*Mc z_iC(eH;t~f8f}`Usr7BGEF$6uk+z7q60#!8(u$N_2_hkgmJr4;j%R<*nR~C3G2M2% zH{8t3Ip^Nz$N%|1&p9sFGyD}6y5zs>WS+~l%H?vc=Vr)N%q`>kV(zD2HFcic>Kdc8 zy2>+JwaqgbsqoB3wtC{*{@{*RzUjVKS?->yC@UJPc->uAQR@CbA}uDYYxb_IZ8XMe z>y7!EIzz#rU{Ek97!(W&1_gtve8a6O%D7A2vG8l|iEv4g$ncY{hNyR0eTOl$z116s zLBXJ4P$>*?81BJvFS6AwI;1lw;>W|U7VYQG{$C&(dwqos-M)X+cY4+KcJ5ZMf*}FJ zg_`X~WlgQIzPj4Ttg7<3i0_Jo-I(YO>yyMTZ$6&~V z;e11v_Z53=dz-fq9eUB>GP$@B$~THO!f+v6>ULto@f5GD zZ++LF)3V2Zqh+_xiD$p3q1(H%KI$DK7jY{Wi~K190RM~7N;xYfMNmuTMUSHzDs z_WQ2k%MN_GQr4hDJ`88jVOsZx1|vttsZHsVsXa>jgSsfhlU8jO&Ed=J=t!Wv^I$;1 zpgP_+&&u=Yu!>y7EI+8`U4CUTC>Um7*d*)hYkP|~qpr!jxvt63p2G`+X??QNUQ2&C ziw?;?`Fhc&=#jt}3`!U}KQOn*I&^4D=0f{HJZUrBL5IS|e(wqxhUpJCsEeuk4)1V% zyP-9%Ycw*c&6_EGa*kX$`vE=bt(0DUuxm6h1%uKIhXT(@d~)%{6F-=@TL0)Dq$WyQ zcKO#g?bKeli4O6`9^YB&;xu&;gW>D?c5faUY)I?X-SSQtbZ^0rg-)+7cVFoq3*Li4 z!4Qug4rE3TnJ#ki9SjK=qWEEv@5sfT=AFI-I&75p%EeycgCP#Xp1KyVtFGDj)?&Db z4*GdK`Mc_fCmSzjaK|i$yWQi#I1CDgS$S9INFYb&;y|E5e#_Oq*L1bLXBzSy9VY3M zm*sovg$|b`7c!Qt3*$Vw(0-IL{BW+i+Ot}|Q=4~SkbN`OGeP|Epn^fiM}yqxVe?8S zI>?0%S?F*SKYS&>$;Bjocq%@An8Xj0vWB`a*)NT5j0ZEL9|khIJ`9w|y6B;RZ7n=^1^wEoE)lpY1gZ)J^Kiw=7Ab#ftlx9k_!g$fM{Q)+Xv?|5jm_gF}2 zhEIb|oeBe{%B2)^4vKTJd`r(I7R$W-NX&#U{7;?~|q?$*+u~!^`M!8wTl7l8aOZ**Dk9 zI&}CexvB5u`Y3>|b|f?*5>B@BJXLdPTyUdVyrTblt- z*2=hCZ}K7jnKTOyY{eKBP#~n{H1cgKI z|2>}sHc%J$HN!{25qmwJ+yR4n!eCxNhkSc}sZaVtF*+n*5I@M7);TB1`u@|QVHlKV zI1##NzXKg!M2Be@X1m6M*)mR#Tn$4km4Wla9KIZ*F2eMO&EzA@-tC;b^jYr7c~X1H zjv=1|pBHDt@J|?S^q&mr{neg_VI>SlyFU)@=hnm2MRZYZI_C#70mB*ULialR9r$rY zLyvcgy10oBPG7X=<+K0u;&lV3i=Ehg$Af0?@sRGjGEeO1yFU)-_eMv|3>YRX201@W z;mLRLq@yc3Y=pzvC-4IMrdRKA^1lCep+m6mWN;2I#PQ?^b)kD_>NC_t20bzthDEiA z9}CIFgw>ez@a$z_EL&C02r%xvLiv>J6LywxFKP;s5NvAGgSU`s% zbkM$CD$Wm$5q|^y;RFl|R*y>d>Li2go3eK&dz5vKqAupqVH6#7FZ-bwKV}|=mGtT@ zcya%csW|Gva;4sWMm?qkA1!|ndc@!3hXVum zzx;LV>I3ie)kpc$dmgXex_9~N7vB5%!{*gFMl|2ZfB4I}zdd|*?%Frc9=QI^nqU0u z@S6OB{DOj}{Jm@b{lZ@3LGx~7;P%!0(DdbxmS4X6_n+NWkC&^*p+`D~#FCg2`#*EW B6(9fr literal 0 HcmV?d00001 diff --git a/template/project/public/index.html b/template/project/public/index.html new file mode 100644 index 0000000..128443b --- /dev/null +++ b/template/project/public/index.html @@ -0,0 +1,21 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + <% for (let i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> + + <% } %> + + + diff --git a/template/project/src/App.vue b/template/project/src/App.vue new file mode 100644 index 0000000..8bb2ad3 --- /dev/null +++ b/template/project/src/App.vue @@ -0,0 +1,30 @@ + + + + \ No newline at end of file diff --git a/template/project/src/api/auth.js b/template/project/src/api/auth.js new file mode 100644 index 0000000..63bd8ed --- /dev/null +++ b/template/project/src/api/auth.js @@ -0,0 +1,11 @@ +const { baseName } = require('../../base.config') +import { BaseAxios } from '@/utils' + +const APILogin = async params => BaseAxios.post(`${baseName}/auth/login`, params) + +const APIRegister = async params => BaseAxios.post(`${baseName}/auth/register`, params) + +export { + APILogin, + APIRegister +} \ No newline at end of file diff --git a/template/project/src/api/editor.js b/template/project/src/api/editor.js new file mode 100644 index 0000000..af6963c --- /dev/null +++ b/template/project/src/api/editor.js @@ -0,0 +1,17 @@ +const { baseName } = require('../../base.config') +import { BaseAxios } from '@/utils' + +const APIGetEditorComponent = async params => BaseAxios.post(`${baseName}/editor/getEditorComponent`, params) + +const APIUploadViewCover = async params => BaseAxios.post(`${baseName}/editor/uploadViewCover`, params) + +const APIDeleteViewCover = async params => BaseAxios.post(`${baseName}/editor/deleteViewCover`, params) + +const APIEditConfigureViews = async params => BaseAxios.post(`${baseName}/editor/editConfiguredViews`, params) + +export { + APIGetEditorComponent, + APIUploadViewCover, + APIDeleteViewCover, + APIEditConfigureViews +} \ No newline at end of file diff --git a/template/project/src/api/home.js b/template/project/src/api/home.js new file mode 100644 index 0000000..1b7adba --- /dev/null +++ b/template/project/src/api/home.js @@ -0,0 +1,12 @@ +const { baseName } = require('../../base.config') +import { BaseAxios } from '@/utils' + +/* 用户查询所有已配置的视图 */ +export const getConfiguredViews = async params => BaseAxios.post(`${baseName}/home/getConfiguredViews`, params) + +/* 用户删除已配置的视图 */ +export const deleteConfiguredViews = async params => BaseAxios.post(`${baseName}/home/deleteConfiguredViews?viewId=${params}`) +/* 用户新建视图 */ +export const createViews = async params => BaseAxios.post(`${baseName}/home/createViews`, params) +/* 用户查询账户下所关联的视图中的详细信息 */ +export const getConfiguredViewsDetailInfo = async params => BaseAxios.post(`${baseName}/home/getConfiguredViewsDetailInfo`, params) \ No newline at end of file diff --git a/template/project/src/api/monitor.js b/template/project/src/api/monitor.js new file mode 100644 index 0000000..fd4ebf3 --- /dev/null +++ b/template/project/src/api/monitor.js @@ -0,0 +1,11 @@ +const { baseName } = require('../../base.config') +import { BaseAxios } from '@/utils' + +const APIGetMonitoringSolutionsForMaster = async params => BaseAxios.get(`${baseName}/monitor/getMonitoringSolutionsForMaster`, params) + +const APIGetConfiguredViewsForMaster = async params => BaseAxios.post(`${baseName}/monitor/getConfiguredViewsForMaster`, params) + +export { + APIGetMonitoringSolutionsForMaster, + APIGetConfiguredViewsForMaster +} \ No newline at end of file diff --git a/template/project/src/assets/logo.png b/template/project/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..172038aab1384ba7bfc24c482f00e2e909aee2d2 GIT binary patch literal 43261 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 literal 0 HcmV?d00001 diff --git a/template/project/src/directives/button.js b/template/project/src/directives/button.js new file mode 100644 index 0000000..3d8bd78 --- /dev/null +++ b/template/project/src/directives/button.js @@ -0,0 +1,33 @@ +import { isArray } from '@/utils'; + +import Vue from 'vue'; + +import tool from '@/mixins/tooler'; + +import lcd_engine from '@/lcd.engine'; + +const { tooler } = lcd_engine; + +import store from '@/store'; + +export default { + inserted(el, binding, vnode) { + const value = binding.value; + if(isArray(value)) { + const [name, type, params] = value; + if(tooler[name]) { + const { icon, label, trigger } = tooler[name]; + new Vue({//NOSONAR + el, + template: `${label}`, + mixins: [tool], + store + }); + } else { + console.warn('未发现已注册的功能,请确认功能是否已经注册成功') + } + } else { + console.error('绑定指令值不正确,需要为字符串') + } + }, +} \ No newline at end of file diff --git a/template/project/src/directives/loading.js b/template/project/src/directives/loading.js new file mode 100644 index 0000000..50cd094 --- /dev/null +++ b/template/project/src/directives/loading.js @@ -0,0 +1,53 @@ +import Vue from "vue"; +import { Loading } from "vue-lcd-engine"; + +/** + * Vue.extend 接受参数并返回一个构造器,new 该构造器可以返回一个组件实例 + * 当我们 new Mask() 的时候,把该组件实例挂载到一个 div 上 + **/ +const Mask = Vue.extend(Loading); + +// 更新是否显示 +const toggleLoading = (el, binding) => { + if (binding.value) { + Vue.nextTick(() => { + // 控制loading组件显示 + el.instance.visible = true; + // 插入到目标元素 + insertDom(el, el); + }); + } else { + el.instance.visible = false; + } +}; + +// 插入到目标元素 +const insertDom = (parent, el) => { + parent.appendChild(el.mask); +}; + +export default { + //第一次绑定到元素时调用 + bind: function (el, binding) { + el.style.position = "relative"; + const mask = new Mask({ + el: document.createElement("div"), + }); + //用一个变量接住mask实例 + el.instance = mask; + el.mask = mask.$el; + el.maskStyle = {}; + binding.value && toggleLoading(el, binding); + }, + //所在组件的 VNode 更新时调用--比较更新前后的值 + update: function (el, binding) { + if (binding.oldValue !== binding.value) { + toggleLoading(el, binding); + } + }, + //指令与元素解绑时调用 + unbind: function (el) { + el.style.position = ""; + el.instance && el.instance.$destroy(); + }, +}; diff --git a/template/project/src/lcd.engine.js b/template/project/src/lcd.engine.js new file mode 100644 index 0000000..cc4f46b --- /dev/null +++ b/template/project/src/lcd.engine.js @@ -0,0 +1,248 @@ +// layout布局算法 +export const useLayout = (layout, refs) => { + const [l, r] = layout, + [side, render, set, float] = refs; + const sider = document.getElementById(side), + renderer = document.getElementById(render), + setter = document.getElementById(set), + floater = document.getElementById(float); + if (l == 0 && r == 0) { + sider.style.flex = "220"; + renderer.style.flex = "1700"; + setter.style.display = "none"; + floater.style.display = "block"; + } else if (l == 0 && r == 1) { + sider.style.flex = "220"; + renderer.style.flex = "1340"; + setter.style.display = "flex"; + setter.style.flex = "360"; + floater.style.display = "none"; + } else if (l == 1 && r == 1) { + sider.style.flex = "560"; + renderer.style.flex = "1000"; + setter.style.display = "flex"; + setter.style.flex = "360"; + floater.style.display = "none"; + } else if (l == 1 && r == 0) { + sider.style.flex = "560"; + renderer.style.flex = "1360"; + setter.style.display = "none"; + floater.style.display = "block"; + } +}; + +// lcd_engine_env环境变量判断 env | prod +export const lcd_engine_env = "dev"; + +export const lcd_engine_meta = { + bg1: { + attr: { + w: 1920, + h: 1080, + }, + prop: { + title: "", + }, + global: [], + }, + map1: { + attr: { + w: 1920, + h: 1000, + }, + prop: { + relations: [ + "alarm_statistics1", + "circuit_overview1", + "performance_monitor1", + "reinsurance_statistics1", + ], + }, + global: [], + }, + performance_monitor1: { + attr: { + w: 400, + h: 300, + }, + prop: { + title: "", + times: [], + circuits: [], + displays: {}, + }, + global: [ + { + key: "mapLevel", + value: 2, + isWork: true, + }, + { + key: "mapCode", + value: 100000, + isWork: true, + }, + ], + }, + alarm_statistics1: { + attr: { + w: 400, + h: 200, + }, + prop: { + title: "", + alarmPropsList: [], + }, + global: [ + { + key: "mapLevel", + value: 2, + isWork: true, + }, + { + key: "mapCode", + value: 100000, + isWork: true, + }, + ], + }, + reinsurance_statistics1: { + attr: { + w: 400, + h: 200, + }, + prop: { + title: "", + reinsuranceData: [], + }, + global: [ + { + key: "mapLevel", + value: 2, + isWork: true, + }, + { + key: "mapCode", + value: 100000, + isWork: true, + }, + ], + }, + circuit_overview1: { + attr: { + w: 400, + h: 900, + }, + prop: { + title: "", + projectStatusList: [], + }, + global: [ + { + key: "mapLevel", + value: 2, + isWork: true, + }, + { + key: "mapCode", + value: 100000, + isWork: true, + }, + ], + }, +}; + +// 后续可对setter name进行key与name的映射 目前key和name一致 +const getSetterName = (key) => `lcd-setter-${key}`; +const getSetterKey = (key) => `lcd-setter-${key}`; +const getSetterComponents = (meta) => { + const components = []; + Object.keys(meta).forEach((key) => { + components.push({ + name: getSetterName(key), + key: getSetterKey(key), + }); + }); + return components; +}; + +// 后续可对sider name进行key与name的映射 目前key和name一致 +const getSiderName = (key) => `lcd-sider-${key}`; +const getSiderKey = (key) => `lcd-sider-${key}`; +const getSiderComponents = (meta) => { + const components = []; + Object.keys(meta).forEach((key) => { + components.push({ + name: getSiderName(key), + key: getSiderKey(key), + }); + }); + return components; +}; + +// new LCDEngine +const lcd_engine = { + tooler: { + save: { + key: Symbol("save"), + icon: "editor-save", + label: "保存", + trigger: { + method: "click", + name: "handleSave", + }, + }, + preview: { + key: Symbol("preview"), + icon: "editor-preview", + label: "预览", + trigger: { + method: "click", + name: "handlePreview", + }, + }, + undo: { + key: Symbol("undo"), + icon: "editor-undo", + label: "上一步", + trigger: { + method: "click", + name: "handleUndo", + }, + }, + redo: { + key: Symbol("redo"), + icon: "editor-redo", + label: "下一步", + trigger: { + method: "click", + name: "handleRedo", + }, + }, + exit: { + key: Symbol("exit"), + icon: "editor-exit", + label: "退出", + trigger: { + method: "click", + name: "handleExit", + }, + }, + }, + renderer: { + width: 1920, + height: 1080, + }, + share: { + // 延迟时间 + delay: 500, + }, + setter: { + components: getSetterComponents(lcd_engine_meta), + }, + sider: { + components: getSiderComponents(lcd_engine_meta), + }, +}; + +export default lcd_engine; diff --git a/template/project/src/main.js b/template/project/src/main.js new file mode 100644 index 0000000..dbd716b --- /dev/null +++ b/template/project/src/main.js @@ -0,0 +1,206 @@ +import Vue from "vue"; +import App from "./App.vue"; +import router from "./router"; +import store from "./store"; + +// 挂载图片资源 路径前缀 +import { tgName, tmpName, bucketName } from "../base.config"; + +// 全局注册本地通用组件 +import { SvgIcon, ConfigItem, Size, Thumbnail } from "vue-lcd-engine"; + +[SvgIcon, ConfigItem, Size, Thumbnail].forEach((component) => { + console.log('component', component); + Vue.component(component.name, component); +}); + +//引入全局公用样式 +import "./styles/index.less"; + +import { + Base, + message, + notification, + Affix, + Anchor, + AutoComplete, + Alert, + Avatar, + BackTop, + Badge, + Breadcrumb, + Button, + Calendar, + Card, + Collapse, + Carousel, + Cascader, + Checkbox, + Col, + DatePicker, + Divider, + Dropdown, + Form, + FormModel, + Icon, + Input, + InputNumber, + Layout, + List, + LocaleProvider, + Menu, + Mentions, + Modal, + Pagination, + Popconfirm, + Popover, + Progress, + Radio, + Rate, + Row, + Select, + Slider, + Spin, + Statistic, + Steps, + Switch, + Table, + Transfer, + Tree, + TreeSelect, + Tabs, + Tag, + TimePicker, + Timeline, + Tooltip, + Upload, + Drawer, + Skeleton, + Comment, + // ColorPicker, + ConfigProvider, + Empty, + Result, + Descriptions, + PageHeader, + Space, +} from "ant-design-vue"; + +[ + Base, + Affix, + Anchor, + AutoComplete, + Alert, + Avatar, + BackTop, + Badge, + Breadcrumb, + Button, + Calendar, + Card, + Collapse, + Carousel, + Cascader, + Checkbox, + Col, + DatePicker, + Divider, + Dropdown, + Form, + FormModel, + Icon, + Input, + InputNumber, + Layout, + List, + LocaleProvider, + Menu, + Mentions, + Modal, + Pagination, + Popconfirm, + Popover, + Progress, + Radio, + Rate, + Row, + Select, + Slider, + Spin, + Statistic, + Steps, + Switch, + Table, + Transfer, + Tree, + TreeSelect, + Tabs, + Tag, + TimePicker, + Timeline, + Tooltip, + Upload, + Drawer, + Skeleton, + Comment, + ConfigProvider, + Empty, + Result, + Descriptions, + PageHeader, + Space, +].forEach((component) => { + Vue.use(component); +}); + +Vue.prototype.$message = message; +Vue.prototype.$notify = notification; +Vue.prototype.$info = Modal.info; +Vue.prototype.$success = Modal.success; +Vue.prototype.$error = Modal.error; +Vue.prototype.$warning = Modal.warning; +Vue.prototype.$confirm = Modal.confirm; +Vue.prototype.$destroyAll = Modal.destroyAll; + +// 环境模式挂载 +Vue.prototype.$mode = process.env.VUE_APP_MODE; + +// 天宫云 图床代理 + 运营端重构 专属存储桶名称 +Vue.prototype.$imgUrl = tgName + "/" + bucketName; +// 临时文件地址代理 +Vue.prototype.$tmpUrl = tmpName; + +Vue.config.productionTip = false; + +// 全局指令 + +// 功能区快捷指令 +import button from "@/directives/button"; +import loading from "@/directives/loading"; + +const directives = [ + { + alias: "btn", + directive: button, + }, + { + alias: "loading", + directive: loading, + }, +]; + +directives.forEach((item) => { + Vue.directive(item.alias, item.directive); +}); + +// 引入setter组件 +import "./setter"; +// 引入sider组件 +import "./sider"; + +new Vue({ + router, + store, + render: (h) => h(App), +}).$mount("#app"); diff --git a/template/project/src/mixins/htmlCanvas.js b/template/project/src/mixins/htmlCanvas.js new file mode 100644 index 0000000..4bddfbd --- /dev/null +++ b/template/project/src/mixins/htmlCanvas.js @@ -0,0 +1,38 @@ +import html2canvas from 'html2canvas' +import { createNamespacedHelpers } from 'vuex' +const { mapState, mapMutations } = createNamespacedHelpers('editor') +export default { + data () { + return {} + }, + computed: { + ...mapState(['scale', 'canvasImg']) + }, + methods: { + ...mapMutations(['handleSelectCanvas', 'handleCanvasImg']), + handleCanvas () { + this.handleSelectCanvas(false) + setTimeout(() => { + const element = document.querySelector('.go-chart-edit-content') + const { width, height } = element.getBoundingClientRect() + html2canvas(element, { + width, + height, + allowTaint: false, + backgroundColor: null, + useCORS: true, + scale: (1 / this.scale), + ignoreElements: e => { + if (element.contains(e)) { + return false + } + }, + }).then(canvas => { + const url = canvas.toDataURL('image/png') + // this.src = url + this['handleCanvasImg'](url) + }) + }, 500) + } + } +} \ No newline at end of file diff --git a/template/project/src/mixins/renderer.js b/template/project/src/mixins/renderer.js new file mode 100644 index 0000000..e4e08c8 --- /dev/null +++ b/template/project/src/mixins/renderer.js @@ -0,0 +1,36 @@ +import { createNamespacedHelpers } from "vuex"; + +const { mapState, mapMutations } = createNamespacedHelpers("editor"); + +import lcd_engine from "@/lcd.engine.js"; + +const { renderer } = lcd_engine; + +export default { + data() { + return { + renderer, + }; + }, + computed: { + ...mapState([ + "layout", + "scale", + "getComponentList", + "selectStack", + "status", + "canvasStyle", + "selectCanvas" + ]), + }, + methods: { + ...mapMutations([ + "handleStatus", + "handleAddComponent", + "handleUpdateComponent", + "handleUpdateSelect", + 'handleScale', + "handleSelectCanvas" + ]), + }, +}; diff --git a/template/project/src/mixins/router.js b/template/project/src/mixins/router.js new file mode 100644 index 0000000..08fe681 --- /dev/null +++ b/template/project/src/mixins/router.js @@ -0,0 +1,14 @@ +import { Session } from '@/utils'; + +export default { + beforeRouteEnter(to, from, next) { + const token = Session.get("token"); + if (!token) { + next("/login"); + } else { + next(); + window.location.href = + window.location.origin + "/" + window.location.hash; + } + }, +}; diff --git a/template/project/src/mixins/setter.js b/template/project/src/mixins/setter.js new file mode 100644 index 0000000..4fa985d --- /dev/null +++ b/template/project/src/mixins/setter.js @@ -0,0 +1,94 @@ +import { createNamespacedHelpers } from "vuex"; + +const { mapState, mapMutations } = createNamespacedHelpers("editor"); + +import lcd_engine from "@/lcd.engine.js"; + +const { setter } = lcd_engine; + +export default { + props: { + id: { + type: String, + default: '', + }, + }, + data() { + return { + setter, + }; + }, + computed: { + ...mapState([ + "status", + "restore", + "layout", + "selectStack", + "selectKey", + "getComponentList", + "setterID", + 'canvasStyle', + 'schema', + 'variable', + ]), + ...mapState({ + 'graph': state => state.schema.graph + }), + title() { + switch (this.status) { + case "0": + return "组件"; + case "1": + return "画板"; + case "2": + return "缩略图"; + default: + break; + } + }, + config() { + return this.getComponentList.find((e) => e.id === this.id) + }, + meta() { + return this.schema.meta[this.id] + } + }, + methods: { + ...mapMutations([ + "handleVariable", + "handleGraph", + "handleLayout", + "handleRestore", + "handleRemove", + 'handleUpdateComponent', + 'handleCanvasStyle' + ]), + handleWidth(w) { + this.handleUpdateComponent({ + id: this.id, + key: 'attr', + value: { + ...this.config.attr, + w: Number(w), + }, + }) + }, + handleHeight(h) { + this.handleUpdateComponent({ + id: this.id, + key: 'attr', + value: { + ...this.config.attr, + h: Number(h), + }, + }) + }, + handleSize(val) { + this.handleUpdateComponent({ + id: this.id, + key: 'RESIZE', + value: val + }) + } + }, +}; diff --git a/template/project/src/mixins/sider.js b/template/project/src/mixins/sider.js new file mode 100644 index 0000000..de1a32d --- /dev/null +++ b/template/project/src/mixins/sider.js @@ -0,0 +1,45 @@ +import { createNamespacedHelpers } from "vuex"; + +const { mapState, mapMutations } = createNamespacedHelpers("editor"); + +import lcd_engine from "@/lcd.engine.js"; + +const { sider } = lcd_engine; + +export default { + props: { + id: { + type: String, + default: '' + }, + prop: { + type: Object, + default: () => ({}) + }, + global: { + type: Array, + default: () => ([]) + } + }, + data() { + return { + sider + }; + }, + computed: { + ...mapState([ + 'status', + 'layout', + 'getComponentList', + 'variable', + 'graph' + ]), + }, + methods: { + ...mapMutations([ + 'handleLayout', + 'handleVariable', + 'handleGraph' + ]), + }, +}; \ No newline at end of file diff --git a/template/project/src/mixins/tooler.js b/template/project/src/mixins/tooler.js new file mode 100644 index 0000000..3af689e --- /dev/null +++ b/template/project/src/mixins/tooler.js @@ -0,0 +1,33 @@ +import { createNamespacedHelpers } from "vuex"; + +const { mapState, mapMutations } = createNamespacedHelpers("editor"); + +import lcd_engine from "@/lcd.engine.js"; + +const { tooler } = lcd_engine; + +export default { + data() { + return { + tooler + }; + }, + computed: { + ...mapState([ + "schema", + "canvasImg", + "getComponentList", + "canvasStyle" + ]), + }, + methods: { + ...mapMutations([ + ...Object.values(tooler).map((m) => m.trigger.name), + "handleThumbnail", + "handleViewId", + "handleMeta", + 'handleCover', + "handleReset" + ]), + }, +}; \ No newline at end of file diff --git a/template/project/src/mixins/viewer.js b/template/project/src/mixins/viewer.js new file mode 100644 index 0000000..edee895 --- /dev/null +++ b/template/project/src/mixins/viewer.js @@ -0,0 +1,41 @@ +import { createNamespacedHelpers } from "vuex"; + +const { mapState } = createNamespacedHelpers("editor"); + +import { cloneDeep } from "@/utils"; + +export default { + data() { + return { + list: [], + variable: {}, + graph: {}, + scaleW: 1, + scaleH: 1, + }; + }, + computed: { + ...mapState(["getComponentList"]), + }, + methods: { + useProp(id) { + const config = this.list.find((e) => e.id === id); + if (!config) return {}; + return cloneDeep(config.prop); + }, + useGlobal(id) { + const config = this.list.find((e) => e.id === id); + if (!config) return []; + return cloneDeep(config.global); + }, + getComputedStyle({ attr, zIndex }) { + return { + left: attr.x * this.scaleW + "px", + top: attr.y * this.scaleH + "px", + width: attr.w + "px", + height: attr.h + "px", + "z-index": zIndex, + }; + }, + }, +}; diff --git a/template/project/src/mixins/window.js b/template/project/src/mixins/window.js new file mode 100644 index 0000000..7a196f6 --- /dev/null +++ b/template/project/src/mixins/window.js @@ -0,0 +1,29 @@ +import { throttle } from '@/utils'; + +export default { + data() { + return { + windowWidth: null, // 存放窗口宽度的状态值 + windowHeight: null // 存放窗口高度的状态值 + } + }, + mounted() { + + this.updateWindowSize(); // 初始化获取当前窗口宽度 + + window.addEventListener('resize', this.handleResize); // 添加窗口大小改变的事件监听器 + }, + beforeDestroy() { + window.removeEventListener('resize', this.handleResize); // 在组件销毁之前移除事件监听器 + }, + methods: { + updateWindowSize() { + this.windowWidth = window.innerWidth; // 将当前窗口宽度赋值给状态值 + this.windowHeight = window.innerHeight; // 将当前窗口宽度赋值给状态值 + }, + handleResize: throttle(function(event) { + this.updateWindowSize(); + this.$router.go(0) + }, 500) + } + } \ No newline at end of file diff --git a/template/project/src/router/index.js b/template/project/src/router/index.js new file mode 100644 index 0000000..74adb1b --- /dev/null +++ b/template/project/src/router/index.js @@ -0,0 +1,68 @@ +import Vue from "vue"; +import VueRouter from "vue-router"; + +import { Layout } from 'vue-lcd-engine'; + +const { title } = require('$root/base.config.js') + +Vue.use(VueRouter); + +const router = new VueRouter({ + routes:[ + { + path: "/", + name: "/", + redirect: "/home", + component: Layout, + props: () => ({title: title, logo: tgName + "/" + bucketName + '/lcd-icon-logo.png'}), + children: [ + { + path: "/home", + name: "Home", + component: () => import("@/views/home"), + }, + { + path: "/editor/:id", + name: "Editor", + component: () => import("@/views/editor"), + }, + ], + }, + { + path: "/preview/:id", + name: "Preview", + component: () => import("@/views/preview"), + }, + { + path: "/monitor/:id", + name: "Monitor", + component: () => import("@/views/monitor"), + }, + { + path: "/login", + name: "Login", + component: () => import("@/views/Login.vue"), + }, + { + path: "*", + name: "NotFound", + component: () => import("@/views/NotFound.vue"), + }, + ], +}); + +// 路由守卫 +router.beforeEach(async (to, from, next) => { + if (to.path === "/login") { + next(); + } else { + const token = SessionStorage.get('token') + if (!token) { + next("/login"); + } else { + next(); + } + } +}); + +export default router; diff --git a/template/project/src/setter/index.js b/template/project/src/setter/index.js new file mode 100644 index 0000000..6d8f34e --- /dev/null +++ b/template/project/src/setter/index.js @@ -0,0 +1,3 @@ +export * from './lcd-setter-xxx'; + + diff --git a/template/project/src/setter/lcd-setter-xxx/constant.js b/template/project/src/setter/lcd-setter-xxx/constant.js new file mode 100644 index 0000000..1b64fdd --- /dev/null +++ b/template/project/src/setter/lcd-setter-xxx/constant.js @@ -0,0 +1 @@ +export const KEY = 'xxx'; \ No newline at end of file diff --git a/template/project/src/setter/lcd-setter-xxx/index.js b/template/project/src/setter/lcd-setter-xxx/index.js new file mode 100644 index 0000000..8769f94 --- /dev/null +++ b/template/project/src/setter/lcd-setter-xxx/index.js @@ -0,0 +1,8 @@ +import Vue from 'vue'; +import xxx from './index.vue'; + +Vue.component(xxx.name, xxx) + +export { + xxx +} \ No newline at end of file diff --git a/template/project/src/setter/lcd-setter-xxx/index.vue b/template/project/src/setter/lcd-setter-xxx/index.vue new file mode 100644 index 0000000..910e7f6 --- /dev/null +++ b/template/project/src/setter/lcd-setter-xxx/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/template/project/src/setter/lcd-setter-xxx/validator.js b/template/project/src/setter/lcd-setter-xxx/validator.js new file mode 100644 index 0000000..e69de29 diff --git a/template/project/src/sider/index.js b/template/project/src/sider/index.js new file mode 100644 index 0000000..f9806f3 --- /dev/null +++ b/template/project/src/sider/index.js @@ -0,0 +1,3 @@ +export * from './lcd-sider-xxx'; + + diff --git a/template/project/src/sider/lcd-sider-xxx/index.js b/template/project/src/sider/lcd-sider-xxx/index.js new file mode 100644 index 0000000..913b56d --- /dev/null +++ b/template/project/src/sider/lcd-sider-xxx/index.js @@ -0,0 +1,10 @@ +import Vue from 'vue'; +import xxx from './index.vue'; + +import 'lcd-component-xxx/dist/lcd-component-xxx.css' + +Vue.component(xxx.name, xxx) + +export { + xxx +} \ No newline at end of file diff --git a/template/project/src/sider/lcd-sider-xxx/index.vue b/template/project/src/sider/lcd-sider-xxx/index.vue new file mode 100644 index 0000000..399bf20 --- /dev/null +++ b/template/project/src/sider/lcd-sider-xxx/index.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/store/editor.js b/template/project/src/store/editor.js new file mode 100644 index 0000000..16e80ac --- /dev/null +++ b/template/project/src/store/editor.js @@ -0,0 +1,439 @@ +import lcd_engine from "@/lcd.engine.js"; +import Vue from "vue"; +import { cloneDeep, isNull } from "@/utils"; +const { tooler, share, renderer } = lcd_engine; + +// 创建editor的默认state +const createEditorState = function () { + const _state = { + // 全局变量 + variable: {}, + // 触发了restore事件 + restore: false, + setterID: null, + siderID: null, + // 大屏配置schema + schema: { + // 关联关系 + graph: {}, + // 画布宽度 + width: renderer.width, + // 画布高度 + height: renderer.height, + // 视图id + viewId: "", + // 视图名称 + name: "", + // 视图缩略图 + thumbnail: "", + // 封面地址 + cover: "", + // 组件信息 id => meta + meta: {}, + }, + // 选中状态 0:组件 1:画板 2:其他 + status: "2", + // 车道模型 布局算法 [0,0]: 左闭右闭 [0,1]:左闭右开 [1,0]:左开右闭 [1,1]:左开右开 + layout: [1, 1], + scale: 1, + getComponentList: [], + // 下一步栈 + backStack: [], + // 上一步栈 + forwardStack: [], + // 组件选中状态 + selectStack: null, + // 组件对应Key 关联配置项 + selectKey: null, + // 保存最新的截图 + canvasImg: null, + canvasStyle: { + width: renderer.width, + height: renderer.height, + }, + selectCanvas: true, // 是否操作了截取封面操作 + }; + + return _state; +}; + +// @override save操作 +const EDITOR_SAVE = ($state, payload) => { + console.log("EDITOR_SAVE", payload); +}; + +// @override preview操作 +const EDITOR_PREVIEW = ($state, payload) => { + console.log("EDITOR_PREVIEW", payload); + localStorage.setItem("preview", JSON.stringify($state.getComponentList)); + localStorage.setItem("graph", JSON.stringify($state.schema.graph)); + localStorage.setItem("canvasStyle", JSON.stringify($state.canvasStyle)); + window.open(`${window.location.origin}/#/preview/${payload.params}`); +}; + +// variable操作 +const EDITOR_VARIABLE = ($state, payload) => { + const {key, value} = payload; + console.log('EDITOR_VARIABLE', key, value) + if(!key || !value) return; + Vue.set($state.variable, key, value); +} + +// graph操作 +const EDITOR_GRAPH = ($state, payload) => { + const {key, value} = payload; + if(!key || !value) return; + $state.schema.graph[key] = value; +} + +// undo操作 +const EDITOR_UNDO = ($state) => { + const targetData = forwardAction($state); + if (targetData) { + const { id = null, key = null, DELETE = false } = targetData; + /* 处理选中 */ + $state.selectStack = id; + $state.selectKey = key; + if ($state.status != "0") { + $state.status = "0"; + } + if (DELETE) { + // 新增 + $state.getComponentList.push(targetData); + return; + } + const idArr = $state.forwardStack.filter((e) => e.id === id); + if (!idArr.length) { + console.log(id); + const index = $state.getComponentList.findIndex((e) => e.id === id); + $state.getComponentList.splice(index, 1); + backforward($state, index); + return; + } + /* 处理移动 */ + if ($state.forwardStack.length) { + const lastIndex = $state.forwardStack.findLastIndex((e) => e.id === id); + const data = $state.forwardStack[lastIndex]; + const index = $state.getComponentList.findIndex((e) => e.id === data.id); + Vue.set($state.getComponentList[index], "attr", { ...data.attr }); + } + } +}; + +const forwardAction = ($state) => { + if ($state.forwardStack.length) { + const targetData = cloneDeep($state.forwardStack.pop()); + if (!targetData) return; + $state.backStack.push({ ...targetData }); + return targetData; + } + return false; +}; + +// redo操作 +const EDITOR_REDO = ($state) => { + const targetData = backAction($state); + if (targetData) { + const { id = null, key = null, DELETE = false } = targetData; + const index = $state.getComponentList.findIndex((e) => e.id === id); + if (DELETE) { + // 删除 + $state.getComponentList.splice(index, 1); + backforward($state, index); + return; + } + if (index == -1) { + $state.getComponentList.push(cloneDeep(targetData)); + } else { + /* 处理移动 */ + const idx = $state.getComponentList.findIndex( + (e) => e.id === targetData.id + ); + Vue.set($state.getComponentList[idx], "attr", { ...targetData.attr }); + } + /* 处理选中 */ + $state.selectStack = id; + $state.selectKey = key; + if ($state.status != "0") { + $state.status = "0"; + } + $state.setterID = `lcd-setter-${key}~${id}`; + $state.siderID = `lcd-sider-${key}~${id}`; + } +}; + +const backAction = ($state) => { + if ($state.backStack.length) { + const targetData = cloneDeep($state.backStack.pop()); + if (!targetData) return; + $state.forwardStack.push({ ...targetData }); + return targetData; + } + return false; +}; + +const backforward = ($state, index) => { + if ($state.getComponentList.length) { + $state.selectStack = $state.getComponentList[index - 1].id; + $state.selectKey = $state.getComponentList[index - 1].key; + $state.setterID = `lcd-setter-${$state.selectKey}~${$state.selectStack}`; + $state.siderID = `lcd-sider-${$state.selectKey}~${$state.selectStack}`; + } else { + $state.status = "2"; + $state.selectStack = null; + $state.selectKey = null; + $state.setterID = null; + $state.siderID = null; + } +}; + +// reset操作 +const EDITOR_RESET = ($state, payload) => { + Object.assign($state, createEditorState()); +}; + +// @override exit操作 +const EDITOR_EXIT = ($state, payload) => { + console.log("EDITOR_EXIT", payload); +}; + +// status操作 +const EDITOR_STATUS = ($state, payload) => ($state.status = payload); + +// layout操作 +const EDITOR_LAYOUT = ($state, payload) => { + $state.layout = payload; +}; + +// remove操作 +const EDITOR_REMOVE = ($state) => { + if (!$state.getComponentList.length) return; + const index = $state.getComponentList.findIndex( + (e) => e.id === $state.selectStack + ); + const data = $state.getComponentList[index]; + $state.getComponentList.splice(index, 1); + $state.forwardStack.push({ ...data, DELETE: true }); + // 处理选中 + if ($state.getComponentList.length) { + const { id, key } = + $state.getComponentList[$state.getComponentList.length - 1]; + $state.selectStack = id; + $state.selectKey = key; + $state.setterID = `lcd-setter-${key}~${id}`; + $state.siderID = `lcd-sider-${key}~${id}`; + } else { + $state.status = "2"; + $state.selectStack = null; + $state.selectKey = null; + $state.setterID = null; + $state.siderID = null; + } +}; + +// meta操作 +const EDITOR_META = ($state, payload) => { + console.log("EDITOR_META", payload); + $state.schema.meta = payload; +}; + +// name操作 +const EDITOR_NAME = ($state, payload) => { + console.log("EDITOR_NAME", payload); + $state.schema.name = payload; +}; + +// viewId操作 +const EDITOR_VIEW_ID = ($state, payload) => { + console.log("EDITOR_VIEW_ID", payload); + $state.schema.viewId = payload; +}; + +// thumbnail操作 +const EDITOR_THUMBNAIL = ($state, payload) => { + console.log("EDITOR_THUMBNAIL", payload); + $state.schema.thumbnail = payload; +}; + +// cover操作 +const EDITOR_COVER = ($state, payload) => { + console.log("EDITOR_COVER", payload); + $state.schema.cover = payload; +}; + +// shema操作 +const EDITOR_SCHEMA = ($state, payload) => { + console.log("EDITOR_SCHEMA", payload); + $state.schema = payload; +}; + +// 放大缩小 +const EDITOR_SCALE = ($state, payload) => ($state.scale = payload); + +// 替换组件列表 +const EDITOR_REPLACE_LIST = ($state, payload) => { + $state.getComponentList = payload; +}; + +// 新增组件列表 +const EDITOR_ADD_LIST = ($state, payload) => { + const { id = null, key = null } = payload; + if (!id) return; + $state.getComponentList.push(payload); + $state.forwardStack.push(payload); + if ($state.backStack.length) { + $state.backStack = []; + } + $state.selectStack = id; + $state.selectKey = key; + $state.setterID = `lcd-setter-${key}~${id}`; + $state.siderID = `lcd-sider-${key}~${id}`; +}; + +// 更新组件列表 +const EDITOR_UPDATE_LIST = ($state, payload) => { + const { id = null, key, value, isRecord = null } = payload; + if (!id || !key) return; + const index = $state.getComponentList.findIndex((e) => e.id === id); + const object = $state.getComponentList.find((e) => e.id === id); + if (key == "attr") { + // 不记录组件来回切换选中 + const MoveBoolean = Object.keys(value).every( + (e) => value[e] == object.attr[e] + ); + if (MoveBoolean) return; + } + object[key] = value; + // 深拷贝 + const component = cloneDeep(object); + console.log("EDITOR_UPDATE_LIST", component); + // 使用$set修改index位置的变化 + Vue.set($state.getComponentList, index, component); + if (key == "prop") return; // 不记录组件配置改动 + if (isRecord) { + // 只记录画布上操作的 大小改变 + $state.forwardStack.push(component); + } +}; + +// restore操作 +const EDITOR_RESTORE = ($state, payload) => { + const { id } = payload; + const meta = $state.schema.meta[id]; + console.log("EDITOR_RESTORE", meta); + $state.restore = true; + setTimeout(() => { + $state.restore = false; + }, share.delay); +}; + +// 更新选中 +const EDITOR_UPDATE_SELECT = ($state, payload) => { + console.log("EDITOR_UPDATE_SELECT", payload); + $state.selectStack = payload; + if (payload) { + $state.status = "0"; + $state.restore = true; + const { key } = $state.getComponentList.find((e) => e.id == payload); + $state.selectKey = key; + $state.setterID = `lcd-setter-${key}~${payload}`; + $state.siderID = `lcd-sider-${key}~${payload}`; + setTimeout(() => { + $state.restore = false; + }, share.delay); + } else if (isNull(payload)) { + // 为null说明是点击的画板 + $state.status = "1"; + } else { + $state.status = "2"; + } +}; + +const EDITOR_CANVASIMG = ($state, payload) => { + console.log("EDITOR_CANVASIMG", payload); + $state.canvasImg = payload; +}; + +const EDITOR_CANVASSTYLE = ($state, payload) => { + $state.canvasStyle = payload; + $state.schema.width = payload.width; + $state.schema.height = payload.height; +}; + +const EDITOR_SELECT_CANVANS = ($state, payload) => { + $state.selectCanvas = payload; +}; + +const createToolerMutations = function () { + const _mutations = {}; + Object.entries(tooler).forEach(([key, content]) => { + const { name } = content.trigger; + switch (content.key.description) { + case "save": + _mutations[name] = EDITOR_SAVE; + break; + case "preview": + _mutations[name] = EDITOR_PREVIEW; + break; + case "undo": + _mutations[name] = EDITOR_UNDO; + break; + case "redo": + _mutations[name] = EDITOR_REDO; + break; + case "exit": + _mutations[name] = EDITOR_EXIT; + break; + default: + break; + } + }); + + return _mutations; +}; + +const mutations = { + ...{ + handleVariable: EDITOR_VARIABLE, + handleGraph: EDITOR_GRAPH, + handleStatus: EDITOR_STATUS, + handleLayout: EDITOR_LAYOUT, + handleRestore: EDITOR_RESTORE, + handleRemove: EDITOR_REMOVE, + handleScale: EDITOR_SCALE, + handleAddComponent: EDITOR_ADD_LIST, + handleUpdateComponent: EDITOR_UPDATE_LIST, + handleReplaceComponent: EDITOR_REPLACE_LIST, + handleUpdateSelect: EDITOR_UPDATE_SELECT, + handleCanvasImg: EDITOR_CANVASIMG, + handleMeta: EDITOR_META, + handleName: EDITOR_NAME, + handleViewId: EDITOR_VIEW_ID, + handleThumbnail: EDITOR_THUMBNAIL, + handleCover: EDITOR_COVER, + handleCanvasStyle: EDITOR_CANVASSTYLE, + handleSchema: EDITOR_SCHEMA, + handleReset: EDITOR_RESET, + handleSelectCanvas: EDITOR_SELECT_CANVANS, + }, + ...createToolerMutations(), +}; + +const state = { + ...{}, + ...createEditorState(), +}; + +import * as components_store from './modules'; + +console.log('components_store', components_store) + +export default { + namespaced: true, + modules: { + ...components_store + }, + state, + mutations, + actions: {}, +}; diff --git a/template/project/src/store/home.js b/template/project/src/store/home.js new file mode 100644 index 0000000..f7d8a81 --- /dev/null +++ b/template/project/src/store/home.js @@ -0,0 +1,12 @@ +export default { + namespaced: true, + state: { + + }, + mutations: { + + }, + actions: { + + }, +}; \ No newline at end of file diff --git a/template/project/src/store/index.js b/template/project/src/store/index.js new file mode 100644 index 0000000..20d2fc4 --- /dev/null +++ b/template/project/src/store/index.js @@ -0,0 +1,22 @@ +import Vue from "vue"; +import Vuex from "vuex"; +import home from "./home"; +import editor from "./editor"; +import preview from "./preview"; +import monitor from "./monitor"; + +Vue.use(Vuex); + +let modules = {}; +modules.home = home; +modules.editor = editor; +modules.monitor = monitor; +modules.preview = preview; + +const store = new Vuex.Store({ + modules, + namespaced: true, + plugins: [] +}); + +export default store; diff --git a/template/project/src/store/modules/index.js b/template/project/src/store/modules/index.js new file mode 100644 index 0000000..aa87e71 --- /dev/null +++ b/template/project/src/store/modules/index.js @@ -0,0 +1 @@ +export * from './xxx'; \ No newline at end of file diff --git a/template/project/src/store/modules/xxx.js b/template/project/src/store/modules/xxx.js new file mode 100644 index 0000000..fbecab6 --- /dev/null +++ b/template/project/src/store/modules/xxx.js @@ -0,0 +1 @@ +export * from 'lcd-component-xxx/src/store'; \ No newline at end of file diff --git a/template/project/src/store/monitor.js b/template/project/src/store/monitor.js new file mode 100644 index 0000000..3cc28a9 --- /dev/null +++ b/template/project/src/store/monitor.js @@ -0,0 +1,17 @@ +export default { + namespaced: true, + modules: {}, + state: { + viewMap: {}, + solutionName: '' + }, + mutations: { + handleViewMap(state, payload) { + state.viewMap = payload + }, + handleSolutionName(state, payload) { + state.solutionName = payload + } + }, + actions: {}, + }; \ No newline at end of file diff --git a/template/project/src/store/preview.js b/template/project/src/store/preview.js new file mode 100644 index 0000000..9a37d62 --- /dev/null +++ b/template/project/src/store/preview.js @@ -0,0 +1,7 @@ +export default { + namespaced: true, + modules: {}, + state: {}, + mutations: {}, + actions: {}, + }; \ No newline at end of file diff --git a/template/project/src/styles/cover.less b/template/project/src/styles/cover.less new file mode 100644 index 0000000..5b35f3f --- /dev/null +++ b/template/project/src/styles/cover.less @@ -0,0 +1,254 @@ +@import './vars.less'; + +// 重写button样式 +.ant_btn_reset() { + /deep/ .ant-btn:hover { + color: @text-color !important; + } + + /deep/ .ant-btn:focus { + color: @text-color !important; + } +} + +// 重写input样式 +.ant_input_reset() { + /deep/ .ant-input { + background-color: transparent; + } + + /deep/ .ant-input-disabled { + color: @dark-color-6; + } +} + +// 重写select样式 +.ant_select_reset() { + /deep/ .ant-select-selection { + background-color: transparent; + } + + /deep/ .ant-select-arrow { + color: white; + } +} + +// 重写slider样式 +.ant_slider_reset() { + /deep/ .ant-slider-rail { + background-color: white; + } + + /deep/ .ant-slider-track { + background-color: @primary-color; + } + + /deep/ .ant-slider-handle { + background-color: @primary-color; + border-color: @primary-color; + } +} + +// 重写popconfirm样式 +.ant_popconfirm_reset() { + .ant-popover { + .ant-popover-arrow { + border-color: @primary-color !important; + } + + .ant-popover-inner { + background-color: @primary-color; + + .ant-popover-buttons .ant-btn { + color: lighten(@dark-color, 99.9% - lightness(@dark-color)); + background: transparent; + border: none; + font-size: 12px; + + &.ant-btn-primary { + border: 1px solid lighten(@dark-color, 99.9% - lightness(@dark-color)); + } + } + } + + &.popconfirm-delete { + .ant-popover-buttons { + display: none; + } + + .ant-popover-message { + padding: 4px 0 0 0; + } + } + } +} + +// 重写pagination样式 +.ant_pagination_reset() { + /deep/ .ant-pagination { + .ant-pagination-item-active a { + background: @primary-color; + color: lighten(@dark-color, 99.9% - lightness(@dark-color)); + } + + .ant-pagination-item-ellipsis { + color: lighten(@dark-color, 99.9% - lightness(@dark-color)); + } + } +} + +// 重写checkbox样式 +.ant_checkbox_reset() { + /deep/ .ant-checkbox-inner { + background-color: transparent; + } +} + +// 重写collapse样式 +.ant_collapse_reset() { + /deep/ .ant-collapse { + .ant-collapse-item { + .ant-modal-close { + .ant-modal-close-icon { + color: white; + } + } + + .ant-collapse-content { + background-color: @dark-color-5; + } + + } + + } +} + +// 重写table样式 +.ant_table_reset() { + /deep/ .ant-table { + background-color: transparent; + border: 1px solid @dark-color-5; + border-radius: 0.25rem; + + .ant-table-row-selected { + td { + background-color: transparent; + } + } + + .ant-table-placeholder { + background-color: transparent; + + .ant-empty-description { + color: white; + } + } + + .ant-table-thead { + th { + background-color: @dark-color-4; + } + } + + .ant-table-selection-column { + .ant-checkbox-inner { + border-color: @dark-color-6; + background-color: transparent; + } + } + + .ant-table-tbody .ant-table-row:nth-child(odd) { + background-color: transparent; + } + + .ant-table-tbody .ant-table-row:nth-child(even) { + background: @dark-color-4; + } + } +} + +// 重写modal样式 +.ant_modal_reset() { + /deep/ .ant-modal-content { + background-color: @dark-color-3; + + .ant-modal-header { + background-color: inherit; + } + } + +} + +// 重写message样式 +.ant_message_reset(@name, @bgColor) { + .@{name} { + box-sizing: border-box; + margin: 0; + padding: 0; + color: white; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + list-style: none; + font-feature-settings: 'tnum'; + position: fixed; + top: 16px; + left: 0; + z-index: 1010; + width: 100%; + pointer-events: none; + } + .@{name}-notice { + padding: 8px; + text-align: center; + } + .@{name}-notice:first-child { + margin-top: -8px; + } + .@{name}-notice-content { + display: inline-block; + padding: 10px 16px; + background: @bgColor; + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + pointer-events: all; + } + .@{name} .anticon { + color: fff; + position: relative; + top: 1px; + margin-right: 8px; + font-size: 16px; + } + .@{name}-notice.move-up-leave.move-up-leave-active { + overflow: hidden; + -webkit-animation-name: MessageMoveOut; + animation-name: MessageMoveOut; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + } + @-webkit-keyframes MessageMoveOut { + 0% { + max-height: 150px; + padding: 8px; + opacity: 1; + } + 100% { + max-height: 0; + padding: 0; + opacity: 0; + } + } + @keyframes MessageMoveOut { + 0% { + max-height: 150px; + padding: 8px; + opacity: 1; + } + 100% { + max-height: 0; + padding: 0; + opacity: 0; + } + } +} \ No newline at end of file diff --git a/template/project/src/styles/index.less b/template/project/src/styles/index.less new file mode 100644 index 0000000..a0d47ac --- /dev/null +++ b/template/project/src/styles/index.less @@ -0,0 +1,61 @@ +@import '~ant-design-vue/dist/antd.less'; + +// 1920一下屏幕 不需要放大 只需要响应式布局即可 +@media screen and (min-width:1366px) { + html,body { + font-size: excl(12px); + } +} + +@media screen and (min-width:1440px) { + html,body { + font-size: excl(14px); + } +} + +@media screen and (min-width:1600px) { + html,body { + font-size: excl(14px); + } +} + +@media screen and (min-width:1920px) { + html,body { + font-size: excl(16px); + } +} + +@media screen and (min-width:2560px) { + html,body { + font-size: excl(18px); + } +} + +@media screen and (min-width:3840px) { + html,body { + font-size: excl(18px); + } +} + +/* 设置滚动条的样式 */ +::-webkit-scrollbar { + width:8px; + height:8px; +} +/* 滚动槽 */ +::-webkit-scrollbar-track { + -webkit-box-shadow:inset006pxrgba(0,0,0,0.3); + border-radius:10px; +} +/* 滚动条滑块 */ +::-webkit-scrollbar-thumb { + border-radius:10px; + background:#d8d8d8; + -webkit-box-shadow:inset006pxrgba(0,0,0,0.5); +} +::-webkit-scrollbar-thumb:window-inactive { + background:rgba(0,0,0,0.4); +} +::-webkit-scrollbar-corner { + background: transparent; +} \ No newline at end of file diff --git a/template/project/src/styles/vars.less b/template/project/src/styles/vars.less new file mode 100644 index 0000000..9c1eaa0 --- /dev/null +++ b/template/project/src/styles/vars.less @@ -0,0 +1,57 @@ +// 自定义变量 +@dark-color: #141414; +// #0f0f0f +@dark-color-1: darken(@dark-color, lightness(@dark-color) - 5.84%); +// #1f1f1f +@dark-color-2: lighten(@dark-color, 12.16% - lightness(@dark-color)); +// #2e2e2e +@dark-color-3: lighten(@dark-color, 18.04% - lightness(@dark-color)); +// #3a3a3a +@dark-color-4: lighten(@dark-color, 22.75% - lightness(@dark-color)); +// #404040 +@dark-color-5: lighten(@dark-color, 25.1% - lightness(@dark-color)); +// #595959 +@dark-color-6: lighten(@dark-color, 34.9% - lightness(@dark-color)); + +// ant-design-vue 变量 +@primary-color: #3779ee; // 全局主色 +@link-color: #1890ff; // 链接色 +@success-color: #2bbe8c; // 成功色 +@warning-color: #faad14; // 警告色 +@error-color: #eb5c5c; // 错误色 +// 暗黑主题修改 +@background-color-light: @dark-color-6; +@background-color-base: @dark-color-6; +@body-background: @dark-color; +@component-background: @dark-color-6; +@label-color: @text-color; +@border-color-base: @dark-color-6; +@border-color-split: @dark-color-6; +@heading-color: @text-color; +@text-color: @text-color; +@item-active-bg: @primary-color; +@item-hover-bg: @primary-color; +@text-color: white; +@text-color-secondary: darken(@text-color, 10%); // 次文本色 +@disabled-color: fade(@dark-color, 0.25); // 失效色 + + +:export { + primary_color: @primary-color; + link_color: @link-color; + success_color: @success-color; + warning_color: @warning-color; + error_color: @error-color; + dark_color: @dark-color; + dark_color_1: @dark-color-1; + dark_color_2: @dark-color-2; + dark_color_3: @dark-color-3; + dark_color_4: @dark-color-4; + dark_color_5: @dark-color-5; + dark_color_6: @dark-color-6; + text_color: @text-color; + text_color_secondary: @text-color-secondary; + disabled_color: @disabled-color; +} + + diff --git a/template/project/src/utils/deep.js b/template/project/src/utils/deep.js new file mode 100644 index 0000000..5852e4f --- /dev/null +++ b/template/project/src/utils/deep.js @@ -0,0 +1,16 @@ +export { cloneDeep } from "lodash"; + +export const compareDeep = (a, b) => { + if ( + a === null || + typeof a !== "object" || + a === null || + typeof a !== "object" + ) { + return a === b; + } + const propsA = Object.getOwnPropertyDescriptors(a); + const propsB = Object.getOwnPropertyDescriptors(b); + if (Object.keys(propsA).length !== Object.keys(propsB).length) return false; + return Object.keys(propsA).every((key) => compareDeep(a[key], b[key])); +}; diff --git a/template/project/src/utils/http.js b/template/project/src/utils/http.js new file mode 100644 index 0000000..b26626e --- /dev/null +++ b/template/project/src/utils/http.js @@ -0,0 +1,40 @@ +import axios from 'axios'; + +/** + * BaseAxios是数据使用的axios实例 + */ + +const BaseAxios = axios.create({ + timeout: 60000 +}); + +// 请求拦截 +BaseAxios.interceptors.request.use(async config => { + let token = sessionStorage.get('token'); + if (token) { + config.headers.Token = token; + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}, err => { + return Promise.reject(err); +}); + +// 响应拦截 +BaseAxios.interceptors.response.use( res => { + if(res.data.success || + res.data.FLAG === "SUCCESS" || + res.data.retCode === "200" || + res.status === 200){ + return res.data + } else { + message.error(res.data.msg || res.data.MESSAGE || res.data.message || "Error"); + return Promise.reject(res.data) + } +}, err => { + return Promise.reject(err) +}); + +export { + BaseAxios +}; \ No newline at end of file diff --git a/template/project/src/utils/image.js b/template/project/src/utils/image.js new file mode 100644 index 0000000..624125a --- /dev/null +++ b/template/project/src/utils/image.js @@ -0,0 +1,13 @@ +// 图片相关转化 +/* base64图片转化成文件流 */ +export const dataURLtoBlob = (dataurl) => { + const arr = dataurl.split(',') + const mime = arr[0].match(/:(.*?);/)[1] + const bstr = atob(arr[1]) + let n = bstr.length + let u8arr = new Uint8Array(n) + while (n--) { + u8arr[n] = bstr.charCodeAt(n) + } + return new Blob([u8arr], { type: mime }) +} \ No newline at end of file diff --git a/template/project/src/utils/index.js b/template/project/src/utils/index.js new file mode 100644 index 0000000..63ce9b5 --- /dev/null +++ b/template/project/src/utils/index.js @@ -0,0 +1,9 @@ +export * from 'lodash'; + +// 本地utils +export * from './http'; +export * from './image'; +export * from './deep'; +export * from './is'; +export * from './merge'; +export * from './useKeyBoard'; \ No newline at end of file diff --git a/template/project/src/utils/is.js b/template/project/src/utils/is.js new file mode 100644 index 0000000..b3b78dd --- /dev/null +++ b/template/project/src/utils/is.js @@ -0,0 +1,17 @@ +// 判断是不是数组 +export const isArray = arr => Array.isArray(arr); + +// 判断是不是函数 +export const isFunction = func => typeof func === 'function'; + +// 判断是不是字符串 +export const isString = str => typeof str === 'string'; + +// 判断是不是Object +export const isObject = (value) => { + const type = typeof value + return value !== null && (type === "object" || type === "function") +} + +// 判断是不是Null +export const isNull = value => value === null; diff --git a/template/project/src/utils/merge.js b/template/project/src/utils/merge.js new file mode 100644 index 0000000..51e36bd --- /dev/null +++ b/template/project/src/utils/merge.js @@ -0,0 +1,36 @@ +import { mergeWith } from 'lodash'; + +import { isArray, isObject } from './is'; + +// 合并两个对象 + export const mergeObject = (source, other) => { + if (!isObject(source) || !isObject(other)) { + return other === undefined ? source : other + } + // 合并两个对象的 key,另外要区分数组的初始值为 [] + return Object.keys({ + ...source, + ...other, + }).reduce( + (acc, key) => { + // 递归合并 value + acc[key] = mergeObject(source[key], other[key]) + + return acc + }, + Array.isArray(source) ? [] : {} + ) + } + + export const mergeWithObject = (source, other) => { + return mergeWith(source, other, function customizer(sourceValue, otherValue) { + if (isArray(sourceValue)) { + return otherValue; + } else if (typeof sourceValue === 'object' && typeof otherValue === 'object') { + // 若是object类型的对象,我们进行递归 + return mergeWith(sourceValue, otherValue, customizer) + } else { + return otherValue; + } + }) + } \ No newline at end of file diff --git a/template/project/src/utils/useKeyBoard.js b/template/project/src/utils/useKeyBoard.js new file mode 100644 index 0000000..b27ad35 --- /dev/null +++ b/template/project/src/utils/useKeyBoard.js @@ -0,0 +1,100 @@ +import store from "@/store" +import { throttle } from '@/utils' +import keymaster from 'keymaster' + +const winCtrlMerge = e => `ctrl+${e}` +const winShiftMerge = e => `ctrl+shift+${e}` +const macCtrlMerge = e => `⌘+${e}` +const macShiftMerge = e => `⌘+shift+${e}` +// windows +const winKeyValue = { + forward: winCtrlMerge('y'), + forward_new: winShiftMerge('z'), + back: winCtrlMerge('z'), + delete: 'delete' +} +// mac +const macKeyValue = { + forward: macCtrlMerge('y'), + forward_new: macShiftMerge('z'), + back: macCtrlMerge('z'), + delete: macCtrlMerge('backspace') +} + +// 处理键盘记录 +const keyRecordHandle = () => { + // 默认赋值 + window.$KeyboardActive = { + ctrl: false, + space: false + } + document.onkeydown = e => {//NOSONAR + const { keyCode } = e//NOSONAR + if (keyCode == 32 && e.target == document.body) e.preventDefault() + if ([17, 32].includes(keyCode) && window.$KeyboardActive) { + switch (keyCode) { + case 17: window.$KeyboardActive.ctrl = true; break + case 32: window.$KeyboardActive.space = true; break + } + } + } + document.onkeyup = e => {//NOSONAR + const { keyCode } = e//NOSONAR + if (keyCode == 32 && e.target == document.body) e.preventDefault() + if ([17, 32].includes(keyCode) && window.$KeyboardActive) { + switch (keyCode) { + case 17: window.$KeyboardActive.ctrl = false; break + case 32: window.$KeyboardActive.space = false; break + } + } + } +} + +// 初始化监听事件 +export const useAddKeyboard = () => { + const throttleTime = 50 + const switchHandle = (e, key) => { + switch (key) { + // 撤回 ct+z + case e.back: + keymaster(key, throttle(() => { store.commit('editor/handleUndo') }, throttleTime)) + break + // 前进 ct+y + case e.forward: + keymaster(key, throttle(() => { store.commit('editor/handleRedo') }, throttleTime)) + break + // 前进 ct+sh+z + case e.forward_new: + keymaster(key, throttle(() => { store.commit('editor/handleRedo') }, throttleTime)) + break + case e.delete: + keymaster(key, throttle(() => { store.commit('editor/handleRemove') }, throttleTime)) + break + default: + break + } + } + Object.keys(winKeyValue).forEach((key) => { + switchHandle(winKeyValue, winKeyValue[key]) + }) + Object.keys(macKeyValue).forEach((key) => { + switchHandle(macKeyValue, macKeyValue[key]) + }) + keyRecordHandle() +} + +// 卸载监听事件 +export const useRemoveKeyboard = () => { + document.onkeydown = () => { + console.log('onkeydown') + } + document.onkeyup = () => { + console.log('onkeyup') + } + Object.keys(winKeyValue).forEach((key) => { + keymaster.unbind(winKeyValue[key]) + }) + Object.keys(macKeyValue).forEach((key) => { + keymaster.unbind(macKeyValue[key]) + }) +} \ No newline at end of file diff --git a/template/project/src/views/Login.vue b/template/project/src/views/Login.vue new file mode 100644 index 0000000..8482fe2 --- /dev/null +++ b/template/project/src/views/Login.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/template/project/src/views/NotFound.vue b/template/project/src/views/NotFound.vue new file mode 100644 index 0000000..f5be146 --- /dev/null +++ b/template/project/src/views/NotFound.vue @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/template/project/src/views/editor/components/RenderBottom.vue b/template/project/src/views/editor/components/RenderBottom.vue new file mode 100644 index 0000000..859751e --- /dev/null +++ b/template/project/src/views/editor/components/RenderBottom.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/template/project/src/views/editor/components/RenderTop.vue b/template/project/src/views/editor/components/RenderTop.vue new file mode 100644 index 0000000..7b82f5f --- /dev/null +++ b/template/project/src/views/editor/components/RenderTop.vue @@ -0,0 +1,414 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/editor/components/SetterContent.vue b/template/project/src/views/editor/components/SetterContent.vue new file mode 100644 index 0000000..c4ce1e6 --- /dev/null +++ b/template/project/src/views/editor/components/SetterContent.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/template/project/src/views/editor/components/SetterFloat.vue b/template/project/src/views/editor/components/SetterFloat.vue new file mode 100644 index 0000000..c91682c --- /dev/null +++ b/template/project/src/views/editor/components/SetterFloat.vue @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/editor/components/SetterHeader.vue b/template/project/src/views/editor/components/SetterHeader.vue new file mode 100644 index 0000000..5709fab --- /dev/null +++ b/template/project/src/views/editor/components/SetterHeader.vue @@ -0,0 +1,99 @@ + + + + + + + diff --git a/template/project/src/views/editor/components/SiderMain.vue b/template/project/src/views/editor/components/SiderMain.vue new file mode 100644 index 0000000..2239cc7 --- /dev/null +++ b/template/project/src/views/editor/components/SiderMain.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/template/project/src/views/editor/components/ToolLeft.vue b/template/project/src/views/editor/components/ToolLeft.vue new file mode 100644 index 0000000..c48f792 --- /dev/null +++ b/template/project/src/views/editor/components/ToolLeft.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/template/project/src/views/editor/components/ToolRight.vue b/template/project/src/views/editor/components/ToolRight.vue new file mode 100644 index 0000000..0e709e4 --- /dev/null +++ b/template/project/src/views/editor/components/ToolRight.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/template/project/src/views/editor/index.vue b/template/project/src/views/editor/index.vue new file mode 100644 index 0000000..1c4c8a0 --- /dev/null +++ b/template/project/src/views/editor/index.vue @@ -0,0 +1,271 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/home/components/CreateModal.vue b/template/project/src/views/home/components/CreateModal.vue new file mode 100644 index 0000000..ada2ff2 --- /dev/null +++ b/template/project/src/views/home/components/CreateModal.vue @@ -0,0 +1,261 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/home/components/List.vue b/template/project/src/views/home/components/List.vue new file mode 100644 index 0000000..549ab05 --- /dev/null +++ b/template/project/src/views/home/components/List.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/template/project/src/views/home/components/MoreModel.vue b/template/project/src/views/home/components/MoreModel.vue new file mode 100644 index 0000000..df64306 --- /dev/null +++ b/template/project/src/views/home/components/MoreModel.vue @@ -0,0 +1,349 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/home/components/Search.vue b/template/project/src/views/home/components/Search.vue new file mode 100644 index 0000000..e53ca25 --- /dev/null +++ b/template/project/src/views/home/components/Search.vue @@ -0,0 +1,139 @@ + + + + + \ No newline at end of file diff --git a/template/project/src/views/home/index.vue b/template/project/src/views/home/index.vue new file mode 100644 index 0000000..d8fdcfd --- /dev/null +++ b/template/project/src/views/home/index.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/template/project/src/views/monitor/components/ViewSwitch.vue b/template/project/src/views/monitor/components/ViewSwitch.vue new file mode 100644 index 0000000..e640309 --- /dev/null +++ b/template/project/src/views/monitor/components/ViewSwitch.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/template/project/src/views/monitor/index.vue b/template/project/src/views/monitor/index.vue new file mode 100644 index 0000000..5889965 --- /dev/null +++ b/template/project/src/views/monitor/index.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/template/project/src/views/preview/index.vue b/template/project/src/views/preview/index.vue new file mode 100644 index 0000000..e0975f9 --- /dev/null +++ b/template/project/src/views/preview/index.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/template/project/vue.config.js b/template/project/vue.config.js new file mode 100644 index 0000000..3bd2eca --- /dev/null +++ b/template/project/vue.config.js @@ -0,0 +1,100 @@ +const { + devServer, + configureWebpack, + chainWebpack, + postCSSPlugin, +} = require("./build"); + +console.log("当前Node.js版本", process.version); + +const fs = require("fs"); +const less = require("less"); + +/** + * @params {string} url --- url is a relative path string of a css file + */ +const readLess = (url) => { + const lessStr = fs.readFileSync(url, "utf-8"); + let output = ""; + less.render(lessStr, (err, res) => { + if (err) { + throw new Error(err); + } else { + output = res; + } + }); + + const _vars = {}; + + output.css + .replace(":export ", "") + .replace(/\{|\}|\s/gi, "") + .split(";") + .filter((f) => Boolean(f)) + .map((m) => m.split(":")) + .forEach((item) => { + _vars[item[0]] = item[1]; + }); + + return _vars; +}; + +const vars = readLess("./src/styles/vars.less"); + +console.log("vars", vars); + +module.exports = { + // DEV环境忽略eslint + lintOnSave: false, + // 是否开启并行 + parallel: require("os").cpus().length > 1, + publicPath: "./", + outputDir: "dist", + runtimeCompiler: true, + filenameHashing: false, + productionSourceMap: false, + configureWebpack, + chainWebpack, + // 解决 ant 按需加载 less 'Inline JavaScript is not enabled' 报错 + css: { + loaderOptions: { + // 向 CSS 相关的 loader 传递选项 + less: { + modifyVars: { + "primary-color": vars.primary_color, + "success-color": vars.success_color, + "warning-color": vars.warning_color, + "background-color-base": vars.dark_color_6, + "background-color-light": vars.dark_color_6, + "body-background": vars.dark_color, + "component-background": vars.dark_color_6, + "label-color": vars.text_color, + "border-color-base": vars.dark_color_6, + "border-color-split": vars.dark_color_6, + "heading-color": vars.text_color, + "text-color": vars.text_color, + "item-active-bg": vars.primary_color, + "item-hover-bg": vars.primary_color, + "text_color_secondary": vars.text_color_secondary, + "disabled_color": vars.disabled_color + }, + javascriptEnabled: true, + }, + // vue-cli内置了postcss,向其中传递所需的postcss处理 + postcss: { + plugins: [ + postCSSPlugin["postcss-pcx2rem"]({ + baseDpr: 1, + // html基础fontSize 设计稿尺寸 屏幕尺寸 + remUnit: (16 * 1920) / 1920, + remPrecision: 6, + forcePxComment: "px", + keepComment: "no", + }), + ], + }, + }, + }, + + devServer, +}; diff --git a/template/setter/constant.js b/template/setter/constant.js new file mode 100644 index 0000000..1b64fdd --- /dev/null +++ b/template/setter/constant.js @@ -0,0 +1 @@ +export const KEY = 'xxx'; \ No newline at end of file diff --git a/template/setter/index.js b/template/setter/index.js new file mode 100644 index 0000000..8769f94 --- /dev/null +++ b/template/setter/index.js @@ -0,0 +1,8 @@ +import Vue from 'vue'; +import xxx from './index.vue'; + +Vue.component(xxx.name, xxx) + +export { + xxx +} \ No newline at end of file diff --git a/template/setter/index.vue b/template/setter/index.vue new file mode 100644 index 0000000..910e7f6 --- /dev/null +++ b/template/setter/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/template/setter/validator.js b/template/setter/validator.js new file mode 100644 index 0000000..e69de29 diff --git a/template/sider/index.js b/template/sider/index.js new file mode 100644 index 0000000..913b56d --- /dev/null +++ b/template/sider/index.js @@ -0,0 +1,10 @@ +import Vue from 'vue'; +import xxx from './index.vue'; + +import 'lcd-component-xxx/dist/lcd-component-xxx.css' + +Vue.component(xxx.name, xxx) + +export { + xxx +} \ No newline at end of file diff --git a/template/sider/index.vue b/template/sider/index.vue new file mode 100644 index 0000000..399bf20 --- /dev/null +++ b/template/sider/index.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file -- Gitee From 45b346fa858053c796bff1feee67d2f8e5e8d322 Mon Sep 17 00:00:00 2001 From: we452366 <996925662@qq.com> Date: Mon, 17 Jun 2024 14:46:21 +0800 Subject: [PATCH 2/4] =?UTF-8?q?chore:=20=E5=89=A5=E7=A6=BBtemplate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/component/.gitignore | 31 -- template/component/README.md | 3 - template/component/babel.config.js | 3 - template/component/base.config.js | 8 - template/component/lcd.component.json | 9 - template/component/package.json | 44 -- template/component/public/favicon.ico | Bin 4286 -> 0 bytes template/component/public/index.html | 17 - template/component/publish.sh | 1 - template/component/src/App.vue | 40 -- template/component/src/api/component.js | 8 - template/component/src/assets/logo.png | Bin 43261 -> 0 bytes template/component/src/main.js | 16 - template/component/src/store/index.js | 20 - template/component/src/store/xxx/actions.js | 1 - template/component/src/store/xxx/getters.js | 0 template/component/src/store/xxx/index.js | 12 - template/component/src/store/xxx/mutations.js | 4 - template/component/src/store/xxx/state.js | 4 - template/component/src/utils/http.js | 33 -- template/component/vue.config.js | 68 --- template/project/.gitignore | 69 --- template/project/README.md | 49 -- template/project/babel.config.js | 9 - template/project/base.config.js | 8 - template/project/build/chainWebpack.js | 55 --- template/project/build/configureWebpack.js | 5 - template/project/build/dev/config.json | 4 - .../project/build/dev/configureWebpack.js | 17 - template/project/build/devServer.js | 24 - template/project/build/index.js | 11 - template/project/build/postCSSPlugin.js | 142 ------ template/project/build/production/config.json | 6 - .../build/production/configureWebpack.js | 43 -- template/project/package.json | 55 --- template/project/public/favicon.ico | Bin 4286 -> 0 bytes template/project/public/index.html | 21 - template/project/src/App.vue | 30 -- template/project/src/api/auth.js | 11 - template/project/src/api/editor.js | 17 - template/project/src/api/home.js | 12 - template/project/src/api/monitor.js | 11 - template/project/src/assets/logo.png | Bin 43261 -> 0 bytes template/project/src/directives/button.js | 33 -- template/project/src/directives/loading.js | 53 --- template/project/src/lcd.engine.js | 248 ---------- template/project/src/main.js | 206 -------- template/project/src/mixins/htmlCanvas.js | 38 -- template/project/src/mixins/renderer.js | 36 -- template/project/src/mixins/router.js | 14 - template/project/src/mixins/setter.js | 94 ---- template/project/src/mixins/sider.js | 45 -- template/project/src/mixins/tooler.js | 33 -- template/project/src/mixins/viewer.js | 41 -- template/project/src/mixins/window.js | 29 -- template/project/src/router/index.js | 68 --- template/project/src/setter/index.js | 3 - .../src/setter/lcd-setter-xxx/constant.js | 1 - .../src/setter/lcd-setter-xxx/index.js | 8 - .../src/setter/lcd-setter-xxx/index.vue | 94 ---- .../src/setter/lcd-setter-xxx/validator.js | 0 template/project/src/sider/index.js | 3 - .../project/src/sider/lcd-sider-xxx/index.js | 10 - .../project/src/sider/lcd-sider-xxx/index.vue | 37 -- template/project/src/store/editor.js | 439 ------------------ template/project/src/store/home.js | 12 - template/project/src/store/index.js | 22 - template/project/src/store/modules/index.js | 1 - template/project/src/store/modules/xxx.js | 1 - template/project/src/store/monitor.js | 17 - template/project/src/store/preview.js | 7 - template/project/src/styles/cover.less | 254 ---------- template/project/src/styles/index.less | 61 --- template/project/src/styles/vars.less | 57 --- template/project/src/utils/deep.js | 16 - template/project/src/utils/http.js | 40 -- template/project/src/utils/image.js | 13 - template/project/src/utils/index.js | 9 - template/project/src/utils/is.js | 17 - template/project/src/utils/merge.js | 36 -- template/project/src/utils/useKeyBoard.js | 100 ---- template/project/src/views/Login.vue | 146 ------ template/project/src/views/NotFound.vue | 21 - .../views/editor/components/RenderBottom.vue | 68 --- .../src/views/editor/components/RenderTop.vue | 414 ----------------- .../views/editor/components/SetterContent.vue | 35 -- .../views/editor/components/SetterFloat.vue | 45 -- .../views/editor/components/SetterHeader.vue | 99 ---- .../src/views/editor/components/SiderMain.vue | 132 ------ .../src/views/editor/components/ToolLeft.vue | 228 --------- .../src/views/editor/components/ToolRight.vue | 153 ------ template/project/src/views/editor/index.vue | 271 ----------- .../src/views/home/components/CreateModal.vue | 261 ----------- .../src/views/home/components/List.vue | 317 ------------- .../src/views/home/components/MoreModel.vue | 349 -------------- .../src/views/home/components/Search.vue | 139 ------ template/project/src/views/home/index.vue | 216 --------- .../views/monitor/components/ViewSwitch.vue | 121 ----- template/project/src/views/monitor/index.vue | 159 ------- template/project/src/views/preview/index.vue | 119 ----- template/project/vue.config.js | 100 ---- template/setter/constant.js | 1 - template/setter/index.js | 8 - template/setter/index.vue | 94 ---- template/setter/validator.js | 0 template/sider/index.js | 10 - template/sider/index.vue | 37 -- 107 files changed, 6660 deletions(-) delete mode 100644 template/component/.gitignore delete mode 100644 template/component/README.md delete mode 100644 template/component/babel.config.js delete mode 100644 template/component/base.config.js delete mode 100644 template/component/lcd.component.json delete mode 100644 template/component/package.json delete mode 100644 template/component/public/favicon.ico delete mode 100644 template/component/public/index.html delete mode 100644 template/component/publish.sh delete mode 100644 template/component/src/App.vue delete mode 100644 template/component/src/api/component.js delete mode 100644 template/component/src/assets/logo.png delete mode 100644 template/component/src/main.js delete mode 100644 template/component/src/store/index.js delete mode 100644 template/component/src/store/xxx/actions.js delete mode 100644 template/component/src/store/xxx/getters.js delete mode 100644 template/component/src/store/xxx/index.js delete mode 100644 template/component/src/store/xxx/mutations.js delete mode 100644 template/component/src/store/xxx/state.js delete mode 100644 template/component/src/utils/http.js delete mode 100644 template/component/vue.config.js delete mode 100644 template/project/.gitignore delete mode 100644 template/project/README.md delete mode 100644 template/project/babel.config.js delete mode 100644 template/project/base.config.js delete mode 100644 template/project/build/chainWebpack.js delete mode 100644 template/project/build/configureWebpack.js delete mode 100644 template/project/build/dev/config.json delete mode 100644 template/project/build/dev/configureWebpack.js delete mode 100644 template/project/build/devServer.js delete mode 100644 template/project/build/index.js delete mode 100644 template/project/build/postCSSPlugin.js delete mode 100644 template/project/build/production/config.json delete mode 100644 template/project/build/production/configureWebpack.js delete mode 100644 template/project/package.json delete mode 100644 template/project/public/favicon.ico delete mode 100644 template/project/public/index.html delete mode 100644 template/project/src/App.vue delete mode 100644 template/project/src/api/auth.js delete mode 100644 template/project/src/api/editor.js delete mode 100644 template/project/src/api/home.js delete mode 100644 template/project/src/api/monitor.js delete mode 100644 template/project/src/assets/logo.png delete mode 100644 template/project/src/directives/button.js delete mode 100644 template/project/src/directives/loading.js delete mode 100644 template/project/src/lcd.engine.js delete mode 100644 template/project/src/main.js delete mode 100644 template/project/src/mixins/htmlCanvas.js delete mode 100644 template/project/src/mixins/renderer.js delete mode 100644 template/project/src/mixins/router.js delete mode 100644 template/project/src/mixins/setter.js delete mode 100644 template/project/src/mixins/sider.js delete mode 100644 template/project/src/mixins/tooler.js delete mode 100644 template/project/src/mixins/viewer.js delete mode 100644 template/project/src/mixins/window.js delete mode 100644 template/project/src/router/index.js delete mode 100644 template/project/src/setter/index.js delete mode 100644 template/project/src/setter/lcd-setter-xxx/constant.js delete mode 100644 template/project/src/setter/lcd-setter-xxx/index.js delete mode 100644 template/project/src/setter/lcd-setter-xxx/index.vue delete mode 100644 template/project/src/setter/lcd-setter-xxx/validator.js delete mode 100644 template/project/src/sider/index.js delete mode 100644 template/project/src/sider/lcd-sider-xxx/index.js delete mode 100644 template/project/src/sider/lcd-sider-xxx/index.vue delete mode 100644 template/project/src/store/editor.js delete mode 100644 template/project/src/store/home.js delete mode 100644 template/project/src/store/index.js delete mode 100644 template/project/src/store/modules/index.js delete mode 100644 template/project/src/store/modules/xxx.js delete mode 100644 template/project/src/store/monitor.js delete mode 100644 template/project/src/store/preview.js delete mode 100644 template/project/src/styles/cover.less delete mode 100644 template/project/src/styles/index.less delete mode 100644 template/project/src/styles/vars.less delete mode 100644 template/project/src/utils/deep.js delete mode 100644 template/project/src/utils/http.js delete mode 100644 template/project/src/utils/image.js delete mode 100644 template/project/src/utils/index.js delete mode 100644 template/project/src/utils/is.js delete mode 100644 template/project/src/utils/merge.js delete mode 100644 template/project/src/utils/useKeyBoard.js delete mode 100644 template/project/src/views/Login.vue delete mode 100644 template/project/src/views/NotFound.vue delete mode 100644 template/project/src/views/editor/components/RenderBottom.vue delete mode 100644 template/project/src/views/editor/components/RenderTop.vue delete mode 100644 template/project/src/views/editor/components/SetterContent.vue delete mode 100644 template/project/src/views/editor/components/SetterFloat.vue delete mode 100644 template/project/src/views/editor/components/SetterHeader.vue delete mode 100644 template/project/src/views/editor/components/SiderMain.vue delete mode 100644 template/project/src/views/editor/components/ToolLeft.vue delete mode 100644 template/project/src/views/editor/components/ToolRight.vue delete mode 100644 template/project/src/views/editor/index.vue delete mode 100644 template/project/src/views/home/components/CreateModal.vue delete mode 100644 template/project/src/views/home/components/List.vue delete mode 100644 template/project/src/views/home/components/MoreModel.vue delete mode 100644 template/project/src/views/home/components/Search.vue delete mode 100644 template/project/src/views/home/index.vue delete mode 100644 template/project/src/views/monitor/components/ViewSwitch.vue delete mode 100644 template/project/src/views/monitor/index.vue delete mode 100644 template/project/src/views/preview/index.vue delete mode 100644 template/project/vue.config.js delete mode 100644 template/setter/constant.js delete mode 100644 template/setter/index.js delete mode 100644 template/setter/index.vue delete mode 100644 template/setter/validator.js delete mode 100644 template/sider/index.js delete mode 100644 template/sider/index.vue diff --git a/template/component/.gitignore b/template/component/.gitignore deleted file mode 100644 index 34734ec..0000000 --- a/template/component/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -.DS_Store -node_modules -# /dist - -#submodule -/subLibrary - -# lock -#package-lock.json -yarn.lock - -# local env files -.env.local -.env.*.local - -package-lock.json - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/template/component/README.md b/template/component/README.md deleted file mode 100644 index 66a58d0..0000000 --- a/template/component/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# lcd-component-xxx - -> 一款基于Vue的xxx组件 \ No newline at end of file diff --git a/template/component/babel.config.js b/template/component/babel.config.js deleted file mode 100644 index 1d248fc..0000000 --- a/template/component/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ["@vue/app"], -}; diff --git a/template/component/base.config.js b/template/component/base.config.js deleted file mode 100644 index 3034d66..0000000 --- a/template/component/base.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - // 开发代理前缀配置 - baseUrl: "api_target", - // 项目名称 最多不超过12个汉字 - title: "lcd-component-xxx", - // 默认主题色 - defaultColor: "#1890ff", -}; diff --git a/template/component/lcd.component.json b/template/component/lcd.component.json deleted file mode 100644 index 8c120c6..0000000 --- a/template/component/lcd.component.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "xxx", - "key": "xxx", - "version": "2.0.0", - "description": "一款基于Vue的xxx组件", - "cover": "", - "repository": "", - "author": "we452366" -} \ No newline at end of file diff --git a/template/component/package.json b/template/component/package.json deleted file mode 100644 index 0b3b4bb..0000000 --- a/template/component/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "lcd-component-xxx", - "version": "2.0.0", - "description": "一款基于Vue的xxx组件", - "main": "dist/lcd-component-xxx.common.js", - "browser": "dist/lcd-component-xxx.umd.js", - "scripts": { - "serve": "cross-env VUE_APP_MODE=dev && vue-cli-service serve", - "build": "vue-cli-service build --target lib --name lcd-component-xxx" - }, - "dependencies": { - "ant-design-vue": "^1.7.8", - "axios": "^0.24.0", - "core-js": "^3.31.1", - "file-loader": "^6.2.0", - "moment": "^2.30.1", - "echarts": "^5.4.2", - "postcss-plugin-px2rem": "^0.8.1", - "postcss-px2rem-exclude": "0.0.6", - "qs": "^6.11.2", - "screenfull": "^5.1.0", - "url-loader": "^4.1.1", - "vue": "^2.7.14", - "vue-draggable-resizable": "^2.3.0", - "vue-loading-overlay": "^3.4.3", - "vuex": "^3.4.0" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "babel-eslint": "^10.1.0", - "babel-plugin-import": "^1.13.6", - "browserlist": "^1.0.1", - "cross-env": "^7.0.3", - "less": "^3.0.4", - "less-loader": "^5.0.0", - "vue-template-compiler": "^2.7.14" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} diff --git a/template/component/public/favicon.ico b/template/component/public/favicon.ico deleted file mode 100644 index ea8f82c6d45b773de7cf5cbf6aa74e1fec87a879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmbuBZD>?i8po&Ekd+W(a7D6Pi9w`DKM3tMGk0e0%!EZsS(g1EHcivCtCKi+Gw*Mc z_iC(eH;t~f8f}`Usr7BGEF$6uk+z7q60#!8(u$N_2_hkgmJr4;j%R<*nR~C3G2M2% zH{8t3Ip^Nz$N%|1&p9sFGyD}6y5zs>WS+~l%H?vc=Vr)N%q`>kV(zD2HFcic>Kdc8 zy2>+JwaqgbsqoB3wtC{*{@{*RzUjVKS?->yC@UJPc->uAQR@CbA}uDYYxb_IZ8XMe z>y7!EIzz#rU{Ek97!(W&1_gtve8a6O%D7A2vG8l|iEv4g$ncY{hNyR0eTOl$z116s zLBXJ4P$>*?81BJvFS6AwI;1lw;>W|U7VYQG{$C&(dwqos-M)X+cY4+KcJ5ZMf*}FJ zg_`X~WlgQIzPj4Ttg7<3i0_Jo-I(YO>yyMTZ$6&~V z;e11v_Z53=dz-fq9eUB>GP$@B$~THO!f+v6>ULto@f5GD zZ++LF)3V2Zqh+_xiD$p3q1(H%KI$DK7jY{Wi~K190RM~7N;xYfMNmuTMUSHzDs z_WQ2k%MN_GQr4hDJ`88jVOsZx1|vttsZHsVsXa>jgSsfhlU8jO&Ed=J=t!Wv^I$;1 zpgP_+&&u=Yu!>y7EI+8`U4CUTC>Um7*d*)hYkP|~qpr!jxvt63p2G`+X??QNUQ2&C ziw?;?`Fhc&=#jt}3`!U}KQOn*I&^4D=0f{HJZUrBL5IS|e(wqxhUpJCsEeuk4)1V% zyP-9%Ycw*c&6_EGa*kX$`vE=bt(0DUuxm6h1%uKIhXT(@d~)%{6F-=@TL0)Dq$WyQ zcKO#g?bKeli4O6`9^YB&;xu&;gW>D?c5faUY)I?X-SSQtbZ^0rg-)+7cVFoq3*Li4 z!4Qug4rE3TnJ#ki9SjK=qWEEv@5sfT=AFI-I&75p%EeycgCP#Xp1KyVtFGDj)?&Db z4*GdK`Mc_fCmSzjaK|i$yWQi#I1CDgS$S9INFYb&;y|E5e#_Oq*L1bLXBzSy9VY3M zm*sovg$|b`7c!Qt3*$Vw(0-IL{BW+i+Ot}|Q=4~SkbN`OGeP|Epn^fiM}yqxVe?8S zI>?0%S?F*SKYS&>$;Bjocq%@An8Xj0vWB`a*)NT5j0ZEL9|khIJ`9w|y6B;RZ7n=^1^wEoE)lpY1gZ)J^Kiw=7Ab#ftlx9k_!g$fM{Q)+Xv?|5jm_gF}2 zhEIb|oeBe{%B2)^4vKTJd`r(I7R$W-NX&#U{7;?~|q?$*+u~!^`M!8wTl7l8aOZ**Dk9 zI&}CexvB5u`Y3>|b|f?*5>B@BJXLdPTyUdVyrTblt- z*2=hCZ}K7jnKTOyY{eKBP#~n{H1cgKI z|2>}sHc%J$HN!{25qmwJ+yR4n!eCxNhkSc}sZaVtF*+n*5I@M7);TB1`u@|QVHlKV zI1##NzXKg!M2Be@X1m6M*)mR#Tn$4km4Wla9KIZ*F2eMO&EzA@-tC;b^jYr7c~X1H zjv=1|pBHDt@J|?S^q&mr{neg_VI>SlyFU)@=hnm2MRZYZI_C#70mB*ULialR9r$rY zLyvcgy10oBPG7X=<+K0u;&lV3i=Ehg$Af0?@sRGjGEeO1yFU)-_eMv|3>YRX201@W z;mLRLq@yc3Y=pzvC-4IMrdRKA^1lCep+m6mWN;2I#PQ?^b)kD_>NC_t20bzthDEiA z9}CIFgw>ez@a$z_EL&C02r%xvLiv>J6LywxFKP;s5NvAGgSU`s% zbkM$CD$Wm$5q|^y;RFl|R*y>d>Li2go3eK&dz5vKqAupqVH6#7FZ-bwKV}|=mGtT@ zcya%csW|Gva;4sWMm?qkA1!|ndc@!3hXVum zzx;LV>I3ie)kpc$dmgXex_9~N7vB5%!{*gFMl|2ZfB4I}zdd|*?%Frc9=QI^nqU0u z@S6OB{DOj}{Jm@b{lZ@3LGx~7;P%!0(DdbxmS4X6_n+NWkC&^*p+`D~#FCg2`#*EW B6(9fr diff --git a/template/component/public/index.html b/template/component/public/index.html deleted file mode 100644 index a27dc24..0000000 --- a/template/component/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - -
- - - diff --git a/template/component/publish.sh b/template/component/publish.sh deleted file mode 100644 index fcbe3eb..0000000 --- a/template/component/publish.sh +++ /dev/null @@ -1 +0,0 @@ -npm install --verbose && npm run build && npm publish \ No newline at end of file diff --git a/template/component/src/App.vue b/template/component/src/App.vue deleted file mode 100644 index 516e027..0000000 --- a/template/component/src/App.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - diff --git a/template/component/src/api/component.js b/template/component/src/api/component.js deleted file mode 100644 index 41a2679..0000000 --- a/template/component/src/api/component.js +++ /dev/null @@ -1,8 +0,0 @@ -const { baseUrl } = require('../../base.config'); -import BaseAxios from '@/utils/http'; - -const APIComponent = async params => await BaseAxios.get(`${baseUrl}/component`, params); - -export { - APIComponent -} \ No newline at end of file diff --git a/template/component/src/assets/logo.png b/template/component/src/assets/logo.png deleted file mode 100644 index 172038aab1384ba7bfc24c482f00e2e909aee2d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43261 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 diff --git a/template/component/src/main.js b/template/component/src/main.js deleted file mode 100644 index f780569..0000000 --- a/template/component/src/main.js +++ /dev/null @@ -1,16 +0,0 @@ -import Vue from "vue"; -import App from "./App.vue"; -import Antd from "ant-design-vue"; -import "ant-design-vue/dist/antd.min.css"; -import store from "./store"; -Vue.config.productionTip = false; - -// 环境模式挂载 -Vue.prototype.$mode = process.env.VUE_APP_MODE; - -Vue.use(Antd); - -new Vue({ - store, - render: (h) => h(App), -}).$mount("#app"); diff --git a/template/component/src/store/index.js b/template/component/src/store/index.js deleted file mode 100644 index e2fb137..0000000 --- a/template/component/src/store/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import Vue from "vue"; -import Vuex from "vuex"; -import xxx from "./xxx"; - -export { - xxx -} - -Vue.use(Vuex); - -let modules = { - editor: { - modules: { - xxx - }, - }, -}; -export default new Vuex.Store({ - modules, -}); diff --git a/template/component/src/store/xxx/actions.js b/template/component/src/store/xxx/actions.js deleted file mode 100644 index 8b13789..0000000 --- a/template/component/src/store/xxx/actions.js +++ /dev/null @@ -1 +0,0 @@ - diff --git a/template/component/src/store/xxx/getters.js b/template/component/src/store/xxx/getters.js deleted file mode 100644 index e69de29..0000000 diff --git a/template/component/src/store/xxx/index.js b/template/component/src/store/xxx/index.js deleted file mode 100644 index 6e98f0a..0000000 --- a/template/component/src/store/xxx/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from "./state"; -import * as getters from "./getters"; -import mutations from "./mutations"; -import actions from "./actions"; - -export default { - namespaced: true, - state, - getters, - mutations, - actions, -}; diff --git a/template/component/src/store/xxx/mutations.js b/template/component/src/store/xxx/mutations.js deleted file mode 100644 index e7a3f72..0000000 --- a/template/component/src/store/xxx/mutations.js +++ /dev/null @@ -1,4 +0,0 @@ -const mutations = { - -}; -export default mutations; diff --git a/template/component/src/store/xxx/state.js b/template/component/src/store/xxx/state.js deleted file mode 100644 index 618e2d7..0000000 --- a/template/component/src/store/xxx/state.js +++ /dev/null @@ -1,4 +0,0 @@ -const state = { - -}; -export default state; diff --git a/template/component/src/utils/http.js b/template/component/src/utils/http.js deleted file mode 100644 index 0c24052..0000000 --- a/template/component/src/utils/http.js +++ /dev/null @@ -1,33 +0,0 @@ -import axios from 'axios'; - -const BaseAxios = axios.create({ - timeout: 60000 -}); - -// 请求拦截 -BaseAxios.interceptors.request.use(async config => { - if (sessionStorage.getItem('token')) { - config.headers.Token = sessionStorage.getItem('token'); - config.headers.Authorization = `Bearer ${sessionStorage.getItem('token')}`; - } - return config; -}, err => { - return Promise.reject(err); -}); - -// 响应拦截 -BaseAxios.interceptors.response.use( res => { - if(res.data.success || - res.data.FLAG === "SUCCESS" || - res.data.retCode === "200" || - res.status === 200){ - return res.data - } else { - message.error(res.data.msg || res.data.MESSAGE || res.data.message || "Error"); - return Promise.reject(res.data) - } -}, err => { - return Promise.reject(err) -}); - -export default BaseAxios; \ No newline at end of file diff --git a/template/component/vue.config.js b/template/component/vue.config.js deleted file mode 100644 index 254a8ff..0000000 --- a/template/component/vue.config.js +++ /dev/null @@ -1,68 +0,0 @@ -const { baseUrl } = require("./base.config.js"); - -module.exports = { - parallel: false, - lintOnSave: false, - productionSourceMap: false, - chainWebpack: (wpConfig) => { - // 测试环境对组件进行测试 - if (process.env.VUE_APP_MODE == "dev") { - wpConfig.plugin("html").tap((args) => { - args[0].title = "lcd-component-xxx"; - return args; - }); - } - }, - configureWebpack: (wpConfig) => { - // 删除vue-cli已有的images配置 - wpConfig.module.rules.splice(2, 1); - // 区分src下使用url-loader和file-loader - wpConfig.module.rules.push( - // src的图片全部转化为base64 - { - test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, - include: path.resolve(__dirname, "src"), - use: [ - { - loader: "url-loader", - options: { - esModule: false - } - } - ], - }, - // 非src下全部使用图片地址 - { - test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, - exclude: path.resolve(__dirname, "src"), - use: [ - { - loader: "file-loader", - options: { - name: "img/[name].[hash:8].[ext]", - }, - }, - ], - } - ); - }, - css: { - loaderOptions: { - // 向 CSS 相关的 loader 传递选项 - less: {}, - }, - }, - devServer: { - port: 8888, - // 反向代理配置 - proxy: { - ["^/" + baseUrl]: { - // 后台接口域名 联调更改此处IP即可 - target: "http://localhost:4000", - pathRewrite: { - ["^/" + baseUrl]: "", - }, - } - }, - }, -}; diff --git a/template/project/.gitignore b/template/project/.gitignore deleted file mode 100644 index 7c1cba4..0000000 --- a/template/project/.gitignore +++ /dev/null @@ -1,69 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release -demo/bundle -docs/docus -dist/ - -# Dependency directories -node_modules/ -jspm_packages/ -.npmrc - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm -.npmrc - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# lock -package-lock.json -yarn.lock -pnpm-lock.yaml - diff --git a/template/project/README.md b/template/project/README.md deleted file mode 100644 index 3d8904d..0000000 --- a/template/project/README.md +++ /dev/null @@ -1,49 +0,0 @@ -

logo

- -# vue-lcd-engine - -> 一款基于vue-lcd-engine实现的低代码编辑器 - -## 功能 - -|功能|模块|名称|备注| -|:-:|:-:|:-:|:-:| -|上一步|tooler|Undo|[√]| -|上一步(快捷键)|share|Ctrl + Z|[√]| -|下一步|tooler|Redo|[√]| -|下一步(快捷键)|share|Ctrl + Alt + Z|[√]| -|保存|tooler|Save|[√]| -|预览|tooler|Preview|[√]| -|放大|renderer|ZoomIn|[√]| -|缩小|renderer|ZoomOut|[√]| -|标尺|renderer|Ruler|[√]| -|参考线|renderer|ComponentBox|[√]| -|拖拽|share|Drag|[√]| -|大小|share|Resize|[√]| - -## 目录 - -``` -├─README.md -├─packages // 组件放置目录 -| ├─lcd-component-xx // 组件需以lcd-component进行开头 -├─src // 编辑器所在主目录 -| ├─setter // 设置器模块 -| ├─lcd-setter-xx // 组件需以lcd-setter进行开头 -| ├─sider // 侧边器模块 -| ├─lcd-setter-xx // 组件需以lcd-sider进行开头 -├─build // 打包文件夹 -``` - -## 依赖 - -|依赖|依赖包|备注| -|:-:|:-:|:-:| -|vue|[vue 2.x](https://www.npmjs.com/package/vue)|基于vue2的运行时进行构建| -|ant-design-vue|[ant-design-vue 1.x](https://www.npmjs.com/package/ant-design-vue)|基于ant-design-vue的组件库进行构建,主题色修改等请参考ant-desgin-vue的官方文档| -|vue-lcd-engine|[vue-lcd-engine 2.x](https://www.npmjs.com/package/vue-lcd-engine)|基于vue-lcd-engine进行低代码应用构建| - -## 参考 - -- [Vue 2.x官方文档](https://v2.cn.vuejs.org/) -- [Ant-Design-Vue 1.x官方文档](https://1x.antdv.com/docs/vue/introduce-cn/) \ No newline at end of file diff --git a/template/project/babel.config.js b/template/project/babel.config.js deleted file mode 100644 index bf18b72..0000000 --- a/template/project/babel.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - presets: ["@vue/babel-preset-app"], - plugins: [ - [ - "import", - { libraryName: "ant-design-vue", libraryDirectory: "es", style: true }, - ] - ] - }; \ No newline at end of file diff --git a/template/project/base.config.js b/template/project/base.config.js deleted file mode 100644 index ef685c5..0000000 --- a/template/project/base.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - // 云平台所需转发代理 - tgName: "tgcos", - // 数据代理前缀配置 - baseName: "api_target", - // 项目名称 最多不超过12个汉字 - title: "vue-lcd-engine", -}; diff --git a/template/project/build/chainWebpack.js b/template/project/build/chainWebpack.js deleted file mode 100644 index 5a506ea..0000000 --- a/template/project/build/chainWebpack.js +++ /dev/null @@ -1,55 +0,0 @@ -// cdn资源 -const cdn = { - js: [], -}; - -const chainWebpack = (config) => { - config.mode = process.env.VUE_APP_MODE; - // html-webpack-plugin插件 - config.plugin("html").tap((args) => { - // 页面标题部分 - args[0].title = require("../base.config.js")["title"]; - (process.env.VUE_APP_MODE === "production") && - (args[0].cdn = cdn); - return args; - }); - config.plugins.delete("prefetch"); - // splitChunks优化 - config.optimization.splitChunks({ - chunks: "async", - minSize: 30000, - maxSize: 1024 * 1024, // 单位是字节 - minChunks: 1, - maxAsyncRequests: 6, - maxInitialRequests: 4, - automaticNameDelimiter: "~", - cacheGroups: { - moment: { - name: "moment", - priority: 20, - test: /[\\/]node_modules[\\/]_?moment(.*)/, - chunks: "all", - reuseExistingChunk: true, - // enforce: true - }, - "ant-design-vue": { - name: "ant-design-vue", - priority: 20, - test: /[\\/]node_modules[\\/]_?ant-design-vue(.*)/, - chunks: "all", - reuseExistingChunk: true, - // enforce: true - }, - axios: { - name: "axios", - priority: 20, - test: /[\\/]node_modules[\\/]_?axios(.*)/, - chunks: "all", - reuseExistingChunk: true, - // enforce: true - }, - }, - }); -}; - -module.exports = chainWebpack; \ No newline at end of file diff --git a/template/project/build/configureWebpack.js b/template/project/build/configureWebpack.js deleted file mode 100644 index ad71f67..0000000 --- a/template/project/build/configureWebpack.js +++ /dev/null @@ -1,5 +0,0 @@ -const configureWebpack = require(`./${ - process.env.VUE_APP_MODE || "dev" -}/configureWebpack.js`); - -module.exports = configureWebpack; diff --git a/template/project/build/dev/config.json b/template/project/build/dev/config.json deleted file mode 100644 index 4d0f29e..0000000 --- a/template/project/build/dev/config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "env": "dev", - "proxyUrl": "http://localhost:4000" -} \ No newline at end of file diff --git a/template/project/build/dev/configureWebpack.js b/template/project/build/dev/configureWebpack.js deleted file mode 100644 index 31dcb23..0000000 --- a/template/project/build/dev/configureWebpack.js +++ /dev/null @@ -1,17 +0,0 @@ -const SpeedMeasurePlugin = require("speed-measure-webpack-plugin"); -const path = require('path'); - -const configureWebpack = (config) => { - config.externals = {}; - - // 配置别名 - Object.assign(config.resolve.alias, { - '$root': path.resolve(__dirname, '../../'), - }); - - config.plugins.push( - new SpeedMeasurePlugin(), - ); -}; - -module.exports = configureWebpack; diff --git a/template/project/build/devServer.js b/template/project/build/devServer.js deleted file mode 100644 index 0ca103b..0000000 --- a/template/project/build/devServer.js +++ /dev/null @@ -1,24 +0,0 @@ -const { baseName } = require("../base.config.js"); - -console.log("VUE_APP_MODE", process.env.VUE_APP_MODE); - -const config = require(`./${process.env.VUE_APP_MODE || "dev"}/config.json`) - -console.log("devServer config", config); - -const devServer = { - host: "0.0.0.0", - hot: true, - port: 8085, - proxy: { - ["^/" + baseName]: { - // 后台接口域名 联调更改此处IP即可 - target: config.proxyUrl, - pathRewrite: { - ["^/" + baseName]: "", - }, - } - }, -}; - -module.exports = devServer; diff --git a/template/project/build/index.js b/template/project/build/index.js deleted file mode 100644 index baa96b2..0000000 --- a/template/project/build/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const devServer = require("./devServer"); -const configureWebpack = require("./configureWebpack"); -const chainWebpack = require("./chainWebpack"); -const postCSSPlugin = require('./postCSSPlugin'); - -module.exports = { - devServer, - configureWebpack, - chainWebpack, - postCSSPlugin -}; \ No newline at end of file diff --git a/template/project/build/postCSSPlugin.js b/template/project/build/postCSSPlugin.js deleted file mode 100644 index eaebb25..0000000 --- a/template/project/build/postCSSPlugin.js +++ /dev/null @@ -1,142 +0,0 @@ -const postcss = require("postcss"); -const css = require("css"); -const extend = require("extend"); - -const pxRegExp = /\b(\d+(\.\d+)?)px\b/; - -class Pcx2rem { - constructor(config) { - this.config = {}; - this.config = extend( - this.config, - { - baseDpr: 1, // 设备像素比 - remUnit: 10, // 自定义rem单位 - remPrecision: 6, // 精度 - forcePxComment: "px", // 只换算px - keepComment: "no", // 是否保留单位 - ignoreEntry: null, // 忽略规则实例载体 - }, - config - ); - } - generateRem(cssText) { - const self = this; - const config = self.config; - const astObj = css.parse(cssText); - // prettier-ignore - function processRules(rules) {//NOSONAR - for (let i = 0; i < rules.length; i++) { - let rule = rules[i]; - if (rule.type === "media") { - processRules(rule.rules); - continue; - } else if (rule.type === "keyframes") { - processRules(rule.keyframes); - continue; - } else if (rule.type !== "rule" && rule.type !== "keyframe") { - continue; - } - - // 处理 px 到 rem 的转化 - let declarations = rule.declarations; - for (let j = 0; j < declarations.length; j++) { - let declaration = declarations[j]; - // 转化px - if ( - declaration.type === "declaration" && - pxRegExp.test(declaration.value) - ) { - let nextDeclaration = declarations[j + 1]; - if (nextDeclaration && nextDeclaration.type === "comment") { - if (nextDeclaration.comment.trim() === config.forcePxComment) { - // 不转化`0px` - if (declaration.value === "0px") { - declaration.value = "0"; - declarations.splice(j + 1, 1); - continue; - } - declaration.value = self._getCalcValue( - "rem", - declaration.value - ); - declarations.splice(j + 1, 1); - } else if ( - nextDeclaration.comment.trim() === config.keepComment - ) { - declarations.splice(j + 1, 1); - } else { - declaration.value = self._getCalcValue( - "rem", - declaration.value - ); - } - } else { - declaration.value = self._getCalcValue("rem", declaration.value); - } - } - } - - if (!rules[i].declarations.length) { - rules.splice(i, 1); - i--; //NOSONAR - } - } - } - - processRules(astObj.stylesheet.rules); - - return css.stringify(astObj); - } - _getCalcValue(type, value, dpr) { - const config = this.config; - - // 验证是否符合 忽略规则 - if (config.ignoreEntry && config.ignoreEntry.test(value)) { - return config.ignoreEntry.getRealPx(value); - } - - const pxGlobalRegExp = new RegExp(pxRegExp.source, "g"); - - function getValue(val) { - val = parseFloat(val.toFixed(config.remPrecision)); // 精度控制 - return val === 0 ? val : val + type; - } - - return value.replace(pxGlobalRegExp, function ($0, $1) { - return type === "px" - ? getValue(($1 * dpr) / config.baseDpr) - : getValue($1 / config.remUnit); - }); - } -} - -class PxIgnore { - constructor() { - this.RegExp = /^excl\(([\s\S]+)\)$/; - } - // 匹配 是否符合 忽略转义的规则 - test(pxData) { - return this.RegExp.test(pxData); - } - // 获取真实像素值 - getRealPx(pxData) { - return pxData.match(this.RegExp)[1]; - } -} - -const postcss_pcx2rem = postcss.plugin("postcss-pcx2rem", function (options) { - return function (CSS, result) { - // 配置参数 合入 忽略策略方法 - options.ignoreEntry = new PxIgnore(); - // new 一个Pcx2rem的实例 - const pcx2rem = new Pcx2rem(options); - const oldCssText = CSS.toString(); - const newCssText = pcx2rem.generateRem(oldCssText); - result.root = postcss.parse(newCssText); - }; -}); - -module.exports = { - "postcss-pcx2rem": postcss_pcx2rem, -}; diff --git a/template/project/build/production/config.json b/template/project/build/production/config.json deleted file mode 100644 index 8e35475..0000000 --- a/template/project/build/production/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "env": "production", - "proxyUrl": "http://172.24.123.86:11000", - "cosUrl": "http://172.24.123.4:8148", - "tmpUrl": "http://172.24.127.247:80" -} \ No newline at end of file diff --git a/template/project/build/production/configureWebpack.js b/template/project/build/production/configureWebpack.js deleted file mode 100644 index 610062b..0000000 --- a/template/project/build/production/configureWebpack.js +++ /dev/null @@ -1,43 +0,0 @@ -const CompressionPlugin = require("compression-webpack-plugin"); -const path = require('path'); - -const configureWebpack = (config) => { - config.externals = { - // vue: "Vue", - // vuex: "Vuex", - // axios: "axios", - // "vue-router": "VueRouter", - // moment: "moment", - }; - - // 配置别名 - Object.assign(config.resolve.alias, { - '$root': path.resolve(__dirname, '../../'), - }); - - // 需要对打包进行分析的配置 - if (process.env.VUE_APP_ANALYZE == "true") { - const BundleAnalyzerPlugin = - require("webpack-bundle-analyzer").BundleAnalyzerPlugin; - config.plugins.push(new BundleAnalyzerPlugin()); - } - - // 开启gzip压缩 - config.plugins.push( - new CompressionPlugin({ - test: /\.js$|\.html$|.\css/, // 匹配文件名 - threshold: 10240, // 超过10k就压缩 - deleteOriginalAssets: false, - }) - ); - - // 对console.log等日志文件进行清除 - config.optimization.minimizer[0].options.terserOptions.compress.warnings = false; - config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true; - config.optimization.minimizer[0].options.terserOptions.compress.drop_debugger = true; - config.optimization.minimizer[0].options.terserOptions.compress.pure_funcs = [ - "console.log", - ]; -}; - -module.exports = configureWebpack; \ No newline at end of file diff --git a/template/project/package.json b/template/project/package.json deleted file mode 100644 index 243b994..0000000 --- a/template/project/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "vue-lcd-engine", - "version": "2.0.0", - "description": "一款基于vue-lcd-engine实现的低代码编辑器", - "main": "index.js", - "scripts": { - "serve": "cross-env VUE_APP_MODE=dev vue-cli-service serve", - "build": "cross-env VUE_APP_MODE=production vue-cli-service build" - }, - "keywords": [ - "low code", - "editor" - ], - "author": "we452366", - "license": "MIT", - "dependencies": { - "ant-design-vue": "^1.7.7", - "axios": "^0.21.4", - "core-js": "^3.6.5", - "echarts": "^5.4.2", - "html2canvas": "^1.4.1", - "keymaster": "^1.6.2", - "lodash": "^4.17.21", - "moment": "^2.29.3", - "vue": "^2.6.11", - "vue-lcd-engine": "^2.0.0", - "vue-router": "^3.6.5", - "vuex": "^3.4.0", - "vuex-persistedstate": "^4.1.0" - }, - "devDependencies": { - "@ant-design/colors": "^3.2.2", - "@babel/preset-env": "^7.23.8", - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-router": "~4.5.0", - "@vue/cli-plugin-vuex": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "babel-plugin-import": "^1.13.3", - "compression-webpack-plugin": "^5.0.2", - "cross-env": "^7.0.3", - "css": "^3.0.0", - "hard-source-webpack-plugin": "^0.13.1", - "less": "^3.0.4", - "less-loader": "^5.0.0", - "postcss": "^7.0.39", - "speed-measure-webpack-plugin": "^1.5.0", - "vue-template-compiler": "^2.6.11", - "webpack-bundle-analyzer": "^4.5.0" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} diff --git a/template/project/public/favicon.ico b/template/project/public/favicon.ico deleted file mode 100644 index ea8f82c6d45b773de7cf5cbf6aa74e1fec87a879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmbuBZD>?i8po&Ekd+W(a7D6Pi9w`DKM3tMGk0e0%!EZsS(g1EHcivCtCKi+Gw*Mc z_iC(eH;t~f8f}`Usr7BGEF$6uk+z7q60#!8(u$N_2_hkgmJr4;j%R<*nR~C3G2M2% zH{8t3Ip^Nz$N%|1&p9sFGyD}6y5zs>WS+~l%H?vc=Vr)N%q`>kV(zD2HFcic>Kdc8 zy2>+JwaqgbsqoB3wtC{*{@{*RzUjVKS?->yC@UJPc->uAQR@CbA}uDYYxb_IZ8XMe z>y7!EIzz#rU{Ek97!(W&1_gtve8a6O%D7A2vG8l|iEv4g$ncY{hNyR0eTOl$z116s zLBXJ4P$>*?81BJvFS6AwI;1lw;>W|U7VYQG{$C&(dwqos-M)X+cY4+KcJ5ZMf*}FJ zg_`X~WlgQIzPj4Ttg7<3i0_Jo-I(YO>yyMTZ$6&~V z;e11v_Z53=dz-fq9eUB>GP$@B$~THO!f+v6>ULto@f5GD zZ++LF)3V2Zqh+_xiD$p3q1(H%KI$DK7jY{Wi~K190RM~7N;xYfMNmuTMUSHzDs z_WQ2k%MN_GQr4hDJ`88jVOsZx1|vttsZHsVsXa>jgSsfhlU8jO&Ed=J=t!Wv^I$;1 zpgP_+&&u=Yu!>y7EI+8`U4CUTC>Um7*d*)hYkP|~qpr!jxvt63p2G`+X??QNUQ2&C ziw?;?`Fhc&=#jt}3`!U}KQOn*I&^4D=0f{HJZUrBL5IS|e(wqxhUpJCsEeuk4)1V% zyP-9%Ycw*c&6_EGa*kX$`vE=bt(0DUuxm6h1%uKIhXT(@d~)%{6F-=@TL0)Dq$WyQ zcKO#g?bKeli4O6`9^YB&;xu&;gW>D?c5faUY)I?X-SSQtbZ^0rg-)+7cVFoq3*Li4 z!4Qug4rE3TnJ#ki9SjK=qWEEv@5sfT=AFI-I&75p%EeycgCP#Xp1KyVtFGDj)?&Db z4*GdK`Mc_fCmSzjaK|i$yWQi#I1CDgS$S9INFYb&;y|E5e#_Oq*L1bLXBzSy9VY3M zm*sovg$|b`7c!Qt3*$Vw(0-IL{BW+i+Ot}|Q=4~SkbN`OGeP|Epn^fiM}yqxVe?8S zI>?0%S?F*SKYS&>$;Bjocq%@An8Xj0vWB`a*)NT5j0ZEL9|khIJ`9w|y6B;RZ7n=^1^wEoE)lpY1gZ)J^Kiw=7Ab#ftlx9k_!g$fM{Q)+Xv?|5jm_gF}2 zhEIb|oeBe{%B2)^4vKTJd`r(I7R$W-NX&#U{7;?~|q?$*+u~!^`M!8wTl7l8aOZ**Dk9 zI&}CexvB5u`Y3>|b|f?*5>B@BJXLdPTyUdVyrTblt- z*2=hCZ}K7jnKTOyY{eKBP#~n{H1cgKI z|2>}sHc%J$HN!{25qmwJ+yR4n!eCxNhkSc}sZaVtF*+n*5I@M7);TB1`u@|QVHlKV zI1##NzXKg!M2Be@X1m6M*)mR#Tn$4km4Wla9KIZ*F2eMO&EzA@-tC;b^jYr7c~X1H zjv=1|pBHDt@J|?S^q&mr{neg_VI>SlyFU)@=hnm2MRZYZI_C#70mB*ULialR9r$rY zLyvcgy10oBPG7X=<+K0u;&lV3i=Ehg$Af0?@sRGjGEeO1yFU)-_eMv|3>YRX201@W z;mLRLq@yc3Y=pzvC-4IMrdRKA^1lCep+m6mWN;2I#PQ?^b)kD_>NC_t20bzthDEiA z9}CIFgw>ez@a$z_EL&C02r%xvLiv>J6LywxFKP;s5NvAGgSU`s% zbkM$CD$Wm$5q|^y;RFl|R*y>d>Li2go3eK&dz5vKqAupqVH6#7FZ-bwKV}|=mGtT@ zcya%csW|Gva;4sWMm?qkA1!|ndc@!3hXVum zzx;LV>I3ie)kpc$dmgXex_9~N7vB5%!{*gFMl|2ZfB4I}zdd|*?%Frc9=QI^nqU0u z@S6OB{DOj}{Jm@b{lZ@3LGx~7;P%!0(DdbxmS4X6_n+NWkC&^*p+`D~#FCg2`#*EW B6(9fr diff --git a/template/project/public/index.html b/template/project/public/index.html deleted file mode 100644 index 128443b..0000000 --- a/template/project/public/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - -
- - <% for (let i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> - - <% } %> - - - diff --git a/template/project/src/App.vue b/template/project/src/App.vue deleted file mode 100644 index 8bb2ad3..0000000 --- a/template/project/src/App.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - \ No newline at end of file diff --git a/template/project/src/api/auth.js b/template/project/src/api/auth.js deleted file mode 100644 index 63bd8ed..0000000 --- a/template/project/src/api/auth.js +++ /dev/null @@ -1,11 +0,0 @@ -const { baseName } = require('../../base.config') -import { BaseAxios } from '@/utils' - -const APILogin = async params => BaseAxios.post(`${baseName}/auth/login`, params) - -const APIRegister = async params => BaseAxios.post(`${baseName}/auth/register`, params) - -export { - APILogin, - APIRegister -} \ No newline at end of file diff --git a/template/project/src/api/editor.js b/template/project/src/api/editor.js deleted file mode 100644 index af6963c..0000000 --- a/template/project/src/api/editor.js +++ /dev/null @@ -1,17 +0,0 @@ -const { baseName } = require('../../base.config') -import { BaseAxios } from '@/utils' - -const APIGetEditorComponent = async params => BaseAxios.post(`${baseName}/editor/getEditorComponent`, params) - -const APIUploadViewCover = async params => BaseAxios.post(`${baseName}/editor/uploadViewCover`, params) - -const APIDeleteViewCover = async params => BaseAxios.post(`${baseName}/editor/deleteViewCover`, params) - -const APIEditConfigureViews = async params => BaseAxios.post(`${baseName}/editor/editConfiguredViews`, params) - -export { - APIGetEditorComponent, - APIUploadViewCover, - APIDeleteViewCover, - APIEditConfigureViews -} \ No newline at end of file diff --git a/template/project/src/api/home.js b/template/project/src/api/home.js deleted file mode 100644 index 1b7adba..0000000 --- a/template/project/src/api/home.js +++ /dev/null @@ -1,12 +0,0 @@ -const { baseName } = require('../../base.config') -import { BaseAxios } from '@/utils' - -/* 用户查询所有已配置的视图 */ -export const getConfiguredViews = async params => BaseAxios.post(`${baseName}/home/getConfiguredViews`, params) - -/* 用户删除已配置的视图 */ -export const deleteConfiguredViews = async params => BaseAxios.post(`${baseName}/home/deleteConfiguredViews?viewId=${params}`) -/* 用户新建视图 */ -export const createViews = async params => BaseAxios.post(`${baseName}/home/createViews`, params) -/* 用户查询账户下所关联的视图中的详细信息 */ -export const getConfiguredViewsDetailInfo = async params => BaseAxios.post(`${baseName}/home/getConfiguredViewsDetailInfo`, params) \ No newline at end of file diff --git a/template/project/src/api/monitor.js b/template/project/src/api/monitor.js deleted file mode 100644 index fd4ebf3..0000000 --- a/template/project/src/api/monitor.js +++ /dev/null @@ -1,11 +0,0 @@ -const { baseName } = require('../../base.config') -import { BaseAxios } from '@/utils' - -const APIGetMonitoringSolutionsForMaster = async params => BaseAxios.get(`${baseName}/monitor/getMonitoringSolutionsForMaster`, params) - -const APIGetConfiguredViewsForMaster = async params => BaseAxios.post(`${baseName}/monitor/getConfiguredViewsForMaster`, params) - -export { - APIGetMonitoringSolutionsForMaster, - APIGetConfiguredViewsForMaster -} \ No newline at end of file diff --git a/template/project/src/assets/logo.png b/template/project/src/assets/logo.png deleted file mode 100644 index 172038aab1384ba7bfc24c482f00e2e909aee2d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43261 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 diff --git a/template/project/src/directives/button.js b/template/project/src/directives/button.js deleted file mode 100644 index 3d8bd78..0000000 --- a/template/project/src/directives/button.js +++ /dev/null @@ -1,33 +0,0 @@ -import { isArray } from '@/utils'; - -import Vue from 'vue'; - -import tool from '@/mixins/tooler'; - -import lcd_engine from '@/lcd.engine'; - -const { tooler } = lcd_engine; - -import store from '@/store'; - -export default { - inserted(el, binding, vnode) { - const value = binding.value; - if(isArray(value)) { - const [name, type, params] = value; - if(tooler[name]) { - const { icon, label, trigger } = tooler[name]; - new Vue({//NOSONAR - el, - template: `${label}`, - mixins: [tool], - store - }); - } else { - console.warn('未发现已注册的功能,请确认功能是否已经注册成功') - } - } else { - console.error('绑定指令值不正确,需要为字符串') - } - }, -} \ No newline at end of file diff --git a/template/project/src/directives/loading.js b/template/project/src/directives/loading.js deleted file mode 100644 index 50cd094..0000000 --- a/template/project/src/directives/loading.js +++ /dev/null @@ -1,53 +0,0 @@ -import Vue from "vue"; -import { Loading } from "vue-lcd-engine"; - -/** - * Vue.extend 接受参数并返回一个构造器,new 该构造器可以返回一个组件实例 - * 当我们 new Mask() 的时候,把该组件实例挂载到一个 div 上 - **/ -const Mask = Vue.extend(Loading); - -// 更新是否显示 -const toggleLoading = (el, binding) => { - if (binding.value) { - Vue.nextTick(() => { - // 控制loading组件显示 - el.instance.visible = true; - // 插入到目标元素 - insertDom(el, el); - }); - } else { - el.instance.visible = false; - } -}; - -// 插入到目标元素 -const insertDom = (parent, el) => { - parent.appendChild(el.mask); -}; - -export default { - //第一次绑定到元素时调用 - bind: function (el, binding) { - el.style.position = "relative"; - const mask = new Mask({ - el: document.createElement("div"), - }); - //用一个变量接住mask实例 - el.instance = mask; - el.mask = mask.$el; - el.maskStyle = {}; - binding.value && toggleLoading(el, binding); - }, - //所在组件的 VNode 更新时调用--比较更新前后的值 - update: function (el, binding) { - if (binding.oldValue !== binding.value) { - toggleLoading(el, binding); - } - }, - //指令与元素解绑时调用 - unbind: function (el) { - el.style.position = ""; - el.instance && el.instance.$destroy(); - }, -}; diff --git a/template/project/src/lcd.engine.js b/template/project/src/lcd.engine.js deleted file mode 100644 index cc4f46b..0000000 --- a/template/project/src/lcd.engine.js +++ /dev/null @@ -1,248 +0,0 @@ -// layout布局算法 -export const useLayout = (layout, refs) => { - const [l, r] = layout, - [side, render, set, float] = refs; - const sider = document.getElementById(side), - renderer = document.getElementById(render), - setter = document.getElementById(set), - floater = document.getElementById(float); - if (l == 0 && r == 0) { - sider.style.flex = "220"; - renderer.style.flex = "1700"; - setter.style.display = "none"; - floater.style.display = "block"; - } else if (l == 0 && r == 1) { - sider.style.flex = "220"; - renderer.style.flex = "1340"; - setter.style.display = "flex"; - setter.style.flex = "360"; - floater.style.display = "none"; - } else if (l == 1 && r == 1) { - sider.style.flex = "560"; - renderer.style.flex = "1000"; - setter.style.display = "flex"; - setter.style.flex = "360"; - floater.style.display = "none"; - } else if (l == 1 && r == 0) { - sider.style.flex = "560"; - renderer.style.flex = "1360"; - setter.style.display = "none"; - floater.style.display = "block"; - } -}; - -// lcd_engine_env环境变量判断 env | prod -export const lcd_engine_env = "dev"; - -export const lcd_engine_meta = { - bg1: { - attr: { - w: 1920, - h: 1080, - }, - prop: { - title: "", - }, - global: [], - }, - map1: { - attr: { - w: 1920, - h: 1000, - }, - prop: { - relations: [ - "alarm_statistics1", - "circuit_overview1", - "performance_monitor1", - "reinsurance_statistics1", - ], - }, - global: [], - }, - performance_monitor1: { - attr: { - w: 400, - h: 300, - }, - prop: { - title: "", - times: [], - circuits: [], - displays: {}, - }, - global: [ - { - key: "mapLevel", - value: 2, - isWork: true, - }, - { - key: "mapCode", - value: 100000, - isWork: true, - }, - ], - }, - alarm_statistics1: { - attr: { - w: 400, - h: 200, - }, - prop: { - title: "", - alarmPropsList: [], - }, - global: [ - { - key: "mapLevel", - value: 2, - isWork: true, - }, - { - key: "mapCode", - value: 100000, - isWork: true, - }, - ], - }, - reinsurance_statistics1: { - attr: { - w: 400, - h: 200, - }, - prop: { - title: "", - reinsuranceData: [], - }, - global: [ - { - key: "mapLevel", - value: 2, - isWork: true, - }, - { - key: "mapCode", - value: 100000, - isWork: true, - }, - ], - }, - circuit_overview1: { - attr: { - w: 400, - h: 900, - }, - prop: { - title: "", - projectStatusList: [], - }, - global: [ - { - key: "mapLevel", - value: 2, - isWork: true, - }, - { - key: "mapCode", - value: 100000, - isWork: true, - }, - ], - }, -}; - -// 后续可对setter name进行key与name的映射 目前key和name一致 -const getSetterName = (key) => `lcd-setter-${key}`; -const getSetterKey = (key) => `lcd-setter-${key}`; -const getSetterComponents = (meta) => { - const components = []; - Object.keys(meta).forEach((key) => { - components.push({ - name: getSetterName(key), - key: getSetterKey(key), - }); - }); - return components; -}; - -// 后续可对sider name进行key与name的映射 目前key和name一致 -const getSiderName = (key) => `lcd-sider-${key}`; -const getSiderKey = (key) => `lcd-sider-${key}`; -const getSiderComponents = (meta) => { - const components = []; - Object.keys(meta).forEach((key) => { - components.push({ - name: getSiderName(key), - key: getSiderKey(key), - }); - }); - return components; -}; - -// new LCDEngine -const lcd_engine = { - tooler: { - save: { - key: Symbol("save"), - icon: "editor-save", - label: "保存", - trigger: { - method: "click", - name: "handleSave", - }, - }, - preview: { - key: Symbol("preview"), - icon: "editor-preview", - label: "预览", - trigger: { - method: "click", - name: "handlePreview", - }, - }, - undo: { - key: Symbol("undo"), - icon: "editor-undo", - label: "上一步", - trigger: { - method: "click", - name: "handleUndo", - }, - }, - redo: { - key: Symbol("redo"), - icon: "editor-redo", - label: "下一步", - trigger: { - method: "click", - name: "handleRedo", - }, - }, - exit: { - key: Symbol("exit"), - icon: "editor-exit", - label: "退出", - trigger: { - method: "click", - name: "handleExit", - }, - }, - }, - renderer: { - width: 1920, - height: 1080, - }, - share: { - // 延迟时间 - delay: 500, - }, - setter: { - components: getSetterComponents(lcd_engine_meta), - }, - sider: { - components: getSiderComponents(lcd_engine_meta), - }, -}; - -export default lcd_engine; diff --git a/template/project/src/main.js b/template/project/src/main.js deleted file mode 100644 index dbd716b..0000000 --- a/template/project/src/main.js +++ /dev/null @@ -1,206 +0,0 @@ -import Vue from "vue"; -import App from "./App.vue"; -import router from "./router"; -import store from "./store"; - -// 挂载图片资源 路径前缀 -import { tgName, tmpName, bucketName } from "../base.config"; - -// 全局注册本地通用组件 -import { SvgIcon, ConfigItem, Size, Thumbnail } from "vue-lcd-engine"; - -[SvgIcon, ConfigItem, Size, Thumbnail].forEach((component) => { - console.log('component', component); - Vue.component(component.name, component); -}); - -//引入全局公用样式 -import "./styles/index.less"; - -import { - Base, - message, - notification, - Affix, - Anchor, - AutoComplete, - Alert, - Avatar, - BackTop, - Badge, - Breadcrumb, - Button, - Calendar, - Card, - Collapse, - Carousel, - Cascader, - Checkbox, - Col, - DatePicker, - Divider, - Dropdown, - Form, - FormModel, - Icon, - Input, - InputNumber, - Layout, - List, - LocaleProvider, - Menu, - Mentions, - Modal, - Pagination, - Popconfirm, - Popover, - Progress, - Radio, - Rate, - Row, - Select, - Slider, - Spin, - Statistic, - Steps, - Switch, - Table, - Transfer, - Tree, - TreeSelect, - Tabs, - Tag, - TimePicker, - Timeline, - Tooltip, - Upload, - Drawer, - Skeleton, - Comment, - // ColorPicker, - ConfigProvider, - Empty, - Result, - Descriptions, - PageHeader, - Space, -} from "ant-design-vue"; - -[ - Base, - Affix, - Anchor, - AutoComplete, - Alert, - Avatar, - BackTop, - Badge, - Breadcrumb, - Button, - Calendar, - Card, - Collapse, - Carousel, - Cascader, - Checkbox, - Col, - DatePicker, - Divider, - Dropdown, - Form, - FormModel, - Icon, - Input, - InputNumber, - Layout, - List, - LocaleProvider, - Menu, - Mentions, - Modal, - Pagination, - Popconfirm, - Popover, - Progress, - Radio, - Rate, - Row, - Select, - Slider, - Spin, - Statistic, - Steps, - Switch, - Table, - Transfer, - Tree, - TreeSelect, - Tabs, - Tag, - TimePicker, - Timeline, - Tooltip, - Upload, - Drawer, - Skeleton, - Comment, - ConfigProvider, - Empty, - Result, - Descriptions, - PageHeader, - Space, -].forEach((component) => { - Vue.use(component); -}); - -Vue.prototype.$message = message; -Vue.prototype.$notify = notification; -Vue.prototype.$info = Modal.info; -Vue.prototype.$success = Modal.success; -Vue.prototype.$error = Modal.error; -Vue.prototype.$warning = Modal.warning; -Vue.prototype.$confirm = Modal.confirm; -Vue.prototype.$destroyAll = Modal.destroyAll; - -// 环境模式挂载 -Vue.prototype.$mode = process.env.VUE_APP_MODE; - -// 天宫云 图床代理 + 运营端重构 专属存储桶名称 -Vue.prototype.$imgUrl = tgName + "/" + bucketName; -// 临时文件地址代理 -Vue.prototype.$tmpUrl = tmpName; - -Vue.config.productionTip = false; - -// 全局指令 - -// 功能区快捷指令 -import button from "@/directives/button"; -import loading from "@/directives/loading"; - -const directives = [ - { - alias: "btn", - directive: button, - }, - { - alias: "loading", - directive: loading, - }, -]; - -directives.forEach((item) => { - Vue.directive(item.alias, item.directive); -}); - -// 引入setter组件 -import "./setter"; -// 引入sider组件 -import "./sider"; - -new Vue({ - router, - store, - render: (h) => h(App), -}).$mount("#app"); diff --git a/template/project/src/mixins/htmlCanvas.js b/template/project/src/mixins/htmlCanvas.js deleted file mode 100644 index 4bddfbd..0000000 --- a/template/project/src/mixins/htmlCanvas.js +++ /dev/null @@ -1,38 +0,0 @@ -import html2canvas from 'html2canvas' -import { createNamespacedHelpers } from 'vuex' -const { mapState, mapMutations } = createNamespacedHelpers('editor') -export default { - data () { - return {} - }, - computed: { - ...mapState(['scale', 'canvasImg']) - }, - methods: { - ...mapMutations(['handleSelectCanvas', 'handleCanvasImg']), - handleCanvas () { - this.handleSelectCanvas(false) - setTimeout(() => { - const element = document.querySelector('.go-chart-edit-content') - const { width, height } = element.getBoundingClientRect() - html2canvas(element, { - width, - height, - allowTaint: false, - backgroundColor: null, - useCORS: true, - scale: (1 / this.scale), - ignoreElements: e => { - if (element.contains(e)) { - return false - } - }, - }).then(canvas => { - const url = canvas.toDataURL('image/png') - // this.src = url - this['handleCanvasImg'](url) - }) - }, 500) - } - } -} \ No newline at end of file diff --git a/template/project/src/mixins/renderer.js b/template/project/src/mixins/renderer.js deleted file mode 100644 index e4e08c8..0000000 --- a/template/project/src/mixins/renderer.js +++ /dev/null @@ -1,36 +0,0 @@ -import { createNamespacedHelpers } from "vuex"; - -const { mapState, mapMutations } = createNamespacedHelpers("editor"); - -import lcd_engine from "@/lcd.engine.js"; - -const { renderer } = lcd_engine; - -export default { - data() { - return { - renderer, - }; - }, - computed: { - ...mapState([ - "layout", - "scale", - "getComponentList", - "selectStack", - "status", - "canvasStyle", - "selectCanvas" - ]), - }, - methods: { - ...mapMutations([ - "handleStatus", - "handleAddComponent", - "handleUpdateComponent", - "handleUpdateSelect", - 'handleScale', - "handleSelectCanvas" - ]), - }, -}; diff --git a/template/project/src/mixins/router.js b/template/project/src/mixins/router.js deleted file mode 100644 index 08fe681..0000000 --- a/template/project/src/mixins/router.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Session } from '@/utils'; - -export default { - beforeRouteEnter(to, from, next) { - const token = Session.get("token"); - if (!token) { - next("/login"); - } else { - next(); - window.location.href = - window.location.origin + "/" + window.location.hash; - } - }, -}; diff --git a/template/project/src/mixins/setter.js b/template/project/src/mixins/setter.js deleted file mode 100644 index 4fa985d..0000000 --- a/template/project/src/mixins/setter.js +++ /dev/null @@ -1,94 +0,0 @@ -import { createNamespacedHelpers } from "vuex"; - -const { mapState, mapMutations } = createNamespacedHelpers("editor"); - -import lcd_engine from "@/lcd.engine.js"; - -const { setter } = lcd_engine; - -export default { - props: { - id: { - type: String, - default: '', - }, - }, - data() { - return { - setter, - }; - }, - computed: { - ...mapState([ - "status", - "restore", - "layout", - "selectStack", - "selectKey", - "getComponentList", - "setterID", - 'canvasStyle', - 'schema', - 'variable', - ]), - ...mapState({ - 'graph': state => state.schema.graph - }), - title() { - switch (this.status) { - case "0": - return "组件"; - case "1": - return "画板"; - case "2": - return "缩略图"; - default: - break; - } - }, - config() { - return this.getComponentList.find((e) => e.id === this.id) - }, - meta() { - return this.schema.meta[this.id] - } - }, - methods: { - ...mapMutations([ - "handleVariable", - "handleGraph", - "handleLayout", - "handleRestore", - "handleRemove", - 'handleUpdateComponent', - 'handleCanvasStyle' - ]), - handleWidth(w) { - this.handleUpdateComponent({ - id: this.id, - key: 'attr', - value: { - ...this.config.attr, - w: Number(w), - }, - }) - }, - handleHeight(h) { - this.handleUpdateComponent({ - id: this.id, - key: 'attr', - value: { - ...this.config.attr, - h: Number(h), - }, - }) - }, - handleSize(val) { - this.handleUpdateComponent({ - id: this.id, - key: 'RESIZE', - value: val - }) - } - }, -}; diff --git a/template/project/src/mixins/sider.js b/template/project/src/mixins/sider.js deleted file mode 100644 index de1a32d..0000000 --- a/template/project/src/mixins/sider.js +++ /dev/null @@ -1,45 +0,0 @@ -import { createNamespacedHelpers } from "vuex"; - -const { mapState, mapMutations } = createNamespacedHelpers("editor"); - -import lcd_engine from "@/lcd.engine.js"; - -const { sider } = lcd_engine; - -export default { - props: { - id: { - type: String, - default: '' - }, - prop: { - type: Object, - default: () => ({}) - }, - global: { - type: Array, - default: () => ([]) - } - }, - data() { - return { - sider - }; - }, - computed: { - ...mapState([ - 'status', - 'layout', - 'getComponentList', - 'variable', - 'graph' - ]), - }, - methods: { - ...mapMutations([ - 'handleLayout', - 'handleVariable', - 'handleGraph' - ]), - }, -}; \ No newline at end of file diff --git a/template/project/src/mixins/tooler.js b/template/project/src/mixins/tooler.js deleted file mode 100644 index 3af689e..0000000 --- a/template/project/src/mixins/tooler.js +++ /dev/null @@ -1,33 +0,0 @@ -import { createNamespacedHelpers } from "vuex"; - -const { mapState, mapMutations } = createNamespacedHelpers("editor"); - -import lcd_engine from "@/lcd.engine.js"; - -const { tooler } = lcd_engine; - -export default { - data() { - return { - tooler - }; - }, - computed: { - ...mapState([ - "schema", - "canvasImg", - "getComponentList", - "canvasStyle" - ]), - }, - methods: { - ...mapMutations([ - ...Object.values(tooler).map((m) => m.trigger.name), - "handleThumbnail", - "handleViewId", - "handleMeta", - 'handleCover', - "handleReset" - ]), - }, -}; \ No newline at end of file diff --git a/template/project/src/mixins/viewer.js b/template/project/src/mixins/viewer.js deleted file mode 100644 index edee895..0000000 --- a/template/project/src/mixins/viewer.js +++ /dev/null @@ -1,41 +0,0 @@ -import { createNamespacedHelpers } from "vuex"; - -const { mapState } = createNamespacedHelpers("editor"); - -import { cloneDeep } from "@/utils"; - -export default { - data() { - return { - list: [], - variable: {}, - graph: {}, - scaleW: 1, - scaleH: 1, - }; - }, - computed: { - ...mapState(["getComponentList"]), - }, - methods: { - useProp(id) { - const config = this.list.find((e) => e.id === id); - if (!config) return {}; - return cloneDeep(config.prop); - }, - useGlobal(id) { - const config = this.list.find((e) => e.id === id); - if (!config) return []; - return cloneDeep(config.global); - }, - getComputedStyle({ attr, zIndex }) { - return { - left: attr.x * this.scaleW + "px", - top: attr.y * this.scaleH + "px", - width: attr.w + "px", - height: attr.h + "px", - "z-index": zIndex, - }; - }, - }, -}; diff --git a/template/project/src/mixins/window.js b/template/project/src/mixins/window.js deleted file mode 100644 index 7a196f6..0000000 --- a/template/project/src/mixins/window.js +++ /dev/null @@ -1,29 +0,0 @@ -import { throttle } from '@/utils'; - -export default { - data() { - return { - windowWidth: null, // 存放窗口宽度的状态值 - windowHeight: null // 存放窗口高度的状态值 - } - }, - mounted() { - - this.updateWindowSize(); // 初始化获取当前窗口宽度 - - window.addEventListener('resize', this.handleResize); // 添加窗口大小改变的事件监听器 - }, - beforeDestroy() { - window.removeEventListener('resize', this.handleResize); // 在组件销毁之前移除事件监听器 - }, - methods: { - updateWindowSize() { - this.windowWidth = window.innerWidth; // 将当前窗口宽度赋值给状态值 - this.windowHeight = window.innerHeight; // 将当前窗口宽度赋值给状态值 - }, - handleResize: throttle(function(event) { - this.updateWindowSize(); - this.$router.go(0) - }, 500) - } - } \ No newline at end of file diff --git a/template/project/src/router/index.js b/template/project/src/router/index.js deleted file mode 100644 index 74adb1b..0000000 --- a/template/project/src/router/index.js +++ /dev/null @@ -1,68 +0,0 @@ -import Vue from "vue"; -import VueRouter from "vue-router"; - -import { Layout } from 'vue-lcd-engine'; - -const { title } = require('$root/base.config.js') - -Vue.use(VueRouter); - -const router = new VueRouter({ - routes:[ - { - path: "/", - name: "/", - redirect: "/home", - component: Layout, - props: () => ({title: title, logo: tgName + "/" + bucketName + '/lcd-icon-logo.png'}), - children: [ - { - path: "/home", - name: "Home", - component: () => import("@/views/home"), - }, - { - path: "/editor/:id", - name: "Editor", - component: () => import("@/views/editor"), - }, - ], - }, - { - path: "/preview/:id", - name: "Preview", - component: () => import("@/views/preview"), - }, - { - path: "/monitor/:id", - name: "Monitor", - component: () => import("@/views/monitor"), - }, - { - path: "/login", - name: "Login", - component: () => import("@/views/Login.vue"), - }, - { - path: "*", - name: "NotFound", - component: () => import("@/views/NotFound.vue"), - }, - ], -}); - -// 路由守卫 -router.beforeEach(async (to, from, next) => { - if (to.path === "/login") { - next(); - } else { - const token = SessionStorage.get('token') - if (!token) { - next("/login"); - } else { - next(); - } - } -}); - -export default router; diff --git a/template/project/src/setter/index.js b/template/project/src/setter/index.js deleted file mode 100644 index 6d8f34e..0000000 --- a/template/project/src/setter/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './lcd-setter-xxx'; - - diff --git a/template/project/src/setter/lcd-setter-xxx/constant.js b/template/project/src/setter/lcd-setter-xxx/constant.js deleted file mode 100644 index 1b64fdd..0000000 --- a/template/project/src/setter/lcd-setter-xxx/constant.js +++ /dev/null @@ -1 +0,0 @@ -export const KEY = 'xxx'; \ No newline at end of file diff --git a/template/project/src/setter/lcd-setter-xxx/index.js b/template/project/src/setter/lcd-setter-xxx/index.js deleted file mode 100644 index 8769f94..0000000 --- a/template/project/src/setter/lcd-setter-xxx/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import Vue from 'vue'; -import xxx from './index.vue'; - -Vue.component(xxx.name, xxx) - -export { - xxx -} \ No newline at end of file diff --git a/template/project/src/setter/lcd-setter-xxx/index.vue b/template/project/src/setter/lcd-setter-xxx/index.vue deleted file mode 100644 index 910e7f6..0000000 --- a/template/project/src/setter/lcd-setter-xxx/index.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - diff --git a/template/project/src/setter/lcd-setter-xxx/validator.js b/template/project/src/setter/lcd-setter-xxx/validator.js deleted file mode 100644 index e69de29..0000000 diff --git a/template/project/src/sider/index.js b/template/project/src/sider/index.js deleted file mode 100644 index f9806f3..0000000 --- a/template/project/src/sider/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './lcd-sider-xxx'; - - diff --git a/template/project/src/sider/lcd-sider-xxx/index.js b/template/project/src/sider/lcd-sider-xxx/index.js deleted file mode 100644 index 913b56d..0000000 --- a/template/project/src/sider/lcd-sider-xxx/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import Vue from 'vue'; -import xxx from './index.vue'; - -import 'lcd-component-xxx/dist/lcd-component-xxx.css' - -Vue.component(xxx.name, xxx) - -export { - xxx -} \ No newline at end of file diff --git a/template/project/src/sider/lcd-sider-xxx/index.vue b/template/project/src/sider/lcd-sider-xxx/index.vue deleted file mode 100644 index 399bf20..0000000 --- a/template/project/src/sider/lcd-sider-xxx/index.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/store/editor.js b/template/project/src/store/editor.js deleted file mode 100644 index 16e80ac..0000000 --- a/template/project/src/store/editor.js +++ /dev/null @@ -1,439 +0,0 @@ -import lcd_engine from "@/lcd.engine.js"; -import Vue from "vue"; -import { cloneDeep, isNull } from "@/utils"; -const { tooler, share, renderer } = lcd_engine; - -// 创建editor的默认state -const createEditorState = function () { - const _state = { - // 全局变量 - variable: {}, - // 触发了restore事件 - restore: false, - setterID: null, - siderID: null, - // 大屏配置schema - schema: { - // 关联关系 - graph: {}, - // 画布宽度 - width: renderer.width, - // 画布高度 - height: renderer.height, - // 视图id - viewId: "", - // 视图名称 - name: "", - // 视图缩略图 - thumbnail: "", - // 封面地址 - cover: "", - // 组件信息 id => meta - meta: {}, - }, - // 选中状态 0:组件 1:画板 2:其他 - status: "2", - // 车道模型 布局算法 [0,0]: 左闭右闭 [0,1]:左闭右开 [1,0]:左开右闭 [1,1]:左开右开 - layout: [1, 1], - scale: 1, - getComponentList: [], - // 下一步栈 - backStack: [], - // 上一步栈 - forwardStack: [], - // 组件选中状态 - selectStack: null, - // 组件对应Key 关联配置项 - selectKey: null, - // 保存最新的截图 - canvasImg: null, - canvasStyle: { - width: renderer.width, - height: renderer.height, - }, - selectCanvas: true, // 是否操作了截取封面操作 - }; - - return _state; -}; - -// @override save操作 -const EDITOR_SAVE = ($state, payload) => { - console.log("EDITOR_SAVE", payload); -}; - -// @override preview操作 -const EDITOR_PREVIEW = ($state, payload) => { - console.log("EDITOR_PREVIEW", payload); - localStorage.setItem("preview", JSON.stringify($state.getComponentList)); - localStorage.setItem("graph", JSON.stringify($state.schema.graph)); - localStorage.setItem("canvasStyle", JSON.stringify($state.canvasStyle)); - window.open(`${window.location.origin}/#/preview/${payload.params}`); -}; - -// variable操作 -const EDITOR_VARIABLE = ($state, payload) => { - const {key, value} = payload; - console.log('EDITOR_VARIABLE', key, value) - if(!key || !value) return; - Vue.set($state.variable, key, value); -} - -// graph操作 -const EDITOR_GRAPH = ($state, payload) => { - const {key, value} = payload; - if(!key || !value) return; - $state.schema.graph[key] = value; -} - -// undo操作 -const EDITOR_UNDO = ($state) => { - const targetData = forwardAction($state); - if (targetData) { - const { id = null, key = null, DELETE = false } = targetData; - /* 处理选中 */ - $state.selectStack = id; - $state.selectKey = key; - if ($state.status != "0") { - $state.status = "0"; - } - if (DELETE) { - // 新增 - $state.getComponentList.push(targetData); - return; - } - const idArr = $state.forwardStack.filter((e) => e.id === id); - if (!idArr.length) { - console.log(id); - const index = $state.getComponentList.findIndex((e) => e.id === id); - $state.getComponentList.splice(index, 1); - backforward($state, index); - return; - } - /* 处理移动 */ - if ($state.forwardStack.length) { - const lastIndex = $state.forwardStack.findLastIndex((e) => e.id === id); - const data = $state.forwardStack[lastIndex]; - const index = $state.getComponentList.findIndex((e) => e.id === data.id); - Vue.set($state.getComponentList[index], "attr", { ...data.attr }); - } - } -}; - -const forwardAction = ($state) => { - if ($state.forwardStack.length) { - const targetData = cloneDeep($state.forwardStack.pop()); - if (!targetData) return; - $state.backStack.push({ ...targetData }); - return targetData; - } - return false; -}; - -// redo操作 -const EDITOR_REDO = ($state) => { - const targetData = backAction($state); - if (targetData) { - const { id = null, key = null, DELETE = false } = targetData; - const index = $state.getComponentList.findIndex((e) => e.id === id); - if (DELETE) { - // 删除 - $state.getComponentList.splice(index, 1); - backforward($state, index); - return; - } - if (index == -1) { - $state.getComponentList.push(cloneDeep(targetData)); - } else { - /* 处理移动 */ - const idx = $state.getComponentList.findIndex( - (e) => e.id === targetData.id - ); - Vue.set($state.getComponentList[idx], "attr", { ...targetData.attr }); - } - /* 处理选中 */ - $state.selectStack = id; - $state.selectKey = key; - if ($state.status != "0") { - $state.status = "0"; - } - $state.setterID = `lcd-setter-${key}~${id}`; - $state.siderID = `lcd-sider-${key}~${id}`; - } -}; - -const backAction = ($state) => { - if ($state.backStack.length) { - const targetData = cloneDeep($state.backStack.pop()); - if (!targetData) return; - $state.forwardStack.push({ ...targetData }); - return targetData; - } - return false; -}; - -const backforward = ($state, index) => { - if ($state.getComponentList.length) { - $state.selectStack = $state.getComponentList[index - 1].id; - $state.selectKey = $state.getComponentList[index - 1].key; - $state.setterID = `lcd-setter-${$state.selectKey}~${$state.selectStack}`; - $state.siderID = `lcd-sider-${$state.selectKey}~${$state.selectStack}`; - } else { - $state.status = "2"; - $state.selectStack = null; - $state.selectKey = null; - $state.setterID = null; - $state.siderID = null; - } -}; - -// reset操作 -const EDITOR_RESET = ($state, payload) => { - Object.assign($state, createEditorState()); -}; - -// @override exit操作 -const EDITOR_EXIT = ($state, payload) => { - console.log("EDITOR_EXIT", payload); -}; - -// status操作 -const EDITOR_STATUS = ($state, payload) => ($state.status = payload); - -// layout操作 -const EDITOR_LAYOUT = ($state, payload) => { - $state.layout = payload; -}; - -// remove操作 -const EDITOR_REMOVE = ($state) => { - if (!$state.getComponentList.length) return; - const index = $state.getComponentList.findIndex( - (e) => e.id === $state.selectStack - ); - const data = $state.getComponentList[index]; - $state.getComponentList.splice(index, 1); - $state.forwardStack.push({ ...data, DELETE: true }); - // 处理选中 - if ($state.getComponentList.length) { - const { id, key } = - $state.getComponentList[$state.getComponentList.length - 1]; - $state.selectStack = id; - $state.selectKey = key; - $state.setterID = `lcd-setter-${key}~${id}`; - $state.siderID = `lcd-sider-${key}~${id}`; - } else { - $state.status = "2"; - $state.selectStack = null; - $state.selectKey = null; - $state.setterID = null; - $state.siderID = null; - } -}; - -// meta操作 -const EDITOR_META = ($state, payload) => { - console.log("EDITOR_META", payload); - $state.schema.meta = payload; -}; - -// name操作 -const EDITOR_NAME = ($state, payload) => { - console.log("EDITOR_NAME", payload); - $state.schema.name = payload; -}; - -// viewId操作 -const EDITOR_VIEW_ID = ($state, payload) => { - console.log("EDITOR_VIEW_ID", payload); - $state.schema.viewId = payload; -}; - -// thumbnail操作 -const EDITOR_THUMBNAIL = ($state, payload) => { - console.log("EDITOR_THUMBNAIL", payload); - $state.schema.thumbnail = payload; -}; - -// cover操作 -const EDITOR_COVER = ($state, payload) => { - console.log("EDITOR_COVER", payload); - $state.schema.cover = payload; -}; - -// shema操作 -const EDITOR_SCHEMA = ($state, payload) => { - console.log("EDITOR_SCHEMA", payload); - $state.schema = payload; -}; - -// 放大缩小 -const EDITOR_SCALE = ($state, payload) => ($state.scale = payload); - -// 替换组件列表 -const EDITOR_REPLACE_LIST = ($state, payload) => { - $state.getComponentList = payload; -}; - -// 新增组件列表 -const EDITOR_ADD_LIST = ($state, payload) => { - const { id = null, key = null } = payload; - if (!id) return; - $state.getComponentList.push(payload); - $state.forwardStack.push(payload); - if ($state.backStack.length) { - $state.backStack = []; - } - $state.selectStack = id; - $state.selectKey = key; - $state.setterID = `lcd-setter-${key}~${id}`; - $state.siderID = `lcd-sider-${key}~${id}`; -}; - -// 更新组件列表 -const EDITOR_UPDATE_LIST = ($state, payload) => { - const { id = null, key, value, isRecord = null } = payload; - if (!id || !key) return; - const index = $state.getComponentList.findIndex((e) => e.id === id); - const object = $state.getComponentList.find((e) => e.id === id); - if (key == "attr") { - // 不记录组件来回切换选中 - const MoveBoolean = Object.keys(value).every( - (e) => value[e] == object.attr[e] - ); - if (MoveBoolean) return; - } - object[key] = value; - // 深拷贝 - const component = cloneDeep(object); - console.log("EDITOR_UPDATE_LIST", component); - // 使用$set修改index位置的变化 - Vue.set($state.getComponentList, index, component); - if (key == "prop") return; // 不记录组件配置改动 - if (isRecord) { - // 只记录画布上操作的 大小改变 - $state.forwardStack.push(component); - } -}; - -// restore操作 -const EDITOR_RESTORE = ($state, payload) => { - const { id } = payload; - const meta = $state.schema.meta[id]; - console.log("EDITOR_RESTORE", meta); - $state.restore = true; - setTimeout(() => { - $state.restore = false; - }, share.delay); -}; - -// 更新选中 -const EDITOR_UPDATE_SELECT = ($state, payload) => { - console.log("EDITOR_UPDATE_SELECT", payload); - $state.selectStack = payload; - if (payload) { - $state.status = "0"; - $state.restore = true; - const { key } = $state.getComponentList.find((e) => e.id == payload); - $state.selectKey = key; - $state.setterID = `lcd-setter-${key}~${payload}`; - $state.siderID = `lcd-sider-${key}~${payload}`; - setTimeout(() => { - $state.restore = false; - }, share.delay); - } else if (isNull(payload)) { - // 为null说明是点击的画板 - $state.status = "1"; - } else { - $state.status = "2"; - } -}; - -const EDITOR_CANVASIMG = ($state, payload) => { - console.log("EDITOR_CANVASIMG", payload); - $state.canvasImg = payload; -}; - -const EDITOR_CANVASSTYLE = ($state, payload) => { - $state.canvasStyle = payload; - $state.schema.width = payload.width; - $state.schema.height = payload.height; -}; - -const EDITOR_SELECT_CANVANS = ($state, payload) => { - $state.selectCanvas = payload; -}; - -const createToolerMutations = function () { - const _mutations = {}; - Object.entries(tooler).forEach(([key, content]) => { - const { name } = content.trigger; - switch (content.key.description) { - case "save": - _mutations[name] = EDITOR_SAVE; - break; - case "preview": - _mutations[name] = EDITOR_PREVIEW; - break; - case "undo": - _mutations[name] = EDITOR_UNDO; - break; - case "redo": - _mutations[name] = EDITOR_REDO; - break; - case "exit": - _mutations[name] = EDITOR_EXIT; - break; - default: - break; - } - }); - - return _mutations; -}; - -const mutations = { - ...{ - handleVariable: EDITOR_VARIABLE, - handleGraph: EDITOR_GRAPH, - handleStatus: EDITOR_STATUS, - handleLayout: EDITOR_LAYOUT, - handleRestore: EDITOR_RESTORE, - handleRemove: EDITOR_REMOVE, - handleScale: EDITOR_SCALE, - handleAddComponent: EDITOR_ADD_LIST, - handleUpdateComponent: EDITOR_UPDATE_LIST, - handleReplaceComponent: EDITOR_REPLACE_LIST, - handleUpdateSelect: EDITOR_UPDATE_SELECT, - handleCanvasImg: EDITOR_CANVASIMG, - handleMeta: EDITOR_META, - handleName: EDITOR_NAME, - handleViewId: EDITOR_VIEW_ID, - handleThumbnail: EDITOR_THUMBNAIL, - handleCover: EDITOR_COVER, - handleCanvasStyle: EDITOR_CANVASSTYLE, - handleSchema: EDITOR_SCHEMA, - handleReset: EDITOR_RESET, - handleSelectCanvas: EDITOR_SELECT_CANVANS, - }, - ...createToolerMutations(), -}; - -const state = { - ...{}, - ...createEditorState(), -}; - -import * as components_store from './modules'; - -console.log('components_store', components_store) - -export default { - namespaced: true, - modules: { - ...components_store - }, - state, - mutations, - actions: {}, -}; diff --git a/template/project/src/store/home.js b/template/project/src/store/home.js deleted file mode 100644 index f7d8a81..0000000 --- a/template/project/src/store/home.js +++ /dev/null @@ -1,12 +0,0 @@ -export default { - namespaced: true, - state: { - - }, - mutations: { - - }, - actions: { - - }, -}; \ No newline at end of file diff --git a/template/project/src/store/index.js b/template/project/src/store/index.js deleted file mode 100644 index 20d2fc4..0000000 --- a/template/project/src/store/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import Vue from "vue"; -import Vuex from "vuex"; -import home from "./home"; -import editor from "./editor"; -import preview from "./preview"; -import monitor from "./monitor"; - -Vue.use(Vuex); - -let modules = {}; -modules.home = home; -modules.editor = editor; -modules.monitor = monitor; -modules.preview = preview; - -const store = new Vuex.Store({ - modules, - namespaced: true, - plugins: [] -}); - -export default store; diff --git a/template/project/src/store/modules/index.js b/template/project/src/store/modules/index.js deleted file mode 100644 index aa87e71..0000000 --- a/template/project/src/store/modules/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './xxx'; \ No newline at end of file diff --git a/template/project/src/store/modules/xxx.js b/template/project/src/store/modules/xxx.js deleted file mode 100644 index fbecab6..0000000 --- a/template/project/src/store/modules/xxx.js +++ /dev/null @@ -1 +0,0 @@ -export * from 'lcd-component-xxx/src/store'; \ No newline at end of file diff --git a/template/project/src/store/monitor.js b/template/project/src/store/monitor.js deleted file mode 100644 index 3cc28a9..0000000 --- a/template/project/src/store/monitor.js +++ /dev/null @@ -1,17 +0,0 @@ -export default { - namespaced: true, - modules: {}, - state: { - viewMap: {}, - solutionName: '' - }, - mutations: { - handleViewMap(state, payload) { - state.viewMap = payload - }, - handleSolutionName(state, payload) { - state.solutionName = payload - } - }, - actions: {}, - }; \ No newline at end of file diff --git a/template/project/src/store/preview.js b/template/project/src/store/preview.js deleted file mode 100644 index 9a37d62..0000000 --- a/template/project/src/store/preview.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - namespaced: true, - modules: {}, - state: {}, - mutations: {}, - actions: {}, - }; \ No newline at end of file diff --git a/template/project/src/styles/cover.less b/template/project/src/styles/cover.less deleted file mode 100644 index 5b35f3f..0000000 --- a/template/project/src/styles/cover.less +++ /dev/null @@ -1,254 +0,0 @@ -@import './vars.less'; - -// 重写button样式 -.ant_btn_reset() { - /deep/ .ant-btn:hover { - color: @text-color !important; - } - - /deep/ .ant-btn:focus { - color: @text-color !important; - } -} - -// 重写input样式 -.ant_input_reset() { - /deep/ .ant-input { - background-color: transparent; - } - - /deep/ .ant-input-disabled { - color: @dark-color-6; - } -} - -// 重写select样式 -.ant_select_reset() { - /deep/ .ant-select-selection { - background-color: transparent; - } - - /deep/ .ant-select-arrow { - color: white; - } -} - -// 重写slider样式 -.ant_slider_reset() { - /deep/ .ant-slider-rail { - background-color: white; - } - - /deep/ .ant-slider-track { - background-color: @primary-color; - } - - /deep/ .ant-slider-handle { - background-color: @primary-color; - border-color: @primary-color; - } -} - -// 重写popconfirm样式 -.ant_popconfirm_reset() { - .ant-popover { - .ant-popover-arrow { - border-color: @primary-color !important; - } - - .ant-popover-inner { - background-color: @primary-color; - - .ant-popover-buttons .ant-btn { - color: lighten(@dark-color, 99.9% - lightness(@dark-color)); - background: transparent; - border: none; - font-size: 12px; - - &.ant-btn-primary { - border: 1px solid lighten(@dark-color, 99.9% - lightness(@dark-color)); - } - } - } - - &.popconfirm-delete { - .ant-popover-buttons { - display: none; - } - - .ant-popover-message { - padding: 4px 0 0 0; - } - } - } -} - -// 重写pagination样式 -.ant_pagination_reset() { - /deep/ .ant-pagination { - .ant-pagination-item-active a { - background: @primary-color; - color: lighten(@dark-color, 99.9% - lightness(@dark-color)); - } - - .ant-pagination-item-ellipsis { - color: lighten(@dark-color, 99.9% - lightness(@dark-color)); - } - } -} - -// 重写checkbox样式 -.ant_checkbox_reset() { - /deep/ .ant-checkbox-inner { - background-color: transparent; - } -} - -// 重写collapse样式 -.ant_collapse_reset() { - /deep/ .ant-collapse { - .ant-collapse-item { - .ant-modal-close { - .ant-modal-close-icon { - color: white; - } - } - - .ant-collapse-content { - background-color: @dark-color-5; - } - - } - - } -} - -// 重写table样式 -.ant_table_reset() { - /deep/ .ant-table { - background-color: transparent; - border: 1px solid @dark-color-5; - border-radius: 0.25rem; - - .ant-table-row-selected { - td { - background-color: transparent; - } - } - - .ant-table-placeholder { - background-color: transparent; - - .ant-empty-description { - color: white; - } - } - - .ant-table-thead { - th { - background-color: @dark-color-4; - } - } - - .ant-table-selection-column { - .ant-checkbox-inner { - border-color: @dark-color-6; - background-color: transparent; - } - } - - .ant-table-tbody .ant-table-row:nth-child(odd) { - background-color: transparent; - } - - .ant-table-tbody .ant-table-row:nth-child(even) { - background: @dark-color-4; - } - } -} - -// 重写modal样式 -.ant_modal_reset() { - /deep/ .ant-modal-content { - background-color: @dark-color-3; - - .ant-modal-header { - background-color: inherit; - } - } - -} - -// 重写message样式 -.ant_message_reset(@name, @bgColor) { - .@{name} { - box-sizing: border-box; - margin: 0; - padding: 0; - color: white; - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5; - list-style: none; - font-feature-settings: 'tnum'; - position: fixed; - top: 16px; - left: 0; - z-index: 1010; - width: 100%; - pointer-events: none; - } - .@{name}-notice { - padding: 8px; - text-align: center; - } - .@{name}-notice:first-child { - margin-top: -8px; - } - .@{name}-notice-content { - display: inline-block; - padding: 10px 16px; - background: @bgColor; - border-radius: 4px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - pointer-events: all; - } - .@{name} .anticon { - color: fff; - position: relative; - top: 1px; - margin-right: 8px; - font-size: 16px; - } - .@{name}-notice.move-up-leave.move-up-leave-active { - overflow: hidden; - -webkit-animation-name: MessageMoveOut; - animation-name: MessageMoveOut; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - } - @-webkit-keyframes MessageMoveOut { - 0% { - max-height: 150px; - padding: 8px; - opacity: 1; - } - 100% { - max-height: 0; - padding: 0; - opacity: 0; - } - } - @keyframes MessageMoveOut { - 0% { - max-height: 150px; - padding: 8px; - opacity: 1; - } - 100% { - max-height: 0; - padding: 0; - opacity: 0; - } - } -} \ No newline at end of file diff --git a/template/project/src/styles/index.less b/template/project/src/styles/index.less deleted file mode 100644 index a0d47ac..0000000 --- a/template/project/src/styles/index.less +++ /dev/null @@ -1,61 +0,0 @@ -@import '~ant-design-vue/dist/antd.less'; - -// 1920一下屏幕 不需要放大 只需要响应式布局即可 -@media screen and (min-width:1366px) { - html,body { - font-size: excl(12px); - } -} - -@media screen and (min-width:1440px) { - html,body { - font-size: excl(14px); - } -} - -@media screen and (min-width:1600px) { - html,body { - font-size: excl(14px); - } -} - -@media screen and (min-width:1920px) { - html,body { - font-size: excl(16px); - } -} - -@media screen and (min-width:2560px) { - html,body { - font-size: excl(18px); - } -} - -@media screen and (min-width:3840px) { - html,body { - font-size: excl(18px); - } -} - -/* 设置滚动条的样式 */ -::-webkit-scrollbar { - width:8px; - height:8px; -} -/* 滚动槽 */ -::-webkit-scrollbar-track { - -webkit-box-shadow:inset006pxrgba(0,0,0,0.3); - border-radius:10px; -} -/* 滚动条滑块 */ -::-webkit-scrollbar-thumb { - border-radius:10px; - background:#d8d8d8; - -webkit-box-shadow:inset006pxrgba(0,0,0,0.5); -} -::-webkit-scrollbar-thumb:window-inactive { - background:rgba(0,0,0,0.4); -} -::-webkit-scrollbar-corner { - background: transparent; -} \ No newline at end of file diff --git a/template/project/src/styles/vars.less b/template/project/src/styles/vars.less deleted file mode 100644 index 9c1eaa0..0000000 --- a/template/project/src/styles/vars.less +++ /dev/null @@ -1,57 +0,0 @@ -// 自定义变量 -@dark-color: #141414; -// #0f0f0f -@dark-color-1: darken(@dark-color, lightness(@dark-color) - 5.84%); -// #1f1f1f -@dark-color-2: lighten(@dark-color, 12.16% - lightness(@dark-color)); -// #2e2e2e -@dark-color-3: lighten(@dark-color, 18.04% - lightness(@dark-color)); -// #3a3a3a -@dark-color-4: lighten(@dark-color, 22.75% - lightness(@dark-color)); -// #404040 -@dark-color-5: lighten(@dark-color, 25.1% - lightness(@dark-color)); -// #595959 -@dark-color-6: lighten(@dark-color, 34.9% - lightness(@dark-color)); - -// ant-design-vue 变量 -@primary-color: #3779ee; // 全局主色 -@link-color: #1890ff; // 链接色 -@success-color: #2bbe8c; // 成功色 -@warning-color: #faad14; // 警告色 -@error-color: #eb5c5c; // 错误色 -// 暗黑主题修改 -@background-color-light: @dark-color-6; -@background-color-base: @dark-color-6; -@body-background: @dark-color; -@component-background: @dark-color-6; -@label-color: @text-color; -@border-color-base: @dark-color-6; -@border-color-split: @dark-color-6; -@heading-color: @text-color; -@text-color: @text-color; -@item-active-bg: @primary-color; -@item-hover-bg: @primary-color; -@text-color: white; -@text-color-secondary: darken(@text-color, 10%); // 次文本色 -@disabled-color: fade(@dark-color, 0.25); // 失效色 - - -:export { - primary_color: @primary-color; - link_color: @link-color; - success_color: @success-color; - warning_color: @warning-color; - error_color: @error-color; - dark_color: @dark-color; - dark_color_1: @dark-color-1; - dark_color_2: @dark-color-2; - dark_color_3: @dark-color-3; - dark_color_4: @dark-color-4; - dark_color_5: @dark-color-5; - dark_color_6: @dark-color-6; - text_color: @text-color; - text_color_secondary: @text-color-secondary; - disabled_color: @disabled-color; -} - - diff --git a/template/project/src/utils/deep.js b/template/project/src/utils/deep.js deleted file mode 100644 index 5852e4f..0000000 --- a/template/project/src/utils/deep.js +++ /dev/null @@ -1,16 +0,0 @@ -export { cloneDeep } from "lodash"; - -export const compareDeep = (a, b) => { - if ( - a === null || - typeof a !== "object" || - a === null || - typeof a !== "object" - ) { - return a === b; - } - const propsA = Object.getOwnPropertyDescriptors(a); - const propsB = Object.getOwnPropertyDescriptors(b); - if (Object.keys(propsA).length !== Object.keys(propsB).length) return false; - return Object.keys(propsA).every((key) => compareDeep(a[key], b[key])); -}; diff --git a/template/project/src/utils/http.js b/template/project/src/utils/http.js deleted file mode 100644 index b26626e..0000000 --- a/template/project/src/utils/http.js +++ /dev/null @@ -1,40 +0,0 @@ -import axios from 'axios'; - -/** - * BaseAxios是数据使用的axios实例 - */ - -const BaseAxios = axios.create({ - timeout: 60000 -}); - -// 请求拦截 -BaseAxios.interceptors.request.use(async config => { - let token = sessionStorage.get('token'); - if (token) { - config.headers.Token = token; - config.headers.Authorization = `Bearer ${token}`; - } - return config; -}, err => { - return Promise.reject(err); -}); - -// 响应拦截 -BaseAxios.interceptors.response.use( res => { - if(res.data.success || - res.data.FLAG === "SUCCESS" || - res.data.retCode === "200" || - res.status === 200){ - return res.data - } else { - message.error(res.data.msg || res.data.MESSAGE || res.data.message || "Error"); - return Promise.reject(res.data) - } -}, err => { - return Promise.reject(err) -}); - -export { - BaseAxios -}; \ No newline at end of file diff --git a/template/project/src/utils/image.js b/template/project/src/utils/image.js deleted file mode 100644 index 624125a..0000000 --- a/template/project/src/utils/image.js +++ /dev/null @@ -1,13 +0,0 @@ -// 图片相关转化 -/* base64图片转化成文件流 */ -export const dataURLtoBlob = (dataurl) => { - const arr = dataurl.split(',') - const mime = arr[0].match(/:(.*?);/)[1] - const bstr = atob(arr[1]) - let n = bstr.length - let u8arr = new Uint8Array(n) - while (n--) { - u8arr[n] = bstr.charCodeAt(n) - } - return new Blob([u8arr], { type: mime }) -} \ No newline at end of file diff --git a/template/project/src/utils/index.js b/template/project/src/utils/index.js deleted file mode 100644 index 63ce9b5..0000000 --- a/template/project/src/utils/index.js +++ /dev/null @@ -1,9 +0,0 @@ -export * from 'lodash'; - -// 本地utils -export * from './http'; -export * from './image'; -export * from './deep'; -export * from './is'; -export * from './merge'; -export * from './useKeyBoard'; \ No newline at end of file diff --git a/template/project/src/utils/is.js b/template/project/src/utils/is.js deleted file mode 100644 index b3b78dd..0000000 --- a/template/project/src/utils/is.js +++ /dev/null @@ -1,17 +0,0 @@ -// 判断是不是数组 -export const isArray = arr => Array.isArray(arr); - -// 判断是不是函数 -export const isFunction = func => typeof func === 'function'; - -// 判断是不是字符串 -export const isString = str => typeof str === 'string'; - -// 判断是不是Object -export const isObject = (value) => { - const type = typeof value - return value !== null && (type === "object" || type === "function") -} - -// 判断是不是Null -export const isNull = value => value === null; diff --git a/template/project/src/utils/merge.js b/template/project/src/utils/merge.js deleted file mode 100644 index 51e36bd..0000000 --- a/template/project/src/utils/merge.js +++ /dev/null @@ -1,36 +0,0 @@ -import { mergeWith } from 'lodash'; - -import { isArray, isObject } from './is'; - -// 合并两个对象 - export const mergeObject = (source, other) => { - if (!isObject(source) || !isObject(other)) { - return other === undefined ? source : other - } - // 合并两个对象的 key,另外要区分数组的初始值为 [] - return Object.keys({ - ...source, - ...other, - }).reduce( - (acc, key) => { - // 递归合并 value - acc[key] = mergeObject(source[key], other[key]) - - return acc - }, - Array.isArray(source) ? [] : {} - ) - } - - export const mergeWithObject = (source, other) => { - return mergeWith(source, other, function customizer(sourceValue, otherValue) { - if (isArray(sourceValue)) { - return otherValue; - } else if (typeof sourceValue === 'object' && typeof otherValue === 'object') { - // 若是object类型的对象,我们进行递归 - return mergeWith(sourceValue, otherValue, customizer) - } else { - return otherValue; - } - }) - } \ No newline at end of file diff --git a/template/project/src/utils/useKeyBoard.js b/template/project/src/utils/useKeyBoard.js deleted file mode 100644 index b27ad35..0000000 --- a/template/project/src/utils/useKeyBoard.js +++ /dev/null @@ -1,100 +0,0 @@ -import store from "@/store" -import { throttle } from '@/utils' -import keymaster from 'keymaster' - -const winCtrlMerge = e => `ctrl+${e}` -const winShiftMerge = e => `ctrl+shift+${e}` -const macCtrlMerge = e => `⌘+${e}` -const macShiftMerge = e => `⌘+shift+${e}` -// windows -const winKeyValue = { - forward: winCtrlMerge('y'), - forward_new: winShiftMerge('z'), - back: winCtrlMerge('z'), - delete: 'delete' -} -// mac -const macKeyValue = { - forward: macCtrlMerge('y'), - forward_new: macShiftMerge('z'), - back: macCtrlMerge('z'), - delete: macCtrlMerge('backspace') -} - -// 处理键盘记录 -const keyRecordHandle = () => { - // 默认赋值 - window.$KeyboardActive = { - ctrl: false, - space: false - } - document.onkeydown = e => {//NOSONAR - const { keyCode } = e//NOSONAR - if (keyCode == 32 && e.target == document.body) e.preventDefault() - if ([17, 32].includes(keyCode) && window.$KeyboardActive) { - switch (keyCode) { - case 17: window.$KeyboardActive.ctrl = true; break - case 32: window.$KeyboardActive.space = true; break - } - } - } - document.onkeyup = e => {//NOSONAR - const { keyCode } = e//NOSONAR - if (keyCode == 32 && e.target == document.body) e.preventDefault() - if ([17, 32].includes(keyCode) && window.$KeyboardActive) { - switch (keyCode) { - case 17: window.$KeyboardActive.ctrl = false; break - case 32: window.$KeyboardActive.space = false; break - } - } - } -} - -// 初始化监听事件 -export const useAddKeyboard = () => { - const throttleTime = 50 - const switchHandle = (e, key) => { - switch (key) { - // 撤回 ct+z - case e.back: - keymaster(key, throttle(() => { store.commit('editor/handleUndo') }, throttleTime)) - break - // 前进 ct+y - case e.forward: - keymaster(key, throttle(() => { store.commit('editor/handleRedo') }, throttleTime)) - break - // 前进 ct+sh+z - case e.forward_new: - keymaster(key, throttle(() => { store.commit('editor/handleRedo') }, throttleTime)) - break - case e.delete: - keymaster(key, throttle(() => { store.commit('editor/handleRemove') }, throttleTime)) - break - default: - break - } - } - Object.keys(winKeyValue).forEach((key) => { - switchHandle(winKeyValue, winKeyValue[key]) - }) - Object.keys(macKeyValue).forEach((key) => { - switchHandle(macKeyValue, macKeyValue[key]) - }) - keyRecordHandle() -} - -// 卸载监听事件 -export const useRemoveKeyboard = () => { - document.onkeydown = () => { - console.log('onkeydown') - } - document.onkeyup = () => { - console.log('onkeyup') - } - Object.keys(winKeyValue).forEach((key) => { - keymaster.unbind(winKeyValue[key]) - }) - Object.keys(macKeyValue).forEach((key) => { - keymaster.unbind(macKeyValue[key]) - }) -} \ No newline at end of file diff --git a/template/project/src/views/Login.vue b/template/project/src/views/Login.vue deleted file mode 100644 index 8482fe2..0000000 --- a/template/project/src/views/Login.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - diff --git a/template/project/src/views/NotFound.vue b/template/project/src/views/NotFound.vue deleted file mode 100644 index f5be146..0000000 --- a/template/project/src/views/NotFound.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - \ No newline at end of file diff --git a/template/project/src/views/editor/components/RenderBottom.vue b/template/project/src/views/editor/components/RenderBottom.vue deleted file mode 100644 index 859751e..0000000 --- a/template/project/src/views/editor/components/RenderBottom.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/template/project/src/views/editor/components/RenderTop.vue b/template/project/src/views/editor/components/RenderTop.vue deleted file mode 100644 index 7b82f5f..0000000 --- a/template/project/src/views/editor/components/RenderTop.vue +++ /dev/null @@ -1,414 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/editor/components/SetterContent.vue b/template/project/src/views/editor/components/SetterContent.vue deleted file mode 100644 index c4ce1e6..0000000 --- a/template/project/src/views/editor/components/SetterContent.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/template/project/src/views/editor/components/SetterFloat.vue b/template/project/src/views/editor/components/SetterFloat.vue deleted file mode 100644 index c91682c..0000000 --- a/template/project/src/views/editor/components/SetterFloat.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/editor/components/SetterHeader.vue b/template/project/src/views/editor/components/SetterHeader.vue deleted file mode 100644 index 5709fab..0000000 --- a/template/project/src/views/editor/components/SetterHeader.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - diff --git a/template/project/src/views/editor/components/SiderMain.vue b/template/project/src/views/editor/components/SiderMain.vue deleted file mode 100644 index 2239cc7..0000000 --- a/template/project/src/views/editor/components/SiderMain.vue +++ /dev/null @@ -1,132 +0,0 @@ - - - - - diff --git a/template/project/src/views/editor/components/ToolLeft.vue b/template/project/src/views/editor/components/ToolLeft.vue deleted file mode 100644 index c48f792..0000000 --- a/template/project/src/views/editor/components/ToolLeft.vue +++ /dev/null @@ -1,228 +0,0 @@ - - - - - diff --git a/template/project/src/views/editor/components/ToolRight.vue b/template/project/src/views/editor/components/ToolRight.vue deleted file mode 100644 index 0e709e4..0000000 --- a/template/project/src/views/editor/components/ToolRight.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - - diff --git a/template/project/src/views/editor/index.vue b/template/project/src/views/editor/index.vue deleted file mode 100644 index 1c4c8a0..0000000 --- a/template/project/src/views/editor/index.vue +++ /dev/null @@ -1,271 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/home/components/CreateModal.vue b/template/project/src/views/home/components/CreateModal.vue deleted file mode 100644 index ada2ff2..0000000 --- a/template/project/src/views/home/components/CreateModal.vue +++ /dev/null @@ -1,261 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/home/components/List.vue b/template/project/src/views/home/components/List.vue deleted file mode 100644 index 549ab05..0000000 --- a/template/project/src/views/home/components/List.vue +++ /dev/null @@ -1,317 +0,0 @@ - - - - - diff --git a/template/project/src/views/home/components/MoreModel.vue b/template/project/src/views/home/components/MoreModel.vue deleted file mode 100644 index df64306..0000000 --- a/template/project/src/views/home/components/MoreModel.vue +++ /dev/null @@ -1,349 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/home/components/Search.vue b/template/project/src/views/home/components/Search.vue deleted file mode 100644 index e53ca25..0000000 --- a/template/project/src/views/home/components/Search.vue +++ /dev/null @@ -1,139 +0,0 @@ - - - - - \ No newline at end of file diff --git a/template/project/src/views/home/index.vue b/template/project/src/views/home/index.vue deleted file mode 100644 index d8fdcfd..0000000 --- a/template/project/src/views/home/index.vue +++ /dev/null @@ -1,216 +0,0 @@ - - - - - diff --git a/template/project/src/views/monitor/components/ViewSwitch.vue b/template/project/src/views/monitor/components/ViewSwitch.vue deleted file mode 100644 index e640309..0000000 --- a/template/project/src/views/monitor/components/ViewSwitch.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/template/project/src/views/monitor/index.vue b/template/project/src/views/monitor/index.vue deleted file mode 100644 index 5889965..0000000 --- a/template/project/src/views/monitor/index.vue +++ /dev/null @@ -1,159 +0,0 @@ - - - - - diff --git a/template/project/src/views/preview/index.vue b/template/project/src/views/preview/index.vue deleted file mode 100644 index e0975f9..0000000 --- a/template/project/src/views/preview/index.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - diff --git a/template/project/vue.config.js b/template/project/vue.config.js deleted file mode 100644 index 3bd2eca..0000000 --- a/template/project/vue.config.js +++ /dev/null @@ -1,100 +0,0 @@ -const { - devServer, - configureWebpack, - chainWebpack, - postCSSPlugin, -} = require("./build"); - -console.log("当前Node.js版本", process.version); - -const fs = require("fs"); -const less = require("less"); - -/** - * @params {string} url --- url is a relative path string of a css file - */ -const readLess = (url) => { - const lessStr = fs.readFileSync(url, "utf-8"); - let output = ""; - less.render(lessStr, (err, res) => { - if (err) { - throw new Error(err); - } else { - output = res; - } - }); - - const _vars = {}; - - output.css - .replace(":export ", "") - .replace(/\{|\}|\s/gi, "") - .split(";") - .filter((f) => Boolean(f)) - .map((m) => m.split(":")) - .forEach((item) => { - _vars[item[0]] = item[1]; - }); - - return _vars; -}; - -const vars = readLess("./src/styles/vars.less"); - -console.log("vars", vars); - -module.exports = { - // DEV环境忽略eslint - lintOnSave: false, - // 是否开启并行 - parallel: require("os").cpus().length > 1, - publicPath: "./", - outputDir: "dist", - runtimeCompiler: true, - filenameHashing: false, - productionSourceMap: false, - configureWebpack, - chainWebpack, - // 解决 ant 按需加载 less 'Inline JavaScript is not enabled' 报错 - css: { - loaderOptions: { - // 向 CSS 相关的 loader 传递选项 - less: { - modifyVars: { - "primary-color": vars.primary_color, - "success-color": vars.success_color, - "warning-color": vars.warning_color, - "background-color-base": vars.dark_color_6, - "background-color-light": vars.dark_color_6, - "body-background": vars.dark_color, - "component-background": vars.dark_color_6, - "label-color": vars.text_color, - "border-color-base": vars.dark_color_6, - "border-color-split": vars.dark_color_6, - "heading-color": vars.text_color, - "text-color": vars.text_color, - "item-active-bg": vars.primary_color, - "item-hover-bg": vars.primary_color, - "text_color_secondary": vars.text_color_secondary, - "disabled_color": vars.disabled_color - }, - javascriptEnabled: true, - }, - // vue-cli内置了postcss,向其中传递所需的postcss处理 - postcss: { - plugins: [ - postCSSPlugin["postcss-pcx2rem"]({ - baseDpr: 1, - // html基础fontSize 设计稿尺寸 屏幕尺寸 - remUnit: (16 * 1920) / 1920, - remPrecision: 6, - forcePxComment: "px", - keepComment: "no", - }), - ], - }, - }, - }, - - devServer, -}; diff --git a/template/setter/constant.js b/template/setter/constant.js deleted file mode 100644 index 1b64fdd..0000000 --- a/template/setter/constant.js +++ /dev/null @@ -1 +0,0 @@ -export const KEY = 'xxx'; \ No newline at end of file diff --git a/template/setter/index.js b/template/setter/index.js deleted file mode 100644 index 8769f94..0000000 --- a/template/setter/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import Vue from 'vue'; -import xxx from './index.vue'; - -Vue.component(xxx.name, xxx) - -export { - xxx -} \ No newline at end of file diff --git a/template/setter/index.vue b/template/setter/index.vue deleted file mode 100644 index 910e7f6..0000000 --- a/template/setter/index.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - diff --git a/template/setter/validator.js b/template/setter/validator.js deleted file mode 100644 index e69de29..0000000 diff --git a/template/sider/index.js b/template/sider/index.js deleted file mode 100644 index 913b56d..0000000 --- a/template/sider/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import Vue from 'vue'; -import xxx from './index.vue'; - -import 'lcd-component-xxx/dist/lcd-component-xxx.css' - -Vue.component(xxx.name, xxx) - -export { - xxx -} \ No newline at end of file diff --git a/template/sider/index.vue b/template/sider/index.vue deleted file mode 100644 index 399bf20..0000000 --- a/template/sider/index.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - \ No newline at end of file -- Gitee From dbfa7e5578c0991e6f63a4af53e2e9e233399545 Mon Sep 17 00:00:00 2001 From: we452366 <996925662@qq.com> Date: Fri, 19 Jul 2024 15:58:30 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DSize=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9A=84input=E6=A1=86=E5=AF=B9=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E7=9A=84=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Size/index.vue | 48 +++++++++++++++++++------------ components/styles/cover.less | 15 ++++++++++ dist/vue-lcd-engine.cjs.js | 18 +++++++----- dist/vue-lcd-engine.cjs.min.js | 2 +- dist/vue-lcd-engine.esm.js | 20 +++++++------ dist/vue-lcd-engine.esm.min.js | 2 +- dist/vue-lcd-engine.global.js | 18 +++++++----- dist/vue-lcd-engine.global.min.js | 2 +- package.json | 2 +- 9 files changed, 83 insertions(+), 44 deletions(-) diff --git a/components/Size/index.vue b/components/Size/index.vue index d94cd2b..30748d8 100644 --- a/components/Size/index.vue +++ b/components/Size/index.vue @@ -1,26 +1,26 @@