Ver Fonte

整理 AI 需要识别的项目结构文档

lichunlei há 6 dias atrás
pai
commit
c82027215e
90 ficheiros alterados com 1681 adições e 92 exclusões
  1. 228 0
      AGENTS.md
  2. 74 0
      BackEnd/.editorconfig
  3. 11 6
      BackEnd/OmegaAdmin/Controllers/Admin/SysDictController.cs
  4. 13 7
      BackEnd/OmegaAdmin/Controllers/Admin/SysDictItemController.cs
  5. 11 6
      BackEnd/OmegaAdmin/Controllers/Admin/SysLogController.cs
  6. 11 6
      BackEnd/OmegaAdmin/Controllers/Admin/SysPublicParamController.cs
  7. 8 2
      BackEnd/OmegaAdmin/Controllers/Base/BaseController.cs
  8. 14 2
      BackEnd/OmegaAdmin/Controllers/Base/HomeController.cs
  9. 16 2
      BackEnd/OmegaAdmin/Controllers/Base/SysDeptController.cs
  10. 14 3
      BackEnd/OmegaAdmin/Controllers/Base/SysLoginController.cs
  11. 11 0
      BackEnd/OmegaAdmin/Controllers/Base/SysMenuController.cs
  12. 9 0
      BackEnd/OmegaAdmin/Controllers/Base/SysPostController.cs
  13. 12 0
      BackEnd/OmegaAdmin/Controllers/Base/SysRoleController.cs
  14. 14 1
      BackEnd/OmegaAdmin/Controllers/Base/SysUserController.cs
  15. 7 0
      BackEnd/OmegaAdmin/Controllers/Base/SysUserRoleController.cs
  16. 11 0
      BackEnd/OmegaAdmin/Controllers/Feign/SysMenuController.cs
  17. 17 3
      BackEnd/OmegaAdmin/Controllers/Feign/VsCodeController.cs
  18. 3 2
      BackEnd/OmegaAdmin/Model/Base/ApiResult.cs
  19. 1 0
      BackEnd/OmegaAdmin/Model/Base/SysBase.cs
  20. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysCity.cs
  21. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysDept.cs
  22. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysDict.cs
  23. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysDictItem.cs
  24. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysFile.cs
  25. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysLog.cs
  26. 7 7
      BackEnd/OmegaAdmin/Model/Base/SysMenu.cs
  27. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysOauthClientDetails.cs
  28. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysParam.cs
  29. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysPost.cs
  30. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysPublicParam.cs
  31. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysRole.cs
  32. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysRoleMenu.cs
  33. 5 3
      BackEnd/OmegaAdmin/Model/Base/SysUser.cs
  34. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysUserPost.cs
  35. 1 1
      BackEnd/OmegaAdmin/Model/Base/SysUserRole.cs
  36. 3 1
      BackEnd/OmegaAdmin/Model/Dto/Base/AddMenuFromApiDto.cs
  37. 4 2
      BackEnd/OmegaAdmin/Model/Dto/Base/MenuDto.cs
  38. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Base/RoleMenuExportDto.cs
  39. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Base/RoleUserDto.cs
  40. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Client/ApiGroupListDto.cs
  41. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Client/AppAppBottomNavsDto.cs
  42. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Client/AppPageInfoDto.cs
  43. 1 0
      BackEnd/OmegaAdmin/Model/Dto/Client/AppStaticFilesDto.cs
  44. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictAddDto.cs
  45. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictItemAddDto.cs
  46. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictItemListDto.cs
  47. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictItemQueryDto.cs
  48. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictItemUpdateDto.cs
  49. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictListDto.cs
  50. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictQueryDto.cs
  51. 1 0
      BackEnd/OmegaAdmin/Model/Dto/SysDictUpdateDto.cs
  52. 1 1
      BackEnd/OmegaAdmin/Model/Exception/CustomException.cs
  53. 2 1
      BackEnd/OmegaAdmin/Model/Vo/Base/LeftMenuVo.cs
  54. 1 0
      BackEnd/OmegaAdmin/Model/Vo/Base/RouterVo.cs
  55. 2 1
      BackEnd/OmegaAdmin/Model/Vo/Base/TreeSelectVo.cs
  56. 1 0
      BackEnd/OmegaAdmin/Model/Vo/Base/TreeVo.cs
  57. 2 2
      BackEnd/OmegaAdmin/Services/Base/CacheService.cs
  58. 1 1
      BackEnd/OmegaAdmin/Services/Base/IService/IBaseService.cs
  59. 2 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysDeptService.cs
  60. 2 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysLoginService.cs
  61. 2 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysMenuService.cs
  62. 1 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysRoleService.cs
  63. 1 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysUserRoleService.cs
  64. 2 0
      BackEnd/OmegaAdmin/Services/Base/IService/ISysUserService.cs
  65. 6 0
      BackEnd/OmegaAdmin/Services/Base/SysDeptService.cs
  66. 16 3
      BackEnd/OmegaAdmin/Services/Base/SysLoginService.cs
  67. 10 2
      BackEnd/OmegaAdmin/Services/Base/SysMenuService.cs
  68. 6 0
      BackEnd/OmegaAdmin/Services/Base/SysOauthClientDetailsService.cs
  69. 5 0
      BackEnd/OmegaAdmin/Services/Base/SysPermissionService.cs
  70. 2 0
      BackEnd/OmegaAdmin/Services/Base/SysPostService.cs
  71. 2 0
      BackEnd/OmegaAdmin/Services/Base/SysRoleMenuService.cs
  72. 9 2
      BackEnd/OmegaAdmin/Services/Base/SysRoleService.cs
  73. 2 0
      BackEnd/OmegaAdmin/Services/Base/SysUserPostService.cs
  74. 5 0
      BackEnd/OmegaAdmin/Services/Base/SysUserRoleService.cs
  75. 13 2
      BackEnd/OmegaAdmin/Services/Base/SysUserService.cs
  76. 5 2
      BackEnd/OmegaAdmin/Services/IService/ISysDictItemService.cs
  77. 3 1
      BackEnd/OmegaAdmin/Services/IService/ISysDictService.cs
  78. 3 1
      BackEnd/OmegaAdmin/Services/IService/ISysLogService.cs
  79. 3 1
      BackEnd/OmegaAdmin/Services/IService/ISysPublicParamService.cs
  80. 8 2
      BackEnd/OmegaAdmin/Services/SysDictItemService.cs
  81. 6 1
      BackEnd/OmegaAdmin/Services/SysDictService.cs
  82. 6 1
      BackEnd/OmegaAdmin/Services/SysLogService.cs
  83. 6 1
      BackEnd/OmegaAdmin/Services/SysPublicParamService.cs
  84. 534 0
      PROJECT_SPEC.md
  85. 22 0
      samples/ISampleService.cs
  86. 174 0
      samples/Sample.cs
  87. 108 0
      samples/SampleController.cs
  88. 65 0
      samples/SampleDto.cs
  89. 44 0
      samples/SampleService.cs
  90. 66 0
      samples/SampleVo.cs

+ 228 - 0
AGENTS.md

