71 lines
1.8 KiB
JavaScript
71 lines
1.8 KiB
JavaScript
|
|
'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;
|