From 3cd92951fd2a67a02e649a870d100b3e8776ae11 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 11 十二月 2025 17:43:37 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/components/common/RichEditor.vue                                                  |  405 ++++++++++++-----
 admin/src/components/common/UploadFile.vue                                                  |  145 ++++++
 server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java                    |    2 
 server/dmmall_service/src/main/resources/mappers/SystemDictDataMapper.xml                   |    2 
 admin/src/views/business/goodsLabels.vue                                                    |   26 +
 admin/src/components/system/dict/OperaDictDataWindow.vue                                    |   56 ++
 admin/src/components/system/dict/OperaDictWindow.vue                                        |   12 
 admin/src/views/business/labelsBrand.vue                                                    |  120 +++++
 server/dmmall_service/src/main/java/com/doumee/dao/system/model/SystemDictData.java         |    2 
 admin/src/components/business/OperaLabelsZhuanquWindow.vue                                  |  151 ++++++
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java |    5 
 admin/src/components/system/dict/DictDataManagerWindow.vue                                  |   72 ++
 admin/src/views/business/goodsBrand.vue                                                     |   26 +
 admin/src/views/business/labelsBrandSerial.vue                                              |  139 ++++++
 admin/src/views/business/labelsZhuanqu.vue                                                  |  120 +++++
 15 files changed, 1,126 insertions(+), 157 deletions(-)

