jiaosong
2023-09-21 2193f1e8240e2a0ed5900dddc6347a1d9db081cf
Merge remote-tracking branch 'origin/dev' into dev
已添加8个文件
已修改30个文件
885 ■■■■ 文件已修改
company_admin/.env.development 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/api/system/menu.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/src/views/business/goods.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apis/index.js 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/bigImg.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/bigImg1.vue 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/noData.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/main.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/package-lock.json 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/index/index.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/default_nodata@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
output.jpg 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.development 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.production 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/template/goods_import_modle.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/fileRecord.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaCompanyUserWindow.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaCompanyWindow.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaGoodsWindow.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/GlobalAlertWindow.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/system/user/OperaUserWindow.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/utils/form.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/utils/request.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/category.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/company.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/fileRecord.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/goods.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/system/user.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/ImageUtil.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/zhubo/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/.env.development
@@ -3,8 +3,12 @@
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_interface/'
VUE_APP_API = 'http://192.168.0.15:10022/'
<<<<<<< HEAD
VUE_APP_API = 'http://192.168.0.35:10022/'
=======
# VUE_APP_API = 'http://192.168.0.15:10024/'
>>>>>>> 3fbfdefe98e5d35e32d74138ce73a1b4e2fe5465
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_web_interface/'
VUE_APP_API = 'https://dmtest.ahapp.net/preselect_web_interface/'
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_interface/'
company_admin/src/api/system/menu.js
@@ -36,7 +36,7 @@
// æŸ¥è¯¢èœå•æ ‘
export function fetchMenuTree () {
  return request.get('/system/menu/treeNodes')
  return request.get('/system/menu/treeNodes?type=1')
}
// æŽ’序
company_admin/src/views/business/goods.vue
@@ -68,7 +68,7 @@
          <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> -->
          <el-button style="background: red;border-color:red" type="primary" :loading="isWorking.export" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:goods:delete']">批量删除</el-button>
        </ul>
        <el-table
          v-loading="isWorking.search"
@@ -151,7 +151,6 @@
      <selectProduct ref="selectProduct" @success="handlePageChange" @result="search"/>
    </TableLayout>
  </template>
  <script>
  import BaseTable from '@/components/base/BaseTable'
  import TableLayout from '@/layouts/TableLayout'
@@ -200,19 +199,21 @@
      this.getcategory()
    },
    methods: {
      handleSelectionChange(e) {
        let arr = e.map(item => item.id)
        this.ids = arr.join(',')
        console.log(this.ids)
      },
    // handleSelectionChange(e) {
    //   let arr = e.map(item => item.id)
    //   this.ids = arr.join(',')
    //   console.log(this.ids)
    // },
      // æ‰¹é‡ä¸Šä¸‹æž¶
      bulkOperation(type) {
        if (!this.ids) {
      if (this.tableData.selectedRows.length === 0) {
      // if (!this.ids) {
          this.$message.warning({ message: '至少选择一项内容' })
          return
        }
      const idList = this.tableData.selectedRows.map(item => item.id)
        batchUpdateDisableById({
          ids: this.ids,
        ids: idList.join(','),
          status: type
        }).then(res => {
          this.$message.success({ message: res })
@@ -312,4 +313,3 @@
    }
  }
  </script>
h5/apis/index.js
h5/components/bigImg.vue
@@ -7,7 +7,7 @@
                    <swiper style="width: 100%; height: 100%;" @change="handlechange" :current="mycurrent" :indicator-dots="false"  :circular="true" :interval="1000" :duration="1000">
                        <swiper-item v-for="(item,index) in imgList" :key="index">
                            <view :class="['swiper-item',index==mycurrent ? 'active' : '']">
                                <image :src="item" style="width: 100%;height: 100%;" mode="aspectFit" />
                                <image :src="item" style="width: 150%;height: 150%;" mode="aspectFit" />
                            </view>
                        </swiper-item>
                    </swiper>
h5/components/bigImg1.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
<template>
    <view class="img" :style="{ opacity: opacity, zIndex: zindex }">
        <view class="img_content">
            <view class="img_content_tu">
                <image class="left" src="@/static/ic_left@2x.png" mode="widthFix" @click="jian"></image>
                <view class="img_content_tu_nr">
                    <swiper style="width: 100%; height: 100%;" @change="handlechange" :current="mycurrent" :indicator-dots="false"  :circular="true" :interval="1000" :duration="1000">
                        <swiper-item v-for="(item,index) in imgList" :key="index">
                            <view :class="['swiper-item',index == mycurrent ? 'active' : '']">
                                <image :src="item" style="width: 100%;height: 100%;" mode="aspectFit" />
                            </view>
                        </swiper-item>
                    </swiper>
                </view>
                <image class="right" src="@/static/ic_right@2x.png" mode="widthFix" @click="add"></image>
            </view>
            <view class="img_content_close">
                <image src="@/static/ic_close@2x.png" mode="widthFix" @click="close"></image>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                opacity: 0,
                zindex: '-1',
                mycurrent: 0
            }
        },
        props: {
            imgList: {
                type: Array,
                default: () => []
            }
        },
        methods: {
            add() {
                if (this.imgList.length - 1 === this.mycurrent) return
                this.mycurrent++
            },
            jian() {
                if (this.mycurrent === 0) return
                this.mycurrent--
            },
            handlechange(e){
                this.mycurrent=e.detail.current
            },
            open(i) {
                this.mycurrent = i
                this.zindex = 3
                this.opacity = 1
            },
            close() {
                this.zindex = '-1'
                this.opacity = 0
            }
        }
    }
