Просмотр исходного кода

提交密文联调相关全量改动(含生成物)。

- 恢复本地联调代理与小程序 API_BASE 指向
- 更新 API 请求日志页样式
- 更新 graphify 产物与缓存

Made-with: Cursor
zlwu 6 месяцев назад
Родитель
Сommit
f763ca8876
29 измененных файлов с 498 добавлено и 246 удалено
  1. 36 0
      .history/sqxp-wx/config/api_20260429203922.js
  2. 168 0
      .history/web-admin/vite.config_20260429203922.ts
  3. 145 120
      graphify-out/GRAPH_REPORT.md
  4. 1 0
      graphify-out/cache/ast/035d30f5a1da0f026f096c16c1d609fb4dae0f9ac366c48bbdd666b6cc985eb5.json
  5. 0 0
      graphify-out/cache/ast/111639907f1abe405b03506f9082717907f49b44ef183b7f2ebd64ca79839232.json
  6. 1 0
      graphify-out/cache/ast/302c72221d768130bfe28aa82282fbc97ca2c46c3f2d8c8dac2dbac6604c0a1c.json
  7. 0 0
      graphify-out/cache/ast/306b2e5cffbffa9a8770bd0f4160c7edd7155eda51376555c3bc80a2cffd6c01.json
  8. 0 0
      graphify-out/cache/ast/3399ea79d5677dc81826f52aa2d9890a5d7bbb348a1eec95f50eae14798dc278.json
  9. 1 0
      graphify-out/cache/ast/3441e017cfb822467fbbebbab65bda26b6ca9bc2627bc9008b328998377f50e9.json
  10. 0 0
      graphify-out/cache/ast/4a18e0dc71e1042dda753fb0e306a42b827f8e63cfb8c2943cd2e4ccb3c6e024.json
  11. 0 0
      graphify-out/cache/ast/57056126971396fc4fda8d1f0ba956741692bf505c264d73bb91bcc005e4b31f.json
  12. 1 0
      graphify-out/cache/ast/77be82ffafc41958691aa66649b9455c8351b35bbd7806184201c35b13daa660.json
  13. 0 0
      graphify-out/cache/ast/796baba7c22e9378fdb8a5f6f0577e86bd1651053b1bb79992e6d552b6bccc2c.json
  14. 0 0
      graphify-out/cache/ast/9685b8bbd65227054aaf41c0d7942042092bf90c88336f1e30cf7984bdf68cfb.json
  15. 1 0
      graphify-out/cache/ast/9846f7484d2d5568213b81fe8cb065e1ab1cdf627e766488fbea55c065f84565.json
  16. 0 0
      graphify-out/cache/ast/9e8d668d796cdecd215442ce8c6fd5d73d45f1994b1ea9d5fd5b173cf9acaba3.json
  17. 0 0
      graphify-out/cache/ast/a08f49a5e082add7acca33932e033e901717064d5e09928da456d8f247b869a9.json
  18. 1 0
      graphify-out/cache/ast/aa1179e75b2b779ebc0c1d62ccd4cf91bb98719682be545f8bd26bf117e5c3d4.json
  19. 0 0
      graphify-out/cache/ast/ad1c8a241eaf78ccb60c5da31327f37cd87e23e9533cc8a18933493f599f395c.json
  20. 1 0
      graphify-out/cache/ast/ba169840fb2b99def5e65ba74b754dfab8996451eb4d91cd5337f30f5d860ab7.json
  21. 1 0
      graphify-out/cache/ast/d0f60632c10d4c2abb6b9def98473135b440be910f57b5674dc2b6c1c6a0cb23.json
  22. 0 0
      graphify-out/cache/ast/d8fe48e4063b315915ccee815e528759d08debe792ed15a819f611733b7a8406.json
  23. 0 0
      graphify-out/cache/ast/e5119ea0bf715d0bf905bba10dadbe973f30c2c16ad045d77a48c004804e244f.json
  24. 0 0
      graphify-out/cache/ast/f89a8bf625e5e1208fa5c59fe369bd407823ab39d3623f0a7f4c34f3649425c6.json
  25. 1 1
      graphify-out/graph.html
  26. 129 120
      graphify-out/graph.json
  27. 3 3
      sqxp-wx/config/api.js
  28. 6 0
      web-admin/src/views/system/api-request-log/index.vue
  29. 2 2
      web-admin/vite.config.ts

+ 36 - 0
.history/sqxp-wx/config/api_20260429203922.js

@@ -0,0 +1,36 @@
+// API 基础配置
+const DEV_BASE_URL = 'http://192.168.2.178:8000/api'
+let devBaseUrl = DEV_BASE_URL
+
+// 微信小程序真机调试时,localhost 指向手机本机,需使用电脑局域网 IP。
+// #ifdef MP-WEIXIN
+devBaseUrl = 'http://192.168.2.178:8000/api'
+// #endif
+
+export const BASE_URL = process.env.NODE_ENV === 'development'
+  ? devBaseUrl
+  : 'http://192.168.2.178:8000/api'
+
+// 开发环境不需要 API 前缀 /api
+const API_PREFIX = process.env.NODE_ENV === 'development' ? '' : ''
+
+export const API_BASE = `${BASE_URL}${API_PREFIX}`
+console.log('[ENV]', process.env.NODE_ENV, BASE_URL, API_BASE)
+
+/** 与 miniprogram `config/api.ts` 中客户/评价相关路径一致,供多页与 `api/reviewApi.js` 使用 */
+export const API_URL = {
+  CLIENT_DASHBOARD: `${API_BASE}/mini/client/dashboard/statistics`,
+  CLIENT_INVOICES: `${API_BASE}/mini/client/invoices`,
+  INVOICE_AVAILABLE_ORDERS: `${API_BASE}/mini/client/invoices/available-orders`,
+  CLIENT_SETTLEMENTS: `${API_BASE}/mini/client/settlements`,
+  CLIENT_SETTLEMENT_STATS: `${API_BASE}/mini/client/settlements/statistics`,
+  CLIENT_REFUNDS: `${API_BASE}/mini/client/refunds`,
+  PRODUCT_REVIEWS: `${API_BASE}/mini/reviews/product`,
+  CREATE_REVIEW: `${API_BASE}/mini/reviews`,
+  REVIEW_LIKE: (reviewId) => `${API_BASE}/mini/reviews/${reviewId}/like`,
+  REVIEW_STATISTICS: (productId) => `${API_BASE}/mini/reviews/statistics/${productId}`
+}
+
+export const TOKEN_KEY = 'sq_token'
+export const REFRESH_TOKEN_KEY = 'sq_refresh_token'
+export const USER_INFO_KEY = 'sq_user_info'

