sqlite-web 0.7.2
gitea.db
issue
Create
Query
access
access_token
action
action_artifact
action_run
action_run_index
action_run_job
action_runner
action_runner_token
action_schedule
action_schedule_spec
action_task
action_task_output
action_task_step
action_tasks_version
action_variable
app_state
attachment
auth_token
badge
branch
collaboration
comment
commit_status
commit_status_index
commit_status_summary
commit_sync_log
commit_sync_status
dbfs_data
dbfs_meta
deploy_key
email_address
email_hash
external_login_user
follow
gpg_key
gpg_key_import
hook_task
issue
issue_assignees
issue_content_history
issue_dependency
issue_index
issue_label
issue_pin
issue_user
issue_watch
label
language_stat
lfs_lock
lfs_meta_object
login_source
milestone
mirror
notice
notification
oauth2_application
oauth2_authorization_code
oauth2_grant
org_user
package
package_blob
package_blob_upload
package_cleanup_rule
package_file
package_property
package_version
project
project_board
project_issue
protected_branch
protected_tag
public_key
pull_auto_merge
pull_request
push_mirror
reaction
release
renamed_branch
repo_archiver
repo_hidden_file
repo_indexer_status
repo_license
repo_redirect
repo_topic
repo_transfer
repo_unit
repository
review
review_state
secret
session
sqlite_sequence
star
stopwatch
system_setting
task
team
team_invite
team_repo
team_unit
team_user
topic
tracked_time
two_factor
upload
user
user_badge
user_blocking
user_open_id
user_redirect
user_setting
version
watch
webauthn_credential
webhook
Toggle helper tables
Structure
Content
Query
Insert
Drop
Import
Export
Update row 473 in issue
id
Primary key.
INTEGER NOT NULL
repo_id
INTEGER
index
INTEGER
poster_id
INTEGER
original_author
TEXT
original_author_id
INTEGER
name
🔍 代码审查报告:pc-260616 - 库存盘点新增支持选择时分、包厢停用报表
TEXT
content
## 自动代码审查报告 **分支**: pc-260616 **提交**: `11113b0d648e0cdb3764a54764a6d002d3cbeb53` **提交人**: caihongyuchy (1091045324@qq.com) **时间**: 2026-06-02 17:47:41 --- ### 1. 总体评价 > **综合评分:4/10** > **优点**:业务模块划分清晰,路由结构完整,具备基础的权限拦截与组件化意识;部分功能(如导出、多选联动)已实现闭环。 > **缺点**:代码呈现典型的 **“jQuery 时代遗留 + Vue 外壳”** 混合架构。严重违反现代 Vue 开发规范:大量绕过 Vue 响应式系统直接操作 DOM;路由组件全部静态引入导致首屏体积巨大;存在多处拼写错误、命名不规范及逻辑陷阱(如 `$.map` 中断失效、全选逻辑注释反转)。整体可维护性、性能与类型安全均不达标,亟需现代化重构。 --- ### 2. 问题详情清单 | 严重等级 | 位置/行号 | 问题分类 | 问题描述 | 建议修改方案 | | :---: | :---: | :---: | :---: | :---: | | 🔴 严重 | `pages.js` 全文件 | 规范/性能 | 所有路由组件使用静态 `import`,未启用路由懒加载,导致首屏 JS 包体积膨胀,严重拖慢加载与解析速度。 | 移除 `pages.js`,在 `index.js` 中改为动态导入:`component: () => import('@/views/xxx.vue')`。 | | 🔴 严重 | `stock_checks.vue` 全文件 | 规范/可维护性 | 严重混用 jQuery (`$`, `$.ajax`, `$(this.$refs.xxx)`) 与 Vue,直接操作 DOM 破坏虚拟 DOM 机制;存在多处拼写错误 (`getMunu`, `innitDate`, `getDeteil`)。 | 彻底移除 jQuery 依赖,改用 `axios`/`fetch`;使用 `v-model`、`computed`、`watch` 管理状态与 UI;修正方法命名。 | | 🔴 严重 | `stock_checks.vue` L230-L245 | 逻辑 | `saveGoods` 与 `getChecksGoods` 中使用 `$.map` 遍历,内部 `return` 仅跳出当前回调,无法中断外层逻辑;重复校验逻辑混乱。 | 改用 `Array.prototype.find()` 或 `Set` 进行去重,使用 `for...of` 配合 `break` 控制流程。 | | 🟡 警告 | `router/index.js` L5-L8 | 规范/逻辑 | 重写 `VueRouter.prototype.push` 时直接吞掉异常 `.catch(err => err)`,掩盖真实路由错误,不利于生产环境排查。 | 改为过滤导航重复错误并记录日志:`.catch(err => { if (err.name !== 'NavigationDuplicated') console.error(err) })`。 | | 🟡 警告 | `router/index.js` L158-L160 | 逻辑/安全 | `!store.state.usermobile` 判断不严谨(空字符串、`0` 均会触发跳转);未配置路由白名单,易导致死循环或误拦截。 | 使用明确布尔值 `!!store.state.usermobile`,并维护 `whiteList` 数组进行路径匹配。 | | 🟡 警告 | `stock_checks.vue` L460-L470 | 逻辑 | `typeCheckAll` 方法逻辑与注释完全相反:`if(!_this.type_all)` 执行全选,注释却写“实现反选”,极易引发维护误解。 | 修正注释与逻辑,或直接使用 `v-model` 绑定全选状态,通过 `watch` 同步子项数组。 | | 🟢 建议 | `stock_checks.vue` L1 | 规范 | 组件 `name` 属性定义为 `'procurement_return'`,与当前文件名及业务功能不符。 | 修改为符合 PascalCase 规范的 `name: 'StockChecks'`。 | | 🟢 建议 | `stock_checks.vue` 多处 | 性能 | 频繁调用 `$(...).bootstrapTable('destroy')` 和 `$(...).select2()`,未清理旧实例,易造成内存泄漏与事件重复绑定。 | 在 `beforeDestroy`/`unmounted` 中统一销毁第三方插件实例,或迁移至 Vue 生态组件(如 `vue-tables-2`)。 | --- ### 3. 优化代码示例 #### 示例 1:路由懒加载与守卫规范化 (`router/index.js`) ```javascript import Vue from 'vue' import VueRouter from 'vue-router' import store from '../store/index' Vue.use(VueRouter) // ✅ 优化:仅忽略重复导航错误,保留其他异常追踪 const originalPush = VueRouter.prototype.push VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => { if (err.name !== 'NavigationDuplicated') { console.warn('[Router] 导航异常:', err) } return err }) } // ✅ 优化:动态导入替代 pages.js 静态引入,按需加载 const routes = [ { path: '/', name: 'index', component: () => import('../views/index.vue') }, { path: '/login', name: 'login', component: () => import('../views/login.vue') }, // 其他路由同理... ] const router = new VueRouter({ routes }) // ✅ 优化:明确白名单与登录态判断,避免死循环 const whiteList = ['/login'] router.beforeEach((to, from, next) => { const isLoggedIn = !!store.state.usermobile // 强制转为布尔值 if (whiteList.includes(to.path) || isLoggedIn) { next() } else { next({ name: 'login', query: { redirect: to.fullPath } }) } }) export default router ``` #### 示例 2:Vue 响应式重构核心逻辑 (`stock_checks.vue` Script) ```javascript <script> import axios from 'axios' // 替代 $.ajax import XLSX from 'xlsx' export default { name: 'StockChecks', // ✅ 修正组件名 data() { return { checksGoodsList: [], // ✅ 响应式数组替代手动 DOM 操作 typeItem: [], shopOptions: [], // ... 其他状态 } }, methods: { // ✅ 优化:使用 async/await 替代回调地狱,统一错误处理 async fetchShopList() { try { const { data } = await axios.post(`${this.$ctUrl}/PublicData/api_getShopListByPurview`, { header: this.$requestHeader, request: { version: this.$version, param: {} } }) if (data.response.result_code === 'true') { this.shopOptions = data.response.result.map(v => ({ id: v.id, text: v.name })) } } catch (error) { this.$layer.msg('网络请求失败') } }, // ✅ 优化:使用 Set 高效去重,移除 $.map 陷阱 addGoodsToChecks(newGoods) { const existingIds = new Set(this.checksGoodsList.map(g => g.merchant_goods_id)) const validGoods = newGoods.filter(g => { if (existingIds.has(g.merchant_goods_id)) { this.$layer.msg(`商品 ${g.goods_name} 已存在`) return false } return true }) validGoods.forEach(g => { this.checksGoodsList.push({ ...g, actual_stock: g.system_stock, profit_loss: 0, remark: '' }) }) this.checksTotal() } } } </script> ``` --- ### 4. 总结与行动建议 #### 🚀 最优先改进建议(Top 3) 1. **剥离 jQuery,全面拥抱 Vue 响应式**:当前代码约 60% 的逻辑依赖 `$(this.$refs.xxx)` 和 `$.ajax`。建议逐步替换为 `axios` 请求封装、`v-model` 表单绑定、`computed` 派生状态,彻底消除直接 DOM 操作。 2. **实施路由懒加载与模块化拆分**:删除 `pages.js`,将 `routes` 数组按业务模块(如 `sale.js`, `stock.js`, `report.js`)拆分,并使用 `() => import()` 动态加载,预计可减少首屏体积 70% 以上。 3. **统一第三方插件生命周期管理**:`bootstrapTable`、`select2`、`daterangepicker` 等插件需在 `mounted` 初始化,并在 `beforeDestroy`/`unmounted` 中调用 `.destroy()` 清理,防止内存泄漏与事件重复绑定。 #### 🛠 推荐 Lint 规则与配置 建议在项目根目录配置 `.eslintrc.js` 与 `.prettierrc`,强制规范落地: ```javascript // .eslintrc.js 核心规则推荐 module.exports = { extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'], rules: { 'vue/multi-word-component-names': 'error', // 强制多词组件名 'no-unused-vars': ['error', { varsIgnorePattern: '^_' }], // 忽略 _this 等占位符 'prefer-const': 'error', // 优先使用 const 'vue/no-mutating-props': 'error', // 禁止直接修改 props 'vue/require-v-for-key': 'error', // v-for 必须带 key 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off' } } ``` 配合 `husky` + `lint-staged` 在提交前自动执行 `eslint --fix` 与 `prettier --write`,可从根本上杜绝格式混乱与低级语法错误。 --- *此 Issue 由代码审查服务自动创建*
TEXT
milestone_id
INTEGER
priority
INTEGER
is_closed
INTEGER
is_pull
INTEGER
num_comments
INTEGER
ref
TEXT
deadline_unix
INTEGER
created_unix
INTEGER
updated_unix
INTEGER
closed_unix
INTEGER
is_locked
INTEGER NOT NULL (default 0
content_version
INTEGER NOT NULL (default 0
time_estimate
INTEGER NOT NULL (default 0
Update
Cancel