diff --git a/package.json b/package.json
index 08e817c..3b7c333 100644
--- a/package.json
+++ b/package.json
@@ -39,9 +39,14 @@
"js-base64": "^3.6.1",
"js-cookie": "^2.2.1",
"jszip-utils": "^0.1.0",
+ "less": "^4.0.0",
+ "fontfaceobserver": "^2.1.0",
+ "less-loader": "^5.0.0",
"lodash": "^4.17.19",
"moment": "^2.29.1",
"node-sass": "^6.0.1",
+ "hotkeys-js": "^3.8.8",
+ "lodash-es": "^4.17.21",
"pdfjs-dist": "^2.6.347",
"pizzip": "^3.1.1",
"qs": "^6.9.4",
@@ -55,6 +60,7 @@
"tui-color-picker": "^2.2.8",
"tui-image-editor": "^3.15.3",
"v-tooltip": "^2.1.3",
+ "view-design": "^4.7.0",
"vue": "^2.6.11",
"vue-chat-scroll": "^1.4.0",
"vue-clipboard2": "^0.3.3",
diff --git a/src/assets/fonts/cn/华康金刚黑.ttf b/src/assets/fonts/cn/华康金刚黑.ttf
new file mode 100644
index 0000000..c0f598b
Binary files /dev/null and b/src/assets/fonts/cn/华康金刚黑.ttf differ
diff --git a/src/assets/fonts/cn/汉体.ttf b/src/assets/fonts/cn/汉体.ttf
new file mode 100644
index 0000000..3729151
Binary files /dev/null and b/src/assets/fonts/cn/汉体.ttf differ
diff --git a/src/assets/fonts/font.css b/src/assets/fonts/font.css
new file mode 100644
index 0000000..5a7db78
--- /dev/null
+++ b/src/assets/fonts/font.css
@@ -0,0 +1,29 @@
+@font-face{
+ font-family: '汉体';
+ src : url('./cn/汉体.ttf');
+}
+
+@font-face{
+ font-family: '华康金刚黑';
+ src : url('./cn/华康金刚黑.ttf');
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/fonts/font.js b/src/assets/fonts/font.js
new file mode 100644
index 0000000..6150bd5
--- /dev/null
+++ b/src/assets/fonts/font.js
@@ -0,0 +1,22 @@
+/*
+ * @Author: 秦少卫
+ * @Date: 2022-09-05 22:54:14
+ * @LastEditors: 秦少卫
+ * @LastEditTime: 2022-09-05 22:59:30
+ * @Description: 字体文件列表
+ */
+
+const cnList = [
+ {
+ 'name': '汉体',
+ 'fontFamily': '汉体'
+ },
+ {
+ 'name': '华康金刚黑',
+ 'fontFamily': '华康金刚黑'
+ }
+]
+
+const enList = []
+
+export default [...cnList, ...enList]
diff --git a/src/assets/img/os.png b/src/assets/img/os.png
new file mode 100644
index 0000000..9b13fb2
Binary files /dev/null and b/src/assets/img/os.png differ
diff --git a/src/components/360View/img-editor.vue b/src/components/360View/img-editor.vue
index de3543a..e91e934 100644
--- a/src/components/360View/img-editor.vue
+++ b/src/components/360View/img-editor.vue
@@ -9,178 +9,15 @@
class="img-editor"
@closed="closeDialog"
>
-
-
-
-
- {{ $t('cancel') }}
- {{ $t('confirm') }}
-
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute copy.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute copy.vue
new file mode 100644
index 0000000..ce29ce3
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute copy.vue
@@ -0,0 +1,404 @@
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute.vue
new file mode 100644
index 0000000..6b7a3da
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute.vue
@@ -0,0 +1,287 @@
+
+
+
+
+
外观
+
+
+ changeCommon(value,'angle')"
+ />
+
+
+ changeCommon(value,'left')"
+ />
+
+
+ changeCommon(value,'top')"
+ />
+
+
+ 透明
+ changeCommon(value,'opacity')"
+ />
+
+
+
中划
+
+
+ changeCommon(value,'strokeWidth')"
+ />
+
+
+ changeCommon('stroke', value)"
+ />
+
+
+
+
阴影
+
+
+ changeShadow('color', value)"
+ />
+
+
+ changeShadow('blur', value)"
+ />
+
+
+ changeShadow('offsetX', value)"
+ />
+
+
+ changeShadow('offsetY', value)"
+ />
+
+
+
+
+
+
+ 图片滤镜
+
+
+
+
+
+
+
+
+
+ 其他属性
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue
new file mode 100644
index 0000000..ff1f8a4
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue
@@ -0,0 +1,149 @@
+
+
+
背景
+
+

setBgImg(e.target)"
+ >
+

setBgImg(e.target)"
+ >
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue
new file mode 100644
index 0000000..f6acdb2
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue
@@ -0,0 +1,39 @@
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/centerAlign.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/centerAlign.vue
new file mode 100644
index 0000000..e8582ac
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/centerAlign.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/clone.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/clone.vue
new file mode 100644
index 0000000..9de9b29
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/clone.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/del.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/del.vue
new file mode 100644
index 0000000..1f8eecc
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/del.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/flip.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/flip.vue
new file mode 100644
index 0000000..829e444
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/flip.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/group.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/group.vue
new file mode 100644
index 0000000..18848ca
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/group.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/history.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/history.vue
new file mode 100644
index 0000000..f6e908b
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/history.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+ {{ list.length }}
+
+ {{ redoList.length }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importImg.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importImg.vue
new file mode 100644
index 0000000..465c52c
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importImg.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importJSON.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importJSON.vue
new file mode 100644
index 0000000..f1d5450
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importJSON.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importSvg.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importSvg.vue
new file mode 100644
index 0000000..c74b2e8
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importSvg.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+ 字符串
+ 文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importTmpl.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importTmpl.vue
new file mode 100644
index 0000000..b2de73b
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importTmpl.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
标题模板
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue
new file mode 100644
index 0000000..45d82aa
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
图层
+
+
+
+
+ | {{ textType(item.type, item) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/lock.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/lock.vue
new file mode 100644
index 0000000..f5c6420
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/lock.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue
new file mode 100644
index 0000000..8a189f3
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue
@@ -0,0 +1,38 @@
+
+
+ 清空
+ 保存
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue
new file mode 100644
index 0000000..8b484e7
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
尺寸
+
+ 宽度
+
+
+
+ 高度
+
+
+
预设尺寸
+
+
+ {{ item.label }}:{{ item.width }}x{{ item.height }}*{{ item.scale }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgEl.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgEl.vue
new file mode 100644
index 0000000..cde72be
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgEl.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
卡通
+
+
![]()
+
+
+
卡通水果
+
+
![]()
+
+
体育
+
+
![]()
+
+
秋天
+
+
![]()
+
+
计算机
+
+
![]()
+
+
卡通水果
+
+
![]()
+
+
服饰
+
+
![]()
+
+
旗子
+
+
![]()
+
+
树木
+
+
![]()
+
+
食物
+
+
![]()
+
+
服饰
+
+
![]()
+
+
奖牌
+
+
![]()
+
+
商务
+
+
![]()
+
+
活动
+
+
![]()
+
+
卡通水果
+
+
![]()
+
+
复古
+
+
![]()
+
+
卡通
+
+
![]()
+
+
+
动物
+
+
![]()
+
+
+
手绘
+
+
![]()
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.js b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.js
new file mode 100644
index 0000000..1da3fed
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.js
@@ -0,0 +1,15 @@
+/*
+ * @Author: 秦少卫
+ * @Date: 2022-04-20 17:13:36
+ * @LastEditors: 秦少卫
+ * @LastEditTime: 2022-04-20 17:19:46
+ * @Description: file content
+ */
+
+import svgIcon from './index.vue'
+
+export default {
+ install(Vue) {
+ Vue.component(svgIcon.name, svgIcon)
+ }
+}
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.vue
new file mode 100644
index 0000000..42f6975
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue
new file mode 100644
index 0000000..0ad23cb
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue
new file mode 100644
index 0000000..82e62a7
--- /dev/null
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/imgEditorFabric/index.vue b/src/page-subspecialty/views/modules/imgEditorFabric/index.vue
index e3e03f2..6b6f2c7 100644
--- a/src/page-subspecialty/views/modules/imgEditorFabric/index.vue
+++ b/src/page-subspecialty/views/modules/imgEditorFabric/index.vue
@@ -1,13 +1,391 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/utils/eventHandler.js b/src/utils/eventHandler.js
new file mode 100644
index 0000000..973c28c
--- /dev/null
+++ b/src/utils/eventHandler.js
@@ -0,0 +1,33 @@
+/*
+ * @Author: 秦少卫
+ * @Date: 2022-09-03 19:16:55
+ * @LastEditors: 秦少卫
+ * @LastEditTime: 2022-09-04 00:01:00
+ * @Description: 自定义事件
+ */
+
+import EventEmitter from 'events'
+
+class EventHandle extends EventEmitter {
+ init(handler) {
+ this.handler = handler
+ this.handler.on('selection:created', (e) => this._selected(e))
+ this.handler.on('selection:updated', (e) => this._selected(e))
+ this.handler.on('selection:cleared', (e) => this._selected(e))
+ }
+
+ // 暴露单选多选事件
+ _selected(e) {
+ const actives = this.handler.getActiveObjects()
+ if (actives && actives.length === 1) {
+ this.emit('selectOne', actives)
+ } else if (actives && actives.length > 1) {
+ this.mSelectMode = 'multiple'
+ this.emit('selectMultiple', actives)
+ } else {
+ this.emit('selectCancel')
+ }
+ }
+}
+
+export default EventHandle
diff --git a/src/utils/utils.js b/src/utils/utils.js
new file mode 100644
index 0000000..a1c054c
--- /dev/null
+++ b/src/utils/utils.js
@@ -0,0 +1,47 @@
+/*
+ * @Author: 秦少卫
+ * @Date: 2022-09-05 22:21:55
+ * @LastEditors: 秦少卫
+ * @LastEditTime: 2022-09-05 23:00:29
+ * @Description: 工具文件
+ */
+
+import FontFaceObserver from 'fontfaceobserver'
+
+/**
+ * @description: 图片文件转字符串
+ * @param {Blob|File} file 文件
+ * @return {String}
+ */
+export function getImgStr(file) {
+ return new Promise((resolve, reject) => {
+ try {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.onload = () => {
+ resolve(reader.result)
+ };
+ } catch (error) {
+ reject(error)
+ }
+ });
+}
+
+
+/**
+ * @description: 根据json模板下载字体文件
+ * @param {String} str
+ * @return {Promise}
+ */
+export function downFontByJSON(str) {
+ const skipFonts = ['arial', 'Microsoft YaHei']
+ const fontFamilys = JSON.parse(str).objects.filter(item => {
+ // 为text 并且不为包含字体
+ return (item.type.includes('text') && !skipFonts.includes(item.fontFamily))
+ }).map(item => item.fontFamily)
+ const fontFamilysAll = fontFamilys.map(fontName => {
+ const font = new FontFaceObserver(fontName);
+ return font.load(null, 150000)
+ })
+ return Promise.all(fontFamilysAll)
+}
diff --git a/static/js/jquery-3.5.1/jquery.js b/static/js/jquery-3.5.1/jquery.js
new file mode 100644
index 0000000..5093733
--- /dev/null
+++ b/static/js/jquery-3.5.1/jquery.js
@@ -0,0 +1,10872 @@
+/*!
+ * jQuery JavaScript Library v3.5.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2020-05-04T22:49Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML