From bf37344fc209db25e887aee5910108e389605d8c Mon Sep 17 00:00:00 2001
From: Mr.Shi <1878285526@qq.com>
Date: 星期五, 15 九月 2023 18:25:31 +0800
Subject: [PATCH] 企业端

---
 company_admin/src/components/business/OperaStaffWindow.vue      |  162 +++++
 company_admin/package-lock.json                                 |  160 ++--
 company_admin/src/api/business/anchor.js                        |   43 +
 company_admin/src/components/business/selectProductItem.vue     |  183 +++++
 company_admin/src/views/business/anchor.vue                     |  155 +++++
 company_admin/src/components/business/OperaAnchorWindow.vue     |   82 ++
 company_admin/src/components/business/OperaAnchorPassWindow.vue |   95 +++
 company_admin/src/components/business/selectProduct.vue         |  119 +++
 company_admin/src/api/business/page.js                          |   11 
 company_admin/src/components/business/OperaGoodsWindow.vue      |   26 
 company_admin/src/views/business/staff.vue                      |  163 +++++
 company_admin/src/views/system/menu.vue                         |    2 
 company_admin/src/api/business/category.js                      |   15 
 company_admin/src/views/business/category.vue                   |   14 
 company_admin/src/api/business/goods.js                         |   25 
 company_admin/src/views/business/pageConfiguration.vue          |  205 ++++++
 company_admin/src/components/business/OperaCategoryWindow.vue   |  278 +++++++-
 company_admin/.env.development                                  |    2 
 company_admin/src/views/business/goods.vue                      |  110 ++-
 19 files changed, 1,651 insertions(+), 199 deletions(-)

diff --git a/company_admin/.env.development b/company_admin/.env.development
index 6527b3f..6c3c4c6 100644
--- a/company_admin/.env.development
+++ b/company_admin/.env.development
@@ -3,6 +3,6 @@
 
 # VUE_APP_API = 'https://dmtest.ahapp.net/preselect_interface/'
 
-VUE_APP_API = 'http://192.168.0.15:10017/'
+VUE_APP_API = 'http://192.168.0.15:10012/'
 
 # VUE_APP_API = 'https://dmtest.ahapp.net/preselect_interface/'
\ No newline at end of file
diff --git a/company_admin/package-lock.json b/company_admin/package-lock.json
index 7392df2..f92c6d2 100644
--- a/company_admin/package-lock.json
+++ b/company_admin/package-lock.json
@@ -1814,6 +1814,63 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1821,6 +1878,28 @@
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
           }
         }
       }
@@ -13208,87 +13287,6 @@
           "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
           "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
           "dev": true
-        }
-      }
-    },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
diff --git a/company_admin/src/api/business/anchor.js b/company_admin/src/api/business/anchor.js
new file mode 100644
index 0000000..f3ca0c6
--- /dev/null
+++ b/company_admin/src/api/business/anchor.js
@@ -0,0 +1,43 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/system/user/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/system/user/companyCreateAnchor', data)
+}
+
+// 鏂板缓鍛樺伐
+export function companyCreateUser (data) {
+  return request.post('/system/user/companyCreateUser', data)
+}
+
+// 淇敼鍛樺伐淇℃伅
+export function companyUpdUser (data) {
+  return request.post('/system/user/companyUpdUser', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/system/user/companyUpdAnchor', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/system/user/delete/${id}`)
+}
+
+// 淇敼鐢ㄦ埛鐘舵��
+export function updUserStatus (params) {
+  return request.get(`/system/user/updUserStatus`, { params })
+}
+
+// 淇敼瀵嗙爜
+export function updPassword (data) {
+  return request.post('/system/user/updPassword', data)
+}
diff --git a/company_admin/src/api/business/category.js b/company_admin/src/api/business/category.js
index 400630f..f0a40c7 100644
--- a/company_admin/src/api/business/category.js
+++ b/company_admin/src/api/business/category.js
@@ -38,4 +38,19 @@
 // 淇敼鐘舵��
 export function updateDisableById (data) {
   return request.post('/business/category/updateDisableById', data)
+}
+
+// 骞冲彴鍒嗙被鍒楄〃
+export function baseCategoryList (data) {
+  return request.post('/business/category/baseCategoryList', data)
+}
+
+// 浼佷笟鏂板缓鍒嗙被
+export function companyCreate (data) {
+  return request.post('/business/category/companyCreate', data)
+}
+
+// 浼佷笟鏍规嵁ID淇敼
+export function companyUpdateById (data) {
+  return request.post('/business/category/companyUpdateById', data)
 }
\ No newline at end of file
diff --git a/company_admin/src/api/business/goods.js b/company_admin/src/api/business/goods.js
index 4bb3c85..2f57596 100644
--- a/company_admin/src/api/business/goods.js
+++ b/company_admin/src/api/business/goods.js
@@ -28,11 +28,36 @@
   return request.post('/business/goods/create', data)
 }
 
+// 浼佷笟鏂板缓鍟嗗搧
+export function companyCreate (data) {
+  return request.post('/business/goods/companyCreate', data)
+}
+
 // 淇敼
 export function updateById (data) {
   return request.post('/business/goods/updateById', data)
 }
 
