From fb74b5bb1de3ae116a07a46551fc70034291d08e Mon Sep 17 00:00:00 2001 From: xiaozhiyong Date: Thu, 14 Mar 2024 08:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- src/components/Upload/index.vue | 9 +- src/main.js | 20 +-- src/utils/index.js | 42 ++++- src/views/product/productAdd/newIndex.vue | 180 +++++++++++++--------- src/views/product/productList/index.vue | 13 +- vue.config.js | 6 +- 7 files changed, 173 insertions(+), 99 deletions(-) diff --git a/.env.development b/.env.development index 90fb4be..778cbb5 100644 --- a/.env.development +++ b/.env.development @@ -13,7 +13,7 @@ VUE_APP_DOMAIN = uat.xingoil.com/ws # uat.xingoil.com/ws # 开发环境,不会进行加密,会打印出数据1 -VUE_APP_ENV = 'development' +VUE_APP_ENV = 'production' #production VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue index bf928d4..8ec63d5 100644 --- a/src/components/Upload/index.vue +++ b/src/components/Upload/index.vue @@ -89,12 +89,13 @@ export default { } }, beforeAvatarUpload(file) { - const isLt2M = file.size / 1024 < 500 + console.log(file) + const isLt2M = file.size / 1024 > 5 * 1024 - if (!isLt2M) { - this.$message.error('图片大小不能超过500KB! 请重新上传!') + if (isLt2M) { + this.$message.error('图片大小不能超过5M! 请重新上传!') } - return isLt2M + return !isLt2M } } } diff --git a/src/main.js b/src/main.js index c8cdf58..e15ca93 100644 --- a/src/main.js +++ b/src/main.js @@ -1,12 +1,11 @@ - -import 'babel-polyfill' +import 'babel-polyfill' import Vue from 'vue' import router from './router' import Cookies from 'js-cookie' -import Element from 'element-ui' -import { UTable, UTableColumn } from 'umy-ui' +import Element from 'element-ui' +import { UTable, UTableColumn } from 'umy-ui' Vue.use(UTable) -Vue.use(UTableColumn) +Vue.use(UTableColumn) import App from './App' import store from './store' import * as filters from './filters' // 全局过滤器 @@ -24,23 +23,23 @@ import 'normalize.css/normalize.css' import 'vue2-animate/dist/vue2-animate.min.css' import './styles/element-variables.scss' -import 'element-ui/lib/theme-chalk/display.css' +import 'element-ui/lib/theme-chalk/display.css' import 'wowjs/css/libs/animate.css' -import '@/styles/index.scss' +import '@/styles/index.scss' import './icons' // icon import './permission' // permission control import { getToken, setToken, removeToken } from '@/utils/auth.js' -import pagesHeader from '@/components/pagesHeader'; +import pagesHeader from '@/components/pagesHeader' import SlideVerify from 'vue-monoplasty-slide-verify' -import '@/theme/index.scss'; +import '@/theme/index.scss' Vue.use(SlideVerify) Vue.use(permission) Vue.use(dragDialog) Vue.use(dragDrawer) Vue.use(GlobalComponents) -Vue.component('pagesHeader', pagesHeader); +Vue.component('pagesHeader', pagesHeader) if (process.env.NODE_ENV === 'production') { // 切换环境时执行代码 @@ -57,6 +56,7 @@ Object.keys(filters).forEach(key => { Vue.config.productionTip = false Vue.prototype.$utils = utils +Vue.prototype.$bus = new Vue() new Vue({ el: '#app', diff --git a/src/utils/index.js b/src/utils/index.js index 0c5d56f..ae079d0 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -212,7 +212,15 @@ export function param2Obj(url) { if (!search) { return {} } - return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"').replace(/\+/g, ' ') + '"}') + return JSON.parse( + '{"' + + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + + '"}' + ) } /** @@ -288,7 +296,7 @@ export function getTime(type) { export function debounce(func, wait, immediate) { let timeout, args, context, timestamp, result - const later = function () { + const later = function() { // 据上一次触发时间间隔 const last = +new Date() - timestamp @@ -305,7 +313,7 @@ export function debounce(func, wait, immediate) { } } - return function (...args) { + return function(...args) { context = this timestamp = +new Date() const callNow = immediate && !timeout @@ -420,9 +428,9 @@ export function fileAdd(file, resolve, reject) { const reader = new FileReader() const image = new Image() reader.readAsDataURL(file) - reader.onload = function () { + reader.onload = function() { file.src = this.result - image.onload = function () { + image.onload = function() { const width = image.width const height = image.height file.width = width @@ -444,7 +452,7 @@ export function startImgCompress(path, obj, resolve, reject) { // path是指上传的图片,obj是压缩的品质,越低越模糊 var img = new Image() img.src = path.src - img.onload = function () { + img.onload = function() { var that = this // 这里的this 是把img的对象指向改变为that // 默认按比例压缩 var w = that.width @@ -501,7 +509,7 @@ export function formatXML(xml, tab) { var formatted = '' var indent = '' tab = tab || ' ' - xml.split(/>\s*\s*\r\n' if (node.match(/^]*[^\/]$/)) indent += tab @@ -660,7 +668,7 @@ export const exportDefault = 'export default ' // 类型判断 export function typeJudgment(object) { try { - let res = {}.__proto__.toString.call(object); + let res = {}.__proto__.toString.call(object) // let type = /(?<= ).+(?=\])/.exec(res); let type = res.replace(/[\[\]]/g, '').split(' ') return type.length ? type[1] : '' @@ -668,3 +676,21 @@ export function typeJudgment(object) { return '' } } +// url取参 +export function urlParamsHandle(url) { + const search = url.split('?')[1] + if (!search) { + return {} + } + const result = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + result[name] = val + } + }) + return result +} diff --git a/src/views/product/productAdd/newIndex.vue b/src/views/product/productAdd/newIndex.vue index d447d37..23fe2fc 100644 --- a/src/views/product/productAdd/newIndex.vue +++ b/src/views/product/productAdd/newIndex.vue @@ -21,7 +21,7 @@ - + - + @@ -45,7 +45,7 @@ - + @@ -57,12 +57,12 @@ - + - + @@ -76,7 +76,7 @@ --> - + --> - +
@@ -201,7 +197,15 @@ 展示 --> - + + @@ -407,7 +417,30 @@ export default { name: 'ProductProductAdd', components: { Templates, CreatTemplates, Tinymce, CustomUpload, OilStationSelection }, data() { + const validateSiteIds = (rule, value, callback) => { + let siteIds = this.OilStationSelectionList.map(item => item.siteId) + if (siteIds.length == 0) { + callback('请选择油站') + } + callback() + } + const validateAttr = (rule, value, callback) => { + // SKU编号,即"skuNum",不需要手填,提交后会自动生成,因此此处略过校验 + let length = this.attrValue.length - 1 + let isCan = this.ManyAttrValue.every(item => { + // 此处返回已填的值 通过长度来判断是否都填了 + let _length = this.attrValue.filter(_item => { + let key = _item.value + if (key != 'skuNum' && item[key]) return _item + }).length + return length != _length + }) + if (isCan) callback('商品属性不可存在空') + callback() + } return { + validateSiteIds, + validateAttr, loading: false, OilStationSelectionList: [], isOilStationSelection: false, @@ -529,7 +562,6 @@ export default { { label: 'SKU编号', name: 'SKU编号', - value: 'skuNum' }, { @@ -552,14 +584,14 @@ export default { if (from.path == '/productList' && to.params.id) { this.chenkId() } - console.log(from.path) //从哪来 - console.log(to.path, to.params) //到哪去 + // console.log(from.path) //从哪来 + // console.log(to.path, to.params) //到哪去 }, - 'formValidate.content': function(n) { }, - ManyAttrValue(n) {}, + // 'formValidate.content': function(n) {}, + // ManyAttrValue(n) {}, 'formValidate.attr': { - handler: function(val,o) { - if (this.isAttr) this.watCh(val,o) //重要!!! + handler: function(val, o) { + if (this.isAttr) this.watCh(val, o) //重要!!! }, immediate: false, deep: true @@ -573,8 +605,8 @@ export default { }, mounted() {}, deactivated() { - this.$destroy(); - }, + this.$destroy() + }, methods: { async chenkId() { if (this.$route.query && this.$route.query.id) { @@ -587,14 +619,14 @@ export default { return productApi.productAddGetSites(id) }) ).then(res => { - console.log(res, 'productAddGetSites') + // console.log(res, 'productAddGetSites') }) }, async inverseAnalysis(data) { - let { categoryOneId, categoryTwoId } = data; - let categorys = [categoryOneId, categoryTwoId]; - this.OilStationSelectionList = data.siteInfos; - this.formValidate = { + let { categoryOneId, categoryTwoId } = data + let categorys = [categoryOneId, categoryTwoId] + this.OilStationSelectionList = data.siteInfos + this.formValidate = { ...this.formValidate, categorys, ...data @@ -607,7 +639,8 @@ export default { this.$refs.CustomLBUpload.fileList = [...this.formValidate.images.filter(item => item.mainMark != '1')] await this.confirm() this.$nextTick(() => { - this.formValidate.attr = this.formValidate.attr.map(item => { + this.formValidate.attr = this.formValidate.attr + .map(item => { let align = this.formValidate.checkedList.find(i => item.id == i.attributeId) if (align) { return { @@ -620,34 +653,35 @@ export default { } else { return null } - }).filter(item => item); + }) + .filter(item => item) setTimeout(() => { this.ManyAttrValue.forEach((item, index) => { - let data = this.formValidate.stockList.find(i => i.attributeJson == JSON.stringify(item.data)); + let data = this.formValidate.stockList.find(i => i.attributeJson == JSON.stringify(item.data)) if (data) { - Object.assign(item, data,{delect:false}) - }else{ - Object.assign(item, data,{delect:true}) + Object.assign(item, data, { delect: false }) + } else { + Object.assign(item, data, { delect: true }) } }) - this.ManyAttrValue = this.ManyAttrValue.filter(item=>!item.delect) + this.ManyAttrValue = this.ManyAttrValue.filter(item => !item.delect) }, 1000) }) }, async getproductInfo(id) { - await productApi.productAddGetEdit(id).then( async res => { + await productApi.productAddGetEdit(id).then(async res => { if (res.code == 20000) { - await this.inverseAnalysis(res.data) + await this.inverseAnalysis(res.data) } }) }, setPreferred(setPreferred) { - console.log(setPreferred, 'setPreferred') + // console.log(setPreferred, 'setPreferred') }, delectOilStationSelectionList(e, index) { this.OilStationSelectionList.splice(index, 1) - if (this.$refs.selectSites&&this.$refs.selectSites.checkedSites){ - this.$refs.selectSites.checkedSites = this.$refs.selectSites.checkedSites.filter(site => e.siteId !== site.siteId); + if (this.$refs.selectSites && this.$refs.selectSites.checkedSites) { + this.$refs.selectSites.checkedSites = this.$refs.selectSites.checkedSites.filter(site => e.siteId !== site.siteId) } }, oilStationSelectionSubmit(e) { @@ -655,7 +689,7 @@ export default { this.isOilStationSelection = false this.formValidate.siteIds = e.map(item => item.siteId) }, - async brandGetAll() { + async brandGetAll() { await productApi.brandGetAll().then(res => { if (res.code == 20000) { this.brandOptions = res.data @@ -663,7 +697,7 @@ export default { }) }, cascaderChange(e) { - console.log(e, 'cascaderChange') + // console.log(e, 'cascaderChange') }, // 校验输入框不能输入0,保留2位小数,库存为正整数 keyupEvent(key, val, index, num) { @@ -730,22 +764,24 @@ export default { this.checkboxGroup.includes('isHot') ? (this.formValidate.isHot = true) : (this.formValidate.isHot = false) }, // sku算法 - watCh(val,o) { + watCh(val, o) { let arr = [] this.manyTabDate = [] for (let i = 0; i < val.length; i++) { arr.push(val[i].sku) this.manyTabDate.push(val[i].sku.name) } + console.log('this.manyTabDate', this.manyTabDate) + // console.log('arr', arr) this.ManyAttrValue = arr.reduce( - (a, b, c) => { + (prev, cur) => { let res = [] - a.map(x => { - b.value.map(y => { + prev.map(item => { + cur.value.map(_item => { res.push({ - ...x, - [b.name]: y, - data: Object.assign({}, x.data || {}, { [b.name]: y }), + ...item, + [cur.name]: _item, + data: Object.assign({}, item.data || {}, { [cur.name]: _item }), ...Object.fromEntries( this.attrValue.map(item => { return [item.value, ''] @@ -757,8 +793,8 @@ export default { return res }, [{}] - ); - console.log(this.ManyAttrValue ,"this.ManyAttrValue ") + ) + console.log(this.ManyAttrValue, 'this.ManyAttrValue ') }, attrFormat(arr) { let data = [] @@ -860,10 +896,12 @@ export default { } await this.productGetRule() this.formValidate.attr = JSON.parse(JSON.stringify(this.ruleList.find(item => item.id == this.formValidate.attributesTypeId).attributesList)) + // console.log('this.formValidate.attr ', this.formValidate.attr) } + // console.log('this.attrValue', this.attrValue) }, // 商品分类; - async getCategorySelect() { + async getCategorySelect() { await productApi.getClassificationTree().then(res => { if (res.code == 20000) { this.merCateList = res.data @@ -940,7 +978,7 @@ export default { batchAdd() { // if (!this.oneFormBatch[0].pic || !this.oneFormBatch[0].price || !this.oneFormBatch[0].cost || !this.oneFormBatch[0].ot_price || // !this.oneFormBatch[0].stock || !this.oneFormBatch[0].bar_code) return this.$Message.warning('请填写完整的批量设置内容!'); - console.log(this.ManyAttrValue, this.oneFormBatch, ' this.ManyAttrValue') + // console.log(this.ManyAttrValue, this.oneFormBatch, ' this.ManyAttrValue') this.ManyAttrValue.forEach(item => { Object.assign(item, this.oneFormBatch[0]) }) @@ -972,7 +1010,6 @@ export default { } else { item.splice(index, 1) } - }, // 添加规则名称 createAttrName() { @@ -1184,8 +1221,8 @@ export default { if (this.currentTab-- < 0) this.currentTab = 0 }, handleSubmitNest(name) { - console.log(this.formValidate,"handleSubmitNest") - if (this.formValidate.attr<1){ + // console.log(this.formValidate, 'handleSubmitNest') + if (this.formValidate.attr < 1) { this.$message.error('规格属性不能为空') return } @@ -1193,17 +1230,17 @@ export default { if (valid) { if (this.currentTab++ > 2) this.currentTab = 0 } else { - if ( - !this.formValidate.store_name || - !this.formValidate.cate_id || - !this.formValidate.keyword || - !this.formValidate.unit_name || - !this.formValidate.store_info || - !this.formValidate.image || - !this.formValidate.slider_image - ) { - this.$message.warning('请填写完整商品信息!') - } + // if ( + // !this.formValidate.store_name || + // !this.formValidate.cate_id || + // !this.formValidate.keyword || + // !this.formValidate.unit_name || + // !this.formValidate.store_info || + // !this.formValidate.image || + // !this.formValidate.slider_image + // ) { + // this.$message.warning('请填写完整商品信息!') + // } } }) }, @@ -1215,10 +1252,10 @@ export default { let [categoryOneId, categoryTwoId] = this.formValidate.categorys let isRecommendOrNewMark = this.formValidate.recommendOrNewMark == '1' ? 'newMark' : 'recommend' let siteIds = this.OilStationSelectionList.map(item => item.siteId) - if(siteIds.length==0){ - this.$message.error('请选择油站') - return - } + // if (siteIds.length == 0) { + // this.$message.error('请选择油站') + // return + // } let checkedList = this.formValidate.attr.map(item => { let attributeId = item.id let checked = item.sku.value.join(',') @@ -1261,7 +1298,8 @@ export default { if (res.code == 20000) { this.$message.success('操作成功') setTimeout(() => { - this.$router.push({ path: 'productList', query: { refresh: true }}) + this.$bus.$emit('productRefresh') + this.$router.push({ path: 'productList', query: { refresh: true } }) // this.$destroy() }, 1000) } diff --git a/src/views/product/productList/index.vue b/src/views/product/productList/index.vue index eb4374e..f8c8479 100644 --- a/src/views/product/productList/index.vue +++ b/src/views/product/productList/index.vue @@ -459,8 +459,17 @@ export default { }, created() { this.init() + this.$bus.$on('productRefresh', () => { + console.log('productRefresh') + this.init() + }) + }, + activated() { + // let { refresh } = this.$utils.urlParamsHandle(location.href) + // if (refresh) { + // this.init() + // } }, - activated() {}, methods: { auditing(row, auditStatus) { this.$prompt('审核', '提示', { @@ -711,7 +720,7 @@ export default { }, // 编辑 edit(row) { - console.log(row) + // console.log(row) this.$router.push({ path: '/product/productAdd', query: { diff --git a/vue.config.js b/vue.config.js index d6d7129..708965e 100644 --- a/vue.config.js +++ b/vue.config.js @@ -25,12 +25,12 @@ module.exports = { proxy: { [process.env.VUE_APP_BASE_API]: { // target: `cls`, - target: `http://192.168.0.254:38080`, - // target: `http://192.168.0.24:38080`, + // target: `http://192.168.0.254:38080`, + // target: `http://192.168.110.230:38080`, // target: `http://192.168.1.83:38080`, // target: 'http://222.132.26.119:8081', // target: `https://www.xingoil.com/adminapi`, - // target: 'http://uat.xingoil.com/adminapi', + target: 'http://uat.xingoil.com/adminapi', changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: ''