Files
competition-website/app/controller/news.js

71 lines
1.8 KiB
JavaScript
Raw Normal View History

'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;