Browse Source

feat(article): 新增投稿文章管理功能

- 添加 CreationArticle 模型并定义与 ArticleCategory 的关联关系
- 创建 CreationArticleController 控制器实现增删改查接口
- 实现 CreationArticleService 服务层处理业务逻辑
- 添加 CreationArticleValidate 验证器确保数据合法性
- 在路由配置中注册文章管理相关接口地址
- 支持文章列表筛选、详情查看及软删除操作
- 使用事务保证数据一致性,增强异常处理机制
master
zhangf@suq.cn 7 days ago
parent
commit
ceaa8c205c
  1. 64
      app/controller/CreationArticleController.php
  2. 4
      app/model/CreationArticle.php
  3. 17
      app/route/route.php
  4. 131
      app/service/CreationArticleService.php
  5. 25
      app/validate/CreationArticleValidate.php

64
app/controller/CreationArticleController.php

@ -0,0 +1,64 @@
<?php
namespace app\controller;
use app\service\CreationArticleService;
use app\validate\CreationArticleValidate;
use plugin\piadmin\app\utils\ArrayUtils;
use support\Response;
class CreationArticleController
{
public function save(CreationArticleService $service): Response
{
$params = requestOnly([
'title' => '',
'article_category_id' => '',
'cover' => '',
'content' => '',
'status' => '',
]);
validate(CreationArticleValidate::class)->check($params, 'save');
return success($service->saveData($params));
}
public function update(CreationArticleService $service): Response
{
$params = requestOnly([
'id' => '',
'title' => '',
'article_category_id' => '',
'cover' => '',
'content' => '',
'status' => '',
]);
validate(CreationArticleValidate::class)->check($params, 'update');
return success($service->updateData(ArrayUtils::filterNotEmpty($params)));
}
public function index(CreationArticleService $service): Response
{
$params = requestOnly([
'article_category' => '',
'task' => '',
'title' => '',
'status' => '',
'begin_time' => '',
'end_time' => ''
]);
return success($service->listData($params));
}
public function read(CreationArticleService $service): Response
{
$id = input('id');
return success($service->readData($id));
}
public function delete(CreationArticleService $service): Response
{
$ids = input('ids');
return success($service->deleteData($ids));
}
}

4
app/model/CreationArticle.php

@ -30,4 +30,8 @@ class CreationArticle extends BaseModel
*/
public $timestamps = true;
public function category()
{
return $this->belongsTo(ArticleCategory::class, 'article_category_id', 'id');
}
}

17
app/route/route.php

@ -2,6 +2,7 @@
use app\controller\AiCommandController;
use app\controller\ArticleCategoryController;
use app\controller\CreationArticleController;
use app\controller\CreationTaskController;
use app\controller\DistillationQuestionsController;
use app\controller\EnterprisePortraitCategoryController;
@ -111,7 +112,7 @@ Route::group('/service/v1', function () {
Route::post('/delete', [CreationTaskController::class, 'delete'])->setParams(['perm' => ['creationTaskDelete']]);
});
//文章发呢
//文章
Route::group('/articleCategory', function () {
//新增
Route::post('/save', [ArticleCategoryController::class, 'save'])->setParams(['perm' => ['articleCategorySave']]);
@ -124,6 +125,20 @@ Route::group('/service/v1', function () {
//删除
Route::post('/delete', [ArticleCategoryController::class, 'delete'])->setParams(['perm' => ['articleCategoryDelete']]);
});
//投稿文章管理
Route::group('/article', function () {
//新增
Route::post('/save', [CreationArticleController::class, 'save'])->setParams(['perm' => ['articleSave']]);
//修改
Route::post('/update', [CreationArticleController::class, 'update'])->setParams(['perm' => ['articleUpdate']]);
//列表
Route::get('/index', [CreationArticleController::class, 'index'])->setParams(['perm' => ['articleIndex']]);
//详情
Route::get('/read', [CreationArticleController::class, 'read'])->setParams(['perm' => ['articleRead']]);
//删除
Route::post('/delete', [CreationArticleController::class, 'delete'])->setParams(['perm' => ['articleDelete']]);
});
});
})->middleware([
AdminAuthorizationMiddleware::class,

131
app/service/CreationArticleService.php

@ -0,0 +1,131 @@
<?php
namespace app\service;
use app\dao\ArticleCategoryDao;
use app\dao\CreationArticleDao;
use app\dao\CreationTaskDao;
use plugin\piadmin\app\base\BaseService;
use plugin\piadmin\app\exception\ApiException;
use support\think\Db;
class CreationArticleService extends BaseService
{
protected $dao;
protected $articleCategoryDao;
protected $taskDao;
public function __construct(CreationArticleDao $dao)
{
$this->dao = $dao;
$this->articleCategoryDao = app()->make(ArticleCategoryDao::class);
$this->taskDao = app()->make(CreationTaskDao::class);
}
/**
* 保存信息
* @param array $params
* @return array
*/
public function saveData(array $params): array
{
Db::startTrans();
try {
$data = $this->dao->save($params);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $data->toArray();
}
/**
* 修改信息
* @param array $params
* @return array
*/
public function updateData(array $params): array
{
// 落库
Db::startTrans();
try {
$this->dao->update(['id' => $params['id']], $params);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $params;
}
/**
* 获取列表
* @param array $params
* @return array
*/
public function listData(array $params): array
{
$query = [
'delete_time' => 0
];
if (isNotBlank($params['article_category'])) {
$cids = $this->articleCategoryDao->getColumn([['name', 'like', '%' . $params['article_category'] . '%']], 'id');
$query[] = ['article_category_id', 'in', $cids];
}
if (isNotBlank($params['task'])) {
$tids = $this->taskDao->getColumn([['name', 'like', '%' . $params['task'] . '%']], 'id');
$query[] = ['task_id', 'in', $tids];
}
if (isNotBlank($params['title'])) {
$query[] = ['title', 'like', '%' . $params['title'] . '%'];
}
if (isNotBlank($params['status'])) {
$query[] = ['status', '=', $params['status']];
}
if (isNotBlank($params['begin_time'])) {
$query[] = ['create_time', '>=', strtotime($params['begin_time'])];
}
if (isNotBlank($params['end_time'])) {
$query[] = ['create_time', '<=', strtotime($params['end_time'] . ' 23:59:59')];
}
$list = $this->dao->getList($query, 'id,title,status,create_time,article_category_id', 0, 0, 'id DESC', ['category']);
$count = $this->dao->getCount($query);
return compact('list', 'count');
}
/**
* 获取信息
* @param mixed $id
* @return array
*/
public function readData(mixed $id): array
{
$aiCommand = $this->dao->get(['id' => $id]);
if (empty($aiCommand)) {
throw new ApiException('数据不存在');
}
return $aiCommand->toArray();
}
/**
* 删除信息
* @param mixed $id
* @return array
*/
public function deleteData(array $ids): array
{
// 落库
Db::startTrans();
try {
$this->dao->update([['id', 'in', $ids]], ['delete_time' => time()]);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return ['id' => $ids];
}
}

25
app/validate/CreationArticleValidate.php

@ -0,0 +1,25 @@
<?php
namespace app\validate;
use plugin\piadmin\app\base\BaseValidate;
class CreationArticleValidate extends BaseValidate
{
protected $group = [
'save' => [
'title' => 'require',
'content' => 'require'
],
'update' => [
'id' => 'require',
'title' => 'require',
'content' => 'require'
],
];
protected $message = [
'id.require' => 'ID不能为空',
'title' => '标题不能为空',
'content' => '内容不能为空'
];
}
Loading…
Cancel
Save