111 lines
3.3 KiB
JavaScript
111 lines
3.3 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const StoryModel = require('../models/story');
|
|
|
|
// 获取故事列表
|
|
router.get('/', async (req, res) => {
|
|
try {
|
|
const { category, featured, limit, offset } = req.query;
|
|
const stories = await StoryModel.getList({
|
|
category,
|
|
featured: featured === 'true',
|
|
limit: parseInt(limit) || 20,
|
|
offset: parseInt(offset) || 0
|
|
});
|
|
res.json({ code: 0, data: stories });
|
|
} catch (err) {
|
|
console.error('获取故事列表失败:', err);
|
|
res.status(500).json({ code: 500, message: '获取故事列表失败' });
|
|
}
|
|
});
|
|
|
|
// 获取热门故事
|
|
router.get('/hot', async (req, res) => {
|
|
try {
|
|
const { limit } = req.query;
|
|
const stories = await StoryModel.getHotStories(parseInt(limit) || 10);
|
|
res.json({ code: 0, data: stories });
|
|
} catch (err) {
|
|
console.error('获取热门故事失败:', err);
|
|
res.status(500).json({ code: 500, message: '获取热门故事失败' });
|
|
}
|
|
});
|
|
|
|
// 获取分类列表
|
|
router.get('/categories', async (req, res) => {
|
|
try {
|
|
const categories = await StoryModel.getCategories();
|
|
res.json({ code: 0, data: categories });
|
|
} catch (err) {
|
|
console.error('获取分类列表失败:', err);
|
|
res.status(500).json({ code: 500, message: '获取分类列表失败' });
|
|
}
|
|
});
|
|
|
|
// 获取故事详情
|
|
router.get('/:id', async (req, res) => {
|
|
try {
|
|
const storyId = parseInt(req.params.id);
|
|
const story = await StoryModel.getDetail(storyId);
|
|
if (!story) {
|
|
return res.status(404).json({ code: 404, message: '故事不存在' });
|
|
}
|
|
res.json({ code: 0, data: story });
|
|
} catch (err) {
|
|
console.error('获取故事详情失败:', err);
|
|
res.status(500).json({ code: 500, message: '获取故事详情失败' });
|
|
}
|
|
});
|
|
|
|
// 记录游玩
|
|
router.post('/:id/play', async (req, res) => {
|
|
try {
|
|
const storyId = parseInt(req.params.id);
|
|
await StoryModel.incrementPlayCount(storyId);
|
|
res.json({ code: 0, message: '记录成功' });
|
|
} catch (err) {
|
|
console.error('记录游玩失败:', err);
|
|
res.status(500).json({ code: 500, message: '记录游玩失败' });
|
|
}
|
|
});
|
|
|
|
// 点赞
|
|
router.post('/:id/like', async (req, res) => {
|
|
try {
|
|
const storyId = parseInt(req.params.id);
|
|
const { like } = req.body; // true: 点赞, false: 取消点赞
|
|
await StoryModel.toggleLike(storyId, like);
|
|
res.json({ code: 0, message: like ? '点赞成功' : '取消点赞成功' });
|
|
} catch (err) {
|
|
console.error('点赞操作失败:', err);
|
|
res.status(500).json({ code: 500, message: '点赞操作失败' });
|
|
}
|
|
});
|
|
|
|
// AI改写结局
|
|
router.post('/:id/rewrite', async (req, res) => {
|
|
try {
|
|
const storyId = parseInt(req.params.id);
|
|
const { ending_name, ending_content, prompt } = req.body;
|
|
|
|
if (!prompt) {
|
|
return res.status(400).json({ code: 400, message: '请输入改写指令' });
|
|
}
|
|
|
|
// 调用AI服务生成新内容
|
|
const result = await StoryModel.aiRewriteEnding({
|
|
storyId,
|
|
endingName: ending_name,
|
|
endingContent: ending_content,
|
|
prompt
|
|
});
|
|
|
|
res.json({ code: 0, data: result });
|
|
} catch (err) {
|
|
console.error('AI改写失败:', err);
|
|
res.status(500).json({ code: 500, message: 'AI改写失败' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|