docs(website): 重构关于页面布局和内容
- 更新页面布局,优化导航栏和面包屑导航 - 重新组织页面内容,突出公司使命和价值观 - 添加发展历程和核心团队介绍 - 更新合作伙伴展示方式 - 调整页脚内容,增加社交媒体链接
This commit is contained in:
67
backend/src/services/AuthService.js
Normal file
67
backend/src/services/AuthService.js
Normal file
@@ -0,0 +1,67 @@
|
||||
const jwt = require('jsonwebtoken');
|
||||
const bcrypt = require('bcryptjs');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const { jwtConfig } = require('../config/config');
|
||||
const User = require('../models/User');
|
||||
|
||||
// 小程序用户登录服务
|
||||
const miniProgramLogin = async (phone, code, miniProgramType) => {
|
||||
// 验证验证码(实际项目中需要对接短信服务)
|
||||
if (code !== '123456') { // 临时验证码,实际项目中需要验证真实验证码
|
||||
throw new Error('验证码错误');
|
||||
}
|
||||
|
||||
// 查找用户
|
||||
let user = await User.findOne({ where: { phone } });
|
||||
|
||||
// 如果用户不存在则创建新用户
|
||||
if (!user) {
|
||||
user = await User.create({
|
||||
uuid: uuidv4(),
|
||||
username: `user_${phone}`,
|
||||
phone,
|
||||
user_type: miniProgramType || 'client',
|
||||
password_hash: bcrypt.hashSync(phone, 10) // 临时密码,实际项目中需要更安全的处理
|
||||
});
|
||||
}
|
||||
|
||||
// 生成JWT token
|
||||
const token = jwt.sign(
|
||||
{
|
||||
id: user.id,
|
||||
uuid: user.uuid,
|
||||
username: user.username,
|
||||
phone: user.phone,
|
||||
userType: user.user_type
|
||||
},
|
||||
jwtConfig.secret,
|
||||
{ expiresIn: jwtConfig.expiresIn }
|
||||
);
|
||||
|
||||
// 返回用户信息和token
|
||||
const userInfo = {
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
realName: user.real_name,
|
||||
avatar: user.avatar_url,
|
||||
userType: user.user_type,
|
||||
phone: user.phone
|
||||
};
|
||||
|
||||
return { token, userInfo };
|
||||
};
|
||||
|
||||
// 验证token服务
|
||||
const verifyToken = async (token) => {
|
||||
try {
|
||||
const decoded = jwt.verify(token, jwtConfig.secret);
|
||||
return decoded;
|
||||
} catch (error) {
|
||||
throw new Error('无效的token');
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
miniProgramLogin,
|
||||
verifyToken
|
||||
};
|
||||
104
backend/src/services/OrderService.js
Normal file
104
backend/src/services/OrderService.js
Normal file
@@ -0,0 +1,104 @@
|
||||
const Order = require('../models/Order');
|
||||
|
||||
// 创建订单服务
|
||||
const createOrder = async (orderData, userId) => {
|
||||
// 设置买家ID
|
||||
orderData.buyer_id = userId;
|
||||
|
||||
// 生成订单号
|
||||
const orderNo = `ORD${Date.now()}${Math.floor(Math.random() * 1000).toString().padStart(3, '0')}`;
|
||||
orderData.order_no = orderNo;
|
||||
|
||||
// 创建订单
|
||||
const order = await Order.create(orderData);
|
||||
return order;
|
||||
};
|
||||
|
||||
// 获取订单列表服务
|
||||
const getOrderList = async (query, user) => {
|
||||
const { page = 1, pageSize = 10, status, orderNo } = query;
|
||||
|
||||
// 构建查询条件
|
||||
const whereConditions = {};
|
||||
|
||||
// 根据用户类型过滤
|
||||
if (user.userType === 'client') {
|
||||
whereConditions.buyer_id = user.id;
|
||||
} else if (user.userType === 'trader') {
|
||||
whereConditions.trader_id = user.id;
|
||||
} else if (user.userType === 'supplier') {
|
||||
whereConditions.supplier_id = user.id;
|
||||
} else if (user.userType === 'driver') {
|
||||
whereConditions.driver_id = user.id;
|
||||
}
|
||||
|
||||
if (status) whereConditions.status = status;
|
||||
if (orderNo) whereConditions.order_no = orderNo;
|
||||
|
||||
// 查询订单列表
|
||||
const { count, rows } = await Order.findAndCountAll({
|
||||
where: whereConditions,
|
||||
limit: parseInt(pageSize),
|
||||
offset: (parseInt(page) - 1) * parseInt(pageSize),
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
return { orders: rows, count, page: parseInt(page), pageSize: parseInt(pageSize) };
|
||||
};
|
||||
|
||||
// 获取订单详情服务
|
||||
const getOrderDetail = async (id, user) => {
|
||||
const order = await Order.findByPk(id);
|
||||
|
||||
if (!order) {
|
||||
throw new Error('订单不存在');
|
||||
}
|
||||
|
||||
// 权限检查
|
||||
if (user.userType === 'client' && order.buyer_id !== user.id) {
|
||||
throw new Error('无权限访问该订单');
|
||||
}
|
||||
|
||||
if (user.userType === 'trader' && order.trader_id !== user.id) {
|
||||
throw new Error('无权限访问该订单');
|
||||
}
|
||||
|
||||
if (user.userType === 'supplier' && order.supplier_id !== user.id) {
|
||||
throw new Error('无权限访问该订单');
|
||||
}
|
||||
|
||||
if (user.userType === 'driver' && order.driver_id !== user.id) {
|
||||
throw new Error('无权限访问该订单');
|
||||
}
|
||||
|
||||
return order;
|
||||
};
|
||||
|
||||
// 更新订单状态服务
|
||||
const updateOrderStatus = async (id, status, user) => {
|
||||
const order = await Order.findByPk(id);
|
||||
|
||||
if (!order) {
|
||||
throw new Error('订单不存在');
|
||||
}
|
||||
|
||||
// 权限检查和状态流转验证
|
||||
// 这里需要根据业务逻辑实现详细的状态流转控制
|
||||
|
||||
const [updatedRowsCount] = await Order.update({ status }, {
|
||||
where: { id }
|
||||
});
|
||||
|
||||
if (updatedRowsCount === 0) {
|
||||
throw new Error('订单状态更新失败');
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createOrder,
|
||||
getOrderList,
|
||||
getOrderDetail,
|
||||
updateOrderStatus
|
||||
};
|
||||
96
backend/src/services/PaymentService.js
Normal file
96
backend/src/services/PaymentService.js
Normal file
@@ -0,0 +1,96 @@
|
||||
const Payment = require('../models/Payment');
|
||||
|
||||
// 创建支付服务
|
||||
const createPayment = async (paymentData, userId) => {
|
||||
const { orderId, amount, paymentType, paymentMethod } = paymentData;
|
||||
|
||||
// 生成支付单号
|
||||
const paymentNo = `PAY${Date.now()}${Math.floor(Math.random() * 1000).toString().padStart(3, '0')}`;
|
||||
|
||||
// 创建支付记录
|
||||
const payment = await Payment.create({
|
||||
order_id: orderId,
|
||||
user_id: userId,
|
||||
amount,
|
||||
payment_type: paymentType,
|
||||
payment_method: paymentMethod,
|
||||
payment_no: paymentNo,
|
||||
status: 'pending'
|
||||
});
|
||||
|
||||
// 这里需要对接实际的支付接口(微信支付、支付宝等)
|
||||
// 暂时返回模拟的支付参数
|
||||
const paymentParams = {
|
||||
paymentNo,
|
||||
amount,
|
||||
paymentType,
|
||||
paymentMethod
|
||||
};
|
||||
|
||||
return { payment, paymentParams };
|
||||
};
|
||||
|
||||
// 获取支付列表服务
|
||||
const getPaymentList = async (query, userId) => {
|
||||
const { page = 1, pageSize = 10, status } = query;
|
||||
|
||||
// 构建查询条件
|
||||
const whereConditions = {
|
||||
user_id: userId
|
||||
};
|
||||
|
||||
if (status) whereConditions.status = status;
|
||||
|
||||
// 查询支付列表
|
||||
const { count, rows } = await Payment.findAndCountAll({
|
||||
where: whereConditions,
|
||||
limit: parseInt(pageSize),
|
||||
offset: (parseInt(page) - 1) * parseInt(pageSize),
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
return { payments: rows, count, page: parseInt(page), pageSize: parseInt(pageSize) };
|
||||
};
|
||||
|
||||
// 获取支付详情服务
|
||||
const getPaymentDetail = async (id, userId) => {
|
||||
const payment = await Payment.findByPk(id);
|
||||
|
||||
if (!payment) {
|
||||
throw new Error('支付记录不存在');
|
||||
}
|
||||
|
||||
// 权限检查
|
||||
if (payment.user_id !== userId) {
|
||||
throw new Error('无权限访问该支付记录');
|
||||
}
|
||||
|
||||
return payment;
|
||||
};
|
||||
|
||||
// 更新支付状态服务(模拟支付回调)
|
||||
const updatePaymentStatus = async (paymentNo, status, thirdPartyId) => {
|
||||
const [updatedRowsCount] = await Payment.update(
|
||||
{
|
||||
status,
|
||||
third_party_id: thirdPartyId,
|
||||
paid_time: status === 'paid' ? new Date() : null
|
||||
},
|
||||
{
|
||||
where: { payment_no: paymentNo }
|
||||
}
|
||||
);
|
||||
|
||||
if (updatedRowsCount === 0) {
|
||||
throw new Error('支付记录不存在');
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createPayment,
|
||||
getPaymentList,
|
||||
getPaymentDetail,
|
||||
updatePaymentStatus
|
||||
};
|
||||
107
backend/src/services/UserService.js
Normal file
107
backend/src/services/UserService.js
Normal file
@@ -0,0 +1,107 @@
|
||||
const User = require('../models/User');
|
||||
|
||||
// 获取用户列表服务
|
||||
const getUserList = async (query) => {
|
||||
const { page = 1, pageSize = 10, userType, status } = query;
|
||||
|
||||
// 构建查询条件
|
||||
const whereConditions = {};
|
||||
if (userType) whereConditions.user_type = userType;
|
||||
if (status) whereConditions.status = status;
|
||||
|
||||
// 查询用户列表
|
||||
const { count, rows } = await User.findAndCountAll({
|
||||
where: whereConditions,
|
||||
limit: parseInt(pageSize),
|
||||
offset: (parseInt(page) - 1) * parseInt(pageSize),
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
// 格式化用户数据
|
||||
const users = rows.map(user => ({
|
||||
id: user.id,
|
||||
uuid: user.uuid,
|
||||
username: user.username,
|
||||
realName: user.real_name,
|
||||
phone: user.phone,
|
||||
email: user.email,
|
||||
userType: user.user_type,
|
||||
status: user.status,
|
||||
avatar: user.avatar_url,
|
||||
createdAt: user.created_at
|
||||
}));
|
||||
|
||||
return { users, count, page: parseInt(page), pageSize: parseInt(pageSize) };
|
||||
};
|
||||
|
||||
// 获取用户详情服务
|
||||
const getUserDetail = async (id) => {
|
||||
const user = await User.findByPk(id);
|
||||
|
||||
if (!user) {
|
||||
throw new Error('用户不存在');
|
||||
}
|
||||
|
||||
const userInfo = {
|
||||
id: user.id,
|
||||
uuid: user.uuid,
|
||||
username: user.username,
|
||||
realName: user.real_name,
|
||||
phone: user.phone,
|
||||
email: user.email,
|
||||
userType: user.user_type,
|
||||
status: user.status,
|
||||
avatar: user.avatar_url,
|
||||
idCardFront: user.id_card_front_url,
|
||||
idCardBack: user.id_card_back_url,
|
||||
licenseFront: user.license_front_url,
|
||||
licenseBack: user.license_back_url,
|
||||
businessLicense: user.business_license_url,
|
||||
createdAt: user.created_at,
|
||||
updatedAt: user.updated_at
|
||||
};
|
||||
|
||||
return userInfo;
|
||||
};
|
||||
|
||||
// 更新用户信息服务
|
||||
const updateUser = async (id, updateData) => {
|
||||
// 过滤不允许更新的字段
|
||||
const allowedFields = ['real_name', 'email', 'avatar_url'];
|
||||
const filteredData = {};
|
||||
Object.keys(updateData).forEach(key => {
|
||||
if (allowedFields.includes(key)) {
|
||||
filteredData[key] = updateData[key];
|
||||
}
|
||||
});
|
||||
|
||||
const [updatedRowsCount] = await User.update(filteredData, {
|
||||
where: { id }
|
||||
});
|
||||
|
||||
if (updatedRowsCount === 0) {
|
||||
throw new Error('用户不存在');
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
// 更新用户状态服务
|
||||
const updateUserStatus = async (id, status) => {
|
||||
const [updatedRowsCount] = await User.update({ status }, {
|
||||
where: { id }
|
||||
});
|
||||
|
||||
if (updatedRowsCount === 0) {
|
||||
throw new Error('用户不存在');
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getUserList,
|
||||
getUserDetail,
|
||||
updateUser,
|
||||
updateUserStatus
|
||||
};
|
||||
Reference in New Issue
Block a user