PROJECT_ARCHITECTURE_WIKI.md 48 KB

兴光微服务平台 (xg_total_process_master_cloud_vue) - 项目架构百科

项目名称: jeeplus-ui v1.6.3 (兴光微服务平台)
定位: 企业级 Vue3 前端管理系统,基于 Jeeplus 快速开发平台
核心能力: 工作流引擎 (Flowable)、动态表单、数据可视化、多租户、多微服务集成


一、项目概览

1.1 基本信息

属性
项目标识 jeeplus-ui v1.6.3
系统名称 兴光微服务平台
运行入口 index.html (主系统) / datav.html (数据大屏)
开发端口 2800
浏览器兼容 > 1%, last 2 versions, not dead

1.2 业务领域

本项目服务于 江苏兴光 集团,涵盖以下业务板块:

业务 说明
会计师事务所 (cw) 审计、财务管理
资产评估 (pg) 资产估价
中审众环 (zs) 审计业务
项目管理 (xm) 工程项目管理
培训咨询 (zx) 咨询服务

1.3 核心依赖一览

Vue 3.2.45           # 前端框架
Vue Router 4.1.5     # 路由管理
Vuex 4.0.2           # 状态管理
Element Plus 2.2.22  # UI 组件库
Vite 3.x             # 构建工具
Axios 0.26.1         # HTTP 客户端
ECharts 5.3.3        # 图表可视化
AntV/G2 4.1.1        # 数据可视化
VXE-Table 4.3.5      # 高级表格
DataV 2.10.0         # 数据大屏
Monaco Editor 0.34.1 # 代码编辑器
TinyMCE 5.10.2       # 富文本编辑器
WangEditor 5.1.23    # 轻量富文本
CropperJS 1.5.12     # 图片裁剪
Splitpanes 3.1       # 面板分割

二、技术栈全景图

┌─────────────────────────────────────────────────────────────┐
│                    浏览器 (Browser)                          │
├─────────────────────────────────────────────────────────────┤
│  入口HTML:  index.html (主系统)  │  datav.html (数据大屏)     │
├─────────────────────────────────────────────────────────────┤
│                    Vue 3.x (Composition API)                 │
├─────────────────────────────────────────────────────────────┤
│  Vue Router 4.x (Hash模式)  │  Vuex 4.x  │  Vue I18n 9.x    │
├─────────────────────────────────────────────────────────────┤
│  Element Plus 2.x  │  VXE-Table  │  ECharts  │  AVue  │ ... │
├─────────────────────────────────────────────────────────────┤
│  Jeeplus 三件套:  Devtools │ Flowable │ Form-Making          │
├─────────────────────────────────────────────────────────────┤
│                    Axios (HTTP Layer)                        │
├─────────────────────────────────────────────────────────────┤
│                Vite 3.x (Build & Dev Server)                 │
│        Proxy: /api → backend    /file-server → backend       │
├─────────────────────────────────────────────────────────────┤
│                    后端微服务集群                             │
│  auth │ system │ flowable │ file │ finance │ human │ ...    │
└─────────────────────────────────────────────────────────────┘

三、项目目录结构