@@ -0,0 +1,228 @@
+# AGENTS.md
+
+本文件为 AI 编码助手提供本仓库(OmegaAi)的项目背景、技术栈、架构约定、接口调用约定与常见任务速查,帮助在修改代码时保持正确性与一致性。
+
+> **完整项目目录结构、编码规范统一维护在 [PROJECT_SPEC.md](./PROJECT_SPEC.md)**,本文件不再重复存放。
+
+---
+
+## 1. 项目概览
+
+OmegaAi 是一个**低代码 / 微服务后端管理系统**,采用 **Monorepo** 结构,包含两大模块:
+
+| 目录 | 说明 |
+| --- | --- |
+| `AdminFrontEnd/` | 后台管理系统前端(Vue 3 + TypeScript + Rsbuild) |
+| `BackEnd/` | 后端微服务项目(.NET 7,共 9 个服务) |
+
+前端通过 `OmegaGateway` 网关访问各个微服务;前后端通过 **Nacos 服务发现 + URL 字典映射** 的方式约定接口调用(见下文「前后端接口调用约定」)。
+
+---
+
+## 2. 仓库结构
+
+OmegaAi 采用 **Monorepo** 结构,包含两大模块:
+
+| 目录 | 说明 |
+| --- | --- |
+| `AdminFrontEnd/` | 后台管理系统前端(Vue 3 + TypeScript + Rsbuild) |
+| `BackEnd/` | 后端微服务项目(.NET 7,共 9 个服务) |
+
+> 完整目录结构(前端各目录职责、9 个后端服务明细与通用服务骨架)见 [PROJECT_SPEC.md §1](./PROJECT_SPEC.md#1-完整项目目录结构)。
+
+---
+
+## 3. 技术栈
+
+### 3.1 前端(AdminFrontEnd)
+
+| 类别 | 技术 |
+| --- | --- |
+| 框架 | Vue 3.5(Composition API + `<script setup>`)、TypeScript ~5.8 |
+| 构建 | Rsbuild 2(rsbuild.config.ts,dev 端口 **9906**)、Rspack |
+| 包管理 | **pnpm**(pnpm@10.33.0),Node `^20.19 || ^22.13 || >=24` |
+| UI 库 | Element Plus 2.13、vue-element-plus-x、Tailwind CSS 4 |
+| 状态 | Pinia 3 + `pinia-plugin-persistedstate`(zipson 序列化 + secure-ls 加密存储) |
+| 路由 | vue-router 4(**Hash 模式**),动态路由由后端菜单生成 |
+| 请求 | 自定义 fetch 封装(`src/utils/http/request.ts`),支持请求合并/缓存/取消/响应缓存 |
+| 组件 | unplugin-auto-import、unplugin-vue-components、unplugin-icons 自动引入 |
+| 其他 | echarts(图表)、@vue-flow(流程图)、codemirror(代码编辑器)、json-render(动态渲染)、dayjs、write-excel-file(导出) |
+| 代码规范 | ESLint(eslint.config.mjs)+ Prettier + Stylelint;`pnpm lint` / `pnpm format` / `pnpm type:check` |
+
+### 3.2 后端(BackEnd)
+
+| 类别 | 技术 |
+| --- | --- |
+| 框架 | **.NET 7** / ASP.NET Core Web API(net7.0,可空启用、隐式 using) |
+| ORM | SqlSugar(SqlSugarCoreNoDrive 5.1.4.136 + SqlSugar.IOC),多数据源、支持 MySQL/PostgreSQL(Npgsql) |
+| DI / 自动注册 | **SummerBoot**(`AppServiceAttribute` 标注的服务自动注入) |
+| 配置中心 / 注册发现 | **Nacos**(nacos-sdk-csharp,NacosConfig 配置,DataId `omega`) |
+| API 网关 | **OmegaGateway**:YARP Reverse Proxy + Nacos 服务发现,动态同步路由(RefreshYarp,60s 刷新) |
+| 认证授权 | JWT(JwtUtil)、`AuthorizationFilter` / `VerifyAttribute` / `ActionPermissionFilter`(权限点) |
+| 缓存 | CSRedisCore(RedisServer / CacheHelper),按 `RedisServer:open` 开关 |
+| 日志 | NLog(SQL 日志按读写分级:SELECT→Info、UPDATE/INSERT→Warn、DELETE→Error) |
+| 限流 | AspNetCoreRateLimit + IPRate(iprate.json,`AddIPRate`) |
+| 对象映射 | Mapster(`Adapt<>`) |
+| 文件存储 | 阿里云 OSS(本地 DLL 引用 `DLL/Aliyun.OSS.dll`) |
+| 其他 | MiniExcel(导入导出)、ThoughtWorks.QRCode(二维码)、UAParser(UA 解析)、IPTools.China |
+| 序列化 | System.Text.Json:CamelCase 属性命名策略、DateTime 自定义转换器、StringConverter |
+
+---
+
+## 4. 前端架构(AdminFrontEnd)
+
+### 4.1 启动与脚本(package.json)
+
+```bash
+pnpm install        # 安装依赖(pnpm-lock.yaml)
+pnpm dev            # 开发环境,端口 9906
+pnpm build          # 生产构建
+pnpm build:test     # 测试环境构建(--env-mode test)
+pnpm preview        # 预览构建产物
+pnpm lint           # ESLint + Stylelint
+pnpm format         # Prettier 格式化
+pnpm type:check     # vue-tsc 类型检查
+pnpm check          # lint + format:check
+```
+
+### 4.2 环境变量(.env 系列)
+
+| 变量 | 说明 |
+| --- | --- |
+| `VUE_APP_TITLE` | 站点标题 |
+| `VUE_APP_CONFIG_API` | 配置中心/网关接口地址(开发为 test 网关,生产为正式网关) |
+| `VUE_APP_STORAGE_ENCRYPT_KEY` | 本地存储加密 key |
+| `VUE_APP_IS_MOCK` / `VUE_APP_MOCK_API` | 是否开启 mock(apifox)及地址 |
+| `VUE_APP_API_ENCRYPT_KEY` / `VUE_APP_API_ENCRYPT_IV` | 请求参数 DES 加密密钥 |
+| `VUE_APP_AUTH_USERNAME` / `VUE_APP_AUTH_PSW` | 登录 OAuth2 HTTP Basic Auth 凭证 |
+| `VUE_APP_DROP_CONSOLE` | 打包时是否移除 console |
+
+环境文件:`.env`(通用)、`.env.development`、`.env.production`、`.env.test`。Rsbuild 通过 `config/plugins/plugin_envType` 生成 `types/env.d.ts`。
+
+### 4.3 目录约定
+
+- **api/**:按业务域建目录,每个目录下 `index.ts`(接口定义)+ `model.d.ts`(入参/出参类型,前缀 `API_xxx_P` / `API_xxx_R`)。
+- **views/**:与 api 目录对应;页面多用 `useTable` + `useFormModal` hooks + `OmegaTable` 组件快速搭建 CRUD。
+- **store/modules/**:Pinia store;`user.ts` 保存登录态/权限/动态路由;`url.ts` 保存接口 URL 字典;持久化通过 `persist` 配置。
+- **router/**:静态路由在 `constant.ts`;动态路由由后端菜单通过 `generator-router` 生成。
+- **utils/http/**:请求封装核心,**不要随意改动拦截器链路**。
+- **enums/**:`menu_enum.ts`(MenuType:目录/菜单/按钮/权限)、`http_enum.ts`(ContentTypeEnum)等。
+
+### 4.4 请求层(重要)
+
+`src/utils/http/request.ts` 提供 `http.request(match, params, options)`:
+
+- `match` 支持两种形式:
+  1. 完整 URL(`isUrl` 直接命中,如登录接口);
+  2. **服务方法名** `服务名.方法名`(如 `omegaAdmin.sysDictgetSysDictList`),实际 URL 通过 `useUrlStore().urlList`(URL 字典)解析(`getValueByPath`)。
+- 支持 `onFetchBefore`(如登录时追加 Basic Auth 头)、`onFetchResponse`、`onFetchError` 钩子。
+- 内置:重复请求合并(AbortApi)、响应缓存(CatchApi)、请求参数 DES 加密(`isEncrypt` 默认 true)、错误提示(`showError` 默认 true)。
+- 返回结构 `{ data, error, loading }`;业务成功以 `res.status === 1` 判断。
+
+### 4.5 登录与权限
+
+- 登录:`FETCH_USER.login` → OAuth2 密码模式(jwt-bearer grant_type)+ Basic Auth;获取 `access_token` / `refresh_token`。
+- 登录后 `afterLogin()` 拉取菜单(`FETCH_MENU.menus`)→ `setMenuInfo` → `generatorDynamicRouter` 动态注册路由。
+- 权限:后端菜单返回权限点,前端以 `v-role` 指令(`directives/v-role`)控制按钮显示。
+- token 过期由 `refreshTokenFn` 自动刷新,失败则登出回登录页。
+
+---
+
+## 5. 后端架构(BackEnd)
+
+### 5.1 服务清单与职责
+
+| 服务 | 端口 | Nacos ServiceName | 职责 |
+| --- | --- | --- | --- |
+| OmegaAdmin | 8003 | omega_admin | 系统管理核心:用户/角色/部门/岗位/菜单/字典/参数/日志/登录/权限;向其他服务提供 Feign 接口 |
+| OmegaConfig | - | omega_config | App 版本管理、App 数据源设置、文件/页面更新、底部导航、上报记录、OSS 上传 |
+| OmegaGateway | 8000 | omega_gateway | YARP 网关:按 Nacos 服务实例动态生成路由/集群,统一入口 |
+| OmegaLogic | - | omega_logic | 逻辑编排:server/test/logic 三类项目与节点、日志记录、Quartz 定时任务 |
+| OmegaMake | - | omega_make | 代码/模板生成(MakeTemplate、MakeData、生成分类) |
+| OmegaProject | - | omega_project | 项目管理:项目/分组/成员/角色/业务模块/功能模块/API 版本 |
+| OmegaRouter | - | omega_router | API 路由注册:API 分组、API 信息,为前端提供 URL 字典(`/v1/router/api/groups`、`/v1/router/api/list`) |
+| OmegaSource | - | omega_source | 资源/数据源:数据库信息/表/字段、服务器、脚本、App 项目/模块/页面、环境、中间件、模板 |
+| OmegaUpload | - | omega_upload | 文件上传服务 |
+
+### 5.2 通用目录结构与分层约定
+
+每个服务采用一致的目录骨架与「Controller → IService/Service → Repository」分层,命名约定统一(实体 `Sys*`、Dto 以 `XxxDto` 结尾、Vo 以 `XxxVo` 结尾等)。
+
+> 完整服务骨架(App/Attribute/Common/Controllers/Model/Repository/Services/…)、分层细节与命名规范见 [PROJECT_SPEC.md §1.2 / §2.3](./PROJECT_SPEC.md#12-backend后端微服务共-9-个)。
+
+### 5.4 启动配置要点(Program.cs,各服务一致)
+
+- Nacos 配置中心 + 服务注册(`AddNacosV2Configuration`、`AddNacosAspNet`),ServiceName/端口在 appsettings 中声明。
+- MVC 全局过滤器:`GlobalActionMonitor`(操作监控/日志)、`AuthorizationFilter`(JWT 鉴权)。
+- JSON:CamelCase 属性命名策略 + DateTime 转换器 + StringConverter(空字符串处理)。
+- SummerBoot 注册:`AddSummerBoot()`、`AddSummerBootFeign()`。
+- Redis 按 `RedisServer:open == "1"` 初始化。
+- Kestrel 请求体上限 100MB;`ThreadPool.SetMinThreads(200, 200)`。
+- DB 初始化:`AddDb(app.Environment)`(SqlSugar 多数据源 `omega_admin`,`InitDb` 且仅 Development 时建表)。
+
+### 5.5 数据库(SqlSugar)
+
+- 实体用 SqlSugar 特性建模(SugarTable/SugarColumn),`SysBase` 提供公共字段(CreateBy/UpdateBy/DelFlag 等)。
+- 多数据源按 `OptionsSetting.DbConfigs` 配置,ConfigId 区分库。
+- **数据权限**:`DataPermi.FilterData` 在查询时按用户部门自动过滤。
+- **软删除**:`DelFlag` 字段约定("0" 正常 / "1" 删除)。
+- SQL 日志分级写入 NLog,便于排查慢查询/异常 SQL。
+
+### 5.6 网关(OmegaGateway)
+
+- 基于 YARP + Nacos 动态路由:`RefreshYarp` 后台服务每 60s 从 Nacos 拉取各服务健康实例,`provider.Update(routes, clusters)` 实时生效。
+- 服务路径在 Nacos 配置 `OptionsSetting.Services`(Name + Path)中声明,网关按路径前缀将请求转发到对应微服务。
+- 是前端 `VUE_APP_CONFIG_API` 的统一入口。
+
+---
+
+## 6. 前后端接口调用约定(重要)
+
+1. 后端每个服务在 Nacos 注册(ServiceName + 服务路径)。
+2. **OmegaRouter** 服务维护 API 分组与 API 信息(`ApiGroupController` / `ApiInfoController`),对外提供 URL 字典接口(`/v1/router/api/groups`、`/v1/router/api/list`),键格式为 `服务名.方法名`(如 `omegaAdmin.sysDictgetSysDictList`),值为 `{ url, method, name }`。
+3. 前端首次启动通过 `useUrlStore().updateUrl()` 拉取 URL 字典并持久化。
+4. 前端请求一律使用 `http.request('服务名.方法名', params)`,由 URL 字典解析出真实网关地址再发起请求;网关按路径转发到对应微服务。
+
+**新增/修改接口时的要求:**
+
+- 后端新增 Controller 方法 → 同步在 OmegaRouter 的 API 信息中注册 `服务名.方法名`。
+- 前端 api 目录新增方法时,`match` 字符串必须与 OmegaRouter 注册的 key 一致,否则报「url 为空」。
+
+---
+
+## 7. 环境与配置
+
+### 7.1 前端
+
+- dev 端口 9906(rsbuild.config.ts);如需本地代理可启用 `config/proxy.ts`(默认注释)。
+- 网关地址:开发 `https://test-omega-gateway.kexiaoshuang.com`、生产 `https://omega-gateway.kexiaoshuang.com`(.env 文件配置)。
+
+### 7.2 后端
+
+- Nacos 配置中心 DataId:`omega`(Group:DEFAULT);包含数据库、Redis、OSS、服务路由等业务配置。
+- 每个服务 appsettings.json 仅保留 Logging/NacosConfig 等基础项,业务配置从 Nacos 动态获取(`App.OptionsSetting`)。
+- 环境配置文件:`appsettings.Development.json`、`appsettings.Test.json`、`appsettings.Production.json` 等。
+
+### 7.3 CI/CD
+
+- 各服务与前端均有 `.drone.yml`(Drone CI):`.NET SDK 7.0` 构建 → Docker 镜像(Harbor `harbor.kexiaoshuang.com`)→ 部署脚本触发 k8s 部署。
+- 触发分支:`develop`(测试环境);`build:test` 构建测试前端。
+
+---
+
+## 8. 开发规范与注意事项
+
+前端(复用 hooks/OmegaTable、`model.d.ts` 类型约定、提交前 lint/type:check、`VUE_APP_` 前缀、勿改 http 拦截器)与后端(分层、权限、密码存储、数据权限、软删除、异常处理、操作日志)的完整规范统一维护在 [PROJECT_SPEC.md §2](./PROJECT_SPEC.md#2-编码规范),此处不再重复。
+
+---
+
+## 9. 常见任务速查
+
+| 任务 | 步骤 |
+| --- | --- |
+| 新增一个管理端 CRUD | 后端:实体 `Model/Base` → Dto/Vo → Service(+IService) → Controller(Admin) → 注册到 OmegaRouter;前端:`api/<域>/` 增加接口 → `views/<域>/` 新建页面(useTable + useFormModal)→ 在菜单中挂载 |
+| 排查接口「url 为空」 | 检查 `match` 的 `服务名.方法名` 是否已在 OmegaRouter 注册、URL 字典是否已刷新(`useUrlStore().updateUrl()`) |
+| 排查请求被加密 | 请求参数默认 DES 加密(`VUE_APP_API_ENCRYPT_KEY/IV`),调试时可在请求 options 传 `isEncrypt: false` |
+| 新增环境变量 | 修改对应 `.env.*` 文件 → 重启 dev/build(会重新生成 types/env.d.ts) |
+| 本地起后端 | 保证可访问 Nacos(appsettings 的 ServerAddresses),启动对应服务 Program.cs 即可,业务配置从 Nacos 拉取 |
+| 部署 | 推送对应分支触发 Drone CI(`.drone.yml`),自动构建镜像并部署 |

+ 74 - 0
BackEnd/.editorconfig

@@ -0,0 +1,74 @@
+# OmegaAi BackEnd 统一代码格式规范
+# 说明:本文件为后端所有微服务共享的代码格式基准。
+# 规则以「仅统一格式、不强制重命名」为原则 —— 属性名/方法名与 DB 列名、OmegaRouter URL 字典、前端 match 强绑定,不做自动改名。
+
+root = true
+
+# ============ 基础编码 ============
+[*]
+end_of_line = lf
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+# ============ C# 格式规则 ============
+[*.cs]
+
+# --- 命名规则:不强制自动重命名(IDE1006)---
+dotnet_diagnostic.IDE1006.severity = none
+# 保持 block-scoped 命名空间,不自动改为 file-scoped(避免整体重排缩进)
+dotnet_diagnostic.IDE0161.severity = none
+# 不自动补 private/readonly 等修饰符,避免无关改动
+dotnet_diagnostic.IDE0040.severity = none
+dotnet_diagnostic.IDE0044.severity = none
+# 不自动改 var / 显式类型
+dotnet_diagnostic.IDE0007.severity = none
+dotnet_diagnostic.IDE0008.severity = none
+# 不自动调整未使用参数
+dotnet_diagnostic.IDE0060.severity = none
+
+# --- using 指令:System 优先 + 分组排序 ---
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# --- 大括号:Allman 风格(另起一行)---
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_between_query_expression_clauses = true
+
+# --- 缩进 ---
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = one_less_than_current
+
+# --- 空格 ---
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_around_binary_operators = before_and_after
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_before_comma = false
+csharp_space_after_dot = false
+csharp_space_before_dot = false
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_around_declaration_statements = ignore
+
+# --- 表达式级 ---
+csharp_style_var_elsewhere = false
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:suggestion

+ 11 - 6
BackEnd/OmegaAdmin/Controllers/Admin/SysDictController.cs

@@ -1,11 +1,16 @@
-using Vo;
+using Infrastructure;
+
+using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Model;
-using Services;
 using Model.Base;
+
+using Services;
+
+using Vo;
 using Vo.Admin;
-using Mapster;
-using Infrastructure;
 
 
 namespace Controllers.Admin
@@ -29,7 +34,7 @@ namespace Controllers.Admin
 
         }
 
-          /// <param name="page">分页参数</param>
+        /// <param name="page">分页参数</param>
         /// <summary>
         /// 列表
         /// </summary>
@@ -105,4 +110,4 @@ namespace Controllers.Admin
 
 
     }
-}
+}

+ 13 - 7
BackEnd/OmegaAdmin/Controllers/Admin/SysDictItemController.cs

@@ -1,12 +1,18 @@
-using Vo;
+using Dto;
+
+using Infrastructure;
+
+using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Model;
-using Services;
 using Model.Base;
+
+using Services;
+
+using Vo;
 using Vo.Admin;
-using Mapster;
-using Infrastructure;
-using Dto;
 
 
 namespace Controllers.Admin
@@ -30,7 +36,7 @@ namespace Controllers.Admin
 
         }
 
-          /// <param name="page">分页参数</param>
+        /// <param name="page">分页参数</param>
         /// <summary>
         /// 列表
         /// </summary>
@@ -107,4 +113,4 @@ namespace Controllers.Admin
 
 
     }
-}
+}

+ 11 - 6
BackEnd/OmegaAdmin/Controllers/Admin/SysLogController.cs

@@ -1,11 +1,16 @@
-using Vo;
+using Infrastructure;
+
+using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Model;
-using Services;
 using Model.Base;
+
+using Services;
+
+using Vo;
 using Vo.Admin;
-using Mapster;
-using Infrastructure;
 
 
 namespace Controllers.Admin
@@ -29,7 +34,7 @@ namespace Controllers.Admin
 
         }
 
-          /// <param name="page">分页参数</param>
+        /// <param name="page">分页参数</param>
         /// <summary>
         /// 列表
         /// </summary>
@@ -105,4 +110,4 @@ namespace Controllers.Admin
 
 
     }
-}
+}

+ 11 - 6
BackEnd/OmegaAdmin/Controllers/Admin/SysPublicParamController.cs

@@ -1,11 +1,16 @@
-using Vo;
+using Infrastructure;
+
+using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Model;
-using Services;
 using Model.Base;
+
+using Services;
+
+using Vo;
 using Vo.Admin;
-using Mapster;
-using Infrastructure;
 
 
 namespace Controllers.Admin
@@ -29,7 +34,7 @@ namespace Controllers.Admin
 
         }
 
-          /// <param name="page">分页参数</param>
+        /// <param name="page">分页参数</param>
         /// <summary>
         /// 列表
         /// </summary>
@@ -106,4 +111,4 @@ namespace Controllers.Admin
 
 
     }
-}
+}

+ 8 - 2
BackEnd/OmegaAdmin/Controllers/Base/BaseController.cs

@@ -1,12 +1,18 @@
-using Common;
+using System.Web;
+
+using Common;
+
 using Extensions;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Microsoft.AspNetCore.Mvc;
+
 using MiniExcelLibs;
+
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
-using System.Web;
 
 namespace Controllers
 {

+ 14 - 2
BackEnd/OmegaAdmin/Controllers/Base/HomeController.cs

@@ -1,17 +1,29 @@
 using Attribute;
+
 using Base;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 namespace Controllers
@@ -19,7 +31,7 @@ namespace Controllers
     /// <summary>
     /// 主界面Controller
     /// </summary>
-    
+
     [Route("/")]
     public class HomeController : BaseController
     {
@@ -57,4 +69,4 @@ namespace Controllers
             return SUCCESS(JwtUtil.GenerateJwtToken(JwtUtil.AddClaims(loginUser)));
         }
     }
-}
+}

+ 16 - 2
BackEnd/OmegaAdmin/Controllers/Base/SysDeptController.cs

@@ -1,19 +1,33 @@
-using Attribute;
+using System.Collections;
+
+using Attribute;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
-using System.Collections;
+
 using Util;
+
 using Vo;
 
 namespace Controllers

+ 14 - 3
BackEnd/OmegaAdmin/Controllers/Base/SysLoginController.cs

@@ -1,16 +1,27 @@
 using Attribute;
+
 using Base;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 namespace Controllers
@@ -65,7 +76,7 @@ namespace Controllers
 
             TokenModel loginUser = new(user.Adapt<TokenModel>(), roles.Adapt<List<Roles>>());
             CacheService.SetUserPerms(GlobalConstant.UserPermKEY + user.userId, permissions);
-            
+
             return SUCCESS(sysLoginService.GetLoginInfo(loginUser));
         }
 
@@ -141,7 +152,7 @@ namespace Controllers
             }
             return ToResponse(ResultCode.CUSTOM_ERROR, "注册失败,请联系管理员");
         }
-        
+
         /// <summary>
         /// 生成二维码
         /// </summary>
@@ -166,4 +177,4 @@ namespace Controllers
             });
         }
     }
-}
+}

+ 11 - 0
BackEnd/OmegaAdmin/Controllers/Base/SysMenuController.cs

@@ -1,16 +1,27 @@
 using Attribute;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 namespace Controllers

+ 9 - 0
BackEnd/OmegaAdmin/Controllers/Base/SysPostController.cs

@@ -1,13 +1,22 @@
 using Attribute;
+
 using Common;
+
 using Enums;
+
 using Filters;
+
 using Infrastructure;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 

+ 12 - 0
BackEnd/OmegaAdmin/Controllers/Base/SysRoleController.cs

@@ -1,17 +1,29 @@
 using Attribute;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 namespace Controllers

+ 14 - 1
BackEnd/OmegaAdmin/Controllers/Base/SysUserController.cs

@@ -1,19 +1,32 @@
 using Attribute;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using MiniExcelLibs;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
+
 using Vo;
 
 namespace Controllers
@@ -134,7 +147,7 @@ namespace Controllers
 
             user.RoleIds = parm.role;
             user.PostIds = parm.post;
-            if(!string.IsNullOrEmpty(parm.password))
+            if (!string.IsNullOrEmpty(parm.password))
             {
                 user.salt = Function.get_Random(6);
                 user.password = Function.MD532(Function.CheckNull(user.password) + user.salt);

+ 7 - 0
BackEnd/OmegaAdmin/Controllers/Base/SysUserRoleController.cs

@@ -1,10 +1,17 @@
 using Attribute;
+
 using Dto;
+
 using Enums;
+
 using Filters;
+
 using Infrastructure;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Services;
 
 namespace Controllers

+ 11 - 0
BackEnd/OmegaAdmin/Controllers/Feign/SysMenuController.cs

@@ -1,16 +1,27 @@
 using Attribute;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
 
 namespace Controllers.Feign

+ 17 - 3
BackEnd/OmegaAdmin/Controllers/Feign/VsCodeController.cs

@@ -1,19 +1,33 @@
 using Attribute;
+
 using Base;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Filters;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Mapster;
+
 using Microsoft.AspNetCore.Mvc;
+
 using Middleware;
+
 using Model;
 using Model.Base;
+
 using Services;
+
 using Util;
+
 using Vo;
 
 namespace Controllers.Feign
@@ -43,7 +57,7 @@ namespace Controllers.Feign
         {
             SysUser user = sysUserService.GetFirst(m => m.username == param.username) ?? new SysUser();
             string password = Function.MD532(param.password + user.salt);
-            if(password != user.password)
+            if (password != user.password)
             {
                 return ToResponse(ResultCode.BAD_REQUEST, "用户名或密码错误");
             }
@@ -69,11 +83,11 @@ namespace Controllers.Feign
         public IActionResult refreshToken([FromBody] VsRefreshTokenDto param)
         {
             TokenModel tokenModel = JwtUtil.GetLoginUser(HttpContext);
-            if(tokenModel == null)
+            if (tokenModel == null)
             {
                 return ToResponse(ResultCode.BAD_REQUEST, "用户未登录");
             }
-            if(tokenModel.refreshToken != param.refreshToken)
+            if (tokenModel.refreshToken != param.refreshToken)
             {
                 return ToResponse(ResultCode.BAD_REQUEST, "刷新令牌错误");
             }

+ 3 - 2
BackEnd/OmegaAdmin/Model/Base/ApiResult.cs

@@ -1,5 +1,6 @@
-using Infrastructure.Constant;
-using System.Collections.Generic;
+using System.Collections.Generic;
+
+using Infrastructure.Constant;
 
 namespace Infrastructure.Model
 {

+ 1 - 0
BackEnd/OmegaAdmin/Model/Base/SysBase.cs

@@ -1,4 +1,5 @@
 using MiniExcelLibs.Attributes;
+
 using Newtonsoft.Json;
 
 namespace Model

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysCity.cs

@@ -93,4 +93,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysDept.cs

@@ -75,4 +75,4 @@ namespace Model
         /// </summary>
         public List<SysDept> children = new();
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysDict.cs

@@ -82,4 +82,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysDictItem.cs

@@ -103,4 +103,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysFile.cs

@@ -86,4 +86,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysLog.cs

@@ -121,4 +121,4 @@ namespace Model
 
 
     }
-}
+}

+ 7 - 7
BackEnd/OmegaAdmin/Model/Base/SysMenu.cs

@@ -148,7 +148,7 @@ namespace Model
         [SugarColumn(ColumnDescription = "外链打开方式", ColumnName = "open_mode")]
         public int openMode { get; set; }
 
-        
+
 
         // [SugarColumn(IsIgnore = true)]
         // public TreeSelectMeta meta { get; set; }
@@ -181,20 +181,20 @@ namespace Model
 
 
 
-        
+
         [SugarColumn(IsIgnore = true)]
         public string title { get; set; }
-        
+
         [SugarColumn(IsIgnore = true)]
         public List<string> roles { get; set; }
-        
+
         [SugarColumn(IsIgnore = true)]
         public List<string> auths { get; set; }
-        
+
         [SugarColumn(IsIgnore = true)]
         public bool isShow { get; set; }
-        
+
         [SugarColumn(IsIgnore = true)]
         public bool isKeepAlive { get; set; }
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysOauthClientDetails.cs

@@ -128,4 +128,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysParam.cs

@@ -135,4 +135,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysPost.cs

@@ -79,4 +79,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysPublicParam.cs

@@ -100,4 +100,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysRole.cs

@@ -94,4 +94,4 @@ namespace Model
             return 1 == roleId;
         }
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysRoleMenu.cs

@@ -23,4 +23,4 @@ namespace Model
 
 
     }
-}
+}

+ 5 - 3
BackEnd/OmegaAdmin/Model/Base/SysUser.cs

@@ -1,5 +1,7 @@
 using Mapster;
+
 using MiniExcelLibs.Attributes;
+
 using Vo;
 
 namespace Model
@@ -182,8 +184,8 @@ namespace Model
         public List<SysPost> PostList { get; set; }
 
         [SugarColumn(IsIgnore = true)]
-        public DeptFeignVo deptInfo 
-        { 
+        public DeptFeignVo deptInfo
+        {
             get
             {
                 return deptJoin.Adapt<DeptFeignVo>();
@@ -206,4 +208,4 @@ namespace Model
         [SugarColumn(IsIgnore = true)]
         public string deptName { get; set; }
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysUserPost.cs

@@ -23,4 +23,4 @@ namespace Model
 
 
     }
-}
+}

+ 1 - 1
BackEnd/OmegaAdmin/Model/Base/SysUserRole.cs

@@ -23,4 +23,4 @@ namespace Model
 
 
     }
-}
+}

+ 3 - 1
BackEnd/OmegaAdmin/Model/Dto/Base/AddMenuFromApiDto.cs

@@ -1,5 +1,7 @@
 using System.ComponentModel.DataAnnotations;
+
 using MessagePack.Formatters;
+
 using MiniExcelLibs.Attributes;
 
 namespace Dto
@@ -12,4 +14,4 @@ namespace Dto
         public string apiName { get; set; }
         public string rootPath { get; set; }
     }
-}
+}

+ 4 - 2
BackEnd/OmegaAdmin/Model/Dto/Base/MenuDto.cs

@@ -1,5 +1,7 @@
 using System.ComponentModel.DataAnnotations;
+
 using MessagePack.Formatters;
+
 using MiniExcelLibs.Attributes;
 
 namespace Dto
@@ -25,7 +27,7 @@ namespace Dto
         /// <summary>
         /// 路由地址
         /// </summary>
-        [ExcelColumn(Name = "路由地址")] 
+        [ExcelColumn(Name = "路由地址")]
         public string? path { get; set; } = "#";
 
         /// <summary>
@@ -103,4 +105,4 @@ namespace Dto
     {
         public int roleId { get; set; }
     }
-}
+}

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Base/RoleMenuExportDto.cs

@@ -1,4 +1,5 @@
 using Enums;
+
 using MiniExcelLibs.Attributes;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Base/RoleUserDto.cs

@@ -1,4 +1,5 @@
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Client/ApiGroupListDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto.Client

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Client/AppAppBottomNavsDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Client/AppPageInfoDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/Client/AppStaticFilesDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictAddDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictItemAddDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictItemListDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictItemQueryDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictItemUpdateDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictListDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictQueryDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 0
BackEnd/OmegaAdmin/Model/Dto/SysDictUpdateDto.cs

@@ -1,5 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
+
 using Model.Base;
 
 namespace Dto

+ 1 - 1
BackEnd/OmegaAdmin/Model/Exception/CustomException.cs

@@ -45,4 +45,4 @@ namespace Infrastructure
             LogMsg = errorMsg.ToString();
         }
     }
-}
+}

+ 2 - 1
BackEnd/OmegaAdmin/Model/Vo/Base/LeftMenuVo.cs

@@ -1,4 +1,5 @@
 using Model;
+
 using Newtonsoft.Json;
 
 namespace Vo
@@ -51,7 +52,7 @@ namespace Vo
             List<LeftMenuVo> child = new List<LeftMenuVo>();
             foreach (var item in menu.children)
             {
-                if(item.menuType == "0")
+                if (item.menuType == "0")
                 {
                     child.Add(new LeftMenuVo(item));
                 }

+ 1 - 0
BackEnd/OmegaAdmin/Model/Vo/Base/RouterVo.cs

@@ -1,4 +1,5 @@
 using Model;
+
 using Newtonsoft.Json;
 
 namespace Vo

+ 2 - 1
BackEnd/OmegaAdmin/Model/Vo/Base/TreeSelectVo.cs

@@ -1,4 +1,5 @@
 using Model;
+
 using Newtonsoft.Json;
 
 namespace Vo
@@ -54,7 +55,7 @@ namespace Vo
             {
                 // if(item.menuType == "0")
                 // {
-                    child.Add(new TreeSelectVo(item));
+                child.Add(new TreeSelectVo(item));
                 // }
                 // else
                 // {

+ 1 - 0
BackEnd/OmegaAdmin/Model/Vo/Base/TreeVo.cs

@@ -1,4 +1,5 @@
 using Model;
+
 using Newtonsoft.Json;
 
 namespace Vo.Base

+ 2 - 2
BackEnd/OmegaAdmin/Services/Base/CacheService.cs

@@ -28,8 +28,8 @@ namespace Services
         public static object SetScanLogin(string key, Dictionary<string, object> val)
         {
             var ck = CK_verifyScan + key;
-            
-            return CacheHelper.SetCache(ck,val , 1);
+
+            return CacheHelper.SetCache(ck, val, 1);
         }
         public static object GetScanLogin(string key)
         {

+ 1 - 1
BackEnd/OmegaAdmin/Services/Base/IService/IBaseService.cs

@@ -9,4 +9,4 @@ namespace Services
     public interface IBaseService<T> : IBaseRepository<T> where T : class, new()
     {
     }
-}
+}

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysDeptService.cs

@@ -1,5 +1,7 @@
 using Dto;
+
 using Model;
+
 using Vo;
 
 namespace Services

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysLoginService.cs

@@ -1,6 +1,8 @@
 using Dto;
+
 using Model;
 using Model.Base;
+
 using Vo;
 
 namespace Services

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysMenuService.cs

@@ -1,5 +1,7 @@
 using Dto;
+
 using Model;
+
 using Vo;
 
 namespace Services

+ 1 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysRoleService.cs

@@ -1,4 +1,5 @@
 using Dto;
+
 using Model;
 using Model.Base;
 

+ 1 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysUserRoleService.cs

@@ -1,4 +1,5 @@
 using Dto;
+
 using Model;
 using Model.Base;
 

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/IService/ISysUserService.cs

@@ -1,6 +1,8 @@
 using Dto;
+
 using Model;
 using Model.Base;
+
 using Vo;
 
 namespace Services

+ 6 - 0
BackEnd/OmegaAdmin/Services/Base/SysDeptService.cs

@@ -1,9 +1,15 @@
 using Attribute;
+
 using Dto;
+
 using Extensions;
+
 using Infrastructure;
+
 using Model;
+
 using Service;
+
 using Vo;
 
 namespace Services

+ 16 - 3
BackEnd/OmegaAdmin/Services/Base/SysLoginService.cs

@@ -1,18 +1,31 @@
 using System.Text;
+
 using Attribute;
+
 using Base;
+
 using Common;
+
 using Dto;
+
 using Extensions;
+
 using Infrastructure;
 using Infrastructure.Model;
+
 using Microsoft.AspNetCore.Identity;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
+
 using UAParser;
+
 using Util;
+
 using Vo;
 
 namespace Services
@@ -48,9 +61,9 @@ namespace Services
             string clienId = checkUserData[0];
             string clienSecret = checkUserData[1];
             SysOauthClientDetails oauth = SysOauthClientDetailsService.GetFirst(m => m.ClientId == clienId && m.ClientSecret == clienSecret);
-            if(oauth != null)
+            if (oauth != null)
             {
-                if(oauth.Scope == scope && oauth.AuthorizedGrantTypes.EndsWith(grantType))
+                if (oauth.Scope == scope && oauth.AuthorizedGrantTypes.EndsWith(grantType))
                 {
                     return true;
                 }
@@ -70,7 +83,7 @@ namespace Services
             info.refresh_token = Guid.NewGuid().ToString();
             info.user_id = loginUser.userId;
             info.username = loginUser.username;
-            
+
             JwtSettings jwtSettings = new();
             AppSettings.Bind("JwtSettings", jwtSettings);
             info.exp = DateTime.Now.AddMinutes(jwtSettings.Expire);

+ 10 - 2
BackEnd/OmegaAdmin/Services/Base/SysMenuService.cs

@@ -1,11 +1,19 @@
 using Attribute;
+
 using Common;
+
 using Dto;
+
 using Enums;
+
 using Extensions;
+
 using Model;
+
 using Service;
+
 using Services;
+
 using Vo;
 
 namespace Services
@@ -114,7 +122,7 @@ namespace Services
         {
             long parentMenuId = 0;
             var parentMenu = GetFirst(m => m.enName == param.module);
-            if(parentMenu != null)
+            if (parentMenu != null)
             {
                 parentMenuId = parentMenu.menuId;
             }
@@ -696,7 +704,7 @@ namespace Services
 
         public void AddSysMenu()
         {
-            
+
         }
     }
 }

+ 6 - 0
BackEnd/OmegaAdmin/Services/Base/SysOauthClientDetailsService.cs

@@ -1,9 +1,15 @@
 using Attribute;
+
 using Dto;
+
 using Extensions;
+
 using Infrastructure;
+
 using Model;
+
 using Service;
+
 using Vo;
 
 namespace Services

+ 5 - 0
BackEnd/OmegaAdmin/Services/Base/SysPermissionService.cs

@@ -1,9 +1,14 @@
 using Attribute;
+
 using Base;
+
 using Dto;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
 
 namespace Services

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/SysPostService.cs

@@ -1,5 +1,7 @@
 using Attribute;
+
 using Model;
+
 using Service;
 
 namespace Services

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/SysRoleMenuService.cs

@@ -1,5 +1,7 @@
 using Attribute;
+
 using Model;
+
 using Service;
 
 namespace Services

+ 9 - 2
BackEnd/OmegaAdmin/Services/Base/SysRoleService.cs

@@ -1,12 +1,19 @@
+using System.Collections;
+
 using Attribute;
+
 using Base;
+
 using Dto;
+
 using Infrastructure;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using System.Collections;
 
 namespace Services
 {
@@ -195,7 +202,7 @@ namespace Services
 
                 RoleMenuService.DeleteRoleMenuByRoleIdMenuIds(sysRoleDto.roleId, delMenuIds);
                 sysRoleDto.menuIds = addMenuIds.ToList();
-                sysRoleDto.delMenuIds= delMenuIds.ToList();
+                sysRoleDto.delMenuIds = delMenuIds.ToList();
                 InsertRoleMenu(sysRoleDto);
                 Console.WriteLine($"减少了{delMenuIds.Length},增加了{addMenuIds.Length}菜单");
             });

+ 2 - 0
BackEnd/OmegaAdmin/Services/Base/SysUserPostService.cs

@@ -1,5 +1,7 @@
 using Attribute;
+
 using Model;
+
 using Service;
 
 namespace Services

+ 5 - 0
BackEnd/OmegaAdmin/Services/Base/SysUserRoleService.cs

@@ -1,9 +1,14 @@
 using Attribute;
+
 using Dto;
+
 using Extensions;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
 
 namespace Services

+ 13 - 2
BackEnd/OmegaAdmin/Services/Base/SysUserService.cs

@@ -1,15 +1,26 @@
+using System.Collections;
+
 using Attribute;
+
 using Base;
+
 using Common;
+
 using Dto;
+
 using Extensions;
+
 using Infrastructure;
+
 using IPTools.Core;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using System.Collections;
+
 using Vo;
 
 namespace Services
@@ -54,7 +65,7 @@ namespace Services
                 .OrderByDescending(m => m.userId);
 
             PagedInfo<SysUser> result = query.ToPage(pager);
-            foreach(SysUser sub in result.Records)
+            foreach (SysUser sub in result.Records)
             {
                 List<long> userRoles = UserRoleService.GetList(m => m.UserId == sub.userId).Select(m => m.RoleId).ToList();
                 sub.RoleList = RoleService.GetList(m => userRoles.Contains(m.roleId));

+ 5 - 2
BackEnd/OmegaAdmin/Services/IService/ISysDictItemService.cs

@@ -1,8 +1,11 @@
+using Dto;
+
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
-using Dto;
 
 
 namespace Services

+ 3 - 1
BackEnd/OmegaAdmin/Services/IService/ISysDictService.cs

@@ -1,6 +1,8 @@
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 3 - 1
BackEnd/OmegaAdmin/Services/IService/ISysLogService.cs

@@ -1,6 +1,8 @@
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 3 - 1
BackEnd/OmegaAdmin/Services/IService/ISysPublicParamService.cs

@@ -1,6 +1,8 @@
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 8 - 2
BackEnd/OmegaAdmin/Services/SysDictItemService.cs

@@ -1,11 +1,17 @@
 using Attribute;
+
+using Dto;
+
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
-using Dto;
 
 
 namespace Services

+ 6 - 1
BackEnd/OmegaAdmin/Services/SysDictService.cs

@@ -1,9 +1,14 @@
 using Attribute;
+
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 6 - 1
BackEnd/OmegaAdmin/Services/SysLogService.cs

@@ -1,9 +1,14 @@
 using Attribute;
+
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 6 - 1
BackEnd/OmegaAdmin/Services/SysPublicParamService.cs

@@ -1,9 +1,14 @@
 using Attribute;
+
+using Microsoft.AspNetCore.Mvc;
+
 using Model;
 using Model.Base;
+
 using Repository;
+
 using Service;
-using Microsoft.AspNetCore.Mvc;
+
 using Vo.Admin;
 
 

+ 534 - 0
PROJECT_SPEC.md

@@ -0,0 +1,534 @@
+# PROJECT_SPEC.md — 项目规格说明书
+
+本文档与 [AGENTS.md](./AGENTS.md) 配合使用:
+
+- **AGENTS.md**:项目背景、技术栈、架构说明、接口调用约定、环境与部署。
+- **PROJECT_SPEC.md(本文档)**:**完整项目目录结构** 与 **编码规范**。
+
+> 目录结构、编码规范类内容统一维护在本文件中,AGENTS.md 只保留指针,避免重复。
+
+---
+
+## 1. 完整项目目录结构
+
+### 1.1 AdminFrontEnd(后台管理系统前端)
+
+```
+AdminFrontEnd/
+├── .vscode/                      # 编辑器配置(含 MCP 配置 mcp.json)
+├── .github/                      # GitHub 相关
+├── config/
+│   └── plugins/
+│       └── index.ts              # Rsbuild 插件:envType 注入、类型生成
+├── public/                       # 公共静态资源
+├── src/
+│   ├── main.ts                   # 应用入口
+│   ├── App.vue                   # 根组件
+│   ├── api/                      # ★ 接口层(按业务域分目录)
+│   │   ├── app-manage/           #   应用管理
+│   │   ├── auths/                #   认证授权
+│   │   │   ├── user/             #     用户(index.ts + model.d.ts)
+│   │   │   ├── role/             #     角色
+│   │   │   ├── dept/             #     部门
+│   │   │   ├── menu/             #     菜单(含 menu-tree.json、icon-migration.ts)
+│   │   │   └── post/             #     岗位
+│   │   ├── database/             #   数据库(manage)
+│   │   ├── interface/            #   接口(manage)
+│   │   ├── market/               #   市场(modal)
+│   │   ├── project/              #   项目
+│   │   ├── resource/             #   资源
+│   │   ├── system/               #   系统(字典/参数/日志)
+│   │   ├── workflow/             #   工作流
+│   │   └── typings.d.ts          #   公共接口类型
+│   ├── assets/                   # 静态资源
+│   │   ├── svg/                  #   图标(logo/theme/系统图标…)
+│   │   ├── images/               #   图片(bg/logo)
+│   │   ├── analysis.svg
+│   │   └── 404.gif
+│   ├── components/
+│   │   └── common/               # ★ 通用组件(Omega 系列)
+│   │       ├── echarts/          #   Echarts 封装(Echarts.vue、echats-config.ts)
+│   │       ├── help-info/
+│   │       ├── lock-page/        #   锁屏组件
+│   │       ├── omega-code-editor/   # CodeMirror 代码编辑器
+│   │       ├── omega-code-preview/  # 代码预览
+│   │       ├── omega-form/       #   动态表单(types/utils/hooks/components/form-item)
+│   │       ├── omega-list/       #   列表
+│   │       ├── omega-page/       #   页面容器
+│   │       ├── omega-section/    #   区块容器
+│   │       ├── omega-table/      #   ★ 动态表格(types/hooks/components/table-settings)
+│   │       ├── omega-toolbar/    #   工具栏
+│   │       ├── omega-upload/     #   上传
+│   │       ├── svg-icon/         #   SVG 图标
+│   │       ├── vertify/          #   验证码
+│   │       └── dia-text-reveal/  #   文本动画
+│   ├── directives/
+│   │   ├── index.ts
+│   │   └── v-role/index.ts       # ★ 按钮级权限指令
+│   ├── enums/
+│   │   ├── index.ts
+│   │   ├── breakpoint_enum.ts
+│   │   ├── http_enum.ts          #   ContentTypeEnum
+│   │   ├── menu_enum.ts          #   MenuType
+│   │   ├── role_enum.ts
+│   │   └── size_enum.ts
+│   ├── hooks/                    # ★ 组合式函数
+│   │   ├── event/                #   useEventListener/useBreakpoint/useScroll/useScrollTo/
+│   │   │                         #   useWindowSizeFn/useIntersectionObserver
+│   │   ├── useForm.tsx           #   动态表单 hook
+│   │   ├── useFormModal.tsx      #   表单弹窗 hook
+│   │   ├── useTable.tsx          #   表格 hook
+│   │   ├── useLoad.ts / useOnline.ts / useTime.ts / useTiming.ts
+│   │   └── ...
+│   ├── layout/                   # ★ 布局
+│   │   ├── index.vue
+│   │   ├── content/
+│   │   ├── header/               #   顶栏(components: setting/lock-screen/fullscreen/
+│   │   │                         #   breadcrumb/lightOrDark/user/search)
+│   │   ├── logo/
+│   │   ├── menu/                 #   菜单(components: menu-item/menu-item-content)
+│   │   └── tabs/                 #   标签页(components: Tabs/ChromeTabBg)
+│   ├── lib/
+│   │   └── json-render/          # ★ JSON 动态渲染引擎
+│   │       ├── component/JsonRenderDevtools/   # 渲染调试工具
+│   │       ├── element-plus-docs/*.md          # Element Plus 组件文档索引
+│   │       ├── example/crud.spec.ts            # CRUD 示例 spec
+│   │       ├── catalog.ts / components.catalog.ts / element-plus.catalog.ts
+│   │       ├── registry.ts / spec.ts / render-spec.ts / vue-sfc.ts / actions.ts
+│   │       ├── use-fetch-ai.ts
+│   │       └── api-tree.json / test.openapi.json
+│   ├── plugins/                  # 插件注册
+│   │   ├── index.ts
+│   │   ├── assets.ts             #   svg 自动注册
+│   │   ├── customComponents.ts   #   自定义组件注册
+│   │   ├── directives.ts
+│   │   └── globalMethods.ts      #   全局方法
+│   ├── router/
+│   │   ├── index.ts              # 路由实例
+│   │   ├── constant.ts           # 常量
+│   │   ├── modules/
+│   │   │   ├── staticModules/index.ts     # 静态路由
+│   │   │   ├── asyncModules/index.ts      # 异步路由(动态生成)
+│   │   │   └── externalModules/           # 外部路由(error/redirect/outside)
+│   │   └── utils/generator-router.tsx     # ★ 由后端菜单生成动态路由
+│   ├── store/                    # ★ Pinia
+│   │   └── modules/
+│   │       ├── user.ts           #   登录态/权限/菜单
+│   │       ├── url.ts            #   ★ 接口 URL 字典
+│   │       ├── tabsView.ts       #   标签页
+│   │       ├── keepAlive.ts      #   页面缓存
+│   │       ├── lockscreen.ts     #   锁屏
+│   │       └── layoutSetting.ts  #   布局设置
+│   ├── styles/                   # 全局样式(theme/transition/tailwind)
+│   ├── theme/                    # 主题
+│   ├── utils/
+│   │   ├── http/                 # ★ 请求封装(勿随意改动)
+│   │   │   ├── request.ts        #   入口:http.request(match, params, options)
+│   │   │   ├── type.ts           #   类型与 paramsHelper
+│   │   │   └── utils/
+│   │   │       ├── fetch.ts      #   底层 fetch 封装
+│   │   │       ├── getUrl.ts     #   URL 解析
+│   │   │       ├── encrypt.ts    #   DES 加密
+│   │   │       ├── abortController.ts  # 重复请求合并
+│   │   │       ├── responseCache.ts    # 响应缓存
+│   │   │       ├── status.ts     #   状态码
+│   │   │       └── logPrint.ts
+│   │   ├── permission/           #   权限(access/role/utils)
+│   │   ├── rules/                #   表单校验(index/validate)
+│   │   ├── file/                 #   文件(download/translate)
+│   │   └── *.ts                  #   clone/copy/dateUtil/is/polling/toExcel/tsxHelper/
+│   │                             #   upload/url/checkUpdate/index
+│   └── views/                    # ★ 页面(与 api 业务域对应)
+│       ├── account/settings.vue
+│       ├── dashboard/
+│       │   ├── welcome/
+│       │   ├── demo/             #   组件示例(form/modal/table/COMPONENTS.md)
+│       │   └── workflow-demo/    #   流程图示例
+│       ├── database/
+│       │   ├── manage/
+│       │   └── manage-details/
+│       ├── error/404.vue
+│       ├── interface/manage/
+│       ├── login/                #   index.vue + LoginForm.vue
+│       ├── market/modal/
+│       ├── permission/           #   user/dept/menu/post/role
+│       ├── project/
+│       │   ├── manage/
+│       │   └── manage-details/   #   含 config-pane/*、app-page-config/*、components/*
+│       ├── resource/             #   application-config/data-config/env-config/middle-config/
+│       │                         #   node-config/script-config/server-config/template-config
+│       └── system/               #   dict/log/params
+│           └── <view>/           #   页面标准结构:
+│               ├── index.vue     #     页面入口
+│               ├── hooks/        #     use_form.ts / use_columns.tsx / use_context.ts
+│               └── components/   #     页面私有组件
+├── types/                        # 全局类型声明(env.d.ts 由构建生成、global.d.ts、shims-*.d.ts)
+├── .drone.yml                    # CI/CD 流水线
+├── .env / .env.development / .env.test / .env.production   # 环境变量
+├── rsbuild.config.ts             # Rsbuild 构建配置(dev 端口 9906)
+├── package.json
+├── pnpm-lock.yaml
+├── tsconfig.json / tsconfig.app.json / tsconfig.node.json
+├── eslint.config.mjs
+├── prettier.config.mjs
+└── stylelint.config.mjs
+```
+
+### 1.2 BackEnd(后端微服务,共 9 个)
+
+#### 通用服务骨架(9 个服务均包含,结构一致)
+
+```
+<Service>/
+├── App/                          # App.cs(OptionsSetting 静态入口)、InternalApp.cs(SP/IConfig)
+├── Attribute/                    # AppServiceAttribute(自动注册)、LogAttribute(操作日志)
+├── Base/                         # AppSettings、GlobalConstant
+├── Common/                       # Function、JwtUtil、Tools、dbconn、JsonConverterUtil、
+│                                 # StringConverter、Cache/(RedisServer、CacheHelper)
+├── Constant/                     # HttpStatus、Helper/DateTimeHelper
+├── Controllers/
+│   ├── Admin/                    # 管理端接口(供后台管理系统调用)
+│   ├── Client/                   # 客户端/开放接口
+│   ├── Base/                     # BaseController、HomeController(部分服务)
+│   └── Feign/                    # 服务间调用接口(部分服务)
+├── Extensions/                   # Extension.{Convert,Enum,Linq,Validate,Exception}、StringExtension、
+│                                 # RequestLimitExtension、IPRateExtension、HttpContextExtension、
+│                                 # EntityExtension、AppServiceExtensions
+├── Filters/                      # GlobalActionMonitor、AuthorizationFilter、ActionPermissionFilter、VerifyAttribute
+├── Middleware/                   # GlobalExceptionMiddleware(全局异常)
+├── Model/
+│   ├── Base/                     # 实体(Sys*)、ApiResult、PagerInfo、PagedInfo、TokenModel、UserConstants、OptionsSetting
+│   ├── Database/                 # ★ 数据库实体(SugarTable)
+│   ├── Dto/                      # 请求入参(*Dto,含 Base/Admin/Client 子目录)
+│   ├── Enums/                    # BusinessType、MenuStatus、MenuType、StoreType、ProteryConstant
+│   ├── Exception/                # CustomException、ResultCode
+│   ├── Vo/                       # 响应出参(*Vo,含 Admin/Client/Base 子目录)
+│   └── (Custom/Source/Project/…) # 各服务特有模型
+├── Repository/                   # BaseRepository、IBaseRepository
+├── Services/
+│   ├── Base/                     # BaseService、CacheService(+ IService/)
+│   └── <Domain>Service.cs        # 业务服务(+ IService/ 接口,同目录)
+├── SqlSugar/                     # SqlsugarSetup(AddDb)、DataPermi、DataPermiSevice、InitTable、SqlSugarCache
+├── Task/Quartz/                  # MyJob、StartJob(部分服务)
+├── Util/                         # PublicFunction、Utils、RefreshService 等(部分服务)
+├── Feign/                        # 服务间 Feign 定义(部分服务)
+├── Program.cs                    # 启动配置
+├── appsettings*.json             # 环境配置(含 NacosConfig)
+├── GlobalUsing.cs
+└── <Service>.csproj
+```
+
+#### OmegaAdmin(系统管理 / 权限核心,端口 8003,Nacos: omega_admin)
+
+```
+Controllers/
+├── Base/        # HomeController、BaseController、SysLoginController、SysUserController、SysDeptController、
+│                # SysPostController、SysRoleController、SysMenuController、SysUserRoleController
+├── Admin/       # SysDictController、SysDictItemController、SysPublicParamController、SysLogController
+└── Feign/       # SysMenuController、VsCodeController
+Services/
+├── Base/        # SysLoginService、SysUserService、SysDeptService、SysPostService、SysRoleService、SysMenuService、
+│                # SysUserRoleService、SysUserPostService、SysRoleMenuService、SysPermissionService、
+│                # SysOauthClientDetailsService(+ IService/)
+└── (Admin)      # SysDictService、SysDictItemService、SysPublicParamService、SysLogService(+ IService/)
+Model/Database/  # SysUser、SysRole、SysMenu、SysDept、SysPost、SysDict、SysDictItem、
+                 # SysPublicParam、SysLog、SysUserRole、SysUserPost、SysRoleMenu、SysOauthClientDetails 等
+DLL/             # 本地引用的第三方 DLL
+```
+
+#### OmegaConfig(App 配置 / 版本 / 更新,Nacos: omega_config)
+
+```
+Controllers/
+├── Admin/       # AppSourceSetController、AppSourceVersionController
+├── Client/      # AppController、OssController
+├── Base/        # HomeController、BaseController
+└── (根目录)     # AppVersionController、AppBottomNavsController、AppReportRecordController、
+                 # FileUpdateInfoController、PageUpdateInfoController
+Services/
+├── Base/        # OssService(+ IService/)
+├── Client/      # FileUpdateInfoService、PageUpdateInfoService、AppBottomNavsService(+ IService/)
+└── (根目录)     # AppVersionService、AppSourceSetService、AppSourceVersionService、
+                 # AppReportRecordService、FileUpdateInfoService、PageUpdateInfoService、AppBottomNavsService(+ IService/)
+Model/Database/  # AppVersion、AppSourceSet、AppSourceVersion、AppBottomNavs、AppReportRecord、
+                 # FileUpdateInfo、PageUpdateInfo 等
+```
+
+#### OmegaGateway(YARP API 网关,端口 8000,Nacos: omega_gateway)
+
+```
+├── Program.cs              # YARP + Nacos 启动
+├── Util/
+│   ├── RefreshYarp.cs      # ★ 60s 轮询 Nacos 服务实例,动态刷新 routes/clusters
+│   └── Utils.cs / PublicFunction.cs
+├── Common/                 # Function、CacheHelper 等
+└── appsettings*.json       # 网关配置
+```
+
+#### OmegaLogic(逻辑 / 服务 / 测试编排,Nacos: omega_logic)
+
+```
+Controllers/
+├── Admin/       # LogicProjectController、LogicNodeController、LogicNodeKindController、LogicLogRecordController、
+│                # ServerProjectController、ServerNodeController、ServerNodeKindController、ServerLogRecordController、
+│                # TestProjectController、TestNodeController、TestNodeKindController、TestLogRecordController
+├── Client/      # LogicNodeController
+└── Base/        # HomeController、BaseController
+Services/        # LogicProject/LogicProjectVersion/LogicProjectVersionNode/LogicNode/LogicNodeKind/
+                 # LogicLogRecord/ServerProject/ServerNode/ServerNodeKind/ServerLogRecord/
+                 # TestProject/TestNode/TestNodeKind/TestLogRecord +(IService/)
+Model/
+├── Database/    # LogicProject、LogicProjectVersion、LogicProjectVersionNode、LogicNode、LogicNodeKind、
+│                # LogicLogRecord、ServerProject、ServerNode、ServerNodeKind、ServerLogRecord、
+│                # TestProject、TestNode、TestNodeKind、TestLogRecord
+├── Custom/      # ApiInfo、EdgeList、LogItem
+├── Source/      # DatabaseInfo、DatabaseTable、DatabaseField(来自 OmegaSource 的数据模型)
+└── Project/     # Project
+Util/Logic/      # ★ 各类型节点执行器:LogicNodeHelper、LogicDatabaseNodeHelper、LogicDocNodeHelper、
+                 # LogicCacheNodeHelper、LogicBasicNodeHelper、LogicToolNodeHelper、TestApiNodeHelper、
+                 # LogicHelper、LogicHelperBak
+Feign/           # IProject、ISource
+Task/Quartz/     # MyJob、StartJob
+```
+
+#### OmegaMake(代码 / 模板生成,Nacos: omega_make)
+
+```
+Controllers/
+├── Admin/       # MakeTemplateController、MakeTemplateGategoryController、MakeDataController
+├── Feign/       # VsCodeController
+└── Base/        # HomeController、BaseController
+Services/        # MakeTemplate/MakeTemplateGategory/MakeData/Versions/VersionForProject/MakeFiles/FilesForAll(+ IService/)
+Model/
+├── Database/    # MakeTemplate、MakeTemplateGategory、MakeData、Versions、VersionForProject、MakeFiles、FilesForAll
+└── Customer/Source/   # AppProject、AppProjectModule、AppProjectPage、AppProjectVersion、AppProjectParam、
+                       # AppProjectStatic、AppProjectBottom、AppProjectPageStyle、AppModule、AppModuleFile、
+                       # AppModuleAndroidCode、AppModuleIosCode
+Util/MakeApp/    # ★ MakeAppCodePub、MakeAndroidCode、MakeAppleCode、MakeAppCodePub 生成器
+Common/          # GitHelper、OssHelper、RabbitMQClient、FileHelper
+Task/            # MakeAppHelper、MakeHelper、Quartz/(MyJob、StartJob)
+Feign/           # ISource
+```
+
+#### OmegaProject(项目管理,Nacos: omega_project)
+
+```
+Controllers/Admin/   # ProjectController、ProjectServiceController、ProjectGroupController、ProjectMemberController、
+                     # ProjectRoleController、ProjectWorkerController、ProjectBusinessModuleController、
+                     # FeatureModuleController、BusinessModuleController、ProjectApiVersionController、DeveloperController
+Controllers/Feign/   # VsCodeController
+Services/            # Project/ProjectService/ProjectGroup/ProjectMember/ProjectRole/ProjectWorker/
+                     # ProjectBusinessModule/FeatureModule/BusinessModule/ProjectApiVersion/Developer(+ IService/)
+Model/Database/      # Project、ProjectService、ProjectGroup、ProjectMember、ProjectRole、ProjectWorker、
+                     # ProjectBusinessModule、FeatureModule、BusinessModule、ProjectApiVersion、Developer
+Common/              # RabbitMQClient
+Feign/               # SysDeptFeign
+Task/Quartz/         # MyJob、StartJob
+```
+
+#### OmegaRouter(API 路由注册 / 前端 URL 字典,Nacos: omega_router)
+
+```
+Controllers/
+├── Admin/       # ApiGroupController、ApiInfoController
+├── Client/      # ApiPubController(对外提供 URL 字典:/v1/router/api/groups、/v1/router/api/list)
+└── Base/        # HomeController、BaseController
+Services/        # ApiGroupService、ApiInfoService(+ IService/)
+Model/
+├── Database/    # ApiGroup、ApiInfo
+├── Dto/         # ApiGroup*Dto、ApiInfo*Dto、Client/(ApiGroupListDto、ApiListDto、NoticeGroupDto)、Feign/AddMenuFromApiDto
+└── Vo/          # ApiGroup*Vo、ApiInfo*Vo、Client/ApiListVo、Sub/ApiGroupVo
+Feign/           # IAdmin
+```
+
+#### OmegaSource(数据源 / 资源管理,Nacos: omega_source)
+
+```
+Controllers/
+├── Admin/       # 数据源:DatabaseInfoController、DatabaseTableController、DatabaseFieldController、
+│                # DatabaseFieldIndexController、DatabaseFieldTabsController、DatabaseMakeLogController、
+│                # DatabaseOperateLogController
+│                # 服务器/环境/中间件/应用:ServerController、ServerScriptController、ServerScriptKindController、
+│                # ServerScriptLogController、EnvironmentController、MiddlewareController、ApplicationController
+│                # App 工程:AppProjectController、AppProjectParamController、AppProjectPageController、
+│                # AppProjectPageStyleController、AppProjectBottomController、AppProjectStaticController、
+│                # AppProjectVersionController、AppModuleController、AppModuleFileController、
+│                # AppModuleAndroidCodeController、AppModuleIosCodeController
+│                # API:ApiGroupController、ApiInfoController、ApiInfoParamController、ApiControllerController
+│                # 模板:MakeTemplateController、MakeTemplateGategoryController
+│                # 后台工程:BackgroundProjectController、BackgroundProjectMenuController、BackgroundProjectMenuPageController
+├── Client/      # MakeCodeController
+└── Base/        # HomeController、BaseController
+Services/        # 与上面对应(+ IService/),另有 ApiControllerService、MakeTemplateService 等
+Model/
+├── Database/    # DatabaseInfo/Table/Field/FieldIndex/FieldTabs/MakeLog/OperateLog、Server/ServerScript*/…、
+│                # Environment、Middleware、Application、AppProject*/AppModule*、ApiGroup/ApiInfo/ApiInfoParam/ApiController、
+│                # MakeTemplate*、BackgroundProject*
+└── Custom/      # ProjectService、EditTypeFrontend、Versions、Project、MakeData
+```
+
+#### OmegaUpload(文件上传,Nacos: omega_upload)
+
+```
+Controllers/Client/   # UploadController
+Controllers/Base/     # HomeController、BaseController
+Services/             # UploadService(+ IService/)
+Common/               # OssHelper(阿里云 OSS)、RabbitMQClient
+Task/Quartz/          # MyJob、StartJob
+```
+
+---
+
+## 2. 编码规范
+
+### 2.1 通用规范
+
+- **代码风格**:前后端均启用 ESLint / Stylelint / Prettier(前端)与 .editorconfig 约定(后端 4 空格缩进)。提交前必须通过 `pnpm lint && pnpm format`(前端)。
+- **命名**:统一使用有意义的业务名称,禁止无意义缩写(`a`、`temp1` 等)。
+- **注释**:关键逻辑、复杂算法、跨服务调用处必须写清「做什么 / 为什么」;中文注释。
+- **禁止**:提交本地环境相关配置(连接串、密钥)、`.env*`、`node_modules/`、`bin/`、`obj/` 等。
+- **提交规范**:功能/修复拆分提交;提交信息遵循 `type(scope): 描述`(如 `feat(user): 新增用户列表导出`)。
+- **复用优先**:新增功能前先搜索现有工具/组件/hook/服务,避免重复实现。
+
+### 2.2 前端编码规范(AdminFrontEnd)
+
+**语言与框架**
+
+- TypeScript 严格模式;优先 `Composition API + <script setup lang="ts">`。
+- 组件命名 PascalCase;普通工具文件、目录使用 **kebab-case**(如 `use_form.ts`、`manage-details`)。
+- 业务页面代码中**禁用 any**(必要时用具体类型或 `unknown` + 类型守卫)。
+
+**目录与页面结构(强制约定)**
+
+- 页面统一组织为(见 `src/views/system/dict` 示例):
+  ```
+  views/<业务域>/<页面>/
+  ├── index.vue            # 页面入口
+  ├── hooks/
+  │   ├── use_form.ts      # 表单 schema(OmegaForm 的 items)
+  │   ├── use_columns.tsx  # 表格列定义(OmegaTable 的 columns)
+  │   └── use_context.ts   # 页面上下文(跨组件共享状态)
+  └── components/          # 页面私有组件
+  ```
+- 新增 CRUD 页面**必须**优先复用 `useTable` + `useFormModal` + `OmegaTable` / `OmegaForm`,不要从零手写表格/表单。
+
+**接口层(api/)规范**
+
+- 每个业务域一个目录:`index.ts`(接口定义)+ `model.d.ts`(类型)。
+- 类型命名:入参 `API_<域>_P.*`(P = Params),出参 `API_<域>_R.*`(R = Result);公共类型放 `src/api/typings.d.ts`。
+- 接口方法统一 `http.request('<服务名>.<方法名>', params, options)`(match 与 OmegaRouter 注册 key 必须一致)。
+- 服务名前缀:`omegaAdmin.` / `omegaConfig.` / `omegaRouter.` 等(小驼峰服务名.方法名)。
+- 列表接口入参固定含 `pageNum`/`pageSize`,与 `useTable` 配合;新增/修改分别用 `*Add` / `*Update` 语义接口。
+
+**状态与存储**
+
+- 全局状态用 Pinia(`src/store/modules/`);持久化通过 `persist` 配置(zipson + secure-ls),敏感数据走加密存储。
+- 业务页面内部状态优先本地 ref / `use_context`,不要滥用全局 store。
+
+**请求层红线**
+
+- `src/utils/http/` 为请求链路核心,**未经确认不得改动** request.ts 的拦截逻辑、加密逻辑(`isEncrypt`)、合并/缓存机制。
+- 请求参数默认 DES 加密;临时调试可传 `isEncrypt: false`,但不得提交到正式代码。
+
+**权限**
+
+- 按钮/操作权限统一用 `v-role` 指令(`directives/v-role`),权限点字符串与后端 `[ActionPermissionFilter(Permission=...)]` 一致。
+- 页面路由权限由后端菜单动态下发,前端 `generator-router.tsx` 自动生成,不要在前端硬编码业务路由。
+
+**样式**
+
+- 优先 Tailwind 原子类;复杂样式用 `<style scoped lang="scss">`。
+- 主题变量走 `src/theme/`,禁止页面写死颜色值。
+
+**构建 / 规范校验**
+
+- 新增环境变量必须以 `VUE_APP_` 前缀,修改 `.env.*` 后需重启 dev/build(自动重新生成 `types/env.d.ts`)。
+- 提交前必跑:`pnpm lint`、`pnpm format`、`pnpm type:check`。
+
+### 2.3 后端编码规范(BackEnd)
+
+**分层与职责(强制约定)**
+
+```
+Controller(入参校验/鉴权) → IService/Service(业务逻辑) → Repository/BaseService(SqlSugar 数据访问)
+```
+
+- Controller 只做参数接收与返回,**不写业务逻辑**;业务一律下沉 Service。
+- 每个 Service 对应一个接口 `IService/I<Name>Service.cs` 与实现 `<Name>Service.cs`,放同一目录。
+- Service 类标注 `[AppService]`(AppServiceAttribute)由 SummerBoot 自动注册;通过构造函数注入依赖。
+
+**命名规范**
+
+- 数据库实体:`Model/Database/` 下,表名 `Sys*` 或业务名(如 `ServerProject`),用 SqlSugar `[SugarTable/SugarColumn]` 建模;公共字段继承 `SysBase`(CreateBy/UpdateBy/DelFlag 等)。
+- 入参 DTO:`XxxDto`;出参 VO:`XxxVo`。
+- 列表:`Get<Xxx>QueryVo`(查询入参)、`Get<Xxx>ListVo`(列表出参);新增/更新:`Add<Xxx>Vo` / `Update<Xxx>Vo`(对应 `AddXxxDto`)。
+- Controller 路由:优先**特性路由** `[HttpXxx("/v1/<admin|client|feign>/<模块>/<资源>/<动作>")]`,动作用 REST 语义(`page/list/get/add/update/remove`)。
+
+**Controller 规范**
+
+- 继承 `BaseController`;成功返回 `SUCCESS(data)`,失败返回 `ApiResult.Error(code, msg)` 或抛 `CustomException`。
+- 需要登录的 Controller 类标注 `[Verify]`;方法级权限用 `[ActionPermissionFilter(Permission = "system:user:query")]`(权限点格式 `模块:资源:动作`)。
+- 内部 Feign 接口:`[AllowAnonymous]` + 路由以 `/v1/feign/` 开头,放 `Controllers/Feign/` 或 `Feign/` 目录。
+- 需记录操作日志的方法加 `[Log]`(配合 `BusinessType` 枚举)。
+- 用户信息统一从 `JwtUtil.GetLoginUser(HttpContext)` 获取;写操作必须填充 CreateBy/UpdateBy。
+
+**数据访问(SqlSugar)**
+
+- 一律使用 `Queryable()` / 表达式查询,**禁止拼接原生 SQL**(防注入)。
+- 查询用表达式 & `DataPermi.FilterData` 做数据权限过滤。
+- 软删除约定:`DelFlag`("0" 正常 / "1" 删除);所有列表查询默认过滤 `DelFlag = "0"`。
+- 多数据源:通过 `OptionsSetting.DbConfigs` 配置,`ConfigId` 区分;实体归属对应库。
+- 复杂查询结果用 Mapster `Adapt<>` 映射到 Vo。
+
+**安全与异常**
+
+- 密码存储:`Function.MD532(明文 + salt)`,salt 随机 6 位,禁止明文入库。
+- 全局异常由 `GlobalExceptionMiddleware` 统一处理;业务错误抛 `CustomException`(ResultCode)返回统一格式。
+- 对外接口必须做参数校验(DataAnnotations / 手写校验),数据库异常不直接暴露给前端。
+
+**配置与启动**
+
+- 业务配置(DB/Redis/OSS/路由)一律放 Nacos(DataId `omega`),通过 `App.OptionsSetting` 读取;**禁止把业务连接串写死在 appsettings 提交**。
+- appsettings 仅保留 Logging、NacosConfig 等基础项;环境相关用 `appsettings.{Environment}.json`。
+- JSON 统一 camelCase(后端已配置全局),新增模型无需重复配置。
+
+**数据库脚本与迁移**
+
+- 结构变更:新增/修改 `Model/Database/` 实体即可(Development 环境 `InitTable` 自动建表);生产环境变更须走数据库迁移脚本,不依赖自动建表。
+
+**代码风格(以 `BackEnd/.editorconfig` 为准)**
+
+- 所有后端微服务共用 `BackEnd/.editorconfig` 固化格式规则,**后期新增/修改代码按此规范**,提交前可执行 `dotnet format` 校验。
+- 缩进:4 空格(不用 Tab);换行:LF;文件末尾保留换行;行尾不留空白。
+- 大括号:Allman 风格(左大括号独占一行);`else`/`catch`/`finally` 换行。
+- using:System 优先、按字母序分组排序,`dotnet format` 自动处理(`dotnet_sort_system_directives_first`、`dotnet_separate_import_directive_groups`)。
+- 命名:类/方法 PascalCase,局部变量/参数 camelCase,常量 UPPER_CASE 或按现有 `Constant/` 约定;**不强制自动重命名**(IDE1006 关闭)。
+- 命名空间保持 block-scoped(IDE0161 关闭),不自动改为 file-scoped。
+- 异步方法以 `Async` 结尾,避免同步阻塞(`.Result`/`.Wait()`);长方法拆小。
+- 统一在 `GlobalUsing.cs` 维护全局 using,单个文件头部不堆叠 using。
+
+执行格式统一(在仓库根目录):
+
+```bash
+dotnet format BackEnd/OmegaAdmin/OmegaAdmin.csproj whitespace --include "BackEnd/OmegaAdmin/Controllers/**/*.cs" "BackEnd/OmegaAdmin/Services/**/*.cs" "BackEnd/OmegaAdmin/Model/**/*.cs"
+dotnet format BackEnd/OmegaAdmin/OmegaAdmin.csproj style --include "BackEnd/OmegaAdmin/Controllers/**/*.cs" "BackEnd/OmegaAdmin/Services/**/*.cs" "BackEnd/OmegaAdmin/Model/**/*.cs"
+```
+
+**新建文件参考模板(以 `samples/` 目录为准)**
+
+新增 Controller / Service / IService / 实体 / Dto / Vo 时,直接参照 `samples/` 下的模板编写(示例实体为 `Project`,替换为实际业务实体名即可):
+
+| 新建文件 | 参考模板 | 模板要点 |
+| --- | --- | --- |
+| Controller | [samples/SampleController.cs](./samples/SampleController.cs) | 继承 `BaseController`;私有只读 `I<Name>Service _<Name>Service`(构造函数注入);返回统一用 `SUCCESS(data)`;标准五个动作:`get<Name>List`(GET+分页)、`get<Name>Query`(GET+详情)、`add<Name>`(POST)、`update<Name>`(PUT)、`delete<Name>/{id}`(DELETE);路由 `/v1/<服务名>/<实体>/<动作>` |
+| Service | [samples/SampleService.cs](./samples/SampleService.cs) | 标注 `[AppService(ServiceType = typeof(I<Name>Service), ServiceLifetime = LifeTime.Transient)]`;继承 `BaseService<T>` 并实现 `I<Name>Service`;查询条件用 `Expressionable.Create<T>()` + `AndIF` 拼接;列表用 `Queryable().Where(...).OrderByDescending(...).ToPage<T, <Xxx>ListVo>(page)` 分页 |
+| IService | [samples/ISampleService.cs](./samples/ISampleService.cs) | 继承 `IBaseService<T>`;每个业务方法声明 XML 注释(`<summary>` / `<param>` / `<returns>`) |
+| Model 实体 | [samples/Sample.cs](./samples/Sample.cs) | `[SugarTable("表名","说明")]` + `[Tenant("0")]`;主键 `[SugarColumn(..., IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]`;每个字段配 `/// <summary>` 注释与 `SugarColumn(ColumnDescription/Length/ColumnName)`;公共字段(delFlag/createTime/updateTime/createBy/updateBy 等)按模板统一命名 |
+| Dto | [samples/SampleDto.cs](./samples/SampleDto.cs) | 命名 `Add<Name>Dto` / `Update<Name>Dto` / `Get<Name>QueryDto`;放 `Dto.Admin` 等命名空间;属性可空 `string?`、集合 `string[]` 按需 |
+| Vo | [samples/SampleVo.cs](./samples/SampleVo.cs) | 命名 `Get<Name>ListVo` 等;放 `Vo.Admin` 等命名空间;属性对应出参字段,配 `<summary>` 注释 |
+
+> 命名规范:实体名替换 `Project` 为业务名(如 `SysDict`),Service/IService 为 `<Name>Service` / `I<Name>Service`,Vo 为 `Get<Name>ListVo`,Dto 为 `Add<Name>Dto` / `Get<Name>QueryDto`。新建后须同步在 OmegaRouter 注册 `服务名.方法名`(见 AGENTS.md §6)。
+
+---
+
+> 提示:目录与规范以实际代码为准。若代码演进导致本文档与仓库不一致,请同步更新本文档(AGENTS.md 仅维护指针)。

+ 22 - 0
samples/ISampleService.cs

@@ -0,0 +1,22 @@
+using Model;
+using Model.Base;
+using Microsoft.AspNetCore.Mvc;
+using Vo.Admin;
+
+
+namespace Services
+{
+    public interface IProjectService : IBaseService<Project>
+    {
+        /// <summary>
+        /// 项目-列表
+        /// </summary>
+        /// <param name="param">参数请求体</param>
+        /// <param name="page">分页参数</param>
+        /// <returns>列表</returns>
+        PagedInfo<GetProjectListVo> getProjectList([FromQuery] PagerInfo page, [FromQuery] Project param);
+
+
+
+    }
+}

+ 174 - 0
samples/Sample.cs

@@ -0,0 +1,174 @@
+using Mapster;
+
+
+namespace Model
+{
+    /// <summary>
+    /// 项目 project
+    /// </summary>
+    [SugarTable("project", "项目")]
+    [Tenant("0")]
+    public class Project
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "ID", IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]
+        public int id { get; set; }
+
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "版本号", ColumnName = "version")]
+        public int version { get; set; }
+
+
+        /// <summary>
+        /// 删除标记
+        /// </summary>
+        [SugarColumn(ColumnDescription = "删除标记", ColumnName = "del_flag")]
+        public int delFlag { get; set; }
+
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建时间", ColumnName = "create_time")]
+        public DateTime? createTime { get; set; }
+
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新时间", ColumnName = "update_time")]
+        public DateTime? updateTime { get; set; }
+
+
+        /// <summary>
+        /// LOGO
+        /// </summary>
+        [SugarColumn(ColumnDescription = "LOGO", Length = 255, ColumnName = "logo")]
+        public string? logo { get; set; }
+
+
+        /// <summary>
+        /// 项目名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "项目名称", Length = 128, ColumnName = "project_name")]
+        public string? projectName { get; set; }
+
+
+        /// <summary>
+        /// 微服务标记
+        /// </summary>
+        [SugarColumn(ColumnDescription = "微服务标记", ColumnName = "micro_service_flag")]
+        public bool microServiceFlag { get; set; }
+
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建人", Length = 32, ColumnName = "create_by")]
+        public string? createBy { get; set; }
+
+
+        /// <summary>
+        /// 更新人
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新人", Length = 32, ColumnName = "update_by")]
+        public string? updateBy { get; set; }
+
+
+        /// <summary>
+        /// 应用端
+        /// </summary>
+        [SugarColumn(ColumnDescription = "应用端", ColumnName = "app_type")]
+        public int appType { get; set; }
+
+
+        /// <summary>
+        /// 后端开发语言
+        /// </summary>
+        [SugarColumn(ColumnDescription = "后端开发语言", Length = 32, ColumnName = "backend_language")]
+        public string? backendLanguage { get; set; }
+
+
+        /// <summary>
+        /// 项目介绍
+        /// </summary>
+        [SugarColumn(ColumnDescription = "项目介绍", Length = 255, ColumnName = "project_detail")]
+        public string? projectDetail { get; set; }
+
+
+        /// <summary>
+        /// 使用功能
+        /// </summary>
+        [SugarColumn(ColumnDescription = "使用功能", Length = 255, ColumnName = "feature_list")]
+        public string? featureList { get; set; }
+
+
+        /// <summary>
+        /// 业务模块
+        /// </summary>
+        [SugarColumn(ColumnDescription = "业务模块", Length = 255, ColumnName = "business_list")]
+        public string? businessList { get; set; }
+
+
+        /// <summary>
+        /// 项目分组
+        /// </summary>
+        [SugarColumn(ColumnDescription = "项目分组", ColumnName = "project_group_id")]
+        public int projectGroupId { get; set; }
+
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "状态", ColumnName = "status")]
+        public int status { get; set; }
+
+
+        /// <summary>
+        /// api数据同步地址测试
+        /// </summary>
+        [SugarColumn(ColumnDescription = "api数据同步地址测试", Length = 255, ColumnName = "api_list_notice_host_dev")]
+        public string? apiListNoticeHostDev { get; set; }
+
+
+        /// <summary>
+        /// api数据同步地址生产
+        /// </summary>
+        [SugarColumn(ColumnDescription = "api数据同步地址生产", Length = 255, ColumnName = "api_list_notice_host")]
+        public string? apiListNoticeHost { get; set; }
+
+
+        /// <summary>
+        /// 网关地址测试
+        /// </summary>
+        [SugarColumn(ColumnDescription = "网关地址测试", Length = 255, ColumnName = "gateway_host_dev")]
+        public string? gatewayHostDev { get; set; }
+
+
+        /// <summary>
+        /// 网关地址生产
+        /// </summary>
+        [SugarColumn(ColumnDescription = "网关地址生产", Length = 255, ColumnName = "gateway_host")]
+        public string? gatewayHost { get; set; }
+
+
+        /// <summary>
+        /// 加密方式
+        /// </summary>
+        [SugarColumn(ColumnDescription = "加密方式", ColumnName = "encrypt_kind")]
+        public string? encryptKind { get; set; }
+
+        /// <summary>
+        /// 加密参数
+        /// </summary>
+        [SugarColumn(ColumnDescription = "加密参数", ColumnName = "encrypt_param")]
+        public string? encryptParam { get; set; }
+
+
+    }
+}

