From 2193f1e8240e2a0ed5900dddc6347a1d9db081cf Mon Sep 17 00:00:00 2001
From: jiaosong <jiaosong6760@dingtalk.com>
Date: 星期四, 21 九月 2023 14:38:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 server/service/src/main/java/com/doumee/core/utils/ImageUtil.java                      |  172 ++++++++
 platform/src/views/system/user.vue                                                     |    5 
 h5/main.js                                                                             |    5 
 platform/src/views/business/company.vue                                                |   18 
 company_admin/src/api/system/menu.js                                                   |    2 
 platform/package.json                                                                  |    2 
 server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java             |    1 
 h5/package-lock.json                                                                   |   32 +
 h5/apis/index.js                                                                       |    2 
 h5/pages/index/index.vue                                                               |  103 ++++
 platform/src/utils/request.js                                                          |    4 
 server/zhubo/src/main/resources/application.yml                                        |    2 
 platform/src/components/business/OperaCompanyUserWindow.vue                            |   10 
 platform/src/components/business/OperaGoodsWindow.vue                                  |    8 
 platform/.env.production                                                               |   11 
 h5/static/default_nodata@2x.png                                                        |    0 
 h5/components/bigImg1.vue                                                              |  140 ++++++
 h5/components/noData.vue                                                               |   27 +
 platform/.env.development                                                              |    6 
 platform/src/components/common/GlobalAlertWindow.vue                                   |    1 
 platform/src/views/business/category.vue                                               |    9 
 platform/src/api/business/fileRecord.js                                                |    8 
 platform/src/views/business/fileRecord.vue                                             |  119 +++++
 platform/src/components/business/OperaCompanyWindow.vue                                |   46 +
 h5/components/bigImg.vue                                                               |    4 
 server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java |    9 
 platform/src/assets/logo.png                                                           |    0 
 platform/src/components/system/user/OperaUserWindow.vue                                |    6 
 server/company/src/main/resources/application.yml                                      |    2 
 platform/public/favicon.ico                                                            |    0 
 platform/public/template/goods_import_modle.xlsx                                       |    0 
 server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java    |    5 
 output.jpg                                                                             |    0 
 platform/src/utils/form.js                                                             |   83 +++
 company_admin/.env.development                                                         |    8 
 company_admin/src/views/business/goods.vue                                             |  320 +++++++-------
 platform/src/views/business/goods.vue                                                  |   43 +
 server/platform/src/main/resources/application.yml                                     |    2 
 38 files changed, 959 insertions(+), 256 deletions(-)

diff --git a/company_admin/.env.development b/company_admin/.env.development
index d53d032..02e8212 100644
--- a/company_admin/.env.development
+++ b/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/'
\ No newline at end of file
diff --git a/company_admin/src/api/system/menu.js b/company_admin/src/api/system/menu.js
index 19f25a0..0d3d593 100644
--- a/company_admin/src/api/system/menu.js
+++ b/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')
 }
 
 // 鎺掑簭
diff --git a/company_admin/src/views/business/goods.vue b/company_admin/src/views/business/goods.vue
index ff3547d..48e5642 100644
--- a/company_admin/src/views/business/goods.vue
+++ b/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,165 +151,165 @@
       <selectProduct ref="selectProduct" @success="handlePageChange" @result="search"/>
     </TableLayout>
   </template>
-  
-  <script>
-  import BaseTable from '@/components/base/BaseTable'
-  import TableLayout from '@/layouts/TableLayout'
-  import Pagination from '@/components/common/Pagination'
-  import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
-  import selectProduct from '@/components/business/selectProduct'
-  import { brand, category, importExcel } from '@/api/system/common.js'
-  import { updateDisableById, queryById, exportDoc, batchUpdateDisableById } from '@/api/business/goods.js'
-  export default {
-    name: 'Goods',
-    extends: BaseTable,
-    components: { TableLayout, Pagination, OperaGoodsWindow, selectProduct },
-    data () {
-      return {
-        // 鎼滅储
-        searchForm: {
-          id: '',
-          name: '',
-          status: '',
-          categoryId: '',
-          brandId: '',
-          type: ''
-        },
-        ids: '',
-        categoryList: [],
-        brandList: [],
-        statusList: [
-          { name: '鍚敤', id: 0 },
-          { name: '绂佺敤', id: 1 }
-        ],
-        typeList: [
-          { name: '鑷缓', id: 0 },
-          { name: '鎷夊彇', id: 1 }
-        ]
-      }
-    },
-    created () {
-      this.config({
-        module: '鍟嗗搧',
-        api: '/business/goods',
-        'field.id': 'id',
-        'field.main': 'name'
-      })
-      this.search()
-      this.getbrand()
-      this.getcategory()
-    },
-    methods: {
-      handleSelectionChange(e) {
-        let arr = e.map(item => item.id)
-        this.ids = arr.join(',')
-        console.log(this.ids)
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
+import selectProduct from '@/components/business/selectProduct'
+import { brand, category, importExcel } from '@/api/system/common.js'
+import { updateDisableById, queryById, exportDoc, batchUpdateDisableById } from '@/api/business/goods.js'
+export default {
+  name: 'Goods',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaGoodsWindow, selectProduct },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        name: '',
+        status: '',
+        categoryId: '',
+        brandId: '',
+        type: ''
       },
-      // 鎵归噺涓婁笅鏋�
-      bulkOperation(type) {
-        if (!this.ids) {
-          this.$message.warning({ message: '鑷冲皯閫夋嫨涓�椤瑰唴瀹�' })
-          return
-        }
-        batchUpdateDisableById({
-          ids: this.ids,
-          status: type
-        }).then(res => {
-          this.$message.success({ message: res })
-          this.handlePageChange()
-        })
-      },
-      downloadFile() {
-        exportDoc({})
-          .then(response => {
-            this.download(response)
-          })
-          .catch(e => {
-            this.$tip.apiFailed(e)
-          })
-      },
-      rowStyle() {
-        return "text-align:center";
-      },
-      importFile() {
-        this.$refs.upload.click()
-      },
-      uplaodFile(e) {
-        const FORMDATE = new FormData()
-        FORMDATE.append('file', e.target.files[0])
-        // 璇锋眰鎺ュ彛
-        importExcel(FORMDATE)
-          .then(res => {
-            console.log(res)
-            this.search()
-          })
-          .catch ((err) => {
-            this.$message.error(err.message)
-          })
-        this.$refs.upload.value = null
-      },
-      edit(id) {
-        queryById(id)
-          .then(res => {
-            let obj = {
-              id: res.id,
-              name: res.name,
-              categoryId: res.categoryId,
-              brandId: res.brandId,
-              zdPrice: res.zdPrice,
-              price: res.price,
-              attrFirstIds: res.attrFirstIds ? this.turnNum(res.attrFirstIds.split(',')) : [],
-              attrFirstNames: res.attrFirstNames,
-              attrSecodIds: res.attrSecodIds ? this.turnNum(res.attrSecodIds.split(',')) : [],
-              attrSecodNames: res.attrSecodNames,
-              imgurl: res.imgurl,
-              multifileList: [],
-              files: [],
-              ztList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : [],
-              pzList: [],
-              attrFirstList: [],
-              attrSecodList: []
-            }
-            if (res.multifileList.length > 0) {
-              res.multifileList.forEach(item => {
-                obj.multifileList.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
-                obj.files.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
-              })
-            }
-            this.$refs.operaGoodsWindow.open('缂栬緫鍟嗗搧', obj)
-          })
-      },
-      changeStatus(item) {
-        updateDisableById({
-          id: item.id,
-          status: item.status
-        }).then(res => {
-          this.$tip.apiSuccess('鏇存柊鎴愬姛')
-        }).finally(() => {
-          this.search()
-        }).catch(err => {
-          this.$message.warning({ message: err.message })
-        })
-      },
-      turnNum (nums) {
-          for(let i=0;i<nums.length;i++){
-            nums[i] = parseInt(nums[i])
-          }        
-          return nums;
-        },
-        getbrand() {
-            brand({})
-                .then(res => {
-                    this.brandList = res
-                })
-        },
-        getcategory() {
-            category({})
-                .then(res => {
-                    this.categoryList = res
-                })  
-        }
+      ids: '',
+      categoryList: [],
+      brandList: [],
+      statusList: [
+        { name: '鍚敤', id: 0 },
+        { name: '绂佺敤', id: 1 }
+      ],
+      typeList: [
+        { name: '鑷缓', id: 0 },
+        { name: '鎷夊彇', id: 1 }
+      ]
     }
+  },
+  created () {
+    this.config({
+      module: '鍟嗗搧',
+      api: '/business/goods',
+      'field.id': 'id',
+      'field.main': 'name'
+    })
+    this.search()
+    this.getbrand()
+    this.getcategory()
+  },
+  methods: {
+    // handleSelectionChange(e) {
+    //   let arr = e.map(item => item.id)
+    //   this.ids = arr.join(',')
+    //   console.log(this.ids)
+    // },
+    // 鎵归噺涓婁笅鏋�
+    bulkOperation (type) {
+      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: idList.join(','),
+        status: type
+      }).then(res => {
+        this.$message.success({ message: res })
+        this.handlePageChange()
+      })
+    },
+    downloadFile() {
+      exportDoc({})
+        .then(response => {
+          this.download(response)
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+    },
+    rowStyle() {
+      return "text-align:center";
+    },
+    importFile() {
+      this.$refs.upload.click()
+    },
+    uplaodFile(e) {
+      const FORMDATE = new FormData()
+      FORMDATE.append('file', e.target.files[0])
+      // 璇锋眰鎺ュ彛
+      importExcel(FORMDATE)
+        .then(res => {
+          console.log(res)
+          this.search()
+        })
+        .catch ((err) => {
+          this.$message.error(err.message)
+        })
+      this.$refs.upload.value = null
+    },
+    edit(id) {
+      queryById(id)
+        .then(res => {
+          let obj = {
+            id: res.id,
+            name: res.name,
+            categoryId: res.categoryId,
+            brandId: res.brandId,
+            zdPrice: res.zdPrice,
+            price: res.price,
+            attrFirstIds: res.attrFirstIds ? this.turnNum(res.attrFirstIds.split(',')) : [],
+            attrFirstNames: res.attrFirstNames,
+            attrSecodIds: res.attrSecodIds ? this.turnNum(res.attrSecodIds.split(',')) : [],
+            attrSecodNames: res.attrSecodNames,
+            imgurl: res.imgurl,
+            multifileList: [],
+            files: [],
+            ztList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : [],
+            pzList: [],
+            attrFirstList: [],
+            attrSecodList: []
+          }
+          if (res.multifileList.length > 0) {
+            res.multifileList.forEach(item => {
+              obj.multifileList.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
+              obj.files.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
+            })
+          }
+          this.$refs.operaGoodsWindow.open('缂栬緫鍟嗗搧', obj)
+        })
+    },
+    changeStatus(item) {
+      updateDisableById({
+        id: item.id,
+        status: item.status
+      }).then(res => {
+        this.$tip.apiSuccess('鏇存柊鎴愬姛')
+      }).finally(() => {
+        this.search()
+      }).catch(err => {
+        this.$message.warning({ message: err.message })
+      })
+    },
+    turnNum (nums) {
+        for(let i=0;i<nums.length;i++){
+          nums[i] = parseInt(nums[i])
+        }
+        return nums;
+      },
+      getbrand() {
+          brand({})
+              .then(res => {
+                  this.brandList = res
+              })
+      },
+      getcategory() {
+          category({})
+              .then(res => {
+                  this.categoryList = res
+              })
+      }
   }
-  </script>
-  
\ No newline at end of file
+}
+</script>
\ No newline at end of file
diff --git a/h5/apis/index.js b/h5/apis/index.js
index c98a957..a0a8c4c 100644
--- a/h5/apis/index.js
+++ b/h5/apis/index.js
@@ -31,7 +31,7 @@
 }
 
 // 鐧诲綍
-export function loginH5(data) {
+export function loginH5(data){
 	return post('system/loginH5', data)
 }
 
diff --git a/h5/components/bigImg.vue b/h5/components/bigImg.vue
index ead3946..2cf1eef 100644
--- a/h5/components/bigImg.vue
+++ b/h5/components/bigImg.vue
@@ -6,8 +6,8 @@
 				<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 :class="['swiper-item',index == mycurrent ? 'active' : '']">
+								<image :src="item" style="width: 150%;height: 150%;" mode="aspectFit" />
 							</view>
 						</swiper-item>
 					</swiper>
diff --git a/h5/components/bigImg1.vue b/h5/components/bigImg1.vue
new file mode 100644
index 0000000..404f165
--- /dev/null
+++ b/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浼氬嚭鐜版兂涓嶅埌鐨勬晥鏋�
+						// 濡傛灉鎯宠璁剧疆瀹芥瘡涓�寮犺疆鎾浘鐨勫搴︼紝鍙渶瑕佽缃畃revious-margin鍜宯ext-margin灏卞彲浠ヤ簡锛屾兂瑕佽缃珮搴︾洿鎺ユ敼涓嬮潰鐨刪eight灏卞彲浠ヤ簡
+						// 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>
\ No newline at end of file
diff --git a/h5/components/noData.vue b/h5/components/noData.vue
new file mode 100644
index 0000000..35c85b8
--- /dev/null
+++ b/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>
\ No newline at end of file
diff --git a/h5/main.js b/h5/main.js
index 7bead7b..e9c6651 100644
--- a/h5/main.js
+++ b/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 {
diff --git a/h5/package-lock.json b/h5/package-lock.json
new file mode 100644
index 0000000..839857b
--- /dev/null
+++ b/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
+}
diff --git a/h5/pages/index/index.vue b/h5/pages/index/index.vue
index 1571973..2336445 100644
--- a/h5/pages/index/index.vue
+++ b/h5/pages/index/index.vue
@@ -198,16 +198,19 @@
 						</view>
 					</view>
 					<view class="productPage_shop" v-if="status === 1 && !pkcontent">
-						<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>
+						<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>
+								</view>
+								<!-- stringOperations(item.name, 6) -->
+								<text>{{item.name}}</text>
 							</view>
-							<!-- stringOperations(item.name, 6) -->
-							<text>{{item.name}}</text>
-						</view>
-						<view class="productPage_shop_zw"></view>
-						<view class="productPage_shop_zw"></view>
-						<view class="productPage_shop_zw"></view>
+							<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;
diff --git a/h5/static/default_nodata@2x.png b/h5/static/default_nodata@2x.png
new file mode 100644
index 0000000..0ef2f94
--- /dev/null
+++ b/h5/static/default_nodata@2x.png
Binary files differ
diff --git a/output.jpg b/output.jpg
new file mode 100644
index 0000000..29f702b
--- /dev/null
+++ b/output.jpg
Binary files differ
diff --git a/platform/.env.development b/platform/.env.development
index 360f8b7..c53b589 100644
--- a/platform/.env.development
+++ b/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'
diff --git a/platform/.env.production b/platform/.env.production
index eb6b15b..5c2b951 100644
--- a/platform/.env.production
+++ b/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/'
\ No newline at end of file
+# 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/
\ No newline at end of file
diff --git a/platform/package.json b/platform/package.json
index bc7b751..14effa1 100644
--- a/platform/package.json
+++ b/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"
diff --git a/platform/public/favicon.ico b/platform/public/favicon.ico
index c6ff5db..64ccd74 100644
--- a/platform/public/favicon.ico
+++ b/platform/public/favicon.ico
Binary files differ
diff --git a/platform/public/template/goods_import_modle.xlsx b/platform/public/template/goods_import_modle.xlsx
index 84a9c9a..87678a5 100644
--- a/platform/public/template/goods_import_modle.xlsx
+++ b/platform/public/template/goods_import_modle.xlsx
Binary files differ
diff --git a/platform/src/api/business/fileRecord.js b/platform/src/api/business/fileRecord.js
new file mode 100644
index 0000000..5e34b26
--- /dev/null
+++ b/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
+  })
+}
diff --git a/platform/src/assets/logo.png b/platform/src/assets/logo.png
index 3c0b233..5d8fd16 100644
--- a/platform/src/assets/logo.png
+++ b/platform/src/assets/logo.png
Binary files differ
diff --git a/platform/src/components/business/OperaCompanyUserWindow.vue b/platform/src/components/business/OperaCompanyUserWindow.vue
index 6613a25..45942e7 100644
--- a/platform/src/components/business/OperaCompanyUserWindow.vue
+++ b/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="缁熶竴绀句細淇$敤浠g爜" prop="creditCode">
-        <el-input v-model="form.creditCode" placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜" v-trim/>
+      <el-form-item label="缁熶竴淇$敤浠g爜" prop="creditCode">
+        <el-input v-model="form.creditCode" placeholder="璇疯緭鍏ョ粺涓�淇$敤浠g爜" v-trim/>
         缁熶竴淇$敤浠g爜闇�涓庡伐鍟嗛儴闂ㄧ櫥璁颁俊鎭竴鑷�
       </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;
