docs: 更新项目文档,完善需求和技术细节

This commit is contained in:
ylweng
2025-09-01 02:35:41 +08:00
parent e1647902e2
commit ad20888cd4
57 changed files with 961 additions and 156 deletions

View File

@@ -1,261 +0,0 @@
# 爱鉴花小程序后端API接口文档
## 概述
本文档详细描述了爱鉴花小程序后端RESTful API接口规范基于OpenAPI 3.0标准。
## 基础信息
- **Base URL**: `http://localhost:3200/api/v1`
- **认证方式**: Bearer Token (JWT)
- **响应格式**: JSON
## 认证接口
### 用户注册
**POST** `/auth/register`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| username | string | 是 | 用户名 |
| password | string | 是 | 密码最少6位 |
| phone | string | 是 | 手机号 |
| email | string | 否 | 邮箱 |
| user_type | string | 否 | 用户类型farmer/buyer/admin |
**响应示例**:
```json
{
"code": 201,
"message": "注册成功",
"data": {
"user_id": 1,
"username": "testuser",
"phone": "13800138000",
"email": "user@example.com",
"user_type": "farmer",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
```
### 用户登录
**POST** `/auth/login`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| login | string | 是 | 用户名/手机号/邮箱 |
| password | string | 是 | 密码 |
**响应示例**:
```json
{
"code": 200,
"message": "登录成功",
"data": {
"user_id": 1,
"username": "testuser",
"phone": "13800138000",
"email": "user@example.com",
"user_type": "farmer",
"avatar_url": "/uploads/avatars/avatar.jpg",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
```
## 用户接口
### 获取用户信息
**GET** `/users/me`
**请求头**:
```
Authorization: Bearer <token>
```
**响应示例**:
```json
{
"code": 200,
"message": "获取成功",
"data": {
"id": 1,
"username": "testuser",
"phone": "13800138000",
"email": "user@example.com",
"user_type": "farmer",
"avatar_url": "/uploads/avatars/avatar.jpg",
"created_at": "2023-01-01T00:00:00Z",
"last_login": "2023-01-01T00:00:00Z"
}
}
```
### 更新用户信息
**PUT** `/users/{id}`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| email | string | 否 | 邮箱 |
| real_name | string | 否 | 真实姓名 |
| avatar_url | string | 否 | 头像URL |
## 商品接口
### 获取商品列表
**GET** `/products`
**查询参数**:
| 参数名 | 类型 | 说明 |
|--------|------|------|
| page | integer | 页码默认1 |
| limit | integer | 每页数量默认12 |
| category_id | integer | 分类ID |
| keyword | string | 搜索关键词 |
| min_price | number | 最低价格 |
| max_price | number | 最高价格 |
| sort_by | string | 排序字段name/price/created_at/stock |
| sort_order | string | 排序方向asc/desc |
**响应示例**:
```json
{
"code": 200,
"message": "获取成功",
"data": {
"products": [
{
"id": 1,
"name": "玫瑰花",
"category_id": 1,
"price": 29.9,
"stock": 100,
"image": "/uploads/products/rose.jpg",
"description": "新鲜玫瑰花,香气浓郁",
"category_name": "鲜花"
}
],
"pagination": {
"page": 1,
"limit": 12,
"total": 50,
"pages": 5
}
}
}
```
### 获取商品详情
**GET** `/products/{id}`
## 订单接口
### 创建订单
**POST** `/orders`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| items | array | 是 | 商品列表 |
| shipping_address | string | 是 | 收货地址 |
**items数组结构**:
```json
[
{
"product_id": 1,
"quantity": 2
}
]
```
## 花卉识别接口
### 花卉识别
**POST** `/identifications/identify`
**请求格式**: `multipart/form-data`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| image | file | 是 | 花卉图片文件 |
**响应示例**:
```json
{
"code": 200,
"message": "识别成功",
"data": {
"identification_id": 1,
"image_url": "/uploads/identifications/identify-123.jpg",
"results": [
{
"name": "玫瑰",
"confidence": 0.95,
"scientificName": "Rosa rugosa",
"description": "玫瑰是蔷薇科蔷薇属的植物,具有浓郁的芳香和美丽的花朵。"
}
],
"best_result": {
"name": "玫瑰",
"confidence": 0.95,
"scientificName": "Rosa rugosa",
"description": "玫瑰是蔷薇科蔷薇属的植物,具有浓郁的芳香和美丽的花朵。"
}
}
}
```
### 获取识别历史
**GET** `/identifications`
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 201 | 创建成功 |
| 400 | 参数错误 |
| 401 | 未授权 |
| 403 | 禁止访问 |
| 404 | 资源不存在 |
| 409 | 资源冲突 |
| 500 | 服务器内部错误 |
## 安全要求
1. 所有敏感接口必须使用HTTPS
2. JWT token有效期7天
3. 密码使用bcrypt加密存储
4. 文件上传限制10MB
5. 支持CORS跨域访问
## 版本历史
- v1.0.0 (2024-01-01): 初始版本发布
- 包含用户认证、商品管理、订单管理、花卉识别等核心功能