+ 168 - 0
.history/web-admin/vite.config_20260429203922.ts

@@ -0,0 +1,168 @@
+import { defineConfig, loadEnv } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import path from 'path'
+import { fileURLToPath } from 'url'
+import vueDevTools from 'vite-plugin-vue-devtools'
+import viteCompression from 'vite-plugin-compression'
+import Components from 'unplugin-vue-components/vite'
+import AutoImport from 'unplugin-auto-import/vite'
+import ElementPlus from 'unplugin-element-plus/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import tailwindcss from '@tailwindcss/vite'
+// import { visualizer } from 'rollup-plugin-visualizer'
+
+export default ({ mode }: { mode: string }) => {
+  const root = process.cwd()
+  const env = loadEnv(mode, root)
+  const { VITE_VERSION, VITE_PORT, VITE_BASE_URL, VITE_API_URL, VITE_API_PROXY_URL } = env
+
+  console.log(`🚀 API_URL = ${VITE_API_URL}`)
+  console.log(`🚀 VERSION = ${VITE_VERSION}`)
+
+  return defineConfig({
+    define: {
+      __APP_VERSION__: JSON.stringify(VITE_VERSION)
+    },
+    base: VITE_BASE_URL,
+    server: {
+      port: Number(VITE_PORT),
+      proxy: {
+        '/api': {
+          target: VITE_API_PROXY_URL,
+          changeOrigin: true
+        },
+        // Web端接口代理 - 转发到后端 /api 前缀
+        '/web': {
+          target: 'http://192.168.2.178:8000/api',
+          changeOrigin: true,
+          rewrite: (path) => `/api${path}`
+        },
+        // 小程序端接口代理
+        '/mini': {
+          target: 'http://192.168.2.178:8000/api',
+          changeOrigin: true,
+          rewrite: (path) => `/api${path}`
+        }
+      },
+      host: true
+    },
+    // 路径别名
+    resolve: {
+      alias: {
+        '@': fileURLToPath(new URL('./src', import.meta.url)),
+        '@views': resolvePath('src/views'),
+        '@imgs': resolvePath('src/assets/images'),
+        '@icons': resolvePath('src/assets/icons'),
+        '@utils': resolvePath('src/utils'),
+        '@stores': resolvePath('src/store'),
+        '@styles': resolvePath('src/assets/styles')
+      }
+    },
+    build: {
+      target: 'es2015',
+      outDir: 'dist',
+      chunkSizeWarningLimit: 2000,
+      minify: 'terser',
+      terserOptions: {
+        compress: {
+          // 生产环境去除 console
+          drop_console: true,
+          // 生产环境去除 debugger
+          drop_debugger: true
+        }
+      },
+      dynamicImportVarsOptions: {
+        warnOnError: true,
+        exclude: [],
+        include: ['src/views/**/*.vue']
+      }
+    },
+    plugins: [
+      vue(),
+      tailwindcss(),
+      // 自动按需导入 API
+      AutoImport({
+        imports: ['vue', 'vue-router', 'pinia', '@vueuse/core'],
+        dts: 'src/types/import/auto-imports.d.ts',
+        resolvers: [ElementPlusResolver()],
+        eslintrc: {
+          enabled: true,
+          filepath: './.auto-import.json',
+          globalsPropValue: true
+        }
+      }),
+      // 自动按需导入组件
+      Components({
+        dts: 'src/types/import/components.d.ts',
+        resolvers: [ElementPlusResolver()]
+      }),
+      // 按需定制主题配置
+      ElementPlus({
+        useSource: true
+      }),
+      // 压缩
+      viteCompression({
+        verbose: false, // 是否在控制台输出压缩结果
+        disable: false, // 是否禁用
+        algorithm: 'gzip', // 压缩算法
+        ext: '.gz', // 压缩后的文件名后缀
+        threshold: 10240, // 只有大小大于该值的资源会被处理 10240B = 10KB
+        deleteOriginFile: false // 压缩后是否删除原文件
+      }),
+      vueDevTools()
+      // 打包分析
+      // visualizer({
+      //   open: true,
+      //   gzipSize: true,
+      //   brotliSize: true,
+      //   filename: 'dist/stats.html' // 分析图生成的文件名及路径
+      // }),
+    ],
+    // 依赖预构建:避免运行时重复请求与转换,提升首次加载速度
+    optimizeDeps: {
+      include: [
+        'echarts/core',
+        'echarts/charts',
+        'echarts/components',
+        'echarts/renderers',
+        'xlsx',
+        'xgplayer',
+        'crypto-js',
+        'file-saver',
+        'vue-img-cutter',
+        'element-plus/es',
+        'element-plus/es/components/*/style/css',
+        'element-plus/es/components/*/style/index'
+      ]
+    },
+    css: {
+      preprocessorOptions: {
+        // sass variable and mixin
+        scss: {
+          additionalData: `
+            @use "@styles/core/el-light.scss" as *; 
+            @use "@styles/core/mixin.scss" as *;
+          `
+        }
+      },
+      postcss: {
+        plugins: [
+          {
+            postcssPlugin: 'internal:charset-removal',
+            AtRule: {
+              charset: (atRule) => {
+                if (atRule.name === 'charset') {
+                  atRule.remove()
+                }
+              }
+            }
+          }
+        ]
+      }
+    }
+  })
+}
+
+function resolvePath(paths: string) {
+  return path.resolve(__dirname, paths)
+}

+ 145 - 120
graphify-out/GRAPH_REPORT.md

@@ -1,12 +1,12 @@
 # Graph Report - sqxp_副本2  (2026-04-29)
 
 ## Corpus Check
-- 700 files · ~634,064 words
+- 700 files · ~635,193 words
 - Verdict: corpus is large enough that graph structure adds value.
 
 ## Summary
