diff --git a/add_test_admin.js b/add_test_admin.js
new file mode 100644
index 0000000..80148b1
--- /dev/null
+++ b/add_test_admin.js
@@ -0,0 +1,61 @@
+const bcrypt = require('bcryptjs');
+const { query } = require('./backend/src/config/database');
+
+// 数据库配置
+const dbConfig = {
+ host: '129.211.213.226',
+ port: 9527,
+ user: 'root',
+ password: 'aiotAiot123!',
+ database: 'jiebandata'
+};
+
+async function addTestAdmin() {
+ try {
+ // 加密密码
+ const saltRounds = 10;
+ const plainPassword = 'admin123';
+ const hashedPassword = await bcrypt.hash(plainPassword, saltRounds);
+
+ console.log('加密后的密码:', hashedPassword);
+
+ // 插入测试管理员账户
+ const insertSQL = `
+ INSERT INTO admins (username, password, email, nickname, role)
+ VALUES (?, ?, ?, ?, ?)
+ ON DUPLICATE KEY UPDATE
+ password = VALUES(password),
+ email = VALUES(email),
+ nickname = VALUES(nickname),
+ role = VALUES(role)
+ `;
+
+ const params = [
+ 'testadmin',
+ hashedPassword,
+ 'testadmin@example.com',
+ '测试管理员',
+ 'admin'
+ ];
+
+ // 注意:这里我们需要直接使用mysql2连接数据库,因为backend/src/config/database可能依赖环境变量
+ const mysql = require('mysql2/promise');
+ const connection = await mysql.createConnection(dbConfig);
+
+ const [result] = await connection.execute(insertSQL, params);
+ console.log('✅ 测试管理员账户创建/更新成功');
+ console.log('受影响的行数:', result.affectedRows);
+
+ // 验证插入的数据
+ const [rows] = await connection.execute('SELECT * FROM admins WHERE username = ?', ['testadmin']);
+ console.log('\n插入的管理员信息:');
+ console.log(rows[0]);
+
+ await connection.end();
+ } catch (error) {
+ console.error('❌ 创建测试管理员账户失败:', error.message);
+ console.error(error.stack);
+ }
+}
+
+addTestAdmin();
\ No newline at end of file
diff --git a/admin-system/.env.development b/admin-system/.env.development
index eacef0f..a1b9d2a 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:3000/api/v1
+VITE_API_BASE_URL=http://localhost:3100/api/v1
VITE_API_TIMEOUT=30000
# 功能开关
diff --git a/admin-system/index.html b/admin-system/index.html
index 2dc8b3f..79e3534 100644
--- a/admin-system/index.html
+++ b/admin-system/index.html
@@ -15,7 +15,7 @@
-
+
diff --git a/admin-system/src/App.vue b/admin-system/src/App.vue
index 262201f..bcfc90e 100644
--- a/admin-system/src/App.vue
+++ b/admin-system/src/App.vue
@@ -13,7 +13,7 @@ const appStore = useAppStore()
onMounted(() => {
// 初始化应用
- appStore.initializeApp()
+ appStore.initialize()
// 开发环境调试信息
if (import.meta.env.DEV) {
diff --git a/admin-system/src/api/animal.ts b/admin-system/src/api/animal.ts
index 56852fe..4d7dc83 100644
--- a/admin-system/src/api/animal.ts
+++ b/admin-system/src/api/animal.ts
@@ -1,110 +1,89 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
-// 动物类型
-export type AnimalType = 'alpaca' | 'dog' | 'cat' | 'rabbit'
-
-// 动物状态
-export type AnimalStatus = 'available' | 'claimed' | 'reserved'
-
-// 认领状态
-export type ClaimStatus = 'pending' | 'approved' | 'rejected' | 'completed'
-
-// 动物数据结构
+// 定义动物相关类型
export interface Animal {
id: number
name: string
- type: AnimalType
+ species: string
breed: string
age: number
- price: number
- status: AnimalStatus
- image_url: string
+ gender: string
description: string
+ image: string
+ merchant_id: number
+ merchant_name: string
+ price: number
+ status: string
created_at: string
updated_at: string
}
-// 动物认领记录
-export interface AnimalClaim {
- id: number
- animal_id: number
- animal_name: string
- animal_image: string
- user_name: string
- user_phone: string
- status: ClaimStatus
- applied_at: string
- processed_at: string
-}
-
-// 动物查询参数
export interface AnimalQueryParams {
page?: number
- pageSize?: number
+ limit?: number
keyword?: string
- type?: AnimalType
- status?: AnimalStatus
+ species?: string
+ status?: string
+ merchant_id?: number
+ start_date?: string
+ end_date?: string
}
-// 认领记录查询参数
-export interface ClaimQueryParams {
- page?: number
- pageSize?: number
- keyword?: string
- status?: ClaimStatus
+export interface AnimalCreateData {
+ name: string
+ species: string
+ breed: string
+ age: number
+ gender: string
+ description: string
+ image: string
+ merchant_id: number
+ price: number
+ status?: string
}
-// API响应结构
-export interface ApiResponse {
- success: boolean
- code: number
- message: string
- data: T
- pagination?: {
- current: number
- pageSize: number
- total: number
- totalPages: number
- }
+export interface AnimalUpdateData {
+ name?: string
+ species?: string
+ breed?: string
+ age?: number
+ gender?: string
+ description?: string
+ image?: string
+ merchant_id?: number
+ price?: number
+ status?: string
}
// 获取动物列表
-export const getAnimals = async (params?: AnimalQueryParams): Promise> => {
- return request.get>('/animals', { params })
-}
+export const getAnimals = (params?: AnimalQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { animals: Animal[]; pagination: any } }>('/animals', { params })
// 获取动物详情
-export const getAnimal = async (id: number): Promise> => {
- return request.get>(`/animals/${id}`)
-}
+export const getAnimal = (id: number) =>
+ request.get<{ success: boolean; code: number; message: string; data: { animal: Animal } }>(`/animals/${id}`)
// 创建动物
-export const createAnimal = async (animalData: Partial): Promise> => {
- return request.post>('/animals', animalData)
-}
+export const createAnimal = (data: AnimalCreateData) =>
+ request.post<{ success: boolean; code: number; message: string; data: { animal: Animal } }>('/animals', data)
// 更新动物
-export const updateAnimal = async (id: number, animalData: Partial): Promise> => {
- return request.put>(`/animals/${id}`, animalData)
-}
+export const updateAnimal = (id: number, data: AnimalUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string; data: { animal: Animal } }>(`/animals/${id}`, data)
// 删除动物
-export const deleteAnimal = async (id: number): Promise> => {
- return request.delete>(`/animals/${id}`)
-}
+export const deleteAnimal = (id: number) =>
+ request.delete<{ success: boolean; code: number; message: string }>(`/animals/${id}`)
-// 获取认领记录列表
-export const getAnimalClaims = async (params?: ClaimQueryParams): Promise> => {
- return request.get>('/animals/claims', { params })
-}
+// 更新动物状态
+export const updateAnimalStatus = (id: number, status: string) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/animals/${id}/status`, { status })
-// 审核动物认领(通过)
-export const approveAnimalClaim = async (id: number): Promise> => {
- return request.post>(`/animals/claims/${id}/approve`)
-}
-
-// 拒绝动物认领
-export const rejectAnimalClaim = async (id: number, reason: string): Promise> => {
- return request.post>(`/animals/claims/${id}/reject`, { reason })
+export default {
+ getAnimals,
+ getAnimal,
+ createAnimal,
+ updateAnimal,
+ deleteAnimal,
+ updateAnimalStatus
}
\ No newline at end of file
diff --git a/admin-system/src/api/index.ts b/admin-system/src/api/index.ts
index ac4677e..5d05c18 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 || '/api'
+const baseURL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:3100/api'
const timeout = parseInt(import.meta.env.VITE_API_TIMEOUT || '10000')
// 创建axios实例
@@ -17,7 +17,7 @@ const api: AxiosInstance = axios.create({
// 请求拦截器
api.interceptors.request.use(
- (config: AxiosRequestConfig) => {
+ (config) => {
// 添加认证token
const token = localStorage.getItem('admin_token')
if (token && config.headers) {
@@ -124,18 +124,18 @@ export const authAPI = {
success: boolean
data: {
token: string
- user: any
+ admin: any
}
- }>('/auth/admin/login', credentials),
+ }>('/admin/login', credentials),
// 获取当前用户信息
getCurrentUser: () =>
request.get<{
success: boolean
data: {
- user: any
+ admin: any
}
- }>('/auth/me'),
+ }>('/admin/profile'),
// 刷新token
refreshToken: () =>
@@ -159,4 +159,13 @@ export * from './order'
export * from './promotion'
export * from './system'
+// 为避免命名冲突,单独导出模块
+export { default as userAPI } from './user'
+export { default as merchantAPI } from './merchant'
+export { default as travelAPI } from './travel'
+export { default as animalAPI } from './animal'
+export { default as orderAPI } from './order'
+export { default as promotionAPI } from './promotion'
+export { default as systemAPI } from './system'
+
export default api
\ No newline at end of file
diff --git a/admin-system/src/api/merchant.ts b/admin-system/src/api/merchant.ts
index c3865ad..43d37ed 100644
--- a/admin-system/src/api/merchant.ts
+++ b/admin-system/src/api/merchant.ts
@@ -1,73 +1,88 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
-// 商家类型
-export type MerchantType = 'flower_shop' | 'activity_organizer' | 'farm_owner'
-
-// 商家状态
-export type MerchantStatus = 'pending' | 'approved' | 'rejected' | 'disabled'
-
-// 商家数据结构
+// 定义商家相关类型
export interface Merchant {
id: number
business_name: string
- merchant_type: MerchantType
+ business_license: string
+ legal_representative: string
contact_person: string
contact_phone: string
- status: MerchantStatus
+ contact_email: string
+ address: string
+ business_scope: string
+ status: string
+ remark: string
created_at: string
updated_at: string
}
-// 商家查询参数
export interface MerchantQueryParams {
page?: number
- pageSize?: number
- keyword?: string
- type?: MerchantType
- status?: MerchantStatus
+ limit?: number
+ business_name?: string
+ contact_person?: string
+ contact_phone?: string
+ status?: string
+ start_date?: string
+ end_date?: string
}
-// API响应结构
-export interface ApiResponse {
- success: boolean
- code: number
- message: string
- data: T
- pagination?: {
- current: number
- pageSize: number
- total: number
- totalPages: number
- }
+export interface MerchantCreateData {
+ business_name: string
+ business_license: string
+ legal_representative: string
+ contact_person: string
+ contact_phone: string
+ contact_email: string
+ address: string
+ business_scope: string
+ status?: string
+ remark?: string
+}
+
+export interface MerchantUpdateData {
+ business_name?: string
+ business_license?: string
+ legal_representative?: string
+ contact_person?: string
+ contact_phone?: string
+ contact_email?: string
+ address?: string
+ business_scope?: string
+ status?: string
+ remark?: string
}
// 获取商家列表
-export const getMerchants = async (params?: MerchantQueryParams): Promise> => {
- return request.get>('/merchants', { params })
-}
+export const getMerchants = (params?: MerchantQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { merchants: Merchant[]; pagination: any } }>('/merchants', { params })
// 获取商家详情
-export const getMerchant = async (id: number): Promise> => {
- return request.get>(`/merchants/${id}`)
-}
+export const getMerchant = (id: number) =>
+ request.get<{ success: boolean; code: number; message: string; data: { merchant: Merchant } }>(`/merchants/${id}`)
-// 审核商家(通过)
-export const approveMerchant = async (id: number): Promise> => {
- return request.post>(`/merchants/${id}/approve`)
-}
+// 创建商家
+export const createMerchant = (data: MerchantCreateData) =>
+ request.post<{ success: boolean; code: number; message: string; data: { merchant: Merchant } }>('/merchants', data)
-// 拒绝商家入驻申请
-export const rejectMerchant = async (id: number, reason: string): Promise> => {
- return request.post>(`/merchants/${id}/reject`, { reason })
-}
+// 更新商家
+export const updateMerchant = (id: number, data: MerchantUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string; data: { merchant: Merchant } }>(`/merchants/${id}`, data)
-// 禁用商家
-export const disableMerchant = async (id: number): Promise> => {
- return request.post>(`/merchants/${id}/disable`)
-}
+// 删除商家
+export const deleteMerchant = (id: number) =>
+ request.delete<{ success: boolean; code: number; message: string }>(`/merchants/${id}`)
-// 启用商家
-export const enableMerchant = async (id: number): Promise> => {
- return request.post>(`/merchants/${id}/enable`)
+// 更新商家状态
+export const updateMerchantStatus = (id: number, status: string) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/merchants/${id}/status`, { status })
+
+export default {
+ getMerchants,
+ getMerchant,
+ createMerchant,
+ updateMerchant,
+ deleteMerchant,
+ updateMerchantStatus
}
\ No newline at end of file
diff --git a/admin-system/src/api/order.ts b/admin-system/src/api/order.ts
index eb05929..cf79386 100644
--- a/admin-system/src/api/order.ts
+++ b/admin-system/src/api/order.ts
@@ -1,4 +1,4 @@
-import { request } from '@/api'
+import { request } from '.'
import type { AxiosResponse } from 'axios'
// 订单状态
@@ -13,31 +13,42 @@ export interface Order {
order_no: string
user_id: number
user_name: string
- user_phone: string
- amount: number
- status: OrderStatus
- payment_method: PaymentMethod
+ merchant_id: number
+ merchant_name: string
+ product_id: number
+ product_name: string
+ product_type: string
+ quantity: number
+ unit_price: number
+ total_amount: number
+ status: string
+ payment_method: string
+ payment_time: string
+ refund_status: string
+ remark: string
created_at: string
- paid_at: string
- shipped_at: string
- completed_at: string
+ updated_at: string
}
// 订单查询参数
export interface OrderQueryParams {
page?: number
- pageSize?: number
+ limit?: number
order_no?: string
- status?: OrderStatus
- orderTime?: [string, string]
+ user_name?: string
+ merchant_name?: string
+ product_type?: string
+ status?: string
+ payment_method?: string
+ start_date?: string
+ end_date?: string
}
-// 统计数据
-export interface OrderStatistics {
- today_orders: number
- today_sales: number
- month_orders: number
- month_sales: number
+// 订单更新参数
+export interface OrderUpdateData {
+ status?: string
+ refund_status?: string
+ remark?: string
}
// API响应结构
@@ -55,41 +66,29 @@ export interface ApiResponse {
}
// 获取订单列表
-export const getOrders = async (params?: OrderQueryParams): Promise> => {
- return request.get>('/orders', { params })
-}
+export const getOrders = (params?: OrderQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { orders: Order[]; pagination: any } }>('/orders', { params })
// 获取订单详情
-export const getOrder = async (id: number): Promise> => {
- return request.get>(`/orders/${id}`)
-}
+export const getOrder = (id: number) =>
+ request.get<{ success: boolean; code: number; message: string; data: { order: Order } }>(`/orders/${id}`)
+
+// 更新订单
+export const updateOrder = (id: number, data: OrderUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string; data: { order: Order } }>(`/orders/${id}`, data)
+
+// 删除订单
+export const deleteOrder = (id: number) =>
+ request.delete<{ success: boolean; code: number; message: string }>(`/orders/${id}`)
// 更新订单状态
-export const updateOrderStatus = async (id: number, status: OrderStatus): Promise> => {
- return request.put>(`/orders/${id}/status`, { status })
-}
+export const updateOrderStatus = (id: number, status: string) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/orders/${id}/status`, { status })
-// 发货
-export const shipOrder = async (id: number): Promise> => {
- return request.post>(`/orders/${id}/ship`)
-}
-
-// 完成订单
-export const completeOrder = async (id: number): Promise> => {
- return request.post>(`/orders/${id}/complete`)
-}
-
-// 取消订单
-export const cancelOrder = async (id: number): Promise> => {
- return request.post>(`/orders/${id}/cancel`)
-}
-
-// 退款
-export const refundOrder = async (id: number): Promise> => {
- return request.post>(`/orders/${id}/refund`)
-}
-
-// 获取订单统计数据
-export const getOrderStatistics = async (): Promise> => {
- return request.get>('/orders/statistics')
+export default {
+ getOrders,
+ getOrder,
+ updateOrder,
+ deleteOrder,
+ updateOrderStatus
}
\ No newline at end of file
diff --git a/admin-system/src/api/promotion.ts b/admin-system/src/api/promotion.ts
index cb16f62..818339c 100644
--- a/admin-system/src/api/promotion.ts
+++ b/admin-system/src/api/promotion.ts
@@ -1,5 +1,81 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
+
+// 定义促销相关类型
+export interface Promotion {
+ id: number
+ title: string
+ description: string
+ type: string
+ discount_value: number
+ start_date: string
+ end_date: string
+ status: string
+ created_at: string
+ updated_at: string
+}
+
+export interface PromotionQueryParams {
+ page?: number
+ limit?: number
+ title?: string
+ type?: string
+ status?: string
+ start_date?: string
+ end_date?: string
+}
+
+export interface PromotionCreateData {
+ title: string
+ description: string
+ type: string
+ discount_value: number
+ start_date: string
+ end_date: string
+ status?: string
+}
+
+export interface PromotionUpdateData {
+ title?: string
+ description?: string
+ type?: string
+ discount_value?: number
+ start_date?: string
+ end_date?: string
+ status?: string
+}
+
+// 获取促销列表
+export const getPromotions = (params?: PromotionQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { promotions: Promotion[]; pagination: any } }>('/promotions', { params })
+
+// 获取促销详情
+export const getPromotion = (id: number) =>
+ request.get<{ success: boolean; code: number; message: string; data: { promotion: Promotion } }>(`/promotions/${id}`)
+
+// 创建促销
+export const createPromotion = (data: PromotionCreateData) =>
+ request.post<{ success: boolean; code: number; message: string; data: { promotion: Promotion } }>('/promotions', data)
+
+// 更新促销
+export const updatePromotion = (id: number, data: PromotionUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string; data: { promotion: Promotion } }>(`/promotions/${id}`, data)
+
+// 删除促销
+export const deletePromotion = (id: number) =>
+ request.delete<{ success: boolean; code: number; message: string }>(`/promotions/${id}`)
+
+// 更新促销状态
+export const updatePromotionStatus = (id: number, status: string) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/promotions/${id}/status`, { status })
+
+export default {
+ getPromotions,
+ getPromotion,
+ createPromotion,
+ updatePromotion,
+ deletePromotion,
+ updatePromotionStatus
+}
// 推广活动状态
export type PromotionStatus = 'active' | 'upcoming' | 'ended' | 'paused'
diff --git a/admin-system/src/api/system.ts b/admin-system/src/api/system.ts
index 4bd0571..6c14de9 100644
--- a/admin-system/src/api/system.ts
+++ b/admin-system/src/api/system.ts
@@ -1,5 +1,4 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
// 服务类型
export type ServiceType = 'database' | 'cache' | 'mq'
@@ -9,112 +8,79 @@ export type ServiceStatus = 'running' | 'stopped'
// 系统服务数据结构
export interface Service {
- id: number
+ id: string
name: string
type: ServiceType
+ status: ServiceStatus
+ host: string
+ port: number
description: string
+ created_at: string
+ updated_at: string
+}
+
+export interface ServiceQueryParams {
+ page?: number
+ limit?: number
+ type?: ServiceType
+ status?: ServiceStatus
+}
+
+export interface ServiceUpdateData {
status: ServiceStatus
}
-// 系统配置
-export interface SystemSettings {
- systemName: string
- systemVersion: string
- maintenanceMode: boolean
- sessionTimeout: number
- pageSize: number
- enableSwagger: boolean
-}
-
-// 系统信息
-export interface SystemInfo {
- version: string
- environment: string
- uptime: string
- startTime: string
-}
-
-// 数据库状态
-export interface DatabaseStatus {
- status: ServiceStatus
- type: string
- connections: string
- queriesPerMinute: number
-}
-
-// 缓存状态
-export interface CacheStatus {
- status: ServiceStatus
- memoryUsage: string
- hitRate: string
- keyCount: number
-}
-
-// API响应结构
-export interface ApiResponse {
- success: boolean
- code: number
- message: string
- data: T
-}
-
// 获取系统服务列表
-export const getServices = async (): Promise> => {
- return request.get>('/system/services')
+export const getServices = (params?: ServiceQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { services: Service[]; pagination: any } }>('/system/services', { params })
+
+// 更新系统服务状态
+export const updateServiceStatus = (id: string, data: ServiceUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/system/services/${id}/status`, data)
+
+// 定义系统配置相关类型
+export interface SystemConfig {
+ id: string
+ name: string
+ value: string
+ type: string
+ group: string
+ description: string
+ created_at: string
+ updated_at: string
}
-// 启动服务
-export const startService = async (id: number): Promise> => {
- return request.post>(`/system/services/${id}/start`)
+export interface SystemConfigQueryParams {
+ page?: number
+ limit?: number
+ group?: string
}
-// 停止服务
-export const stopService = async (id: number): Promise> => {
- return request.post>(`/system/services/${id}/stop`)
+export interface SystemConfigUpdateData {
+ value: string
}
-// 获取系统信息
-export const getSystemInfo = async (): Promise> => {
- return request.get>('/system/info')
-}
-
-// 获取数据库状态
-export const getDatabaseStatus = async (): Promise> => {
- return request.get>('/system/database')
-}
-
-// 获取缓存状态
-export const getCacheStatus = async (): Promise> => {
- return request.get>('/system/cache')
-}
-
-// 获取系统配置
-export const getSystemSettings = async (): Promise> => {
- return request.get>('/system/settings')
-}
+// 获取系统配置列表
+export const getSystemConfigs = (params?: SystemConfigQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { configs: SystemConfig[]; pagination: any } }>('/system-configs', { params })
// 更新系统配置
-export const updateSystemSettings = async (settings: SystemSettings): Promise> => {
- return request.put>('/system/settings', settings)
-}
+export const updateSystemConfig = (id: string, data: SystemConfigUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/system-configs/${id}`, data)
-// 获取操作日志
-export const getOperationLogs = async (params?: {
- page?: number
- pageSize?: number
- search?: string
- startDate?: string
- endDate?: string
-}): Promise> => {
- return request.get>('/system/logs', { params })
-}
+// 获取系统统计信息
+export const getSystemStats = () =>
+ request.get<{ success: boolean; code: number; message: string; data: any }>('/system/stats')
-// 清理缓存
-export const clearCache = async (): Promise> => {
- return request.post>('/system/cache/clear')
-}
+// 获取系统日志
+export const getSystemLogs = (params?: { page?: number; limit?: number; level?: string }) =>
+ request.get<{ success: boolean; code: number; message: string; data: { logs: any[]; pagination: any } }>('/system/logs', { params })
-// 系统健康检查
-export const healthCheck = async (): Promise> => {
- return request.get>('/system/health')
-}
\ No newline at end of file
+export default {
+ getServices,
+ updateServiceStatus,
+ getSystemConfigs,
+ updateSystemConfig,
+ getSystemStats,
+ getSystemLogs
+}
diff --git a/admin-system/src/api/travel.ts b/admin-system/src/api/travel.ts
index 784116b..bfb4517 100644
--- a/admin-system/src/api/travel.ts
+++ b/admin-system/src/api/travel.ts
@@ -1,68 +1,82 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
-// 旅行计划状态
-export type TravelStatus = 'recruiting' | 'full' | 'completed' | 'cancelled'
-
-// 旅行计划数据结构
-export interface TravelPlan {
+// 定义结伴游相关类型
+export interface Travel {
id: number
- destination: string
+ title: string
+ description: string
start_date: string
end_date: string
- budget: number
- max_members: number
- current_members: number
- status: TravelStatus
- creator: string
+ destination: string
+ max_participants: number
+ current_participants: number
+ price: number
+ status: string
created_at: string
updated_at: string
}
-// 旅行计划查询参数
export interface TravelQueryParams {
page?: number
- pageSize?: number
+ limit?: number
+ title?: string
destination?: string
- status?: TravelStatus
- travelTime?: [string, string]
+ status?: string
+ start_date?: string
+ end_date?: string
}
-// API响应结构
-export interface ApiResponse {
- success: boolean
- code: number
- message: string
- data: T
- pagination?: {
- current: number
- pageSize: number
- total: number
- totalPages: number
- }
+export interface TravelCreateData {
+ title: string
+ description: string
+ start_date: string
+ end_date: string
+ destination: string
+ max_participants: number
+ price: number
+ status?: string
}
-// 获取旅行计划列表
-export const getTravelPlans = async (params?: TravelQueryParams): Promise> => {
- return request.get>('/travel/plans', { params })
+export interface TravelUpdateData {
+ title?: string
+ description?: string
+ start_date?: string
+ end_date?: string
+ destination?: string
+ max_participants?: number
+ price?: number
+ status?: string
}
-// 获取旅行计划详情
-export const getTravelPlan = async (id: number): Promise> => {
- return request.get>(`/travel/plans/${id}`)
-}
+// 获取结伴游列表
+export const getTravels = (params?: TravelQueryParams) =>
+ request.get<{ success: boolean; code: number; message: string; data: { travels: Travel[]; pagination: any } }>('/travels', { params })
-// 审核旅行计划
-export const approveTravelPlan = async (id: number): Promise> => {
- return request.post>(`/travel/plans/${id}/approve`)
-}
+// 获取结伴游详情
+export const getTravel = (id: number) =>
+ request.get<{ success: boolean; code: number; message: string; data: { travel: Travel } }>(`/travels/${id}`)
-// 拒绝旅行计划
-export const rejectTravelPlan = async (id: number, reason: string): Promise> => {
- return request.post>(`/travel/plans/${id}/reject`, { reason })
-}
+// 创建结伴游
+export const createTravel = (data: TravelCreateData) =>
+ request.post<{ success: boolean; code: number; message: string; data: { travel: Travel } }>('/travels', data)
-// 关闭旅行计划
-export const closeTravelPlan = async (id: number): Promise> => {
- return request.post>(`/travel/plans/${id}/close`)
+// 更新结伴游
+export const updateTravel = (id: number, data: TravelUpdateData) =>
+ request.put<{ success: boolean; code: number; message: string; data: { travel: Travel } }>(`/travels/${id}`, data)
+
+// 删除结伴游
+export const deleteTravel = (id: number) =>
+ request.delete<{ success: boolean; code: number; message: string }>(`/travels/${id}`)
+
+// 更新结伴游状态
+export const updateTravelStatus = (id: number, status: string) =>
+ request.put<{ success: boolean; code: number; message: string }>(`/travels/${id}/status`, { status })
+
+export default {
+ getTravels,
+ getTravel,
+ createTravel,
+ updateTravel,
+ deleteTravel,
+ updateTravelStatus
}
\ No newline at end of file
diff --git a/admin-system/src/api/user.ts b/admin-system/src/api/user.ts
index 3f6365f..080efdf 100644
--- a/admin-system/src/api/user.ts
+++ b/admin-system/src/api/user.ts
@@ -1,81 +1,109 @@
-import { request } from '@/api'
-import type { AxiosResponse } from 'axios'
+import { request } from '.'
-// 用户状态类型
-export type UserStatus = 'active' | 'inactive' | 'banned'
-
-// 用户等级类型
-export type UserLevel = number
-
-// 用户数据结构
+// 定义用户相关类型
export interface User {
id: number
- openid: string
+ username: string
nickname: string
+ email: string
+ phone: string
avatar: string
gender: string
birthday: string
- phone: string
- email: string
- status: UserStatus
- level: UserLevel
points: number
+ level: number
+ balance: number
+ travel_count: number
+ animal_adopt_count: number
+ flower_order_count: number
+ status: string
+ remark: string
created_at: string
updated_at: string
+ last_login_at: string
}
-// 用户查询参数
export interface UserQueryParams {
page?: number
- pageSize?: number
- keyword?: string
- status?: UserStatus
- registerTime?: [string, string]
+ limit?: number
+ username?: string
+ nickname?: string
+ phone?: string
+ status?: string
+ start_date?: string
+ end_date?: string
}
-// API响应结构
-export interface ApiResponse {
+export interface UserCreateData {
+ username: string
+ password: string
+ nickname?: string
+ email?: string
+ phone?: string
+ gender?: string
+ birthday?: string
+ status?: string
+ remark?: string
+}
+
+export interface UserUpdateData {
+ username?: string
+ password?: string
+ nickname?: string
+ email?: string
+ phone?: string
+ gender?: string
+ birthday?: string
+ status?: string
+ remark?: string
+}
+
+export interface ApiResponse {
success: boolean
code: number
message: string
data: T
- pagination?: {
- current: number
- pageSize: number
- total: number
- totalPages: number
- }
}
// 获取用户列表
-export const getUsers = async (params?: UserQueryParams): Promise> => {
- return request.get>('/users', { params })
-}
+export const getUsers = (params?: UserQueryParams) =>
+ request.get>('/users', { params })
// 获取用户详情
-export const getUser = async (id: number): Promise> => {
- return request.get>(`/users/${id}`)
-}
+export const getUser = (id: number) =>
+ request.get>(`/users/${id}`)
// 创建用户
-export const createUser = async (userData: Partial): Promise> => {
- return request.post>('/users', userData)
-}
+export const createUser = (data: UserCreateData) =>
+ request.post>('/users', data)
// 更新用户
-export const updateUser = async (id: number, userData: Partial): Promise> => {
- return request.put>(`/users/${id}`, userData)
-}
+export const updateUser = (id: number, data: UserUpdateData) =>
+ request.put>(`/users/${id}`, data)
// 删除用户
-export const deleteUser = async (id: number): Promise> => {
- return request.delete>(`/users/${id}`)
-}
+export const deleteUser = (id: number) =>
+ request.delete>(`/users/${id}`)
-// 批量操作用户
-export const batchUsers = async (
- ids: number[],
- action: 'delete' | 'ban' | 'activate'
-): Promise> => {
- return request.post>('/users/batch', { ids, action })
+// 批量删除用户
+export const batchDeleteUsers = (ids: number[]) =>
+ request.post>('/users/batch-delete', { ids })
+
+// 更新用户状态
+export const updateUserStatus = (id: number, status: string) =>
+ request.put>(`/users/${id}/status`, { status })
+
+// 重置用户密码
+export const resetUserPassword = (id: number, password: string) =>
+ request.put>(`/users/${id}/password`, { password })
+
+export default {
+ getUsers,
+ getUser,
+ createUser,
+ updateUser,
+ deleteUser,
+ batchDeleteUsers,
+ updateUserStatus,
+ resetUserPassword
}
\ No newline at end of file
diff --git a/admin-system/src/pages/Login.vue b/admin-system/src/pages/Login.vue
index d307bcf..5052ece 100644
--- a/admin-system/src/pages/Login.vue
+++ b/admin-system/src/pages/Login.vue
@@ -69,6 +69,7 @@ import { useRouter } from 'vue-router'
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
import { useAppStore } from '@/stores/app'
+import { authAPI } from '@/api'
interface FormState {
username: string
@@ -91,25 +92,22 @@ const onFinish = async (values: FormState) => {
loading.value = true
try {
- // 模拟登录过程
- console.log('登录信息:', values)
-
- // TODO: 调用真实登录接口
- // const response = await authAPI.login(values)
-
- // 模拟登录成功
- await new Promise(resolve => setTimeout(resolve, 1000))
+ // 调用真实登录接口
+ const response = await authAPI.login(values)
// 保存token
- localStorage.setItem('admin_token', 'mock_token_123456')
+ if (response?.data?.token) {
+ localStorage.setItem('admin_token', response.data.token)
+ } else {
+ throw new Error('登录响应中缺少token')
+ }
// 更新用户状态
- appStore.setUser({
- id: 1,
- username: values.username,
- nickname: '管理员',
- role: 'admin'
- })
+ if (response?.data?.admin) {
+ appStore.setUser(response.data.admin)
+ } else {
+ throw new Error('登录响应中缺少用户信息')
+ }
message.success('登录成功!')
@@ -117,9 +115,10 @@ const onFinish = async (values: FormState) => {
const redirect = router.currentRoute.value.query.redirect as string
router.push(redirect || '/dashboard')
- } catch (error) {
+ } catch (error: any) {
console.error('登录失败:', error)
- message.error('登录失败,请检查用户名和密码')
+ const errorMessage = error.message || '登录失败,请检查用户名和密码'
+ message.error(errorMessage)
} finally {
loading.value = false
}
@@ -174,10 +173,11 @@ const onFinishFailed = (errorInfo: any) => {
border-top: 1px solid #f0f0f0;
}
-.login-footer p {
+.login-footer {
+ text-align: center;
+ margin-top: 30px;
color: #999;
font-size: 12px;
- margin: 0;
}
:deep(.ant-input-affix-wrapper) {
diff --git a/admin-system/src/pages/merchant/index.vue b/admin-system/src/pages/merchant/index.vue
index 3c90228..97910e7 100644
--- a/admin-system/src/pages/merchant/index.vue
+++ b/admin-system/src/pages/merchant/index.vue
@@ -137,7 +137,7 @@
\ No newline at end of file
diff --git a/admin-system/src/pages/user/index.vue b/admin-system/src/pages/user/index.vue
index 9c4f0c3..89c9317 100644
--- a/admin-system/src/pages/user/index.vue
+++ b/admin-system/src/pages/user/index.vue
@@ -236,8 +236,8 @@
-
\ No newline at end of file
diff --git a/mini-program/pages/travel/detail.vue b/mini-program/pages/travel/detail.vue
index 3767480..0b326ec 100644
--- a/mini-program/pages/travel/detail.vue
+++ b/mini-program/pages/travel/detail.vue
@@ -36,36 +36,69 @@
+
+