Files
competition-website/app/controller/news.js
WorkBuddy a303cf2d53 chore: 后端首次基线提交
运行必须源码:app/(controller/model/service/middleware/lib/utils/validate/router)、config/、database/(migrations/seeders/sql)、启动脚本、app/public/templates 模板。
已忽略运行非必须:node_modules/、logs/、run/、app/public 运行时上传数据、.env*、构建/缓存产物。
2026-08-17 12:25:42 +08:00

71 lines
1.8 KiB
JavaScript
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.
'use strict';
const Controller = require('egg').Controller;
/**
* 新闻控制器 - NewsController
*
* 负责新闻通知的查询和展示。
* 支持按 group 组别过滤、按 pinned 置顶过滤、分页查询。
*
* 主要接口:
* - GET /api/news : 获取新闻列表(支持 ?group= & ?pinned= & ?page= & ?pageSize= 参数)
* - GET /api/news/:id : 获取新闻详情
*/
class NewsController extends Controller {
/**
* 获取新闻列表
*
* Query 参数:
* - group: 组别筛选(如 zhongzhi/gaozhi/benke/jiaoshi),不传则返回全部
* - pinned: 是否仅返回置顶新闻(true/false),不传则返回全部
* - page: 页码,默认 1
* - pageSize: 每页数量,默认 20
*
* 排序规则:置顶优先(pinned DESC),然后按发布时间降序
*/
async index() {
const { ctx, service } = this;
const { group, pinned, page, pageSize } = ctx.query;
const result = await service.news.list({ group, pinned, page, pageSize });
ctx.body = ctx.helper.success(result, '获取新闻列表成功');
}
/**
* 获取新闻详情
*
* 通过 URL 参数 :id 获取单条新闻的完整信息。
*/
async show() {
const { ctx, service } = this;
const { id } = ctx.params;
const news = await service.news.findById(id);
if (!news) {
ctx.body = ctx.helper.error(4001, '新闻不存在');
return;
}
ctx.body = ctx.helper.success(news, '获取新闻详情成功');
}
/**
* 获取各分组新闻计数
* GET /api/news/counts
*
* 返回各分组可见新闻数量,用于首页 Tab 显示
*/
async counts() {
const { ctx, service } = this;
const result = await service.news.getGroupCounts();
ctx.body = ctx.helper.success(result, '获取分组计数成功');
}
}
module.exports = NewsController;