Files
Wx_WxCheck_Prod/openspec/project.md

6.1 KiB
Raw Permalink Blame History

Project Context

Purpose

本仓库实现"微信小程序通信记录管理系统":小程序端采集/展示对话与用户信息;后端提供登录、会话记录的增删改查、文件上传与管理查询能力;数据存储在 MariaDB/MySQL。后台管理网站提供管理员操作界面用于系统配置、数据管理和监控。

Repository Layout (Source of Truth)

  • 小程序端:CommunicationRecords/
    • 页面:pages/chat(聊天与会话列表)、pages/logs(登录/注册/隐私协议)等
    • 公共:utils/config.js(环境与 API 根地址)
  • 后端:WxCheckMvc/ASP.NET Core 8MVC + Web API Controller
    • API ControllersControllers/LoginController.csControllers/CheckController.csControllers/AdminController.cs
    • 配置:appsettings.json
  • 后台管理网站:admin-web/Vue 3.x + Element Plus + Vite
    • 页面:登录页、会话记录管理页、用户管理页等
    • 路由:src/router/index.jsvue-router配置
    • 组件:src/components/(模块化组件)
    • 状态管理:src/store/(深色/浅色模式状态)
    • 样式:src/styles/(响应式样式、主题样式)
  • 数据库:wx_xcx_check.sql(根目录)与 WxCheckMvc/wx_xcx_check.sql(均为 MariaDB/MySQL 导出)

Tech Stack

  • Client:
    • 微信小程序JavaScript + WXML/WXSS依赖 WechatSI 插件(语音识别/录音管理器)
    • 后台管理网站Vue 3.x + Element Plus + Vite
      • 路由管理vue-router
      • 状态管理Pinia用于深色/浅色模式切换)
      • HTTP客户端axios
      • 构建工具Vite
      • 开发环境Node.js
  • Server: ASP.NET Core 8ControllersWithViews + API Controller数据库访问使用 MySql.Data
  • DB: MariaDB/MySQLschema: wx_xcx_check
  • Cache/Stream: Redis通过 CSRedis;用于 Redis Stream 推送与读取消息)
  • External APIs:
    • 微信:https://api.weixin.qq.com/sns/jscode2session(用 code 换取 openid
    • 高德地图:逆地理编码(经纬度 → 地址)

High-Level Architecture

  1. 小程序端通过 wx.login() 获取 code,调用后端登录接口换取用户信息与 Token当前 token 主要用于前端保存/展示)。
  2. 小程序端对话发送/修改/删除通过后端 API 写入数据库(表 xcx_conversation)。
  3. 后端在新增会话时AddConversation会将会话与用户信息写入 Redis Streamkey: xcx_msggroup: xcx_group),用于异步消费(例如外部系统订阅)。
  4. 后端管理查询AdminController提供查询用户与会话的接口。
  5. 后台管理网站:
    • 使用 Vue 3.x + Element Plus + Vite 构建
    • 通过 vue-router 管理多页面路由
    • 使用 Pinia 管理深色/浅色模式状态
    • 通过 axios 调用后端 AdminController 提供的 API
    • 响应式设计:优先适配手机宽度,电脑其次
    • 前端验证:固定账号密码均为 Admin
    • 模块化设计:所有页面和组件采用模块化思路

Core Domain Model

  • 用户(xcx_users
    • UserKey:用户唯一标识(实际为微信 openid
    • 可补全资料:UserNameWeChatNamePhoneNumberAvatarUrlDepartment
    • 状态:IsDisabled(禁用)
  • 会话记录(xcx_conversation
    • Guid:会话唯一标识(由后端生成或前端传入)
    • MessageType1 公有 / 2 私有
    • IsDeleted:软删除标记
    • RecordTimeUTCStamp:用于排序与分页

API Surface (Entry Points)

后端 API 统一路由前缀:/api/{Controller}/{Action}

  • 登录与用户:/api/Login/Login/api/Login/Register
  • 会话与文件:/api/Check/AddConversationGetConversationsGetConversationsByPageUpdateConversationDeleteConversationGetConversationByGuidUploadFileCheckAddressReadMessageFromRedis
  • 管理查询:/api/Admin/QueryUsers/api/Admin/QueryConversations

Business Rules (High Impact)

  • 登录
    • 使用 code 向微信换取 openid,以 openid 作为 UserKey
    • xcx_users 中不存在该 UserKey,后端会插入一条“未完善资料”的用户记录(仅含 UserKey/FirstLoginTime 等)。
  • 注册/资料完善
    • 仅允许更新已存在的用户(若不存在返回 NotFound
    • PhoneNumber 会被清洗为纯数字并校验为 ^1\d{10}$
    • UserName 会去除标点/符号/空白后校验不为空。
  • 会话
    • 删除为软删除(IsDeleted = 1)。
    • 查询默认过滤 IsDeleted = 0
    • 分页接口限制 PageSize 1..100。

Known Limitations / Risks

  • 鉴权“已配置但未启用”:后端配置了 JWT Bearer但当前请求管线未启用 UseAuthentication(),且控制器/Action 未使用 [Authorize];因此 API 当前等同于“无强制鉴权”。
  • 配置敏感信息明文:WxCheckMvc/appsettings.json 中包含数据库密码、微信 AppSecret、JWT SecretKey 等,存在泄露风险。
  • 环境选择被强制:小程序端 CommunicationRecords/utils/config.js 固定返回 release,导致无法按 envVersion 自动切换。
  • 小程序存在硬编码域名:部分页面直接写死 https://wx-xcx-check.blv-oa.com:4433,未统一走 config.baseUrl
  • Redis 连接固定为 127.0.0.1:6800 且无密码(见 CSRedisCacheHelper),生产部署需额外约束网络与权限。
  • 文件上传缺少类型/大小白名单:UploadFile 仅校验目录名字符集,未对扩展名、内容类型、大小做进一步限制。

Conventions

  • C#PascalCase类型/方法),配置键区分大小写但项目内存在 JwT/JWT 混用历史;以 appsettings.jsonJwT:* 为准。
  • JScamelCase小程序请求优先使用 config.baseUrl
  • Vue 3.x
    • 组件命名PascalCaseConversationList.vue
    • 变量/方法camelCase
    • 常量UPPER_SNAKE_CASE
    • 使用 Composition API 和 <script setup> 语法
    • 组件模块化:每个组件职责单一,可复用
  • 样式:
    • 使用 CSS Modules 或 Scoped CSS
    • 响应式设计:优先适配手机宽度(<768px其次适配桌面
    • 深色/浅色模式:使用 Element Plus 的主题切换功能