xg_total_process_master_cloud_vue/
├── index.html                      # 主系统入口 HTML
├── datav.html                      # 数据大屏专用入口 HTML
├── vite.config.js                  # Vite 构建 & 代理配置
├── package.json                    # 依赖管理
├── .env.development                # 开发环境变量
├── .env.production                 # 生产环境变量
├── babel.config.js                 # Babel 配置
├── .eslintrc.js                    # ESLint 配置
│
├── public/                         # 静态资源 (不经过编译)
│   ├── datav/                      # 数据大屏静态资源
│   │   ├── cdn/                    # CDN 脚本 (echarts, html2canvas)
│   │   ├── css/                    # 大屏样式
│   │   ├── img/                    # 大屏图片
│   │   ├── components.js           # 大屏全局组件注册
│   │   └── config.js               # 大屏全局配置
│   ├── img/                        # 通用图片资源
│   ├── locales/                    # 静态国际化文件 (ru.js, zh.js)
│   └── favicon.ico
│
├── src/
│   ├── main.js                     # 【主系统入口】Vue 应用初始化
│   ├── App.vue                     # 【根组件】主题/语言/路由刷新
│   ├── components.js               # 【全局注册】组件/指令/图标注册
│   │
│   ├── api/                        # ★ API 接口层 (按微服务分包)
│   │   ├── AppPath.js              # ★ 微服务路由前缀定义 (14个微服务)
│   │   ├── index.js                # 自动聚合全部 API 模块
│   │   ├── auth/                   # 认证服务 (loginService)
│   │   ├── sys/                    # 系统管理 (28个服务文件)
│   │   ├── flowable/               # 工作流 (17个服务文件)
│   │   ├── cw/                     # 财务业务 (12个目录)
│   │   ├── human/                  # 人力资源 (3个目录)
│   │   ├── finance/                # 发票服务
│   │   ├── psi/                    # 进销存 (13个文件)
│   │   ├── program/                # 项目管理 (5个文件)
│   │   ├── ccpm/                   # 项目公司报销
│   │   ├── consultancy/            # 咨询公司报销
│   │   ├── devtools/               # 开发工具
│   │   ├── database/               # 数据库相关
│   │   ├── datav/                  # 大屏数据
│   │   ├── mail/                   # 邮件服务
│   │   ├── materialManagement/     # 物资管理
│   │   ├── monitor/                # 监控服务
│   │   ├── reports/                # 报表服务
│   │   ├── tools/                  # 工具服务
│   │   ├── wps/                    # WPS 集成
│   │   └── ...
│   │
│   ├── router/                     # ★ 路由系统
│   │   ├── index.js                # 【核心】路由实例 + 动态路由加载 + 导航守卫
│   │   ├── systemRouter.js         # 静态基础路由 (layout, login, 内嵌页面)
│   │   └── scrollBehavior.js       # 滚动行为记忆
│   │
│   ├── store/                      # ★ 状态管理 (Vuex)
│   │   ├── index.js                # 自动聚合 modules
│   │   ├── getters.js              # 全局 getters (isPrimaryTenant)
│   │   └── modules/
│   │       ├── global.js           # 全局状态 (布局/语言/租户/主题)
│   │       ├── user.js             # 用户信息
│   │       ├── viewTags.js         # 多标签页状态
│   │       ├── iframe.js           # iframe 内嵌页管理
│   │       └── keepAlive.js        # 组件缓存控制
│   │
│   ├── layout/                     # ★ 布局系统 (4种布局)
│   │   ├── index.vue               # 【核心】布局入口 (default/left/top/mix)
│   │   ├── components/
│   │   │   ├── userbar.vue         # 用户工具栏 (头像/待办/消息/设置)
│   │   │   ├── tags.vue            # 多标签页组件
│   │   │   ├── topbar.vue          # 顶部导航栏 (default 布局)
│   │   │   ├── topbar2.vue         # 面包屑导航 (left/top 布局)
│   │   │   ├── setting.vue         # 系统设置抽屉
│   │   │   ├── search.vue          # 全局搜索
│   │   │   ├── NavMenu.vue         # 侧边菜单 (递归)
│   │   │   ├── NavMenu2.vue        # 顶部菜单 (递归)
│   │   │   ├── sideM.vue           # 移动端侧边栏
│   │   │   └── iframeView.vue      # iframe 内嵌视图
│   │   └── other/
│   │       ├── 404.vue             # 404 页面
│   │       └── empty.vue           # 空组件 (用于 iframe 嵌入)
│   │
│   ├── views/                      # ★ 业务视图层
│   │   ├── sys/                    # 系统管理 (17个子模块)
│   │   ├── flowable/               # 工作流相关 (5个子模块)
│   │   ├── cw/                     # 财务业务 (12个子模块)
│   │   ├── datav/                  # 数据大屏页面
│   │   ├── gen/                    # 代码生成
│   │   ├── form/                   # 表单设计
│   │   ├── echarts/                # 图表管理
│   │   ├── dd/                     # 钉钉集成
│   │   ├── program/                # 项目
│   │   ├── psiManagement/          # 进销存管理
│   │   ├── materialManagement/     # 物资管理
│   │   ├── common/                 # 通用功能
│   │   └── ...
│   │
│   ├── datav/                      # ★ 数据大屏独立入口
│   │   ├── main.js                 # 大屏 Vue 应用初始化
│   │   ├── App.vue                 # 大屏根组件
│   │   ├── axios.js                # 大屏独立 HTTP 客户端
│   │   ├── router.js               # 大屏路由
│   │   ├── config.js               # 大屏配置
│   │   ├── components/             # 大屏组件
│   │   ├── echart/                 # 大屏图表
│   │   ├── page/                   # 大屏页面
│   │   ├── option/                 # 图表配置
│   │   ├── styles/                 # 大屏样式
│   │   └── utils/                  # 大屏工具
│   │
│   ├── components/                 # ★ 可复用业务组件
│   │   ├── upload/                 # 上传组件 (图片/文件)
│   │   ├── editor/                 # 富文本编辑器封装
│   │   ├── userSelect/             # 用户选择器 (多个变体)
│   │   ├── officeSelect/           # 部门选择器
│   │   ├── roleSelect/             # 角色选择器
│   │   ├── treeSelect/             # 树形选择器
│   │   ├── gridSelect/             # 表格选择器
│   │   ├── areaSelect/             # 区域选择器
│   │   ├── cropper/                # 图片裁剪
│   │   ├── iconSelect/             # 图标选择器
│   │   ├── statistic/              # 统计组件
│   │   └── vueEcharts/             # ECharts 封装
│   │
│   ├── utils/                      # ★ 工具函数库
│   │   ├── index.js                # 核心工具集 (hasPermission, treeDataTranslate, deepClone 等)
│   │   ├── tool.js                 # 基础工具 (localStorage, 日期, 加解密)
│   │   ├── httpRequest.js          # ★ Axios 封装 (拦截器/错误处理)
│   │   ├── dictUtils.js            # 字典工具 (数据字典读取/刷新)
│   │   ├── validate.js             # 基础验证函数库 (48个校验方法)
│   │   ├── validator.js            # Element Plus 表单验证器 (适配 validate)
│   │   ├── validateXG.js           # 兴光专用校验库
│   │   ├── validatorXG.js          # 兴光专用验证器
│   │   ├── common.js               # 通用业务工具 (GPS转换/深拷贝/格式化)
│   │   ├── businessInfo.js         # 业务主体信息 (公司名/税号)
│   │   ├── errorHandler.js         # 全局代码错误捕获
│   │   ├── filter.js               # 过滤器
│   │   ├── color.js                # 主题颜色工具
│   │   ├── print.js                # 打印工具
│   │   ├── useTabs.js              # 标签页 Hooks
│   │   └── icons.js                # 图标工具
│   │
│   ├── directives/                 # 自定义指令
│   │   ├── copy.js                 # v-copy 一键复制
│   │   ├── time.js                 # v-time 时间格式化
│   │   └── noMoreClick.js          # v-noMoreClick 防重复点击
│   │
│   ├── i18n/                       # 国际化
│   │   └── index.js                # 中/英/日三语支持
│   │
│   ├── config/                     # 全局配置
│   │   └── index.js                # 默认系统配置 (APP名称/Token/布局/主题)
│   │
│   ├── style/                      # 全局样式
│   │   ├── theme/                  # 暗色/亮色主题
│   │   ├── app.scss / fix.scss / media.scss / pages.scss
│   │   └── vxtable.scss
│   │
│   └── assets/                     # 编译态资源
│       ├── icons/                  # SVG 图标集 (550+个)
│       ├── fonts/                  # 字体文件
│       ├── img/                    # 图片资源
│       └── avue/                   # AVue 资源