</script>
<style lang="scss" scoped>
    .img {
        width: 100vw;
        height: 100vh;
        background: rgba(0,0,0,0.4);
        position: fixed;
        transition: .2s;
        top: 0;
        left: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        .img_content {
            display: flex;
            flex-direction: column;
            .img_content_tu {
                display: flex;
                align-items: center;
                .img_content_tu_nr {
                    width: 600px;
                    height: 600px;
                    padding: 30px;
                    box-sizing: border-box;
                    border-radius: 8px;
                    margin: 0 32px;
                    display: flex;
                    align-items: center;
                    flex-wrap: nowrap;
                    .swiper-item{
                        width: 100%;
                        border-radius: 30rpx;
                        overflow: hidden;
                        // åƒè¿™ç§å¤šå¼ è½®æ’­å›¾åŒæ—¶å‡ºçŽ°åœ¨ä¸€å±çš„æƒ…å†µä¸‹å°±ä¸è¦æŒ‡å®šwidth了,不然你会发现previous-margin和 next-margin会出现想不到的效果
                        // å¦‚果想要设置宽每一张轮播图的宽度,只需要设置previous-margin和next-margin就可以了,想要设置高度直接改下面的height就可以了
                        // width: 450rpx;
                        height: 100%;
                        // transform: scale(1);
                        // transition: all 0.5s ease;
                        text-align: center;
                        // transition: all 0.5s ease-in-out;
                    }
                    .img_content_tu_nr_item {
                        width: 100%;
                        height: 600px;
                        image {
                            width: 100%;
                            height: 100%;
                        }
                    }
                }
                .left {
                    width: 80px;
                    height: 80px;
                    cursor: pointer;
                }
                .right {
                    width: 80px;
                    height: 80px;
                    cursor: pointer;
                }
            }
            .img_content_close {
                width: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                margin-top: 40px;
                image {
                    width: 60px;
                    height: 60px;
                    cursor: pointer;
                }
            }
        }
    }
</style>
h5/components/noData.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<template>
    <view class="no">
        <image src="@/static/default_nodata@2x.png" mode="widthFix"></image>
    </view>
</template>
<script>
    export default {
        name:"noData"
    }
</script>
<style lang="scss" scoped>
    .no {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        // margin-top: 36px;
        padding: 36px 0;
        box-sizing: border-box;
        image {
            width: 268px;
            height: 268px;
        }
    }
</style>
h5/main.js
@@ -7,6 +7,11 @@
import store from './store/index.js'
import 'viewerjs/dist/viewer.css'
import Viewer from 'v-viewer'
Vue.use(Viewer)
Vue.prototype.$store = store;
try {
h5/package-lock.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
{
<<<<<<< HEAD
  "requires": true,
  "lockfileVersion": 1,
  "dependencies": {
    "throttle-debounce": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
      "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
    },
    "v-viewer": {
      "version": "1.6.4",
      "resolved": "https://registry.npmjs.org/v-viewer/-/v-viewer-1.6.4.tgz",
      "integrity": "sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==",
      "requires": {
        "throttle-debounce": "^2.0.1",
        "viewerjs": "^1.5.0"
      }
    },
    "viewerjs": {
      "version": "1.11.6",
      "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz",
      "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw=="
    }
  }
=======
  "name": "h5",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {}
>>>>>>> 1ee5043af9ee5e53acb52a70fd93c4656e8bbb44
}
h5/pages/index/index.vue
@@ -198,6 +198,8 @@
                        </view>
                    </view>
                    <view class="productPage_shop" v-if="status === 1 && !pkcontent">
                        <noData v-if="shopPageData.length === 0 && shopPageDataSou.length === 0" />
                        <template v-else>
                        <view class="productPage_shop_item" v-for="(item, index) in isSOU ? shopPageDataSou : shopPageData" :key="index" @click="clickshoppageItem(item)">
                            <view class="productPage_shop_item_img">
                                <image :src="item.imgurl ? item.prefixUrl + item.imgurl : ''" mode="widthFix"></image>
@@ -208,6 +210,7 @@
                        <view class="productPage_shop_zw"></view>
                        <view class="productPage_shop_zw"></view>
                        <view class="productPage_shop_zw"></view>
                        </template>
                    </view>
                     <!-- v-if="status === 2" -->
                    <view class="productPage_parameter" v-if="isPK && pkcontent">
@@ -227,7 +230,12 @@
                                    </view>
                                </view>
                                <view class="productPage_parameter_item_content_nr">
                                    <view class="item" v-for="(child, i) in item.goodsParamList" :key="i">
                                    <view class="item" v-if="item.param1"  v-for="(child, i) in item.param1" :key="child.index">
                                        <view class="label">{{child.name}}:</view>
                                        <view class="value">{{child.val}}</view>
                                    </view>
                                    <view v-if="item.param2.length>0" class="paramline"></view>
                                    <view class="item" v-if="item.param2" v-for="(child, j) in item.param2" :key="child.index">
                                        <view class="label">{{child.name}}:</view>
                                        <view class="value">{{child.val}}</view>
                                    </view>
@@ -241,6 +249,10 @@
            <!-- æŸ¥çœ‹å¤§å›¾ -->
            <bigImg
                ref="bigImg"
                :imgList="imgList"/>
            <!-- æŸ¥çœ‹å¤§å›¾ -->
            <bigImg1
                ref="bigImg1"
                :imgList="imgList"/>
            <!-- æœç´¢ -->
            
