doum
2025-12-10 559f6fcd685d2144e931d2c4e56cbe38c2308d70
经销商管理
已添加3个文件
已修改28个文件
4588 ■■■■ 文件已修改
admin/dmmall_admin/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/shop.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaGoodsBrandWindow.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaGoodsLabelsWindow.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHotCityWindow.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaLabelsAreaWindow.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/ResetPwdShopWindow.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/activity.vue 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/areas.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/article.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/goodsBrand.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/goodsLabels.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/labelsArea.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/member.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shop.vue 170 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/admin_start.sh 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/manifest.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/package-lock.json 3746 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/package.json 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/dmmall_admin/index.html
@@ -1 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>咖啡之声后台管理</title><link href="static/css/app.7d97a292.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.5b8aadbb.js" rel="preload" as="script"><link href="static/js/chunk-vendors.433308b2.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.7d97a292.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but å’–啡之声后台管理 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="static/js/chunk-vendors.433308b2.js"></script><script src="static/js/app.5b8aadbb.js"></script></body></html>
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>鼎元农机后台管理</title><link href="static/css/app.7d97a292.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.5b8aadbb.js" rel="preload" as="script"><link href="static/js/chunk-vendors.433308b2.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.7d97a292.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but å’–啡之声后台管理 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="static/js/chunk-vendors.433308b2.js"></script><script src="static/js/app.5b8aadbb.js"></script></body></html>
admin/public/index.html
@@ -5,11 +5,11 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>咖啡之声后台管理</title>
    <title>鼎元农机后台管理</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but å’–啡之声后台管理 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
      <strong>We're sorry but é¼Žå…ƒå†œæœºåŽå°ç®¡ç† doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
admin/src/api/business/shop.js
@@ -30,6 +30,10 @@
export function shopDetail (id) {
  return request.get(`/business/shop/${id}`)
}
// é‡ç½®å¯†ç 
export function resetPwd (data) {
  return request.post('/business/shop/resetPwd', data)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/assets/style/style.scss
@@ -51,7 +51,17 @@
.el-transfer__buttons {
  padding: 0 16px !important;
}
.red{
  color: red;
}
.green{
  color: green;
}
.blue{
  color: blue;
}.orange{
   color: orange;
 }
.table-header {
  background-color: #F5F6F8!important;
  th {
@@ -77,3 +87,30 @@
::v-deep .el-table__cell {
  height: 100% !important;
}
.global-window {
  .tip-header{
    font-size: 16px;
    font-weight: bold;
    margin-bottom: 20px;
  }
  .tip {
    em {
      font-style: normal;
      color: $primary-color;
      font-weight: bold;
    }
  }
  .tip-warn {
    margin: 4px 0 12px 0;
    font-size: 12px;
    color: #999;
    i {
      color: orange;
      margin-right: 4px;
      font-size: 14px;
      position: relative;
      top: 1px;
    }
  }
}
admin/src/components/business/OperaGoodsBrandWindow.vue
@@ -6,11 +6,10 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" label-width="110px" label-suffix=":" inline>
      <el-form-item label="品牌名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入品牌名称" v-trim/>
      </el-form-item>
      <el-form-item label="所属板块" prop="module">
<!--      <el-form-item label="所属板块" prop="module">
        <el-select
          v-model="form.module"
          placeholder="请选择所属板块"
@@ -26,7 +25,7 @@
            label="咖豆商城"
          ></el-option>
        </el-select>
      </el-form-item>
      </el-form-item>-->
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
@@ -48,17 +47,17 @@
      form: {
        id: null,
        name: '',
        module: '',
        module: 0,
        type: '1',
        sortnum: ''
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, messgae: '请输入品牌名称', tigger: 'blur' }
          { required: true, message: '请输入品牌名称', tigger: 'blur' }
        ],
        type: [
          { required: true, messgae: '请选择所属板块', tigger: 'change' }
          { required: true, message: '请选择所属板块', tigger: 'change' }
        ],
      }
    }
admin/src/components/business/OperaGoodsLabelsWindow.vue
@@ -10,7 +10,7 @@
      <el-form-item label="分类名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入分类名称" v-trim/>
      </el-form-item>
      <el-form-item label="所属板块" prop="module">
<!--      <el-form-item label="所属板块" prop="module">
        <el-select
          v-model="form.module"
          placeholder="请选择所属板块"
@@ -26,7 +26,7 @@
            label="咖豆商城"
          ></el-option>
        </el-select>
      </el-form-item>
      </el-form-item>-->
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
@@ -48,17 +48,17 @@
      form: {
        id: null,
        name: '',
        module: '',
        module: 0,
        type: '0',
        sortnum: ''
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, messgae: '请输入分类名称', tigger: 'blur' }
          { required: true, message: '请输入分类名称', tigger: 'blur' }
        ],
        type: [
          { required: true, messgae: '请选择所属板块', tigger: 'change' }
          { required: true, message: '请选择所属板块', tigger: 'change' }
        ],
      }
    }