+ 108 - 0
samples/SampleController.cs

@@ -0,0 +1,108 @@
+using Vo;
+using Microsoft.AspNetCore.Mvc;
+using Model;
+using Services;
+using Model.Base;
+using Vo.Admin;
+using Mapster;
+using Infrastructure;
+
+
+namespace Controllers.Admin
+{
+    /// <summary>
+    /// Project)Controller
+    /// </summary>
+    // [ApiExplorerSettings(GroupName = "Project")]
+    public class ProjectController : BaseController
+    {
+        /// <summary>
+        /// api分组接口
+        /// </summary>
+        private readonly IProjectService _ProjectService;
+
+
+        public ProjectController(IProjectService ProjectService)
+        {
+            _ProjectService = ProjectService;
+
+        }
+
+          /// <param name="page">分页参数</param>
+        /// <summary>
+        /// 列表
+        /// </summary>
+        /// <param name="page">分页对象</param>
+        /// <param name="param">参数请求体</param>
+        /// <returns>列表</returns>
+        [HttpGet]
+        [Route("/v1/omega_project/Project/getProjectList")]
+        public IActionResult getProjectList([FromQuery] PagerInfo page, [FromQuery] Project param)
+        {
+            var response = _ProjectService.getProjectList(page, param);
+            return SUCCESS(response);
+        }
+
+
+        /// <summary>
+        /// 详情
+        /// </summary>
+        /// <param name="param">参数请求体</param>
+        /// <returns>详情</returns>
+        [HttpGet]
+        [Route("/v1/omega_project/Project/getProjectQuery")]
+        public IActionResult getProjectQuery([FromQuery] Project param)
+        {
+            var response = _ProjectService.GetFirst(m => m.id == param.id) ?? new Project();
+            return SUCCESS(response);
+        }
+
+
+        /// <summary>
+        /// 添加
+        /// </summary>
+        /// <param name="param">参数请求体</param>
+        /// <returns>添加</returns>
+        [HttpPost]
+        [Route("/v1/omega_project/Project/addProject")]
+        public IActionResult addProject([FromBody] Project param)
+        {
+            var modal = param.Adapt<Project>().ToCreate(HttpContext);
+            var response = _ProjectService.InsertReturnIdentity(modal);
+            return SUCCESS(response);
+        }
+
+
+        /// <summary>
+        /// 修改
+        /// </summary>
+        /// <param name="param">参数请求体</param>
+        /// <returns>修改</returns>
+        [HttpPut]
+        [Route("/v1/omega_project/Project/updateProject")]
+        public IActionResult updateProject([FromBody] Project param)
+        {
+            var modal = param.Adapt<Project>().ToCreate(HttpContext);
+            var response = _ProjectService.Update(modal, true);
+            return SUCCESS(response);
+        }
+
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="id">ID</param>
+        /// <returns>删除</returns>
+        [HttpDelete]
+        [Route("/v1/omega_project/Project/deleteProject/{id}")]
+        public IActionResult deleteProject(int id)
+        {
+            var response = _ProjectService.Delete(id);
+            return SUCCESS(response);
+        }
+
+
+
+
+    }
+}

