chenpei d0dc94e36d feat: 将弹幕功能替换为AI聊天助手
新功能:
- 创建AI聊天助手组件(AIChatWidget)
- 支持文字+图片多模态对话
- 集成Gemini AI API
- 支持图片编辑和内容生成
- 实时对话历史管理
- 优雅的UI设计,支持黑夜模式

技术实现:
- 后端API代理Gemini API(/api/ai-chat)
- 支持最多5张图片上传
- 流式响应处理
- 对话历史管理
- Base64图片处理

配置:
- 在.env中添加Gemini API配置
- GEMINI_API_KEY
- GEMINI_API_BASE_URL
- GEMINI_MODEL

替换原弹幕功能,提供更强大的AI助手体验!
2025-10-27 17:45:37 +08:00

126 lines
3.7 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const cors = require('cors');
const { connectDB } = require('./db/mongoose');
const mongoose = require('mongoose');
const path = require('path');
const morgan = require('morgan');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
// 创建Express应用
const app = express();
// 配置中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());
// 配置会话
app.configure(express.session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true,
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 24 * 60 * 60 // 1 day
})
}));
// 配置视图引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
// 在开发环境中,启用热重载
if (app.get('env') === 'development') {
console.log('开发模式启动,启用热重载...');
app.use(require('connect-livereload')());
}
// 配置请求日志记录器
app.use(morgan('dev'));
// 添加健康检查路由
app.get('/api/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error('服务器错误:', err);
res.status(500).json({
success: false,
message: '服务器内部错误',
error: process.env.NODE_ENV === 'development' ? err.message : undefined
});
});
// 检查PHP是否可用
const volcPhpBridge = require('./bridge/volc-php-bridge');
// 启动时检查PHP环境
(async function() {
try {
const phpAvailable = await volcPhpBridge.checkPhpAvailability();
if (phpAvailable) {
console.log('✅ PHP环境检测通过,PHP桥接器可用');
} else {
console.error('⚠️ PHP环境不可用,火山引擎图像编辑功能可能无法正常工作');
console.error('请安装PHP环境后重启服务器');
}
} catch (error) {
console.error('PHP环境检测失败:', error.message);
}
})();
// AI图像编辑路由
const aiImageEditRouter = require('./routes/ai-image-edit');
app.use('/api/ai-image-edit', aiImageEditRouter);
// AI图片分析路由
const aiAnalyzerRouter = require('./routes/api/ai-analyzer');
app.use('/api/ai', aiAnalyzerRouter);
// 初始化数据库连接
const initApp = async () => {
try {
await connectDB();
console.log('数据库连接已初始化');
} catch (error) {
console.error('初始化数据库连接失败:', error);
}
};
// 服务启动时的检查
(async () => {
try {
console.log('服务器启动,执行初始化检查...');
// 检查Minio连接
const minioClient = require('./utils/minio-client').getMinioClient();
try {
await minioClient.bucketExists(process.env.MINIO_BUCKET_NAME);
console.log('已成功连接到MinIO对象存储');
} catch (err) {
console.error('MinIO连接失败:', err.message);
console.warn('图像存储功能可能不可用,请检查MinIO配置');
}
// 检查MongoDB连接
if (mongoose.connection.readyState === 1) {
console.log('已成功连接到MongoDB数据库');
} else {
console.error('MongoDB连接状态异常,当前状态:', mongoose.connection.readyState);
}
// 日志初始化检查完成的消息
console.log('服务器初始化检查完成');
console.log(`服务器运行在 ${process.env.NODE_ENV || 'development'} 模式下`);
console.log(`监听端口: ${app.get('port')}`);
console.log('------------------------------');
} catch (err) {
console.error('服务器初始化检查失败:', err);
}
})();
// 导出应用和初始化函数
module.exports = { app, initApp };