documentation.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * 文档管理路由 - 使用SQLite数据库
  3. */
  4. const express = require('express');
  5. const router = express.Router();
  6. const logger = require('../logger');
  7. const { requireLogin } = require('../middleware/auth');
  8. const documentationServiceDB = require('../services/documentationServiceDB');
  9. // 获取所有文档列表(管理员)
  10. router.get('/documents', requireLogin, async (req, res) => {
  11. try {
  12. const documents = await documentationServiceDB.getDocumentationList();
  13. res.json(documents);
  14. } catch (err) {
  15. logger.error('获取文档列表失败:', err);
  16. res.status(500).json({ error: '获取文档列表失败' });
  17. }
  18. });
  19. // 获取已发布文档列表(公开)
  20. router.get('/published', async (req, res) => {
  21. try {
  22. const documents = await documentationServiceDB.getPublishedDocuments();
  23. res.json(documents);
  24. } catch (err) {
  25. logger.error('获取已发布文档列表失败:', err);
  26. res.status(500).json({ error: '获取已发布文档列表失败' });
  27. }
  28. });
  29. // 获取单个文档
  30. router.get('/documents/:id', async (req, res) => {
  31. try {
  32. const { id } = req.params;
  33. const document = await documentationServiceDB.getDocument(id);
  34. if (!document) {
  35. return res.status(404).json({ error: '文档不存在' });
  36. }
  37. // 如果文档未发布,需要登录权限
  38. if (!document.published && !req.session.user) {
  39. return res.status(403).json({ error: '没有权限访问该文档' });
  40. }
  41. res.json(document);
  42. } catch (err) {
  43. logger.error('获取文档失败:', err);
  44. res.status(500).json({ error: '获取文档失败' });
  45. }
  46. });
  47. // 保存文档
  48. router.put('/documents/:id', requireLogin, async (req, res) => {
  49. try {
  50. const { id } = req.params;
  51. const { title, content, published } = req.body;
  52. if (!title || !content) {
  53. return res.status(400).json({ error: '标题和内容为必填项' });
  54. }
  55. const document = await documentationServiceDB.saveDocument(id, title, content, published);
  56. res.json(document);
  57. } catch (err) {
  58. logger.error('保存文档失败:', err);
  59. res.status(500).json({ error: '保存文档失败' });
  60. }
  61. });
  62. // 创建新文档
  63. router.post('/documents', requireLogin, async (req, res) => {
  64. try {
  65. const { title, content, published } = req.body;
  66. if (!title || !content) {
  67. return res.status(400).json({ error: '标题和内容为必填项' });
  68. }
  69. const id = Date.now().toString();
  70. const document = await documentationServiceDB.saveDocument(id, title, content, published);
  71. res.status(201).json(document);
  72. } catch (err) {
  73. logger.error('创建文档失败:', err);
  74. res.status(500).json({ error: '创建文档失败' });
  75. }
  76. });
  77. // 删除文档
  78. router.delete('/documents/:id', requireLogin, async (req, res) => {
  79. try {
  80. const { id } = req.params;
  81. const success = await documentationServiceDB.deleteDocument(id);
  82. if (!success) {
  83. return res.status(404).json({ error: '文档不存在' });
  84. }
  85. res.json({ success: true, message: '文档已删除' });
  86. } catch (err) {
  87. logger.error('删除文档失败:', err);
  88. res.status(500).json({ error: '删除文档失败' });
  89. }
  90. });
  91. // 切换文档发布状态
  92. router.put('/toggle-publish/:id', requireLogin, async (req, res) => {
  93. try {
  94. const { id } = req.params;
  95. const document = await documentationServiceDB.toggleDocumentPublish(id);
  96. res.json(document);
  97. } catch (err) {
  98. logger.error('切换文档发布状态失败:', err);
  99. res.status(500).json({ error: '切换文档发布状态失败' });
  100. }
  101. });
  102. module.exports = router;