From 5fcc26a866b76aabb408f38ba239fa29254216c1 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Thu, 8 Oct 2026 15:22:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor(seller):=20=E5=95=86=E5=AE=B6=E7=AB=AF?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=80=A7=E4=BC=98=E5=8C=96=E4=B8=8E=20Vue3?= =?UTF-8?q?=20=E8=BF=81=E7=A7=BB=E9=81=97=E7=95=99=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 清理:删除 4 个未使用依赖、约 2700 行死代码(shop/ossManage 等)、tree-table 死组件、37 处未使用 import - ESLint 9 flat config 升级(.eslintrc.js -> eslint.config.js),修复迁移遗留的 34 处真实 bug - axios 重构:拦截器不再吞错、refreshToken 单例共享 Promise、超时收敛、form 序列化抽公共函数、vue-router 4 失效 API 修正 - 安全:4 处 v-html 增加 xss 过滤;logout 改为精确删除 localStorage 键 - API 重复定义收敛(delSpec/insertOrUpdateSpec、getDictData、ws) - 首屏瘦身:tinymce 懒加载(约省 7.4MB)、core-js 按需 polyfill、vendor chunk 合并、dplayer/@antv/g2 动态 import、3 张大图压缩 - 页面修复:发布商品表单布局(iview 遗留 margin 移除)、beforeVideoUpload 补定义、el-tag type 空值、lili-dialog emits 声明、消息中心布局塌陷修复与样式重构、department-choose 空值、affix-time 不再发多余店铺请求、goods/distributionGoods 去掉品牌筛选 --- seller/.eslintignore | 4 - seller/.eslintrc.js | 198 --- seller/babel.config.js | 5 +- seller/eslint.config.js | 65 + seller/package.json | 13 +- seller/public/index.html | 1 - seller/src/App.vue | 12 +- seller/src/api/distribution.js | 2 +- seller/src/api/goods.js | 2 - seller/src/api/index.js | 5 - seller/src/api/logistics.js | 4 +- seller/src/api/member.js | 10 +- seller/src/api/open.js | 2 +- seller/src/api/order.js | 2 - seller/src/api/pages.js | 2 +- seller/src/api/platform.js | 2 +- seller/src/api/promotion.js | 2 +- seller/src/api/shops.js | 9 +- seller/src/api/statistics.js | 2 +- seller/src/assets/images/zhizhao.jpg | Bin 382754 -> 128485 bytes seller/src/assets/lili.png | Bin 309114 -> 64431 bytes seller/src/assets/login-bg.jpg | Bin 0 -> 94817 bytes seller/src/assets/login-bg.png | Bin 1169091 -> 0 bytes seller/src/libs/axios.js | 254 ++-- seller/src/libs/util.js | 4 +- seller/src/main.js | 10 +- seller/src/store/modules/user.js | 17 +- seller/src/utils/filters.js | 23 +- seller/src/utils/index.js | 3 +- seller/src/utils/md5.js | 46 +- seller/src/utils/regular.js | 2 +- seller/src/views/ForgetPassword.vue | 40 +- .../components/SystemFormFieldPreview.vue | 2 +- .../views/distribution/distributionGoods.vue | 35 +- .../views/goods/goods-seller/addGoods.scss | 12 +- seller/src/views/goods/goods-seller/goods.vue | 45 +- .../goods/goods-seller/goodsOperationSec.vue | 29 +- seller/src/views/home/home.vue | 21 +- .../src/views/lili-components/affix-time.vue | 2 +- .../views/lili-components/editor/index.vue | 10 +- .../lili-components/editor/load-tinymce.js | 21 + .../views/lili-components/editor/plugins.js | 2 +- seller/src/views/lili-dialog/goods-dialog.vue | 33 +- seller/src/views/lili-dialog/index.vue | 1 + seller/src/views/lili-dialog/link-dialog.vue | 1 + .../views/lili-dialog/template/category.vue | 18 +- seller/src/views/login.vue | 42 +- seller/src/views/main-components/header.vue | 29 +- seller/src/views/message/message.scss | 234 +-- seller/src/views/message/message.vue | 177 +-- .../my-components/lili/department-choose.vue | 2 +- .../tree-table/Checkbox/Checkbox.less | 117 -- .../tree-table/Checkbox/Checkbox.vue | 58 - .../my-components/tree-table/Table/Table.less | 170 --- .../my-components/tree-table/Table/Table.vue | 398 ----- .../tree-table/Table/TableBody.js | 335 ----- .../tree-table/Table/TableFooter.js | 84 -- .../tree-table/Table/TableHeader.js | 108 -- .../tree-table/Table/font/iconfont.eot | Bin 2444 -> 0 bytes .../tree-table/Table/font/iconfont.less | 22 - .../tree-table/Table/font/iconfont.svg | 42 - .../tree-table/Table/font/iconfont.ttf | Bin 2276 -> 0 bytes .../tree-table/Table/font/iconfont.woff | Bin 1460 -> 0 bytes .../tree-table/Table/utils/index.js | 6 - .../tree-table/Table/utils/mixins.js | 34 - .../tree-table/Table/utils/scrollBarWidth.js | 26 - .../src/views/my-components/verify/index.vue | 20 +- .../views/order/receiptManager/receipt.vue | 4 +- seller/src/views/promotion/coupon/coupon.vue | 6 +- .../flash-discount/flash-discount.vue | 2 +- seller/src/views/promotion/live/liveGoods.vue | 2 +- .../views/shop/hotzone/components/Zone.vue | 2 +- seller/src/views/shop/modelForm.vue | 2 +- seller/src/views/shop/modelList/forYour.vue | 2 +- .../src/views/shop/modelList/goodsAndType.vue | 2 +- seller/src/views/shop/modelList/mixModel.vue | 2 +- .../views/shop/modelList/mixs/mix-brand.vue | 2 +- .../views/shop/modelList/mixs/mix-goods.vue | 2 +- .../shop/modelList/oneRowThreeColumns.vue | 2 +- .../views/shop/modelList/onlyGoodsModel.vue | 2 +- seller/src/views/shop/modelList/recommend.vue | 2 +- .../shop/modelList/seckill-only-album.vue | 1 - seller/src/views/shop/ossManage.scss | 250 --- seller/src/views/shop/ossManage.vue | 1331 ---------------- seller/src/views/shop/ossManages.vue | 1338 ----------------- .../views/shop/system/clerk/clerkManage.vue | 2 - .../shop/system/role/storeRoleManage.vue | 2 +- seller/src/views/shop/wap/decorate.vue | 2 +- .../src/views/statistics/goods-comparison.vue | 16 +- seller/src/views/statistics/order.vue | 2 +- seller/src/views/statistics/traffic.vue | 4 +- seller/src/views/sys/oss-manage/ossManage.vue | 8 +- seller/vue.config.js | 25 +- 93 files changed, 651 insertions(+), 5241 deletions(-) delete mode 100644 seller/.eslintignore delete mode 100644 seller/.eslintrc.js create mode 100644 seller/eslint.config.js create mode 100644 seller/src/assets/login-bg.jpg delete mode 100644 seller/src/assets/login-bg.png create mode 100644 seller/src/views/lili-components/editor/load-tinymce.js delete mode 100644 seller/src/views/my-components/tree-table/Checkbox/Checkbox.less delete mode 100644 seller/src/views/my-components/tree-table/Checkbox/Checkbox.vue delete mode 100644 seller/src/views/my-components/tree-table/Table/Table.less delete mode 100644 seller/src/views/my-components/tree-table/Table/Table.vue delete mode 100644 seller/src/views/my-components/tree-table/Table/TableBody.js delete mode 100644 seller/src/views/my-components/tree-table/Table/TableFooter.js delete mode 100644 seller/src/views/my-components/tree-table/Table/TableHeader.js delete mode 100644 seller/src/views/my-components/tree-table/Table/font/iconfont.eot delete mode 100644 seller/src/views/my-components/tree-table/Table/font/iconfont.less delete mode 100644 seller/src/views/my-components/tree-table/Table/font/iconfont.svg delete mode 100644 seller/src/views/my-components/tree-table/Table/font/iconfont.ttf delete mode 100644 seller/src/views/my-components/tree-table/Table/font/iconfont.woff delete mode 100644 seller/src/views/my-components/tree-table/Table/utils/index.js delete mode 100644 seller/src/views/my-components/tree-table/Table/utils/mixins.js delete mode 100644 seller/src/views/my-components/tree-table/Table/utils/scrollBarWidth.js delete mode 100644 seller/src/views/shop/ossManage.scss delete mode 100644 seller/src/views/shop/ossManage.vue delete mode 100644 seller/src/views/shop/ossManages.vue diff --git a/seller/.eslintignore b/seller/.eslintignore deleted file mode 100644 index e6529fc09..000000000 --- a/seller/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -build/*.js -src/assets -public -dist diff --git a/seller/.eslintrc.js b/seller/.eslintrc.js deleted file mode 100644 index c97750547..000000000 --- a/seller/.eslintrc.js +++ /dev/null @@ -1,198 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - parser: 'babel-eslint', - sourceType: 'module' - }, - env: { - browser: true, - node: true, - es6: true, - }, - extends: ['plugin:vue/recommended', 'eslint:recommended'], - - // add your custom rules here - //it is base on https://github.com/vuejs/eslint-config-vue - rules: { - "vue/max-attributes-per-line": [2, { - "singleline": 10, - "multiline": { - "max": 1, - "allowFirstLine": false - } - }], - "vue/singleline-html-element-content-newline": "off", - "vue/multiline-html-element-content-newline":"off", - "vue/name-property-casing": ["error", "PascalCase"], - "vue/no-v-html": "off", - 'accessor-pairs': 2, - 'arrow-spacing': [2, { - 'before': true, - 'after': true - }], - 'block-spacing': [2, 'always'], - 'brace-style': [2, '1tbs', { - 'allowSingleLine': true - }], - 'camelcase': [0, { - 'properties': 'always' - }], - 'comma-dangle': [2, 'never'], - 'comma-spacing': [2, { - 'before': false, - 'after': true - }], - 'comma-style': [2, 'last'], - 'constructor-super': 2, - 'curly': [2, 'multi-line'], - 'dot-location': [2, 'property'], - 'eol-last': 2, - 'eqeqeq': ["error", "always", {"null": "ignore"}], - 'generator-star-spacing': [2, { - 'before': true, - 'after': true - }], - 'handle-callback-err': [2, '^(err|error)$'], - 'indent': [2, 2, { - 'SwitchCase': 1 - }], - 'jsx-quotes': [2, 'prefer-single'], - 'key-spacing': [2, { - 'beforeColon': false, - 'afterColon': true - }], - 'keyword-spacing': [2, { - 'before': true, - 'after': true - }], - 'new-cap': [2, { - 'newIsCap': true, - 'capIsNew': false - }], - 'new-parens': 2, - 'no-array-constructor': 2, - 'no-caller': 2, - 'no-console': 'off', - 'no-class-assign': 2, - 'no-cond-assign': 2, - 'no-const-assign': 2, - 'no-control-regex': 0, - 'no-delete-var': 2, - 'no-dupe-args': 2, - 'no-dupe-class-members': 2, - 'no-dupe-keys': 2, - 'no-duplicate-case': 2, - 'no-empty-character-class': 2, - 'no-empty-pattern': 2, - 'no-eval': 2, - 'no-ex-assign': 2, - 'no-extend-native': 2, - 'no-extra-bind': 2, - 'no-extra-boolean-cast': 2, - 'no-extra-parens': [2, 'functions'], - 'no-fallthrough': 2, - 'no-floating-decimal': 2, - 'no-func-assign': 2, - 'no-implied-eval': 2, - 'no-inner-declarations': [2, 'functions'], - 'no-invalid-regexp': 2, - 'no-irregular-whitespace': 2, - 'no-iterator': 2, - 'no-label-var': 2, - 'no-labels': [2, { - 'allowLoop': false, - 'allowSwitch': false - }], - 'no-lone-blocks': 2, - 'no-mixed-spaces-and-tabs': 2, - 'no-multi-spaces': 2, - 'no-multi-str': 2, - 'no-multiple-empty-lines': [2, { - 'max': 1 - }], - 'no-native-reassign': 2, - 'no-negated-in-lhs': 2, - 'no-new-object': 2, - 'no-new-require': 2, - 'no-new-symbol': 2, - 'no-new-wrappers': 2, - 'no-obj-calls': 2, - 'no-octal': 2, - 'no-octal-escape': 2, - 'no-path-concat': 2, - 'no-proto': 2, - 'no-redeclare': 2, - 'no-regex-spaces': 2, - 'no-return-assign': [2, 'except-parens'], - 'no-self-assign': 2, - 'no-self-compare': 2, - 'no-sequences': 2, - 'no-shadow-restricted-names': 2, - 'no-spaced-func': 2, - 'no-sparse-arrays': 2, - 'no-this-before-super': 2, - 'no-throw-literal': 2, - 'no-trailing-spaces': 2, - 'no-undef': 2, - 'no-undef-init': 2, - 'no-unexpected-multiline': 2, - 'no-unmodified-loop-condition': 2, - 'no-unneeded-ternary': [2, { - 'defaultAssignment': false - }], - 'no-unreachable': 2, - 'no-unsafe-finally': 2, - 'no-unused-vars': [2, { - 'vars': 'all', - 'args': 'none' - }], - 'no-useless-call': 2, - 'no-useless-computed-key': 2, - 'no-useless-constructor': 2, - 'no-useless-escape': 0, - 'no-whitespace-before-property': 2, - 'no-with': 2, - 'one-var': [2, { - 'initialized': 'never' - }], - 'operator-linebreak': [2, 'after', { - 'overrides': { - '?': 'before', - ':': 'before' - } - }], - 'padded-blocks': [2, 'never'], - 'quotes': [2, 'single', { - 'avoidEscape': true, - 'allowTemplateLiterals': true - }], - 'semi': [2, 'never'], - 'semi-spacing': [2, { - 'before': false, - 'after': true - }], - 'space-before-blocks': [2, 'always'], - 'space-before-function-paren': [2, 'never'], - 'space-in-parens': [2, 'never'], - 'space-infix-ops': 2, - 'space-unary-ops': [2, { - 'words': true, - 'nonwords': false - }], - 'spaced-comment': [2, 'always', { - 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] - }], - 'template-curly-spacing': [2, 'never'], - 'use-isnan': 2, - 'valid-typeof': 2, - 'wrap-iife': [2, 'any'], - 'yield-star-spacing': [2, 'both'], - 'yoda': [2, 'never'], - 'prefer-const': 2, - 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, - 'object-curly-spacing': [2, 'always', { - objectsInObjects: false - }], - 'array-bracket-spacing': [2, 'never'] - } -} diff --git a/seller/babel.config.js b/seller/babel.config.js index 162a3ea97..fd91ea203 100644 --- a/seller/babel.config.js +++ b/seller/babel.config.js @@ -1,3 +1,6 @@ module.exports = { - presets: ["@vue/cli-plugin-babel/preset"], + presets: [ + // 按实际用到的语法特性按需注入 polyfill,替代 main.js 的全量 core-js/stable + ["@vue/cli-plugin-babel/preset", { useBuiltIns: "usage", corejs: 3 }], + ], }; diff --git a/seller/eslint.config.js b/seller/eslint.config.js new file mode 100644 index 000000000..dfdc32276 --- /dev/null +++ b/seller/eslint.config.js @@ -0,0 +1,65 @@ +const globals = require('globals') +const js = require('@eslint/js') +const pluginVue = require('eslint-plugin-vue') + +module.exports = [ + { + ignores: [ + 'dist/**', + 'node_modules/**', + 'public/**', + // tree-table 是 JSX 写的旧组件,全项目无引用,待删除,暂不纳入检查 + 'src/views/my-components/tree-table/**', + ], + }, + js.configs.recommended, + ...pluginVue.configs['flat/essential'], + { + files: ['src/**/*.{js,vue}'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.browser, + // webpack 构建环境注入 + require: 'readonly', + module: 'writable', + process: 'readonly', + // public/config.js 通过 <% } %> -