From e767d1ab272440bd4c029e8db6ecdd98a39f847d Mon Sep 17 00:00:00 2001 From: ylweng Date: Mon, 1 Sep 2025 01:07:12 +0800 Subject: [PATCH] =?UTF-8?q?refactor(backend):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E9=85=8D=E7=BD=AE=E5=B9=B6=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=87=B3MySQL=EF=BC=8C=E4=BC=98=E5=8C=96=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=92=8C=E6=8A=80=E6=9C=AF=E6=A0=88=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env.example | 13 +- backend/config/env.js | 45 ++- backend/package.json | 5 +- backend/src/config/database.js | 13 +- docs/API-README.md | 36 +- docs/admin-design.md | 4 +- docs/api-documentation.md | 621 ++++++++++++++++++++++++++++----- docs/architecture.md | 163 ++++++--- docs/detailed_design.md | 2 + docs/development_plan.md | 8 +- docs/requirements.md | 4 +- init-database.js | 36 +- mini-program/package.json | 22 +- 13 files changed, 736 insertions(+), 236 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 9d6fde2..7f9a545 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -4,8 +4,12 @@ PORT=3000 HOST=0.0.0.0 # 数据库配置 -MONGODB_URI=mongodb://localhost:27017/jiebanke -MONGODB_URI_TEST=mongodb://localhost:27017/jiebanke_test +DB_HOST=localhost +DB_PORT=3306 +DB_USER=root +DB_PASSWORD=your-mysql-password +DB_NAME=jiebandata +DB_NAME_TEST=jiebandata_test # JWT配置 JWT_SECRET=your-super-secret-jwt-key-change-this-in-production @@ -30,6 +34,11 @@ REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD= +# MySQL连接池配置 +DB_CONNECTION_LIMIT=10 +DB_CHARSET=utf8mb4 +DB_TIMEZONE=+08:00 + # 第三方API配置 MAP_API_KEY=your-map-api-key SMS_API_KEY=your-sms-api-key diff --git a/backend/config/env.js b/backend/config/env.js index 8683347..0c037f8 100644 --- a/backend/config/env.js +++ b/backend/config/env.js @@ -6,12 +6,15 @@ const config = { // 开发环境 development: { port: process.env.PORT || 3100, - mongodb: { - uri: process.env.MONGODB_URI || 'mongodb://localhost:27017/jiebanke_dev', - options: { - useNewUrlParser: true, - useUnifiedTopology: true - } + mysql: { + host: process.env.DB_HOST || '192.168.0.240', + port: process.env.DB_PORT || 3306, + user: process.env.DB_USER || 'root', + password: process.env.DB_PASSWORD || 'aiotAiot123!', + database: process.env.DB_NAME || 'jiebandata', + connectionLimit: 10, + charset: 'utf8mb4', + timezone: '+08:00' }, jwt: { secret: process.env.JWT_SECRET || 'dev-jwt-secret-key-2024', @@ -36,12 +39,15 @@ const config = { // 测试环境 test: { port: process.env.PORT || 3100, - mongodb: { - uri: process.env.MONGODB_URI || 'mongodb://localhost:27017/jiebanke_test', - options: { - useNewUrlParser: true, - useUnifiedTopology: true - } + mysql: { + host: process.env.DB_HOST || '192.168.0.240', + port: process.env.DB_PORT || 3306, + user: process.env.DB_USER || 'root', + password: process.env.DB_PASSWORD || 'aiotAiot123!', + database: process.env.DB_NAME || 'jiebandata_test', + connectionLimit: 5, + charset: 'utf8mb4', + timezone: '+08:00' }, jwt: { secret: process.env.JWT_SECRET || 'test-jwt-secret-key-2024', @@ -57,12 +63,15 @@ const config = { // 生产环境 production: { port: process.env.PORT || 3100, - mongodb: { - uri: process.env.MONGODB_URI, - options: { - useNewUrlParser: true, - useUnifiedTopology: true - } + mysql: { + host: process.env.DB_HOST || '129.211.213.226', + port: process.env.DB_PORT || 9527, + user: process.env.DB_USER || 'root', + password: process.env.DB_PASSWORD || 'aiotAiot123!', + database: process.env.DB_NAME || 'jiebandata', + connectionLimit: 20, + charset: 'utf8mb4', + timezone: '+08:00' }, jwt: { secret: process.env.JWT_SECRET, diff --git a/backend/package.json b/backend/package.json index 282d2f7..682a115 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,7 +8,10 @@ "dev": "nodemon src/server.js", "test": "jest", "lint": "eslint src/**/*.js", - "migrate": "node src/utils/migrate.js" + "migrate": "node src/utils/migrate.js", + "init-test-data": "node scripts/init-test-data.js", + "test-api": "node scripts/test-api-endpoints.js", + "test-db": "node scripts/test-database-connection.js" }, "keywords": [ "mini-program", diff --git a/backend/src/config/database.js b/backend/src/config/database.js index 88544b1..99c6f37 100644 --- a/backend/src/config/database.js +++ b/backend/src/config/database.js @@ -1,22 +1,21 @@ const mysql = require('mysql2/promise'); +const config = require('./env'); // 数据库配置 const dbConfig = { host: process.env.DB_HOST || '129.211.213.226', port: process.env.DB_PORT || 9527, user: process.env.DB_USER || 'root', - password: process.env.DB_PASSWORD || 'aiotAiot123!', + password: process.env.DB_PASSWORD || 'Aiot123', database: process.env.DB_NAME || 'jiebandata', - connectionLimit: 10, - charset: 'utf8mb4', - timezone: '+08:00', + connectionLimit: process.env.DB_CONNECTION_LIMIT || 10, + charset: process.env.DB_CHARSET || 'utf8mb4', + timezone: process.env.DB_TIMEZONE || '+08:00', // 连接池配置 waitForConnections: true, queueLimit: 0, // 超时配置 - connectTimeout: 10000, // 10秒连接超时 - acquireTimeout: 10000, // 10秒获取连接超时 - timeout: 10000 // 10秒查询超时 + connectTimeout: 10000 // 10秒连接超时 }; // 创建连接池 diff --git a/docs/API-README.md b/docs/API-README.md index 75484c5..cdf3a91 100644 --- a/docs/API-README.md +++ b/docs/API-README.md @@ -43,34 +43,34 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ## 📋 核心接口 ### 用户认证 -- `POST /auth/register` - 用户注册 -- `POST /auth/login` - 用户登录 -- `POST /auth/wechat-login` - 微信登录 -- `GET /auth/me` - 获取当前用户信息 +- `POST /api/v1/auth/register` - 用户注册 +- `POST /api/v1/auth/login` - 用户登录 +- `POST /api/v1/auth/wechat-login` - 微信登录 +- `GET /api/v1/auth/me` - 获取当前用户信息 ### 旅行服务 -- `POST /travel/plans` - 创建旅行计划 -- `GET /travel/plans` - 获取旅行计划列表 -- `GET /travel/matches` - 匹配旅行伙伴 +- `POST /api/v1/travel/plans` - 创建旅行计划 +- `GET /api/v1/travel/plans` - 获取旅行计划列表 +- `GET /api/v1/travel/matches` - 匹配旅行伙伴 ### 动物认领 -- `GET /animals` - 获取可认领动物列表 -- `POST /animals/{id}/claim` - 认领动物 -- `GET /animals/claims` - 获取认领记录 +- `GET /api/v1/animals` - 获取可认领动物列表 +- `POST /api/v1/animals/{id}/claim` - 认领动物 +- `GET /api/v1/animals/claims` - 获取认领记录 ### 商家服务 -- `POST /merchants/register` - 商家注册 -- `POST /merchants/products` - 发布商品/服务 -- `GET /merchants/orders` - 获取商家订单 +- `POST /api/v1/merchants/register` - 商家注册 +- `POST /api/v1/merchants/products` - 发布商品/服务 +- `GET /api/v1/merchants/orders` - 获取商家订单 ### 推广奖励 -- `GET /promotion/link` - 获取推广链接 -- `GET /promotion/stats` - 获取推广数据 -- `POST /promotion/withdraw` - 申请提现 +- `GET /api/v1/promotion/link` - 获取推广链接 +- `GET /api/v1/promotion/stats` - 获取推广数据 +- `POST /api/v1/promotion/withdraw` - 申请提现 ### 官网接口 -- `POST /website/merchant/apply` - 提交商家入驻申请 -- `GET /website/cases` - 获取成功案例列表 +- `POST /api/v1/website/merchant/apply` - 提交商家入驻申请 +- `GET /api/v1/website/cases` - 获取成功案例列表 ## 🎯 响应格式 diff --git a/docs/admin-design.md b/docs/admin-design.md index cc9c14e..f3eb9fe 100644 --- a/docs/admin-design.md +++ b/docs/admin-design.md @@ -14,8 +14,8 @@ ## 2. 系统架构 ### 2.1 技术栈 -- **前端**: Vue 3 + TypeScript + Element Plus -- **后端**: Spring Boot + MySQL + Redis +- **前端**: Vue 3 + TypeScript + Ant Design Vue +- **后端**: Node.js + Express + MySQL + Redis - **认证**: JWT + RBAC权限控制 - **部署**: Docker + Nginx diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 9441536..48086ce 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -2,12 +2,16 @@ ## 基础信息 -**Base URL**: `http://localhost:3000/api/v1` +**Base URL**: `http://localhost:3100/api/v1` **认证方式**: Bearer Token (JWT) **响应格式**: JSON +**API版本**: v1 + +**开发状态**: 开发中 + ## 响应格式 ### 成功响应 @@ -34,6 +38,19 @@ } ``` +## 通用状态码 + +| 状态码 | 说明 | +|--------|------| +| 200 | 请求成功 | +| 201 | 创建成功 | +| 400 | 请求参数错误 | +| 401 | 未授权访问 | +| 403 | 权限不足 | +| 404 | 资源不存在 | +| 429 | 请求过于频繁 | +| 500 | 服务器内部错误 | + ## 认证接口 ### 1. 用户注册 @@ -94,26 +111,6 @@ } ``` -### 2.1 微信登录 - -**Endpoint**: `POST /auth/wechat-login` - -**描述**: 微信授权登录 - -**请求体**: -```json -{ - "code": "string, required, 微信授权码", - "userInfo": { - "nickName": "string, optional, 微信昵称", - "avatarUrl": "string, optional, 微信头像", - "gender": "number, optional, 性别(0:未知,1:男,2:女)" - } -} -``` - -**响应**: 同登录接口 - **响应**: ```json { @@ -139,7 +136,83 @@ } ``` -### 3. 微信登录 +### 3. 获取当前用户信息 + +**Endpoint**: `GET /auth/me` + +**认证**: 需要Bearer Token + +**描述**: 获取当前登录用户信息 + +**响应**: +```json +{ + "success": true, + "code": 200, + "data": { + "user": { + "id": 1, + "username": "testuser", + "nickname": "测试用户", + "email": "test@example.com", + "phone": "13800138000", + "avatar": "https://example.com/avatar.jpg", + "gender": "male", + "birthday": "1990-01-01", + "points": 1000, + "level": 3, + "balance": 500.00, + "travel_count": 5, + "animal_adopt_count": 2, + "flower_order_count": 3, + "status": "active", + "created_at": "2025-01-01T00:00:00.000Z", + "updated_at": "2025-01-01T00:00:00.000Z", + "last_login_at": "2025-01-01T00:00:00.000Z" + } + } +} +``` + +### 4. 更新用户信息 + +**Endpoint**: `PUT /auth/profile` + +**认证**: 需要Bearer Token + +**描述**: 更新用户个人信息 + +**请求体**: +```json +{ + "nickname": "string, optional, 昵称", + "avatar": "string, optional, 头像URL", + "gender": "string, optional, 性别(male/female/other)", + "birthday": "string, optional, 生日(YYYY-MM-DD)" +} +``` + +**响应**: +```json +{ + "success": true, + "code": 200, + "message": "用户信息更新成功", + "data": { + "user": { + "id": 1, + "username": "testuser", + "nickname": "新昵称", + "avatar": "https://example.com/new-avatar.jpg", + "gender": "male", + "birthday": "1990-01-01", + "updated_at": "2025-01-01T00:00:00.000Z" + } + } +} +``` + +### 5. 微信登录 **Endpoint**: `POST /auth/wechat-login` @@ -157,7 +230,28 @@ } ``` -**响应**: 同登录接口 +**响应**: +```json +{ + "success": true, + "code": 200, + "message": "微信登录成功", + "data": { + "user": { + "id": 1, + "username": "testuser", + "nickname": "测试用户", + "avatar": "https://example.com/avatar.jpg", + "gender": "male", + "points": 100, + "level": 2, + "status": "active", + "last_login_at": "2025-01-01T00:00:00.000Z" + }, + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } +} +``` ### 4. 获取当前用户信息 @@ -197,21 +291,21 @@ } ``` -### 5. 更新用户信息 +### 6. 更新用户信息 -## 管理员接口 +**Endpoint**: `PUT /auth/profile` -### 6. 管理员登录 +**认证**: 需要Bearer Token -**Endpoint**: `POST /auth/admin/login` - -**描述**: 管理员登录获取访问令牌 +**描述**: 更新用户个人信息 **请求体**: ```json { - "username": "string, required, 管理员用户名", - "password": "string, required, 密码" + "nickname": "string, optional, 昵称", + "avatar": "string, optional, 头像URL", + "gender": "string, optional, 性别(male/female/other)", + "birthday": "string, optional, 生日(YYYY-MM-DD)" } ``` @@ -220,36 +314,215 @@ { "success": true, "code": 200, - "message": "登录成功", + "message": "用户信息更新成功", "data": { "user": { "id": 1, - "username": "admin", - "email": "admin@jiebanke.com", - "real_name": "管理员", - "avatar": "", - "status": "active", - "last_login_at": "2025-01-01T00:00:00.000Z" - }, - "roles": [ + "username": "testuser", + "nickname": "新昵称", + "avatar": "https://example.com/new-avatar.jpg", + "gender": "male", + "birthday": "1990-01-01", + "updated_at": "2025-01-01T00:00:00.000Z" + } + } +} +``` + +## 用户服务接口 + +### 1. 获取用户列表 + +**Endpoint**: `GET /users` + +**认证**: 需要Bearer Token + +**描述**: 获取用户列表(管理员权限) + +**查询参数**: +- `page` (可选): 页码,默认1 +- `limit` (可选): 每页数量,默认20 +- `username` (可选): 用户名模糊搜索 +- `status` (可选): 状态过滤 + +**响应**: +```json +{ + "success": true, + "code": 200, + "data": { + "users": [ { - "id": 2, - "name": "admin", - "description": "普通管理员" + "id": 1, + "username": "testuser", + "nickname": "测试用户", + "email": "test@example.com", + "phone": "13800138000", + "avatar": "https://example.com/avatar.jpg", + "gender": "male", + "points": 100, + "level": 2, + "status": "active", + "created_at": "2025-01-01T00:00:00.000Z" } ], - "permissions": [ - "user:manage", - "content:review", - "content:publish", - "data:view", - "data:export" - ], - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + "pagination": { + "total": 100, + "page": 1, + "limit": 20, + "pages": 5 + } } } ``` +### 2. 获取用户详情 + +**Endpoint**: `GET /users/{id}` + +**认证**: 需要Bearer Token + +**描述**: 获取指定用户的详细信息 + +**响应**: +```json +{ + "success": true, + "code": 200, + "data": { + "user": { + "id": 1, + "username": "testuser", + "nickname": "测试用户", + "email": "test@example.com", + "phone": "13800138000", + "avatar": "https://example.com/avatar.jpg", + "gender": "male", + "birthday": "1990-01-01", + "points": 1000, + "level": 3, + "balance": 500.00, + "travel_count": 5, + "animal_adopt_count": 2, + "flower_order_count": 3, + "status": "active", + "created_at": "2025-01-01T00:00:00.000Z", + "updated_at": "2025-01-01T00:00:00.000Z" + } + } +} +``` + +## 8. 管理员接口 + +### 8.1 管理员登录 +- **Endpoint**: POST /api/v1/admin/login +- **认证要求**: 无 +- **描述**: 管理员登录系统 +- **请求体**: +```json +{ + "username": "admin", + "password": "password123" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "admin": { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "nickname": "超级管理员", + "avatar": "https://example.com/avatar.jpg", + "role": "super_admin", + "status": 1, + "last_login": "2024-01-15T10:30:00.000Z" + } + } +} +``` + +### 8.2 获取管理员信息 +- **Endpoint**: GET /api/v1/admin/profile +- **认证要求**: Bearer Token +- **描述**: 获取当前登录管理员信息 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "nickname": "超级管理员", + "avatar": "https://example.com/avatar.jpg", + "role": "super_admin", + "status": 1, + "last_login": "2024-01-15T10:30:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-15T10:30:00.000Z" + } +} +``` + +### 8.3 更新管理员信息 +- **Endpoint**: PUT /api/v1/admin/profile +- **认证要求**: Bearer Token +- **描述**: 更新当前登录管理员信息 +- **请求体**: +```json +{ + "nickname": "新昵称", + "email": "newemail@example.com", + "avatar": "https://example.com/new-avatar.jpg" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "更新成功", + "data": { + "id": 1, + "username": "admin", + "email": "newemail@example.com", + "nickname": "新昵称", + "avatar": "https://example.com/new-avatar.jpg", + "role": "super_admin", + "status": 1 + } +} +``` + +### 8.4 修改密码 +- **Endpoint**: PUT /api/v1/admin/password +- **认证要求**: Bearer Token +- **描述**: 修改当前登录管理员密码 +- **请求体**: +```json +{ + "old_password": "oldpassword123", + "new_password": "newpassword456" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "密码修改成功" +} +``` + ### 7. 获取管理员信息 **Endpoint**: `GET /auth/admin/me` @@ -293,26 +566,23 @@ } ``` -### 8. 用户管理接口 +### 9. 用户管理接口 -#### 8.1 获取用户列表 - -**Endpoint**: `GET /admin/users` - -**认证**: 需要Bearer Token,需要user:manage权限 - -**查询参数**: -- `page` (可选): 页码,默认1 -- `limit` (可选): 每页数量,默认20 -- `username` (可选): 用户名模糊搜索 -- `user_type` (可选): 用户类型过滤 -- `status` (可选): 状态过滤 - -**响应**: +#### 9.1 获取用户列表 +- **Endpoint**: GET /api/v1/users +- **认证要求**: Bearer Token,需要user:manage权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `username` (可选): 用户名模糊搜索 + - `user_type` (可选): 用户类型过滤 + - `status` (可选): 状态过滤 +- **响应**: ```json { "success": true, "code": 200, + "message": "获取成功", "data": { "users": [ { @@ -339,20 +609,43 @@ } ``` -#### 8.2 更新用户状态 - -**Endpoint**: `PUT /admin/users/{id}/status` - -**认证**: 需要Bearer Token,需要user:manage权限 - -**请求体**: +#### 9.2 获取用户详情 +- **Endpoint**: GET /api/v1/users/{id} +- **认证要求**: Bearer Token,需要user:manage权限 +- **响应**: ```json { - "status": "string, required, 状态(active/inactive)" + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "user": { + "id": 1, + "username": "testuser", + "nickname": "测试用户", + "email": "test@example.com", + "phone": "13800138000", + "user_type": "farmer", + "status": "active", + "points": 100, + "level": 2, + "created_at": "2025-01-01T00:00:00.000Z", + "last_login_at": "2025-01-01T00:00:00.000Z" + } + } } ``` -**响应**: +#### 9.3 更新用户状态 +- **Endpoint**: PUT /api/v1/users/{id}/status +- **认证要求**: Bearer Token,需要user:manage权限 +- **请求体**: +```json +{ + "status": "active" +} +``` +- **响应**: ```json { "success": true, @@ -361,25 +654,173 @@ } ``` -### 9. 内容管理接口 - -#### 9.1 获取内容列表 - -**Endpoint**: `GET /admin/contents` - -**认证**: 需要Bearer Token,需要content:review权限 - -**查询参数**: -- `page` (可选): 页码,默认1 -- `limit` (可选): 每页数量,默认20 -- `type` (可选): 内容类型 -- `status` (可选): 审核状态 - -**响应**: +#### 9.4 删除用户 +- **Endpoint**: DELETE /api/v1/users/{id} +- **认证要求**: Bearer Token,需要user:manage权限 +- **响应**: ```json { "success": true, "code": 200, + "message": "用户删除成功" +} +``` + +### 10. 系统管理接口 + +#### 10.1 获取系统信息 +- **Endpoint**: GET /api/v1/admin/system/info +- **认证要求**: Bearer Token,需要system:view权限 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "system": { + "version": "1.0.0", + "node_version": "v18.17.0", + "platform": "linux", + "arch": "x64", + "uptime": 123456, + "memory_usage": { + "total": 17179869184, + "used": 8589934592, + "free": 8589934592 + }, + "cpu_usage": 25.5 + } + } +} +``` + +#### 10.2 获取系统服务列表 +- **Endpoint**: GET /api/v1/admin/system/services +- **认证要求**: Bearer Token,需要system:manage权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `type` (可选): 服务类型(database/cache/mq) + - `status` (可选): 服务状态(running/stopped) +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "services": [ + { + "id": "mysql", + "name": "MySQL数据库", + "type": "database", + "status": "running", + "host": "localhost", + "port": 3306, + "description": "主数据库服务", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-15T10:30:00.000Z" + } + ], + "pagination": { + "total": 5, + "page": 1, + "limit": 20, + "pages": 1 + } + } +} +``` + +#### 10.3 更新服务状态 +- **Endpoint**: PUT /api/v1/admin/system/services/{id}/status +- **认证要求**: Bearer Token,需要system:manage权限 +- **请求体**: +```json +{ + "status": "stopped" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "服务状态更新成功" +} +``` + +#### 10.4 获取系统配置 +- **Endpoint**: GET /api/v1/admin/system/configs +- **认证要求**: Bearer Token,需要system:config权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `group` (可选): 配置分组 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "configs": [ + { + "id": "site_name", + "name": "网站名称", + "value": "结伴客", + "type": "string", + "group": "basic", + "description": "网站显示名称", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-15T10:30:00.000Z" + } + ], + "pagination": { + "total": 10, + "page": 1, + "limit": 20, + "pages": 1 + } + } +} +``` + +#### 10.5 更新系统配置 +- **Endpoint**: PUT /api/v1/admin/system/configs/{id} +- **认证要求**: Bearer Token,需要system:config权限 +- **请求体**: +```json +{ + "value": "新网站名称" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "配置更新成功" +} +``` + +### 11. 内容管理接口 + +#### 11.1 获取内容列表 +- **Endpoint**: GET /admin/contents +- **认证要求**: Bearer Token,需要content:review权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `type` (可选): 内容类型 + - `status` (可选): 审核状态 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", "data": { "contents": [ { diff --git a/docs/architecture.md b/docs/architecture.md index 0b8d2e5..daae186 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -4,35 +4,100 @@ ### 1.1 架构图 +```mermaid +graph TB + subgraph "客户端层" + A[微信小程序 uni-app] + B[后台管理系统 Vue 3 + Ant Design] + C[官网系统 HTML5 + Bootstrap] + end + + subgraph "接入层" + D[Express API Gateway] + end + + subgraph "应用服务层" + E[认证服务] + F[用户服务] + G[旅行服务] + H[动物服务] + I[订单服务] + J[管理员服务] + end + + subgraph "基础设施层" + K[MySQL 数据库] + L[Redis 缓存] + M[RabbitMQ 消息队列] + N[文件存储] + end + + subgraph "监控运维层" + O[Swagger API 文档] + P[Winston 日志系统] + Q[健康检查监控] + end + + A --> D + B --> D + C --> D + D --> E + D --> F + D --> G + D --> H + D --> I + D --> J + + E --> K + F --> K + G --> K + H --> K + I --> K + J --> K + + E --> L + F --> L + G --> L + + I --> M + + E --> N + F --> N + H --> N + + D --> O + D --> P + D --> Q +``` + **系统架构层次说明:** **1. 客户端层** - **微信小程序**: 基于uni-app开发,提供用户端功能 -- **后台管理系统**: 基于Vue.js 3 + Ant Design开发,提供管理功能 +- **后台管理系统**: 基于Vue.js 3 + TypeScript + Ant Design Vue + Pinia开发,提供管理功能 - **官网系统**: 基于HTML5 + Bootstrap开发,提供企业宣传功能 **2. 接入层** -- **API网关**: 基于Nginx + Node.js,提供统一的API接入和路由分发 +- **API网关**: 基于Express.js框架,提供统一的API接入、路由分发、安全防护和请求处理,所有API路径前缀为`/api/v1` **3. 应用服务层** -- **认证服务**: 用户身份认证和权限管理 -- **用户服务**: 用户信息管理和个人中心功能 -- **旅行服务**: 旅行计划创建、查询和匹配功能 -- **动物服务**: 动物信息管理和认领功能 -- **商家服务**: 商家认证、商品和服务管理 -- **支付服务**: 支付处理和交易管理 -- **推广服务**: 推广活动和奖励管理 +- **认证服务**: 用户身份认证、JWT令牌管理和权限控制 +- **用户服务**: 用户信息管理、个人中心功能和用户统计 +- **旅行服务**: 旅行计划创建、查询、匹配和管理功能 +- **动物服务**: 动物信息管理、认领流程和动物统计 +- **订单服务**: 订单创建、支付处理和交易管理 +- **管理员服务**: 管理员权限管理和系统配置 **4. 基础设施层** -- **MySQL数据库**: 主从复制架构,存储核心业务数据 -- **Redis缓存**: 集群模式,提供高性能缓存服务 -- **RabbitMQ消息队列**: 异步消息处理和解耦 -- **对象存储**: 腾讯云COS,存储图片和文件资源 +- **MySQL数据库**: 单实例架构,存储核心业务数据,使用连接池优化性能(测试环境: 192.168.0.240:3306,生产环境: 129.211.213.226:9527) +- **Redis缓存**: 单实例模式,提供会话管理和数据缓存服务 +- **RabbitMQ消息队列**: 异步消息处理和解耦(待实现) +- **文件存储**: 本地文件系统,存储用户上传的图片和文件资源 **5. 监控运维层** -- **监控系统**: Prometheus + Grafana,系统性能监控 -- **日志系统**: ELK Stack,日志收集和分析 -- **CI/CD**: Jenkins + Docker,持续集成和部署 +- **Swagger API文档**: 自动生成的API接口文档 +- **Winston日志系统**: 结构化日志记录和分析 +- **健康检查监控**: 系统状态监控和性能统计 **架构连接关系:** - 所有客户端通过API网关访问后端服务 @@ -274,52 +339,36 @@ ## 2. 技术栈选型 ### 2.1 后端技术栈 -API服务: Node.js + Express.js + TypeScript + RESTful API -数据库: MySQL 8.0 (包含RBAC权限管理表结构) -缓存系统: Redis Cluster -消息队列: RabbitMQ(用于异步处理) -文件存储: 腾讯云对象存储 -实时通信: WebSocket(用于实时通知和聊天功能) -API文档: Swagger + OpenAPI 3.0 -权限管理: JWT + RBAC (基于角色的访问控制) -### 2.2 前端技术栈 -#### 微信小程序技术栈 -- **开发框架**: uni-app -- **开发语言**: JavaScript/TypeScript -- **UI框架**: WeUI -- **状态管理**: Redux -- **构建工具**: Webpack -- **包管理**: npm/yarn +| 技术组件 | 版本 | 用途 | 选型理由 | +|---------|------|------|----------| +| Node.js | >=16.0.0 | 运行时环境 | 高性能、异步I/O、丰富的生态系统 | +| Express.js | ^4.18.2 | Web框架 | 轻量级、灵活、中间件生态丰富 | +| MySQL2 | ^3.14.3 | 数据库驱动 | 支持Promise、连接池、性能优化 | +| JWT | ^9.0.2 | 身份认证 | 无状态、安全、易于分布式部署 | +| bcryptjs | ^2.4.3 | 密码加密 | 安全性高、性能适中 | +| Redis | ^5.8.2 | 缓存/会话 | 内存存储、高性能、支持数据结构 | +| RabbitMQ | ^0.10.9 | 消息队列 | 异步处理、系统解耦(待实现) | +| Swagger | ^6.2.8 | API文档 | 自动化文档、接口测试 | +| Winston | ^3.11.0 | 日志系统 | 结构化日志、多传输方式 | -#### 后台管理系统技术栈 (Vue.js 3 + TypeScript + Ant Design Vue + Pinia) -- **核心框架**: Vue.js 3.3.0 (Composition API + `