@@ -259,7 +271,9 @@
<script>
    import bigImg from '@/components/bigImg.vue'
    import bigImg1 from '@/components/bigImg1.vue'
    import search from '@/components/search.vue'
    import noData from '@/components/noData.vue'
    import { mapState } from 'vuex'
    import { categoryList, goodsList, brandList, h5Image, goodsPage, listForH5 } from '@/apis/index.js'
    export default {
@@ -338,7 +352,7 @@
                page: 1
            }
        },
        components: { bigImg, search },
        components: { bigImg, search, noData, bigImg1 },
        onLoad() {
            var that = this
            // ç›‘听键盘组合键
@@ -694,7 +708,12 @@
                        })
                    }
                })
                this.$refs.bigImg.open(0)
                // console.log(this.imgList)
                this.$viewerApi({
                  images: this.imgList,
                })
                // this.$refs.bigImg.open(0)
                // this.$refs.bigImg1.open(0)
            },
            empty() {
                this.shopList = []
@@ -844,6 +863,51 @@
                    this.leftShop = JSON.parse(JSON.stringify(val))
                } else if (this.$refs.search.typeName === 'right') {
                    this.rightShop = JSON.parse(JSON.stringify(val))
                    let leftParamList = this.leftShop.goodsParamList;
                    let rightParamList = this.rightShop.goodsParamList;
                    let leftList1 = new Array();
                    let leftList2 =  new Array();
                    let rightList1 = new Array();
                    let rightList2 =  new Array();
                    if(leftParamList && leftParamList.length>0){
                        leftParamList.forEach(item => {
                            let flag =0;
                            let rightTemp = null;
                            if(rightParamList && rightParamList.length>0){
                                rightParamList.forEach(item1 => {
                                    if (item.name === item1.name ) {
                                        flag =1;
                                        rightTemp = item1;
                                        return;
                                    }
                                })
                            }
                            if(flag === 1){
                                leftList1.push(item);
                                rightList1.push(rightTemp);
                            }else{
                                leftList2.push(item);
                            }
                        })
                    }
                    if(rightParamList && rightParamList.length>0){
                        rightParamList.forEach(item=> {
                            let flag1 = 0;
                            rightList1.forEach(item1 => {
                                if (item.name === item1.name ) {
                                    flag1 =1;
                                    //return;
                                }
                            })
                            if(flag1 === 0){
                                rightList2.push(item);
                            }
                        })
                    }
                    Reflect.set(this.leftShop, "param1",leftList1);
                    Reflect.set(this.leftShop, "param2",leftList2);
                    Reflect.set(this.rightShop, "param1",rightList1);
                    Reflect.set(this.rightShop, "param2",rightList2);
                } else {
                    this.shopList.push(JSON.parse(JSON.stringify(val)))
                }
@@ -1135,7 +1199,7 @@
                margin-top: 16px;
                .commodityFrom_head {
                    width: 100%;
                    height: 60px;
                    height: 45px;
                    padding: 10px 8px;
                    box-sizing: border-box;
                    background: rgba(0,224,255,0.24) linear-gradient(180deg, rgba(255,255,255,0.35) 0%, rgba(0,0,0,0.21) 100%);
@@ -1182,7 +1246,7 @@
                        flex-direction: column;
                        .commodityFrom_body_content_item {
                            width: 100%;
                            height: 56px;
                            height: 45px;
                            display: flex;
                            align-items: center;
                            margin-bottom: 6px;
@@ -1203,7 +1267,7 @@
                                opacity: 0;
                                transform: translate(0%, 0%);
                                z-index: -1;
                                height: 56px;
                                height: 45px;
                                display: flex;
                                align-items: center;
                                background: rgba(0,224,255,0.3);
@@ -1352,7 +1416,7 @@
                    }
                    .commodityFrom_body_total {
                        width: 100%;
                        height: 56px;
                        height: 45px;
                        display: flex;
                        align-items: center;
                        .commodityFrom_body_total_item {
@@ -1444,7 +1508,6 @@
                    }
                }
            }
            .productPage {
                width: 100%;
                padding: 0 22px;
@@ -1452,7 +1515,7 @@
                margin-top: 16px;
                .productPage_head {
                    width: 100%;
                    height: 60px;
                    height: 45px;
                    display: flex;
                    align-items: center;
                    background: rgba(0,224,255,0.34) linear-gradient(180deg, rgba(255,255,255,0.35) 0%, rgba(0,0,0,0.21) 100%);
@@ -1792,6 +1855,10 @@
                                margin-top: 12px;
                                display: flex;
                                flex-direction: column;
                                .paramline{
                                    border-bottom: #c7c9ce 2px dashed;
                                    margin-bottom: 15px;
                                }
                                .item {
                                    display: flex;
                                    align-items: flex-start;
h5/static/default_nodata@2x.png
output.jpg
platform/.env.development
@@ -7,9 +7,9 @@
# ä»»åº·
# VUE_APP_API = 'http://192.168.0.15:10017/'
# ç„¦æ¾
VUE_APP_API = 'http://192.168.0.36:10011'
VUE_APP_API = 'http://192.168.0.36:10023'
# æ±Ÿè
VUE_APP_API = 'http://192.168.0.35:10011'
# VUE_APP_API = 'http://192.168.0.35:10023'
#测试服务器
# #测试服务器
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_admin_interface'
platform/.env.production
@@ -1,12 +1,11 @@
# ç”Ÿäº§çŽ¯å¢ƒé…ç½®
NODE_ENV = 'production'
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_interface/'
VUE_APP_API = 'http://127.0.0.1/'
VUE_APP_CONTEXT_PATH = '/admin'
VUE_APP_API_PREFIX = '/admin_interface'
# VUE_APP_API = 'https://dm.ahapp.net/preselect_interface/'
# VUE_APP_API = 'http://yx.doumee.com/preselect_interface/'
# VUE_APP_API = 'http://mjyx.doumee.com/preselect_interface/'
# http://yx.ahapp.net/admin_interface/doc.html
# VUE_APP_API = 'https://yx.ahapp.net/admin_interface'
VUE_APP_API = 'http://127.0.0.1:10023/
platform/package.json
@@ -4,7 +4,7 @@
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:pro": "vue-cli-service build",
    "build:dev": "vue-cli-service build --mode staging",
    "lint": "vue-cli-service lint",
    "fix": "eslint --ext .js,.vue src --fix"
platform/public/favicon.ico

platform/public/template/goods_import_modle.xlsx
Binary files differ
platform/src/api/business/fileRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/fileRecord/page', data, {
    trim: true
  })
}
platform/src/assets/logo.png