+ 65 - 0
samples/SampleDto.cs

@@ -0,0 +1,65 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using Model.Base;
+
+namespace Dto.Admin
+{
+    /// <summary>
+    /// 关联服务器
+    /// </summary>
+    public class AddProjectServiceDto
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public int id { get; set; }
+
+
+        /// <summary>
+        /// 项目ID
+        /// </summary>
+        public int projectId { get; set; }
+
+        
+        /// <summary>
+        /// 服务标题
+        /// </summary>
+        public string? serviceTitle { get; set; }
+
+        
+        /// <summary>
+        /// 服务名称
+        /// </summary>
+        public string? serviceName { get; set; }
+
+
+        /// <summary>
+        /// 应用端
+        /// </summary>
+        public int appId { get; set; }
+
+
+        /// <summary>
+        /// 开发语言
+        /// </summary>
+        public string? devLanguage { get; set; }
+
+
+        /// <summary>
+        /// 服务器
+        /// </summary>
+        public string[] serverList { get; set; }
+
+
+        /// <summary>
+        /// 数据库
+        /// </summary>
+        public string[] databaseList { get; set; }
+
+
+        /// <summary>
+        /// 包名
+        /// </summary>
+        public string? packageName { get; set; }
+    }
+}

+ 44 - 0
samples/SampleService.cs