admin/src/components/business/OperaHotCityWindow.vue
@@ -72,7 +72,7 @@
      rules: {
        cityId: [
          { required: true, validator: newRule, trigger: 'change' }
        ],
        ]
      }
    }
  },
@@ -97,13 +97,12 @@
        .catch(e => {
          this.$tip.error(e)
        })
    },
    numInput() {
      // =""
      this.form.sortnum = this.form.sortnum.replace(/^(0+)|[^\d]+/g,'')
    },
  },
    }
  }
}
</script>
admin/src/components/business/OperaLabelsAreaWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
<template>
  <GlobalAlertWindow
    v-loading="isUploading"
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix=":"  inline>
      <el-form-item label="区域名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入分类名称" :maxlength="5" v-trim/>
      </el-form-item>
      <el-form-item label="选择省份" prop="name">
        <el-select v-model="form.areaIdList" placeholder="请选择省份" multiple filterable>
          <el-option
              v-for="item in province"
              :key="item.id"
              :value="item.id"
              :label="item.name"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalAlertWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import { listByParentId } from '@/api/business/areas'
export default {
  name: 'OperaLabelsWindow',
  extends: BaseOpera,
  components: { GlobalAlertWindow },
  data () {
    return {
      isUploading: false,
      // è¡¨å•数据
      form: {
        id: null,
        name: '',
        info: '',
        type: 13,
        module: 0,
        sortnum: '',
        areaIdList: [],
        areaList: []
      },
      province: [],
      // éªŒè¯è§„则
      rules: {
      }
    }
  },
  created () {
    this.config({
      api: '/business/labels',
      'field.id': 'id'
    })
    listByParentId({ type: 0, parentId: '' })
      .then(data => {
        this.province = data
      })
  },
  methods: {
    open (title, target) {
      var that =this
      this.title = title
      this.visible = true
      // this.isEdit = false
      this.form.areaList = []
      this.form.areaIdList = []
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        this.isEdit = true
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        that.form.areaIdList = []
        if (this.form.areaList && this.form.areaList.length) {
          this.form.areaList.forEach(item => {
            that.form.areaIdList.push(item.id)
          })
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/alertstyle.scss";
$image-width: 100px;
::v-deep .el-select {
    width: 100%;
    .el-input__inner {
      width: 100%;
    }
  }
.avatar-uploader {
  width: $image-width;
  height: $image-width;
}
::v-deep .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  width: $image-width;
  height: $image-width;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409EFF;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: $image-width;
  height: $image-width;
  line-height: $image-width;
  text-align: center;
}
.avatar {
  width: $image-width;
  height: $image-width;
  display: block;
}
</style>
admin/src/components/business/ResetPwdShopWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <GlobalWindow
    :visible.sync="visible"
    :confirm-working="isWorking"
    width="576px"
    title="重置密码"
    @confirm="confirm"
  >
    <p class="tip" v-if="user != null">为经销商 <em>{{shop.realname}}</em> é‡ç½®å¯†ç </p>
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="新密码" prop="password" required>
        <el-input v-model="form.password" type="password" placeholder="请输入新密码" maxlength="30" show-password></el-input>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import { resetPwd } from '@/api/business/shop'
export default {
  name: 'ResetPwdWindow',
  components: { GlobalWindow },
  data () {
    return {
      isWorking: false,
      visible: false,
      shop: null,
      form: {
        password: ''
      },
      rules: {
        password: [
          { required: true, message: '请输入密码' }
        ]
      }
    }
  },
  methods: {
    open (shop) {
      this.shop = shop
      this.visible = true
      this.$nextTick(() => {
        this.$refs.form.resetFields()
      })
    },
    // ç¡®è®¤é‡ç½®å¯†ç 
    confirm () {
      if (this.isWorking) {
        return
      }
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        this.isWorking = true
        resetPwd({
          id: this.user.id,
          password: this.form.password
        })
          .then(() => {
            this.$tip.apiSuccess('密码重置成功')
            this.visible = false
            this.$emit('success')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    }
  }
}
</script>
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
// è§’色配置
.global-window {
  .tip {
    margin-bottom: 12px;
    em {
      font-style: normal;
      color: $primary-color;
      font-weight: bold;
    }
  }
}
</style>
admin/src/components/common/CommonHeader.vue
@@ -2,7 +2,7 @@
  <div class="common-header">
    <div class="header">
      <div class="logo">
        <div>咖啡之声后台管理</div>
        <div>鼎元农机后台管理</div>
        <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
      </div>
      <div class="user">
admin/src/views/business/activity.vue
admin/src/views/business/areas.vue
@@ -2,10 +2,6 @@
  <TableLayout :permissions="['business:areas:query']">
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <!-- <ul class="toolbar" v-permissions="['business:areas:create', 'business:areas:delete']">
        <li><el-button type="primary" @click="$refs.operaAreasWindow.open('新建省')" icon="el-icon-plus" v-permissions="['business:areas:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:areas:delete']">删除</el-button></li>
      </ul> -->
      <el-table
        ref="table"
        v-loading="isWorking.search"
@@ -22,6 +18,7 @@
      >
        <el-table-column prop="name" label="地区名称" min-width="100px">
          <template slot-scope="{ row }">
            {{row.name}}<span v-if="row.type ===0 && row.bigAreaName !=null && row.bigAreaName !=''" class="green">【{{row.bigAreaName}}】</span>
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="创建时间" align="center" min-width="140px"></el-table-column>
admin/src/views/business/article.vue
@@ -14,7 +14,6 @@
          <el-option v-for="item in labels" :key="item.id" :value="item.id" :label="item.name" />
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
admin/src/views/business/goodsBrand.vue
@@ -5,7 +5,7 @@
      <el-form-item label="品牌名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入品牌名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="所属板块" prop="module">
<!--      <el-form-item label="所属板块" prop="module">
        <el-select
          v-model="searchForm.module"
          placeholder="请选择所属板块"
@@ -21,7 +21,7 @@
            label="咖豆商城"
          ></el-option>
        </el-select>
      </el-form-item>
      </el-form-item>-->
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
admin/src/views/business/goodsLabels.vue
@@ -5,7 +5,7 @@
      <el-form-item label="分类名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入分类名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="所属板块" prop="module">
<!--      <el-form-item label="所属板块" prop="module">
        <el-select
          v-model="searchForm.module"
          placeholder="请选择所属板块"
@@ -21,7 +21,7 @@
            label="咖豆商城"
          ></el-option>
        </el-select>
      </el-form-item>
      </el-form-item>-->
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
admin/src/views/business/labelsArea.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <TableLayout :permissions="['business:labels:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="区域名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:labels:create', 'business:labels:delete']">
        <li><el-button type="primary" @click="$refs.operaLabelsWindow.open('新建大区信息')" icon="el-icon-plus" v-permissions="['business:labels:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:labels:delete']">删除</el-button></li>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        border
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="分类名称" min-width="100px"></el-table-column>
        <el-table-column prop="areas" label="包含地区" min-width="200px" align="center">
          <template slot-scope="{row}">
            <div v-if="row.areaList && row.areaList.length" >
              <span v-for="item in row.areaList">{{item.name}}; </span>
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="最近更新时间" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:labels:update', 'business:labels:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaLabelsWindow.open('编辑区域信息', row)" icon="el-icon-edit" v-permissions="['business:labels:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:labels:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaLabelsWindow ref="operaLabelsWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaLabelsWindow from '@/components/business/OperaLabelsAreaWindow'
export default {
  name: 'Labels',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaLabelsWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        type: 13
      }
    }
  },
  created () {
    this.config({
      module: '标签信息表',
      api: '/business/labels',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
  }
}
</script>
admin/src/views/business/member.vue
@@ -28,7 +28,7 @@
        <el-table-column prop="name" label="真实姓名" align="center"  min-width="100px"></el-table-column>
        <el-table-column prop="phone" label="手机号" align="center"  min-width="100px"></el-table-column>
        <el-table-column prop="idcard" label="身份证号" align="center"  min-width="100px"></el-table-column>
        <el-table-column prop="integral" label="咖豆数量" align="center"  min-width="100px"></el-table-column>
        <el-table-column prop="integral" label="积分数量" align="center"  min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" align="center"  min-width="140px"></el-table-column>
        <el-table-column label="状态" align="center"  min-width="100px">
          <template slot-scope="{row}">
admin/src/views/business/shop.vue
@@ -2,50 +2,28 @@
  <TableLayout :permissions="['business:shop:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="店铺名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入店铺名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="店铺状态" prop="status">
      <el-form-item label="登录账号" prop="name">
        <el-input v-model="searchForm.username" placeholder="请输入登录账号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="销售模式" prop="saleType" >
        <!-- 0正常 1禁用 -->
        <el-select
          v-model="searchForm.status"
          placeholder="请选择店铺状态"
        >
          <el-option
            :key="0"
            :value="0"
            label="正常"
          ></el-option>
          <el-option
            :key="1"
            :value="1"
            label="禁用"
          ></el-option>
        <el-select     v-model="searchForm.saleType"  placeholder="销售模式"  @change="search"  >
          <el-option  :key="0" :value="0"  label="平台铺货"  ></el-option>
          <el-option   :key="1" :value="1" label="自主采购"  ></el-option>
        </el-select>
        <!-- <el-input v-model="searchForm.status" placeholder="请输入状态0正常 1禁用" @keypress.enter.native="search"></el-input> -->
      </el-form-item>
      <el-form-item label="推荐" prop="isrec">
        <!-- 0否 1是 -->
        <el-select
          v-model="searchForm.isrec"
          placeholder="请选择店铺状态"
        >
          <el-option
            :key="0"
            :value="0"
            label="否"
          ></el-option>
          <el-option
            :key="1"
            :value="1"
            label="是"
          ></el-option>
      <el-form-item label="状态" prop="status">
        <!-- 0正常 1禁用 -->
        <el-select     v-model="searchForm.status"  placeholder="请选择状态"    @change="search"   >
          <el-option  :key="0" :value="0"  label="正常"  ></el-option>
          <el-option   :key="1" :value="1" label="禁用"  ></el-option>
        </el-select>
        <!-- <el-input v-model="searchForm.isrec" placeholder="请输入是否推荐0否 1是" @keypress.enter.native="search"></el-input> -->
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <!-- <el-button type="primary" @click="showDetail">搜索</el-button> -->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
@@ -63,37 +41,44 @@
        @selection-change="handleSelectionChange"
      >
        <!-- <el-table-column type="selection" width="55"></el-table-column> -->
        <el-table-column prop="name" label="店铺名称" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="imgurl" label="店铺LOGO" align="center" min-width="100px">
        <el-table-column prop="name" label="名称" fixed align="center" min-width="100px">
          <template slot-scope="{row}">
            <el-image :scr="row.imgFullUrl + row.imgurl" :preview-src-list="[row.imgFullUrl + row.imgurl]"></el-image>
            <el-button type="text" @click="showDetail(row)">{{row.name}}</el-button>
          </template>
        </el-table-column>
        <el-table-column prop="addr" label="地址" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="门店ID" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="integral" label="现有积分" align="center" min-width="100px">
          <template slot-scope="{row}">
            <span class="orange">{{(row.integral || 0).toFixed(0)}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="totalIntegral" label="累计积分" align="center" min-width="100px">
          <template slot-scope="{row}">
            <span class="orange">  {{(row.totalIntegral || 0).toFixed(0)}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="username" label="登录账号" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="bigAreaName" label="所属区域" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="areaFullName" label="省市区" align="center" min-width="150px" show-overflow-tooltip>
          <template slot-scope="{row}">
            <span v-if="row.areas!=null">{{(row.areas.provinceName||'') + (row.areas.cityName||'') + (row.areas.name||'')}}</span>
          </template>
        </el-table-column>
<!--        <el-table-column prop="imgurl" label="门头图" align="center" min-width="100px">
          <template slot-scope="{row}">
            <el-image v-if=" row.imgurl" :scr="row.imgFullUrl + row.imgurl" :preview-src-list="[row.imgFullUrl + row.imgurl]"></el-image>
          </template>
        </el-table-column>-->
        <el-table-column prop="addr" label="详细地址" align="center" min-width="150px" show-overflow-tooltip></el-table-column>
        <el-table-column prop="realname" label="联系人" align="center" min-width="100px"></el-table-column>
        <el-table-column prop="phone" label="联系电话" align="center" min-width="150px"></el-table-column>
        <el-table-column prop="saleType"  label="销售模式" align="center" min-width="150px">
          <template slot-scope="{row}">
            {{ row.saleType == 1?'自主采购':'平台铺货'}}
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="创建时间" align="center" min-width="140px"></el-table-column>
        <el-table-column label="负责人" align="center" min-width="150px">
          <template slot-scope="{row}">
            {{ `${row.nickName} ${row.memberPhone}` }}
          </template>
        </el-table-column>
        <el-table-column label="经销商数据" align="center" min-width="150px">
          <template slot-scope="{row}">
            <el-button type="text" @click="showDetail(row)">查看</el-button>
          </template>
        </el-table-column>
        <el-table-column prop="isrec" label="是否推荐" align="center" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
              v-model="row.isrec"
              active-color="#13ce66"
              inactive-color="#999"
              :active-value="1"
              :inactive-value="0"
              @change="statusChange(row)"
            ></el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="status" label="状态" align="center" min-width="100px">
        <el-table-column prop="status" label="状态" align="center" min-width="100px" fixed="right">
          <template slot-scope="{row}">
            <el-switch
              v-model="row.status"
@@ -105,38 +90,18 @@
            ></el-switch>
          </template>
        </el-table-column>
        <!-- <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="sex" label="性别 0男 1女 2未知" min-width="100px"></el-table-column>
        <el-table-column prop="idcard" label="身份证号" min-width="100px"></el-table-column>
        <el-table-column prop="idcardImg" label="身份证正面照" min-width="100px"></el-table-column>
        <el-table-column prop="idcardImgBack" label="身份证反面照" min-width="100px"></el-table-column>
        <el-table-column prop="businessImg" label="营业执照" min-width="100px"></el-table-column>
        <el-table-column prop="longitude" label="定位经度" min-width="100px"></el-table-column>
        <el-table-column prop="latitude" label="定位维度" min-width="100px"></el-table-column>
        <el-table-column prop="areaId" label="所属县区编码(关联areas)" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="店铺描述" min-width="100px"></el-table-column>
        <el-table-column prop="origin" label="数据来源 0小程序申请 1后台录入" min-width="100px"></el-table-column>
        <el-table-column prop="memberId" label="用户编码(关联member表)" min-width="100px"></el-table-column>
        <el-table-column prop="applyId" label="申请编码(关联shop_apply表)" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="looknum" label="总浏览量" min-width="100px"></el-table-column>
        <el-table-column prop="startTime" label="营业开始时间" min-width="100px"></el-table-column>
        <el-table-column prop="endTime" label="营业结束时间" min-width="100px"></el-table-column>
        <el-table-column prop="brandStory" label="品牌故事" min-width="100px"></el-table-column> -->
        <el-table-column
          v-if="containPermissions(['business:shop:update', 'business:shop:delete'])"
          label="操作"
          min-width="120"
          min-width="200"
          fixed="right"
          align="center"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaShopWindow.open('编辑店铺', row)" icon="el-icon-edit" v-permissions="['business:shop:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:shop:delete']">删除</el-button>
            <el-button type="text" @click="$refs.operaShopWindow.open('编辑经销商', row)" icon="el-icon-edit" v-permissions="['business:shop:update']">编辑</el-button>
            <el-button type="text" @click="resetPwd(row)" icon="el-icon-edit"  v-permissions="['business:shop:update']">重置密码</el-button>
            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:shop:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -150,6 +115,7 @@
    <!-- æ–°å»º/修改 -->
    <OperaShopWindow ref="operaShopWindow" @success="handlePageChange"/>
    <OperaShopDetailWindow ref="operaShopDetailWindow" />
    <ResetPwdShopWindow ref="resetPwdWindow"/>
  </TableLayout>
</template>
@@ -159,19 +125,22 @@
import Pagination from '@/components/common/Pagination'
import OperaShopWindow from '@/components/business/OperaShopWindow'
import OperaShopDetailWindow from '@/components/business/OperaShopDetailWindow'
import { updateIsRecById } from '@/api/business/shop'
import { resetPwd, updateIsRecById } from '@/api/business/shop'
import ResetPwdShopWindow from '@/components/business/ResetPwdShopWindow'
export default {
  name: 'Shop',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaShopWindow, OperaShopDetailWindow },
  components: { TableLayout, Pagination, OperaShopWindow, OperaShopDetailWindow, ResetPwdShopWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        username: '',
        status: '',
        isrec: '',
        saleType: '',
        isrec: ''
      }
    }
  },
@@ -185,6 +154,23 @@
    this.search()
  },
  methods: {
    resetPwd (row) {
      this.$dialog.messageWaring('确认重置该经销商【' + row.name + '】的登录密码吗?')
        .then(() => {
          resetPwd({
            id: row.id
          })
            .then(() => {
              this.$tip.apiSuccess('密码重置成功')
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
            })
        })
    },
    statusChange(row) {
      updateIsRecById(row)
        .then(() => {
@@ -200,6 +186,6 @@
    showDetail(row) {
      this.$refs.operaShopDetailWindow.open('店铺详情', row)
    }
  },
  }
}
</script>
admin/src/views/login.vue
@@ -5,7 +5,7 @@
      <div class="wrap">
        
        <div class="introduce">
          <h2>咖啡之声后台管理</h2>
          <h2>鼎元农机后台管理</h2>
        </div>
        <div class="login">
          <h1>账号登录</h1>
admin/vue.config.js
@@ -1,9 +1,12 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length)
const webpack = require('webpack')
//const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length)
const path = require('path')
function resolve (dir) {
  return path.join(__dirname, dir)
}
module.exports = {
  publicPath: './',
  outputDir: outputDir || 'test',
  outputDir: 'dmmall_admin' || 'test',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
@@ -20,11 +23,10 @@
    }
  },
  configureWebpack: {
    plugins: [
      new webpack.ProvidePlugin({
        'window.Quill': 'quill/dist/quill.js',
        Quill: 'quill/dist/quill.js'
      })
    ]
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  }
}
server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java
@@ -3,15 +3,18 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.ResetSystemUserPwdDTO;
import com.doumee.service.business.ShopService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;    
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -105,4 +108,13 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(shopService.findById(id));
    }
    @PreventRepeat
    @ApiOperation("重置经销商密码")
    @PostMapping("/resetPwd")
    @RequiresPermissions("system:user:resetPwd")
    public ApiResponse resetPwd ( @RequestBody Shop dto) {
        shopService.resetPwd(dto);
        return ApiResponse.success(null);
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -81,6 +81,12 @@
    @ApiModelProperty(value = "身份证正面照")
    @ExcelColumn(name="身份证正面照")
    private String idcardImg;
    @ApiModelProperty(value = "法人姓名")
    @ExcelColumn(name="法人姓名")
    private String legalPersonName;
    @ApiModelProperty(value = "法人电话")
    @ExcelColumn(name="法人电话")
    private String legalPersonPhone;
    @ApiModelProperty(value = "身份证反面照")
    @ExcelColumn(name="身份证反面照")
@@ -89,23 +95,45 @@
    @ApiModelProperty(value = "营业执照")
    @ExcelColumn(name="营业执照")
    private String businessImg;
    @ApiModelProperty(value = "商家编号")
    @ExcelColumn(name="商家编号")
    private String code;
    @ApiModelProperty(value = "登录名")
    @ExcelColumn(name="登录名")
    private String username;
    @ApiModelProperty(value = "密码盐")
    @ExcelColumn(name="密码盐")
    private String salt;
    @ApiModelProperty(value = "登录密码")
    @ExcelColumn(name="登录密码")
    private String password;
    @ApiModelProperty(value = "宣传海报")
    @ExcelColumn(name="宣传海报")
    private String posterImg;
    @ApiModelProperty(value = "销售模式 0平台店铺 1自主采购")
    @ExcelColumn(name="销售模式 0平台店铺 1自主采购")
    private Integer saleType;
    @ApiModelProperty(value = "销售模式 0平台店铺 1自主采购")
    @ExcelColumn(name="销售模式 0平台店铺 1自主采购")
    private Integer bigAreaId;
    @ApiModelProperty(value = "积分余额")
    @ExcelColumn(name="积分余额")
    private BigDecimal integral;
    @ApiModelProperty(value = "积分累计")
    @ExcelColumn(name="积分累计")
    private BigDecimal totalIntegral;
    @ApiModelProperty(value = "状态0正常 1禁用", example = "1")
    @ExcelColumn(name="状态0正常 1禁用")
    private Integer status;
    @ApiModelProperty(value = "定位经度", example = "1")
    @ExcelColumn(name="定位经度")
    private BigDecimal longitude;
    @ApiModelProperty(value = "定位维度", example = "1")
    @ExcelColumn(name="定位维度")
    private BigDecimal latitude;
    @ApiModelProperty(value = "所属县区编码(关联areas)", example = "1")
    @ExcelColumn(name="所属县区编码(关联areas)")
    private Integer areaId;
    @ApiModelProperty(value = "地址")
    @ExcelColumn(name="地址")
    private String addr;
@@ -160,10 +188,19 @@
    @ApiModelProperty(value = "用户电话")
    @TableField(exist = false)
    private String memberPhone;
    @ApiModelProperty(value = "省市区")
    @TableField(exist = false)
    private Areas areas;
    @ApiModelProperty(value = "所属大区名称")
    @TableField(exist = false)
    private String bigAreaName;
    @ApiModelProperty(value = "文件地址")
    @TableField(exist = false)
    private String imgFullUrl;
    @ApiModelProperty(value = "定位信息")
    @TableField(exist = false)
    private String locationInfo;
    @ApiModelProperty(value = "门店打分")
    @TableField(exist = false)
server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java
@@ -4,6 +4,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.ResetSystemUserPwdDTO;
import com.doumee.dao.web.dto.shop.ShopDTO;
import com.doumee.dao.web.dto.shop.ShopDataStatisticsDTO;
import com.doumee.dao.web.dto.shop.ShopFaceDetailDTO;
@@ -157,4 +158,6 @@
     * @return
     */
    ShopDataStatisticsDTO getShopDataStatisticsDTO(Integer shopId);
    void resetPwd(Shop dto);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -497,7 +497,20 @@
        String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse("");
        return cityName+areaName;
    }
    public static Areas getAddressByAreaId(Integer areaId) {
        if(areaId ==null){
            return null;
        }
        if(AREA_LIST!=null){
            for(Areas a : AREA_LIST){
                if(Constants.equalsInteger(a.getId(),areaId)){
                    return a;
//                    return  StringUtils.defaultString(a.getProvinceName(),"")+StringUtils.defaultString(a.getCityName(),"")+StringUtils.defaultString(a.getName(),"")
                }
            }
        }
        return null;
    }
    @Override
    public List<Areas> getCityList(Areas areas)  {
        //查询全部城市数据
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -16,6 +16,7 @@
import com.doumee.dao.business.model.Member;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.IntegralService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -51,7 +52,6 @@
    @Autowired
    private IntegralJoinMapper integralJoinMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
@@ -18,12 +18,14 @@
import com.doumee.dao.business.model.Goods;
import com.doumee.dao.business.model.Labels;
import com.doumee.dao.web.response.LabelsResponse;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.LabelsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
@@ -54,6 +56,8 @@
    private AreasMapper areasMapper;
    @Autowired
    private AreasService areasService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
@@ -64,6 +68,8 @@
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        labels.setCreator(user.getId());
        labels.setCreateDate(new Date());
        labels.setEditor(user.getId());
        labels.setEditDate(labels.getCreateDate());
        labels.setIsdeleted(Constants.ZERO);
        labels.setStatus(Constants.ZERO);
    /*  if(labels.getParentId()!=null){
@@ -79,6 +85,7 @@
            areasMapper.update(null,new UpdateWrapper<Areas>().lambda()
                    .set(Areas::getBigAreaId,labels.getId())
                    .in(Areas::getId,labels.getAreaIdList()));
            areasService.cacheData();
        }
        return labels.getId();
    }
@@ -106,6 +113,15 @@
        labels.setEditDate(new Date());
        labels.setEditor(user.getId());
        labelsMapper.updateById(labels);
        if(query!=null && Constants.equalsInteger(query.getType(),Constants.LabelsType.BIG_AREA.getKey())){
            int num =  areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
                    .set(Areas::getBigAreaId, null)
                    .eq(Areas::getBigAreaId, labels.getId()));
            if(num>0){
                areasService.cacheData();
            }
        }
    }
    @Override
@@ -125,13 +141,20 @@
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Labels labels=new Labels();
        ids.stream().forEach(s->{
        int num =0;
        for(Integer s : ids){
            labels.setId(s);
            labels.setIsdeleted(Constants.ONE);
            labels.setEditDate(new Date());
            labels.setEditor(user.getId());
            labelsMapper.updateById(labels);
        });
            num +=  areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
                    .set(Areas::getBigAreaId, null)
                    .eq(Areas::getBigAreaId, labels.getId()));
        }
        if(num>0){
            areasService.cacheData();
        }
    }
    @Override
@@ -149,16 +172,19 @@
        labelsMapper.updateById(labels);
        if(Constants.equalsInteger(model.getType(),Constants.LabelsType.BIG_AREA.getKey())){
            //先清空原来所有绑定的数据
            areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
           int num =  areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
                    .set(Areas::getBigAreaId, null)
                    .eq(Areas::getBigAreaId, labels.getId()));
            if( labels.getAreaIdList()!=null
                    &&labels.getAreaIdList().size()>0){
                //设置最新绑定的数据
                areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
                num +=   areasMapper.update(null, new UpdateWrapper<Areas>().lambda()
                        .set(Areas::getBigAreaId, labels.getId())
                        .in(Areas::getId, labels.getAreaIdList()));
            }
            if(num>0){
                areasService.cacheData();
            }
        }
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -10,6 +10,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.LabelsMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ShopJoinMapper;
import com.doumee.dao.business.ShopMapper;
@@ -24,6 +25,7 @@
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.dto.ResetSystemUserPwdDTO;
import com.doumee.dao.web.dto.shop.*;
import com.doumee.service.business.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -31,6 +33,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.shiro.SecurityUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
@@ -101,6 +104,8 @@
    @Autowired
    private ShopNewsService shopNewsService;
    @Autowired
    private LabelsMapper labelsMapper;
    @Autowired
    private MultifileService multifileService;
@@ -112,44 +117,68 @@
        isCreateParamValid(shop,user);
        shop.setCreator(user.getId());
        shop.setCreateDate(new Date());
        shop.setEditor(user.getId());
        shop.setEditDate(shop.getCreateDate());
        shop.setIsdeleted(Constants.ZERO);
        shop.setStatus(Constants.ZERO);
        shop.setIsrec(Constants.ONE);
        shop.setOrigin(Constants.ONE);
        shop.setSaleType(Constants.formatIntegerNum(shop.getSaleType()));
        String salt = RandomStringUtils.randomAlphabetic(6);
        shop.setPassword(shop.getCode()+"@123456");
        // ç”Ÿæˆå¯†ç 
        shop.setPassword(Utils.Secure.encryptPassword(shop.getPassword(), salt));
        shop.setSalt(salt);
        shopMapper.insert(shop);
        return shop.getId();
    }
    public void isCreateParamValid(Shop shop , LoginUserInfo user){
        if(StringUtils.isBlank(shop.getName())||
        StringUtils.isBlank(shop.getImgurl())||
                shop.getMemberId()==null
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), ResponseStatus.BAD_REQUEST.getMessage());
        try {
            String[] ss = shop.getLocationInfo().split(",");
            shop.setLatitude(BigDecimal.valueOf(Double.parseDouble(ss[0])));
            shop.setLongitude(BigDecimal.valueOf(Double.parseDouble(ss[1])));
        }catch (Exception e){
        }
        Member member=memberMapper.selectById(shop.getMemberId());
        if(StringUtils.isBlank(shop.getUsername())
                ||  StringUtils.isBlank(shop.getPhone())
                ||  StringUtils.isBlank(shop.getBusinessImg())
                ||  StringUtils.isBlank(shop.getStartTime())
                ||   shop.getLatitude()==null
                ||   shop.getLongitude()==null
                ||   shop.getBigAreaId()==null
                ||   shop.getAreaId()==null
                ||  StringUtils.isBlank(shop.getRealname())
                ||  StringUtils.isBlank(shop.getName())
                ||  StringUtils.isBlank(shop.getCode())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(AreasServiceImpl.getAddressByAreaId(shop.getAreaId()) ==null){
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"店铺负责人不存在");
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请选择正确的省市区信息~");
        }
        Shop query=new Shop();
        query.setIsdeleted(Constants.ZERO);
        query.setMemberId(shop.getMemberId());
        if(shop.getId()!=null){
            Shop result= shopMapper.selectOne(new QueryWrapper<>(query)
            .last("limit 1")
            );
            if(!Constants.equalsInteger(result.getId(),shop.getId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"店铺负责人已被关联,请从新选择负责人");
        if(labelsMapper.selectById(shop.getBigAreaId()) ==null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请选择正确的区域信息~");
            }
        }else{
            List<Shop> result= shopMapper.selectList(new QueryWrapper<>(query));
            if(org.apache.commons.collections.CollectionUtils.isNotEmpty(result)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"店铺负责人已存在,请从新选择负责人");
        if(shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
                .eq(Shop::getName,shop.getName())
                .ne(shop.getId()!=null,Shop::getId,shop.getId())
                .eq(Shop::getIsdeleted,Constants.ZERO))>0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"经销商名称重复,请返回修改~");
            }
        if(shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
                .eq(Shop::getCode,shop.getCode())
                .ne(shop.getId()!=null,Shop::getId,shop.getId())
                .eq(Shop::getIsdeleted,Constants.ZERO))>0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"门店ID重复,请返回修改~");
        }
        if(shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
                .eq(Shop::getUsername,shop.getUsername())
                .ne(shop.getId()!=null,Shop::getId,shop.getId())
                .eq(Shop::getIsdeleted,Constants.ZERO))>0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"登录账号重复,请返回修改~");
        }
    }
    @Override
@@ -279,6 +308,10 @@
        if(Objects.nonNull(shop)&&StringUtils.isNotBlank(shop.getImgurl())){
            shop.setImgFullUrl(path+shop.getImgurl());
        }
        shop.setAreas(AreasServiceImpl.getAddressByAreaId(shop.getAreaId()));
        if(shop.getLatitude()!=null && shop.getLongitude()!=null){
            shop.setLocationInfo(shop.getLatitude().doubleValue()+","+shop.getLongitude().doubleValue());
        }
        MPJLambdaWrapper<ProductLabel> queryproduct = new MPJLambdaWrapper<>();
        queryproduct.selectAs(Labels::getName,ProductLabel::getLablesName);
        queryproduct.eq(ProductLabel::getIsdeleted,Constants.ZERO);
@@ -308,24 +341,32 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.selectAll(Shop.class);
        queryWrapper.selectAs(Labels::getName,Shop::getBigAreaName);
        queryWrapper.selectAs(Member::getNickname,Shop::getNickName);
        queryWrapper.selectAs(Member::getImgurl,Shop::getMemberImgurl);
        queryWrapper.selectAs(Member::getPhone,Shop::getMemberPhone);
        queryWrapper.leftJoin(Member.class,Member::getId,Shop::getMemberId);
        queryWrapper.leftJoin(Labels.class,Labels::getId,Shop::getBigAreaId);
        queryWrapper.eq(Shop::getIsdeleted, Constants.ZERO);
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),s->s.like(Shop::getName,pageWrap.getModel().getName()));
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()) ,Shop::getCode,pageWrap.getModel().getCode());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getUsername()) ,Shop::getName,pageWrap.getModel().getUsername());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()) ,Shop::getName,pageWrap.getModel().getName());
        queryWrapper.eq(pageWrap.getModel().getSaleType()!=null, Shop::getSaleType, pageWrap.getModel().getSaleType());
        queryWrapper.eq(pageWrap.getModel().getStatus()!=null, Shop::getStatus, pageWrap.getModel().getStatus());
        queryWrapper.eq(pageWrap.getModel().getIsrec()!=null, Shop::getIsrec, pageWrap.getModel().getIsrec());
        queryWrapper.orderByDesc(Shop::getCreateDate);
        IPage<Shop> result = shopJoinMapper.selectJoinPage(page, Shop.class, queryWrapper);
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILE).getCode();
        for(Shop model:result.getRecords()){
            model.setImgFullUrl(path);
            model.setAreas( AreasServiceImpl.getAddressByAreaId(model.getAreaId()));
            if(model.getLatitude()!=null && model.getLongitude()!=null){
                model.setLocationInfo(model.getLatitude().doubleValue()+","+model.getLongitude().doubleValue());
            }
        }
        return PageData.from(result );
    }
@@ -530,4 +571,18 @@
        shopScan.setMemberId(shop.getMemberId());
        shopScanService.create(shopScan);
    }
    @Override
    public void resetPwd(Shop dto) {
        // æŸ¥è¯¢ç”¨æˆ·
        Shop shop = findById(dto.getId());
        if (shop == null) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // ä¿®æ”¹å¯†ç 
        Shop updateUserDto = new Shop();
        updateUserDto.setId(dto.getId());
        updateUserDto.setPassword(Utils.Secure.encryptPassword( shop.getCode()+"@123456", shop.getSalt()));
        shopMapper.updateById(updateUserDto);
    }
}
server/startsh/admin_start.sh
@@ -9,7 +9,3 @@
nohup java -jar /usr/local/jars/dmmall/dmmall_web_api.jar > /dev/null 2>&1 &
cd /usr/local/ortools/java_or-tools
web/manifest.json
@@ -1,6 +1,6 @@
{
    "name" : "smallRoutine",
    "appid" : "",
    "appid" : "__UNI__7C0C90D",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
@@ -45,6 +45,7 @@
            "sdkConfigs" : {}
        }
    },
    "sassImplementationName": "node-sass",
    /* SDK配置 */
    "quickapp" : {},
    /* å¿«åº”用特有相关 */
web/package-lock.json
ÎļþÌ«´ó
web/package.json
@@ -17,6 +17,7 @@
    },
    "devDependencies": {
        "node-sass": "^4.14.0",
        "sass": "^1.95.1",
        "sass-loader": "^8.0.2"
    },
    "author": "uView",
@@ -27,5 +28,6 @@
            "前端组件",
            "通用组件"
        ]
    }
    },
    "dependencies": {}
}