docs(website): 重构关于页面布局和内容

- 更新页面布局,优化导航栏和面包屑导航
- 重新组织页面内容,突出公司使命和价值观
- 添加发展历程和核心团队介绍
- 更新合作伙伴展示方式
- 调整页脚内容,增加社交媒体链接
This commit is contained in:
2025-09-10 20:09:58 +08:00
parent 59cfe620fe
commit a9209b9c75
38 changed files with 10067 additions and 1989 deletions

View 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
};

View 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
};

View 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
};

View 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
};