-- 4643 nodes · 21509 edges · 58 communities detected
-- Extraction: 24% EXTRACTED · 76% INFERRED · 0% AMBIGUOUS · INFERRED: 16425 edges (avg confidence: 0.56)
+- 4662 nodes · 21544 edges · 63 communities detected
+- Extraction: 24% EXTRACTED · 76% INFERRED · 0% AMBIGUOUS · INFERRED: 16431 edges (avg confidence: 0.56)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -32,48 +32,53 @@
 - [[_COMMUNITY_Community 19|Community 19]]
 - [[_COMMUNITY_Community 20|Community 20]]
 - [[_COMMUNITY_Community 21|Community 21]]
-- [[_COMMUNITY_Community 24|Community 24]]
+- [[_COMMUNITY_Community 22|Community 22]]
 - [[_COMMUNITY_Community 25|Community 25]]
 - [[_COMMUNITY_Community 26|Community 26]]
 - [[_COMMUNITY_Community 27|Community 27]]
+- [[_COMMUNITY_Community 28|Community 28]]
 - [[_COMMUNITY_Community 29|Community 29]]
+- [[_COMMUNITY_Community 30|Community 30]]
 - [[_COMMUNITY_Community 31|Community 31]]
-- [[_COMMUNITY_Community 32|Community 32]]
 - [[_COMMUNITY_Community 33|Community 33]]
-- [[_COMMUNITY_Community 34|Community 34]]
+- [[_COMMUNITY_Community 35|Community 35]]
 - [[_COMMUNITY_Community 36|Community 36]]
 - [[_COMMUNITY_Community 37|Community 37]]
 - [[_COMMUNITY_Community 38|Community 38]]
-- [[_COMMUNITY_Community 39|Community 39]]
+- [[_COMMUNITY_Community 40|Community 40]]
+- [[_COMMUNITY_Community 41|Community 41]]
+- [[_COMMUNITY_Community 42|Community 42]]
+- [[_COMMUNITY_Community 43|Community 43]]
 - [[_COMMUNITY_Community 44|Community 44]]
-- [[_COMMUNITY_Community 46|Community 46]]
-- [[_COMMUNITY_Community 47|Community 47]]
-- [[_COMMUNITY_Community 48|Community 48]]
 - [[_COMMUNITY_Community 49|Community 49]]
-- [[_COMMUNITY_Community 50|Community 50]]
 - [[_COMMUNITY_Community 51|Community 51]]
+- [[_COMMUNITY_Community 52|Community 52]]
 - [[_COMMUNITY_Community 53|Community 53]]
 - [[_COMMUNITY_Community 54|Community 54]]
 - [[_COMMUNITY_Community 55|Community 55]]
+- [[_COMMUNITY_Community 56|Community 56]]
+- [[_COMMUNITY_Community 58|Community 58]]
 - [[_COMMUNITY_Community 59|Community 59]]
-- [[_COMMUNITY_Community 62|Community 62]]
-- [[_COMMUNITY_Community 63|Community 63]]
-- [[_COMMUNITY_Community 65|Community 65]]
-- [[_COMMUNITY_Community 77|Community 77]]
-- [[_COMMUNITY_Community 87|Community 87]]
-- [[_COMMUNITY_Community 89|Community 89]]
-- [[_COMMUNITY_Community 143|Community 143]]
-- [[_COMMUNITY_Community 144|Community 144]]
-- [[_COMMUNITY_Community 145|Community 145]]
-- [[_COMMUNITY_Community 146|Community 146]]
-- [[_COMMUNITY_Community 147|Community 147]]
+- [[_COMMUNITY_Community 60|Community 60]]
+- [[_COMMUNITY_Community 64|Community 64]]
+- [[_COMMUNITY_Community 67|Community 67]]
+- [[_COMMUNITY_Community 68|Community 68]]
+- [[_COMMUNITY_Community 70|Community 70]]
+- [[_COMMUNITY_Community 83|Community 83]]
+- [[_COMMUNITY_Community 93|Community 93]]
+- [[_COMMUNITY_Community 95|Community 95]]
 - [[_COMMUNITY_Community 148|Community 148]]
+- [[_COMMUNITY_Community 149|Community 149]]
+- [[_COMMUNITY_Community 150|Community 150]]
+- [[_COMMUNITY_Community 151|Community 151]]
+- [[_COMMUNITY_Community 152|Community 152]]
+- [[_COMMUNITY_Community 153|Community 153]]
 
 ## God Nodes (most connected - your core abstractions)
 1. `BizPriceListItem` - 541 edges
 2. `SysUser` - 534 edges
 3. `BizOrder` - 531 edges
-4. `BizDeliveryTask` - 519 edges
+4. `BizDeliveryTask` - 520 edges
 5. `BasProduct` - 518 edges
 6. `SysRegion` - 511 edges
 7. `BizInquiry` - 509 edges
@@ -86,10 +91,10 @@
   backend/app/models/base.py → sqxp-wx/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
 - `register()` --calls--> `validate()`  [INFERRED]
   web-admin/src/views/auth/register/index.vue → sqxp-wx/pages/client/address/edit.vue
-- `toTime()` --calls--> `getTime()`  [INFERRED]
-  web-admin/src/views/dashboard/console/index.vue → sqxp-wx/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
 - `number()` --calls--> `inputMaxlength()`  [INFERRED]
   web-admin/src/views/system/inquiry-quotation/index.vue → sqxp-wx/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
+- `number()` --calls--> `mounted()`  [INFERRED]
+  web-admin/src/views/system/inquiry-quotation/index.vue → sqxp-wx/uni_modules/uni-table/components/uni-tr/uni-tr.vue
 - `number()` --calls--> `onPickerChange()`  [INFERRED]
   web-admin/src/views/system/inquiry-quotation/index.vue → sqxp-wx/pages/client/invoice/invoice.vue
 
@@ -97,294 +102,314 @@
 
 ### Community 0 - "Community 0"
 Cohesion: 0.01
-Nodes (608): adjust_order(), _aggregate_client_settlement_history(), _aggregate_supplier_settlement_history(), _apply_region_minutes_to_data(), approve_quotation(), assign_deliverer_to_order(), assign_delivery_alias(), batch_create_settlements() (+600 more)
+Nodes (621): adjust_order(), _aggregate_client_settlement_history(), _aggregate_supplier_settlement_history(), _apply_region_minutes_to_data(), approve_quotation(), assign_deliverer_to_order(), assign_delivery_alias(), batch_create_settlements() (+613 more)
 
 ### Community 1 - "Community 1"
