diff --git a/README.md b/README.md index 64be948..68f8dfe 100644 --- a/README.md +++ b/README.md @@ -92,9 +92,9 @@ cp admin-system/.env.example admin-system/.env ## 🌐 访问地址 -- **后端API**: http://localhost:3000 -- **后台管理**: http://localhost:3001 -- **官方网站**: http://localhost:3002 +- **后端API**: https://api.jiebanke.com +- **后台管理**: https://admin.jiebanke.com +- **官方网站**: https://www.jiebanke.com - **小程序**: 使用微信开发者工具打开 `mini-program/` 目录 ## 📦 依赖管理 diff --git a/admin-system/.env.development b/admin-system/.env.development index a1b9d2a..174c4c2 100644 --- a/admin-system/.env.development +++ b/admin-system/.env.development @@ -2,7 +2,7 @@ NODE_ENV=development # API配置 -VITE_API_BASE_URL=http://localhost:3100/api/v1 +VITE_API_BASE_URL=https://api.jiebanke.com/api/v1 VITE_API_TIMEOUT=30000 # 功能开关 diff --git a/admin-system/DEPLOYMENT.md b/admin-system/DEPLOYMENT.md index ff38c3e..8c8d3fc 100644 --- a/admin-system/DEPLOYMENT.md +++ b/admin-system/DEPLOYMENT.md @@ -86,7 +86,7 @@ docker-compose up mysql redis rabbitmq **.env.development** (开发环境): ``` VITE_APP_TITLE=结伴客后台管理系统(开发) -VITE_API_BASE_URL=http://localhost:3000 +VITE_API_BASE_URL=https://api.jiebanke.com/api/v1 VITE_APP_VERSION=dev ``` @@ -130,8 +130,8 @@ environment: ## 健康检查 系统提供健康检查端点: -- 前端: `http://localhost:80/health` -- 后端: `http://localhost:3000/health` +- 前端: `https://admin.jiebanke.com/health` +- 后端: `https://api.jiebanke.com/health` ## 监控和日志 diff --git a/admin-system/README.md b/admin-system/README.md index a017b57..7bf9e41 100644 --- a/admin-system/README.md +++ b/admin-system/README.md @@ -45,7 +45,7 @@ npm run preview ### 开发环境 (.env.development) ```env NODE_ENV=development -VITE_API_BASE_URL=http://localhost:3000/api/v1 +VITE_API_BASE_URL=https://api.jiebanke.com/api/v1 VITE_FEATURE_DEBUG=true ``` @@ -238,7 +238,7 @@ const getUsers = async () => { ### 开发环境部署 1. 安装依赖: `npm install` 2. 启动开发服务器: `npm run dev` -3. 访问: http://localhost:3001 +3. 访问: https://admin.jiebanke.com ### 生产环境部署 1. 构建项目: `npm run build` diff --git a/admin-system/docker-compose.yml b/admin-system/docker-compose.yml index b6ebb89..7e837e4 100644 --- a/admin-system/docker-compose.yml +++ b/admin-system/docker-compose.yml @@ -14,7 +14,7 @@ services: networks: - jiebanke-network healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80/health"] + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "https://admin.jiebanke.com/health"] interval: 30s timeout: 10s retries: 3 diff --git a/admin-system/nginx.conf b/admin-system/nginx.conf index c552a0a..23fce56 100644 --- a/admin-system/nginx.conf +++ b/admin-system/nginx.conf @@ -1,6 +1,6 @@ server { listen 80; - server_name localhost; + server_name admin.jiebanke.com; # 静态文件服务 location / { diff --git a/admin-system/src/api/index.ts b/admin-system/src/api/index.ts index 5d05c18..5e2b63a 100644 --- a/admin-system/src/api/index.ts +++ b/admin-system/src/api/index.ts @@ -3,7 +3,7 @@ import { message } from 'ant-design-vue' import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' // API基础配置 -const baseURL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:3100/api' +const baseURL = import.meta.env.VITE_API_BASE_URL || 'https://api.jiebanke.com/api' const timeout = parseInt(import.meta.env.VITE_API_TIMEOUT || '10000') // 创建axios实例 diff --git a/admin-system/src/stores/modules/merchant.ts b/admin-system/src/stores/modules/merchant.ts index a9f8282..0a40b60 100644 --- a/admin-system/src/stores/modules/merchant.ts +++ b/admin-system/src/stores/modules/merchant.ts @@ -39,7 +39,7 @@ export const useMerchantStore = defineStore('merchant', () => { businessLicense: '1234567890', contactPerson: '张老板', contactPhone: '13800138001', - contactEmail: 'flower@example.com', + contactEmail: 'flower@jiebanke.com', address: '北京市朝阳区', description: '专业鲜花销售', status: 'active', @@ -58,7 +58,7 @@ export const useMerchantStore = defineStore('merchant', () => { businessLicense: '0987654321', contactPerson: '李农场主', contactPhone: '13900139001', - contactEmail: 'farm@example.com', + contactEmail: 'farm@jiebanke.com', address: '上海市浦东新区', description: '动物认领和农场体验', status: 'active', @@ -107,7 +107,7 @@ export const useMerchantStore = defineStore('merchant', () => { businessLicense: `LICENSE${merchantId}`, contactPerson: '联系人', contactPhone: '13800138000', - contactEmail: `merchant${merchantId}@example.com`, + contactEmail: `merchant${merchantId}@jiebanke.com`, address: '地址', description: '商家描述', status: 'active', diff --git a/admin-system/src/stores/modules/user.ts b/admin-system/src/stores/modules/user.ts index 31a26cf..a388ee0 100644 --- a/admin-system/src/stores/modules/user.ts +++ b/admin-system/src/stores/modules/user.ts @@ -31,7 +31,7 @@ export const useUserStore = defineStore('user', () => { nickname: '用户1', avatar: '', phone: '13800138000', - email: 'user1@example.com', + email: 'user1@jiebanke.com', status: 'active', registerTime: '2024-01-01 10:00:00', lastLoginTime: '2024-01-15 15:30:00', @@ -43,7 +43,7 @@ export const useUserStore = defineStore('user', () => { nickname: '商家1', avatar: '', phone: '13900139000', - email: 'merchant1@example.com', + email: 'merchant1@jiebanke.com', status: 'active', registerTime: '2024-01-02 09:00:00', lastLoginTime: '2024-01-14 14:20:00', @@ -76,7 +76,7 @@ export const useUserStore = defineStore('user', () => { nickname: `用户${userId}`, avatar: '', phone: '13800138000', - email: `user${userId}@example.com`, + email: `user${userId}@jiebanke.com`, status: 'active', registerTime: '2024-01-01 10:00:00', lastLoginTime: '2024-01-15 15:30:00', diff --git a/admin-system/vite.config.ts b/admin-system/vite.config.ts index 67f5bfa..588f62a 100644 --- a/admin-system/vite.config.ts +++ b/admin-system/vite.config.ts @@ -27,7 +27,7 @@ export default defineConfig({ port: 3150, proxy: { '/api': { - target: 'http://localhost:3100', + target: 'https://api.jiebanke.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '/api/v1') } diff --git a/backend/.env b/backend/.env index 0bc09e5..3cfd7ce 100644 --- a/backend/.env +++ b/backend/.env @@ -26,13 +26,13 @@ PROD_DB_PASSWORD=aiotAiot123! PROD_DB_NAME=jiebandata # Redis配置 -REDIS_HOST=localhost +REDIS_HOST=redis.jiebanke.com REDIS_PORT=6379 REDIS_PASSWORD= REDIS_DB=0 # RabbitMQ配置 -RABBITMQ_HOST=localhost +RABBITMQ_HOST=rabbitmq.jiebanke.com RABBITMQ_PORT=5672 RABBITMQ_USERNAME=guest RABBITMQ_PASSWORD=guest diff --git a/backend/.env.example b/backend/.env.example index 7f9a545..62649cb 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -4,7 +4,7 @@ PORT=3000 HOST=0.0.0.0 # 数据库配置 -DB_HOST=localhost +DB_HOST=mysql.jiebanke.com DB_PORT=3306 DB_USER=root DB_PASSWORD=your-mysql-password @@ -30,7 +30,7 @@ SMTP_USER=your-email@gmail.com SMTP_PASS=your-email-password # Redis配置(可选) -REDIS_HOST=localhost +REDIS_HOST=redis.jiebanke.com REDIS_PORT=6379 REDIS_PASSWORD= diff --git a/backend/README.md b/backend/README.md index f2f05f9..e3f7c68 100644 --- a/backend/README.md +++ b/backend/README.md @@ -38,7 +38,7 @@ cp .env.example .env 2. 编辑 `.env` 文件,配置你的环境变量: ```env -MONGODB_URI=mongodb://localhost:27017/jiebanke +MONGODB_URI=mongodb://mongodb.jiebanke.com:27017/jiebanke JWT_SECRET=your-super-secret-jwt-key ``` @@ -81,7 +81,7 @@ Content-Type: application/json "username": "testuser", "password": "password123", "nickname": "测试用户", - "email": "test@example.com", + "email": "test@jiebanke.com", "phone": "13800138000" } ``` diff --git a/backend/README_DEVELOPMENT.md b/backend/README_DEVELOPMENT.md index fb0044c..08c413f 100644 --- a/backend/README_DEVELOPMENT.md +++ b/backend/README_DEVELOPMENT.md @@ -39,7 +39,7 @@ npm install ```env # 数据库配置 -DB_HOST=localhost +DB_HOST=mysql.jiebanke.com DB_PORT=3306 DB_USER=root DB_PASSWORD=your-mysql-password @@ -188,7 +188,7 @@ docker-compose up -d mysql 2. **配置本地环境变量** ```bash # 使用本地Docker MySQL -export DB_HOST=localhost +export DB_HOST=mysql.jiebanke.com export DB_PORT=3306 export DB_PASSWORD=rootpassword export DB_DATABASE=jiebanke_dev diff --git a/backend/config/env.js b/backend/config/env.js index 0c037f8..495a73f 100644 --- a/backend/config/env.js +++ b/backend/config/env.js @@ -22,7 +22,7 @@ const config = { refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '30d' }, redis: { - host: process.env.REDIS_HOST || 'localhost', + host: process.env.REDIS_HOST || 'redis.jiebanke.com', port: process.env.REDIS_PORT || 6379, password: process.env.REDIS_PASSWORD || '' }, @@ -31,7 +31,7 @@ const config = { allowedTypes: ['image/jpeg', 'image/png', 'image/gif'] }, cors: { - origin: process.env.CORS_ORIGIN || 'http://localhost:9000', + origin: process.env.CORS_ORIGIN || 'https://www.jiebanke.com', credentials: true } }, diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index f9fa54f..9350c0b 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -16,7 +16,7 @@ services: - ./scripts/init-database.sql:/docker-entrypoint-initdb.d/init.sql restart: unless-stopped healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] + test: ["CMD", "mysqladmin", "ping", "-h", "mysql.jiebanke.com", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] interval: 10s timeout: 5s retries: 3 diff --git a/backend/scripts/init-database.sql b/backend/scripts/init-database.sql index a185433..149daab 100644 --- a/backend/scripts/init-database.sql +++ b/backend/scripts/init-database.sql @@ -53,8 +53,8 @@ INSERT INTO admins (username, password, email, role) VALUES -- 插入测试用户账号 INSERT INTO users (username, password, email, phone, real_name, id_card, balance, credit_score) VALUES -('user1', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'user1@example.com', '13800138001', '张三', '110101199001011234', 1000.00, 95), -('user2', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'user2@example.com', '13800138002', '李四', '110101199002022345', 500.00, 85); +('user1', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'user1@jiebanke.com', '13800138001', '张三', '110101199001011234', 1000.00, 95), +('user2', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'user2@jiebanke.com', '13800138002', '李四', '110101199002022345', 500.00, 85); -- 创建索引 CREATE INDEX idx_admins_username ON admins(username); diff --git a/backend/scripts/init-test-data.js b/backend/scripts/init-test-data.js index d235a58..b04479c 100644 --- a/backend/scripts/init-test-data.js +++ b/backend/scripts/init-test-data.js @@ -11,7 +11,7 @@ const config = require('../config/env'); // 数据库配置 const dbConfig = { - host: process.env.DB_HOST || 'localhost', + host: process.env.DB_HOST || 'mysql.jiebanke.com', port: process.env.DB_PORT || 3306, user: process.env.DB_USER || 'root', password: process.env.DB_PASSWORD || '', @@ -44,7 +44,7 @@ const testData = { { username: 'user1', password: 'user123', - email: 'user1@example.com', + email: 'user1@jiebanke.com', nickname: '旅行爱好者', avatar: null, user_type: '普通用户', @@ -53,7 +53,7 @@ const testData = { { username: 'merchant1', password: 'merchant123', - email: 'merchant1@example.com', + email: 'merchant1@jiebanke.com', nickname: '农家乐老板', avatar: null, user_type: '商家', diff --git a/backend/scripts/test-api-endpoints.js b/backend/scripts/test-api-endpoints.js index d565359..35c5211 100644 --- a/backend/scripts/test-api-endpoints.js +++ b/backend/scripts/test-api-endpoints.js @@ -8,7 +8,7 @@ const axios = require('axios'); // API配置 -const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:3100'; +const API_BASE_URL = process.env.API_BASE_URL || 'https://api.jiebanke.com'; const API_VERSION = process.env.API_VERSION || '/api/v1'; // 测试用例 diff --git a/backend/src/app.js b/backend/src/app.js index fe9292b..21eccf7 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -31,7 +31,7 @@ app.use(helmet()); app.use(cors({ origin: process.env.NODE_ENV === 'production' ? ['https://your-domain.com'] - : ['http://localhost:9000', 'http://localhost:3000', 'http://localhost:3100', 'http://localhost:3150'], + : ['https://www.jiebanke.com', 'https://admin.jiebanke.com', 'https://api.jiebanke.com'], credentials: true })); @@ -79,7 +79,7 @@ app.use('/uploads', express.static('uploads')); // Swagger文档路由 if (process.env.NODE_ENV === 'development' || process.env.ENABLE_SWAGGER === 'true') { app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); - console.log('📚 Swagger文档已启用: http://localhost:3100/api-docs'); + console.log('📚 Swagger文档已启用: https://api.jiebanke.com/api-docs'); } // 健康检查路由 diff --git a/backend/src/config/rabbitmq.js b/backend/src/config/rabbitmq.js index 4e38f45..f405a02 100644 --- a/backend/src/config/rabbitmq.js +++ b/backend/src/config/rabbitmq.js @@ -11,7 +11,7 @@ class RabbitMQConfig { // 获取连接URL getConnectionUrl() { - const host = process.env.RABBITMQ_HOST || 'localhost'; + const host = process.env.RABBITMQ_HOST || 'rabbitmq.jiebanke.com'; const port = process.env.RABBITMQ_PORT || 5672; const username = process.env.RABBITMQ_USERNAME || 'guest'; const password = process.env.RABBITMQ_PASSWORD || 'guest'; @@ -165,7 +165,7 @@ class RabbitMQConfig { return { status: 'healthy', - host: process.env.RABBITMQ_HOST || 'localhost', + host: process.env.RABBITMQ_HOST || 'rabbitmq.jiebanke.com', port: process.env.RABBITMQ_PORT || 5672, connected: this.isConnected }; @@ -173,7 +173,7 @@ class RabbitMQConfig { return { status: 'unhealthy', error: error.message, - host: process.env.RABBITMQ_HOST || 'localhost', + host: process.env.RABBITMQ_HOST || 'rabbitmq.jiebanke.com', port: process.env.RABBITMQ_PORT || 5672, connected: false }; diff --git a/backend/src/config/redis.js b/backend/src/config/redis.js index 4718e8a..bd293b4 100644 --- a/backend/src/config/redis.js +++ b/backend/src/config/redis.js @@ -10,7 +10,7 @@ class RedisConfig { createClient() { const redisConfig = { socket: { - host: process.env.REDIS_HOST || 'localhost', + host: process.env.REDIS_HOST || 'redis.jiebanke.com', port: process.env.REDIS_PORT || 6379, reconnectStrategy: (retries) => { const delay = Math.min(retries * 100, 3000); @@ -66,7 +66,7 @@ class RedisConfig { // 开发环境下,如果Redis未配置,则不连接 if (process.env.NODE_ENV === 'development' && - (!process.env.REDIS_HOST || process.env.REDIS_HOST === 'localhost')) { + (!process.env.REDIS_HOST || process.env.REDIS_HOST === 'redis.jiebanke.com')) { console.log('⚠️ 开发环境未配置Redis,跳过连接'); return null; } @@ -94,7 +94,7 @@ class RedisConfig { getStatus() { return { isConnected: this.isConnected, - host: process.env.REDIS_HOST || 'localhost', + host: process.env.REDIS_HOST || 'redis.jiebanke.com', port: process.env.REDIS_PORT || 6379 }; } diff --git a/backend/src/config/swagger.js b/backend/src/config/swagger.js index 3cf1664..0c7ac81 100644 --- a/backend/src/config/swagger.js +++ b/backend/src/config/swagger.js @@ -10,7 +10,7 @@ const options = { }, servers: [ { - url: 'http://localhost:3001/api/v1', + url: 'https://admin.jiebanke.com/api/v1', description: '开发环境服务器' }, { diff --git a/backend/src/docs/swagger.js b/backend/src/docs/swagger.js index 12fbce0..6099051 100644 --- a/backend/src/docs/swagger.js +++ b/backend/src/docs/swagger.js @@ -21,7 +21,7 @@ const options = { }, servers: [ { - url: 'http://localhost:3100/api/v1', + url: 'https://api.jiebanke.com/api/v1', description: '开发环境' }, { @@ -113,7 +113,7 @@ const options = { }, avatar: { type: 'string', - example: 'https://example.com/avatar.jpg' + example: 'https://www.jiebanke.com/avatar.jpg' }, role: { type: 'string', diff --git a/backend/src/routes/auth.js b/backend/src/routes/auth.js index a5197cd..383e1e5 100644 --- a/backend/src/routes/auth.js +++ b/backend/src/routes/auth.js @@ -42,7 +42,7 @@ const router = express.Router() * email: * type: string * description: 邮箱 - * example: test@example.com + * example: test@jiebanke.com * phone: * type: string * description: 手机号 diff --git a/backend/src/utils/database.js b/backend/src/utils/database.js index 2887462..da212fa 100644 --- a/backend/src/utils/database.js +++ b/backend/src/utils/database.js @@ -13,7 +13,7 @@ class Database { try { // 连接数据库 - const mongodbUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/jiebanke' + const mongodbUri = process.env.MONGODB_URI || 'mongodb://mongodb.jiebanke.com:27017/jiebanke' await this.mongoose.connect(mongodbUri, { useNewUrlParser: true, useUnifiedTopology: true diff --git a/backend/test-api.js b/backend/test-api.js index b74a48f..a8ed06f 100644 --- a/backend/test-api.js +++ b/backend/test-api.js @@ -4,7 +4,7 @@ const http = require('http'); function testHealthCheck() { return new Promise((resolve, reject) => { const options = { - hostname: 'localhost', + hostname: 'api.jiebanke.com', port: 3000, path: '/health', method: 'GET' @@ -43,7 +43,7 @@ function testAuthAPI() { }); const options = { - hostname: 'localhost', + hostname: 'api.jiebanke.com', port: 3000, path: '/api/v1/auth/login', method: 'POST', diff --git a/backend/test-swagger.js b/backend/test-swagger.js index ba00f38..41aaac9 100644 --- a/backend/test-swagger.js +++ b/backend/test-swagger.js @@ -2,7 +2,7 @@ const http = require('http'); // 发送请求到Swagger UI const options = { - hostname: 'localhost', + hostname: 'admin.jiebanke.com', port: 3001, path: '/api-docs/', method: 'GET' diff --git a/docs/API_DOCS.md b/docs/API_DOCS.md index 4478089..3dd943b 100644 --- a/docs/API_DOCS.md +++ b/docs/API_DOCS.md @@ -80,7 +80,7 @@ Authorization: Bearer "gender": "male", "birthday": "1990-01-01", "phone": "13800138000", - "email": "test@example.com", + "email": "test@jiebanke.com", "travelCount": 5, "animalClaimCount": 2, "createdAt": "2024-01-01T00:00:00.000Z", @@ -504,12 +504,12 @@ Authorization: Bearer ### 使用curl测试 ```bash # 微信用户登录 -curl -X POST http://localhost:3000/api/v1/auth/wechat-login \ +curl -X POST https://api.jiebanke.com/api/v1/auth/wechat-login \ -H "Content-Type: application/json" \ -d '{"code":"wxlogincode123","userInfo":{"nickName":"测试用户","avatarUrl":"https://avatar.url","gender":1}}' # 获取旅行计划列表 -curl -X GET http://localhost:3000/api/v1/travel/plans \ +curl -X GET https://api.jiebanke.com/api/v1/travel/plans \ -H "Authorization: Bearer " ``` diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 3888851..8813b30 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -78,9 +78,9 @@ npm run dev ``` ### 6. 验证部署 -- 后端API: http://localhost:3000/api/v1/health -- 后台管理: http://localhost:3001 -- 官方网站: http://localhost:3002 +- 后端API: https://api.jiebanke.com/api/v1/health +- 后台管理: https://admin.jiebanke.com +- 官方网站: https://www.jiebanke.com ## 🧪 测试环境部署 @@ -228,7 +228,7 @@ server { # 反向代理到后端API location /api { - proxy_pass http://localhost:3000; + proxy_pass http://backend-service:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -315,8 +315,8 @@ vim /etc/mysql/mysql.conf.d/mysqld.cnf # 创建应用专用用户 mysql -u root -p -e " -CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'strongpassword'; -GRANT SELECT, INSERT, UPDATE, DELETE ON jiebandata.* TO 'appuser'@'localhost'; +CREATE USER 'appuser'@'%' IDENTIFIED BY 'strongpassword'; +GRANT SELECT, INSERT, UPDATE, DELETE ON jiebandata.* TO 'appuser'@'%'; FLUSH PRIVILEGES; " ``` @@ -434,8 +434,8 @@ tail -f /var/log/mysql/error.log ## 📞 支持与维护 ### 紧急联系人 -- **运维团队**: ops@company.com -- **开发团队**: dev@company.com +- **运维团队**: ops@jiebanke.com +- **开发团队**: dev@jiebanke.com - **值班电话**: +86-138-0013-8000 ### 维护窗口 diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 48086ce..b521244 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -2,7 +2,7 @@ ## 基础信息 -**Base URL**: `http://localhost:3100/api/v1` +**Base URL**: `https://www.jiebanke.com/api/v1` **认证方式**: Bearer Token (JWT) @@ -83,7 +83,7 @@ "id": 1, "username": "testuser", "nickname": "测试用户", - "email": "test@example.com", + "email": "test@jiebanke.com", "phone": "13800138000", "avatar": "", "gender": "unknown", @@ -122,7 +122,7 @@ "id": 1, "username": "testuser", "nickname": "测试用户", - "email": "test@example.com", + "email": "test@jiebanke.com", "phone": "13800138000", "avatar": "", "gender": "unknown", @@ -154,9 +154,9 @@ "id": 1, "username": "testuser", "nickname": "测试用户", - "email": "test@example.com", + "email": "test@jiebanke.com", "phone": "13800138000", - "avatar": "https://example.com/avatar.jpg", + "avatar": "https://www.jiebanke.com/avatar.jpg", "gender": "male", "birthday": "1990-01-01", "points": 1000, @@ -203,7 +203,7 @@ "id": 1, "username": "testuser", "nickname": "新昵称", - "avatar": "https://example.com/new-avatar.jpg", + "avatar": "https://www.jiebanke.com/new-avatar.jpg", "gender": "male", "birthday": "1990-01-01", "updated_at": "2025-01-01T00:00:00.000Z" @@ -241,7 +241,7 @@ "id": 1, "username": "testuser", "nickname": "测试用户", - "avatar": "https://example.com/avatar.jpg", + "avatar": "https://www.jiebanke.com/avatar.jpg", "gender": "male", "points": 100, "level": 2, @@ -273,7 +273,7 @@ "nickname": "测试用户", "email": "test@example.com", "phone": "13800138000", - "avatar": "https://example.com/avatar.jpg", + "avatar": "https://www.jiebanke.com/avatar.jpg", "gender": "male", "birthday": "1990-01-01", "points": 1000, @@ -358,7 +358,7 @@ "nickname": "测试用户", "email": "test@example.com", "phone": "13800138000", - "avatar": "https://example.com/avatar.jpg", + "avatar": "https://www.jiebanke.com/avatar.jpg", "gender": "male", "points": 100, "level": 2, @@ -396,7 +396,7 @@ "nickname": "测试用户", "email": "test@example.com", "phone": "13800138000", - "avatar": "https://example.com/avatar.jpg", + "avatar": "https://www.jiebanke.com/avatar.jpg", "gender": "male", "birthday": "1990-01-01", "points": 1000, @@ -437,7 +437,7 @@ "admin": { "id": 1, "username": "admin", - "email": "admin@example.com", + "email": "admin@jiebanke.com", "nickname": "超级管理员", "avatar": "https://example.com/avatar.jpg", "role": "super_admin", @@ -566,17 +566,21 @@ } ``` -### 9. 用户管理接口 +### 9. 管理员后台接口 -#### 9.1 获取用户列表 -- **Endpoint**: GET /api/v1/users +#### 9.1 用户管理接口 + +##### 9.1.1 获取用户列表 +- **Endpoint**: GET /api/v1/admin/users - **认证要求**: Bearer Token,需要user:manage权限 - **查询参数**: - `page` (可选): 页码,默认1 - `limit` (可选): 每页数量,默认20 - `username` (可选): 用户名模糊搜索 - - `user_type` (可选): 用户类型过滤 - - `status` (可选): 状态过滤 + - `user_type` (可选): 用户类型过滤(normal/merchant/farmer/organizer) + - `status` (可选): 状态过滤(active/inactive/banned) + - `start_date` (可选): 注册开始时间 + - `end_date` (可选): 注册结束时间 - **响应**: ```json { @@ -591,14 +595,682 @@ "nickname": "测试用户", "email": "test@example.com", "phone": "13800138000", - "user_type": "farmer", + "user_type": "normal", "status": "active", "points": 100, "level": 2, + "travel_count": 5, + "animal_adopt_count": 2, + "flower_order_count": 3, "created_at": "2025-01-01T00:00:00.000Z", "last_login_at": "2025-01-01T00:00:00.000Z" } ], + "pagination": { + "total": 100, + "page": 1, + "limit": 20, + "pages": 5 + }, + "statistics": { + "total_users": 100, + "active_users": 80, + "new_users_today": 5, + "merchant_users": 15, + "farmer_users": 10 + } + } +} +``` + +##### 9.1.2 获取用户详情 +- **Endpoint**: GET /api/v1/admin/users/{id} +- **认证要求**: Bearer Token,需要user:manage权限 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "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", + "user_type": "normal", + "status": "active", + "points": 1000, + "level": 3, + "balance": 500.00, + "travel_count": 5, + "animal_adopt_count": 2, + "flower_order_count": 3, + "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" + }, + "activity_stats": { + "last_7_days_login_count": 5, + "total_travel_plans": 3, + "total_animal_claims": 2, + "total_flower_orders": 1 + } + } +} +``` + +##### 9.1.3 更新用户状态 +- **Endpoint**: PUT /api/v1/admin/users/{id}/status +- **认证要求**: Bearer Token,需要user:manage权限 +- **请求体**: +```json +{ + "status": "banned", + "reason": "违反平台规则" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "用户状态更新成功" +} +``` + +##### 9.1.4 导出用户数据 +- **Endpoint**: GET /api/v1/admin/users/export +- **认证要求**: Bearer Token,需要user:manage权限 +- **查询参数**: + - `format` (可选): 导出格式(csv/excel),默认csv + - `start_date` (可选): 注册开始时间 + - `end_date` (可选): 注册结束时间 + - `user_type` (可选): 用户类型过滤 +- **响应**: 返回文件下载流 + +#### 9.2 商家审核接口 + +##### 9.2.1 获取待审核商家列表 +- **Endpoint**: GET /api/v1/admin/merchants/pending +- **认证要求**: Bearer Token,需要merchant:review权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `merchant_type` (可选): 商家类型(flower_shop/farm/activity_organizer) +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "merchants": [ + { + "id": 1, + "user_id": 2, + "shop_name": "鲜花小店", + "merchant_type": "flower_shop", + "contact_name": "张老板", + "contact_phone": "13800138001", + "business_license": "https://www.jiebanke.com/license.jpg", + "status": "pending", + "apply_reason": "希望加入平台提供鲜花服务", + "created_at": "2025-01-01T00:00:00.000Z", + "user_info": { + "username": "merchant1", + "nickname": "花店老板", + "email": "merchant@jiebanke.com" + } + } + ], + "pagination": { + "total": 10, + "page": 1, + "limit": 20, + "pages": 1 + } + } +} +``` + +##### 9.2.2 审核商家申请 +- **Endpoint**: POST /api/v1/admin/merchants/{id}/review +- **认证要求**: Bearer Token,需要merchant:review权限 +- **请求体**: +```json +{ + "action": "approve", + "review_notes": "资质齐全,符合要求", + "reject_reason": "" +} +``` +或者 +```json +{ + "action": "reject", + "review_notes": "营业执照不清晰", + "reject_reason": "营业执照图片模糊,无法辨认" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "商家审核完成" +} +``` + +##### 9.2.3 获取商家列表 +- **Endpoint**: GET /api/v1/admin/merchants +- **认证要求**: Bearer Token,需要merchant:manage权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - "shop_name" (可选): 店铺名称模糊搜索 + - "merchant_type" (可选): 商家类型 + - "status" (可选): 状态(active/inactive/rejected) +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "merchants": [ + { + "id": 1, + "user_id": 2, + "shop_name": "鲜花小店", + "merchant_type": "flower_shop", + "contact_name": "张老板", + "contact_phone": "13800138001", + "business_license": "https://www.jiebanke.com/license.jpg", + "status": "active", + "total_products": 15, + "total_orders": 120, + "total_revenue": 5000.00, + "avg_rating": 4.8, + "created_at": "2025-01-01T00:00:00.000Z", + "approved_at": "2025-01-02T00:00:00.000Z" + } + ], + "pagination": { + "total": 50, + "page": 1, + "limit": 20, + "pages": 3 + }, + "statistics": { + "total_merchants": 50, + "active_merchants": 45, + "flower_shops": 20, + "farms": 15, + "organizers": 15, + "pending_reviews": 5 + } + } +} +``` + +#### 9.3 内容审核接口 + +##### 9.3.1 获取待审核内容列表 +- **Endpoint**: GET /api/v1/admin/content/pending +- **认证要求**: Bearer Token,需要content:review权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `content_type` (可选): 内容类型(travel_plan/dynamic/comment) +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "contents": [ + { + "id": 1, + "type": "travel_plan", + "title": "云南大理之旅", + "content": "计划去大理游玩5天,寻找同行伙伴...", + "author_id": 3, + "author_name": "旅行爱好者", + "status": "pending", + "created_at": "2025-01-01T00:00:00.000Z", + "review_count": 0 + }, + { + "id": 2, + "type": "dynamic", + "title": "", + "content": "今天认领了一只可爱的小羊!", + "images": ["https://www.jiebanke.com/sheep.jpg"], + "author_id": 4, + "author_name": "动物爱好者", + "status": "pending", + "created_at": "2025-01-01T00:00:00.000Z", + "review_count": 0 + } + ], + "pagination": { + "total": 25, + "page": 1, + "limit": 20, + "pages": 2 + } + } +} +``` + +##### 9.3.2 审核内容 +- **Endpoint**: POST /api/v1/admin/content/{id}/review +- **认证要求**: Bearer Token,需要content:review权限 +- **请求体**: +```json +{ + "action": "approve", + "review_notes": "内容符合规范" +} +``` +或者 +```json +{ + "action": "reject", + "review_notes": "包含不当内容", + "reject_reason": "包含联系方式" +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "内容审核完成" +} +``` + +##### 9.3.3 获取内容统计 +- **Endpoint**: GET /api/v1/admin/content/statistics +- **认证要求**: Bearer Token,需要content:review权限 +- **查询参数**: + - `days` (可选): 统计天数,默认7 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "total_contents": 1000, + "pending_review": 25, + "approved": 900, + "rejected": 75, + "daily_stats": [ + { + "date": "2025-01-01", + "total": 50, + "approved": 45, + "rejected": 5 + } + ], + "by_type": { + "travel_plan": 300, + "dynamic": 500, + "comment": 200 + } + } +} +``` + +#### 9.4 数据统计接口 + +##### 9.4.1 获取平台概览数据 +- **Endpoint**: GET /api/v1/admin/dashboard/overview +- **认证要求**: Bearer Token,需要data:view权限 +- **查询参数**: + - `days` (可选): 统计天数,默认30 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "user_stats": { + "total_users": 10000, + "new_users_today": 50, + "new_users_7d": 300, + "new_users_30d": 1200, + "active_users_7d": 2000, + "active_users_30d": 6000 + }, + "order_stats": { + "total_orders": 5000, + "today_orders": 25, + "revenue_today": 1250.00, + "revenue_7d": 8500.00, + "revenue_30d": 35000.00, + "avg_order_value": 70.00 + }, + "content_stats": { + "total_travel_plans": 2000, + "total_animal_claims": 800, + "total_flower_orders": 1200, + "total_dynamics": 3000 + }, + "merchant_stats": { + "total_merchants": 150, + "active_merchants": 120, + "flower_shops": 60, + "farms": 50, + "organizers": 40 + } + } +} +``` + +##### 9.4.2 获取用户增长图表 +- **Endpoint**: GET /api/v1/admin/dashboard/user-growth +- **认证要求**: Bearer Token,需要data:view权限 +- **查询参数**: + - `days` (可选): 统计天数,默认30 + - `group_by` (可选): 分组方式(day/week/month),默认day +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "chart_data": [ + { + "date": "2025-01-01", + "new_users": 45, + "total_users": 10045 + }, + { + "date": "2025-01-02", + "new_users": 52, + "total_users": 10097 + } + ], + "summary": { + "total_new_users": 1200, + "growth_rate": 12.5, + "avg_daily_new_users": 40 + } + } +} +``` + +##### 9.4.3 获取订单统计图表 +- **Endpoint**: GET /api/v1/admin/dashboard/order-stats +- **认证要求**: Bearer Token,需要data:view权限 +- **查询参数**: + - `days` (可选): 统计天数,默认30 + - `order_type` (可选): 订单类型(flower/animal/travel) +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "chart_data": [ + { + "date": "2025-01-01", + "total_orders": 28, + "total_revenue": 1960.00, + "flower_orders": 15, + "animal_orders": 8, + "travel_orders": 5 + } + ], + "summary": { + "total_revenue": 35000.00, + "avg_daily_revenue": 1166.67, + "order_conversion_rate": 8.5 + } + } +} +``` + +##### 9.4.4 导出数据报表 +- **Endpoint**: GET /api/v1/admin/dashboard/export +- **认证要求**: Bearer Token,需要data:export权限 +- **查询参数**: + - `report_type` (必选): 报表类型(users/orders/contents/merchants) + - `format` (可选): 格式(csv/excel),默认csv + - `start_date` (可选): 开始时间 + - `end_date` (可选): 结束时间 +- **响应**: 返回文件下载流 + +#### 9.5 权限管理接口 + +##### 9.5.1 获取管理员列表 +- **Endpoint**: GET /api/v1/admin/administrators +- **认证要求**: Bearer Token,需要admin:manage权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `username` (可选): 用户名模糊搜索 + - `role` (可选): 角色过滤 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "admins": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "nickname": "超级管理员", + "avatar": "https://example.com/avatar.jpg", + "role": "super_admin", + "status": 1, + "last_login": "2025-01-15T10:30:00.000Z", + "created_at": "2025-01-01T00:00:00.000Z", + "permissions": ["user:manage", "content:review", "data:view", "data:export"] + } + ], + "pagination": { + "total": 10, + "page": 1, + "limit": 20, + "pages": 1 + } + } +} +``` + +##### 9.5.2 创建管理员账号 +- **Endpoint**: POST /api/v1/admin/administrators +- **认证要求**: Bearer Token,需要admin:manage权限 +- **请求体**: +```json +{ + "username": "newadmin", + "password": "password123", + "email": "newadmin@example.com", + "nickname": "新管理员", + "role": "content_admin", + "permissions": ["content:review", "content:publish"] +} +``` +- **响应**: +```json +{ + "success": true, + "code": 201, + "message": "管理员创建成功", + "data": { + "id": 2, + "username": "newadmin", + "email": "newadmin@example.com", + "nickname": "新管理员", + "role": "content_admin", + "status": 1, + "created_at": "2025-01-01T00:00:00.000Z" + } +} +``` + +##### 9.5.3 更新管理员权限 +- **Endpoint**: PUT /api/v1/admin/administrators/{id}/permissions +- **认证要求**: Bearer Token,需要admin:manage权限 +- **请求体**: +```json +{ + "permissions": ["content:review", "content:publish", "data:view"] +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "权限更新成功" +} +``` + +##### 9.5.4 禁用/启用管理员账号 +- **Endpoint**: PUT /api/v1/admin/administrators/{id}/status +- **认证要求**: Bearer Token,需要admin:manage权限 +- **请求体**: +```json +{ + "status": 0 +} +``` +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "管理员状态更新成功" +} +``` + +##### 9.5.5 获取权限列表 +- **Endpoint**: GET /api/v1/admin/permissions +- **认证要求**: Bearer Token,需要admin:manage权限 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "permissions": [ + { + "code": "user:manage", + "name": "用户管理", + "description": "管理用户账号和状态" + }, + { + "code": "content:review", + "name": "内容审核", + "description": "审核用户发布的内容" + }, + { + "code": "content:publish", + "name": "内容发布", + "description": "发布和管理平台内容" + }, + { + "code": "data:view", + "name": "数据查看", + "description": "查看平台统计数据" + }, + { + "code": "data:export", + "name": "数据导出", + "description": "导出数据报表" + }, + { + "code": "merchant:review", + "name": "商家审核", + "description": "审核商家入驻申请" + }, + { + "code": "merchant:manage", + "name": "商家管理", + "description": "管理商家账号和信息" + }, + { + "code": "admin:manage", + "name": "管理员管理", + "description": "管理其他管理员账号" + } + ] + } +} +``` + +#### 9.6 操作日志接口 + +##### 9.6.1 获取操作日志列表 +- **Endpoint**: GET /api/v1/admin/operation-logs +- **认证要求**: Bearer Token,需要admin:manage权限 +- **查询参数**: + - `page` (可选): 页码,默认1 + - `limit` (可选): 每页数量,默认20 + - `admin_id` (可选): 操作管理员ID + - `action_type` (可选): 操作类型 + - `start_date` (可选): 开始时间 + - `end_date` (可选): 结束时间 +- **响应**: +```json +{ + "success": true, + "code": 200, + "message": "获取成功", + "data": { + "logs": [ + { + "id": 1, + "admin_id": 1, + "admin_name": "超级管理员", + "action_type": "user_status_update", + "target_type": "user", + "target_id": 5, + "target_name": "testuser", + "old_value": "active", + "new_value": "banned", + "ip_address": "192.168.1.100", + "user_agent": "Mozilla/5.0...", + "created_at": "2025-01-01T10:30:00.000Z" + } + ], + "pagination": { + "total": 1000, + "page": 1, + "limit": 20, + "pages": 50 + } + } +} +``` + +##### 9.6.2 导出操作日志 +- **Endpoint**: GET /api/v1/admin/operation-logs/export +- **认证要求**: Bearer Token,需要admin:manage权限 +- **查询参数**: + - `format` (可选): 格式(csv/excel),默认csv + - `start_date` (可选): 开始时间 + - `end_date` (可选): 结束时间 +- **响应**: 返回文件下载流 + ], "pagination": { "total": 100, "page": 1, @@ -716,7 +1388,7 @@ "name": "MySQL数据库", "type": "database", "status": "running", - "host": "localhost", + "host": "mysql.jiebanke.com", "port": 3306, "description": "主数据库服务", "created_at": "2024-01-01T00:00:00.000Z", @@ -864,7 +1536,7 @@ "username": "testuser", "nickname": "测试用户" }, - "images": ["https://example.com/image1.jpg"], + "images": ["https://www.jiebanke.com/image1.jpg"], "status": "pending", "created_at": "2025-01-01T12:00:00.000Z", "updated_at": "2025-01-01T12:00:00.000Z" @@ -1797,7 +2469,7 @@ "vaccination_status": "vaccinated", "sterilization_status": "sterilized", "location": "北京市朝阳区", - "images": ["https://example.com/animal1.jpg"], + "images": ["https://www.jiebanke.com/animal1.jpg"], "status": "available", "shelter": { "id": 1, @@ -1882,7 +2554,7 @@ "original_price": 129.00, "stock": 50, "sales": 120, - "images": ["https://example.com/rose.jpg"], + "images": ["https://www.jiebanke.com/rose.jpg"], "merchant": { "id": 1, "name": "花语花店", @@ -1990,7 +2662,7 @@ "post": { "id": 1, "content": "今天去了西湖,风景真美!", - "images": ["https://example.com/westlake.jpg"], + "images": ["https://www.jiebanke.com/westlake.jpg"], "visibility": "public", "location": "杭州西湖", "like_count": 0, @@ -2177,7 +2849,7 @@ "id": 1, "username": "user1", "nickname": "用户1", - "email": "user1@example.com", + "email": "user1@jiebanke.com", "phone": "13800138001", "status": "active", "level": 2, @@ -2344,7 +3016,7 @@ "user": { "id": 2, "nickname": "旅行伙伴", - "avatar": "https://example.com/avatar2.jpg" + "avatar": "https://www.jiebanke.com/avatar2.jpg" } } ], @@ -2398,7 +3070,7 @@ "description": "非常温顺的猫咪,寻找有爱心的主人", "location": "北京市朝阳区", "status": "available", - "images": ["https://example.com/cat1.jpg"], + "images": ["https://www.jiebanke.com/cat1.jpg"], "creator_id": 1, "created_at": "2025-01-01T00:00:00.000Z" } @@ -2482,7 +3154,7 @@ "name": "羊驼认领体验", "description": "提供一个月的羊驼认领体验服务", "price": 1000.00, - "image_url": "https://example.com/product.jpg", + "image_url": "https://www.jiebanke.com/product.jpg", "category": "animal_claim", "status": "available", "created_at": "202极速版5-01-01T00:00:00.000Z" @@ -2590,8 +3262,8 @@ "success": true, "code": 200, "data": { - "promotion_link": "https://example.com/promotion?ref=user123", - "qr_code": "https://example.com/qrcode.png" + "promotion_link": "https://www.jiebanke.com/promotion?ref=user123", +"qr_code": "https://www.jiebanke.com/qrcode.png" } } ``` @@ -2716,7 +3388,7 @@ "id": 1, "title": "XX农场成功入驻案例", "description": "XX农场通过平台实现了数字化转型", - "image_url": "https://example.com/case1.jpg", + "image_url": "https://www.jiebanke.com/case1.jpg", "created_at": "2025-01-01T00:00:00.000Z" } ], diff --git a/docs/architecture.md b/docs/architecture.md index d8d2986..352951f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -194,7 +194,7 @@ erDiagram ### 开发环境 (Development) ```env -DB_HOST=localhost +DB_HOST=mysql.jiebanke.com DB_PORT=3306 DB_USER=root DB_PASSWORD=rootpassword @@ -280,7 +280,7 @@ NODE_ENV=production "gender": "male", "birthday": "1990-01-01", "phone": "13800138000", - "email": "test@example.com", + "email": "test@jiebanke.com", "travelCount": 5, "animalClaimCount": 2, "createdAt": "2024-01-01T00:00:00.000Z", diff --git a/docs/database-design.md b/docs/database-design.md index 090dabc..1ba8138 100644 --- a/docs/database-design.md +++ b/docs/database-design.md @@ -324,7 +324,7 @@ erDiagram ### 3.1 接口统一格式 #### 请求格式 -- **Base URL**: http://localhost:3100/api/v1 +- **Base URL**: https://www.jiebanke.com/api/v1 - **认证**: Bearer Token (需要认证的接口) - **Content-Type**: application/json @@ -393,6 +393,40 @@ erDiagram - **Endpoint**: PUT /admin/users/{id}/status - **认证要求**: Bearer Token +### 2.13 管理员操作日志表 (admin_operation_logs) +| 字段名 | 类型 | 约束 | 描述 | +|--------|------|------|------| +| id | INT | PRIMARY KEY, AUTO_INCREMENT | 日志ID | +| admin_id | INT | FOREIGN KEY REFERENCES admins(id), NOT NULL | 操作管理员ID | +| admin_name | VARCHAR(50) | NOT NULL | 管理员名称 | +| action_type | VARCHAR(50) | NOT NULL | 操作类型 | +| target_type | VARCHAR(50) | | 目标类型 | +| target_id | INT | | 目标ID | +| target_name | VARCHAR(100) | | 目标名称 | +| old_value | TEXT | | 操作前值 | +| new_value | TEXT | | 操作后值 | +| ip_address | VARCHAR(45) | | 操作IP地址 | +| user_agent | VARCHAR(500) | | 用户代理信息 | +| created_at | DATETIME | NOT NULL | 创建时间 | + +### 2.14 管理员权限表 (admin_permissions) +| 字段名 | 类型 | 约束 | 描述 | +|--------|------|------|------| +| id | INT | PRIMARY KEY, AUTO_INCREMENT | 权限ID | +| code | VARCHAR(50) | UNIQUE, NOT NULL | 权限代码 | +| name | VARCHAR(100) | NOT NULL | 权限名称 | +| description | VARCHAR(255) | | 权限描述 | +| created_at | DATETIME | NOT NULL | 创建时间 | +| updated_at | DATETIME | NOT NULL | 更新时间 | + +### 2.15 管理员角色权限关联表 (admin_role_permissions) +| 字段名 | 类型 | 约束 | 描述 | +|--------|------|------|------| +| id | INT | PRIMARY KEY, AUTO_INCREMENT | 关联ID | +| admin_id | INT | FOREIGN KEY REFERENCES admins(id), NOT NULL | 管理员ID | +| permission_code | VARCHAR(50) | FOREIGN KEY REFERENCES admin_permissions(code), NOT NULL | 权限代码 | +| created_at | DATETIME | NOT NULL | 创建时间 | + ### 3.5 商家管理接口 #### 3.5.1 获取商家列表 @@ -434,8 +468,8 @@ VALUES ```sql INSERT INTO users (openid, nickname, gender, phone, email) VALUES -('wx1234567890', '测试用户1', 'male', '13800138000', 'test1@example.com'), -('wx0987654321', '测试用户2', 'female', '13800138001', 'test2@example.com'); +('wx1234567890', '测试用户1', 'male', '13800138000', 'test1@jiebanke.com'), +('wx0987654321', '测试用户2', 'female', '13800138001', 'test2@jiebanke.com'); ``` ### 4.3 创建测试商家 diff --git a/docs/detailed_design.md b/docs/detailed_design.md index 95a04ef..4d22cea 100644 --- a/docs/detailed_design.md +++ b/docs/detailed_design.md @@ -496,7 +496,7 @@ erDiagram "gender": "male", "birthday": "1990-01-01", "phone": "13800138000", - "email": "user@example.com" + "email": "user@jiebanke.com" } } ``` @@ -511,7 +511,7 @@ erDiagram "gender": "female", "birthday": "1995-01-01", "phone": "13900139000", - "email": "new@example.com" + "email": "new@jiebanke.com" } ``` - **响应**: @@ -675,7 +675,7 @@ erDiagram "user_id": 1, "animal_id": 1, "price_paid": 1000.00, - "agreement_url": "https://example.com/agreement.pdf", + "agreement_url": "https://www.jiebanke.com/agreement.pdf", "status": "active", "claimed_at": "2023-09-01T12:00:00Z" } @@ -722,7 +722,7 @@ erDiagram { "merchant_type": "farm_owner", "business_name": "XX农场", - "business_license": "https://example.com/license.jpg", + "business_license": "https://www.jiebanke.com/license.jpg", "contact_person": "张三", "contact_phone": "13800138000", "address": "北京市朝阳区XX路XX号", @@ -759,7 +759,7 @@ erDiagram "name": "羊驼认领体验", "description": "提供一个月的羊驼认领体验服务", "price": 1000.00, - "image_url": "https://example.com/product.jpg", + "image_url": "https://www.jiebanke.com/product.jpg", "category": "animal_claim", "status": "available" } @@ -775,7 +775,7 @@ erDiagram "name": "羊驼认领体验", "description": "提供一个月的羊驼认领体验服务", "price": 1000.00, - "image_url": "https://example.com/product.jpg", + "image_url": "https://www.jiebanke.com/product.jpg", "category": "animal_claim", "status": "available", "created_at": "2023-09-01T12:00:00Z" @@ -822,7 +822,7 @@ erDiagram "business_name": "XX农场", "contact_person": "张三", "contact_phone": "13800138000", - "email": "zhangsan@example.com", + "email": "zhangsan@jiebanke.com", "description": "专业养殖羊驼的农场" } ``` @@ -858,7 +858,7 @@ erDiagram "id": 1, "title": "XX农场成功入驻案例", "description": "XX农场通过平台实现了数字化转型", - "image_url": "https://example.com/case1.jpg", + "image_url": "https://www.jiebanke.com/case1.jpg", "created_at": "2023-09-01T12:00:00Z" } ], diff --git a/mini-program/api/config.js b/mini-program/api/config.js index 859a6f2..7bd9e53 100644 --- a/mini-program/api/config.js +++ b/mini-program/api/config.js @@ -2,7 +2,7 @@ const config = { // 开发环境 development: { - baseURL: 'http://localhost:3100/api', + baseURL: 'https://api.jiebanke.com/api', timeout: 10000 }, // 生产环境 diff --git a/mini-program/api/mock.js b/mini-program/api/mock.js index 01b8037..a8a17f5 100644 --- a/mini-program/api/mock.js +++ b/mini-program/api/mock.js @@ -18,7 +18,7 @@ export const mockUsers = [ username: 'user2', nickname: '动物保护者', avatar: '/static/user/avatar2.jpg', - email: 'user2@example.com', + email: 'user2@jiebanke.com', points: 300, level: 3, createTime: '2024-02-20' diff --git a/mini-program/unpackage/dist/dev/.sourcemap/mp-weixin/api/config.js.map b/mini-program/unpackage/dist/dev/.sourcemap/mp-weixin/api/config.js.map index f4d2526..49eea5f 100644 --- a/mini-program/unpackage/dist/dev/.sourcemap/mp-weixin/api/config.js.map +++ b/mini-program/unpackage/dist/dev/.sourcemap/mp-weixin/api/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sources":["api/config.js"],"sourcesContent":["// API基础配置\nconst config = {\n // 开发环境\n development: {\n baseURL: 'http://localhost:3100/api',\n timeout: 10000\n },\n // 生产环境\n production: {\n baseURL: 'https://api.jiebanke.com/api',\n timeout: 15000\n }\n}\n\n// 获取当前环境配置\nconst getConfig = () => {\n const env = process.env.NODE_ENV || 'development'\n return config[env]\n}\n\n// API端点\nconst endpoints = {\n // 用户相关\n USER: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n PROFILE: '/user/profile',\n UPDATE_PROFILE: '/user/profile',\n UPLOAD_AVATAR: '/user/avatar'\n },\n \n // 旅行计划\n TRAVEL: {\n LIST: '/travel/list',\n DETAIL: '/travel/detail',\n CREATE: '/travel/create',\n UPDATE: '/travel/update',\n DELETE: '/travel/delete',\n JOIN: '/travel/join',\n QUIT: '/travel/quit',\n LIKE: '/travel/like',\n UNLIKE: '/travel/unlike',\n COMMENT: '/travel/comment',\n COMMENTS: '/travel/comments',\n MY_PLANS: '/travel/my-plans',\n SEARCH: '/travel/search'\n },\n \n // 动物认养\n ANIMAL: {\n LIST: '/animal/list',\n DETAIL: '/animal/detail',\n ADOPT: '/animal/adopt',\n MY_ANIMALS: '/animal/my-animals',\n CATEGORIES: '/animal/categories'\n },\n \n // 送花服务\n FLOWER: {\n LIST: '/flower/list',\n DETAIL: '/flower/detail',\n ORDER: '/flower/order',\n MY_ORDERS: '/flower/my-orders',\n CATEGORIES: '/flower/categories'\n },\n \n // 订单管理\n ORDER: {\n LIST: '/order/list',\n DETAIL: '/order/detail',\n CANCEL: '/order/cancel',\n PAY: '/order/pay',\n CONFIRM: '/order/confirm'\n },\n \n // 支付相关\n PAYMENT: {\n CREATE: '/payment/create',\n QUERY: '/payment/query',\n REFUND: '/payment/refund'\n },\n \n // 系统相关\n SYSTEM: {\n CONFIG: '/system/config',\n NOTICE: '/system/notice',\n FEEDBACK: '/system/feedback'\n },\n\n // 搜索相关\n SEARCH: {\n GLOBAL: '/search/global',\n SUGGESTIONS: '/search/suggestions',\n TRAVEL: '/search/travel',\n ANIMAL: '/search/animal',\n FLOWER: '/search/flower',\n USER: '/search/user'\n },\n\n // 推广相关\n PROMOTION: {\n DATA: '/promotion/data',\n RECORDS: '/promotion/records',\n ALL_RECORDS: '/promotion/all-records',\n QRCODE: '/promotion/qrcode',\n REWARD_DETAILS: '/promotion/reward-details',\n WITHDRAW: '/promotion/withdraw',\n WITHDRAW_RECORDS: '/promotion/withdraw-records'\n },\n\n // 认证相关\n AUTH: {\n PHONE_LOGIN: '/auth/phone-login',\n WECHAT_LOGIN: '/auth/wechat-login',\n PASSWORD_LOGIN: '/auth/password-login',\n SEND_SMS_CODE: '/auth/send-sms-code',\n CHECK_TOKEN: '/auth/check-token',\n REFRESH_TOKEN: '/auth/refresh-token',\n BIND_PHONE: '/auth/bind-phone',\n CHANGE_PASSWORD: '/auth/change-password',\n RESET_PASSWORD: '/auth/reset-password'\n }\n}\n\nexport default {\n ...getConfig(),\n endpoints\n}"],"names":[],"mappings":";AACA,MAAM,SAAS;AAAA;AAAA,EAEb,aAAa;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,YAAY;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAGA,MAAM,YAAY,MAAM;AACtB,QAAM,MAAM;AACZ,SAAO,OAAO,GAAG;AACnB;AAGA,MAAM,YAAY;AAAA;AAAA,EAEhB,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAAA;AAAA,EAGA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB;AACF;AAEA,MAAe,WAAA;AAAA,EACb,GAAG,UAAU;AAAA,EACb;AACF;;"} \ No newline at end of file +{"version":3,"file":"config.js","sources":["api/config.js"],"sourcesContent":["// API基础配置\nconst config = {\n // 开发环境\n development: {\n baseURL: 'https://api.jiebanke.com/api',\n timeout: 10000\n },\n // 生产环境\n production: {\n baseURL: 'https://api.jiebanke.com/api',\n timeout: 15000\n }\n}\n\n// 获取当前环境配置\nconst getConfig = () => {\n const env = process.env.NODE_ENV || 'development'\n return config[env]\n}\n\n// API端点\nconst endpoints = {\n // 用户相关\n USER: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n PROFILE: '/user/profile',\n UPDATE_PROFILE: '/user/profile',\n UPLOAD_AVATAR: '/user/avatar'\n },\n \n // 旅行计划\n TRAVEL: {\n LIST: '/travel/list',\n DETAIL: '/travel/detail',\n CREATE: '/travel/create',\n UPDATE: '/travel/update',\n DELETE: '/travel/delete',\n JOIN: '/travel/join',\n QUIT: '/travel/quit',\n LIKE: '/travel/like',\n UNLIKE: '/travel/unlike',\n COMMENT: '/travel/comment',\n COMMENTS: '/travel/comments',\n MY_PLANS: '/travel/my-plans',\n SEARCH: '/travel/search'\n },\n \n // 动物认养\n ANIMAL: {\n LIST: '/animal/list',\n DETAIL: '/animal/detail',\n ADOPT: '/animal/adopt',\n MY_ANIMALS: '/animal/my-animals',\n CATEGORIES: '/animal/categories'\n },\n \n // 送花服务\n FLOWER: {\n LIST: '/flower/list',\n DETAIL: '/flower/detail',\n ORDER: '/flower/order',\n MY_ORDERS: '/flower/my-orders',\n CATEGORIES: '/flower/categories'\n },\n \n // 订单管理\n ORDER: {\n LIST: '/order/list',\n DETAIL: '/order/detail',\n CANCEL: '/order/cancel',\n PAY: '/order/pay',\n CONFIRM: '/order/confirm'\n },\n \n // 支付相关\n PAYMENT: {\n CREATE: '/payment/create',\n QUERY: '/payment/query',\n REFUND: '/payment/refund'\n },\n \n // 系统相关\n SYSTEM: {\n CONFIG: '/system/config',\n NOTICE: '/system/notice',\n FEEDBACK: '/system/feedback'\n },\n\n // 搜索相关\n SEARCH: {\n GLOBAL: '/search/global',\n SUGGESTIONS: '/search/suggestions',\n TRAVEL: '/search/travel',\n ANIMAL: '/search/animal',\n FLOWER: '/search/flower',\n USER: '/search/user'\n },\n\n // 推广相关\n PROMOTION: {\n DATA: '/promotion/data',\n RECORDS: '/promotion/records',\n ALL_RECORDS: '/promotion/all-records',\n QRCODE: '/promotion/qrcode',\n REWARD_DETAILS: '/promotion/reward-details',\n WITHDRAW: '/promotion/withdraw',\n WITHDRAW_RECORDS: '/promotion/withdraw-records'\n },\n\n // 认证相关\n AUTH: {\n PHONE_LOGIN: '/auth/phone-login',\n WECHAT_LOGIN: '/auth/wechat-login',\n PASSWORD_LOGIN: '/auth/password-login',\n SEND_SMS_CODE: '/auth/send-sms-code',\n CHECK_TOKEN: '/auth/check-token',\n REFRESH_TOKEN: '/auth/refresh-token',\n BIND_PHONE: '/auth/bind-phone',\n CHANGE_PASSWORD: '/auth/change-password',\n RESET_PASSWORD: '/auth/reset-password'\n }\n}\n\nexport default {\n ...getConfig(),\n endpoints\n}"],"names":[],"mappings":";AACA,MAAM,SAAS;AAAA;AAAA,EAEb,aAAa;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,YAAY;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAGA,MAAM,YAAY,MAAM;AACtB,QAAM,MAAM;AACZ,SAAO,OAAO,GAAG;AACnB;AAGA,MAAM,YAAY;AAAA;AAAA,EAEhB,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAAA;AAAA,EAGA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB;AACF;AAEA,MAAe,WAAA;AAAA,EACb,GAAG,UAAU;AAAA,EACb;AACF;;"} \ No newline at end of file diff --git a/mini-program/unpackage/dist/dev/mp-weixin/api/config.js b/mini-program/unpackage/dist/dev/mp-weixin/api/config.js index 8411e86..0472ed7 100644 --- a/mini-program/unpackage/dist/dev/mp-weixin/api/config.js +++ b/mini-program/unpackage/dist/dev/mp-weixin/api/config.js @@ -2,7 +2,7 @@ const config = { // 开发环境 development: { - baseURL: "http://localhost:3100/api", + baseURL: "https://api.jiebanke.com/api", timeout: 1e4 }, // 生产环境 diff --git a/scripts/test-api.js b/scripts/test-api.js index b0fe7f4..0bb4a78 100644 --- a/scripts/test-api.js +++ b/scripts/test-api.js @@ -1,7 +1,7 @@ // 结伴客系统API测试脚本 const axios = require('axios'); -const BASE_URL = 'http://localhost:3000/api/v1'; +const BASE_URL = 'https://api.jiebanke.com/api/v1'; // 创建axios实例 const api = axios.create({ @@ -28,7 +28,7 @@ async function testAPI() { username: 'testuser', password: 'test123', nickname: '测试用户', - email: 'test@example.com', + email: 'test@jiebanke.com', phone: '13800138000', gender: 'male', birthday: '1990-01-01'