diff --git a/admin/src/components/business/OperaLabelsZhuanquWindow.vue b/admin/src/components/business/OperaLabelsZhuanquWindow.vue
new file mode 100644
index 0000000..030d714
--- /dev/null
+++ b/admin/src/components/business/OperaLabelsZhuanquWindow.vue
@@ -0,0 +1,151 @@
+<template>
+  <GlobalAlertWindow
+    v-loading="isUploading"
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix="锛�"  inline>
+      <el-form-item label="鎵�灞炲搧鐗�" prop="parentId" v-if="form.type === 15">
+        <el-select  v-model="form.parentId" placeholder="璇烽�夋嫨鎵�灞炲搧鐗�" >
+          <el-option
+              v-for="item in labels()"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" :maxlength="5" v-trim/>
+      </el-form-item>
+      <el-form-item label="灞曠ず鍥�" prop="imgurlfull">
+        <UploadAvatarImage
+          :file="{ 'imgurlfull': form.imgFullurl, 'imgurl': form.imgurl }"
+          :upload-data="{folder:'labels'}"
+          @uploadSuccess="uploadAvatarSuccess"
+          @uploadEnd="isUploading=false"
+          @uploadBegin="isUploading = true"
+        />
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input type="number" v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input type="textarea" v-model="form.info" placeholder="璇疯緭鍏ュ娉�" :maxlength="200" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalAlertWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+export default {
+  name: 'OperaLabelsWindow',
+  extends: BaseOpera,
+  components: { GlobalAlertWindow, UploadAvatarImage },
+  data () {
+    return {
+      isUploading: false,
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        info: '',
+        type: null,
+        status: '',
+        parentId: null,
+        sortnum: null,
+        imgFullurl: null,
+        imgurl: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        parentId: [{ required: true, message: '璇烽�夋嫨鎵�灞炲搧鐗�'  }],
+        name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', tigger: 'blur' }]
+      }
+    }
+  },
+  inject: ['labels'],
+  created () {
+    this.config({
+      api: '/business/labels',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    open (title, target, type) {
+      this.title = title
+      this.visible = true
+      this.form.imgFullurl =null
+      this.form.imgurl =null
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form.provinceId = ''
+          this.form[this.configData['field.id']] = null
+          this.form.type = type
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+        this.form.type = type
+      })
+    },
+    // 涓婁紶鍥剧墖
+    uploadAvatarSuccess (file) {
+      this.form.imgurl = file.imgurl
+      this.form.imgFullurl = file.imgurlfull
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/alertstyle.scss";
+$image-width: 100px;
+
+::v-deep .el-select {
+    width: 100%;
+    .el-input__inner {
+      width: 100%;
+    }
+  }
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  width: $image-width;
+  height: $image-width;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  line-height: $image-width;
+  text-align: center;
+}
+.avatar {
+  width: $image-width;
+  height: $image-width;
+  display: block;
+}
+</style>
diff --git a/admin/src/components/common/RichEditor.vue b/admin/src/components/common/RichEditor.vue
index b16f776..81249a5 100644
--- a/admin/src/components/common/RichEditor.vue
+++ b/admin/src/components/common/RichEditor.vue
@@ -1,159 +1,318 @@
 <template>
-  <div style="border: 1px solid #ccc;">
-    <Toolbar
-      style="border-bottom: 1px solid #ccc"
-      :editor="editor"
-      :defaultConfig="toolbarConfig"
-      :mode="mode"
-    />
-    <Editor
-      style="height: 300px; overflow-y: hidden;"
-      v-model="content.content"
-      :mode="mode"
-      :defaultConfig="editorConfig"
-      @onCreated="onCreated"
-      @onChange="onChange"
-    />
+  <div :style="styleEditor">
+    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
+    <Editor style="min-height: 80px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="mode"
+            @onCreated="onCreated" @onChange="onChange" />
   </div>
 </template>
- 
+<style src="@wangeditor/editor/dist/css/style.css"></style>
 <script>
+import Vue from 'vue'
 import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
-export default {
-  name: 'RichEditor',
-  components: { Editor, Toolbar },
+import { Loading } from 'element-ui';
+let loadingInstance = null
+export default Vue.extend({
   props: {
-    content: Object
+    richData: { // 鐖剁粍浠朵紶閫掔殑鏁版嵁
+      type: String,
+      default: ''
+    },
+    styleEditor: '',
+    readonly: false, // 鏄惁鍙互杈撳叆
   },
+  name:'RichEditor',
+  components: { Editor, Toolbar },
   data() {
     return {
       editor: null,
       html: '',
-      toolbarConfig: {
-        toolbarKeys: [
-          "headerSelect",
-          "blockquote",
-          "|",
-          "bold",
-          "underline",
-          "italic",
+      toolbarConfig: { // 宸ュ叿鏍忛厤缃�
+        toolbarKeys: this.readonly ? ["fullScreen"]: [ // 鏄剧ず鎸囧畾鐨勮彍鍗曢」
+          "bold", // 绮椾綋
+          "underline", // 涓嬪垝绾�
+          "italic", // 鏂滀綋
+          "through", // 鍒犻櫎绾�
+          "code", // 琛屽唴浠g爜
+          "sub", // 涓嬫爣
+          "sup", // 涓婃爣
+          "clearStyle", // 娓呴櫎鏍煎紡
+          "color", // 瀛椾綋棰滆壊
+          "bgColor", // 鑳屾櫙鑹�
+          "fontSize", // 瀛楀彿
+          "fontFamily", // 瀛椾綋
+          "indent", // 澧炲姞缂╄繘
+          "delIndent", // 鍑忓皯缂╄繘
+          "justifyLeft", // 宸﹀榻�
+          "justifyRight", // 鍙冲榻�
+          "justifyCenter", // 灞呬腑瀵归綈
+          "justifyJustify", // 涓ょ瀵归綈
+          "lineHeight", // 琛岄珮
+          // "viewImageLink", // 鏌ョ湅閾炬帴
+          "divider", // 鍒嗗壊绾�
+          "emotion", // 琛ㄦ儏
+          "insertLink", // 鎻掑叆閾炬帴
+          // "editLink", // 淇敼閾炬帴
+          // "unLink", // 鍙栨秷閾炬帴
+          // "viewLink", // 鏌ョ湅閾炬帴
+          "codeBlock", // 浠g爜鍧�
+          "blockquote", // 寮曠敤
+          "headerSelect", // 鏍囬
+          // "header1", // 鏍囬1
+          // "header2", // 鏍囬2
+          // "header3", // 鏍囬3
+          // "header4", // 鏍囬4
+          // "header5", // 鏍囬5
+          // "todo", // 寰呭姙
+          "redo", // 閲嶅仛
+          "undo", // 鎾ら攢
+          // "enter", // 鍥炶溅
+          // "bulletedList", // 鏃犲簭鍒楄〃
+          // "numberedList", // 鏈夊簭鍒楄〃
+          // "codeSelectLang" // 閫夋嫨璇█
+          // 琛ㄦ牸鍔熻兘鍒嗙粍
+          /* {
+             key: 'table-style', // 蹇呭~锛岃浠� group 寮�澶�
+             title: '琛ㄦ牸', // 蹇呭~
+             // iconSvg: '<svg>....</svg>', // 鍙��
+             menuKeys: [
+               "insertTable", // 鎻掑叆琛ㄦ牸
+               "deleteTable", // 鍒犻櫎琛ㄦ牸
+               "insertTableRow", // 鎻掑叆琛�
+               "deleteTableRow", // 鍒犻櫎琛�
+               "insertTableCol", // 鎻掑叆鍒�
+               "deleteTableCol", // 鍒犻櫎鍒�
+               "tableHeader", // 琛ㄥご
+               "tableFullWidth", // 瀹藉害鑷�傚簲
+             ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+           },*/
+          // 涓婁紶鍥剧墖鍒嗙粍
           {
-              "key": "group-more-style",
-              "title": "鏇村",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M204.8 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M505.6 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M806.4 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path></svg>",
-              "menuKeys": [
-                  "through",
-                  "code",
-                  "sup",
-                  "sub",
-                  "clearStyle"
-              ]
+            key: 'img-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '鍥剧墖', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              "uploadImage", // 涓婁紶鍥剧墖
+              "insertImage", // 缃戠粶鍥剧墖
+              "deleteImage", // 鍒犻櫎鍥剧墖
+              "editImage", // 缂栬緫鍥剧墖
+              "imageWidth30", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮30
+              "imageWidth50", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮50
+              "imageWidth100", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮100
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
           },
-          "color",
-          "bgColor",
-          "|",
-          "fontSize",
-          "fontFamily",
-          "lineHeight",
-          "|",
-          "bulletedList",
-          "numberedList",
-          "todo",
+          // 瑙嗛鍒嗙粍
           {
-              "key": "group-justify",
-              "title": "瀵归綈",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>",
-              "menuKeys": [
-                  "justifyLeft",
-                  "justifyRight",
-                  "justifyCenter",
-                  "justifyJustify"
-              ]
+            key: 'video-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '瑙嗛', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              "insertVideo", // 鎻掑叆缃戠粶瑙嗛
+              "uploadVideo", // 涓婁紶瑙嗛
+              "editVideoSize", // 淇敼瑙嗛灏哄
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
           },
-          {
-              "key": "group-indent",
-              "title": "缂╄繘",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>",
-              "menuKeys": [
-                  "indent",
-                  "delIndent"
-              ]
-          },
-          // "|",
-          "emotion",
-          "insertLink",
-          {
-              "key": "group-image",
-              "title": "鍥剧墖",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>",
-              "menuKeys": [
-                  "insertImage",
-                  "uploadImage"
-              ]
-          },
-          "insertTable",
-          "codeBlock",
-          "divider",
-          "|",
-          "undo",
-          "redo",
-          "|",
-          "fullScreen"
-        ]
+          "fullScreen", // 鍏ㄥ睆
+        ],
+        excludeKeys: [ // 闅愯棌鎸囧畾鐨勮彍鍗曢」
+          // 'headerSelect',
+          // 'video-style'
+          // 鎺掗櫎鑿滃崟缁勶紝鍐欒彍鍗曠粍 key 鐨勫�煎嵆鍙�
+        ],
+
       },
-      editorConfig: {
+      editorConfig: { // 缂栬緫鍣ㄩ厤缃�
         placeholder: '璇疯緭鍏ュ唴瀹�...',
+        readOnly: this.readonly, // 鏄惁鍙锛岄粯璁alse
+        autoFocus: false, // 鏄惁鑷姩focus锛岄粯璁や负true
+        scroll: true, // 閰嶇疆缂栬緫鍣ㄦ槸鍚︽敮鎸佹粴鍔紝榛樿涓� true 銆傛敞鎰忥紝姝ゆ椂涓嶈鍥哄畾 editor-container 鐨勯珮搴︼紝璁剧疆涓�涓� min-height 鍗冲彲銆�
+        maxLength: 20000, // 鏈�澶ч檺鍒讹紝閬垮厤鍐呭杩囧鍗¢】
         MENU_CONF: {
+          // 鍥剧墖涓婁紶
           uploadImage: {
-            // server: '/api/upload',
-            name: 'file',
-            server: process.env.VUE_APP_API_PREFIX + '/public/uploadPicture',
+            server: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload?folder=richeditor',
+            fieldName: 'file',
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 2M
+            maxFileSize: 10 * 1024 * 1024, // 10M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 100
+            maxNumberOfFiles: 10,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['image/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['image/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
             meta: {
-              folder: 'znzz/project_file'
             },
-            onBeforeUpload(file) {    // JS 璇硶
-              // file 閫変腑鐨勬枃浠讹紝鏍煎紡濡� { key: file }
-              // debugger
-              return file
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+            // 鑷畾涔夊鍔� http  header
+            // headers: { Authorization: "Bearer " + getToken() },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉�
+            timeout: 10 * 1000, //10 绉�
+            // 涓婁紶鍓�
+            onBeforeUpload(files) {
+              loadingInstance = Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              });
+              return files;
             },
+            // 鑷畾涔夋彃鍏ュ浘鐗�
+            customInsert(res, insertFn) {
+              console.log(res);
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              loadingInstance = Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              }).close();
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.data.url, res.data.originname, res.data.imgname);
+            },
+
+            // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
             onSuccess(file, res) {
-                console.log(`${file.name} 涓婁紶鎴愬姛`, res)
+              console.log(`${file.originalFilename} 涓婁紶鎴愬姛`, res);
             },
+            // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            onFailed(file, res) {
+              console.log(`${file.originalFilename} 涓婁紶澶辫触`, res);
+              loadingInstance.close();
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress(progress) {
+              console.log('progress', progress);
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
             onError(file, err, res) {
-              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res)
-            },
+              loadingInstance.close();
+              console.log(`${file.originalFilename} 涓婁紶鍑洪敊`, err, res);
+            }
           },
-          
+          // 瑙嗛涓婁紶
+          uploadVideo: {
+            fieldName: 'file',
+            server: process.env.VUE_APP_API_PREFIX + '/public/upload?folder=richeditor',
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 10M
+            maxFileSize: 50 * 1024 * 1024, // 50M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 5
+            maxNumberOfFiles: 3,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['video/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['video/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+            meta: {
+              // token: 'xxx',
+              // otherKey: 'yyy'
+            },
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+
+            // 鑷畾涔夊鍔� http  header
+            headers: {
+              // Authorization: "Bearer " + getToken()
+              // otherKey: 'xxx'
+            },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 30 绉�
+            timeout: 1000 * 1000, // 1000 绉�,
+            // 涓婁紶涔嬪墠瑙﹀彂
+            onBeforeUpload(file) {
+              return file;
+            },
+            // 鑷畾涔夋彃鍏ヨ棰�
+            customInsert(res, insertFn) {
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              // Message.closeAll();
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.data.url, res.data.url);
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress(progress) {
+              console.log(progress);
+              // onProgress(progress) {       // JS 璇硶
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+            // onSuccess(file, res) {
+            //   console.log(`${file.name} 涓婁紶鎴愬姛`, res);
+            //   this.successMsg(file);
+            // },
+            // // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            // onFailed(file, res) {
+            //   console.log(`${file.name} 涓婁紶澶辫触`, res);
+            //   this.errorMsg(file);
+            // },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+            onError(file, err, res) {
+              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res);
+              // Notification.error({
+              //     title: '閿欒',
+              //     message: `${file.name} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+              // });
+            }
+          }
         }
       },
       mode: 'default', // or 'simple'
     }
   },
-  
-  
+  watch: {
+    richData: function (value) {
+      this.html = value
+    },
+    readonly: function (value) {
+      this.readonly = value
+    },
+    styleEditor: function (value) {
+      this.styleEditor = value
+    },
+  },
+  mounted() {
+    // 闇�瑕佸湪缂栬緫鍣ㄥ垱寤哄畬姣曞悗鍦ㄨ祴鍊�
+    this.$nextTick(()=>{
+      this.html = this.richData
+    })
+  },
+  methods: {
+    // 缂栬緫鍣ㄥ垱寤哄畬姣曟椂鐨勫洖璋冨嚱鏁�
+    onCreated(editor) {
+      this.editor = Object.seal(editor) // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊
+    },
+    // 缂栬緫鍣ㄥ唴瀹广�侀�夊尯鍙樺寲鏃剁殑鍥炶皟鍑芥暟
+    onChange(editor) {
+      this.$emit('getWangedditor', editor.getHtml())
+      console.log("onChange", editor.getHtml()); // onChange 鏃惰幏鍙栫紪杈戝櫒鏈�鏂板唴瀹�
+    },
+  },
   beforeDestroy() {
+    // 缂栬緫鍣ㄩ攢姣佹椂鐨勫洖璋冨嚱鏁般�傝皟鐢� editor.destroy() 鍗冲彲閿�姣佺紪杈戝櫒
     const editor = this.editor
     if (editor == null) return
     editor.destroy() // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒
-  },
-  methods: {
-    onCreated (editor) {
-      this.editor = Object.seal(editor)
-    },
-    onChange (editor) {
-      // debugger
-      this.$emit('edit', this.content.content)
-      // this.value = this.html
-      // console.log(this.content);
-    },
-   
-    // onBlur (editor) {
-    //   console.log('onBlur', editor)
-    //   this.$emit('edit', this.html)
-    // },
-  },
-  
-}
+  }
+})
 </script>