四、路由配置体系

4.1 路由模式

  • 模式: createWebHashHistory() —— Hash 模式 (/#/path)
  • 目录自动发现: import.meta.glob("./../views/**/*.vue") 扫描全部视图文件

4.2 静态路由 (systemRouter.js)

// 预定义的固定路由,不依赖后端菜单数据
routes = [
  {
    name: "layout",
    path: "/",
    component: layout/index.vue,        // 布局容器
    redirect: DASHBOARD_URL,            // 默认跳转仪表盘
    children: [
      // 工作流内嵌表单 (TaskForm / TaskFormEdit / TaskFormDetail)
      // 动态表单展示 (GenerateList / GenerateChart / Preview)
      // UReport 报表 (iframe 嵌入)
      // 通用 iframe 嵌入
    ]
  },
  { path: "/login",  component: login.vue },      // 登录页
  { path: "/ddLogin", component: ddLogin.vue },    // 钉钉免登录
]

4.3 动态路由加载流程

用户登录成功
    │
    ▼
后端返回 MENU 数据 → 存入 localStorage("MENU")
    │
    ▼
router.beforeEach 守卫
    │
    ├─ 无 token → 重定向 /login
    ├─ 有 token & 路由未加载 → filterAsyncRouter(MENU) 转换菜单为路由
    │       │
    │       ├─ iframe 外部链接 → /i/{id} 路径 + empty 组件
    │       ├─ 普通页面 → views/ 目录自动匹配 .vue 文件
    │       └─ 空路径 → empty 组件
    │       │
    │       ▼
    │   flatAsyncRoutes() 扁平化并生成面包屑 breadcrumb
    │       │
    │       ▼
    │   router.addRoute("layout", route)  注册到 layout 子路由
    │
    ▼
isGetRouter = true  (路由已加载,后续不再重复)

4.4 导航守卫关键逻辑

场景 行为
访问 /login/ddlogin 重置路由,清除动态路由
无 Token 重定向到 /login
fullpage: true 路由 保留最后一级 matched (整页模式)
路由未加载 从 localStorage 读 MENU,动态注册路由
路由不匹配 (matched.length==0) 重新导航到完整路径

4.5 路由扁平化与面包屑

// flatAsyncRoutes 将嵌套路由树展平,并为每个路由生成 breadcrumb 数组
// 例如: /sys/user/list 的面包屑:
// [系统管理] → [用户管理] → [用户列表]

五、状态管理体系 (Vuex)

5.1 模块架构

store
├── global          # ★ 全局配置状态
│   ├── backlogCount     # 待办数量
│   ├── ismobile         # 是否移动端
│   ├── layout           # 布局类型 (default/left/top/mix/dock)
│   ├── menuIsCollapse   # 菜单折叠状态
│   ├── layoutTags       # 是否显示多标签
│   ├── toolbarTags      # 是否显示面包屑
│   ├── tenantList       # 租户列表
│   ├── language         # 当前语言 (zh/en/ja)
│   ├── appName          # 应用名称
│   └── languageMap      # 语言映射表
│
├── user            # ★ 用户信息
│   ├── id / name / loginName / no / photo
│   ├── office          # 所属部门
│   ├── company         # 所属公司
│   └── timer1/2/3      # 定时器引用
│
├── viewTags        # 多标签页
│   └── viewTags[]      # 已打开的标签数组
│
├── iframe          # iframe 内嵌页
│   └── iframeList[]    # iframe 页面栈
│
└── keepAlive       # 组件缓存
    ├── keepLiveRoute[]  # 需要缓存的组件列表
    ├── routeKey         # 当前路由 key
    └── routeShow        # 路由显示状态

5.2 数据持久化策略

  • localStorage (通过 tool.data):
    • TOKEN - 认证令牌
    • MENU - 用户菜单权限
    • PERMISSIONS - 按钮级权限列表
    • USER_INFO - 用户信息
    • DICT_LIST - 数据字典缓存
    • APP_LAYOUT / APP_LANG / APP_COLOR / APP_NAME / APP_THEME - 用户偏好
    • TENANT_LIST - 租户列表
  • sessionStorage (通过 tool.session): 会话级别临时数据
  • Cookie: Token 备份 (VueCookies)

六、API 请求封装与微服务交互规范

6.1 HTTP 客户端架构

httpRequest.js (axios 实例)
    │
    ├─ 请求拦截器 (request)
    │   ├─ 可选的 Loading 遮罩 (config.loading = true)
    │   ├─ 自动注入 Token: headers.token
    │   ├─ 自动注入域名: headers.domain
    │   ├─ URL 前缀处理: /api + config.url
    │   ├─ POST: qs.stringify 参数序列化
    │   └─ GET: paramsSerializer 参数序列化
    │
    └─ 响应拦截器 (response)
        ├─ 成功: 关闭 Loading,返回 response.data
        └─ 错误状态码处理:
            ├─ 408: 无权限 → 弹窗确认重新登录
            ├─ 401: Token 过期 → 清除登录信息 → 跳转登录
            ├─ 404: 路径找不到 → ElNotification 提示
            ├─ 503: 服务不可用 → ElNotification 提示
            ├─ 504: 网络连接错误 → ElNotification 提示
            ├─ 400: 请求失败 → ElNotification 提示
            └─ 其他: 系统错误 → ElNotification 提示

6.2 微服务路径定义 (AppPath.js)

// 14 个微服务路由前缀
export const AUTH_PATH           = "/auth-server"            // 认证服务
export const SYS_PATH            = "/system-server"          // 系统管理
export const FLOW_PATH           = "/flowable-server"        // 工作流引擎
export const DEVTOOLS_PATH       = "/devtools-server"        // 开发工具
export const FILE_PATH           = "/file-server"            // 文件服务
export const UREPORT_PATH        = "/ureport-server"         // 报表服务
export const WPS_PATH            = "/wps-server"             // WPS 集成
export const TEST_PATH           = "/test-server"            // 测试服务
export const ASSESS_PATH         = "/assess-server"          // 评估服务
export const FINANCE_PATH        = "/finance-server"         // 财务服务
export const PUBLIC_MODULES_PATH = "/public-modules-server"  // 公共模块
export const CENTRECAREFUL_PATH  = "/centrecareful-server"   // 中审服务
export const REGISTER_PATH       = "/human-server"           // 人力资源
export const CCPM_PATH           = "/ccpm-server"            // 项目公司
export const CONSULTANCY_PATH    = "/consultancy-server"     // 咨询公司
export const PSI_MANAGEMANT      = "/psi-management-server"  // 进销存系统

6.3 API 服务文件编写规范

每个 API 服务文件遵循统一模式:

// 以 loginService.js 为例
import request from "@/utils/httpRequest";
import { AUTH_PATH as prefix } from "../AppPath";

export default {
  // GET 请求 (查询)
  getCode: function () {
    return request({
      url: prefix + "/user/getCode",
      method: "get",
    });
  },

  // POST 请求 (提交)
  login: function (data) {
    return request({
      url: prefix + "/user/login",
      method: "post",
      data: data,
    });
  },

  // GET 请求 (带参数)
  queryById: function (id) {
    return request({
      url: prefix + "/user/queryById",
      method: "get",
      params: { id: id },
    });
  },

  // DELETE 请求
  delete: function (ids) {
    return request({
      url: prefix + "/user/delete",
      method: "delete",
      params: { ids: ids },
    });
  },

  // 文件下载 (blob)
  exportExcel: function (params) {
    return request({
      url: prefix + "/user/export",
      method: "get",
      params: params,
      responseType: "blob",
    });
  },
};

6.4 API 自动聚合机制

// src/api/index.js
const files = import.meta.globEager("./model/*.js");
// 注意: 实际扫描的是 src/api/ 下的各个子目录中的 *.js 文件
// 导出聚合对象: { loginService, userService, menuService, taskService, ... }

6.5 Vite 代理配置

开发环境:
  /api  →  http://localhost:8088  (后端网关)
  /file-server → http://localhost:8088/file-server

生产环境:
  /api  →  同域后端 (Nginx 反向代理)

6.6 实际请求 URL 示例

前端调用 微服务 最终请求路径
loginService.login() auth-server /api/auth-server/user/login
userService.list() system-server /api/system-server/sys/user/list
taskService.todoList() flowable-server /api/flowable-server/flowable/task/todo
menuService.treeData() system-server /api/system-server/sys/menu/treeData

七、权限控制体系

7.1 多层次权限架构

┌─────────────────────────────────────────────┐
│           路由级权限 (路由守卫)               │
│  未登录 → 拦截到 /login                      │
│  已登录 → 动态加载用户 MENU → 注册路由        │
├─────────────────────────────────────────────┤
│           菜单级权限 (MENU 数据)              │
│  后端返回菜单树 → layout 渲染可见菜单          │
│  filterUrl() 过滤 isShow !== "1" 的菜单       │
├─────────────────────────────────────────────┤
│           按钮级权限 (PERMISSIONS)            │
│  v-if="hasPermission('sys:user:add')"        │
│  hasPermission(permission) 函数检查           │
└─────────────────────────────────────────────┘

7.2 权限数据流

用户登录
    │
    ▼
POST /auth-server/user/login
    │
    ▼
后端返回: { token, user, permissions[], menus[] }
    │
    ├─ token         → localStorage("token")
    ├─ user          → localStorage("USER_INFO")
    ├─ permissions[] → localStorage("PERMISSIONS")  ← 按钮级权限
    └─ menus[]       → localStorage("MENU")          ← 菜单+路由权限

7.3 按钮级权限实现

// src/utils/index.js
export function hasPermission(permission) {
  let permissions = tool.data.get("PERMISSIONS");
  if (!permissions) return false;
  return permissions.includes(permission);
}

// 全局注入
app.config.globalProperties.hasPermission = hasPermission;

// 模板中使用
<el-button v-if="hasPermission('sys:user:add')">新增</el-button>

7.4 菜单权限过滤

// layout/index.vue
filterUrl(map) {
  var newMap = [];
  map && map.forEach((item) => {
    // 隐藏项 (isShow !== "1") 不渲染
    if (item.meta.isShow !== "1") return false;
    // iframe 链接重写路径
    if (item.meta.target == "iframe") {
      item.path = `/i/${item.meta.id}`;
    }
    // 递归过滤子菜单
    if (item.children && item.children.length > 0) {
      item.children = this.filterUrl(item.children);
    }
    newMap.push(item);
  });
  return newMap;
}

7.5 角色权限检查

// userService 提供多种角色检查 API:
is()        // 是否管理员 (isAdmin)
isKjsz()    // 是否科技所长
isZj()      // 是否总局
isSs()      // 是否所长
isDgsbxBmzr() // 是否部门主任
isSzZyx()   // 是否所长/专业线
isZjbry()   // 是否总局办人员
isBggdgly() // 是否报告归档管理员

八、组件分层架构

8.1 组件分层图

┌──────────────────────────────────────────────────────┐
│                    Page Views (业务页面)              │
│  views/sys/*, views/flowable/*, views/cw/*, ...      │
├──────────────────────────────────────────────────────┤
│   Layout Components (布局组件)                        │
│   layout/index.vue (4种布局) + 10个子组件              │
├──────────────────────────────────────────────────────┤
│   Business Components (业务组件)                      │
│   userSelect, officeSelect, roleSelect, treeSelect... │
├──────────────────────────────────────────────────────┤
│   Base Components (基础组件)                          │
│   upload/*, editor/*, cropper, vueDialog, vueEcharts  │
├──────────────────────────────────────────────────────┤
│   UI Framework (Element Plus + AVue + VXE-Table)      │
└──────────────────────────────────────────────────────┘

8.2 布局系统详解

布局 特征 适用场景
default 左侧一二级菜单分离 + 顶部用户栏 + 标签页 标准后台
left 左侧单级完整菜单 + 顶部用户栏 + 标签页 简单导航
top 顶部水平菜单 + 标签页 宽屏展示
mix 顶部一级菜单 + 左侧二级菜单 (混合模式) 复杂导航
dock 功能坞模式 (关闭标签和面包屑) 沉浸式操作

8.3 关键布局组件

组件 职责
userbar.vue 用户头像/消息/待办/退出/设置入口
tags.vue 多标签页管理 (打开/关闭/刷新/右键菜单)
setting.vue 系统设置抽屉 (布局/主题/语言/标签)
NavMenu.vue 侧边菜单递归组件
NavMenu2.vue 顶部菜单递归组件
iframeView.vue iframe 页面管理 (加载/关闭/刷新)

8.4 业务组件分类

组件类别 包含组件 说明
用户选择 userSelect, userSelect2, userSelectAll, userSelectButton, userSelectV2, userSelectKjXmPg 多场景用户选人
组织选择 officeSelect, roleSelect, postSelect, areaSelect 组织架构选择
数据选择 treeSelect, gridSelect, iconSelect 数据展示型选择
上传 ImageSelect, ImageUpload, FileUpload 文件/图片上传封装
编辑器 editor/* (Monaco/TinyMCE/WangEditor) 编辑器封装
弹窗 vueDialog 通用对话框

8.5 Keep-Alive 组件缓存策略

// keepAlive.js store模块
keepLiveRoute: [],  // 需要保持活性的路由组件名列表
// 配合 <router-view> + <keep-alive> 使用
// 关闭标签时从 keepLiveRoute 移除对应组件

九、后端微服务交互全景

9.1 微服务调用关系图

┌────────────────────────────────────────────────────────────┐
│                    前端 (Vue3 SPA)                          │
│                   /api → 后端网关                            │
└──────────────────────┬─────────────────────────────────────┘
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│  auth-server │ │  system  │ │  flowable    │
│  认证/登录    │ │  -server │ │  -server     │
│  /auth-server│ │  系统管理 │ │  工作流引擎   │
└──────────────┘ └──────────┘ └──────────────┘
        │              │              │
        ▼              ▼              ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│  file-server │ │ human    │ │  finance     │
│  文件管理     │ │  -server │ │  -server     │
│  /file-server│ │  人力资源 │ │  财务/发票    │
└──────────────┘ └──────────┘ └──────────────┘
        │              │              │
        ▼              ▼              ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│  ccpm-server │ │consultancy│ │    psi       │
│  项目公司     │ │ -server  │ │  management  │
│  (报销)      │ │ 咨询公司  │ │  -server     │
└──────────────┘ └──────────┘ └──────────────┘
        │              │              │
        ▼              ▼              ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ devtools     │ │   wps    │ │  public      │
│  -server     │ │  -server │ │  modules     │
│  开发工具     │ │  WPS集成 │ │  公共模块     │
└──────────────┘ └──────────┘ └──────────────┘

9.2 微服务清单与职责

微服务 前缀路径 职责 API 文件数
auth-server /auth-server 登录认证、Token 管理、验证码、单点登录 1 (loginService)
system-server /system-server 用户/角色/菜单/部门/岗位/字典/日志/配置/租户 28
flowable-server /flowable-server 工作流引擎 (模型/流程/任务/表单/监听器) 17
file-server /file-server 文件上传/下载/管理 通过 sys/fileService
finance-server /finance-server 发票管理、财务单据 2 (invoice)
human-server /human-server 人力资源 (花名册/薪酬/考勤) 3
ccpm-server /ccpm-server 项目公司报销管理 3
consultancy-server /consultancy-server 咨询公司报销管理 3
centrecareful-server /centrecareful-server 中审众环业务 3
psi-management-server /psi-management-server 进销存系统 13
devtools-server /devtools-server 代码生成、开发辅助 9
wps-server /wps-server WPS 文档在线编辑 2
ureport-server /ureport-server UReport 报表引擎 iframe嵌入
test-server /test-server 测试模块 12
mail-server /mail-server 邮件收发 3
public-modules-server /public-modules-server 公共业务模块 1
assess-server /assess-server 资产评估 未直接使用

9.3 跨微服务调用示例

// loginService.js - 一个服务内调用两个微服务
import { AUTH_PATH as prefix } from "../AppPath";      // auth-server
import { SYS_PATH as sysPrefix } from "../AppPath";     // system-server

export default {
  login(data) {
    return request({ url: prefix + "/user/login", ... });     // → auth-server
  },
  getPhoneCode(loginForm) {
    return request({ url: sysPrefix + "/sys/user/getPhoneCode", ... }); // → system-server
  },
};

十、登录认证流程

10.1 完整登录链路

用户进入系统
    │
    ▼
router.beforeEach → 检查 token
    │
    ├─ 无 token → /login 页面
    │     │
    │     ▼
    │   输入用户名/密码/验证码
    │     │
    │     ▼
    │   loginService.login(data)  →  POST /auth-server/user/login
    │     │
    │     ▼
    │   后端返回: { token, user, permissions[], menus[] }
    │     │
    │     ▼
    │   存储到 localStorage: TOKEN, USER_INFO, PERMISSIONS, MENU
    │     │
    │     ▼
    │   跳转 DASHBOARD_URL (/dashboard/index)
    │
    └─ 有 token → 加载动态路由 → 进入主界面

10.2 登录方式

方式 接口 文件
用户名密码登录 /auth-server/user/login loginService.js
手机验证码登录 /system-server/sys/user/getPhoneCode + /system-server/sys/user/saveNewPassword 同上
钉钉免登录 /auth-server/user/sys/ddLogin 同上 + ddLogin.vue
CAS 单点登录 VITE_APP_CAS_SERVER 配置 环境变量

10.3 退出登录

用户点击退出
    │
    ▼
loginService.logout() → GET /auth-server/user/logout
    │
    ▼
清除: localStorage, cookies, sessionStorage
    │
    ▼
清除: Vuex 状态, 定时器, 动态路由
    │
    ▼
router.push("/login")

十一、数据大屏 (DataV) 子系统

11.1 独立入口

  • HTML: datav.html
  • 主 JS: src/datav/main.js
  • 独立路由: src/datav/router.js
  • 独立 HTTP: src/datav/axios.js
  • 独立组件: src/datav/page/, src/datav/components/

11.2 与主系统的区别

特性 主系统 数据大屏
Vuex 使用 不适用 (独立状态)
Element Plus 完整使用 用于基础组件
AVue 不直接使用 核心框架 (avue-draggable)
DataV 组件级使用 完整大屏展示
ECharts 组件级 CDN 加载 (5.4.0)
路由 Hash 模式 独立的 Hash 路由
构建 Vite 多入口 独立打包输出

十二、国际化 (i18n)

12.1 语言支持

语言 标识 使用场景
简体中文 zh 默认语言
English en 英文界面
日本語 ja 日文界面

12.2 实现机制

  • 框架: vue-i18n 9.x
  • 语言包: 静态语言 (VXE-Table 内置) + 动态语言映射 (从后端 languageService.getLanguageMap() 获取)
  • 存储: localStorage("APP_LANG")
  • 切换: $store.commit("updateLanguage", lang) → 全局响应式更新
  • 翻译函数: $t2(code) — 从 languageMap 中按 {code}_{language} 键查找

十三、主题系统

13.1 主题配置

配置项 存储 Key 说明
主题颜色 APP_COLOR 主色调 (默认 #2d8cf0)
暗色/亮色 APP_THEME dark / white
布局类型 APP_LAYOUT default / left / top / mix

13.2 主题切换流程

// App.vue created()
const app_color = this.$TOOL.data.get("APP_COLOR") || this.$CONFIG.COLOR;
colorTool.setAppColors(app_color);  // 动态设置 CSS 变量

// HTML body 属性
document.body.setAttribute('data-theme', theme);    // dark/white
document.body.setAttribute('data-layout', layout);  // default/left/top/mix

十四、构建与部署

14.1 构建配置

// vite.config.js
{
  base: './',                    // 相对路径 (方便部署到任意子目录)
  resolve: {
    alias: {
      '~': './',                // 根路径别名
      '@': './src'              // src 别名
    }
  },
  build: {
    rollupOptions: {
      input: {                   // 多入口构建
        index: 'index.html',     // 主系统
        datav: 'datav.html'      // 数据大屏
      }
    }
  },
  server: {
    port: 2800,
    proxy: {
      '/api': { target: VITE_APP_BASE, ... },
      '/file-server': { target: VITE_APP_BASE, ... }
    }
  }
}

14.2 环境变量

变量 开发环境 生产环境 说明
VITE_APP_ENV development production 环境标识
VITE_APP_API /api `` API 前缀
VITE_APP_BASE http://localhost:8088 /api 后端地址
VITE_APP_SSO_LOGIN false false 单点登录开关
VITE_APP_CAS_SERVER CAS 地址 CAS 地址 CAS 服务地址

14.3 可用命令

npm run dev       # 开发模式 (端口 2800)
npm run build     # 生产构建 (最大 8GB 内存)
npm run preview   # 预览构建结果

十五、数据字典机制

15.1 字典缓存策略

// 应用启动时或手动调用 refreshDictList()
dictService.getDictMap()                          // GET /system-server/sys/dict/getDictMap
    │
    ▼
tool.data.set("DICT_LIST", data)                 // 存入 localStorage

// 使用时:
getDictLabel(type, value)   // 根据字典类型+值 → 获取中文标签
getDictValue(type, label)   // 根据字典类型+标签 → 获取值
getDictList(type)           // 获取指定类型的全部字典项

15.2 字典使用场景

<!-- 表格列中转换 -->
<el-table-column prop="status" label="状态">
  <template #default="{ row }">
    {{ $dictUtils.getDictLabel('sys_status', row.status) }}
  </template>
</el-table-column>

十六、关键工具函数索引

函数 文件 说明
hasPermission(perm) utils/index.js 按钮级权限判断
treeDataTranslate(data) utils/index.js 扁平数据 → 树形结构
recover(target, source) utils/index.js 表单对象属性覆盖赋值
recoverNotNull(target, source) utils/index.js 非空属性覆盖
deepClone(data) utils/index.js 对象深拷贝
validatenull(val) utils/index.js 空值判断 (含数组/对象)
downloadExcel(data, name) utils/index.js Blob 文件下载
t2(code) utils/index.js 动态国际化翻译
tool.data.get/set/remove utils/tool.js localStorage 读写 (JSON 序列化)
tool.crypto.MD5/AES/BASE64 utils/tool.js 加解密 (CryptoJS)
tool.dateFormat(date) utils/tool.js 日期格式化
getDictLabel(type, val) utils/dictUtils.js 字典值转标签

十七、自定义指令

指令 文件 功能
v-copy directives/copy.js 一键复制文本到剪贴板
v-time directives/time.js 时间格式化显示
v-noMoreClick directives/noMoreClick.js 防重复点击 (2秒禁用)

十八、配置文件参考

18.1 默认系统配置 (config/index.js)

{
  APP_NAME: "兴光微服务平台",
  DASHBOARD_URL: "/dashboard/index",
  API_URL: "/api",
  TIMEOUT: 10000,
  TOKEN: "token",
  LAYOUT: "default",          // default | header | menu | dock
  THEME: "dark",
  COLOR: "#2d8cf0",
  MENU_IS_COLLAPSE: false,
  MENU_UNIQUE_OPENED: true,   // 手风琴菜单
  LAYOUT_TAGS: true,          // 多标签
  TOOLBAR_TAGS: true,         // 面包屑
  LANG: "zh-cn",
}

18.2 全局组件注册 (components.js)

注册方式 名称 类型
app.component QuillEditor 富文本编辑器
app.component ImageSelect 图片选择
app.component ImageUpload 图片上传
app.component FileUpload 文件上传
app.component v-dialog 通用对话框
app.component v-chart ECharts 图表
app.component ElIcon* (全部) Element Plus 图标
app.component svg-* (550+) 自定义 SVG 图标
app.directive time 时间指令
app.directive copy 复制指令
app.directive noMoreClick 防重复点击指令
app.config.globalProperties $CONFIG 系统配置
app.config.globalProperties $TOOL 工具对象
app.config.globalProperties $http HTTP 客户端
app.config.globalProperties $utils 工具函数集
app.config.globalProperties $dictUtils 字典工具
app.config.globalProperties hasPermission 权限判断
app.config.globalProperties validator / validate 表单校验器
app.config.globalProperties validatorXG / validateXG 兴光专用校验器
app.config.globalProperties $cookies Cookie 操作

十九、项目技术债务与注意事项

19.1 已知问题

  1. 双重入口: 主系统和数据大屏各自独立的项目结构,维护成本较高
  2. localStorage 依赖: 大量核心数据(菜单、权限、用户信息)都存储在 localStorage,存在 XSS 风险
  3. API 索引未实际使用: src/api/index.js 扫描路径写的是 ./model/*.js,但实际项目 API 文件在子目录下直接使用
  4. jQuery 依赖: package.json 中包含 jQuery,但 Vue3 项目中基本不应使用
  5. 已注释的功能: Dify 聊天机器人、全局错误捕获等被注释掉

19.2 改进建议

  1. 考虑将数据大屏合并到主系统作为子路由
  2. 敏感数据(Token)建议使用 httpOnly Cookie 替代 localStorage
  3. 建议统一 API 模块的导入方式
  4. 清理未使用的依赖(jQuery, mockjs 等)

二十、文件快速索引

关键文件 路径 说明
应用入口 src/main.js Vue 应用初始化,全局注册
根组件 src/App.vue 主题/语言/路由刷新控制
全局注册 src/components.js 组件/指令/图标全局注册
路由核心 src/router/index.js Hash路由 + 动态加载 + 守卫
静态路由 src/router/systemRouter.js 基础路由定义
布局入口 src/layout/index.vue 4种布局系统
HTTP 封装 src/utils/httpRequest.js Axios 拦截器/错误处理
微服务路径 src/api/AppPath.js 14个微服务前缀定义
工具集 src/utils/index.js 核心工具函数
基础工具 src/utils/tool.js localStorage/加解密/日期
字典工具 src/utils/dictUtils.js 数据字典操作
表单校验 src/utils/validate.js 48个基础校验方法
系统配置 src/config/index.js 默认系统参数
构建配置 vite.config.js Vite + 代理 + 多入口
环境变量 .env.development 开发环境变量
大屏入口 src/datav/main.js 数据大屏独立应用
登录 API src/api/auth/loginService.js 认证接口
用户 API src/api/sys/userService.js 用户管理接口 (284行)
工作流API src/api/flowable/taskService.js 工作流任务接口
国际化 src/i18n/index.js 中/英/日三语
用户工具栏 src/layout/components/userbar.vue 用户菜单/待办/消息

生成时间: 2026-06-01
分析方式: 完整源码索引 + 架构推理
覆盖范围: 全部核心模块 (路由/状态/API/权限/布局/组件/工具/国际化/构建)