View File

@@ -1,29 +0,0 @@
# 爱鉴花后端服务
## 项目介绍
这是爱鉴花项目的后端服务基于Node.js开发。
## 技术栈
- Node.js
- Express.js
- SQLite开发环境
- MySQL生产环境
- Redis
## 文件结构
- controllers: 控制器
- models: 数据模型
- routes: 路由
- middleware: 中间件
- utils: 工具函数
- config: 配置文件
## 开发说明
请确保安装了Node.js环境并使用npm管理依赖。
## 文档
- [开发计划](./开发计划.md)
- [功能模块](./功能模块.md)
- [数据库设计](../数据库设计文档.md)
- [API接口文档](./API接口文档.md)

View File

@@ -1,124 +0,0 @@
# 数据库配置和使用指南
## 📋 数据库连接信息
### 开发环境 (MySQL)
- **主机**: 129.211.213.226
- **端口**: 9527
- **用户名**: root
- **密码**: aiotAiot123!
- **数据库**: ajhdata
### 生产环境 (MySQL)
- **主机**: 129.211.213.226
- **端口**: 9527
- **用户名**: root
- **密码**: aiotAiot123!
- **数据库**: ajhdata
## 🚀 快速开始
### 1. 安装依赖
```bash
cd backend
npm install
```
### 2. 配置环境变量
复制环境变量模板文件:
```bash
cp .env.example .env.development
```
编辑 `.env.development` 文件,根据实际环境修改配置:
```env
NODE_ENV=development
DB_HOST=192.168.0.240
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=aiot$Aiot123
DB_DATABASE=ajhdata
```
### 3. 验证数据库连接
```bash
# 完整初始化验证
npm run db:init
# 只检查连接状态
npm run db:check
```
## 📁 配置文件说明
### `config/database.js`
主数据库配置文件,根据环境变量自动选择配置:
- 开发环境: `NODE_ENV=development`
- 生产环境: `NODE_ENV=production`
### `.env.example`
环境变量配置模板,包含所有可配置参数。
### `utils/dbConnector.js`
数据库连接工具类,提供:
- 连接池管理
- SQL查询执行
- 事务支持
- 健康检查
### `scripts/initDatabase.js`
数据库初始化脚本,功能:
- 验证数据库连接
- 检查数据库版本
- 执行SQL文件预留
## 🔧 可用脚本命令
| 命令 | 描述 |
|------|------|
| `npm run db:init` | 完整数据库初始化验证 |
| `npm run db:check` | 只检查数据库连接状态 |
| `npm run db:migrate` | 执行数据库迁移(预留) |
| `npm run db:seed` | 填充初始数据(预留) |
## 🛡️ 安全注意事项
1. **密码保护**: 数据库密码已配置在环境变量中,不要硬编码在代码里
2. **连接池**: 使用连接池避免频繁创建连接
3. **错误处理**: 所有数据库操作都有完整的错误处理
4. **SQL注入**: 使用参数化查询防止SQL注入
## 📊 性能优化
- **连接池配置**: 最大20连接最小5连接
- **超时设置**: 获取连接超时60秒空闲连接超时30秒
- **字符编码**: UTF8MB4支持中文和emoji
- **时区设置**: 东八区(+08:00)
## 🔍 故障排除
### 连接失败
1. 检查网络是否能访问数据库服务器
2. 验证用户名密码是否正确
3. 确认数据库服务是否启动
### 权限问题
1. 检查用户是否有数据库访问权限
2. 确认数据库是否存在
### 性能问题
1. 检查连接池配置是否合理
2. 监控数据库服务器负载
## 📝 开发建议
1. 开发环境使用测试数据库配置
2. 生产环境使用生产数据库配置
3. 定期备份重要数据
4. 使用事务保证数据一致性
## 🔗 相关文档
- [MySQL官方文档](https://dev.mysql.com/doc/)
- [mysql2 npm包文档](https://www.npmjs.com/package/mysql2)
- [连接池最佳实践](https://github.com/mysqljs/mysql#pooling-connections)

View File

@@ -7,7 +7,7 @@
"start": "node app.js",
"dev": "NODE_ENV=development PORT=3200 nodemon app.js",
"prod": "NODE_ENV=production node app.js",
"db:init": "node scripts/initDatabase.js",
"db:init": "node ../scripts/backend/initDatabase.js",
"test": "jest",
"docs": "node scripts/generateDocs.js"
},

View File

@@ -1,165 +0,0 @@
#!/usr/bin/env node
/**
* 数据库初始化脚本
* 用于验证数据库连接和创建基础表结构
*/
const mysql = require('mysql2/promise');
const databaseConfig = require('../config/database');
const path = require('path');
const fs = require('fs');
class DatabaseInitializer {
constructor() {
this.connection = null;
}
/**
* 创建数据库连接
*/
async createConnection() {
try {
this.connection = await mysql.createConnection({
host: databaseConfig.host,
port: databaseConfig.port,
user: databaseConfig.username,
password: databaseConfig.password,
database: databaseConfig.database,
charset: 'utf8mb4',
timezone: '+08:00'
});
console.log('✅ 数据库连接成功');
return true;
} catch (error) {
console.error('❌ 数据库连接失败:', error.message);
return false;
}
}
/**
* 验证数据库连接
*/
async validateConnection() {
try {
const [rows] = await this.connection.execute('SELECT NOW() as current_time, VERSION() as mysql_version');
console.log('📊 数据库信息:');
console.log(` 当前时间: ${rows[0].current_time}`);
console.log(` MySQL版本: ${rows[0].mysql_version}`);
return true;
} catch (error) {
console.error('❌ 数据库验证失败:', error.message);
return false;
}
}
/**
* 检查表是否存在
* @param {string} tableName - 表名
*/
async checkTableExists(tableName) {
try {
const [rows] = await this.connection.execute(
`SELECT COUNT(*) as count FROM information_schema.tables
WHERE table_schema = ? AND table_name = ?`,
[databaseConfig.database, tableName]
);
return rows[0].count > 0;
} catch (error) {
console.error(`❌ 检查表 ${tableName} 存在失败:`, error.message);
return false;
}
}
/**
* 执行SQL文件
* @param {string} filePath - SQL文件路径
*/
async executeSqlFile(filePath) {
try {
const sqlContent = fs.readFileSync(filePath, 'utf8');
const statements = sqlContent.split(';').filter(stmt => stmt.trim());
for (const statement of statements) {
if (statement.trim()) {
await this.connection.execute(statement);
}
}
console.log(`✅ 成功执行SQL文件: ${path.basename(filePath)}`);
return true;
} catch (error) {
console.error(`❌ 执行SQL文件失败:`, error.message);
return false;
}
}
/**
* 关闭数据库连接
*/
async closeConnection() {
if (this.connection) {
await this.connection.end();
console.log('🔌 数据库连接已关闭');
}
}
/**
* 主初始化方法
*/
async initialize() {
console.log('🚀 开始数据库初始化...');
console.log(`📋 环境: ${process.env.NODE_ENV || 'development'}`);
console.log(`🗄️ 数据库: ${databaseConfig.database}`);
console.log(`🌐 主机: ${databaseConfig.host}:${databaseConfig.port}`);
console.log('─'.repeat(50));
// 创建连接
const connected = await this.createConnection();
if (!connected) {
process.exit(1);
}
// 验证连接
const validated = await this.validateConnection();
if (!validated) {
await this.closeConnection();
process.exit(1);
}
console.log('✅ 数据库连接验证通过');
console.log('─'.repeat(50));
// 这里可以添加具体的表创建逻辑
console.log('📋 数据库初始化完成');
console.log('✅ 所有检查通过,数据库连接正常');
await this.closeConnection();
}
}
// 执行初始化
const initializer = new DatabaseInitializer();
// 处理命令行参数
const args = process.argv.slice(2);
if (args.includes('--help') || args.includes('-h')) {
console.log(`
使用方法: node scripts/initDatabase.js [选项]
选项:
--help, -h 显示帮助信息
--check 只检查连接,不执行初始化
示例:
node scripts/initDatabase.js # 完整初始化
node scripts/initDatabase.js --check # 只检查连接
`);
process.exit(0);
}
initializer.initialize().catch(error => {
console.error('❌ 初始化过程中发生错误:', error.message);
process.exit(1);
});

View File

@@ -1,260 +0,0 @@
#!/usr/bin/env node
/**
* SQLite数据库初始化脚本
* 用于创建SQLite数据库表结构
*/
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const databaseConfig = require('../config/database');
class SQLiteInitializer {
constructor() {
this.db = null;
}
/**
* 创建数据库连接
*/
createConnection() {
try {
this.db = new sqlite3.Database(databaseConfig.storage);
console.log('✅ SQLite数据库连接成功');
return true;
} catch (error) {
console.error('❌ SQLite数据库连接失败:', error.message);
return false;
}
}
/**
* 执行SQL语句
*/
run(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.run(sql, params, function(err) {
if (err) {
reject(err);
} else {
resolve(this);
}
});
});
}
/**
* 创建users表
*/
async createUsersTable() {
const sql = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
phone VARCHAR(20) UNIQUE,
email VARCHAR(100) UNIQUE,
user_type VARCHAR(20) DEFAULT 'user',
status INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`;
try {
await this.run(sql);
console.log('✅ users表创建成功');
return true;
} catch (error) {
console.error('❌ 创建users表失败:', error.message);
return false;
}
}
/**
* 创建orders表
*/
async createOrdersTable() {
const sql = `
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_number VARCHAR(50) UNIQUE NOT NULL,
user_id INTEGER NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
payment_status INTEGER DEFAULT 0,
shipping_status INTEGER DEFAULT 0,
shipping_address TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (id)
)
`;
try {
await this.run(sql);
console.log('✅ orders表创建成功');
return true;
} catch (error) {
console.error('❌ 创建orders表失败:', error.message);
return false;
}
}
/**
* 创建identifications表
*/
async createIdentificationsTable() {
const sql = `
CREATE TABLE IF NOT EXISTS identifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
image_url VARCHAR(255) NOT NULL,
result TEXT NOT NULL,
confidence DECIMAL(5,4) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (id)
)
`;
try {
await this.run(sql);
console.log('✅ identifications表创建成功');
return true;
} catch (error) {
console.error('❌ 创建identifications表失败:', error.message);
return false;
}
}
/**
* 创建products表
*/
async createProductsTable() {
const sql = `
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
category_id INTEGER,
price DECIMAL(10,2) NOT NULL,
stock INTEGER DEFAULT 0,
image VARCHAR(255),
description TEXT,
status INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`;
try {
await this.run(sql);
console.log('✅ products表创建成功');
return true;
} catch (error) {
console.error('❌ 创建products表失败:', error.message);
return false;
}
}
/**
* 插入初始管理员用户
*/
async insertAdminUser() {
const sql = `
INSERT OR IGNORE INTO users (username, password, phone, email, user_type, status)
VALUES (?, ?, ?, ?, ?, ?)
`;
// 密码: admin123 (bcrypt加密)
const hashedPassword = '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi';
try {
await this.run(sql, [
'admin',
hashedPassword,
'13800138000',
'admin@example.com',
'admin',
1
]);
console.log('✅ 管理员用户创建成功');
return true;
} catch (error) {
console.error('❌ 创建管理员用户失败:', error.message);
return false;
}
}
/**
* 关闭数据库连接
*/
closeConnection() {
if (this.db) {
this.db.close();
console.log('🔌 数据库连接已关闭');
}
}
/**
* 主初始化方法
*/
async initialize() {
console.log('🚀 开始SQLite数据库初始化...');
console.log(`📋 环境: ${process.env.NODE_ENV || 'development'}`);
console.log(`🗄️ 数据库文件: ${databaseConfig.storage}`);
console.log('─'.repeat(50));
// 创建连接
const connected = this.createConnection();
if (!connected) {
process.exit(1);
}
// 创建表
const tablesCreated = await Promise.all([
this.createUsersTable(),
this.createOrdersTable(),
this.createIdentificationsTable(),
this.createProductsTable()
]);
if (tablesCreated.every(result => result)) {
console.log('✅ 所有表创建成功');
} else {
console.error('❌ 表创建过程中出现错误');
this.closeConnection();
process.exit(1);
}
// 插入初始数据
const adminCreated = await this.insertAdminUser();
if (!adminCreated) {
console.warn('⚠️ 管理员用户创建失败或已存在');
}
console.log('✅ SQLite数据库初始化完成');
this.closeConnection();
}
}
// 执行初始化
const initializer = new SQLiteInitializer();
// 处理命令行参数
const args = process.argv.slice(2);
if (args.includes('--help') || args.includes('-h')) {
console.log(`
使用方法: node scripts/initSQLite.js [选项]
选项:
--help, -h 显示帮助信息
示例:
node scripts/initSQLite.js # 完整初始化
`);
process.exit(0);
}
initializer.initialize().catch(error => {
console.error('❌ 初始化过程中发生错误:', error.message);
process.exit(1);
});

View File

@@ -1,30 +0,0 @@
# 爱鉴花后端功能模块
## 1. 植物识别服务
- 接收小程序上传的图片
- 调用AI识别服务
- 返回识别结果
## 2. 用户管理模块
- 用户注册/登录
- 用户信息管理
- 用户权限控制
## 3. 商品管理模块
- 商品信息管理
- 商品分类管理
- 库存管理
## 4. 订单管理模块
- 订单创建
- 订单状态管理
- 订单查询
## 5. 支付模块
- 支付接口集成
- 支付状态回调处理
## 6. 数据统计模块
- 用户行为统计
- 销售数据统计
- 识别数据统计

View File

@@ -1,279 +0,0 @@
# 爱鉴花后台管理系统 API 接口文档
基于 OpenAPI 3.0 规范
## 基础信息
- **Base URL**: `http://localhost:3200/api/v1`
- **认证方式**: Bearer Token (JWT)
- **响应格式**: JSON
## 统一响应格式
所有接口都遵循以下响应格式:
```json
{
"code": 200,
"message": "操作成功",
"data": {}
}
```
## 认证接口
### 管理员登录
**POST** `/auth/login`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| login | string | 是 | 用户名/手机号/邮箱 |
| password | string | 是 | 密码 |
**响应示例**:
```json
{
"code": 200,
"message": "登录成功",
"data": {
"user_id": 1,
"username": "admin",
"user_type": "admin",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
```
## 用户管理接口
### 获取用户列表
**GET** `/users`
**权限要求**: 管理员
**查询参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | number | 否 | 页码默认1 |
| limit | number | 否 | 每页数量默认10 |
| keyword | string | 否 | 搜索关键词 |
| user_type | string | 否 | 用户类型过滤 |
**响应示例**:
```json
{
"code": 200,
"message": "获取成功",
"data": {
"users": [
{
"id": 1,
"username": "testuser",
"phone": "13800138000",
"email": "test@example.com",
"user_type": "farmer",
"created_at": "2024-01-01T00:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 100,
"pages": 10
}
}
}
```
### 获取用户详情
**GET** `/users/{id}`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | number | 是 | 用户ID |
### 删除用户
**DELETE** `/users/{id}`
**权限要求**: 管理员
## 商品管理接口
### 获取商品列表
**GET** `/products`
**查询参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | number | 否 | 页码默认1 |
| limit | number | 否 | 每页数量默认10 |
| category_id | number | 否 | 分类ID过滤 |
| min_price | number | 否 | 最低价格 |
| max_price | number | 否 | 最高价格 |
| status | number | 否 | 状态过滤 |
### 创建商品
**POST** `/products`
**权限要求**: 管理员
**请求体**:
```json
{
"name": "玫瑰花",
"category_id": 1,
"price": 29.9,
"stock": 100,
"image": "/uploads/roses.jpg",
"description": "新鲜玫瑰花束"
}
```
## 订单管理接口
### 获取订单列表
**GET** `/orders`
**权限要求**: 管理员
**查询参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | number | 否 | 页码默认1 |
| limit | number | 否 | 每页数量默认10 |
| status | number | 否 | 订单状态过滤 |
| start_date | string | 否 | 开始日期 |
| end_date | string | 否 | 结束日期 |
### 更新订单状态
**PUT** `/orders/{id}/status`
**权限要求**: 管理员
**请求体**:
```json
{
"payment_status": 1,
"shipping_status": 2
}
```
## 识别记录管理接口
### 获取识别记录列表
**GET** `/identifications`
**权限要求**: 管理员
**查询参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | number | 否 | 页码默认1 |
| limit | number | 否 | 每页数量默认10 |
| start_date | string | 否 | 开始日期 |
| end_date | string | 否 | 结束日期 |
| min_confidence | number | 否 | 最低置信度 |
## 数据统计接口
### 获取系统统计概览
**GET** `/admin/statistics/overview`
**权限要求**: 管理员
**响应示例**:
```json
{
"code": 200,
"message": "获取成功",
"data": {
"total_users": 1000,
"new_users_today": 10,
"total_orders": 500,
"total_revenue": 15000.50,
"total_identifications": 2000,
"active_users_today": 50
}
}
```
### 获取趋势数据
**GET** `/admin/statistics/trend`
**查询参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| days | number | 否 | 天数默认7 |
| type | string | 否 | 统计类型users/orders/revenue/identifications |
## 系统配置接口
### 获取系统配置
**GET** `/admin/config`
**权限要求**: 管理员
### 更新系统配置
**PUT** `/admin/config/{key}`
**权限要求**: 管理员
**请求体**:
```json
{
"value": "new_value"
}
```
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 201 | 创建成功 |
| 400 | 参数错误 |
| 401 | 未授权 |
| 403 | 禁止访问 |
| 404 | 资源不存在 |
| 409 | 资源冲突 |
| 500 | 服务器内部错误 |
## 安全要求
1. 所有敏感操作需要管理员权限
2. API请求需要携带有效的JWT Token
3. 密码传输需要加密
4. 文件上传需要验证文件类型和大小
---
*文档版本: 1.0.0*
*最后更新: 2024-01-01*

View File

@@ -1,33 +0,0 @@
# 爱鉴花后端开发计划
## 第一阶段基础框架搭建1-2周
- 项目初始化
- 数据库设计
- 基础模块开发
- API接口设计
## 第二阶段核心功能开发3-6周
- 植物识别服务集成
- 用户管理模块
- 商品管理模块
- 订单管理模块
## 第三阶段支付和统计功能开发7-10周
- 支付接口集成
- 数据统计模块
- 日志系统
## 第四阶段性能优化和安全加固11-12周
- 性能优化
- 安全加固
- 压力测试
## 第五阶段测试和部署13-14周
- 功能测试
- 集成测试
- 部署上线
## 第六阶段监控和维护15-16周
- 系统监控
- 故障处理
- 持续优化