@@ -0,0 +1,44 @@
+using Attribute;
+using Model;
+using Model.Base;
+using Repository;
+using Service;
+using Microsoft.AspNetCore.Mvc;
+using Vo.Admin;
+
+
+namespace Services
+{
+    /// <summary>
+    /// 项目Service业务层处理
+    /// </summary>
+    [AppService(ServiceType = typeof(IProjectService), ServiceLifetime = LifeTime.Transient)]
+    public class ProjectService : BaseService<Project>, IProjectService
+    {
+        /// <summary>
+        /// 项目-列表
+        /// </summary>
+        /// <param name="param">参数请求体</param>
+        /// <param name="page">分页参数</param>
+        /// <returns>列表</returns>
+        public PagedInfo<GetProjectListVo> getProjectList([FromQuery] PagerInfo page, [FromQuery] Project param)
+        {
+            //拼装查询条件
+            var predicate = Expressionable.Create<Project>();
+            predicate = predicate.AndIF(!string.IsNullOrEmpty(param.projectName), m => m.projectName.Contains(param.projectName));
+            predicate = predicate.AndIF(!string.IsNullOrEmpty(param.createBy), m => m.createBy.Contains(param.createBy));
+            predicate = predicate.AndIF(!string.IsNullOrEmpty(param.updateBy), m => m.updateBy.Contains(param.updateBy));
+            predicate = predicate.AndIF(!string.IsNullOrEmpty(param.backendLanguage), m => m.backendLanguage.Contains(param.backendLanguage));
+            predicate = predicate.AndIF(param.projectGroupId > 0, m => m.projectGroupId == param.projectGroupId);
+            predicate = predicate.AndIF(param.status > 0, m => m.status == param.status);
+            var response = Queryable()
+                .Where(predicate.ToExpression())
+                .OrderByDescending(m => m.id)
+                .ToPage<Project, GetProjectListVo>(page);
+            return response;
+        }
+
+
+
+    }
+}

+ 66 - 0
samples/SampleVo.cs

@@ -0,0 +1,66 @@
+using Newtonsoft.Json;
+
+namespace Vo.Admin
+{
+    /// <summary>
+    /// 列表
+    /// </summary>
+    public class GetProjectListVo
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public int id { get; set; }
+
+
+        /// <summary>
+        /// 项目名称
+        /// </summary>
+        public string projectName { get; set; }
+
+
+        /// <summary>
+        /// 微服务标记
+        /// </summary>
+        public bool microServiceFlag { get; set; }
+
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string createBy { get; set; }
+
+
+        /// <summary>
+        /// 更新人
+        /// </summary>
+        public string updateBy { get; set; }
+
+
+        /// <summary>
+        /// 应用端
+        /// </summary>
+        public int appType { get; set; }
+
+
+        /// <summary>
+        /// 后端开发语言
+        /// </summary>
+        public string backendLanguage { get; set; }
+
+
+        /// <summary>
+        /// 项目分组
+        /// </summary>
+        public int projectGroupId { get; set; }
+
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public int status { get; set; }
+
+
+
+    }
+}