docs: 更新项目文档,完善需求和技术细节
This commit is contained in:
@@ -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): 初始版本发布
|
||||
- 包含用户认证、商品管理、订单管理、花卉识别等核心功能
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
@@ -1,30 +0,0 @@
|
||||
# 爱鉴花后端功能模块
|
||||
|
||||
## 1. 植物识别服务
|
||||
- 接收小程序上传的图片
|
||||
- 调用AI识别服务
|
||||
- 返回识别结果
|
||||
|
||||
## 2. 用户管理模块
|
||||
- 用户注册/登录
|
||||
- 用户信息管理
|
||||
- 用户权限控制
|
||||
|
||||
## 3. 商品管理模块
|
||||
- 商品信息管理
|
||||
- 商品分类管理
|
||||
- 库存管理
|
||||
|
||||
## 4. 订单管理模块
|
||||
- 订单创建
|
||||
- 订单状态管理
|
||||
- 订单查询
|
||||
|
||||
## 5. 支付模块
|
||||
- 支付接口集成
|
||||
- 支付状态回调处理
|
||||
|
||||
## 6. 数据统计模块
|
||||
- 用户行为统计
|
||||
- 销售数据统计
|
||||
- 识别数据统计
|
||||
@@ -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*
|
||||
@@ -1,33 +0,0 @@
|
||||
# 爱鉴花后端开发计划
|
||||
|
||||
## 第一阶段:基础框架搭建(1-2周)
|
||||
- 项目初始化
|
||||
- 数据库设计
|
||||
- 基础模块开发
|
||||
- API接口设计
|
||||
|
||||
## 第二阶段:核心功能开发(3-6周)
|
||||
- 植物识别服务集成
|
||||
- 用户管理模块
|
||||
- 商品管理模块
|
||||
- 订单管理模块
|
||||
|
||||
## 第三阶段:支付和统计功能开发(7-10周)
|
||||
- 支付接口集成
|
||||
- 数据统计模块
|
||||
- 日志系统
|
||||
|
||||
## 第四阶段:性能优化和安全加固(11-12周)
|
||||
- 性能优化
|
||||
- 安全加固
|
||||
- 压力测试
|
||||
|
||||
## 第五阶段:测试和部署(13-14周)
|
||||
- 功能测试
|
||||
- 集成测试
|
||||
- 部署上线
|
||||
|
||||
## 第六阶段:监控和维护(15-16周)
|
||||
- 系统监控
|
||||
- 故障处理
|
||||
- 持续优化
|
||||
Reference in New Issue
Block a user