platform/src/components/business/OperaCompanyUserWindow.vue
@@ -11,11 +11,11 @@
        <el-input v-model="form.name" placeholder="请输入客户企业全称,不超过30字" v-trim/>
        ä¼ä¸šåç§°éœ€ä¸Žå·¥å•†éƒ¨é—¨ç™»è®°ä¿¡æ¯ä¸€è‡´
      </el-form-item>
      <el-form-item label="企业简称" prop="shortName">
      <el-form-item label="客户简称" prop="shortName">
        <el-input v-model="form.shortName" placeholder="请输入企业简称" v-trim/>
      </el-form-item>
      <el-form-item label="统一社会信用代码" prop="creditCode">
        <el-input v-model="form.creditCode" placeholder="请输入统一社会信用代码" v-trim/>
      <el-form-item label="统一信用代码" prop="creditCode">
        <el-input v-model="form.creditCode" placeholder="请输入统一信用代码" v-trim/>
        ç»Ÿä¸€ä¿¡ç”¨ä»£ç éœ€ä¸Žå·¥å•†éƒ¨é—¨ç™»è®°ä¿¡æ¯ä¸€è‡´
      </el-form-item>
      <el-form-item label="登录账号" prop="managerUserName">
@@ -26,6 +26,7 @@
      </el-form-item>
      <el-form-item label="主播数量限制" prop="userNum">
        <el-input v-model="form.userNum" :disabled="!!this.form.id" placeholder="请输入主播数量限制" v-trim/>
      </el-form-item>
      <el-form-item label="销售人员" prop="salesmanId">
        <!-- <el-input v-model="form.salesmanId" placeholder="请输入销售人员编码" v-trim/> -->
@@ -71,7 +72,7 @@
        linkname: '',
        linkephone: '',
        creditCode: '',
        userNum: '',
        userNum: 5,
        oepnValidDate: '',
        salesmanId: ''
      },
