运行必须源码:app/(controller/model/service/middleware/lib/utils/validate/router)、config/、database/(migrations/seeders/sql)、启动脚本、app/public/templates 模板。 已忽略运行非必须:node_modules/、logs/、run/、app/public 运行时上传数据、.env*、构建/缓存产物。
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;
|