+// 浼佷笟鏍规嵁ID淇敼
+export function companyUpdateById (data) {
+  return request.post('/business/goods/companyUpdateById', data)
+}
+
+// 鎵归噺淇敼鐘舵��
+export function batchUpdateDisableById (data) {
+  return request.post('/business/goods/batchUpdateDisableById', data)
+}
+
+// 浠庡钩鍙伴�夋嫨鍟嗗搧
+export function createPlat (data) {
+  return request.post('/business/goods/createPlat', data)
+}
+
+// 鍒嗛〉鏌ヨ
+export function pageT (data) {
+  return request.post('/business/baseGoods/page', data)
+}
+
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/business/goods/delete/${id}`)
diff --git a/company_admin/src/api/business/page.js b/company_admin/src/api/business/page.js
new file mode 100644
index 0000000..2acfce3
--- /dev/null
+++ b/company_admin/src/api/business/page.js
@@ -0,0 +1,11 @@
+import request from '../../utils/request'
+
+// 鑾峰彇褰撳墠鐧诲綍浼佷笟閰嶇疆淇℃伅
+export function getByLogin (params) {
+  return request.get('/business/webParam/getByLogin', {params})
+}
+
+// 鏇存柊浼佷笟閰嶇疆淇℃伅
+export function renew (data) {
+    return request.post('/business/webParam/renew', data)
+  }
\ No newline at end of file
diff --git a/company_admin/src/components/business/OperaAnchorPassWindow.vue b/company_admin/src/components/business/OperaAnchorPassWindow.vue
new file mode 100644
index 0000000..cdedd81
--- /dev/null
+++ b/company_admin/src/components/business/OperaAnchorPassWindow.vue
@@ -0,0 +1,95 @@
+<template>
+    <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+      <el-form :model="form" ref="form" :rules="rules">
+        <el-form-item label="杈撳叆鏂板瘑鐮�" prop="password">
+          <el-input v-model="form.password" show-password placeholder="瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�" v-trim />
+        </el-form-item>
+        <el-form-item label="鍐嶆杈撳叆瀵嗙爜" prop="qpassword">
+          <el-input v-model="form.qpassword" show-password placeholder="瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�" v-trim />
+        </el-form-item>
+      </el-form>
+    </GlobalWindow>
+  </template>
+    
+  <script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import { updPassword } from '@/api/business/anchor.js'
+
+  export default {
+    name: 'OperaBrandWindow',
+    extends: BaseOpera,
+    components: { GlobalWindow },
+    data() {
+      var validatePass = (rule, value, callback) => {
+        if (value === '') {
+          callback(new Error('瀵嗙爜涓嶈兘涓虹┖'));
+        } else {
+          if (!/^(?![^a-zA-Z]+$)(?!\D+$)/.test(value)) {
+            callback(new Error('瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�'));
+          }
+          callback();
+        }
+      };
+      var validatePass1 = (rule, value, callback) => {
+        if (value === '') {
+          callback(new Error('瀵嗙爜涓嶈兘涓虹┖'));
+        } else {
+          if (value !== this.form.password) {
+            callback(new Error('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�'));
+          }
+          callback();
+        }
+      };
+      return {
+        // 琛ㄥ崟鏁版嵁
+        form: {
+          id: null,
+          password: '',
+          qpassword: ''
+        },
+        // 楠岃瘉瑙勫垯
+        rules: {
+          password: [
+            { required: true, validator: validatePass, trigger: 'blur' }
+          ],
+          qpassword: [
+            { required: true, validator: validatePass1, trigger: 'blur' }
+          ]
+        }
+      }
+    },
+    created() {
+        this.config({
+            api: '/business/anchor',
+            'field.id': 'id'
+        })
+    },
+    methods: {
+        confirm() {
+            this.$refs.form.validate((valid) => {
+                if (!valid) {
+                    return
+                }
+                // 璋冪敤鏂板缓鎺ュ彛
+                this.isWorking = true
+                updPassword({
+                    id: this.form.id,
+                    password: this.form.password
+                }).then(() => {
+                    this.visible = false
+                    this.$tip.apiSuccess('鏂板缓鎴愬姛')
+                    this.$emit('success')
+                })
+                .catch(e => {
+                    this.$tip.apiFailed(e)
+                })
+                .finally(() => {
+                    this.isWorking = false
+                })
+            })
+        }
+    }
+  }
+  </script>
+    
\ No newline at end of file
diff --git a/company_admin/src/components/business/OperaAnchorWindow.vue b/company_admin/src/components/business/OperaAnchorWindow.vue
new file mode 100644
index 0000000..f85640b
--- /dev/null
+++ b/company_admin/src/components/business/OperaAnchorWindow.vue
@@ -0,0 +1,82 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+        <el-input v-model="form.userName" :disabled="form.id ? true : false" maxlength="20" placeholder="璇疯緭鍏ワ紝涓嶈秴杩�20涓瓧绗�" v-trim />
+      </el-form-item>
+      <el-form-item label="鐧诲綍瀵嗙爜" prop="password">
+        <el-input v-model="form.password" :disabled="form.id ? true : false" show-password placeholder="瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�" v-trim />
+      </el-form-item>
+      <el-form-item label="涓绘挱濮撳悕" prop="realName">
+        <el-input v-model="form.realName" placeholder="璇疯緭鍏ヤ富鎾鍚�" v-trim />
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙�" prop="mobile">
+        <el-input v-model="form.mobile" maxlength="11" show-word-limit placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+  
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaBrandWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    var validatePass = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('鐧诲綍瀵嗙爜涓嶈兘涓虹┖'));
+      } else {
+        if (!/^(?![^a-zA-Z]+$)(?!\D+$)/.test(value)) {
+          callback(new Error('瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�'));
+        }
+        callback();
+      }
+    };
+    var validatePhone = (rule, value, callback) => {
+      if (value === '') {
+        callback();
+      } else {
+        if (!/^1[3,4,5,6,7,8,9][0-9]{9}$/.test(value)) {
+          callback(new Error('鎵嬫満鍙风爜鏍煎紡涓嶆纭紒'));
+        }
+        callback();
+      }
+    };
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        userName: '',
+        password: '',
+        realName: '',
+        mobile: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        userName: [
+          { required: true, message: '鐧诲綍璐﹀彿涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, validator: validatePass, trigger: 'blur' }
+        ],
+        realName: [
+          { required: true, message: '涓绘挱濮撳悕涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        mobile: [
+          { required: true, validator: validatePhone, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created() {
+    this.config({
+      api: '/business/anchor',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
+  
\ No newline at end of file
diff --git a/company_admin/src/components/business/OperaCategoryWindow.vue b/company_admin/src/components/business/OperaCategoryWindow.vue
index b08bb82..89cde75 100644
--- a/company_admin/src/components/business/OperaCategoryWindow.vue
+++ b/company_admin/src/components/business/OperaCategoryWindow.vue
@@ -5,7 +5,25 @@
       :confirm-working="isWorking"
       @confirm="confirm"
     >
+      <el-alert title="濡傛灉浠庡钩鍙伴�夋嫨鍟嗗搧杩涜鐩存挱锛屽缓璁被鍒�夋嫨浠庡钩鍙板簱閫夋嫨锛岀郴缁熷凡鍋氭暟鎹叧鑱旓紱" type="warning" effect="dark" :closable="false"></el-alert>
+      <h3 style="margin: 20px 0 10px 0;">鍩烘湰淇℃伅</h3>
       <el-form :model="form" ref="form" :rules="rules">
+        <el-form-item label="绫诲埆鏉ユ簮" prop="type">
+          <el-radio-group v-model="form.type" @change="changeRadio">
+            <el-radio :label="1">浠庡钩鍙板簱閫夋嫨</el-radio>
+            <el-radio :label="0">浼佷笟鑷缓</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="閫夋嫨绫诲埆" prop="platCateId" v-if="form.type == 1">
+          <el-select v-model="form.platCateId" placeholder="璇烽�夋嫨" @change="changeCategory">
+            <el-option
+              v-for="item in categoryList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="绫诲埆鍚嶇О" prop="name">
           <el-input v-model="form.name" placeholder="璇疯緭鍏ョ被鍒悕绉帮紝涓嶈秴杩�6涓瓧" maxlength="6" v-trim/>
         </el-form-item>
@@ -14,7 +32,7 @@
             :action="action"
             :class="{ hide: hideUpload }"
             :file-list="form.fileList"
-            :data="{ folder: 'projects' }"
+            :data="{ folder: 'category_img' }"
             list-type="picture-card"
             :limit="1"
             :on-success="fileSuccess"
@@ -23,13 +41,56 @@
             <i class="el-icon-plus"></i>
             <div slot="tip" class="el-upload__tip">鍙兘涓婁紶鍥剧墖鏍煎紡锛宲ng鏍煎紡锛屽缓璁昂瀵�120*120px</div>
           </el-upload>
-          <!-- <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" v-trim/> -->
         </el-form-item>
         <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
           <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
         </el-form-item>
 
-        <el-form-item label="绛涢�夊睘鎬�1鍚嶇О" prop="attrFirst">
+        <div style="margin: 20px 0 10px 0; height: 30px; display: flex; justify-content: space-between;">
+          <h3 style="display: flex; align-items: flex-end;">鍙傛暟灞炴�ч厤缃�<h6 style="margin-left: 10px;">閰嶇疆褰撳墠绫诲埆鐨勪骇鍝佸弬鏁板悕</h6></h3>
+          <el-button style="display: inline-block;" type="primary" v-if="form.type == 0" @click="addItem">+ 鏂板</el-button>
+        </div>
+        <el-table
+          :data="form.tableData"
+          border
+          style="width: 100%">
+          <el-table-column label="鍙傛暟鍚�">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.name" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="璁剧疆涓洪�夐」">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.isselect"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                :active-value="1"
+                :inactive-value="0">
+              </el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏄惁鏄剧ず">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.isshow"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                :active-value="1"
+                :inactive-value="0">
+              </el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎿嶄綔" v-if="form.type == 0">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="danger"
+                @click="handleDelete(scope.$index)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- <el-form-item label="绛涢�夊睘鎬�1鍚嶇О" prop="attrFirst">
           <el-input v-model="form.attrFirst" maxlength="6" placeholder="璇疯緭鍏ョ瓫閫夊睘鎬у悕绉帮紝涓嶈秴杩�6涓瓧" v-trim/>
         </el-form-item>
         <el-form-item label="绛涢�夊睘鎬�1鐨勫��" prop="attrFirst">
@@ -53,8 +114,9 @@
           <div style="display: flex; align-items: center; flex-wrap: wrap;">
             <el-tag style="margin-right: 10px; margin-top: 10px;" @close="close(index, 3)" closable v-for="(item, index) in form.paramList" :key="index">{{ item.name }}</el-tag>
           </div>
-        </el-form-item>
+        </el-form-item> -->
 
+        <h3 style="margin: 20px 0 10px 0; display: flex; align-items: flex-end;">棰勭畻鍖洪棿閰嶇疆<h6 style="margin-left: 10px;">閰嶇疆褰撳墠绫诲埆鐨勯绠楀尯闂寸瓫閫夊�硷紝涓婇檺鍜屼笅闄愪笉鑳藉悓鏃朵负绌�</h6></h3>
         <el-form-item label="棰勭畻鍖洪棿" prop="attrSecond">
           <div style="display: flex; align-items: center; margin-bottom: 10px;" v-for="(item, index) in form.budgetList" :key="index">
             <el-input v-model="item.minamount" type="number" @input="changeInput(1, index)" placeholder="涓嬮檺" v-trim/>
@@ -71,31 +133,35 @@
   <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
-  import { create, updateById } from '@/api/business/category.js'
+  import { create, updateById, baseCategoryList, companyCreate, companyUpdateById } from '@/api/business/category.js'
   export default {
     name: 'OperaCategoryWindow',
     extends: BaseOpera,
     components: { GlobalWindow },
     data () {
       return {
-        action: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
+        action: process.env.VUE_APP_API_PREFIX + '/public/upload',
 
         hideUpload: false,
+        categoryList: [],
         
         // 琛ㄥ崟鏁版嵁
         form: {
           id: null,
+          type: 1,
+          platCateId: '',
           name: '',
-          attrFirst: '',
-          attrFirst1: '',
-          attrFirstList: [],
-          attrSecond: '',
-          attrSecond1: '',
-          attrSecondList: [],
+          // attrFirst: '',
+          // attrFirst1: '',
+          // attrFirstList: [],
+          // attrSecond: '',
+          // attrSecond1: '',
+          // attrSecondList: [],
           sortnum: '',
-          parameter: '',
+          // parameter: '',
           paramList: [],
           imgurl: '',
+          tableData: [],
           budgetList: [
             {
               maxamount: '',
@@ -103,7 +169,7 @@
             }
           ],
           fileList: [],
-          attributeValueOne: []
+          // attributeValueOne: []
         },
         // 楠岃瘉瑙勫垯
         rules: {
@@ -121,6 +187,91 @@
       })
     },
     methods: {
+      addItem() {
+        this.form.tableData.push({ name: '', isselect: 0, isshow: 1 })
+      },
+      handleDelete(index) {
+        this.form.tableData.splice(index, 1)
+      },
+      changeRadio(e) {
+        this.form.name = ''
+        this.form.platCateId = ''
+        this.form.sortnum = ''
+        this.form.tableData = []
+        this.form.imgurl = ''
+        this.form.fileList = []
+        this.form.budgetList = [{
+          maxamount: '',
+          minamount: ''
+        }]
+      },
+      confirm() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return
+          // 璋冪敤鏂板缓鎺ュ彛
+          this.isWorking = true
+          if (!this.form.id) {
+            companyCreate({
+              paramList: this.form.tableData,
+              type: this.form.type,
+              sortnum: this.form.sortnum,
+              platCateId: this.form.platCateId,
+              name: this.form.name,
+              imgurl: this.form.imgurl,
+              budgetList: this.form.budgetList
+            })
+              .then(() => {
+                this.visible = false
+                this.$tip.apiSuccess('鏂板缓鎴愬姛')
+                this.$emit('success')
+              })
+              .catch(e => {
+                this.$tip.apiFailed(e)
+              })
+              .finally(() => {
+                this.isWorking = false
+              })
+          } else {
+            companyUpdateById({
+              id: this.form.id,
+              paramList: this.form.tableData,
+              type: this.form.type,
+              sortnum: this.form.sortnum,
+              platCateId: this.form.platCateId,
+              name: this.form.name,
+              imgurl: this.form.imgurl,
+              budgetList: this.form.budgetList
+            })
+              .then(() => {
+                this.visible = false
+                this.$tip.apiSuccess('缂栬緫鎴愬姛')
+                this.$emit('success')
+              })
+              .catch(e => {
+                this.$tip.apiFailed(e)
+              })
+              .finally(() => {
+                this.isWorking = false
+              })
+          }
+        })
+      },
+      // 鍒囨崲鍒嗙被
+      changeCategory(id) {
+        this.categoryList.forEach(item => {
+          if (item.id === id) {
+            this.form.name = item.name
+            this.form.sortnum = item.sortnum
+            let arr = []
+            item.baseCateParamList.forEach((row, index) => {
+              arr.push({ name: row.name, isselect: index <= 1 ? 1 : 0, isshow: 1 })
+            })
+            this.form.tableData = arr
+            this.form.imgurl = item.imgurl
+            this.form.fileList = [{ url: item.imgfullurl }]
+          }
+        })
+      },
       changeInput(type, index) {
         if (type === 1) {
           if (!this.form.budgetList[index].minamount) return
@@ -147,42 +298,42 @@
           message: '鍙兘涓婁紶涓�涓浘鏍�'
         })
       },
-      confirm() {
-        this.$refs.form.validate((valid) => {
-          if (valid) {
-            this.isWorking = true
-            if (!this.form.id) {
-              create(this.form)
-              .then(() => {
-                this.visible = false
-                this.$tip.apiSuccess('鏂板缓鎴愬姛')
-                this.$emit('success')
-              })
-              .catch(e => {
-                this.$tip.apiFailed(e)
-              })
-              .finally(() => {
-                this.isWorking = false
-              })
-            } else {
-              updateById(this.form)
-                .then(() => {
-                  this.visible = false
-                  this.$tip.apiSuccess('缂栬緫鎴愬姛')
-                  this.$emit('success')
-                })
-                .catch(e => {
-                  this.$tip.apiFailed(e)
-                })
-                .finally(() => {
-                  this.isWorking = false
-                })
-            }
-          } else {
-            return false;
-          }
-        });
-      },
+      // confirm() {
+      //   this.$refs.form.validate((valid) => {
+      //     if (valid) {
+      //       this.isWorking = true
+      //       if (!this.form.id) {
+      //         create(this.form)
+      //         .then(() => {
+      //           this.visible = false
+      //           this.$tip.apiSuccess('鏂板缓鎴愬姛')
+      //           this.$emit('success')
+      //         })
+      //         .catch(e => {
+      //           this.$tip.apiFailed(e)
+      //         })
+      //         .finally(() => {
+      //           this.isWorking = false
+      //         })
+      //       } else {
+      //         updateById(this.form)
+      //           .then(() => {
+      //             this.visible = false
+      //             this.$tip.apiSuccess('缂栬緫鎴愬姛')
+      //             this.$emit('success')
+      //           })
+      //           .catch(e => {
+      //             this.$tip.apiFailed(e)
+      //           })
+      //           .finally(() => {
+      //             this.isWorking = false
+      //           })
+      //       }
+      //     } else {
+      //       return false;
+      //     }
+      //   });
+      // },
       close(index, type) {
         if (type === 1) {
           this.form.attrFirstList.splice(index, 1)
@@ -230,15 +381,18 @@
             this.form = {
               id: null,
               name: '',
-              attrFirst: '',
-              attrFirst1: '',
-              attrFirstList: [],
-              attrSecond: '',
-              attrSecond1: '',
-              attrSecondList: [],
+              type: 1,
+              platCateId: '',
+              tableData: [],
+              // attrFirst: '',
+              // attrFirst1: '',
+              // attrFirstList: [],
+              // attrSecond: '',
+              // attrSecond1: '',
+              // attrSecondList: [],
               sortnum: '',
-              parameter: '',
-              paramList: [],
+              // parameter: '',
+              // paramList: [],
               imgurl: '',
               budgetList: [
                 {
@@ -247,8 +401,14 @@
                 }
               ],
               fileList: [],
-              attributeValueOne: []
+              // attributeValueOne: []
             }
+          } else {
+            // 鑾峰彇鍒嗙被鍒楄〃
+            baseCategoryList({})
+              .then(res => {
+                this.categoryList = res
+              })
           }
         }
       }
diff --git a/company_admin/src/components/business/OperaGoodsWindow.vue b/company_admin/src/components/business/OperaGoodsWindow.vue
index e22ce7f..f54453e 100644
--- a/company_admin/src/components/business/OperaGoodsWindow.vue
+++ b/company_admin/src/components/business/OperaGoodsWindow.vue
@@ -31,7 +31,7 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item :label="name1" prop="attrFirstIds" v-if="name1">
+        <!-- <el-form-item :label="name1" prop="attrFirstIds" v-if="name1">
           <el-select v-model="form.attrFirstIds" multiple placeholder="璇烽�夋嫨锛屾敮鎸佸閫�">
             <el-option
               v-for="item in form.attrFirstList"
@@ -50,7 +50,7 @@
               :value="item.id">
             </el-option>
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="鎸囧浠凤紙鍏冿級" prop="zdPrice">
           <el-input v-model="form.zdPrice" @input="priceCHANEG(form.zdPrice, 1)" type="number" placeholder="寤鸿褰曞叆鏁存暟锛屽崟浣嶅厓" v-trim/>
         </el-form-item>
@@ -61,7 +61,7 @@
           <el-upload
             :action="action"
             :file-list="form.ztList"
-            :data="{ folder: 'projects' }"
+            :data="{ folder: 'goods_img' }"
             list-type="picture-card"
             :limit="1"
             :on-success="fileSuccess"
@@ -76,7 +76,7 @@
             :action="action"
             :file-list="form.files"
             :multiple="true"
-            :data="{ folder: 'projects' }"
+            :data="{ folder: 'goods_img' }"
             list-type="picture-card"
             :on-success="fileSuccess1"
             :on-remove="handleRemove1">
@@ -84,10 +84,12 @@
             <div slot="tip" class="el-upload__tip">鍙兘涓婁紶鍥剧墖鏍煎紡锛宲ng鏍煎紡锛屽缓璁昂瀵�600*600px</div>
           </el-upload>
         </el-form-item>
-        <div style="font-size: 18px;font-weight: bold;">鍙傛暟灞炴�у�奸厤缃� <span style="font-size: 13px; font-weight: 500;">鎸夐渶閰嶇疆褰撳墠鍟嗗搧鐨勪骇鍝佸弬鏁板�硷紝鍗曚釜鍙傛暟鍊间笉瓒呰繃30涓瓧</span></div>
-        <el-form-item :label="item.name" v-for="(item, index) in form.goodsParamList" :key="index">
-          <el-input v-model="item.val" maxlength="30" type="text" placeholder="璇疯緭鍏�" v-trim/>
-        </el-form-item>
+        <template v-if="form.goodsParamList && form.goodsParamList.length > 0">
+          <div style="font-size: 18px;font-weight: bold;">鍙傛暟灞炴�у�奸厤缃� <span style="font-size: 13px; font-weight: 500;">鎸夐渶閰嶇疆褰撳墠鍟嗗搧鐨勪骇鍝佸弬鏁板�硷紝鍗曚釜鍙傛暟鍊间笉瓒呰繃30涓瓧</span></div>
+          <el-form-item :label="item.name" v-for="(item, index) in form.goodsParamList" :key="index">
+            <el-input v-model="item.val" maxlength="30" type="text" placeholder="璇疯緭鍏�" v-trim/>
+          </el-form-item>
+        </template>
       </el-form>
     </GlobalWindow>
   </template>
@@ -96,14 +98,14 @@
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
   import { brand } from '@/api/system/common.js'
-  import { findListForGoodsId, create, updateById } from '@/api/business/goods.js'
+  import { findListForGoodsId, create, updateById, companyCreate, companyUpdateById } from '@/api/business/goods.js'
   export default {
     name: 'OperaGoodsWindow',
     extends: BaseOpera,
     components: { GlobalWindow },
     data () {
       return {
-        action: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
+        action: process.env.VUE_APP_API_PREFIX + '/public/upload',
         name1: '',
         name2: '',
         // 琛ㄥ崟鏁版嵁
@@ -259,7 +261,7 @@
               this.form.attrSecodIds = ''
             }
             if (!this.form.id) {
-              create(this.form)
+              companyCreate({...this.form, type: 0})
                 .then(() => {
                   this.visible = false
                   this.$tip.apiSuccess('鏂板缓鎴愬姛')
@@ -272,7 +274,7 @@
                   this.isWorking = false
                 })
             } else {
-              updateById(this.form)
+              companyUpdateById({...this.form, type: 0})
                 .then(() => {
                   this.visible = false
                   this.$tip.apiSuccess('缂栬緫鎴愬姛')
diff --git a/company_admin/src/components/business/OperaStaffWindow.vue b/company_admin/src/components/business/OperaStaffWindow.vue
new file mode 100644
index 0000000..d3fec5e
--- /dev/null
+++ b/company_admin/src/components/business/OperaStaffWindow.vue
@@ -0,0 +1,162 @@
+<template>
+    <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+      <el-form :model="form" ref="form" :rules="rules">
+        <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+          <el-input v-model="form.userName" :disabled="form.id ? true : false" maxlength="20" placeholder="璇疯緭鍏ワ紝涓嶈秴杩�20涓瓧绗�" v-trim />
+        </el-form-item>
+        <el-form-item label="鐧诲綍瀵嗙爜" prop="password">
+          <el-input v-model="form.password" :disabled="form.id ? true : false" show-password placeholder="瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�" v-trim />
+        </el-form-item>
+        <el-form-item label="鍛樺伐濮撳悕" prop="realName">
+          <el-input v-model="form.realName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�" v-trim />
+        </el-form-item>
+        <el-form-item label="鎵嬫満鍙�" prop="mobile">
+          <el-input v-model="form.mobile" maxlength="11" show-word-limit placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim />
+        </el-form-item>
+        <el-form-item label="瑙掕壊" prop="roleId">
+            <el-select v-model="form.roleId" placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="item in roleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+            </el-select>
+        </el-form-item>
+      </el-form>
+    </GlobalWindow>
+  </template>
+    
+  <script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import { fetchAll } from '@/api/system/role'
+  import { companyCreateUser, companyUpdUser } from '@/api/business/anchor'
+
+  export default {
+    name: 'OperaBrandWindow',
+    extends: BaseOpera,
+    components: { GlobalWindow },
+    data() {
+      var validatePass = (rule, value, callback) => {
+        if (value === '') {
+          callback(new Error('鐧诲綍瀵嗙爜涓嶈兘涓虹┖'));
+        } else {
+          if (!/^(?![^a-zA-Z]+$)(?!\D+$)/.test(value)) {
+            callback(new Error('瀵嗙爜鏀寔鏁板瓧銆佸瓧绗︾粍鍚堬紝闀垮害6-18浣�'));
+          }
+          callback();
+        }
+      };
+      var validatePhone = (rule, value, callback) => {
+        if (value === '') {
+          callback();
+        } else {
+          if (!/^1[3,4,5,6,7,8,9][0-9]{9}$/.test(value)) {
+            callback(new Error('鎵嬫満鍙风爜鏍煎紡涓嶆纭紒'));
+          }
+          callback();
+        }
+      };
+      return {
+        roleList: [],
+        // 琛ㄥ崟鏁版嵁
+        form: {
+          id: null,
+          userName: '',
+          password: '',
+          realName: '',
+          mobile: '',
+          roleId: ''
+        },
+        // 楠岃瘉瑙勫垯
+        rules: {
+          userName: [
+            { required: true, message: '鐧诲綍璐﹀彿涓嶈兘涓虹┖', trigger: 'blur' }
+          ],
+          password: [
+            { required: true, validator: validatePass, trigger: 'blur' }
+          ],
+          realName: [
+            { required: true, message: '涓绘挱濮撳悕涓嶈兘涓虹┖', trigger: 'blur' }
+          ],
+          mobile: [
+            { validator: validatePhone, trigger: 'blur' }
+          ]
+        }
+      }
+    },
+    created() {
+      this.config({
+        api: '/business/anchor',
+        'field.id': 'id'
+      })
+    },
+    methods: {
+        confirm() {
+            this.$refs.form.validate((valid) => {
+                if (!valid) return
+                // 璋冪敤鏂板缓鎺ュ彛
+                this.isWorking = true
+                // 鏂板缓
+                if (!this.form.id) {
+                    companyCreateUser(this.form)
+                        .then(res => {
+                            this.visible = false
+                            this.$tip.apiSuccess('鏂板缓鎴愬姛')
+                            this.$emit('success')
+                        })
+                        .catch(e => {
+                            this.$tip.apiFailed(e)
+                        })
+                        .finally(() => {
+                            this.isWorking = false
+                        })
+                } else {
+                    companyUpdUser(this.form)
+                        .then(res => {
+                            this.visible = false
+                            this.$tip.apiSuccess('缂栬緫鎴愬姛')
+                            this.$emit('success')
+                        })
+                        .catch(e => {
+                            this.$tip.apiFailed(e)
+                        })
+                        .finally(() => {
+                            this.isWorking = false
+                        })
+                }
+            })
+        },
+        /**
+         * 鎵撳紑绐楀彛
+         * @title 绐楀彛鏍囬
+         * @target 缂栬緫鐨勫璞�
+         */
+        open (title, target) {
+            this.title = title
+            this.visible = true
+            // 鑾峰彇鎵�鏈夎鑹�
+            fetchAll()
+                .then(res => {
+                    this.roleList = res
+                })
+            // 鏂板缓
+            if (target == null) {
+                this.$nextTick(() => {
+                    this.$refs.form.resetFields()
+                    this.form[this.configData['field.id']] = null
+                })
+                return
+            }
+            // 缂栬緫
+            this.$nextTick(() => {
+                for (const key in this.form) {
+                    this.form[key] = target[key]
+                }
+            })
+        }
+    }
+  }
+  </script>
+    
\ No newline at end of file
diff --git a/company_admin/src/components/business/selectProduct.vue b/company_admin/src/components/business/selectProduct.vue
new file mode 100644
index 0000000..8137bca
--- /dev/null
+++ b/company_admin/src/components/business/selectProduct.vue
@@ -0,0 +1,119 @@
+<template>
+    <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+      <el-form :model="form" ref="form" :rules="rules">
+        <el-form-item label="鍟嗗搧绫诲埆" prop="categoryId">
+            <el-select v-model="form.categoryId" placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="item in categoryList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+            </el-select>
+        </el-form-item>
+        <el-form-item label="鍟嗗搧鑼冨洿" prop="type">
+            <el-radio-group v-model="form.type">
+                <el-radio :label="0">鍏ㄩ儴</el-radio>
+                <el-radio :label="1">閮ㄥ垎</el-radio>
+            </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鍔犱环绯绘暟" prop="rate">
+          <el-input v-model="form.rate" placeholder="骞冲彴閲囪喘浠�*鍔犱环绯绘暟锛屼綔涓哄弬鑰冨嚭鎵嬩环锛屽缓璁緭鍏ュぇ浜�1鐨勬暟瀛�" v-trim />
+        </el-form-item>
+      </el-form>
+      <!-- 閫夋嫨骞冲彴鍟嗗搧 -->
+      <selectProductItem ref="selectProductItem" @result="result" />
+    </GlobalWindow>
+  </template>
+    
+  <script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import selectProductItem from '@/components/business/selectProductItem'
+  import { baseCategoryList } from '@/api/business/category.js'
+  import { createPlat } from '@/api/business/goods'
+
+  export default {
+    name: 'OperaBrandWindow',
+    extends: BaseOpera,
+    components: { GlobalWindow, selectProductItem },
+    data() {
+      return {
+        categoryList: [],
+        // 琛ㄥ崟鏁版嵁
+        form: {
+          categoryId: '',
+          type: 0,
+          rate: ''
+        },
+        // 楠岃瘉瑙勫垯
+        rules: {
+            categoryId: [
+            { required: true, message: '鍟嗗搧绫诲埆涓嶈兘涓虹┖', trigger: 'blur' }
+          ],
+          type: [
+            { required: true, message: '鍟嗗搧鑼冨洿涓嶈兘涓虹┖', trigger: 'blur' }
+          ],
+          rate: [
+            { required: true, message: '鍔犱环绯绘暟涓嶈兘涓虹┖', trigger: 'blur' }
+          ]
+        }
+      }
+    },
+    created() {
+      this.config({
+        api: '/business/anchor',
+        'field.id': 'id'
+      })
+    },
+    methods: {
+        result() {
+          // this.$emit('success')
+          this.$emit('result')
+          this.visible = false
+        },
+        confirm() {
+            this.$refs.form.validate((valid) => {
+                if (!valid) return
+                // 鏂板缓
+                if (this.form.type == 0) {
+                    this.isWorking = true
+                    createPlat({
+                        categoryId: this.form.categoryId,
+                        rate: this.form.rate,
+                        type: this.form.type
+                    }).then(res => {
+                        this.visible = false
+                        this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+                        // this.$emit('success')
+                        this.$emit('result')
+                    })
+                    .catch(e => {
+                        this.$tip.apiFailed(e)
+                    })
+                    .finally(() => {
+                        this.isWorking = false
+                    })
+                } else {
+                    this.$refs.selectProductItem.open('閫夋嫨骞冲彴鍟嗗搧', this.form)
+                }
+            })
+        },
+        /**
+         * 鎵撳紑绐楀彛
+         * @title 绐楀彛鏍囬
+         * @target 缂栬緫鐨勫璞�
+         */
+        open (title, target) {
+            this.title = title
+            this.visible = true
+            // 鑾峰彇鍒嗙被鍒楄〃
+            baseCategoryList({ type: 1 })
+              .then(res => {
+                this.categoryList = res
+              })
+        }
+    }
+  }
+  </script>
+    
\ No newline at end of file
diff --git a/company_admin/src/components/business/selectProductItem.vue b/company_admin/src/components/business/selectProductItem.vue
new file mode 100644
index 0000000..50edba6
--- /dev/null
+++ b/company_admin/src/components/business/selectProductItem.vue
@@ -0,0 +1,183 @@
+<template>
+    <GlobalWindow :title="title" width="70%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+        <div class="head">
+            <el-form :inline="true" :model="form" class="demo-form-inline">
+                <el-form-item label="鍟嗗搧鍚嶇О" prop="name">
+                    <el-input v-model="form.name" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�"></el-input>
+                </el-form-item>
+                <el-form-item label="绫诲埆" prop="categoryId">
+                    <el-select v-model="form.categoryId" disabled placeholder="璇烽�夋嫨">
+                        <el-option
+                            v-for="item in categoryList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="getList">鏌ヨ</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div class="tab">
+            <el-table
+            :data="tableData"
+            stripe
+            border
+            @selection-change="handleSelectionChange">
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="id" label="鍟嗗搧ID" min-width="100px"></el-table-column>
+                <el-table-column prop="name" label="鍟嗗搧鍚嶇О/鍨嬪彿" show-overflow-tooltip min-width="200px">
+                    <template slot-scope="{row}">
+                    <div style="display: flex; align-items: center;">
+                        <div style="width: 70px; height: 70px; flex-shrink: 0;">
+                        <el-image
+                            v-if="row.imgurl"
+                            style="width: 70px; height: 70px"
+                            :src="row.fullImgUrl"
+                            fit="cover"></el-image>
+                        </div>
+                        {{ row.name }}
+                    </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="brandName" label="鍝佺墝" show-overflow-tooltip min-width="100px"></el-table-column>
+                <el-table-column prop="categoryName" label="绫诲埆" show-overflow-tooltip min-width="100px"></el-table-column>
+                <el-table-column prop="zdPrice" label="鎸囧浠凤紙鍏冿級" show-overflow-tooltip min-width="100px"></el-table-column>
+                <el-table-column prop="price" label="閲囪喘浠凤紙鍏冿級" show-overflow-tooltip min-width="100px"></el-table-column>
+                <el-table-column label="鍏ユ墜浠凤紙鍏冿級" show-overflow-tooltip min-width="100px">
+                    <template slot-scope="{row}">
+                        <el-input v-model="row.purchasePrice" placeholder="璇疯緭鍏�"></el-input>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="total">
+            </el-pagination>
+        </div>
+    </GlobalWindow>
+</template>
+    
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { baseCategoryList } from '@/api/business/category.js'
+import { pageT } from '@/api/business/goods'
+import { createPlat } from '@/api/business/goods'
+
+export default {
+    name: 'OperaBrandWindow',
+    extends: BaseOpera,
+    components: { GlobalWindow },
+    data() {
+        return {
+            // 琛ㄥ崟鏁版嵁
+            form: {
+                categoryId: '',
+                type: 0,
+                rate: '',
+                name: '',
+                goodsParamList: []
+            },
+            pageSize: 10,
+            page: 1,
+            total: 0,
+            tableData: [],
+            categoryList: []
+        }
+    },
+    created() {
+        this.config({
+            api: '/business/anchor',
+            'field.id': 'id'
+        })
+    },
+    methods: {
+        getList() {
+            pageT({
+                capacity: this.pageSize,
+                model: {
+                    categoryId: this.form.categoryId,
+                    name: this.form.name
+                },
+                page: this.page
+            }).then(res => {
+                res.records.forEach(item => {
+                    item.purchasePrice = item.price * this.form.rate
+                })
+                this.tableData = res.records
+                this.total = res.total
+            })
+        },
+        handleCurrentChange(e) {
+            this.page = e
+            this.getList()
+        },
+        handleSizeChange(e) {
+            this.pageSize = e
+            this.getList()
+        },
+        handleSelectionChange(e) {
+            let arr = []
+            e.forEach(item => {
+                arr.push({ goodsId: item.id, price: item.purchasePrice })
+            })
+            this.form.goodsParamList = arr
+            console.log(arr)
+        },
+        confirm() {
+            // 璋冪敤鏂板缓鎺ュ彛
+            this.isWorking = true
+            createPlat({
+                categoryId: this.form.categoryId,
+                goodsParamList: this.form.goodsParamList,
+                rate: this.form.rate,
+                type: this.form.type
+            }).then(res => {
+                this.visible = false
+                this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+                // this.$emit('success')
+                this.$emit('result')
+            })
+            .catch(e => {
+                this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+                this.isWorking = false
+            })
+        },
+        /**
+         * 鎵撳紑绐楀彛
+         * @title 绐楀彛鏍囬
+         * @target 缂栬緫鐨勫璞�
+         */
+        open(title, target) {
+            this.title = title
+            this.visible = true
+            this.form.categoryId = target.categoryId
+            this.form.rate = Number(target.rate)
+            this.form.type = target.type
+            // 鑾峰彇鍒嗙被鍒楄〃
+            baseCategoryList({})
+                .then(res => {
+                    this.categoryList = res
+                })
+            this.getList()
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+    .head {
+        width: 100%;
+
+    }
+</style>
\ No newline at end of file
diff --git a/company_admin/src/views/business/anchor.vue b/company_admin/src/views/business/anchor.vue
new file mode 100644
index 0000000..67d44ff
--- /dev/null
+++ b/company_admin/src/views/business/anchor.vue
@@ -0,0 +1,155 @@
+<template>
+    <TableLayout :permissions="['system:user:query']">
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="80px" inline>
+        <el-form-item label="璐﹀彿淇℃伅" prop="keyword">
+          <el-input v-model="searchForm.keyword" v-trim placeholder="璇疯緭鍏ョ櫥褰曡处鍙�/濮撳悕" @keypress.enter.native="search"/>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-select v-model="searchForm.status" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in status"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <section>
+          <el-button type="primary" icon="el-icon-search" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template v-slot:table-wrap>
+        <ul class="toolbar" v-permissions="['system:user:create', 'system:user:delete']">
+          <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.OperaAnchorWindow.open('鏂板缓鐢ㄦ埛')">鏂板缓</el-button></li>
+          <!-- <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">鍒犻櫎</el-button></li> -->
+        </ul>
+        <el-table
+          v-loading="isWorking.search"
+          :data="tableData.list"
+          :default-sort = "{prop: 'createTime', order: 'descending'}"
+          stripe
+          @selection-change="handleSelectionChange"
+          @sort-change="handleSortChange"
+        >
+          <el-table-column type="selection" width="55"></el-table-column>
+          <el-table-column prop="username" label="鐧诲綍璐﹀彿"></el-table-column>
+          <el-table-column prop="realname" label="濮撳悕"></el-table-column>
+          <el-table-column prop="mobile" label="鎵嬫満鍙�"></el-table-column>
+          <el-table-column label="鐘舵��">
+            <template slot-scope="{row}">
+              <el-switch
+                v-model="row.status"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="changeStatus($event, row.id)"
+                :active-value="0"
+                :inactive-value="1">
+              </el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="鍒涘缓鏃堕棿"></el-table-column>
+          <el-table-column
+            v-if="containPermissions(['system:user:update', 'system:user:createUserRole', 'system:user:resetPwd', 'system:user:delete'])"
+            label="鎿嶄綔"
+            width="230"
+            fixed="right"
+          >
+            <template slot-scope="{row}">
+              <el-button type="text" icon="el-icon-edit" @click="edit(row)" v-permissions="['system:user:update']">缂栬緫</el-button>
+              <el-button type="text" @click="editPass(row)" v-permissions="['system:user:resetPwd']">淇敼瀵嗙爜</el-button>
+              <el-button type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+          :pagination="tableData.pagination"
+        ></pagination>
+      </template>
+      <!-- 鏂板缓/淇敼 -->
+      <OperaAnchorWindow ref="OperaAnchorWindow" @success="handlePageChange"/>
+      <!-- 淇敼瀵嗙爜 -->
+      <OperaAnchorPassWindow ref="OperaAnchorPassWindow" @success="handlePageChange"/>
+    </TableLayout>
+  </template>
+  
+  <script>
+  import Pagination from '@/components/common/Pagination'
+  import TableLayout from '@/layouts/TableLayout'
+  import BaseTable from '@/components/base/BaseTable'
+  import OperaAnchorWindow from '@/components/business/OperaAnchorWindow'
+  import OperaAnchorPassWindow from '@/components/business/OperaAnchorPassWindow'
+  import { updUserStatus } from '@/api/business/anchor.js'
+  
+  export default {
+    name: 'SystemUser',
+    extends: BaseTable,
+    components: { OperaAnchorWindow, TableLayout, Pagination, OperaAnchorPassWindow },
+    data () {
+      return {
+        // 鎼滅储
+        searchForm: {
+          status: '',
+          keyword: '',
+          type: 2
+        },
+        status: [
+          { name: '鍚敤', id: 0 },
+          { name: '绂佺敤', id: 1 }
+        ]
+      }
+    },
+    created () {
+      this.config({
+        module: '鐢ㄦ埛',
+        api: '/business/anchor',
+        'field.main': 'realname',
+        sorts: [{
+          property: 'CREATE_TIME',
+          direction: 'DESC'
+        }]
+      })
+      this.search()
+    },
+    methods: {
+      editPass(row) {
+        let obj = {
+          id: row.id
+        }
+        this.$refs.OperaAnchorPassWindow.open('淇敼瀵嗙爜', obj)
+      },
+      // 淇敼鐘舵��
+      changeStatus(status, id) {
+        updUserStatus({ id, status })
+          .then(res => {
+            console.log(res)
+          })
+      },
+      edit(row) {
+        let obj = {
+          id: row.id,
+          userName: row.username,
+          password: row.password,
+          realName: row.realname,
+          mobile: row.mobile
+        }
+        this.$refs.OperaAnchorWindow.open('缂栬緫鐢ㄦ埛', obj)
+      }
+    }
+  }
+  </script>
+  
+  <style scoped lang="scss">
+  @import "@/assets/style/variables.scss";
+  // 鍒楄〃澶村儚澶勭悊
+  .table-column-avatar {
+    img {
+      width: 48px;
+    }
+  }
+  </style>
+  
\ No newline at end of file
diff --git a/company_admin/src/views/business/category.vue b/company_admin/src/views/business/category.vue
index 90fc46f..9833d20 100644
--- a/company_admin/src/views/business/category.vue
+++ b/company_admin/src/views/business/category.vue
@@ -35,8 +35,6 @@
             </template>
           </el-table-column>
           <el-table-column prop="name" label="绫诲埆鍚嶇О" min-width="100px"></el-table-column>
-          <el-table-column prop="attrFirst" label="灞炴��1" min-width="100px"></el-table-column>
-          <el-table-column prop="attrSecond" label="灞炴��2" 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">
@@ -130,8 +128,18 @@
               paramList: res.paramList,
               imgurl: res.imgurl,
               budgetList: res.budgetList,
-              fileList: res.imgurl ? [ {url: res.prefixUrl + res.imgurl} ] : []
+              type: res.type,
+              platCateId: res.platCateId,
+              tableData: res.paramList.map(item => {
+                return {
+                  name: item.name,
+                  isselect: item.isselect,
+                  isshow: item.isshow
+                }
+              }),
+              fileList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : []
             }
+            console.log(obj)
             this.$refs.operaCategoryWindow.open('缂栬緫绫诲埆', obj)
           })
       }
diff --git a/company_admin/src/views/business/goods.vue b/company_admin/src/views/business/goods.vue
index 16d2c4f..5998a93 100644
--- a/company_admin/src/views/business/goods.vue
+++ b/company_admin/src/views/business/goods.vue
@@ -10,41 +10,40 @@
           <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ュ晢鍝両D" @keypress.enter.native="search"></el-input>
         </el-form-item>
         <el-form-item label="绫诲埆" prop="categoryId">
-            <el-select v-model="searchForm.categoryId" clearable placeholder="璇烽�夋嫨">
-                <el-option
-                    v-for="item in categoryList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id">
-                </el-option>
-            </el-select>
+          <el-select v-model="searchForm.categoryId" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in categoryList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
           <!-- <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ユ墍灞炲搧绫荤紪鐮�" @keypress.enter.native="search"></el-input> -->
         </el-form-item>
         <el-form-item label="鍝佺墝" prop="brandId">
-            <el-select v-model="searchForm.brandId" clearable placeholder="璇烽�夋嫨">
-                <el-option
-                    v-for="item in brandList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id">
-                </el-option>
-            </el-select>
+          <el-select v-model="searchForm.brandId" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in brandList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
           <!-- <el-input v-model="searchForm.brandId" placeholder="璇疯緭鍏ユ墍灞炲搧鐗岀紪鐮�" @keypress.enter.native="search"></el-input> -->
         </el-form-item>
         <el-form-item label="鐘舵��" prop="status">
-            <el-select v-model="searchForm.status" clearable placeholder="璇烽�夋嫨">
-                <el-option
-                    v-for="item in statusList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id">
-                </el-option>
-            </el-select>
+          <el-select v-model="searchForm.status" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in statusList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
           <!-- <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" @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>
@@ -52,8 +51,12 @@
       <template v-slot:table-wrap>
         <ul class="toolbar" v-permissions="['business:goods:create', 'business:goods:delete']">
           <li><el-button type="primary" @click="$refs.operaGoodsWindow.open('鏂板缓鍟嗗搧')" icon="el-icon-plus" v-permissions="['business:goods:create']">鏂板缓</el-button></li>
+          <el-button type="primary" :loading="isWorking.export" @click="$refs.selectProduct.open('閫夋嫨骞冲彴鍟嗗搧')">閫夋嫨骞冲彴鍟嗗搧</el-button>
           <el-button type="primary" :loading="isWorking.export" v-permissions="['business:goods:exportExcel']" @click="importFile">瀵煎叆</el-button>
           <el-button type="primary" :loading="isWorking.export" @click="downloadFile">涓嬭浇妯℃澘</el-button>
+
+          <el-button type="primary" :loading="isWorking.export" @click="bulkOperation(0)">鎵归噺涓婃灦</el-button>
+          <el-button type="primary" :loading="isWorking.export" @click="bulkOperation(1)">鎵归噺涓嬫灦</el-button>
           <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:goods:delete']">鍒犻櫎</el-button></li> -->
         </ul>
         <el-table
@@ -63,7 +66,9 @@
           border
           :header-cell-style="rowStyle"
           :cell-style="rowStyle"
+          @selection-change="handleSelectionChange"
         >
+          <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column prop="id" label="鍟嗗搧ID" min-width="100px"></el-table-column>
           <el-table-column prop="name" label="鍟嗗搧鍚嶇О/鍨嬪彿" min-width="200px">
             <template slot-scope="{row}">
@@ -76,27 +81,26 @@
                   :preview-src-list="[row.prefixUrl + row.imgurl]"
                   fit="cover"></el-image>
                 </div>
-              {{ row.name }}
+                {{ row.name }}
               </div>
             </template>
           </el-table-column>
           <el-table-column prop="brandName" label="鍝佺墝" min-width="100px"></el-table-column>
           <el-table-column prop="categoryName" label="绫诲埆" min-width="100px"></el-table-column>
-          <el-table-column prop="attrFirstNames" label="灞炴��1" min-width="100px"></el-table-column>
-          <el-table-column prop="attrSecodNames" label="灞炴��2" min-width="100px"></el-table-column>
-          <el-table-column prop="zdPrice" label="鎸囧浠凤紙鍏冿級" min-width="100px"></el-table-column>
+          <el-table-column prop="baseZdPrice" label="鎸囧浠凤紙鍏冿級" min-width="100px"></el-table-column>
+          <el-table-column prop="basePrice" label="閲囪喘浠�(鍏�)" min-width="100px"></el-table-column>
           <el-table-column prop="price" 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"
-                    @change="changeStatus(row)"
-                    active-color="#13ce66"
-                    inactive-color="#ff4949"
-                    :active-value="0"
-                    :inactive-value="1">
-                </el-switch>
+              <el-switch
+                v-model="row.status"
+                @change="changeStatus(row)"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                :active-value="0"
+                :inactive-value="1">
+              </el-switch>
             </template>
           </el-table-column>
           <el-table-column
@@ -121,6 +125,8 @@
       </template>
       <!-- 鏂板缓/淇敼 -->
       <OperaGoodsWindow ref="operaGoodsWindow" @success="handlePageChange"/>
+      <!-- 閫夋嫨骞冲彴鍟嗗搧 -->
+      <selectProduct ref="selectProduct" @success="handlePageChange" @result="search"/>
     </TableLayout>
   </template>
   
@@ -129,12 +135,13 @@
   import TableLayout from '@/layouts/TableLayout'
   import Pagination from '@/components/common/Pagination'
   import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
+  import selectProduct from '@/components/business/selectProduct'
   import { brand, category, importExcel } from '@/api/system/common.js'
-  import { updateDisableById, queryById, exportDoc } from '@/api/business/goods.js'
+  import { updateDisableById, queryById, exportDoc, batchUpdateDisableById } from '@/api/business/goods.js'
   export default {
     name: 'Goods',
     extends: BaseTable,
-    components: { TableLayout, Pagination, OperaGoodsWindow },
+    components: { TableLayout, Pagination, OperaGoodsWindow, selectProduct },
     data () {
       return {
         // 鎼滅储
@@ -145,11 +152,12 @@
           categoryId: '',
           brandId: ''
         },
+        ids: '',
         categoryList: [],
         brandList: [],
         statusList: [
-            { name: '鍚敤', id: 0 },
-            { name: '绂佺敤', id: 1 }
+          { name: '鍚敤', id: 0 },
+          { name: '绂佺敤', id: 1 }
         ]
       }
     },
@@ -165,8 +173,26 @@
       this.getcategory()
     },
     methods: {
+      handleSelectionChange(e) {
+        let arr = e.map(item => item.id)
+        this.ids = arr.join(',')
+        console.log(this.ids)
+      },
+      // 鎵归噺涓婁笅鏋�
+      bulkOperation(type) {
+        if (!this.ids) {
+          this.$message.warning({ message: '鑷冲皯閫夋嫨涓�椤瑰唴瀹�' })
+          return
+        }
+        batchUpdateDisableById({
+          ids: this.ids,
+          status: type
+        }).then(res => {
+          this.$message.success({ message: res })
+          this.search()
+        })
+      },
       downloadFile() {
-        // window.open(`${process.env.VUE_APP_API_PREFIX}/business/goods/export`)
         exportDoc({})
           .then(response => {
             this.download(response)
diff --git a/company_admin/src/views/business/pageConfiguration.vue b/company_admin/src/views/business/pageConfiguration.vue
new file mode 100644
index 0000000..6c4a2a4
--- /dev/null
+++ b/company_admin/src/views/business/pageConfiguration.vue
@@ -0,0 +1,205 @@
+<template>
+    <div class="pz">
+        <div class="pz_head">鍩烘湰淇℃伅</div>
+        <div class="pz_item">
+            <div class="pz_item_label">鍐呭鑼冨洿灏哄锛�</div>
+            <div class="pz_item_ipt">
+                <el-input v-model="from.rangeSize" placeholder="鏀寔750px-1200px"></el-input>
+            </div>
+        </div>
+        <div class="pz_item">
+            <div class="pz_item_label">涓昏壊鑹插�硷細</div>
+            <div class="pz_item_ipt">
+                <el-color-picker v-model="from.mainColor"></el-color-picker>
+            </div>
+        </div>
+        <div class="pz_item">
+            <div class="pz_item_label">鑳屾櫙鍥撅細</div>
+            <div class="pz_item_ipt">
+                <el-upload
+                :action="action"
+                :data="{ folder: 'web_param' }"
+                list-type="picture-card"
+                :limit="1"
+                :on-exceed="exceed"
+                :file-list="fileList1"
+                :on-success="fileSuccess1"
+                :on-remove="handleRemove1">
+                <i class="el-icon-plus"></i>
+                </el-upload>
+            </div>
+        </div>
+        <div class="pz_item">
+            <div class="pz_item_label">椤堕儴瀹d紶鍥撅細</div>
+            <div class="pz_item_ipt">
+                <el-upload
+                :action="action"
+                :data="{ folder: 'web_param' }"
+                list-type="picture-card"
+                :on-exceed="exceed"
+                :file-list="fileList2"
+                :on-success="fileSuccess2"
+                :on-remove="handleRemove2">
+                <i class="el-icon-plus"></i>
+                </el-upload>
+            </div>
+        </div>
+        <div class="pz_item">
+            <div class="pz_item_label">PK鍙板浘锛�</div>
+            <div class="pz_item_ipt">
+                <el-upload
+                :action="action"
+                :data="{ folder: 'web_param' }"
+                list-type="picture-card"
+                :on-exceed="exceed"
+                :file-list="fileList3"
+                :on-success="fileSuccess3"
+                :on-remove="handleRemove3">
+                <i class="el-icon-plus"></i>
+                </el-upload>
+            </div>
+        </div>
+        <div class="pz_footer">
+            <el-button type="primary" @click="submit">淇濆瓨</el-button>
+            <el-button>杩斿洖</el-button>
+        </div>
+    </div>
+</template>
+    
+<script>
+import { getByLogin, renew } from '@/api/business/page.js'
+
+export default {
+    data() {
+        return {
+            action: process.env.VUE_APP_API_PREFIX + '/public/upload',
+            from: {
+                rangeSize: '',
+                mainColor: '',
+                bgImg: '',
+                topImg: '',
+                pkImg: ''
+            },
+            fileList1: [],
+            fileList2: [],
+            fileList3: []
+        }
+    },
+    created() {
+        this.getDesc()
+    },
+    methods: {
+        submit() {
+            renew(this.from)
+                .then(res => {
+                    this.$message.success({ message: '淇濆瓨鎴愬姛' })
+                })
+        },
+        getDesc() {
+            getByLogin({})
+                .then(res => {
+                    if (res) {
+                        this.from.rangeSize = res.rangeSize
+                        this.from.mainColor = res.mainColor
+                        if (res.bgImg) {
+                            this.from.bgImg = res.bgImg
+                            this.fileList1 = [{ name: res.bgImg, url: res.resourcePath + res.bgImg }]
+                        }
+                        if (res.topImg) {
+                            this.fileList2 = []
+                            this.from.topImg = res.topImg
+                            let arr = res.topImg.split(',').map(item => item)
+                            arr.forEach(item => {
+                                this.fileList2.push({ name: item, url: res.resourcePath + item })
+                            })
+                        }
+                        if (res.pkImg) {
+                            this.fileList3 = []
+                            this.from.pkImg = res.pkImg
+                            let arr = res.pkImg.split(',').map(item => item)
+                            arr.forEach(item => {
+                                this.fileList3.push({ name: item, url: res.resourcePath + item })
+                            })
+                        }
+                    }
+                })
+        },
+        exceed() {
+            this.$message.warning({ message: '鍙兘涓婁紶涓�寮犲浘鐗�' })
+        },
+
+        handleRemove1(file, fileList) {
+            this.fileList1 = []
+            this.from.bgImg = ''
+        },
+        fileSuccess1(response) {
+            this.fileList1.push({ name: response.data.imgaddr, url: response.data.url })
+            this.from.bgImg = response.data.imgaddr
+        },
+
+        handleRemove2(file, fileList) {
+            this.fileList2.forEach((item, index) => {
+                if (file.name === item.name) {
+                    this.fileList2.splice(index, 1)
+                }
+            })
+            let arr = this.fileList2.map(item => item.name)
+            this.from.topImg = arr.join(',')
+        },
+        fileSuccess2(response) {
+            this.fileList2.push({ name: response.data.imgaddr, url: response.data.url })
+            let arr = this.fileList2.map(item => item.name)
+            this.from.topImg = arr.join(',')
+        },
+
+        handleRemove3(file, fileList) {
+            this.fileList3.forEach((item, index) => {
+                if (file.name === item.name) {
+                    this.fileList3.splice(index, 1)
+                }
+            })
+            let arr = this.fileList3.map(item => item.name)
+            this.from.pkImg = arr.join(',')
+        },
+        fileSuccess3(response) {
+            this.fileList3.push({ name: response.data.imgaddr, url: response.data.url })
+            let arr = this.fileList3.map(item => item.name)
+            this.from.pkImg = arr.join(',')
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+    .pz {
+        width: 100%;
+        padding: 30px;
+        box-sizing: border-box;
+        background-color: #fff;
+        .pz_head {
+            font-size: 20px;
+            margin-bottom: 30px;
+            font-weight: bold;
+        }
+        .pz_item {
+            width: 750px;
+            display: flex;
+            align-items: flex-start;
+            margin-bottom: 30px;
+            .pz_item_label {
+                width: 140px;
+                flex-shrink: 0;
+                font-size: 16px;
+                text-align: right;
+            }
+            .pz_item_ipt {
+                flex: 1;
+            }
+        }
+        .pz_footer {
+            width: 100%;
+            padding-left: 140px;
+            box-sizing: border-box;
+        }
+    }
+</style>
\ No newline at end of file
diff --git a/company_admin/src/views/business/staff.vue b/company_admin/src/views/business/staff.vue
new file mode 100644
index 0000000..dc18899
--- /dev/null
+++ b/company_admin/src/views/business/staff.vue
@@ -0,0 +1,163 @@
+<template>
+    <TableLayout :permissions="['system:user:query']">
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="80px" inline>
+        <el-form-item label="璐﹀彿淇℃伅" prop="keyword">
+          <el-input v-model="searchForm.keyword" v-trim placeholder="璇疯緭鍏ョ櫥褰曡处鍙�/濮撳悕" @keypress.enter.native="search"/>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-select v-model="searchForm.status" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in status"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <section>
+          <el-button type="primary" icon="el-icon-search" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template v-slot:table-wrap>
+        <ul class="toolbar" v-permissions="['system:user:create', 'system:user:delete']">
+          <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.OperaStaffWindow.open('鏂板缓鐢ㄦ埛')">鏂板缓</el-button></li>
+          <!-- <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">鍒犻櫎</el-button></li> -->
+        </ul>
+        <el-table
+          v-loading="isWorking.search"
+          :data="tableData.list"
+          :default-sort = "{prop: 'createTime', order: 'descending'}"
+          stripe
+          @selection-change="handleSelectionChange"
+          @sort-change="handleSortChange"
+        >
+          <el-table-column type="selection" width="55"></el-table-column>
+          <el-table-column prop="username" label="鐧诲綍璐﹀彿"></el-table-column>
+          <el-table-column prop="realname" label="濮撳悕"></el-table-column>
+          <el-table-column prop="mobile" label="鎵嬫満鍙�"></el-table-column>
+          <el-table-column prop="roles" label="瑙掕壊">
+            <template slot-scope="{row}">
+                <ul>
+                    <li style="padding: 0px 5px; background-color: #ececec; border-radius: 8px; display: inline-block; margin-right: 10px;" v-for="role in row.roles" :key="role.id">{{role.name}}</li>
+                </ul>
+            </template>
+          </el-table-column>
+          <el-table-column label="鐘舵��">
+            <template slot-scope="{row}">
+              <el-switch
+                v-model="row.status"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="changeStatus($event, row.id)"
+                :active-value="0"
+                :inactive-value="1">
+              </el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="鍒涘缓鏃堕棿"></el-table-column>
+          <el-table-column
+            v-if="containPermissions(['system:user:update', 'system:user:createUserRole', 'system:user:resetPwd', 'system:user:delete'])"
+            label="鎿嶄綔"
+            width="230"
+            fixed="right"
+          >
+            <template slot-scope="{row}">
+              <el-button type="text" icon="el-icon-edit" @click="edit(row)" v-permissions="['system:user:update']">缂栬緫</el-button>
+              <el-button type="text" @click="editPass(row)" v-permissions="['system:user:resetPwd']">淇敼瀵嗙爜</el-button>
+              <el-button type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+          :pagination="tableData.pagination"
+        ></pagination>
+      </template>
+      <!-- 鏂板缓/淇敼 -->
+      <OperaStaffWindow ref="OperaStaffWindow" @success="handlePageChange"/>
+      <!-- 淇敼瀵嗙爜 -->
+      <OperaAnchorPassWindow ref="OperaAnchorPassWindow" @success="handlePageChange"/>
+    </TableLayout>
+  </template>
+  
+  <script>
+  import Pagination from '@/components/common/Pagination'
+  import TableLayout from '@/layouts/TableLayout'
+  import BaseTable from '@/components/base/BaseTable'
+  import OperaStaffWindow from '@/components/business/OperaStaffWindow'
+  import OperaAnchorPassWindow from '@/components/business/OperaAnchorPassWindow'
+  import { updUserStatus } from '@/api/business/anchor.js'
+  
+  export default {
+    name: 'SystemUser',
+    extends: BaseTable,
+    components: { OperaStaffWindow, OperaAnchorPassWindow, TableLayout, Pagination },
+    data () {
+      return {
+        // 鎼滅储
+        searchForm: {
+          status: '',
+          keyword: '',
+          type: 1
+        },
+        status: [
+          { name: '鍚敤', id: 0 },
+          { name: '绂佺敤', id: 1 }
+        ]
+      }
+    },
+    created () {
+      this.config({
+        module: '鐢ㄦ埛',
+        api: '/business/anchor',
+        'field.main': 'realname',
+        sorts: [{
+          property: 'CREATE_TIME',
+          direction: 'DESC'
+        }]
+      })
+      this.search()
+    },
+    methods: {
+      editPass(row) {
+        let obj = {
+          id: row.id
+        }
+        this.$refs.OperaAnchorPassWindow.open('淇敼瀵嗙爜', obj)
+      },
+      // 淇敼鐘舵��
+      changeStatus(status, id) {
+        updUserStatus({ id, status })
+          .then(res => {
+            console.log(res)
+          })
+      },
+      edit(row) {
+        let obj = {
+          id: row.id,
+          userName: row.username,
+          password: row.password,
+          realName: row.realname,
+          mobile: row.mobile,
+          roleId: row.roles.length > 0 ? row.roles[0].id : null
+        }
+        this.$refs.OperaStaffWindow.open('缂栬緫鐢ㄦ埛', obj)
+      }
+    }
+  }
+  </script>
+  
+<style scoped lang="scss">
+  @import "@/assets/style/variables.scss";
+  // 鍒楄〃澶村儚澶勭悊
+  .table-column-avatar {
+    img {
+      width: 48px;
+    }
+  }
+</style>
+  
\ No newline at end of file
diff --git a/company_admin/src/views/system/menu.vue b/company_admin/src/views/system/menu.vue
index 2e98085..87bf4b3 100644
--- a/company_admin/src/views/system/menu.vue
+++ b/company_admin/src/views/system/menu.vue
@@ -15,7 +15,7 @@
         :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
         row-key="id"
         stripe
-        default-expand-all
+        :default-expand-all="false"
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55" fixed="left"></el-table-column>

--
Gitblit v1.9.3