Mr.Shi
2023-09-15 bf37344fc209db25e887aee5910108e389605d8c
企业端
已添加10个文件
已修改9个文件
1770 ■■■■■ 文件已修改
company_admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/package-lock.json 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/api/business/anchor.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/api/business/category.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/api/business/goods.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/api/business/page.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/OperaAnchorPassWindow.vue 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/OperaAnchorWindow.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/OperaCategoryWindow.vue 278 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/OperaGoodsWindow.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/OperaStaffWindow.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/selectProduct.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/components/business/selectProductItem.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/anchor.vue 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/category.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/goods.vue 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/pageConfiguration.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/staff.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/system/menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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/'
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"
          }
        }
      }
    },
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)
}
company_admin/src/api/business/category.js
@@ -39,3 +39,18 @@
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)
}
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}`)
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)
  }
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>
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>
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">只能上传图片格式,png格式,建议尺寸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
              })
          }
        }
      }
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">只能上传图片格式,png格式,建议尺寸600*600px</div>
          </el-upload>
        </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('编辑成功')
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>
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>
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>
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>
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,
              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)
          })
      }
company_admin/src/views/business/goods.vue
@@ -44,7 +44,6 @@
        </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}">
@@ -82,9 +87,8 @@
          </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">
@@ -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,6 +152,7 @@
          categoryId: '',
          brandId: ''
        },
        ids: '',
        categoryList: [],
        brandList: [],
        statusList: [
@@ -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)
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">顶部宣传图:</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>
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>
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>