-Cohesion: 0.08
-Nodes (549): 获取管理员的区域过滤条件      对于区域管理员,返回其所属区域ID(用于过滤数据)     对于超级管理员(无区域绑定),返回None(不过滤), 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 与 PUT 同逻辑:前端按 POST 模式调用时复用。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 上传用户头像图片,返回可写入 avatarUrl 的地址 (+541 more)
+Cohesion: 0.09
+Nodes (537): 获取管理员的区域过滤条件      对于区域管理员,返回其所属区域ID(用于过滤数据)     对于超级管理员(无区域绑定),返回None(不过滤), 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 与 PUT 同逻辑:前端按 POST 模式调用时复用。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 上传用户头像图片,返回可写入 avatarUrl 的地址 (+529 more)
 
 ### Community 2 - "Community 2"
 Cohesion: 0.01
-Nodes (141): fullRegion(), if(), if(), FireworkSystem, mapKeys(), VantComponent(), HTMLParser(), parseAttrs() (+133 more)
+Nodes (178): fullRegion(), if(), if(), FireworkSystem, mapKeys(), VantComponent(), HTMLParser(), parseAttrs() (+170 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.01
-Nodes (153): reload(), calendar(), memo(), record(), addUnit(), isDef(), isNumber(), nextTick() (+145 more)
+Nodes (145): calendar(), memo(), record(), handleSelect(), onMenuShow(), showMenu(), onClear(), onInput() (+137 more)
 
 ### Community 4 - "Community 4"
 Cohesion: 0.01
-Nodes (248): InvoiceCreateRequest, MessageCreateRequest, 获取商品的评价列表(仅显示已审核通过的评价), AdjustResponse, Config, CreateAdjustRequest, 兼容明文/密文请求,返回业务 payload。失败时返回 error_response。, BaseModel (+240 more)
+Nodes (144): handleSubmit(), loadDetail(), onRegionMultiConfirm(), regionLabel(), syncMultiFromForm(), validate(), fetchActiveRegions(), fetchAssignableMenuCodes() (+136 more)
 
 ### Community 5 - "Community 5"
-Cohesion: 0.01
-Nodes (195): # TODO: 发送微信模板消息提醒配送员, 记录处理过程(不结案,结案由配送完成/取消自动触发), 小程序客户端扩展接口:购物车、商品分类、仪表盘、发票、下单、支付, 可申请开票的已完成订单(简化:已完成且尚无发票), 商品对应的一级(根)分类,供购物车行展示与序列化。, 购物车:先一级分类 sort_order,再商品名、商品 id(稳定)。, 当前用户有效购物车行(含区域价目表同步、过滤已删)。, 将购物车 ORM 行序列化为与 GET /cart 一致的 list 项(仅未删除行)。 (+187 more)
+Cohesion: 0.02
+Nodes (195): # TODO: 发送微信模板消息提醒配送员, # TODO: 发送微信模板消息提醒配送员, 记录处理过程(不结案,结案由配送完成/取消自动触发), 取消抢单      配送员可以取消自己抢到但尚未开始配送的任务, 配送员查看商品详情:轮播、基础信息、参数、富文本、详情媒体(与供应商端一致,不依赖客户价目表/区域绑定), 供应商默认取货地址;无默认时取第一条 pickup 类型地址。, 即将超时的配送任务(基于 effective_time), 获取待抢单的任务列表      返回所有未分配给特定配送员的任务,配送员可以抢单 (+187 more)
 
 ### Community 6 - "Community 6"
 Cohesion: 0.01
-Nodes (136): fetchActiveRegions(), fetchAssignableMenuCodes(), fetchCategoryList(), fetchCategoryParameters(), fetchCategoryTree(), fetchCreateUnit(), fetchNotDeletedRegions(), fetchProductBannerList() (+128 more)
+Nodes (236): InvoiceCreateRequest, MessageCreateRequest, 获取商品的评价列表(仅显示已审核通过的评价), AdjustResponse, Config, CreateAdjustRequest, BaseModel, Config (+228 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.01
-Nodes (129): handleSubmit(), loadDetail(), onRegionMultiConfirm(), regionLabel(), syncMultiFromForm(), validate(), close_payment(), create_wechat_pay() (+121 more)
+Cohesion: 0.02
+Nodes (107): 小程序客户端扩展接口:购物车、商品分类、仪表盘、发票、下单、支付, 可申请开票的已完成订单(简化:已完成且尚无发票), 商品对应的一级(根)分类,供购物车行展示与序列化。, 购物车:先一级分类 sort_order,再商品名、商品 id(稳定)。, 当前用户有效购物车行(含区域价目表同步、过滤已删)。, 将购物车 ORM 行序列化为与 GET /cart 一致的 list 项(仅未删除行)。, 购物车汇总(件数、行数、金额),供 Tab 角标等轻量刷新。, 与 /price-list/current 相同,便于小程序路径统一 (+99 more)
 
 ### Community 8 - "Community 8"
 Cohesion: 0.02
-Nodes (111): endDate(), selected(), startDate(), Calendar, changeFlag(), countDown(), day(), handler() (+103 more)
+Nodes (51): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchGetMenuList(), fetchGetRoleList(), fetchGetUserList(), reload(), addUnit() (+43 more)
 
 ### Community 9 - "Community 9"
-Cohesion: 0.02
-Nodes (67): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchGetMenuList(), fetchGetRoleList(), fetchGetUserList(), useSettingsHandlers(), useSettingsPanel() (+59 more)
+Cohesion: 0.03
+Nodes (52): handleFormClose(), _Blur(), created(), init(), inputContentStyle(), inputMaxlength(), inputStyle(), obj2strStyle() (+44 more)
 
 ### Community 10 - "Community 10"
 Cohesion: 0.03
-Nodes (43): askAbortDownload(), checkLocalStoragePackage(), closeUpdate(), compare(), deleteSavedFile(), downLoadComplete(), installPackage(), onLoad() (+35 more)
+Nodes (52): BaseHTTPMiddleware, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json(), derive_key(), encrypt_json(), gen_nonce_hex() (+44 more)
 
 ### Community 11 - "Community 11"
+Cohesion: 0.03
+Nodes (43): askAbortDownload(), checkLocalStoragePackage(), closeUpdate(), compare(), deleteSavedFile(), downLoadComplete(), installPackage(), onLoad() (+35 more)
+
+### Community 12 - "Community 12"
 Cohesion: 0.05
 Nodes (15): fetchGetLatestUpgradeLog(), if(), getDefaultLanguage(), emitUrls(), removeItem(), revokeLocalPreview(), checkStorageCompatibility(), StorageConfig (+7 more)
 
-### Community 12 - "Community 12"
+### Community 13 - "Community 13"
+Cohesion: 0.05
+Nodes (21): change(), created(), getDataList(), getSelectedValue(), handler(), loadData(), mixinDatacomResData(), modelValue() (+13 more)
+
+### Community 14 - "Community 14"
 Cohesion: 0.09
 Nodes (27): base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes(), sha256Hex() (+19 more)
 
-### Community 13 - "Community 13"
+### Community 15 - "Community 15"
 Cohesion: 0.11
 Nodes (12): activated(), bottom(), center(), close(), deactivated(), destroyed(), left(), onTap() (+4 more)
 
-### Community 14 - "Community 14"
-Cohesion: 0.15
-Nodes (19): 备货完成后通知配送员(微信订阅消息,失败不阻断主流程), 供应商开始备货:assigned -> supplier_stocking,并写入订单状态日志(配送进度), 供应商备货完成:supplier_stocking -> supplier_ready(待配送员取货),写入订单日志并可通知配送员, [兼容] 请改用 POST /tasks/{id}/start-stock, [兼容] 请改用 POST /tasks/{id}/finish-stock, 供应商端商品详情:轮播、基础信息、参数、富文本、详情媒体, 价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。, 获取供应商的配送任务列表(含商品缩略列表;供货合计按价格清单还原供货单价后汇总) (+11 more)
-
-### Community 15 - "Community 15"
+### Community 16 - "Community 16"
 Cohesion: 0.18
 Nodes (21): destroyed(), getDirection(), getDom(), isPC(), mousedown(), mouseleave(), mousemove(), mouseup() (+13 more)
 
-### Community 16 - "Community 16"
+### Community 17 - "Community 17"
 Cohesion: 0.13
 Nodes (13): change(), clearVal(), created(), debounce(), emit(), formatItemName(), getCache(), handler() (+5 more)
 
-### Community 17 - "Community 17"
+### Community 18 - "Community 18"
 Cohesion: 0.12
 Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
 
-### Community 18 - "Community 18"
+### Community 19 - "Community 19"
 Cohesion: 0.17
 Nodes (16): animation(), bindTiming(), close(), getDom(), getEl(), getSelectorQuery(), init(), leftOptions() (+8 more)
 
-### Community 19 - "Community 19"
+### Community 20 - "Community 20"
 Cohesion: 0.18
 Nodes (16): defaultAvatarPathByRole(), normalizeAvatarUrlForMini(), resolveUserAvatarUrl(), appendQueryParam(), fallbackVersionFromManifest(), getStaticAssetsVersion(), hasSignedQuery(), hasVersionParam() (+8 more)
 
-### Community 20 - "Community 20"
+### Community 21 - "Community 21"
 Cohesion: 0.16
 Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
 
-### Community 21 - "Community 21"
+### Community 22 - "Community 22"
 Cohesion: 0.28
 Nodes (14): getDirection(), getDisabledType(), getDom(), move(), moveDirection(), openState(), range(), resetTouchStatus() (+6 more)
 
-### Community 24 - "Community 24"
+### Community 25 - "Community 25"
 Cohesion: 0.17
 Nodes (2): clean(), onInput()
 
-### Community 25 - "Community 25"
+### Community 26 - "Community 26"
+Cohesion: 0.29
+Nodes (11): 备货完成后通知配送员(微信订阅消息,失败不阻断主流程), 供应商开始备货:assigned -> supplier_stocking,并写入订单状态日志(配送进度), 供应商备货完成:supplier_stocking -> supplier_ready(待配送员取货),写入订单日志并可通知配送员, [兼容] 请改用 POST /tasks/{id}/start-stock, [兼容] 请改用 POST /tasks/{id}/finish-stock, 供应商端商品详情:轮播、基础信息、参数、富文本、详情媒体, 价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。, 获取供应商的配送任务列表(含商品缩略列表;供货合计按价格清单还原供货单价后汇总) (+3 more)
+
+### Community 27 - "Community 27"
+Cohesion: 0.33
+Nodes (11): changeFlag(), countDown(), day(), handler(), hour(), minute(), second(), startData() (+3 more)
+
+### Community 28 - "Community 28"
+Cohesion: 0.23
+Nodes (6): formatDate(), friendlyDate(), getDate(), dateShow(), handler(), setAutoRefresh()
+
+### Community 29 - "Community 29"
 Cohesion: 0.24
 Nodes (4): getVal(), leftIconWidth(), navbarHeight(), rightIconWidth()
 
-### Community 26 - "Community 26"
+### Community 30 - "Community 30"
 Cohesion: 0.4
 Nodes (9): backup_table(), count_affected(), get_text_columns(), main(), make_backup_table_name(), parse_args(), quote_ident(), 生成备份表名,控制在 MySQL 64 字符限制内。 (+1 more)
 
-### Community 27 - "Community 27"
+### Community 31 - "Community 31"
 Cohesion: 0.24
 Nodes (3): _calcValue(), _getDecimalScale(), _onBlur()
 
-### Community 29 - "Community 29"
+### Community 33 - "Community 33"
 Cohesion: 0.27
 Nodes (4): dataValue(), emit(), onChange(), setOpen()
 
-### Community 31 - "Community 31"
+### Community 35 - "Community 35"
 Cohesion: 0.25
 Nodes (2): borderStyle(), value2px()
 
-### Community 32 - "Community 32"
+### Community 36 - "Community 36"
 Cohesion: 0.39
 Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
 
-### Community 33 - "Community 33"
+### Community 37 - "Community 37"
 Cohesion: 0.29
 Nodes (2): handleTouchEnd(), setTransition()
 
-### Community 34 - "Community 34"
+### Community 38 - "Community 38"
 Cohesion: 0.36
 Nodes (1): TableHeightCalculator
 
-### Community 36 - "Community 36"
+### Community 40 - "Community 40"
 Cohesion: 0.36
 Nodes (1): RouteValidator
 
-### Community 37 - "Community 37"
+### Community 41 - "Community 41"
 Cohesion: 0.39
 Nodes (5): chooseAll(), chooseAndUploadFile(), chooseImage(), chooseVideo(), uploadFiles()
 
-### Community 38 - "Community 38"
+### Community 42 - "Community 42"
 Cohesion: 0.33
 Nodes (2): logApiCryptoBootInfo(), maskSecret()
 
-### Community 39 - "Community 39"
+### Community 43 - "Community 43"
 Cohesion: 0.38
-Nodes (3): _change(), close(), open()
+Nodes (4): fetchApiRequestLogList(), handleReset(), handleSearch(), loadData()
 
 ### Community 44 - "Community 44"
+Cohesion: 0.38
+Nodes (3): _change(), close(), open()
+
+### Community 49 - "Community 49"
 Cohesion: 0.33
 Nodes (1): BridgeError
 
-### Community 46 - "Community 46"
+### Community 51 - "Community 51"
 Cohesion: 0.4
 Nodes (2): created(), getTable()
 
-### Community 47 - "Community 47"
+### Community 52 - "Community 52"
 Cohesion: 0.47
 Nodes (3): get_file_data(), get_file_ext(), get_file_info()
 
-### Community 48 - "Community 48"
+### Community 53 - "Community 53"
 Cohesion: 0.4
 Nodes (2): created(), getForm()
 
-### Community 49 - "Community 49"
+### Community 54 - "Community 54"
 Cohesion: 0.47
 Nodes (4): onDial(), onTextClick(), dialPhone(), normalizeDialNumber()
 
-### Community 50 - "Community 50"
+### Community 55 - "Community 55"
 Cohesion: 0.4
 Nodes (4): 运营端角色守卫:admin / super_admin 可访问。, 接口菜单权限守卫。super_admin 直接放行。, require_admin_or_super_admin(), require_menu_code()
 
-### Community 51 - "Community 51"
+### Community 56 - "Community 56"
 Cohesion: 0.5
 Nodes (2): focusInput(), handleKeydown()
 
-### Community 53 - "Community 53"
+### Community 58 - "Community 58"
 Cohesion: 0.5
 Nodes (3): BaseSettings, Config, Settings
 
-### Community 54 - "Community 54"
+### Community 59 - "Community 59"
 Cohesion: 0.67
 Nodes (3): build_menu_tree(), get_menu_list(), 获取菜单列表(从 sys_menu 表读取,构建树形结构)
 
-### Community 55 - "Community 55"
+### Community 60 - "Community 60"
 Cohesion: 0.5
 Nodes (1): collectIds()
 
-### Community 59 - "Community 59"
+### Community 64 - "Community 64"
 Cohesion: 0.83
 Nodes (3): classes(), isTrue(), onClick()
 
-### Community 62 - "Community 62"
+### Community 67 - "Community 67"
 Cohesion: 0.67
 Nodes (2): created(), getParent()
 
-### Community 63 - "Community 63"
+### Community 68 - "Community 68"
 Cohesion: 1.0
 Nodes (2): getSettingDefaults(), resetToDefaults()
 
-### Community 65 - "Community 65"
+### Community 70 - "Community 70"
 Cohesion: 1.0
 Nodes (2): defaultAvatarPathByRole(), resolveUserAvatarUrl()
 
-### Community 77 - "Community 77"
+### Community 83 - "Community 83"
 Cohesion: 0.67
 Nodes (1): updateUseModal()
 
-### Community 87 - "Community 87"
+### Community 93 - "Community 93"
 Cohesion: 1.0
 Nodes (2): buildMiniEncryptedLoginBody(), fetchLoginPublicKey()
 
-### Community 89 - "Community 89"
+### Community 95 - "Community 95"
 Cohesion: 0.67
 Nodes (1): return()
 
-### Community 143 - "Community 143"
+### Community 148 - "Community 148"
 Cohesion: 1.0
 Nodes (1): 发送订单状态通知                  Args:             openid: 用户openid             ord
 
-### Community 144 - "Community 144"
+### Community 149 - "Community 149"
 Cohesion: 1.0
 Nodes (1): 发送支付成功通知                  Args:             openid: 用户openid             ord
 
-### Community 145 - "Community 145"
+### Community 150 - "Community 150"
 Cohesion: 1.0
 Nodes (1): 发送配送通知                  Args:             openid: 配送员openid             task
 
-### Community 146 - "Community 146"
+### Community 151 - "Community 151"
 Cohesion: 1.0
 Nodes (1): 发送配送时效预警                  Args:             openid: 配送员openid             ta
 
-### Community 147 - "Community 147"
+### Community 152 - "Community 152"
 Cohesion: 1.0
 Nodes (1): 发送退款结果通知                  Args:             openid: 用户openid             ord
 
-### Community 148 - "Community 148"
+### Community 153 - "Community 153"
 Cohesion: 1.0
 Nodes (1): 发送催单通知给配送员                  Args:             deliver_openid: 配送员openid
 
 ## Knowledge Gaps
-- **71 isolated node(s):** `关闭超时未支付的线上订单(超时分钟数来自系统设置 auto_cancel_minutes)。`, `初始化定时任务      Args:         get_db_session: 数据库会话获取函数(从 app.core.database 导入)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。`, `从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。` (+66 more)
+- **72 isolated node(s):** `关闭超时未支付的线上订单(超时分钟数来自系统设置 auto_cancel_minutes)。`, `初始化定时任务      Args:         get_db_session: 数据库会话获取函数(从 app.core.database 导入)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。`, `从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。` (+67 more)
   These have ≤1 connection - possible missing edges or undocumented components.
-- **Thin community `Community 24`** (13 nodes): `uni-combox.vue`, `clean()`, `data()`, `default()`, `filterCandidates()`, `filterCandidatesLength()`, `handler()`, `labelStyle()`, `onBlur()`, `onFocus()`, `onInput()`, `onSelectorClick()`, `toggleSelector()`
+- **Thin community `Community 25`** (13 nodes): `uni-combox.vue`, `clean()`, `data()`, `default()`, `filterCandidates()`, `filterCandidatesLength()`, `handler()`, `labelStyle()`, `onBlur()`, `onFocus()`, `onInput()`, `onSelectorClick()`, `toggleSelector()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 31`** (9 nodes): `upload-file.vue`, `borderLineStyle()`, `borderStyle()`, `choose()`, `default()`, `delFile()`, `styles()`, `uploadFiles()`, `value2px()`
+- **Thin community `Community 35`** (9 nodes): `upload-file.vue`, `borderLineStyle()`, `borderStyle()`, `choose()`, `default()`, `delFile()`, `styles()`, `uploadFiles()`, `value2px()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 33`** (8 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `setTransition()`, `setupEventListeners()`, `index.vue`
+- **Thin community `Community 37`** (8 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `setTransition()`, `setupEventListeners()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 34`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
+- **Thin community `Community 38`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 36`** (8 nodes): `RouteValidator`, `.checkComponents()`, `.checkDuplicates()`, `.checkNestedIndexComponent()`, `.logLayoutError()`, `.resolvePath()`, `.validate()`, `RouteValidator.ts`
+- **Thin community `Community 40`** (8 nodes): `RouteValidator`, `.checkComponents()`, `.checkDuplicates()`, `.checkNestedIndexComponent()`, `.logLayoutError()`, `.resolvePath()`, `.validate()`, `RouteValidator.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 38`** (7 nodes): `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `App.vue`, `main.ts`, `console.ts`
+- **Thin community `Community 42`** (7 nodes): `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `App.vue`, `main.ts`, `console.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 44`** (6 nodes): `bridge-error.js`, `BridgeError`, `.code()`, `.constructor()`, `.errCode()`, `.errMsg()`
+- **Thin community `Community 49`** (6 nodes): `bridge-error.js`, `BridgeError`, `.code()`, `.constructor()`, `.errCode()`, `.errMsg()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 46`** (6 nodes): `uni-thead.vue`, `checkboxSelected()`, `created()`, `data()`, `getTable()`, `init()`
+- **Thin community `Community 51`** (6 nodes): `uni-thead.vue`, `checkboxSelected()`, `created()`, `data()`, `getTable()`, `init()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 48`** (6 nodes): `uni-group.vue`, `created()`, `data()`, `getForm()`, `onClick()`, `title()`
+- **Thin community `Community 53`** (6 nodes): `uni-group.vue`, `created()`, `data()`, `getForm()`, `onClick()`, `title()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 51`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
+- **Thin community `Community 56`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 55`** (4 nodes): `catch()`, `collectIds()`, `handleCategoryTableSelectionChange()`, `index.vue`
+- **Thin community `Community 60`** (4 nodes): `catch()`, `collectIds()`, `handleCategoryTableSelectionChange()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 62`** (4 nodes): `popup.js`, `created()`, `data()`, `getParent()`
+- **Thin community `Community 67`** (4 nodes): `popup.js`, `created()`, `data()`, `getParent()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 63`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
+- **Thin community `Community 68`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 65`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
+- **Thin community `Community 70`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 77`** (3 nodes): `check-update.js`, `check-update.ts`, `updateUseModal()`
+- **Thin community `Community 83`** (3 nodes): `check-update.js`, `check-update.ts`, `updateUseModal()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 87`** (3 nodes): `loginRsa.js`, `buildMiniEncryptedLoginBody()`, `fetchLoginPublicKey()`
+- **Thin community `Community 93`** (3 nodes): `loginRsa.js`, `buildMiniEncryptedLoginBody()`, `fetchLoginPublicKey()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 89`** (3 nodes): `return()`, `detail.vue`, `detail.vue`
+- **Thin community `Community 95`** (3 nodes): `return()`, `detail.vue`, `detail.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 143`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 148`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 144`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 149`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 145`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
+- **Thin community `Community 150`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 146`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
+- **Thin community `Community 151`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 147`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 152`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 148`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
+- **Thin community `Community 153`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
 
 ## Suggested Questions
 _Questions this graph is uniquely positioned to answer:_
 
-- **Why does `push()` connect `Community 2` to `Community 0`, `Community 3`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 11`?**
-  _High betweenness centrality (0.110) - this node is a cross-community bridge._
-- **Why does `query()` connect `Community 0` to `Community 16`, `Community 5`, `Community 54`, `Community 7`?**
-  _High betweenness centrality (0.050) - this node is a cross-community bridge._
-- **Why does `CRUDBase` connect `Community 5` to `Community 0`, `Community 4`?**
+- **Why does `push()` connect `Community 2` to `Community 0`, `Community 3`, `Community 4`, `Community 9`, `Community 11`, `Community 12`, `Community 13`?**
+  _High betweenness centrality (0.117) - this node is a cross-community bridge._
+- **Why does `number()` connect `Community 4` to `Community 0`, `Community 2`, `Community 7`, `Community 9`, `Community 11`, `Community 13`, `Community 14`?**
+  _High betweenness centrality (0.055) - this node is a cross-community bridge._
+- **Why does `query()` connect `Community 0` to `Community 17`, `Community 59`, `Community 5`?**
   _High betweenness centrality (0.038) - this node is a cross-community bridge._
 - **Are the 539 inferred relationships involving `BizPriceListItem` (e.g. with `PriceListCRUD` and `PriceListItemCRUD`) actually correct?**
   _`BizPriceListItem` has 539 INFERRED edges - model-reasoned connections that need verification._
@@ -392,5 +417,5 @@ _Questions this graph is uniquely positioned to answer:_
   _`SysUser` has 532 INFERRED edges - model-reasoned connections that need verification._
 - **Are the 529 inferred relationships involving `BizOrder` (e.g. with `DeliveryTaskCRUD` and `DeliveryTaskItemCRUD`) actually correct?**
   _`BizOrder` has 529 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 517 inferred relationships involving `BizDeliveryTask` (e.g. with `DeliveryWarningTask` and `配送时效预警定时任务  依据订单分配时写入的配送截止时间(biz_delivery_task.effective_time)及区域表 sys_region.`) actually correct?**
-  _`BizDeliveryTask` has 517 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 518 inferred relationships involving `BizDeliveryTask` (e.g. with `DeliveryWarningTask` and `配送时效预警定时任务  依据订单分配时写入的配送截止时间(biz_delivery_task.effective_time)及区域表 sys_region.`) actually correct?**
+  _`BizDeliveryTask` has 518 INFERRED edges - model-reasoned connections that need verification._

+ 1 - 0
graphify-out/cache/ast/035d30f5a1da0f026f096c16c1d609fb4dae0f9ac366c48bbdd666b6cc985eb5.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_delivery_warning_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/delivery-warning/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/111639907f1abe405b03506f9082717907f49b44ef183b7f2ebd64ca79839232.json


+ 1 - 0
graphify-out/cache/ast/302c72221d768130bfe28aa82282fbc97ca2c46c3f2d8c8dac2dbac6604c0a1c.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_delivery_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/delivery/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/306b2e5cffbffa9a8770bd0f4160c7edd7155eda51376555c3bc80a2cffd6c01.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/3399ea79d5677dc81826f52aa2d9890a5d7bbb348a1eec95f50eae14798dc278.json


+ 1 - 0
graphify-out/cache/ast/3441e017cfb822467fbbebbab65bda26b6ca9bc2627bc9008b328998377f50e9.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_supplier_settlement_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/supplier-settlement/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/4a18e0dc71e1042dda753fb0e306a42b827f8e63cfb8c2943cd2e4ccb3c6e024.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/57056126971396fc4fda8d1f0ba956741692bf505c264d73bb91bcc005e4b31f.json


+ 1 - 0
graphify-out/cache/ast/77be82ffafc41958691aa66649b9455c8351b35bbd7806184201c35b13daa660.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_delivery_warning_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/delivery-warning/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/796baba7c22e9378fdb8a5f6f0577e86bd1651053b1bb79992e6d552b6bccc2c.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/9685b8bbd65227054aaf41c0d7942042092bf90c88336f1e30cf7984bdf68cfb.json


+ 1 - 0
graphify-out/cache/ast/9846f7484d2d5568213b81fe8cb065e1ab1cdf627e766488fbea55c065f84565.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_sqxp_wx_config_api_js", "label": "api.js", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/sqxp-wx/config/api.js", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/9e8d668d796cdecd215442ce8c6fd5d73d45f1994b1ea9d5fd5b173cf9acaba3.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/a08f49a5e082add7acca33932e033e901717064d5e09928da456d8f247b869a9.json


+ 1 - 0
graphify-out/cache/ast/aa1179e75b2b779ebc0c1d62ccd4cf91bb98719682be545f8bd26bf117e5c3d4.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_order_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/order/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/ad1c8a241eaf78ccb60c5da31327f37cd87e23e9533cc8a18933493f599f395c.json


+ 1 - 0
graphify-out/cache/ast/ba169840fb2b99def5e65ba74b754dfab8996451eb4d91cd5337f30f5d860ab7.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_user_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L1"}, {"id": "user_index_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L586"}], "edges": [{"source": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_user_index_vue", "target": "user_index_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L586", "weight": 1.0}, {"source": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_user_index_vue", "target": "user_index_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L912", "weight": 1.0}], "raw_calls": [{"caller_nid": "user_index_if", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L587"}, {"caller_nid": "user_index_if", "callee": "error", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/user/index.vue", "source_location": "L913"}]}

+ 1 - 0
graphify-out/cache/ast/d0f60632c10d4c2abb6b9def98473135b440be910f57b5674dc2b6c1c6a0cb23.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_sqxp_2_web_admin_src_views_system_client_settlement_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/sqxp_\u526f\u672c2/web-admin/src/views/system/client-settlement/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/d8fe48e4063b315915ccee815e528759d08debe792ed15a819f611733b7a8406.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/e5119ea0bf715d0bf905bba10dadbe973f30c2c16ad045d77a48c004804e244f.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
graphify-out/cache/ast/f89a8bf625e5e1208fa5c59fe369bd407823ab39d3623f0a7f4c34f3649425c6.json


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
graphify-out/graph.html


Разница между файлами не показана из-за своего большого размера
+ 129 - 120
graphify-out/graph.json


+ 3 - 3
sqxp-wx/config/api.js

@@ -1,15 +1,15 @@
 // API 基础配置
-const DEV_BASE_URL = 'http://192.168.2.110:8000/api'
+const DEV_BASE_URL = 'http://192.168.2.178:8000/api'
 let devBaseUrl = DEV_BASE_URL
 
 // 微信小程序真机调试时,localhost 指向手机本机,需使用电脑局域网 IP。
 // #ifdef MP-WEIXIN
-devBaseUrl = 'http://192.168.2.110:8000/api'
+devBaseUrl = 'http://192.168.2.178:8000/api'
 // #endif
 
 export const BASE_URL = process.env.NODE_ENV === 'development'
   ? devBaseUrl
-  : 'http://192.168.2.110:8000/api'
+  : 'http://192.168.2.178:8000/api'
 
 // 开发环境不需要 API 前缀 /api
 const API_PREFIX = process.env.NODE_ENV === 'development' ? '' : ''

+ 6 - 0
web-admin/src/views/system/api-request-log/index.vue

@@ -191,4 +191,10 @@
   .api-request-log-dialog-scroll :deep(.el-descriptions__body) {
     background: #fff;
   }
+
+  .api-request-log-dialog-scroll {
+    max-height: min(70vh, 620px);
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
 </style>

+ 2 - 2
web-admin/vite.config.ts

@@ -33,13 +33,13 @@ export default ({ mode }: { mode: string }) => {
         },
         // Web端接口代理 - 转发到后端 /api 前缀
         '/web': {
-          target: 'http://192.168.2.110:8000/api',
+          target: 'http://192.168.2.178:8000/api',
           changeOrigin: true,
           rewrite: (path) => `/api${path}`
         },
         // 小程序端接口代理
         '/mini': {
-          target: 'http://192.168.2.110:8000/api',
+          target: 'http://192.168.2.178:8000/api',
           changeOrigin: true,
           rewrite: (path) => `/api${path}`
         }

Некоторые файлы не были показаны из-за большого количества измененных файлов