From 57adeaa42cc03153ab8da9b44e294e13c33fc009 Mon Sep 17 00:00:00 2001 From: dengyuxin Date: Thu, 18 Sep 2025 12:33:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=B6=E8=A1=8C=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bank-backend/scripts/setup-bank-db.ps1 | 4 +- bank_mini_program/.env.development | 44 + bank_mini_program/.env.production | 44 + bank_mini_program/.eslintrc.js | 164 + bank_mini_program/CHANGELOG.md | 242 + bank_mini_program/README.md | 295 + bank_mini_program/docs/API.md | 704 + bank_mini_program/docs/DEPLOYMENT.md | 741 + bank_mini_program/index.html | 201 + bank_mini_program/jest.config.ts | 100 + bank_mini_program/package-lock.json | 12285 ++++++++++++++++ bank_mini_program/package.json | 71 + bank_mini_program/src/App.vue | 118 + .../src/components/AuthGuard.vue | 290 + .../src/components/common/ActionSheet.vue | 508 + .../src/components/common/EmptyState.vue | 492 + .../src/components/common/LoadingSpinner.vue | 381 + .../src/components/common/StatusTag.vue | 501 + .../common/__tests__/StatusTag.spec.ts | 228 + bank_mini_program/src/main.js | 14 + bank_mini_program/src/manifest.json | 47 + bank_mini_program/src/pages.json | 141 + bank_mini_program/src/pages/assets/assets.vue | 983 ++ bank_mini_program/src/pages/assets/detail.vue | 1061 ++ .../src/pages/assets/monitor.vue | 1268 ++ .../src/pages/customers/customers.vue | 866 ++ .../src/pages/dashboard/dashboard.vue | 833 ++ bank_mini_program/src/pages/index/index.vue | 392 + bank_mini_program/src/pages/login/login.vue | 400 + .../src/pages/reports/dashboard.vue | 1590 ++ .../src/pages/reports/reports.vue | 1285 ++ bank_mini_program/src/pages/risk/risk.vue | 1468 ++ .../src/pages/transactions/detail.vue | 1323 ++ .../src/pages/transactions/transactions.vue | 1104 ++ .../src/static/images/default-avatar.png | 6 + .../src/static/images/default-avatar.svg | 5 + .../src/static/images/icon-assets.svg | 4 + .../src/static/images/icon-customers.svg | 4 + .../src/static/images/icon-risk.svg | 4 + .../src/static/images/icon-transactions.svg | 4 + bank_mini_program/src/store/app.js | 305 + bank_mini_program/src/store/index.js | 9 + bank_mini_program/src/store/user.js | 216 + bank_mini_program/src/styles/base.scss | 184 + bank_mini_program/src/styles/mixins.scss | 544 + bank_mini_program/src/styles/utilities.scss | 476 + bank_mini_program/src/styles/variables.scss | 54 + bank_mini_program/src/utils/auth.js | 379 + bank_mini_program/src/utils/permission.js | 485 + bank_mini_program/src/utils/request.js | 239 + bank_mini_program/tests/setup.ts | 148 + bank_mini_program/tests/utils/test-utils.ts | 241 + bank_mini_program/tsconfig.json | 74 + bank_mini_program/tsconfig.node.json | 16 + bank_mini_program/vite.config.js | 35 + bank_mini_program/vite.config.ts | 152 + docs/银行端小程序产品需求文档.md | 420 + 57 files changed, 34190 insertions(+), 2 deletions(-) create mode 100644 bank_mini_program/.env.development create mode 100644 bank_mini_program/.env.production create mode 100644 bank_mini_program/.eslintrc.js create mode 100644 bank_mini_program/CHANGELOG.md create mode 100644 bank_mini_program/README.md create mode 100644 bank_mini_program/docs/API.md create mode 100644 bank_mini_program/docs/DEPLOYMENT.md create mode 100644 bank_mini_program/index.html create mode 100644 bank_mini_program/jest.config.ts create mode 100644 bank_mini_program/package-lock.json create mode 100644 bank_mini_program/package.json create mode 100644 bank_mini_program/src/App.vue create mode 100644 bank_mini_program/src/components/AuthGuard.vue create mode 100644 bank_mini_program/src/components/common/ActionSheet.vue create mode 100644 bank_mini_program/src/components/common/EmptyState.vue create mode 100644 bank_mini_program/src/components/common/LoadingSpinner.vue create mode 100644 bank_mini_program/src/components/common/StatusTag.vue create mode 100644 bank_mini_program/src/components/common/__tests__/StatusTag.spec.ts create mode 100644 bank_mini_program/src/main.js create mode 100644 bank_mini_program/src/manifest.json create mode 100644 bank_mini_program/src/pages.json create mode 100644 bank_mini_program/src/pages/assets/assets.vue create mode 100644 bank_mini_program/src/pages/assets/detail.vue create mode 100644 bank_mini_program/src/pages/assets/monitor.vue create mode 100644 bank_mini_program/src/pages/customers/customers.vue create mode 100644 bank_mini_program/src/pages/dashboard/dashboard.vue create mode 100644 bank_mini_program/src/pages/index/index.vue create mode 100644 bank_mini_program/src/pages/login/login.vue create mode 100644 bank_mini_program/src/pages/reports/dashboard.vue create mode 100644 bank_mini_program/src/pages/reports/reports.vue create mode 100644 bank_mini_program/src/pages/risk/risk.vue create mode 100644 bank_mini_program/src/pages/transactions/detail.vue create mode 100644 bank_mini_program/src/pages/transactions/transactions.vue create mode 100644 bank_mini_program/src/static/images/default-avatar.png create mode 100644 bank_mini_program/src/static/images/default-avatar.svg create mode 100644 bank_mini_program/src/static/images/icon-assets.svg create mode 100644 bank_mini_program/src/static/images/icon-customers.svg create mode 100644 bank_mini_program/src/static/images/icon-risk.svg create mode 100644 bank_mini_program/src/static/images/icon-transactions.svg create mode 100644 bank_mini_program/src/store/app.js create mode 100644 bank_mini_program/src/store/index.js create mode 100644 bank_mini_program/src/store/user.js create mode 100644 bank_mini_program/src/styles/base.scss create mode 100644 bank_mini_program/src/styles/mixins.scss create mode 100644 bank_mini_program/src/styles/utilities.scss create mode 100644 bank_mini_program/src/styles/variables.scss create mode 100644 bank_mini_program/src/utils/auth.js create mode 100644 bank_mini_program/src/utils/permission.js create mode 100644 bank_mini_program/src/utils/request.js create mode 100644 bank_mini_program/tests/setup.ts create mode 100644 bank_mini_program/tests/utils/test-utils.ts create mode 100644 bank_mini_program/tsconfig.json create mode 100644 bank_mini_program/tsconfig.node.json create mode 100644 bank_mini_program/vite.config.js create mode 100644 bank_mini_program/vite.config.ts create mode 100644 docs/银行端小程序产品需求文档.md diff --git a/bank-backend/scripts/setup-bank-db.ps1 b/bank-backend/scripts/setup-bank-db.ps1 index 9e8b4e7..3022310 100644 --- a/bank-backend/scripts/setup-bank-db.ps1 +++ b/bank-backend/scripts/setup-bank-db.ps1 @@ -7,7 +7,7 @@ Param( [string]$AdminPlain = 'Admin123456' ) -Write-Host "Using DB: $Host:$Port/$Database" +Write-Host "Using DB: ${Host}:${Port}/${Database}" # 生成管理员 bcrypt 哈希 try { @@ -35,7 +35,7 @@ Set-Content -Path $tmp -Value $sql -Encoding UTF8 # 调用 mysql 客户端 try { $env:MYSQL_PWD = $Password - & mysql --host=$Host --port=$Port --user=$User --database=$Database --default-character-set=utf8mb4 --protocol=TCP < $tmp + Get-Content $tmp | mysql --host=$Host --port=$Port --user=$User --database=$Database --default-character-set=utf8mb4 --protocol=TCP if ($LASTEXITCODE -ne 0) { throw "mysql returned $LASTEXITCODE" } Write-Host "✅ Schema & seed executed successfully" } catch { diff --git a/bank_mini_program/.env.development b/bank_mini_program/.env.development new file mode 100644 index 0000000..2dc0794 --- /dev/null +++ b/bank_mini_program/.env.development @@ -0,0 +1,44 @@ +# 开发环境配置 +NODE_ENV=development + +# API 基础地址 +VUE_APP_API_BASE_URL=https://dev-api.bank.com/api/v1 + +# WebSocket 地址 +VUE_APP_WS_URL=wss://dev-ws.bank.com + +# 应用标题 +VUE_APP_TITLE=银行端资产监管系统(开发版) + +# 是否启用调试模式 +VUE_APP_DEBUG=true + +# 是否启用 Mock 数据 +VUE_APP_MOCK=true + +# 日志级别 +VUE_APP_LOG_LEVEL=debug + +# 加密密钥(开发环境) +VUE_APP_ENCRYPT_KEY=dev_encrypt_key_2023 + +# 微信小程序 AppID(开发版) +VUE_APP_WECHAT_APPID=wx1234567890abcdef + +# 百度地图 API Key(开发环境) +VUE_APP_BAIDU_MAP_KEY=dev_baidu_map_key + +# 上传文件大小限制(MB) +VUE_APP_UPLOAD_SIZE_LIMIT=10 + +# 分页默认大小 +VUE_APP_PAGE_SIZE=20 + +# 请求超时时间(毫秒) +VUE_APP_REQUEST_TIMEOUT=30000 + +# 是否启用性能监控 +VUE_APP_PERFORMANCE_MONITOR=true + +# 错误上报地址 +VUE_APP_ERROR_REPORT_URL=https://dev-error.bank.com/report \ No newline at end of file diff --git a/bank_mini_program/.env.production b/bank_mini_program/.env.production new file mode 100644 index 0000000..b9cc6cc --- /dev/null +++ b/bank_mini_program/.env.production @@ -0,0 +1,44 @@ +# 生产环境配置 +NODE_ENV=production + +# API 基础地址 +VUE_APP_API_BASE_URL=https://api.bank.com/api/v1 + +# WebSocket 地址 +VUE_APP_WS_URL=wss://ws.bank.com + +# 应用标题 +VUE_APP_TITLE=银行端资产监管系统 + +# 是否启用调试模式 +VUE_APP_DEBUG=false + +# 是否启用 Mock 数据 +VUE_APP_MOCK=false + +# 日志级别 +VUE_APP_LOG_LEVEL=error + +# 加密密钥(生产环境 - 请在部署时替换) +VUE_APP_ENCRYPT_KEY=prod_encrypt_key_2023_replace_me + +# 微信小程序 AppID(生产版) +VUE_APP_WECHAT_APPID=wxabcdef1234567890 + +# 百度地图 API Key(生产环境) +VUE_APP_BAIDU_MAP_KEY=prod_baidu_map_key + +# 上传文件大小限制(MB) +VUE_APP_UPLOAD_SIZE_LIMIT=50 + +# 分页默认大小 +VUE_APP_PAGE_SIZE=20 + +# 请求超时时间(毫秒) +VUE_APP_REQUEST_TIMEOUT=60000 + +# 是否启用性能监控 +VUE_APP_PERFORMANCE_MONITOR=true + +# 错误上报地址 +VUE_APP_ERROR_REPORT_URL=https://error.bank.com/report \ No newline at end of file diff --git a/bank_mini_program/.eslintrc.js b/bank_mini_program/.eslintrc.js new file mode 100644 index 0000000..100be27 --- /dev/null +++ b/bank_mini_program/.eslintrc.js @@ -0,0 +1,164 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + 'vue/setup-compiler-macros': true + }, + extends: [ + 'eslint:recommended', + '@vue/eslint-config-typescript', + 'plugin:vue/vue3-essential', + 'plugin:vue/vue3-strongly-recommended', + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended' + ], + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 'latest', + parser: '@typescript-eslint/parser', + sourceType: 'module' + }, + plugins: [ + 'vue', + '@typescript-eslint' + ], + rules: { + // Vue 规则 + 'vue/multi-word-component-names': 'off', + 'vue/no-v-html': 'off', + 'vue/require-default-prop': 'off', + 'vue/require-explicit-emits': 'off', + 'vue/html-self-closing': ['error', { + 'html': { + 'void': 'never', + 'normal': 'always', + 'component': 'always' + }, + 'svg': 'always', + 'math': 'always' + }], + 'vue/max-attributes-per-line': ['error', { + 'singleline': 3, + 'multiline': 1 + }], + 'vue/singleline-html-element-content-newline': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/html-closing-bracket-newline': ['error', { + 'singleline': 'never', + 'multiline': 'always' + }], + 'vue/html-indent': ['error', 2], + 'vue/script-indent': ['error', 2, { + 'baseIndent': 0, + 'switchCase': 1 + }], + + // TypeScript 规则 + '@typescript-eslint/no-unused-vars': ['error', { + 'argsIgnorePattern': '^_', + 'varsIgnorePattern': '^_' + }], + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + + // JavaScript 规则 + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-unused-vars': 'off', // 使用 TypeScript 版本 + 'prefer-const': 'error', + 'no-var': 'error', + 'object-shorthand': 'error', + 'prefer-template': 'error', + 'template-curly-spacing': 'error', + 'yield-star-spacing': 'error', + 'prefer-rest-params': 'error', + 'no-useless-escape': 'off', + 'no-prototype-builtins': 'off', + 'no-case-declarations': 'off', + + // 代码风格 + 'indent': ['error', 2, { + 'SwitchCase': 1, + 'VariableDeclarator': 1, + 'outerIIFEBody': 1, + 'MemberExpression': 1, + 'FunctionDeclaration': { 'parameters': 1, 'body': 1 }, + 'FunctionExpression': { 'parameters': 1, 'body': 1 }, + 'CallExpression': { 'arguments': 1 }, + 'ArrayExpression': 1, + 'ObjectExpression': 1, + 'ImportDeclaration': 1, + 'flatTernaryExpressions': false, + 'ignoreComments': false + }], + 'quotes': ['error', 'single', { 'avoidEscape': true }], + 'semi': ['error', 'never'], + 'comma-dangle': ['error', 'never'], + 'comma-spacing': ['error', { 'before': false, 'after': true }], + 'comma-style': ['error', 'last'], + 'key-spacing': ['error', { 'beforeColon': false, 'afterColon': true }], + 'keyword-spacing': ['error', { 'before': true, 'after': true }], + 'object-curly-spacing': ['error', 'always'], + 'array-bracket-spacing': ['error', 'never'], + 'space-before-blocks': ['error', 'always'], + 'space-before-function-paren': ['error', { + 'anonymous': 'always', + 'named': 'never', + 'asyncArrow': 'always' + }], + 'space-in-parens': ['error', 'never'], + 'space-infix-ops': 'error', + 'space-unary-ops': ['error', { 'words': true, 'nonwords': false }], + 'spaced-comment': ['error', 'always', { + 'line': { 'markers': ['*package', '!', '/', ',', '='] }, + 'block': { 'balanced': true, 'markers': ['*package', '!', ',', ':', '::', 'flow-include'], 'exceptions': ['*'] } + }], + 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }], + 'camelcase': ['error', { 'properties': 'never' }], + 'eol-last': 'error', + 'func-call-spacing': ['error', 'never'], + 'new-cap': ['error', { 'newIsCap': true, 'capIsNew': false }], + 'new-parens': 'error', + 'no-array-constructor': 'error', + 'no-mixed-spaces-and-tabs': 'error', + 'no-multiple-empty-lines': ['error', { 'max': 1, 'maxEOF': 0 }], + 'no-new-object': 'error', + 'no-tabs': 'error', + 'no-trailing-spaces': 'error', + 'no-whitespace-before-property': 'error', + 'padded-blocks': ['error', 'never'], + 'rest-spread-spacing': ['error', 'never'], + 'semi-spacing': ['error', { 'before': false, 'after': true }] + }, + globals: { + uni: 'readonly', + wx: 'readonly', + getCurrentPages: 'readonly', + getApp: 'readonly', + App: 'readonly', + Page: 'readonly', + Component: 'readonly', + Behavior: 'readonly', + plus: 'readonly' + }, + overrides: [ + { + files: ['*.vue'], + rules: { + 'indent': 'off' + } + }, + { + files: ['**/__tests__/**/*', '**/*.{test,spec}.*'], + env: { + jest: true + } + } + ] +} \ No newline at end of file diff --git a/bank_mini_program/CHANGELOG.md b/bank_mini_program/CHANGELOG.md new file mode 100644 index 0000000..960396e --- /dev/null +++ b/bank_mini_program/CHANGELOG.md @@ -0,0 +1,242 @@ +# 更新日志 + +本文档记录了银行端资产监管小程序的所有重要更改。 + +格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), +并且本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 + +## [未发布] + +### 新增 +- 初始化项目结构 +- 完成基础架构搭建 +- 实现用户认证功能 +- 添加资产管理模块 +- 实现监控中心功能 +- 完成数据报表模块 +- 添加个人中心页面 +- 实现通用组件库 +- 配置开发和构建环境 +- 添加单元测试框架 + +### 变更 +- 无 + +### 修复 +- 无 + +### 移除 +- 无 + +## [1.0.0] - 2024-01-20 + +### 新增 +- 🎉 项目初始化 +- 📱 基于 uni-app 的跨平台架构 +- 🔐 用户登录和认证系统 +- 📊 资产管理核心功能 +- 🔍 实时监控和预警系统 +- 📈 数据统计和报表分析 +- 🎨 响应式 UI 设计 +- 🛠️ 完整的开发工具链 +- 📝 TypeScript 类型支持 +- 🧪 单元测试框架 + +#### 功能模块 + +**认证模块** +- 用户登录/登出 +- 密码修改 +- 会话管理 +- 权限控制 + +**资产管理** +- 资产列表展示 +- 资产详情查看 +- 资产状态管理 +- 搜索和筛选功能 + +**监控中心** +- 实时数据监控 +- 预警信息管理 +- 设备状态监控 +- 异常事件处理 + +**数据报表** +- 统计数据展示 +- 可视化图表 +- 报表导出 +- 自定义时间范围 + +**个人中心** +- 用户信息管理 +- 系统设置 +- 消息通知 +- 帮助文档 + +#### 技术特性 + +**开发体验** +- 🚀 Vite 快速构建 +- 🔥 热重载开发 +- 📦 自动化打包 +- 🎯 TypeScript 支持 +- 🧹 ESLint 代码检查 +- 🎨 Prettier 代码格式化 + +**性能优化** +- 📱 响应式设计 +- ⚡ 懒加载 +- 🗜️ 代码分割 +- 🎯 按需加载 +- 💾 本地缓存 +- 🔄 请求优化 + +**用户体验** +- 🎨 现代化 UI 设计 +- 📱 移动端适配 +- 🔄 加载状态提示 +- 💫 流畅动画效果 +- 🎯 直观的操作流程 +- 📊 丰富的数据可视化 + +#### 组件库 + +**通用组件** +- LoadingSpinner - 加载动画组件 +- EmptyState - 空状态组件 +- StatusTag - 状态标签组件 +- ActionSheet - 操作面板组件 + +**业务组件** +- AssetCard - 资产卡片 +- MonitorChart - 监控图表 +- ReportTable - 报表表格 +- AlertList - 预警列表 + +#### 工具函数 + +**网络请求** +- HTTP 请求封装 +- 请求拦截器 +- 响应处理 +- 错误处理 + +**数据处理** +- 格式化工具 +- 验证工具 +- 加密工具 +- 存储工具 + +#### 配置文件 + +**环境配置** +- 开发环境配置 +- 生产环境配置 +- 测试环境配置 + +**构建配置** +- Vite 配置 +- TypeScript 配置 +- ESLint 配置 +- Jest 测试配置 + +### 技术栈 + +- **前端框架**: Vue 3.3+ with Composition API +- **开发框架**: uni-app 3.0+ +- **构建工具**: Vite 4.0+ +- **类型系统**: TypeScript 5.0+ +- **状态管理**: Pinia 2.0+ +- **样式预处理**: SCSS +- **网络请求**: Axios +- **图表库**: ECharts +- **工具库**: dayjs, lodash-es +- **加密库**: crypto-js +- **测试框架**: Jest + Vue Test Utils +- **代码规范**: ESLint + Prettier + +### 兼容性 + +- **微信小程序**: 支持 +- **H5**: 支持 +- **App**: 支持 (iOS/Android) +- **支付宝小程序**: 计划支持 +- **百度小程序**: 计划支持 + +### 浏览器支持 + +- Chrome >= 88 +- Firefox >= 85 +- Safari >= 14 +- Edge >= 88 +- 微信内置浏览器 +- 各平台小程序环境 + +--- + +## 版本说明 + +### 版本号规则 + +本项目采用语义化版本号 (Semantic Versioning): + +- **主版本号 (MAJOR)**: 不兼容的 API 修改 +- **次版本号 (MINOR)**: 向下兼容的功能性新增 +- **修订号 (PATCH)**: 向下兼容的问题修正 + +### 发布周期 + +- **主版本**: 根据重大功能更新发布 +- **次版本**: 每月发布一次 +- **修订版本**: 根据 bug 修复情况随时发布 + +### 维护策略 + +- 当前版本: 持续维护和更新 +- 前一个主版本: 提供 bug 修复支持 +- 更早版本: 不再维护 + +--- + +## 贡献指南 + +### 如何贡献 + +1. Fork 本仓库 +2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) +3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) +4. 推送到分支 (`git push origin feature/AmazingFeature`) +5. 打开 Pull Request + +### 提交信息规范 + +请使用以下格式提交代码: + +``` +(): + + + +