@@ -106,6 +107,7 @@
<style lang="scss" scoped>
.more {
  margin-top: 40px;
  margin-bottom: 10px;
  .more-title {
    font-weight: 600;
    font-size: 18px;
platform/src/components/business/OperaCompanyWindow.vue
@@ -11,11 +11,11 @@
        <el-input v-model="form.name" placeholder="请输入客户企业全称,不超过30字" v-trim/>
        ä¼ä¸šåç§°éœ€ä¸Žå·¥å•†éƒ¨é—¨ç™»è®°ä¿¡æ¯ä¸€è‡´
      </el-form-item>
      <el-form-item label="企业简称" prop="shortName">
        <el-input v-model="form.shortName" placeholder="请输入企业简称" v-trim/>
      <el-form-item label="客户简称" prop="shortName">
        <el-input v-model="form.shortName" placeholder="请输入客户简称" v-trim/>
      </el-form-item>
      <el-form-item label="统一社会信用代码" prop="creditCode">
        <el-input v-model="form.creditCode" placeholder="请输入统一社会信用代码" v-trim/>
      <el-form-item label="统一信用代码" prop="creditCode">
        <el-input v-model="form.creditCode" placeholder="请输入统一信用代码" v-trim/>
        ç»Ÿä¸€ä¿¡ç”¨ä»£ç éœ€ä¸Žå·¥å•†éƒ¨é—¨ç™»è®°ä¿¡æ¯ä¸€è‡´
      </el-form-item>
      <el-form-item label="登录账号" prop="managerUserName">
@@ -26,6 +26,7 @@
      </el-form-item>
      <el-form-item label="主播数量限制" prop="userNum">
        <el-input v-model="form.userNum" :disabled="!!this.form.id" placeholder="请输入主播数量限制" v-trim/>
        è¾“å…¥0表示不限制
      </el-form-item>
      <el-form-item label="销售人员" prop="salesmanId">
        <!-- <el-input v-model="form.salesmanId" placeholder="请输入销售人员编码" v-trim/> -->
@@ -54,6 +55,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import { findAllList } from '@/api/system/user'
import { loginNameRule, creditCode } from '@/utils/form'
export default {
  name: 'OperaCompanyWindow',
  extends: BaseOpera,
@@ -71,7 +73,7 @@
        linkname: '',
        linkephone: '',
        creditCode: '',
        userNum: '',
        userNum: '5',
        oepnValidDate: '',
        salesmanId: ''
      },
@@ -82,7 +84,10 @@
          { required: true, message: '请输入客户企业全称', tigger: 'blur'}
        ],
        managerUserName: [
          { required: true, message: '请输入登录账号', tigger: 'blur'}
          { required: true, validator: loginNameRule, message: '请输入登录账号', tigger: 'blur'}
        ],
        creditCode: [
          { validator: creditCode, trigger: 'blur' }
        ],
        openUserNum: [
          { pattern: /^[0-9]+$/, message: '只可以输入数字', trigger: 'change' }
@@ -99,16 +104,43 @@
      .then(res => {
        this.sales = res
      })
  },
  methods: {
    open(title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          let data = new Date(new Date().getTime() + 31536000000)
          this.form.oepnValidDate = `${data.getFullYear()}-${data.getMonth() +1}-${data.getDate()}`
          this.form[this.configData['field.id']] = null
        })
        return
  }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.multifileList.forEach(item => {
          item.url = item.filefullurl
        })
      })
    },
  },
}
</script>
<style lang="scss" scoped>
.more {
  margin-top: 40px;
  .more-title {
    font-weight: 600;
    font-size: 18px;
    margin-bottom: 10px;
  }
}
::v-deep .el-input {
platform/src/components/business/OperaGoodsWindow.vue
@@ -2,18 +2,18 @@
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm" width="800px"
    v-loading="isUploading">
    <el-form :model="form" ref="form" label-width="120px" :rules="rules">
      <div style="font-size: 18px;font-weight: bold;">基本信息</div>
      <div style="font-size: 18px;font-weight: bold; margin-bottom: 10px;">基本信息</div>
      <el-form-item label="商品名称" prop="name">
        <el-input v-model="form.name" maxlength="50" placeholder="请输入商品名称,不超过50个字" v-trim />
      </el-form-item>
      <el-form-item label="商品品牌" prop="brandId">
        <el-select v-model="form.brandId" placeholder="请选择,单选">
        <el-select v-model="form.brandId" filterable placeholder="请选择,单选">
          <el-option v-for="item in brandList()" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="商品类别" prop="categoryId">
        <el-select v-model="form.categoryId" placeholder="请选择,单选" @change="categorySelect">
        <el-select v-model="form.categoryId" filterable placeholder="请选择,单选" @change="categorySelect">
          <el-option v-for="item in categoryList()" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
@@ -37,7 +37,7 @@
        åªèƒ½ä¸Šä¼ å›¾ç‰‡æ ¼å¼ï¼Œpng格式,建议尺寸600*600px
      </el-form-item>
      <template v-if="form.baseGoodsParamList && form.baseGoodsParamList.length > 0">
        <div style="font-size: 18px;font-weight: bold;">参数属性值配置 <span
        <div style="font-size: 18px;font-weight: bold; margin-bottom: 10px;">参数属性值配置 <span
            style="font-size: 13px; font-weight: 500;">按需配置当前商品的产品参数值,单个参数值不超过30个字</span></div>
        <el-form-item :label="item.name" v-for="(item, index) in form.baseGoodsParamList" :key="index">
          <el-input v-model="item.val" maxlength="30" type="text" placeholder="请输入" v-trim />
platform/src/components/common/GlobalAlertWindow.vue
@@ -1,6 +1,7 @@
<template>
  <el-dialog
    top="10vh"
    class="global-window"
    title="title"
    :visible="visible"
platform/src/components/system/user/OperaUserWindow.vue
@@ -19,12 +19,12 @@
          <el-radio label="0">女</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="头像" prop="avatar" required>
      <!-- <el-form-item label="头像" prop="avatar" required>
        <el-radio-group v-model="form.avatar" class="form-item-avatar">
          <el-radio label="https://dmtest.ahapp.net/preselectfile/man.png" border><img src="https://dmtest.ahapp.net/preselectfile/man.png" alt=""></el-radio>
          <el-radio label="https://dmtest.ahapp.net/preselectfile/woman.png" border><img src="https://dmtest.ahapp.net/preselectfile/woman.png" alt=""></el-radio>
        </el-radio-group>
      </el-form-item>
      </el-form-item> -->
      <el-form-item v-if="form.id == null" label="初始密码" prop="password" required>
        <el-input v-model="form.password" type="password" placeholder="请输入初始密码" maxlength="30" show-password/>
      </el-form-item>
@@ -71,7 +71,7 @@
        empNo: '', // å·¥å·
        departmentId: null, //  æ‰€å±žéƒ¨é—¨ID
        positionIds: [], //  æ‰€å±žå²—位ID集
        avatar: '/avatar/man.png', // å¤´åƒ
        // avatar: '/avatar/man.png', // å¤´åƒ
        password: '', // å¯†ç 
        mobile: '', // æ‰‹æœºå·ç 
        email: '', // é‚®ç®±
platform/src/utils/form.js
@@ -1,15 +1,88 @@
// éªŒè¯æ‰‹æœºå·ç 
export function checkMobile (rule, value, callback) {
  if (value == null || value.trim() === '') {
    callback(new Error('手机号码不能为空'))
    if (rule.required) {
      callback(new Error('请输入手机号'))
    } else {
      callback()
    }
    return
  }
  if (!/^1\d{10}$/.test(value)) {
    callback(new Error('手机号码格式不正确'))
  let re = /^[0-9]{11}$/;
  var result = re.test(value);
  if(!result) {
    callback(new Error('请输入正确的手机号'))
  } else {
    callback()
  }
}
export function checkPhone(rule, value, callback) {
  //手机号:13,14,15,17,18,19号段
  const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
  //固话:区号(3-4位)-号码(7-9位)
  const mobReg =  /(^[0-9]{3,4}-[0-9]{7,9}$)/
  //澳门电话号码: 28开头,后面跟6位数字,区号为853
  const macaoMobReg = /^(853)?28\d{6}$/
  //澳门手机号码:6开头,后面跟7位数字,区号为853
  const macaoPhoneReg = /^(853)?6\d{7}$/
  //同时支持手机号码和电话号码
  const macaoReg = /^(853)?(?:28\d{6}|6\d{7})$/
  if (!value) {
      callback(new Error('电话号码不能为空'))
  } else if (phoneReg.test(value)||mobReg.test(value)||macaoReg.test(value)) {
      callback()
  } else {
      callback(new Error('请输入正确电话号码'))
  }
}
export function loginNameRule (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入账号'))
    } else {
      callback()
    }
    return
  }
  let re =/^[\u4e00-\u9fa5a-zA-Z0-9]+$/
  var result = re.test(value)
  if(!result) {
    callback(new Error('请输入正确的账号'))
  } else {
    callback()
  }
}
export function nameRule (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入名字'))
    } else {
      callback()
    }
    return
  }
  callback()
}
export function creditCode (rule, value, callback) {
  if (value == null || value.trim() === '') {
    if (rule.required) {
      callback(new Error('请输入社会信用代码'))
    } else {
      callback()
    }
    return
  }
  let re = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
  var result = re.test(value)
  if(!result) {
    callback(new Error('请输入正确的社会信用代码'))
  } else {
    callback()
  }
}
// éªŒè¯é‚®ç®±
export function checkEmail (rule, value, callback) {
platform/src/utils/request.js
@@ -29,9 +29,9 @@
  // è®¾ç½®æ“ä½œå¹³å°
  config.headers['eva-platform'] = `pc-${pkg.version}`
  // è®¾ç½®è®¤è¯å¤´
  const authToken = Cookies.get('eva-auth-token')
  const authToken = Cookies.get('doumee-auth-token')
  if (authToken != null) {
    config.headers['eva-auth-token'] = authToken
    config.headers['doumee-auth-token'] = authToken
  }
  return config
}, function (error) {
platform/src/views/business/category.vue
@@ -29,7 +29,7 @@
        <el-table-column prop="priceRate" label="加价系数" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码(升序)" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
        <el-table-column v-if="containPermissions(['business:category:update'])" prop="status" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch v-model="row.status" @change="changeStatus(row)" :active-value="0" :inactive-value="1">
            </el-switch>
@@ -88,8 +88,11 @@
        status: item.status
      }).then(res => {
        this.$tip.apiSuccess('更新成功')
      }).finally(() => {
        // this.search()
      }).catch (err => {
          this.$message.error(err)
        })
        .finally(() => {
        this.handlePageChange()
      })
    },
    edit(id) {
platform/src/views/business/company.vue
@@ -2,14 +2,14 @@
  <TableLayout :permissions="['business:company: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="shortName">
        <el-input v-model="searchForm.shortName" placeholder="请输入企业简称" @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      <el-form-item label="管理员账号" prop="managerUserName">
        <el-input v-model="searchForm.managerUserName" placeholder="请输入管理员账号" @keypress.enter.native="search"></el-input>
      <el-form-item label="登录账号" prop="managerUserName">
        <el-input v-model="searchForm.managerUserName" placeholder="请输入登录账号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="有效期" prop="oepnValidDate">
        <el-date-picker type="daterange" v-model="oepnValidDate" value-format="yyyy-MM-dd" start-placeholder="开始日期"
@@ -37,11 +37,15 @@
        <!-- <el-table-column type="selection" width="55" align="center"></el-table-column> -->
        <el-table-column prop="id" label="企业编号" min-width="80px" align="center"></el-table-column>
        <el-table-column prop="name" label="企业名称" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="managerUserName" label="管理员账号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="managerUserName" label="登录账号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="linkname" label="联系人" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="linkephone" label="联系人电话" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="oepnValidDate" label="用有效期" min-width="140px" align="center"></el-table-column>
        <el-table-column prop="userNum" label="主播数量限制" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="oepnValidDate" label="有效期" min-width="140px" align="center"></el-table-column>
        <el-table-column prop="userNum" label="主播账号限制" min-width="100px" align="center">
          <template slot-scope="{row}">
            {{ row.userNum || '不限' }}
          </template>
        </el-table-column>
        <el-table-column prop="empUserNum" label="员工数" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="salesmanRealName" label="销售人员" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px" align="center">
platform/src/views/business/fileRecord.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
<template>
  <TableLayout :permissions="['business:filerecord:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <!-- <el-form-item label="文件名" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入文件名" @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      <el-form-item label="文件夹名称" prop="folder">
        <el-input v-model="searchForm.folder" placeholder="请输入文件夹名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="OSS文件key" prop="keyval">
        <el-input v-model="searchForm.keyval" placeholder="请输入OSS文件key" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" clearable placeholder="请选择状态">
          <el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-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>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        border
        stripe
      >
       <el-table-column type="index" :index="newIndex" label="序号" width="80px" align="center"></el-table-column>
       <el-table-column prop="name" label="文件" width="100px" align="center">
        <template slot-scope="{row}">
          <el-image v-if="row.url" style="width: 70px; height: 70px" :src="row.url"
                  :preview-src-list="[row.url]" fit="cover"></el-image>
        </template>
       </el-table-column>
        <el-table-column prop="folder" label="文件夹名称" width="140px" align="center"></el-table-column>
        <el-table-column prop="keyval" label="OSS文件key" min-width="120px" align="center"></el-table-column>
        <el-table-column prop="status" label="状态" width="100px" align="center">
          <template slot-scope="{row}">
            <!--  0未上传 1已上传 2上传失败 -->
            {{ row.status == 0 ? '未上传' : row.status == 1 ? '已上传' : '上传失败' }}
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="创建时间" width="150px" align="center"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" width="150px" align="center"></el-table-column>
<!--
        <el-table-column prop="editor" 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="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="objId" label="关联对象编码" min-width="100px"></el-table-column>
        <el-table-column prop="type" label="类型0图片 1视频 2其他" min-width="100px"></el-table-column> -->
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      </pagination>
    </template>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
export default {
  name: 'FileRecord',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        name: '',
        info: '',
        objId: '',
        type: '',
        folder: '',
        status: '',
        keyval: ''
      },
      statusList: [
        // 0未上传 1已上传 2上传失败
        { name: '未上传', id: 0 },
        { name: '已上传', id: 1 },
        { name: '上传失败', id: 2 }
      ]
    }
  },
  created () {
    this.config({
      module: '附件上传进度表',
      api: '/business/fileRecord',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    newIndex(index) {
      return (this.tableData.pagination.pageIndex - 1) * 10 + index + 1
    }
  },
}
</script>
platform/src/views/business/goods.vue
@@ -43,14 +43,18 @@
        </li>
        <!-- <el-button type="primary" :loading="isWorking.export"
          @click="$refs.selectProduct.open('选择平台商品')">选择平台商品</el-button> -->
        <li v-permissions="['business:basegoods:exportExcel']">
        <li v-permissions="['business:basegoods:exportExcel', 'business:goods:delete']">
          <ImportButton text="导入" template-name="goods_import_modle.xlsx"
            template-path="/template/goods_import_modle.xlsx" action="/business/baseGoods/importExcel"
            @success="search" />
        </li>
        <li>
        <el-button type="primary" :loading="isWorking.export" @click="bulkOperation(0)">批量上架</el-button>
        </li>
        <li>
        <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> -->
        </li>
        <li v-permissions="['business:goods:delete']"><el-button @click="deleteByIdInBatch" style="color: red;">批量删除</el-button></li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe border :header-cell-style="rowStyle"
        :cell-style="rowStyle" @selection-change="handleSelectionChange">
@@ -72,7 +76,7 @@
        <el-table-column prop="zdPrice" 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">
        <el-table-column prop="status" v-if="containPermissions(['business:basegoods:update'])" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch v-model="row.status" @change="changeStatus(row)" active-color="#13ce66" inactive-color="#ff4949"
              :active-value="0" :inactive-value="1">
@@ -106,7 +110,7 @@
import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
import selectProduct from '@/components/business/selectProduct'
import ImportButton from '@/components/common/ImportButton'
import { brand, baseCategory, importExcel } from '@/api/system/common.js'
import { brand, baseCategory } from '@/api/system/common.js'
import { updateStatus, queryById, exportDoc } from '@/api/business/goods.js'
export default {
  name: 'Goods',
@@ -150,24 +154,25 @@
    this.getcategory()
  },
  methods: {
    handleSelectionChange(e) {
      let arr = e.map(item => item.id)
      this.ids = arr.join(',')
      this.idList = arr;
    },
    // handleSelectionChange(e) {
    //   let arr = e.map(item => item.id)
    //   this.ids = arr.join(',')
    //   this.idList = arr;
    // },
    // æ‰¹é‡ä¸Šä¸‹æž¶
    bulkOperation(type) {
      if (!this.ids) {
        this.$message.warning({ message: '至少选择一项内容' })
      if (this.tableData.selectedRows.length === 0) {
        this.$tip.warning('请至少选择一条数据')
        return
      }
      let idList = this.tableData.selectedRows.map(item => item.id)
      updateStatus({
        idList: this.idList,
        idList,
        status: type
      }).then(res => {
        this.$tip.apiSuccess('操作成功');
        // this.$message.success({ message:res.message })
        this.search()
        this.handlePageChange()
      })
    },
    downloadFile() {
@@ -194,8 +199,12 @@
        status: item.status
      }).then(res => {
        this.$tip.apiSuccess('更新成功')
      }).finally(() => {
        // this.search()
      })
        .catch (err => {
          this.$message.error(err)
        } )
      .finally(() => {
        this.handlePageChange()
      })
    },
    getbrand() {
platform/src/views/system/user.vue
@@ -33,15 +33,16 @@
        :data="tableData.list"
        :default-sort = "{prop: 'createTime', order: 'descending'}"
        stripe
        border
        @selection-change="handleSelectionChange"
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="avatar" label="头像" width="80px" class-name="table-column-avatar" fixed="left">
        <!-- <el-table-column prop="avatar" label="头像" width="80px" class-name="table-column-avatar" fixed="left">
          <template slot-scope="{row}">
            <img :src="row.avatar == null ? '/static/avatar/man.png' : row.avatar">
          </template>
        </el-table-column>
        </el-table-column> -->
        <el-table-column prop="realname" label="姓名" min-width="100px" fixed="left"></el-table-column>
        <el-table-column prop="username" label="用户名" min-width="120px"></el-table-column>
        <el-table-column prop="empNo" label="工号" sortable="custom" sort-by="EMP_NO" min-width="80px"></el-table-column>
server/company/src/main/resources/application.yml
@@ -11,7 +11,7 @@
#  application:
#    name: doumeemes
  profiles:
    active: pro
    active: dev
  # JSON返回配置
  jackson:
server/platform/src/main/resources/application.yml
@@ -11,7 +11,7 @@
#  application:
#  name: doumeemes
  profiles:
    active: pro
    active: dev
  # JSON返回配置
  jackson:
server/service/src/main/java/com/doumee/core/utils/ImageUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
package com.doumee.core.utils;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.net.ssl.HttpsURLConnection;
public class ImageUtil {
    private static List<File> fileList = new ArrayList<>();
    public static void main(String[] args) {
        //convertAllImages("F:\\before.png", "F:\\after.png");
        fileList.add(new File("C:\\Users\\T14\\Desktop\\1\\1.jpg"));
        convertAllImages(fileList);
    }
    /**
     * åŽ»é™¤æ–‡ä»¶åˆ—è¡¨é‡Œå›¾ç‰‡çš„æ°´å°å¹¶æ›¿æ¢
     *
     * @Param fileList æ–‡ä»¶åˆ—表
     */
    public static void convertAllImages(List<File> fileList) {
        try {
            for (File file : fileList) {
                if (!file.getName().endsWith("png") && !file.getName().endsWith("jpg")) {
                    continue;
                }
                BufferedImage bi = ImageIO.read(file); //用ImageIO流读取像素块
                if (bi != null) {
                    removeWatermark(bi);
                    String formatName = file.getName().substring(file.getName().lastIndexOf(".") + 1);//生成的图片格式
                    ImageIO.write(bi, formatName, file);//用ImageIO流生成的处理图替换原图片
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * ä»Žæºç›®å½•获取图片处理后导出到目标目录
     *
     * @param dir     æºç›®å½•
     * @param saveDir ç›®æ ‡ç›®å½•
     */
    private static void convertAllImages(String dir, String saveDir) {
        File dirFile = new File(dir);
        File saveDirFile = new File(saveDir);
        dir = dirFile.getAbsolutePath();
        saveDir = saveDirFile.getAbsolutePath();
        loadImages(new File(dir));
        for (File file : fileList) {
            String filePath = file.getAbsolutePath();
            String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length());
            replace(file.getAbsolutePath(), dstPath);
        }
    }
    /**
     * åŠ è½½å›¾ç‰‡
     */
    private static void loadImages(File f) {
        if (f != null) {
            if (f.isDirectory()) {
                File[] fileArray = f.listFiles();
                if (fileArray != null) {
                    for (File file : fileArray) {
                        loadImages(file); //递归调用
                    }
                }
            } else {
                String name = f.getName();
                if (name.endsWith("png") || name.endsWith("jpg")) {
                    fileList.add(f);
                }
            }
        }
    }
    /**
     * ç”Ÿæˆæºå›¾ç‰‡çš„处理图
     *
     * @param srcFile æºå›¾ç‰‡è·¯å¾„
     * @param dstFile ç›®æ ‡å›¾ç‰‡è·¯å¾„
     */
    private static void replace(String srcFile, String dstFile) {
        try {
            URL http;
            if (srcFile.trim().startsWith("https")) {
                http = new URL(srcFile);
                HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();
                conn.setRequestMethod("GET");
            } else if (srcFile.trim().startsWith("http")) {
                http = new URL(srcFile);
                HttpURLConnection conn = (HttpURLConnection) http.openConnection();
                conn.setRequestMethod("GET");
            } else {
                http = new File(srcFile).toURI().toURL();
            }
            BufferedImage bi = ImageIO.read(http.openStream());
            if (bi != null) {
                removeWatermark(bi);
                exportImage(bi, srcFile, dstFile);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * ç”±ImageIO流生成源图片的处理图
     *
     * @param bi       ImageIO
     * @param fileName æºå›¾ç‰‡å¸¦åŽç¼€çš„æ–‡ä»¶å
     * @param dstFile  ç›®æ ‡å›¾ç‰‡è·¯å¾„
     */
    private static void exportImage(BufferedImage bi, String fileName, String dstFile) {
        try {
            String type = fileName.substring(fileName.lastIndexOf(".") + 1);
            Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type);
            ImageWriter writer = it.next();
            File f = new File(dstFile);
            ImageOutputStream ios = ImageIO.createImageOutputStream(f);
            writer.setOutput(ios);
            writer.write(bi);
            bi.flush();
            ios.flush();
            ios.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * åŽ»é™¤æ°´å°
     */
    private static void removeWatermark(BufferedImage bi) {
        Color wColor = new Color(197, 196, 191);
        Color hColor = new Color(140, 88, 100);
//        Color wColor = new Color(254, 254, 254);
//        Color hColor = new Color(197, 196, 191);
        //白底水印
        for (int i = 0; i < bi.getWidth(); i++) {
            for (int j = 0; j < bi.getHeight(); j++) {
                int color = bi.getRGB(i, j);
                Color oriColor = new Color(color);
                int red = oriColor.getRed();
                int greed = oriColor.getGreen();
                int blue = oriColor.getBlue();
                if (red == 254 && greed == 254 && blue == 254) {
                    continue;
                }
                if (red > 220 && greed > 180 && blue > 80) {
                    bi.setRGB(i, j, wColor.getRGB());
                }
                if (red <= 240 && greed >= 200 && blue >= 150) {
                    bi.setRGB(i, j, wColor.getRGB());
                }
            }
        }
    }
}
server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java
@@ -300,7 +300,7 @@
            for(BaseData data :result.getRecords()){
                //多图,英文逗号隔开
                if(StringUtils.isNotBlank(data.getBgImg())){
                    String tImg =  data.getBgImg().replace(",", ",").replace(".avif", "").replace("/n1/jfs/", "/n0/jfs/");
                    String tImg =  data.getBgImg().replace(",", ",").replace(".avif", "").replace("/n1/jfs/", "/imgzone/jfs/");
                    String[] imgs =tImg.split(",");
                    data.setBgImgs(imgs);
@@ -462,7 +462,7 @@
    private int addImg(int i,OssModel ossModel, Integer id,String bgImg,List<Multifile> fileList,List<FileRecord> fileRecords) {
        if(StringUtils.isNotBlank(bgImg)){
            bgImg = bgImg.replace("/n1/jfs/", "/n0/jfs/");
            bgImg = bgImg.replace("/n1/jfs/", "/imgzone/jfs/");
//            String img =getOssImgurl(ossModel, ossModel.getGoodsFolder() ,bgImg);
            String img = getOssImgurlFile(ossModel.getGoodsFolder(), bgImg, null,Constants.TWO,fileRecords);
            if(StringUtils.isNotBlank(img)){
@@ -525,7 +525,10 @@
            return;
        }
        String attrName = attr.substring(0,index);
        if(StringUtils.isBlank(attrName) || StringUtils.equals(attrName, "商品名称") || StringUtils.equals(attrName, "商品编号")){
        if(StringUtils.isBlank(attrName)
                || StringUtils.equals(attrName, "商品名称")
                || StringUtils.equals(attrName, "商品编号")
                || StringUtils.equals(attrName, "店铺")){
            return;
        }
        String val = attr.substring(index+1);
server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -401,7 +401,10 @@
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        goodsMapper.deleteBatchIds(ids);
        for(Integer id : ids){
            deleteById(id);
        }
//        goodsMapper.deleteBatchIds(ids);
    }
    @Override
server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java
@@ -31,7 +31,6 @@
    @Autowired
    private WebParamService webParamService;
    @ApiOperation("获取当前登录企业配置信息")
    @GetMapping("/getByLogin")
    public ApiResponse<WebParam> getByLogin() {
server/zhubo/src/main/resources/application.yml
@@ -11,7 +11,7 @@
#  application:
#    name: doumeemes
  profiles:
    active: pro
    active: dev
  # JSON返回配置
  jackson: