更新
This commit is contained in:
		| @@ -35,7 +35,7 @@ | |||||||
|         </el-form> |         </el-form> | ||||||
|         <div class="bottom flex-center"> |         <div class="bottom flex-center"> | ||||||
|             <el-button @click="$emit('onClose')">取 消</el-button> |             <el-button @click="$emit('onClose')">取 消</el-button> | ||||||
|             <el-button type="primary" @click="addToDraft">确定</el-button> |             <el-button type="primary" @click="addToDraft" :loading="isCopying">确定</el-button> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| </template> | </template> | ||||||
| @@ -108,7 +108,8 @@ export default { | |||||||
|             }, |             }, | ||||||
|             goods: {}, |             goods: {}, | ||||||
|             sku: {}, |             sku: {}, | ||||||
|             productDetail: {} |             productDetail: {}, | ||||||
|  |             isCopying: false | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     created () { |     created () { | ||||||
| @@ -120,6 +121,7 @@ export default { | |||||||
|         async addToDraft() { |         async addToDraft() { | ||||||
|             this.$refs.form.validate((valid) => { |             this.$refs.form.validate((valid) => { | ||||||
|             if (valid) { |             if (valid) { | ||||||
|  |                 this.isCopying = true | ||||||
|                 this.$http.post('/api/copyProduct/check',null, {params: {type: 0}}).then(res => { |                 this.$http.post('/api/copyProduct/check',null, {params: {type: 0}}).then(res => { | ||||||
|                     if (res.code == 0) { |                     if (res.code == 0) { | ||||||
|                         let source |                         let source | ||||||
| @@ -134,8 +136,9 @@ export default { | |||||||
|                         }).then((res) => { |                         }).then((res) => { | ||||||
|                             if (this.form.type == '1') { |                             if (this.form.type == '1') { | ||||||
|                                 if (res.indexOf("rawData") == -1) { |                                 if (res.indexOf("rawData") == -1) { | ||||||
|                                     Message.error("请检查地址是否正确,或者“TEMU”网站是否出现图形验证码") |                                   this.isCopying = falses | ||||||
|                                     return |                                   Message.error("请检查地址是否正确,或者“TEMU”网站是否出现图形验证码") | ||||||
|  |                                   return | ||||||
|                                 } |                                 } | ||||||
|                                 let str = res.substring(res.indexOf("rawData")) |                                 let str = res.substring(res.indexOf("rawData")) | ||||||
|                                 str = str.substring(0, str.indexOf("<\/script>")) |                                 str = str.substring(0, str.indexOf("<\/script>")) | ||||||
| @@ -206,6 +209,8 @@ export default { | |||||||
|                                 })*/ |                                 })*/ | ||||||
|                             } |                             } | ||||||
|                         }) |                         }) | ||||||
|  |                     } else { | ||||||
|  |                       this.isCopying = false | ||||||
|                     } |                     } | ||||||
|                 }) |                 }) | ||||||
|             } |             } | ||||||
| @@ -219,6 +224,7 @@ export default { | |||||||
|           data: { |           data: { | ||||||
|             catId: this.form.targetCatId[this.form.targetCatId.length - 1] |             catId: this.form.targetCatId[this.form.targetCatId.length - 1] | ||||||
|         }}).then((res) => { |         }}).then((res) => { | ||||||
|  |           this.isCopying = false | ||||||
|           if (res.errorCode == 1000000) { |           if (res.errorCode == 1000000) { | ||||||
|             let draftId = res.result.productDraftId |             let draftId = res.result.productDraftId | ||||||
|             let content = data |             let content = data | ||||||
|   | |||||||
| @@ -46,12 +46,20 @@ export default { | |||||||
|       if (e.type == 'detail') { |       if (e.type == 'detail') { | ||||||
|         this.$emit('onGoDetail') |         this.$emit('onGoDetail') | ||||||
|       } else if (e.type == 'copy') { |       } else if (e.type == 'copy') { | ||||||
|         this.temuParams = {url: 'https://www.temu.com/' + e.url} |         if (e.url.startsWith('http')) { | ||||||
|  |           this.temuParams = {url: e.url} | ||||||
|  |         } else { | ||||||
|  |           this.temuParams = {url: 'https://www.temu.com/' + e.url} | ||||||
|  |         } | ||||||
|         this.copyFromDlgShow = true |         this.copyFromDlgShow = true | ||||||
|       } else if (e.type == 'goMall') { |       } else if (e.type == 'goMall') { | ||||||
|         window.open('https://www.temu.com/mall.html?mall_id=' + e.mallId, '_blank'); |         window.open('https://www.temu.com/mall.html?mall_id=' + e.mallId, '_blank'); | ||||||
|       } else if (e.type == 'goWeb') { |       } else if (e.type == 'goWeb') { | ||||||
|         window.open('https://www.temu.com/' + e.url, '_blank'); |         if (e.url.startsWith('http')) { | ||||||
|  |           window.open(e.url, '_blank'); | ||||||
|  |         } else { | ||||||
|  |           window.open('https://www.temu.com/' + e.url, '_blank'); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     beforeGoDetail(goodsId) { |     beforeGoDetail(goodsId) { | ||||||
|   | |||||||
							
								
								
									
										81
									
								
								src/components/AiSpecialProductDetail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/components/AiSpecialProductDetail.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | <template> | ||||||
|  |   <ai-detail class="audit"> | ||||||
|  |     <template slot="content"> | ||||||
|  |       <ai-card title="基本信息"> | ||||||
|  |         <ai-product-drop-down v-if="info" :params="info" slot="right"></ai-product-drop-down> | ||||||
|  |         <template #content> | ||||||
|  |           <div class="flex"> | ||||||
|  |             <ai-avatar v-model="info.imgUrl" :editable="false" :preview="true"/> | ||||||
|  |             <ai-wrapper | ||||||
|  |               label-width="120px" class="fill"> | ||||||
|  |               <ai-info-item label="价格:"   :value="'$' + info.price"></ai-info-item> | ||||||
|  |               <ai-info-item label="销量:"   :value="info.saleTotal"></ai-info-item> | ||||||
|  |             </ai-wrapper> | ||||||
|  |           </div> | ||||||
|  |         </template> | ||||||
|  |       </ai-card> | ||||||
|  |       <ai-card title="趋势信息"> | ||||||
|  |         <template #content> | ||||||
|  |           <div id="dataChart"></div> | ||||||
|  |         </template> | ||||||
|  |       </ai-card> | ||||||
|  |     </template> | ||||||
|  |   </ai-detail> | ||||||
|  | </template> | ||||||
|  | <script> | ||||||
|  | import AiProductDropDown from './AiProductDropDown.vue' | ||||||
|  | import { DualAxes } from '@antv/g2plot' | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |   name: "AiProductDetail", | ||||||
|  |   props: ['params'], | ||||||
|  |   components: { | ||||||
|  |     AiProductDropDown | ||||||
|  |   }, | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       info: {} | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   computed: { | ||||||
|  |   }, | ||||||
|  |   mounted() { | ||||||
|  |     // this.info = this.params | ||||||
|  |     this.$nextTick(() => { | ||||||
|  |       this.init() | ||||||
|  |     }) | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     init() { | ||||||
|  |       this.$http.post('/api/specialDetail/queryProductDetail',null,{ | ||||||
|  |         params: { | ||||||
|  |           goodsId: this.params.goodsId, | ||||||
|  |           categoryId: this.params.categoryId | ||||||
|  |         } | ||||||
|  |       }).then(res => { | ||||||
|  |         this.info = res.data | ||||||
|  |            | ||||||
|  |         const dualAxes = new DualAxes('dataChart', { | ||||||
|  |           data: [this.info.priceAndSale, this.info.priceAndSale], | ||||||
|  |           xField: '日期', | ||||||
|  |           yField: ['价格', '销量'], | ||||||
|  |           geometryOptions: [ | ||||||
|  |             { | ||||||
|  |               geometry: 'line', | ||||||
|  |               color: '#5B8FF9', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               geometry: 'line', | ||||||
|  |               color: '#5AD8A6', | ||||||
|  |             } | ||||||
|  |           ], | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         dualAxes.render(); | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | </style> | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|   "manifest_version": 3, |   "manifest_version": 3, | ||||||
|   "name": "TEMU助手", |   "name": "TEMU助手", | ||||||
|   "description": "TEMU助手 - 自动化提高生产效率", |   "description": "TEMU助手 - 自动化提高生产效率", | ||||||
|   "version": "3.0.4", |   "version": "3.0.5", | ||||||
|   "background": { |   "background": { | ||||||
|     "service_worker": "/background.js" |     "service_worker": "/background.js" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -77,6 +77,11 @@ const router = new VueRouter({ | |||||||
|           name: 'keywordTrack', |           name: 'keywordTrack', | ||||||
|           component: () => import('../view/selection/keywordtrack/Index.vue') |           component: () => import('../view/selection/keywordtrack/Index.vue') | ||||||
|         }, |         }, | ||||||
|  |         { | ||||||
|  |           path: 'indexTrack', | ||||||
|  |           name: 'indexTrack', | ||||||
|  |           component: () => import('../view/selection/indextrack/Index.vue') | ||||||
|  |         }, | ||||||
|  |  | ||||||
|         { |         { | ||||||
|           path: 'message', |           path: 'message', | ||||||
|   | |||||||
| @@ -75,6 +75,7 @@ | |||||||
|             <el-menu-item index="/niubiCopy">商品采集</el-menu-item> |             <el-menu-item index="/niubiCopy">商品采集</el-menu-item> | ||||||
|             <el-menu-item index="/storeTrack">店铺跟踪</el-menu-item> |             <el-menu-item index="/storeTrack">店铺跟踪</el-menu-item> | ||||||
|             <el-menu-item index="/keywordTrack">关键字跟踪</el-menu-item> |             <el-menu-item index="/keywordTrack">关键字跟踪</el-menu-item> | ||||||
|  |             <el-menu-item index="/indexTrack">首页商品跟踪</el-menu-item> | ||||||
|           </el-submenu> |           </el-submenu> | ||||||
|  |  | ||||||
|           <el-menu-item index="/saleData"> |           <el-menu-item index="/saleData"> | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								src/view/selection/indextrack/Index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/view/selection/indextrack/Index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | <template> | ||||||
|  |   <div style="height: 100%;"> | ||||||
|  |     <transition name="fade-transform" mode="out-in"> | ||||||
|  |       <keep-alive :include="['List']"> | ||||||
|  |         <component ref="component" :is="component" @change="onChange" :params="params"></component> | ||||||
|  |       </keep-alive> | ||||||
|  |     </transition> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  |   import List from './components/List.vue' | ||||||
|  |   import Detail from './components/Detail.vue' | ||||||
|  |  | ||||||
|  |   export default { | ||||||
|  |     name: 'IndexTrack', | ||||||
|  |     label: '首页跟踪', | ||||||
|  |  | ||||||
|  |     components: { | ||||||
|  |       List, | ||||||
|  |       Detail | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     data () { | ||||||
|  |       return { | ||||||
|  |         component: 'List', | ||||||
|  |         params: {} | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     methods: { | ||||||
|  |       onChange (data) { | ||||||
|  |         if (data.type === 'Detail') { | ||||||
|  |           this.component = 'Detail' | ||||||
|  |           this.params = data.params | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (data.type === 'List') { | ||||||
|  |           this.component = 'List' | ||||||
|  |           this.params = data.params | ||||||
|  |  | ||||||
|  |           this.$nextTick(() => { | ||||||
|  |             if (data.isRefresh) { | ||||||
|  |               setTimeout(() => { | ||||||
|  |                 this.$refs.component.getList() | ||||||
|  |               }, 600) | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style lang="scss" scoped> | ||||||
|  | </style> | ||||||
|  |  | ||||||
							
								
								
									
										212
									
								
								src/view/selection/indextrack/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								src/view/selection/indextrack/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <ai-list class="list"> | ||||||
|  |       <ai-title | ||||||
|  |         slot="title" | ||||||
|  |         title="商品列表" | ||||||
|  |         isShowBottomBorder isShowBack @onBackClick="cancel(false)"> | ||||||
|  |       </ai-title> | ||||||
|  |       <template slot="content"> | ||||||
|  |         <ai-search-bar> | ||||||
|  |           <template #left> | ||||||
|  |               <label style="width:80px">排序方式:</label> | ||||||
|  |               <el-select v-model="search.orderBy" :clearable="true" @change="search.current =1, getList()" placeholder="请选择排序方式" size="small"> | ||||||
|  |                 <el-option | ||||||
|  |                   v-for="item in orderBys" | ||||||
|  |                   :key="item.value" | ||||||
|  |                   :label="item.label" | ||||||
|  |                   :value="item.value"> | ||||||
|  |                 </el-option> | ||||||
|  |               </el-select> | ||||||
|  |               <label style="width:80px">价格区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceEnd" ></el-input> | ||||||
|  |               <label style="width:80px">销量区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleEnd" ></el-input> | ||||||
|  |              | ||||||
|  |           </template> | ||||||
|  |           <template #right> | ||||||
|  |             <el-button type="primary" @click="search.current =1, getList()">查询</el-button> | ||||||
|  |           </template> | ||||||
|  |         </ai-search-bar> | ||||||
|  |            | ||||||
|  |         <div style="margin-right: 0px; margin-bottom: 10px;"> | ||||||
|  |            | ||||||
|  |         </div> | ||||||
|  |         <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 16px;"> | ||||||
|  |           <el-card v-for="item in tableData" :key="item.id" :body-style="{ padding: '0px', margin: '5px' }"> | ||||||
|  |             <img :src="item.imgUrl" class="image"> | ||||||
|  |             <div style="padding: 14px;"> | ||||||
|  |               <div class="bottom clearfix"> | ||||||
|  |                 <div style="margin-bottom: 5px;"> | ||||||
|  |                   <div style="display: inline; margin-left: 5px;">${{ item.price }}<sub style="margin-left: 2px;" v-html="getPricePercent(item.priceChange)"></sub></div> | ||||||
|  |                   <div style="display: inline; margin-right: 5px; float: right;">{{ item.saleTotal }}<sub style="margin-left: 2px;" v-html="getSalePercent(item.saleChange)"></sub></div> | ||||||
|  |                 </div> | ||||||
|  |                 <ai-product-drop-down :params="item" :isShowDetail="true" @onGoDetail="goDetail(item.goodsId, item.categoryId)" style="float: right;"></ai-product-drop-down> | ||||||
|  |               </div> | ||||||
|  |             </div> | ||||||
|  |           </el-card> | ||||||
|  |           <el-pagination | ||||||
|  |             layout="prev, pager, next" | ||||||
|  |             style="position: absolute; bottom: 0px; right: 40px;" | ||||||
|  |             :total="total" | ||||||
|  |             :page-size.sync="search.size" | ||||||
|  |             :current-page.sync="search.current" | ||||||
|  |             @current-change="getList"> | ||||||
|  |           </el-pagination> | ||||||
|  |         </div> | ||||||
|  |       </template> | ||||||
|  |     </ai-list> | ||||||
|  |  | ||||||
|  |     <div class="productDetail"> | ||||||
|  |       <el-dialog | ||||||
|  |         title="商品详情" | ||||||
|  |         :visible="isShowDetailDlg" | ||||||
|  |         :close-on-click-modal="false" | ||||||
|  |         width="80%" | ||||||
|  |         :before-close="handleClose"> | ||||||
|  |         <ai-special-product-detail v-if="isShowDetailDlg" :params="detailParams"/> | ||||||
|  |       </el-dialog> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import AiSpecialProductDetail from "@/components/AiSpecialProductDetail.vue"; | ||||||
|  | import AiProductDropDown from '@/components/AiProductDropDown.vue'; | ||||||
|  |  | ||||||
|  |   export default { | ||||||
|  |     name: 'DetailPage', | ||||||
|  |     props: ['params'], | ||||||
|  |     components: {AiSpecialProductDetail, AiProductDropDown}, | ||||||
|  |     data () { | ||||||
|  |       return { | ||||||
|  |         categoryId: '', | ||||||
|  |         search: { | ||||||
|  |           current: 1, | ||||||
|  |           type: '1', | ||||||
|  |           size: 120, | ||||||
|  |           orderBy: '', | ||||||
|  |           priceBegin: '', | ||||||
|  |           priceEnd: '', | ||||||
|  |           saleBegin: '', | ||||||
|  |           saleEnd: '' | ||||||
|  |         }, | ||||||
|  |         orderBys: [{ | ||||||
|  |           value: '0', | ||||||
|  |           label: '按销量涨辐排序' | ||||||
|  |         },{ | ||||||
|  |           value: '1', | ||||||
|  |           label: '按价格涨辐排序' | ||||||
|  |         },{ | ||||||
|  |           value: '2', | ||||||
|  |           label: '按销量排序' | ||||||
|  |         },{ | ||||||
|  |           value: '3', | ||||||
|  |           label: '按价格排序' | ||||||
|  |         }], | ||||||
|  |         tableData: [], | ||||||
|  |         total: 0, | ||||||
|  |         isShowDetailDlg: false, | ||||||
|  |         detailParams: {} | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     created () { | ||||||
|  |       this.categoryId = this.params.id | ||||||
|  |       this.getList() | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     methods: { | ||||||
|  |       getList () { | ||||||
|  |         this.$http.post('/api/specialDetail/myPageNew',null,{ | ||||||
|  |           params: { | ||||||
|  |             categoryId: this.categoryId, | ||||||
|  |             ...this.search | ||||||
|  |           } | ||||||
|  |         }).then(res => { | ||||||
|  |           this.tableData = res.data.records | ||||||
|  |           this.total = res.data.total | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       cancel (isRefresh) { | ||||||
|  |         this.$emit('change', { | ||||||
|  |           type: 'List', | ||||||
|  |           isRefresh: !!isRefresh | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       getPricePercent(data) { | ||||||
|  |         if (data < 0) { | ||||||
|  |           return '<div style="display: inline; color: green">↓' + data + '%</div>' | ||||||
|  |         } else if (data > 0) { | ||||||
|  |           return '<div style="display: inline; color: red">↑' + data + '%</div>' | ||||||
|  |         } | ||||||
|  |         return '' | ||||||
|  |       }, | ||||||
|  |       getSalePercent(data) { | ||||||
|  |         if (data < 0) { | ||||||
|  |           return '<div style="display: inline; color: green">↓' + data + '%</div>' | ||||||
|  |         } else if (data > 0) { | ||||||
|  |           return '<div style="display: inline; color: red">↑' + data + '%</div>' | ||||||
|  |         } | ||||||
|  |         return '' | ||||||
|  |       }, | ||||||
|  |       handleClose() { | ||||||
|  |         this.isShowDetailDlg = false | ||||||
|  |       }, | ||||||
|  |       goDetail (goodsId, categoryId) { | ||||||
|  |         this.detailParams = {goodsId: goodsId, categoryId: categoryId} | ||||||
|  |         this.isShowDetailDlg = true | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .productDetail { | ||||||
|  |   :deep(.el-dialog) { | ||||||
|  |       height: 78vh; | ||||||
|  |       overflow: auto; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
|  | .time { | ||||||
|  |     font-size: 13px; | ||||||
|  |     color: #999; | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   .bottom { | ||||||
|  |     margin-top: 13px; | ||||||
|  |     line-height: 12px; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .button { | ||||||
|  |     padding: 0; | ||||||
|  |     float: right; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .image { | ||||||
|  |     width: 100%; | ||||||
|  |     display: block; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .clearfix:before, | ||||||
|  |   .clearfix:after { | ||||||
|  |       display: table; | ||||||
|  |       content: ""; | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   .clearfix:after { | ||||||
|  |       clear: both | ||||||
|  |   } | ||||||
|  |   .el-dropdown-link { | ||||||
|  |     cursor: pointer; | ||||||
|  |     color: #409EFF; | ||||||
|  |   } | ||||||
|  |   .el-icon-arrow-down { | ||||||
|  |     font-size: 12px; | ||||||
|  |   } | ||||||
|  | </style> | ||||||
							
								
								
									
										237
									
								
								src/view/selection/indextrack/components/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								src/view/selection/indextrack/components/List.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,237 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <ai-list class="list"> | ||||||
|  |       <ai-title | ||||||
|  |         slot="title" | ||||||
|  |         title="分类首页商品跟踪" | ||||||
|  |         isShowBottomBorder> | ||||||
|  |       </ai-title> | ||||||
|  |       <template slot="content"> | ||||||
|  |         <div class="content"> | ||||||
|  |           <ai-search-bar> | ||||||
|  |             <template #left> | ||||||
|  |               <el-button type="button" :class="'el-button el-button--primary'" @click="addStore()">添加分类</el-button> | ||||||
|  |             </template> | ||||||
|  |             <template #right> | ||||||
|  |               <el-button size="small" circle icon="el-icon-refresh-right" @click="getList()"></el-button> | ||||||
|  |             </template> | ||||||
|  |           </ai-search-bar> | ||||||
|  |           <ai-table | ||||||
|  |             :tableData="tableData" | ||||||
|  |             :col-configs="colConfigs" | ||||||
|  |             :total="total" | ||||||
|  |             style="margin-top: 8px;" | ||||||
|  |             @selection-change="onChooseChange" | ||||||
|  |             :current.sync="search.current" :size.sync="search.size" | ||||||
|  |             @getList="getList"> | ||||||
|  |             <el-table-column slot="options" label="操作" width="240px" show-overflow-tooltip align="center" fixed="right"> | ||||||
|  |               <template slot-scope="{ row }"> | ||||||
|  |                 <div class="table-options"> | ||||||
|  |                   <el-button type="text" @click="deleteMonitor(row.id)">删除</el-button> | ||||||
|  |                   <el-button type="text" @click="renew(row.id)">续费</el-button> | ||||||
|  |                   <el-button type="text" @click="toDetail(row.categoryId)">详情</el-button> | ||||||
|  |                 </div> | ||||||
|  |               </template> | ||||||
|  |             </el-table-column> | ||||||
|  |             <el-table-column slot="categoryId" label="分类" show-overflow-tooltip align="center"> | ||||||
|  |               <template slot-scope="{ row }"> | ||||||
|  |                 <div><a class="el-link el-link--primary" :href="'https://www.temu.com' + row.categoryUrl" target="_blank">{{ row.categoryName }}</a></div> | ||||||
|  |               </template> | ||||||
|  |             </el-table-column> | ||||||
|  |           </ai-table> | ||||||
|  |         </div> | ||||||
|  |       </template> | ||||||
|  |     </ai-list> | ||||||
|  |  | ||||||
|  |     <ai-dialog | ||||||
|  |       title="添加分类" | ||||||
|  |       :visible.sync="isDlgShow" | ||||||
|  |       :close-on-click-modal="false" | ||||||
|  |       width="790px" | ||||||
|  |       customFooter | ||||||
|  |       @close="isDlgShow = false"> | ||||||
|  |       <el-alert | ||||||
|  |         title="添加一个分类,将消耗300金币" | ||||||
|  |         type="success" | ||||||
|  |         :closable="false"> | ||||||
|  |       </el-alert> | ||||||
|  |       <el-form class="ai-form" style="margin-top: 20px" :model="form" label-width="120px" ref="form"> | ||||||
|  |         <el-form-item | ||||||
|  |           prop="categoryId" | ||||||
|  |           label="分类" | ||||||
|  |           :rules="[{ required: true, message: '请选择分类', trigger: 'blur' }]"> | ||||||
|  |           <el-cascader style="width: 380px" v-model="form.categoryId" :props="props"></el-cascader> | ||||||
|  |         </el-form-item> | ||||||
|  |       </el-form> | ||||||
|  |       <div class="dialog-footer" slot="footer"> | ||||||
|  |         <el-button @click="isDlgShow = false">取 消</el-button> | ||||||
|  |         <el-button type="primary" @click="saveStore">确定</el-button> | ||||||
|  |       </div> | ||||||
|  |     </ai-dialog> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  |  | ||||||
|  |   export default { | ||||||
|  |     name: 'List', | ||||||
|  |  | ||||||
|  |     data () { | ||||||
|  |       let _this = this | ||||||
|  |       return { | ||||||
|  |         search: { | ||||||
|  |           current: 1, | ||||||
|  |           type: '1', | ||||||
|  |           size: 10 | ||||||
|  |         }, | ||||||
|  |         colConfigs: [ | ||||||
|  |           { type: "selection", width: '70px', align: 'left' }, | ||||||
|  |           { slot: 'categoryId', label: '分类', align: 'left' }, | ||||||
|  |           { prop: 'status', label: '状态', align: 'left', format: v => this.$dict.getLabel('monitor_status', v), }, | ||||||
|  |           { prop: 'expireTime', label: '失效时间', align: 'left' }, | ||||||
|  |           { prop: 'createTime', label: '添加时间', width: '180px', fixed: 'right'} | ||||||
|  |         ], | ||||||
|  |         tableData: [], | ||||||
|  |         total: 0, | ||||||
|  |  | ||||||
|  |         form: { | ||||||
|  |           categoryId: '' | ||||||
|  |         }, | ||||||
|  |         props: { | ||||||
|  |           value: 'optId', | ||||||
|  |           label: 'name', | ||||||
|  |           lazy: true, | ||||||
|  |           lazyLoad (node, resolve) { | ||||||
|  |             _this.$http.post('/api/category/listAllByParentId', null, { | ||||||
|  |               params: {parentId: node.value || 0} | ||||||
|  |             }).then(res => { | ||||||
|  |               let parentId = node.value || 0 | ||||||
|  |               if (res.code === 0) { | ||||||
|  |                   resolve(res.data.map(v => { | ||||||
|  |                   return { | ||||||
|  |                       ...v, | ||||||
|  |                       leaf: parentId == 0 ? false: true | ||||||
|  |                   } | ||||||
|  |                   })) | ||||||
|  |               } | ||||||
|  |             }) | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         isDlgShow: false, | ||||||
|  |         selectRows: [] | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     created () { | ||||||
|  |       this.$dict.load('monitor_status'); | ||||||
|  |       this.getList() | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     methods: { | ||||||
|  |       getList () { | ||||||
|  |         this.$http.post('/api/specialMonitor/myPage',null,{ | ||||||
|  |             params: { | ||||||
|  |                 ...this.search | ||||||
|  |             } | ||||||
|  |         }).then(res => { | ||||||
|  |             this.tableData = res.data.records | ||||||
|  |             this.total = res.data.total | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       onChooseChange (val) { | ||||||
|  |         this.selectRows = val; | ||||||
|  |       }, | ||||||
|  |       saveStore () { | ||||||
|  |         this.$refs.form.validate((valid) => { | ||||||
|  |           if (valid) { | ||||||
|  |             this.$http.post('/api/specialMonitor/check',null, {params: {type: 1}}).then(res => { | ||||||
|  |               if (res.code == 0) { | ||||||
|  |                 this.$http.post(`/api/specialMonitor/add`, {categoryId: this.form.categoryId[this.form.categoryId.length - 1]}).then(res => { | ||||||
|  |                   if (res.code == 0) { | ||||||
|  |                     this.$message.success('添加成功!') | ||||||
|  |                     this.$store.dispatch('getUserInfo') | ||||||
|  |                     this.getList() | ||||||
|  |                     this.isDlgShow = false | ||||||
|  |                   } | ||||||
|  |                 }) | ||||||
|  |               } | ||||||
|  |             }) | ||||||
|  |           } | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |        | ||||||
|  |       batchRemove() { | ||||||
|  |         if (this.selectRows.length <= 0) { | ||||||
|  |           this.$message.error('请选择要删除的分类'); | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |         let ids = this.selectRows.map(item => { | ||||||
|  |           return item.id | ||||||
|  |         }) | ||||||
|  |  | ||||||
|  |         this.$confirm('确定要删除?', '温馨提示', { | ||||||
|  |           type: 'warning' | ||||||
|  |         }).then(() => { | ||||||
|  |           this.$http.post('/api/specialMonitor/delByIds', ids | ||||||
|  |           ).then(res => { | ||||||
|  |             if (res.code == 0) { | ||||||
|  |               this.$message.success('删除成功!') | ||||||
|  |               this.getList() | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       renew(id) { | ||||||
|  |         this.$confirm('确定要续费?', '温馨提示', { | ||||||
|  |           type: 'warning' | ||||||
|  |         }).then(() => { | ||||||
|  |           this.$http.post('/api/specialMonitor/renew',null, { | ||||||
|  |             params: { | ||||||
|  |               id: id | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           ).then(res => { | ||||||
|  |             if (res.code == 0) { | ||||||
|  |               this.$message.success('续费成功!') | ||||||
|  |               this.$store.dispatch('getUserInfo') | ||||||
|  |               this.getList() | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       deleteMonitor(id) { | ||||||
|  |         this.$confirm('确定要删除?', '温馨提示', { | ||||||
|  |           type: 'warning' | ||||||
|  |         }).then(() => { | ||||||
|  |           this.$http.post('/api/specialMonitor/del',null, { | ||||||
|  |             params: { | ||||||
|  |               id: id | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           ).then(res => { | ||||||
|  |             if (res.code == 0) { | ||||||
|  |               this.$message.success('删除成功!') | ||||||
|  |               this.getList() | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       toDetail (id) { | ||||||
|  |         this.$emit('change', { | ||||||
|  |           type: 'Detail', | ||||||
|  |           params: { | ||||||
|  |             id: id || '' | ||||||
|  |           } | ||||||
|  |         }) | ||||||
|  |       }, | ||||||
|  |       addStore() { | ||||||
|  |         this.form.mallId = '' | ||||||
|  |         this.isDlgShow = true | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | </style> | ||||||
| @@ -7,16 +7,31 @@ | |||||||
|         isShowBottomBorder isShowBack @onBackClick="cancel(false)"> |         isShowBottomBorder isShowBack @onBackClick="cancel(false)"> | ||||||
|       </ai-title> |       </ai-title> | ||||||
|       <template slot="content"> |       <template slot="content"> | ||||||
|         <div style="margin-right: 0px; margin-bottom: 10px;"> |         <ai-search-bar> | ||||||
|           <el-select v-model="search.orderBy" :clearable="true" @change="search.current =1, getList()" placeholder="请选择排序方式" size="small"> |           <template #left> | ||||||
|             <el-option |               <label style="width:80px">排序方式:</label> | ||||||
|               v-for="item in orderBys" |               <el-select v-model="search.orderBy" :clearable="true" @change="search.current =1, getList()" placeholder="请选择排序方式" size="small"> | ||||||
|               :key="item.value" |                 <el-option | ||||||
|               :label="item.label" |                   v-for="item in orderBys" | ||||||
|               :value="item.value"> |                   :key="item.value" | ||||||
|             </el-option> |                   :label="item.label" | ||||||
|           </el-select> |                   :value="item.value"> | ||||||
|         </div> |                 </el-option> | ||||||
|  |               </el-select> | ||||||
|  |               <label style="width:80px">价格区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceEnd" ></el-input> | ||||||
|  |               <label style="width:80px">销量区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleEnd" ></el-input> | ||||||
|  |              | ||||||
|  |           </template> | ||||||
|  |           <template #right> | ||||||
|  |             <el-button type="primary" @click="search.current =1, getList()">查询</el-button> | ||||||
|  |           </template> | ||||||
|  |         </ai-search-bar> | ||||||
|         <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 16px;"> |         <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 16px;"> | ||||||
|           <el-card v-for="item in tableData" :key="item.id" :body-style="{ padding: '0px', margin: '5px' }"> |           <el-card v-for="item in tableData" :key="item.id" :body-style="{ padding: '0px', margin: '5px' }"> | ||||||
|             <img :src="item.imgUrl" class="image"> |             <img :src="item.imgUrl" class="image"> | ||||||
| @@ -72,7 +87,11 @@ import AiProductDropDown from '@/components/AiProductDropDown.vue'; | |||||||
|           current: 1, |           current: 1, | ||||||
|           type: '1', |           type: '1', | ||||||
|           size: 120, |           size: 120, | ||||||
|           orderBy: '' |           orderBy: '', | ||||||
|  |           priceBegin: '', | ||||||
|  |           priceEnd: '', | ||||||
|  |           saleBegin: '', | ||||||
|  |           saleEnd: '' | ||||||
|         }, |         }, | ||||||
|         orderBys: [{ |         orderBys: [{ | ||||||
|           value: '0', |           value: '0', | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ | |||||||
|         type="success" |         type="success" | ||||||
|         :closable="false"> |         :closable="false"> | ||||||
|       </el-alert> |       </el-alert> | ||||||
|       <el-form class="ai-form" :model="form" label-width="120px" ref="form"> |       <el-form class="ai-form" style="margin-top: 20px" :model="form" label-width="120px" ref="form"> | ||||||
|         <el-form-item |         <el-form-item | ||||||
|           prop="content" |           prop="content" | ||||||
|           label="关键字" |           label="关键字" | ||||||
| @@ -358,7 +358,7 @@ import { Message } from 'element-ui' | |||||||
|               } |               } | ||||||
|             } |             } | ||||||
|             reqData.details.push({ |             reqData.details.push({ | ||||||
|               url: item.linkUrl, |               url: 'https://www.temu.com/goods.html?goods_id=' + item.goodsId, | ||||||
|               price: item.priceInfo.priceSchema, |               price: item.priceInfo.priceSchema, | ||||||
|               saleTotal: total, |               saleTotal: total, | ||||||
|               goodsId: item.goodsId, |               goodsId: item.goodsId, | ||||||
|   | |||||||
| @@ -7,15 +7,34 @@ | |||||||
|         isShowBottomBorder isShowBack @onBackClick="cancel(false)"> |         isShowBottomBorder isShowBack @onBackClick="cancel(false)"> | ||||||
|       </ai-title> |       </ai-title> | ||||||
|       <template slot="content"> |       <template slot="content"> | ||||||
|  |         <ai-search-bar> | ||||||
|  |           <template #left> | ||||||
|  |               <label style="width:80px">排序方式:</label> | ||||||
|  |               <el-select v-model="search.orderBy" :clearable="true" @change="search.current =1, getList()" placeholder="请选择排序方式" size="small"> | ||||||
|  |                 <el-option | ||||||
|  |                   v-for="item in orderBys" | ||||||
|  |                   :key="item.value" | ||||||
|  |                   :label="item.label" | ||||||
|  |                   :value="item.value"> | ||||||
|  |                 </el-option> | ||||||
|  |               </el-select> | ||||||
|  |               <label style="width:80px">价格区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.priceEnd" ></el-input> | ||||||
|  |               <label style="width:80px">销量区间:</label> | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleBegin" ></el-input> | ||||||
|  |               ~ | ||||||
|  |               <el-input :clearable="true" size="small" style="width: 80px" v-model="search.saleEnd" ></el-input> | ||||||
|  |              | ||||||
|  |           </template> | ||||||
|  |           <template #right> | ||||||
|  |             <el-button type="primary" @click="search.current =1, getList()">查询</el-button> | ||||||
|  |           </template> | ||||||
|  |         </ai-search-bar> | ||||||
|  |            | ||||||
|         <div style="margin-right: 0px; margin-bottom: 10px;"> |         <div style="margin-right: 0px; margin-bottom: 10px;"> | ||||||
|           <el-select v-model="search.orderBy" :clearable="true" @change="search.current =1, getList()" placeholder="请选择排序方式" size="small"> |            | ||||||
|             <el-option |  | ||||||
|               v-for="item in orderBys" |  | ||||||
|               :key="item.value" |  | ||||||
|               :label="item.label" |  | ||||||
|               :value="item.value"> |  | ||||||
|             </el-option> |  | ||||||
|           </el-select> |  | ||||||
|         </div> |         </div> | ||||||
|         <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 16px;"> |         <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 16px;"> | ||||||
|           <el-card v-for="item in tableData" :key="item.id" :body-style="{ padding: '0px', margin: '5px' }"> |           <el-card v-for="item in tableData" :key="item.id" :body-style="{ padding: '0px', margin: '5px' }"> | ||||||
| @@ -70,7 +89,11 @@ import AiProductDropDown from '@/components/AiProductDropDown.vue'; | |||||||
|           current: 1, |           current: 1, | ||||||
|           type: '1', |           type: '1', | ||||||
|           size: 120, |           size: 120, | ||||||
|           orderBy: '' |           orderBy: '', | ||||||
|  |           priceBegin: '', | ||||||
|  |           priceEnd: '', | ||||||
|  |           saleBegin: '', | ||||||
|  |           saleEnd: '' | ||||||
|         }, |         }, | ||||||
|         orderBys: [{ |         orderBys: [{ | ||||||
|           value: '0', |           value: '0', | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ | |||||||
|         type="success" |         type="success" | ||||||
|         :closable="false"> |         :closable="false"> | ||||||
|       </el-alert> |       </el-alert> | ||||||
|       <el-form class="ai-form" :model="form" label-width="120px" ref="form"> |       <el-form class="ai-form" style="margin-top: 20px" :model="form" label-width="120px" ref="form"> | ||||||
|         <el-form-item |         <el-form-item | ||||||
|           prop="mallId" |           prop="mallId" | ||||||
|           label="店铺ID" |           label="店铺ID" | ||||||
| @@ -343,7 +343,7 @@ import {sendTemuAPIMessage} from '@/api/chromeApi' | |||||||
|                   } |                   } | ||||||
|                 } |                 } | ||||||
|                 reqData.details.push({ |                 reqData.details.push({ | ||||||
|                   url: item.link_url, |                   url: 'https://www.temu.com/goods.html?goods_id=' + item.goods_id, | ||||||
|                   price: item.price_info.price_schema, |                   price: item.price_info.price_schema, | ||||||
|                   saleTotal: total, |                   saleTotal: total, | ||||||
|                   goodsId: item.goods_id, |                   goodsId: item.goods_id, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user