diff --git a/platform/src/components/business/OperaCompanyWindow.vue b/platform/src/components/business/OperaCompanyWindow.vue
index 4c91ee7..0739250 100644
--- a/platform/src/components/business/OperaCompanyWindow.vue
+++ b/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="缁熶竴绀句細淇$敤浠g爜" prop="creditCode">
-        <el-input v-model="form.creditCode" placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜" v-trim/>
+      <el-form-item label="缁熶竴淇$敤浠g爜" prop="creditCode">
+        <el-input v-model="form.creditCode" placeholder="璇疯緭鍏ョ粺涓�淇$敤浠g爜" v-trim/>
         缁熶竴淇$敤浠g爜闇�涓庡伐鍟嗛儴闂ㄧ櫥璁颁俊鎭竴鑷�
       </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 {
diff --git a/platform/src/components/business/OperaGoodsWindow.vue b/platform/src/components/business/OperaGoodsWindow.vue
index 4bbcc37..b4d0072 100644
--- a/platform/src/components/business/OperaGoodsWindow.vue
+++ b/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 @@
         鍙兘涓婁紶鍥剧墖鏍煎紡锛宲ng鏍煎紡锛屽缓璁昂瀵�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 />
diff --git a/platform/src/components/common/GlobalAlertWindow.vue b/platform/src/components/common/GlobalAlertWindow.vue
index f1d4255..74d06aa 100644
--- a/platform/src/components/common/GlobalAlertWindow.vue
+++ b/platform/src/components/common/GlobalAlertWindow.vue
@@ -1,6 +1,7 @@
 
 <template>
   <el-dialog
+    top="10vh"
     class="global-window"
     title="title"
     :visible="visible"
diff --git a/platform/src/components/system/user/OperaUserWindow.vue b/platform/src/components/system/user/OperaUserWindow.vue
index 240a739..c3ac6e7 100644
--- a/platform/src/components/system/user/OperaUserWindow.vue
+++ b/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, //  鎵�灞為儴闂↖D
         positionIds: [], //  鎵�灞炲矖浣岻D闆�
-        avatar: '/avatar/man.png', // 澶村儚
+        // avatar: '/avatar/man.png', // 澶村儚
         password: '', // 瀵嗙爜
         mobile: '', // 鎵嬫満鍙风爜
         email: '', // 閭
diff --git a/platform/src/utils/form.js b/platform/src/utils/form.js
index cf60c6f..e625827 100644
--- a/platform/src/utils/form.js
+++ b/platform/src/utils/form.js
@@ -1,15 +1,88 @@
-// 楠岃瘉鎵嬫満鍙风爜
-export function checkMobile (rule, value, callback) {
+
+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('璇疯緭鍏ユ纭殑绀句細淇$敤浠g爜'))
+  } else {
+    callback()
+  }
+}
 
 // 楠岃瘉閭
 export function checkEmail (rule, value, callback) {
diff --git a/platform/src/utils/request.js b/platform/src/utils/request.js
index bb715e1..703ba15 100644
--- a/platform/src/utils/request.js
+++ b/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) {
diff --git a/platform/src/views/business/category.vue b/platform/src/views/business/category.vue
index 659971b..f937c4c 100644
--- a/platform/src/views/business/category.vue
+++ b/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) {
diff --git a/platform/src/views/business/company.vue b/platform/src/views/business/company.vue
index 8ae8e33..ce296b3 100644
--- a/platform/src/views/business/company.vue
+++ b/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">
diff --git a/platform/src/views/business/fileRecord.vue b/platform/src/views/business/fileRecord.vue
new file mode 100644
index 0000000..f2160c6
--- /dev/null
+++ b/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="璇疯緭鍏SS鏂囦欢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>
diff --git a/platform/src/views/business/goods.vue b/platform/src/views/business/goods.vue
index b7f8046..98ebff2 100644
--- a/platform/src/views/business/goods.vue
+++ b/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>
-        <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> -->
+        <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>
+        <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() {
diff --git a/platform/src/views/system/user.vue b/platform/src/views/system/user.vue
index 7a2711d..532e469 100644
--- a/platform/src/views/system/user.vue
+++ b/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>
diff --git a/server/company/src/main/resources/application.yml b/server/company/src/main/resources/application.yml
index ac52ad2..6787c56 100644
--- a/server/company/src/main/resources/application.yml
+++ b/server/company/src/main/resources/application.yml
@@ -11,7 +11,7 @@
 #  application:
 #    name: doumeemes
   profiles:
-    active: pro
+    active: dev
 
   # JSON杩斿洖閰嶇疆
   jackson:
diff --git a/server/platform/src/main/resources/application.yml b/server/platform/src/main/resources/application.yml
index 91e823b..bf924e8 100644
--- a/server/platform/src/main/resources/application.yml
+++ b/server/platform/src/main/resources/application.yml
@@ -11,7 +11,7 @@
 #  application:
 #  name: doumeemes
   profiles:
-    active: pro
+    active: dev
 
   # JSON杩斿洖閰嶇疆
   jackson:
diff --git a/server/service/src/main/java/com/doumee/core/utils/ImageUtil.java b/server/service/src/main/java/com/doumee/core/utils/ImageUtil.java
new file mode 100644
index 0000000..be93da1
--- /dev/null
+++ b/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); //鐢↖mageIO娴佽鍙栧儚绱犲潡
+                if (bi != null) {
+                    removeWatermark(bi);
+                    String formatName = file.getName().substring(file.getName().lastIndexOf(".") + 1);//鐢熸垚鐨勫浘鐗囨牸寮�
+                    ImageIO.write(bi, formatName, file);//鐢↖mageIO娴佺敓鎴愮殑澶勭悊鍥炬浛鎹㈠師鍥剧墖
+                }
+            }
+        } 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();
+        }
+    }
+
+    /**
+     * 鐢盜mageIO娴佺敓鎴愭簮鍥剧墖鐨勫鐞嗗浘
+     *
+     * @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());
+                }
+            }
+        }
+    }
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java
index 118f433..7a8c622 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java
+++ b/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);
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index 02cde3d..0f972e2 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/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
diff --git a/server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java b/server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java
index 47ef372..7e7bb5a 100644
--- a/server/zhubo/src/main/java/com/doumee/api/business/WebParamController.java
+++ b/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() {
diff --git a/server/zhubo/src/main/resources/application.yml b/server/zhubo/src/main/resources/application.yml
index 4fb560e..cfb19a6 100644
--- a/server/zhubo/src/main/resources/application.yml
+++ b/server/zhubo/src/main/resources/application.yml
@@ -11,7 +11,7 @@
 #  application:
 #    name: doumeemes
   profiles:
-    active: pro
+    active: dev
 
   # JSON杩斿洖閰嶇疆
   jackson:

--
Gitblit v1.9.3