-
-<style src="@wangeditor/editor/dist/css/style.css"></style>
\ No newline at end of file
+<style lang="scss">
+</style>>
diff --git a/admin/src/components/common/UploadFile.vue b/admin/src/components/common/UploadFile.vue
new file mode 100644
index 0000000..180ca08
--- /dev/null
+++ b/admin/src/components/common/UploadFile.vue
@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <el-upload
+      class="upload-demo"
+      :accept="uploadData.fileType"
+      :action="uploadImgUrl"
+      :limit="this.fileLength"
+      :on-exceed="handleExceed"
+      :on-success="handleFileSuccess"
+      :on-error="uploadError"
+      :before-upload="beforeFileUpload"
+      :file-list="fileList">
+    <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+    <div slot="tip" class="el-upload__tip"  >
+      鍙兘涓婁紶{{ this.fileLength }}涓枃浠�,
+      {{uploadData.fileType?('鍙敮鎸佷笂浼犮��'+uploadData.fileType+'銆戠被鍨嬫枃浠�'):''}}
+      鏂囦欢澶у皬涓嶈兘瓒呰繃30MB,
+      鏁伴噺瓒呰繃璇峰垹闄ゅ凡浼犻檮浠堕噸鏂颁笂浼�
+     </div>
+  </el-upload>
+  </div>
+
+</template>
+
+<script>
+export default {
+  props: {
+    file: {
+      type: Object,
+      default: () => {}
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+    default: 'width: 190px; height: 190px;'
+    },
+    fileLength:{
+      type: Number,
+      default: () => 1
+    },
+    uploadData: Object
+  },
+  data() {
+    return {
+      fileList: [],
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload?folder='+this.uploadData.folder
+    }
+  },
+
+  methods: {
+    // 涓婁紶鍥剧墖
+    handleExceed(){
+      if(this.fileList && this.fileList.length >= this.fileLength){
+        this.$message.error('鍙厑璁镐笂浼犮��'+this.fileLength+'涓檮浠躲��')
+      }
+    },
+    handleFileSuccess(res, file) {
+      if (res.code == 200) {
+        let { data } = res
+        this.fileList = [{name: data.originname, url: data.url }]
+        this.$message.success('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { fileurl: data.imgaddr, fileurlFull: data.url, name: data.originname,fileSize:data.fileSize })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError() {
+      this.$message.error('涓婁紶澶辫触')
+      this.$emit('uploadEnd')
+    },
+    //
+    beforeFileUpload(file) {
+      if(this.fileList && this.fileList.length >= this.fileLength){
+        this.$message.error('鍙厑璁镐笂浼犮��'+this.fileLength+'涓枃浠躲��')
+        return false;
+      }
+      const isLt2M = file.size / 1024 / 1024 <= 30; // 妫�鏌ユ枃浠跺ぇ灏忔槸鍚﹀皬浜�30MB
+      if (!isLt2M) {
+        this.$message.error('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 30MB!');
+        return false; // 涓嶅厑璁镐笂浼犺秴杩囨寚瀹氬ぇ灏忕殑鏂囦欢
+      }
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$image-width: 100px;
+$image-height: 30px;
+.avatar-uploader {
+  width: 100px;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  width: $image-width;
+  height: $image-height;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-height;
+  text-align: center;
+}
+.avatar {
+  width: $image-width;
+  height: $image-height;
+  display: block;
+}
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 500px !important;
+  height: 30px !important;
+}
+</style>
diff --git a/admin/src/components/system/dict/DictDataManagerWindow.vue b/admin/src/components/system/dict/DictDataManagerWindow.vue
index bbad831..d4ea888 100644
--- a/admin/src/components/system/dict/DictDataManagerWindow.vue
+++ b/admin/src/components/system/dict/DictDataManagerWindow.vue
@@ -1,9 +1,9 @@
 <template>
   <GlobalWindow
-    :title="dictName + '鏁版嵁绠$悊'"
-    width="78%"
-    :visible.sync="visible"
-    :with-footer="false"
+      :title="dictName + '鏁版嵁绠$悊'"
+      width="78%"
+      :visible.sync="visible"
+      :with-footer="false"
   >
     <TableLayout :with-breadcrumb="false">
       <!-- 琛ㄦ牸鍜屽垎椤� -->
@@ -13,14 +13,22 @@
           <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete">鍒犻櫎</el-button></li>
         </ul>
         <el-table
-          v-loading="isWorking.search"
-          :data="tableData.list"
-          stripe
-          @selection-change="handleSelectionChange"
+            v-loading="isWorking.search"
+            :data="tableData.list"
+            stripe
+            class="no-scroll"
+            @selection-change="handleSelectionChange"
         >
           <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column prop="label" label="鏁版嵁鏍囩" min-width="100px"></el-table-column>
-          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px"></el-table-column>
+          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px">
+            <template slot-scope="{row}">
+              <div v-if="row.code || row.code.length>500" >
+                <el-button type="text" @click="showCode(row)" >鐐瑰嚮鏌ョ湅</el-button>
+              </div>
+              <div v-else>{{row.code}}</div>
+            </template>
+          </el-table-column>
           <el-table-column prop="disabled" label="鐘舵��" min-width="100px">
             <template slot-scope="{row}">{{row.disabled | disabledText}}</template>
           </el-table-column>
@@ -30,27 +38,44 @@
           <el-table-column prop="updateUser" label="鏇存柊浜�" min-width="100px">
             <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
           </el-table-column>
+          <el-table-column prop="remark" label="璇存槑" min-width="100px"></el-table-column>
           <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
           <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
           <el-table-column
-            label="鎿嶄綔"
-            min-width="120"
-            fixed="right"
+              label="鎿嶄綔"
+              min-width="120"
+              fixed="right"
           >
             <template slot-scope="{row}">
-              <el-button type="text" @click="$refs.operaDictDataWindow.open('缂栬緫瀛楀吀鏁版嵁', dictId, row)" icon="el-icon-edit">缂栬緫</el-button>
+              <el-button type="text" @click="$refs.operaDictDataWindow.open('缂栬緫瀛楀吀鏁版嵁', searchForm.dictId, row)" icon="el-icon-edit">缂栬緫</el-button>
               <el-button type="text" @click="deleteById(row)" icon="el-icon-delete">鍒犻櫎</el-button>
             </template>
           </el-table-column>
         </el-table>
         <pagination
-          @size-change="handleSizeChange"
-          @current-change="handlePageChange"
-          :pagination="tableData.pagination"
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :pagination="tableData.pagination"
         ></pagination>
       </template>
       <!-- 鏂板缓/淇敼 -->
       <OperaDictDataWindow ref="operaDictDataWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
+
+      <el-dialog
+          class="center-title"
+          title="瀛楀吀鍊�"
+          width="70%"
+          height="70%"
+          text="瀛楀吀鍊�"
+          :visible.sync="visible1"
+          append-to-body
+      >
+        <div class="agree-list"  v-html="agreement">
+        </div>
+        <template  v-slot:footer>
+          <el-button @click="visible1=false">杩斿洖</el-button>
+        </template>
+      </el-dialog>
     </TableLayout>
   </GlobalWindow>
 </template>
@@ -68,6 +93,8 @@
   data () {
     return {
       visible: false,
+      visible1: false,
+      agreement: '',
       searchForm: {
         // 瀛楀吀ID
         dictId: null
@@ -83,6 +110,10 @@
       this.dictName = dictName
       this.visible = true
       this.search()
+    },
+    showCode(row){
+      this.agreement=row.code
+      this.visible1=true
     }
   },
   created () {
@@ -95,6 +126,14 @@
 </script>
 
 <style scoped lang="scss">
+.agree-list{
+  height: 550px;
+  //max-height: 50%;
+  overflow: auto;
+}
+.no-scroll {
+  overflow: hidden !important;
+}
 /deep/ .window__body {
   .table-content {
     padding: 0;
@@ -102,5 +141,6 @@
       padding-top: 0;
     }
   }
+
 }
 </style>
diff --git a/admin/src/components/system/dict/OperaDictDataWindow.vue b/admin/src/components/system/dict/OperaDictDataWindow.vue
index 79f51da..1d9970e 100644
--- a/admin/src/components/system/dict/OperaDictDataWindow.vue
+++ b/admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -1,42 +1,65 @@
 <template>
-  <GlobalAlertWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking.create"
-    @confirm="confirm"
+  <GlobalWindow
+      :title="title"
+      :visible.sync="visible"
+      :confirm-working="isWorking.create"
+      @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鏁版嵁璇存槑" prop="label" required>
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ユ暟鎹鏄�" v-trim/>
+      </el-form-item>
       <el-form-item label="鏁版嵁鏍囩" prop="label" required>
-        <el-input v-model="form.label" placeholder="璇疯緭鍏ユ暟鎹爣绛�" v-trim maxlength="50"/>
+        <el-input v-model="form.label" placeholder="璇疯緭鍏ユ暟鎹爣绛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁瀵屾枃鏈�" prop="istext" >
+        <el-radio-group v-model="form.istext">
+          <el-radio :label="0" value="0">鏂囨湰</el-radio>
+          <el-radio :label="1" value="1">鍥剧墖|鏂囦欢</el-radio>
+          <el-radio :label="2" value="2">瀵屾枃鏈�</el-radio>
+        </el-radio-group>
+<!--        <el-switch v-model="form.istext" :active-value="true" :inactive-value="false"/>
+        <span class="status-text">{{form.istext | disabledText1}}</span>-->
       </el-form-item>
       <el-form-item label="鏁版嵁鍊�" prop="code" required>
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim maxlength="50"/>
+        <template  v-if="form.istext == 1" >
+          <UploadFile :uploadData="{ folder: 'richeditor',fileType:'' }" :fileList="fileList" @uploadSuccess="fileUploaded" />
+          <el-input  readonly v-model="form.code" placeholder="瀹屾暣鏁版嵁鍊�" v-trim/>
+        </template>
+        <RichEditor v-if="form.istext == 2"  :richData="form.code" :styleEditor="styleEditor" @getWangedditor="getWangedditor" :readonly="false"/>
+        <el-input v-if="form.istext == 0"  v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim/>
       </el-form-item>
       <el-form-item label="鐘舵��" prop="disabled" required class="form-item-status">
         <el-switch v-model="form.disabled" :active-value="false" :inactive-value="true"/>
         <span class="status-text">{{form.disabled | disabledText}}</span>
       </el-form-item>
     </el-form>
-  </GlobalAlertWindow>
+  </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
-import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import RichEditor from '@/components/common/RichEditor'
+import UploadFile from "@/components/common/UploadFile"
 export default {
   name: 'OperaDictDataWindow',
   extends: BaseOpera,
-  components: { GlobalAlertWindow },
+  components: {UploadFile, GlobalWindow,RichEditor },
   data () {
     return {
       // 琛ㄥ崟鏁版嵁
+      styleEditor:'border: 1px solid #ccc;display: inline-block;',
       form: {
         id: null,
         dictId: null,
         code: '',
         label: '',
-        disabled: false
+        disabled: false,
+        istext: 0,
+        remark: ''
       },
+      fileList: [],
       // 楠岃瘉瑙勫垯
       rules: {
         label: [
@@ -49,6 +72,12 @@
     }
   },
   methods: {
+    fileUploaded(data){
+      this.form.code = data.fileurlFull
+    },
+    getWangedditor(val){
+      this.form.code =val
+    },
     /**
      * @title 绐楀彛鏍囬
      * @dict 鎵�灞炲瓧鍏窱D
@@ -57,12 +86,15 @@
     open (title, dictId, target) {
       this.title = title
       this.visible = true
+
+      this.form.istext = 0
       // 鏂板缓
       if (target == null) {
         this.$nextTick(() => {
           this.$refs.form.resetFields()
           this.form.id = null
           this.form.dictId = dictId
+          this.form.istext=0
         })
         return
       }
@@ -70,6 +102,8 @@
       this.$nextTick(() => {
         for (const key in this.form) {
           this.form[key] = target[key]
+          this.form.dictId = dictId
+          this.form.istext = 0
         }
       })
     }
diff --git a/admin/src/components/system/dict/OperaDictWindow.vue b/admin/src/components/system/dict/OperaDictWindow.vue
index 82fcf54..2124d48 100644
--- a/admin/src/components/system/dict/OperaDictWindow.vue
+++ b/admin/src/components/system/dict/OperaDictWindow.vue
@@ -1,5 +1,5 @@
 <template>
-  <GlobalAlertWindow
+  <GlobalWindow
     :title="title"
     :visible.sync="visible"
     :confirm-working="isWorking"
@@ -7,25 +7,25 @@
   >
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="瀛楀吀缂栫爜" prop="code" required>
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ瓧鍏哥紪鐮�" v-trim maxlength="50"/>
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ瓧鍏哥紪鐮�" v-trim />
       </el-form-item>
       <el-form-item label="瀛楀吀鍚嶇О" prop="name" required>
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" v-trim maxlength="50"/>
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" v-trim />
       </el-form-item>
       <el-form-item label="澶囨敞" prop="remark">
         <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" :rows="3" v-trim maxlength="500"/>
       </el-form-item>
     </el-form>
-  </GlobalAlertWindow>
+  </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
-import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+import GlobalWindow from '@/components/common/GlobalWindow'
 export default {
   name: 'OperaDictWindow',
   extends: BaseOpera,
-  components: { GlobalAlertWindow },
+  components: { GlobalWindow },
   data () {
     return {
       // 琛ㄥ崟鏁版嵁
diff --git a/admin/src/views/business/goodsBrand.vue b/admin/src/views/business/goodsBrand.vue
index 47cba60..618d955 100644
--- a/admin/src/views/business/goodsBrand.vue
+++ b/admin/src/views/business/goodsBrand.vue
@@ -49,6 +49,18 @@
         <el-table-column prop="name" label="鍝佺墝鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column prop="sortnum" label="鎺掑簭鐮�(鍗囧簭)" min-width="100px"></el-table-column>
         <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <el-switch
+                v-model="row.status"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="statusChange(row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
         <el-table-column
           v-if="containPermissions(['business:productlabel:update', 'business:productlabel:delete'])"
           label="鎿嶄綔"
@@ -101,6 +113,20 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    statusChange (row) {
+      this.api.updateById({ id: row.id, status: row.status })
+        .then(() => {
+          this.$message.success('鎿嶄綔鎴愬姛')
+        })
+        .catch(e => {
+          this.$message.error('鎿嶄綔鎴愬姛')
+        })
+        .then(() => {
+          this.handlePageChange()
+        })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/goodsLabels.vue b/admin/src/views/business/goodsLabels.vue
index 5395235..3d5adef 100644
--- a/admin/src/views/business/goodsLabels.vue
+++ b/admin/src/views/business/goodsLabels.vue
@@ -49,6 +49,18 @@
         <el-table-column prop="name" label="鍒嗙被鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column prop="sortnum" label="鎺掑簭鐮�(鍗囧簭)" min-width="100px"></el-table-column>
         <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <el-switch
+                v-model="row.status"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="statusChange(row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
         <el-table-column
           v-if="containPermissions(['business:productlabel:update', 'business:productlabel:delete'])"
           label="鎿嶄綔"
@@ -101,6 +113,20 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    statusChange (row) {
+      this.api.updateById({ id: row.id, status: row.status })
+          .then(() => {
+            this.$message.success('鎿嶄綔鎴愬姛')
+          })
+          .catch(e => {
+            this.$message.error('鎿嶄綔鎴愬姛')
+          })
+          .then(() => {
+            this.handlePageChange()
+          })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/labelsBrand.vue b/admin/src/views/business/labelsBrand.vue
new file mode 100644
index 0000000..4bf835b
--- /dev/null
+++ b/admin/src/views/business/labelsBrand.vue
@@ -0,0 +1,120 @@
+<template>
+  <TableLayout :permissions="['business:labels:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="閫傜敤鍝佺墝鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ラ�傜敤鍝佺墝鍚嶇О" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:labels:create', 'business:labels:delete']">
+        <li><el-button type="primary" @click="$refs.operaLabelsWindow.open('鏂板缓閫傜敤鍝佺墝淇℃伅琛�',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:labels:create']">鏂板缓</el-button></li>
+        <li><el-button  type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="閫傜敤鍝佺墝鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="imgurlfull" label="灞曠ず鍥�" align="center" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image style="max-width: 100px;max-height: 50px;" v-if="row.imgFullurl" :src="row.imgFullurl" :preview-src-list="[row.imgFullurl]"></el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞椂闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <el-switch
+                v-model="row.status"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="statusChange(row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:labels:update', 'business:labels:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaLabelsWindow.open('缂栬緫閫傜敤鍝佺墝淇℃伅琛�', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:labels:update']">缂栬緫</el-button>
+            <el-button style="color: red" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaLabelsWindow ref="operaLabelsWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaLabelsWindow from '@/components/business/OperaLabelsZhuanquWindow'
+import { updateById } from '@/api/business/goods'
+export default {
+  name: 'Labels',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaLabelsWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: 14
+      },
+      labels: []
+    }
+  },
+  provide () {
+    return {
+      labels: () => this.labels
+    }
+  },
+  created () {
+    this.config({
+      module: '閫傜敤鍝佺墝淇℃伅琛�',
+      api: '/business/labels',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    statusChange (row) {
+      this.api.updateById({ id: row.id, status: row.status })
+        .then(() => {
+          this.$message.success('鎿嶄綔鎴愬姛')
+        })
+        .catch(e => {
+          this.$message.error('鎿嶄綔鎴愬姛')
+        })
+        .then(() => {
+          this.handlePageChange()
+        })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/labelsBrandSerial.vue b/admin/src/views/business/labelsBrandSerial.vue
new file mode 100644
index 0000000..8fe7763
--- /dev/null
+++ b/admin/src/views/business/labelsBrandSerial.vue
@@ -0,0 +1,139 @@
+<template>
+  <TableLayout :permissions="['business:labels:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="鍝佺墝绯诲垪鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ搧鐗岀郴鍒楀悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵�灞炲搧鐗�" prop="parentId">
+        <el-select  v-model="searchForm.parentId"  placeholder="璇烽�夋嫨鎵�灞炲搧鐗�" @change="search" >
+          <el-option
+              v-for="item in labels"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:labels:create', 'business:labels:delete']">
+        <li><el-button type="primary" @click="$refs.operaLabelsWindow.open('鏂板缓鍝佺墝绯诲垪淇℃伅琛�',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:labels:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger"  @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍝佺墝绯诲垪鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鎵�灞炲搧鐗�" min-width="100px"></el-table-column>
+        <el-table-column prop="imgurlfull" label="灞曠ず鍥�" align="center" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image style="max-width: 100px;max-height: 50px;" v-if="row.imgFullurl" :src="row.imgFullurl" :preview-src-list="[row.imgFullurl]"></el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞椂闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <el-switch
+                v-model="row.status"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="statusChange(row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:labels:update', 'business:labels:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaLabelsWindow.open('缂栬緫鍝佺墝绯诲垪淇℃伅琛�', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:labels:update']">缂栬緫</el-button>
+            <el-button style="color: red" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaLabelsWindow ref="operaLabelsWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaLabelsWindow from '@/components/business/OperaLabelsZhuanquWindow'
+import { findAll as labelList } from '@/api/business/labels'
+export default {
+  name: 'Labels',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaLabelsWindow },
+  data () {
+    return {
+      // 鎼滅储
+      labels: [],
+      searchForm: {
+        name: '',
+        parentId: null,
+        type: 15
+      }
+    }
+  },
+  provide() {
+    return {
+      labels: () => this.labels
+    }
+  },
+  created () {
+    this.config({
+      module: '鍝佺墝绯诲垪淇℃伅琛�',
+      api: '/business/labels',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.loadLabels()
+    this.search()
+  },
+  methods: {
+    loadLabels () {
+      labelList({type: 14})
+        .then(res => {
+          this.labels = res
+        })
+    },
+    statusChange (row) {
+      this.api.updateById({ id: row.id, status: row.status })
+          .then(() => {
+            this.$message.success('鎿嶄綔鎴愬姛')
+          })
+          .catch(e => {
+            this.$message.error('鎿嶄綔鎴愬姛')
+          })
+          .then(() => {
+            this.handlePageChange()
+          })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/labelsZhuanqu.vue b/admin/src/views/business/labelsZhuanqu.vue
new file mode 100644
index 0000000..f89c5ea
--- /dev/null
+++ b/admin/src/views/business/labelsZhuanqu.vue
@@ -0,0 +1,120 @@
+<template>
+  <TableLayout :permissions="['business:labels:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓撳尯鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:labels:create', 'business:labels:delete']">
+        <li><el-button type="primary" @click="$refs.operaLabelsWindow.open('鏂板缓涓撳尯淇℃伅琛�',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:labels:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="涓撳尯鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="imgurlfull" label="灞曠ず鍥�" align="center" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image v-if="row.imgFullurl" style="max-width: 100px;max-height: 50px;" :src="row.imgFullurl" :preview-src-list="[row.imgFullurl]"></el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="goodsNum" label="鍟嗗搧鏁伴噺" align="center" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞椂闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <el-switch
+                v-model="row.status"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="statusChange(row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:labels:update', 'business:labels:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaLabelsWindow.open('缂栬緫涓撳尯淇℃伅琛�', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:labels:update']">缂栬緫</el-button>
+            <el-button style="color: red" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:labels:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaLabelsWindow ref="operaLabelsWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaLabelsWindow from '@/components/business/OperaLabelsZhuanquWindow'
+export default {
+  name: 'Labels',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaLabelsWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: 12
+      },
+      labels:[]
+    }
+  },
+  provide() {
+    return {
+      labels: () => this.labels
+    }
+  },
+  created () {
+    this.config({
+      module: '涓撳尯淇℃伅琛�',
+      api: '/business/labels',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    statusChange (row) {
+      this.api.updateById({ id: row.id, status: row.status })
+          .then(() => {
+            this.$message.success('鎿嶄綔鎴愬姛')
+          })
+          .catch(e => {
+            this.$message.error('鎿嶄綔鎴愬姛')
+          })
+          .then(() => {
+            this.handlePageChange()
+          })
+    }
+  },
+}
+</script>
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
index b6c6489..0bf6c47 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -17,6 +17,8 @@
     public static final int TWO = 2 ;
     public static final int THREE = 3 ;
     public static final int FOUR = 4 ;
+    public static final String LABELS_IMG ="LABELS_IMG" ;
+
     /**
      * mq tag
      */
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/system/model/SystemDictData.java b/server/dmmall_service/src/main/java/com/doumee/dao/system/model/SystemDictData.java
index e7c60cf..a28f058 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/system/model/SystemDictData.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/system/model/SystemDictData.java
@@ -33,6 +33,8 @@
     @ApiModelProperty(value = "鏁版嵁鍊�")
     @NotBlank(message = "鏁版嵁鍊间笉鑳戒负绌�", groups = {OperaType.Create.class, OperaType.Update.class})
     private String code;
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
 
     @ApiModelProperty(value = "鏁版嵁鏍囩")
     @NotBlank(message = "鏁版嵁鏍囩涓嶈兘涓虹┖", groups = {OperaType.Create.class, OperaType.Update.class})
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
index 691b616..e53c5a4 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
@@ -290,12 +290,17 @@
         IPage<Labels> result =  labelsJoinMapper.selectJoinPage(page,Labels.class, queryWrapper);
      /*   String resourcePath=systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode();*/
         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(result.getRecords())){
+            String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.OSS,Constants.LABELS_IMG).getCode();
             for(Labels model:result.getRecords()){
                if(model.getParentId()==null){
                    model.setTypeLevel(0);
                }else{
                    model.setTypeLevel(1);
                }
+               if(StringUtils.isNotBlank(model.getImgurl())){
+                   model.setImgFullurl(path + model.getImgurl());
+               }
                if(Constants.equalsInteger(model.getType(),Constants.LabelsType.BIG_AREA.getKey())){
                     //濡傛灉鏄ぇ鍖轰俊鎭紝鏌ヨ鎵�鏈夌粦瀹氶鐪佷唤淇℃伅
                     model.setAreaList(areasMapper.selectList(new LambdaQueryWrapper<Areas>()
diff --git a/server/dmmall_service/src/main/resources/mappers/SystemDictDataMapper.xml b/server/dmmall_service/src/main/resources/mappers/SystemDictDataMapper.xml
index 6de601b..c1fbd67 100644
--- a/server/dmmall_service/src/main/resources/mappers/SystemDictDataMapper.xml
+++ b/server/dmmall_service/src/main/resources/mappers/SystemDictDataMapper.xml
@@ -16,7 +16,7 @@
   </resultMap>
   <select id="selectManageList" parameterType="com.doumee.dao.system.dto.QuerySystemDictDataDTO" resultMap="SystemDictDataListVO">
     SELECT
-      dict_data.`ID`, dict_data.`DICT_ID`, dict_data.`CODE`, dict_data.`LABEL`, dict_data.`SORT`, dict_data.`DISABLED`, dict_data.`CREATE_TIME`, dict_data.`UPDATE_TIME`, dict_data.`CREATE_USER`, dict_data.`UPDATE_USER`,
+      dict_data.`ID`, dict_data.`remark`, dict_data.`DICT_ID`, dict_data.`CODE`, dict_data.`LABEL`, dict_data.`SORT`, dict_data.`DISABLED`, dict_data.`CREATE_TIME`, dict_data.`UPDATE_TIME`, dict_data.`CREATE_USER`, dict_data.`UPDATE_USER`,
       create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME,
       update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME
     FROM SYSTEM_DICT_DATA dict_data

--
Gitblit v1.9.3