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,54 @@
const jwt = require('jsonwebtoken');
const { jwtConfig } = require('../config/config');
// 认证中间件
const authenticate = (req, res, next) => {
try {
// 从请求头获取token
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({
code: 401,
message: '未提供认证token'
});
}
const token = authHeader.split(' ')[1];
// 验证token
const decoded = jwt.verify(token, jwtConfig.secret);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({
code: 401,
message: '无效的认证token'
});
}
};
// 角色权限检查中间件
const checkRole = (roles) => {
return (req, res, next) => {
if (!req.user) {
return res.status(401).json({
code: 401,
message: '未认证'
});
}
if (!roles.includes(req.user.userType)) {
return res.status(403).json({
code: 403,
message: '权限不足'
});
}
next();
};
};
module.exports = {
authenticate,
checkRole
};

View File

@@ -0,0 +1,31 @@
const { errorResponse } = require('../utils/response');
// 错误处理中间件
const errorHandler = (err, req, res, next) => {
// 记录错误日志
console.error(err.stack);
// 默认错误状态码和消息
let statusCode = 500;
let message = '服务器内部错误';
// 根据错误类型设置状态码和消息
if (err.name === 'ValidationError') {
statusCode = 400;
message = '请求参数验证失败';
} else if (err.name === 'UnauthorizedError') {
statusCode = 401;
message = '未授权访问';
} else if (err.name === 'ForbiddenError') {
statusCode = 403;
message = '访问被拒绝';
} else if (err.name === 'NotFoundError') {
statusCode = 404;
message = '资源未找到';
}
// 返回错误响应
res.status(statusCode).json(errorResponse(message, statusCode));
};
module.exports = errorHandler;

View File

@@ -0,0 +1,13 @@
const express = require('express');
const router = express.Router();
// 健康检查端点
router.get('/health', (req, res) => {
res.status(200).json({
status: 'OK',
timestamp: new Date().toISOString(),
uptime: process.uptime()
});
});
module.exports = router;

View File

@@ -0,0 +1,36 @@
const fs = require('fs');
const path = require('path');
const { logConfig } = require('../config/config');
// 创建日志目录
const logDir = path.join(__dirname, '../../logs');
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
// 创建日志文件流
const logStream = fs.createWriteStream(path.join(logDir, 'app.log'), { flags: 'a' });
// 日志中间件
const logger = (req, res, next) => {
// 只在开发环境记录详细日志
if (process.env.NODE_ENV === 'development' || logConfig.level === 'debug') {
const logEntry = {
timestamp: new Date().toISOString(),
method: req.method,
url: req.url,
ip: req.ip,
userAgent: req.get('User-Agent')
};
// 写入日志文件
logStream.write(JSON.stringify(logEntry) + '\n');
// 控制台输出
console.log(`${logEntry.timestamp} - ${logEntry.method} ${logEntry.url} - ${logEntry.ip}`);
}
next();
};
module.exports = logger;