更新上传接口和文章接口

This commit is contained in:
李志强 2025-12-27 16:19:05 +08:00
parent 99d4fc303a
commit 9e49288dbb
7 changed files with 590 additions and 20 deletions

View File

@ -358,9 +358,9 @@ class ArticlesController extends BaseController
['delete_time', '=', null], ['delete_time', '=', null],
['status', '=', 2] ['status', '=', 2]
]) ])
->field('id,title,image') ->field('id,title,image')
->order('id', 'desc') ->order('id', 'desc')
->find(); ->find();
// 查询下一篇同分类ID更大的按ID正序取第一个 // 查询下一篇同分类ID更大的按ID正序取第一个
$nextArticle = Articles::where([ $nextArticle = Articles::where([
@ -369,9 +369,9 @@ class ArticlesController extends BaseController
['delete_time', '=', null], ['delete_time', '=', null],
['status', '=', 2] ['status', '=', 2]
]) ])
->field('id,title,image') ->field('id,title,image')
->order('id', 'asc') ->order('id', 'asc')
->find(); ->find();
// 查询相关文章同分类排除当前文章按发布时间倒序取5个 // 查询相关文章同分类排除当前文章按发布时间倒序取5个
$relatedArticles = Articles::where([ $relatedArticles = Articles::where([
@ -380,12 +380,12 @@ class ArticlesController extends BaseController
['a.delete_time', '=', null], ['a.delete_time', '=', null],
['a.status', '=', 2] ['a.status', '=', 2]
]) ])
->field('a.id,a.title,IF(a.image IS NULL OR a.image = \'\', ac.image, a.image) as image,a.views,a.likes,a.publishdate') ->field('a.id,a.title,IF(a.image IS NULL OR a.image = \'\', ac.image, a.image) as image,a.views,a.likes,a.publishdate')
->alias('a') ->alias('a')
->join('articles_category ac', 'a.cate = ac.id', 'LEFT') ->join('articles_category ac', 'a.cate = ac.id', 'LEFT')
->order('publishdate', 'desc') ->order('publishdate', 'desc')
->limit(5) ->limit(5)
->select(); ->select();
// 查询当前作者的文章发布数量 // 查询当前作者的文章发布数量
$articleCount = Articles::where([ $articleCount = Articles::where([
@ -855,9 +855,7 @@ class ArticlesController extends BaseController
]); ]);
} }
/** //更新文章访问次数
* 更新文章访问次数
*/
public function updateViews() public function updateViews()
{ {
if (!Request::isPost()) { if (!Request::isPost()) {
@ -940,4 +938,464 @@ class ArticlesController extends BaseController
return json(['code' => 0, 'msg' => '获取作者信息失败:' . $e->getMessage()]); return json(['code' => 0, 'msg' => '获取作者信息失败:' . $e->getMessage()]);
} }
} }
//获取用户文章列表
public function getUserArticleList()
{
try {
// 获取前端传递的用户ID
$userId = input('uid/d', 0);
// 验证用户ID
if ($userId <= 0) {
return json([
'code' => 1,
'msg' => '用户ID参数错误'
]);
}
// 根据用户ID获取用户名
$user = Users::where('uid', $userId)->field('uid, name')->find();
if (!$user) {
return json([
'code' => 1,
'msg' => '用户不存在'
]);
}
// 获取用户文章的分类ID列表用于批量查询分类信息
$cateIds = Articles::where([
['publisher', '=', $user['uid']],
['delete_time', '=', null],
['status', '=', 2] // 已发布的文章
])->column('cate');
// 批量查询分类信息避免N+1查询问题
$categories = [];
if (!empty($cateIds)) {
$categories = ArticlesCategory::where('id', 'in', array_unique($cateIds))
->column('id,name,image', 'id');
}
// 查询用户的文章列表
$articles = Articles::where([
['publisher', '=', $user['uid']],
['delete_time', '=', null],
['status', '=', 2] // 已发布的文章
])
->field('id, title, cate, image, author, publisher, publishdate, views, likes, update_time')
->order('publishdate', 'desc')
->select();
// 处理文章数据
$articleList = [];
if ($articles) {
foreach ($articles as $article) {
$articleData = $article->toArray();
// 格式化时间
$articleData['publishdate'] = date('Y-m-d H:i:s', strtotime($articleData['publishdate']));
// 从预加载的分类数据中获取信息
$cateId = $articleData['cate'];
if (isset($categories[$cateId])) {
$category = $categories[$cateId];
// 如果文章图片为空,使用分类图片
if (empty($articleData['image'])) {
$articleData['image'] = !empty($category['image']) ? $category['image'] : '/static/images/default.jpg';
}
// 设置分类名称
$articleData['category_name'] = $category['name'];
} else {
// 如果没有找到分类信息
if (empty($articleData['image'])) {
$articleData['image'] = '/static/images/default.jpg';
}
$articleData['category_name'] = '未分类';
}
$articleList[] = $articleData;
}
}
return json([
'code' => 0,
'msg' => '获取成功',
'data' => [
'articles' => $articleList,
'total' => count($articleList)
]
]);
} catch (\Exception $e) {
return json([
'code' => 1,
'msg' => '获取失败:' . $e->getMessage()
]);
}
}
//获取文章分类
public function getArticleCategory()
{
try {
// 获取所有顶级分类cid=0
$topCategories = ArticlesCategory::where('cid', 0)
->where('delete_time', null)
->where('status', 1)
->field('id, cid, name, image, sort')
->order('sort', 'asc')
->select()
->toArray();
$categories = [];
// 为每个顶级分类获取其子分类
foreach ($topCategories as $topCategory) {
$category = [
'id' => $topCategory['id'],
'name' => $topCategory['name'],
'image' => $topCategory['image'],
'sort' => $topCategory['sort'],
'children' => []
];
// 获取子分类
$children = ArticlesCategory::where('cid', $topCategory['id'])
->where('delete_time', null)
->where('status', 1)
->field('id, cid, name, image, sort')
->order('sort', 'asc')
->select()
->toArray();
// 为每个子分类获取文章数量
foreach ($children as &$child) {
$child['article_count'] = Articles::where('cate', $child['id'])
->where('delete_time', null)
->where('status', 2)
->count();
}
$category['children'] = $children;
$categories[] = $category;
}
return json([
'code' => 0,
'msg' => '获取文章分类成功',
'data' => $categories
]);
} catch (\Exception $e) {
return json([
'code' => 1,
'msg' => '获取文章分类失败:' . $e->getMessage()
]);
}
}
//发布文章
public function publishArticle()
{
try {
// 获取前端传递的数据
$data = [];
// 标题(必需)
$title = input('title', '');
if (empty($title)) {
return json([
'code' => 1,
'msg' => '文章标题不能为空'
]);
}
$data['title'] = $title;
// 分类ID必需
$cate = input('cate/d', 0);
if ($cate <= 0) {
return json([
'code' => 1,
'msg' => '请选择文章分类'
]);
}
//发布者
$publisher = input('user_id', '');
$data['publisher'] = $publisher;
// 验证分类是否存在
$category = ArticlesCategory::where('id', $cate)
->where('delete_time', null)
->where('status', 1)
->find();
if (!$category) {
return json([
'code' => 1,
'msg' => '选择的分类不存在'
]);
}
$data['cate'] = $cate;
// 内容(必需)
$content = input('content', '');
if (empty($content)) {
return json([
'code' => 1,
'msg' => '文章内容不能为空'
]);
}
$data['content'] = $content;
// 作者(必需)
$author = input('author', '');
if (empty($author)) {
return json([
'code' => 1,
'msg' => '作者不能为空'
]);
}
$data['author'] = $author;
// 图片(可选)
$image = input('image', '');
if (!empty($image)) {
$data['image'] = $image;
}
// 描述(可选)
$desc = input('desc', '');
if (!empty($desc)) {
$data['desc'] = $desc;
}
// 发布者(可选)
$publisher = input('publisher', '');
if (!empty($publisher)) {
$data['publisher'] = $publisher;
}
// 状态默认为2-已发布)
$status = input('status/d', 1);
if ($status >= 0 && $status <= 2) {
$data['status'] = $status;
} else {
$data['status'] = 2; // 默认已发布
}
// 发布日期(默认为当前时间)
$publishdate = input('publishdate', '');
if (!empty($publishdate)) {
// 验证日期格式
if (!strtotime($publishdate)) {
return json([
'code' => 1,
'msg' => '发布日期格式错误'
]);
}
$data['publishdate'] = $publishdate;
} else {
$data['publishdate'] = date('Y-m-d H:i:s');
}
// 是否翻译(可选)
$is_trans = input('is_trans/d', 0);
$data['is_trans'] = $is_trans ? 1 : 0;
// 翻译链接(可选)
$transurl = input('transurl', '');
if (!empty($transurl)) {
$data['transurl'] = $transurl;
}
// 推送状态(可选)
$push = input('push/d', 0);
$data['push'] = $push ? 1 : 0;
// 浏览量和点赞数默认为0
$data['views'] = 0;
$data['likes'] = 0;
// 创建时间和更新时间
$data['create_time'] = date('Y-m-d H:i:s');
// 执行插入
$result = Articles::insert($data);
if (!$result) {
return json([
'code' => 1,
'msg' => '发布失败'
]);
}
// 获取新插入的文章ID
$articleId = Articles::getLastInsID();
return json([
'code' => 0,
'msg' => '文章发布成功',
'data' => [
'article_id' => $articleId
]
]);
} catch (\Exception $e) {
return json([
'code' => 1,
'msg' => '发布失败:' . $e->getMessage()
]);
}
}
//编辑文章
public function updateArticle()
{
try {
// 获取文章ID
$id = input('id/d', 0);
// 验证ID
if ($id <= 0) {
return json([
'code' => 1,
'msg' => '文章ID参数错误'
]);
}
// 检查文章是否存在
$article = Articles::where('id', $id)
->where('delete_time', null)
->find();
if (!$article) {
return json([
'code' => 1,
'msg' => '文章不存在'
]);
}
// 获取要更新的数据
$data = [];
// 标题
$title = input('title', '');
if (!empty($title)) {
$data['title'] = $title;
}
// 分类ID
$cate = input('cate/d', 0);
if ($cate > 0) {
// 验证分类是否存在
$category = ArticlesCategory::where('id', $cate)
->where('delete_time', null)
->where('status', 1)
->find();
if (!$category) {
return json([
'code' => 1,
'msg' => '选择的分类不存在'
]);
}
$data['cate'] = $cate;
}
// 图片
$image = input('image', '');
if ($image !== '') {
$data['image'] = $image;
}
// 描述
$desc = input('desc', '');
if ($desc !== '') {
$data['desc'] = $desc;
}
// 内容
$content = input('content', '');
if ($content !== '') {
$data['content'] = $content;
}
// 作者
$author = input('author', '');
if (!empty($author)) {
$data['author'] = $author;
}
// 状态
$status = input('status/d', -1);
if ($status >= 0 && $status <= 2) {
$data['status'] = $status;
}
// 发布日期
$publishdate = input('publishdate', '');
if (!empty($publishdate)) {
// 验证日期格式
if (!strtotime($publishdate)) {
return json([
'code' => 1,
'msg' => '发布日期格式错误'
]);
}
$data['publishdate'] = $publishdate;
}
// 是否翻译
$is_trans = input('is_trans/d', -1);
if ($is_trans >= 0 && $is_trans <= 1) {
$data['is_trans'] = $is_trans;
}
// 翻译链接
$transurl = input('transurl', '');
if ($transurl !== '') {
$data['transurl'] = $transurl;
}
// 推送状态
$push = input('push/d', -1);
if ($push >= 0 && $push <= 1) {
$data['push'] = $push;
}
// 如果没有任何要更新的数据
if (empty($data)) {
return json([
'code' => 1,
'msg' => '没有要更新的内容'
]);
}
// 添加更新时间
$data['update_time'] = date('Y-m-d H:i:s');
// 执行更新
$result = Articles::where('id', $id)->update($data);
if ($result === false) {
return json([
'code' => 1,
'msg' => '更新失败'
]);
}
return json([
'code' => 0,
'msg' => '文章更新成功'
]);
} catch (\Exception $e) {
return json([
'code' => 1,
'msg' => '更新失败:' . $e->getMessage()
]);
}
}
} }

View File

@ -425,19 +425,18 @@ class IndexController extends BaseController
public function update_imgs() public function update_imgs()
{ {
// 获取上传的文件 // 获取上传的文件
$file = request()->file();
$files = request()->file('file'); $files = request()->file('file');
// 检查是否有文件上传 // 检查是否有文件上传
if (empty($file)) { if (empty($files)) {
return json(['code' => 1, 'msg' => '没有文件上传']); return json(['code' => 1, 'msg' => '没有文件上传']);
} }
try { try {
// 验证上传的文件 // 验证上传的文件
validate([ validate([
'image' => 'filesize:51200|fileExt:jpg,png,gif,jpeg,webp' 'file' => 'filesize:512000|fileExt:jpg,png,gif,jpeg,webp'
])->check($file); ])->check(['file' => $files]);
// 存储文件到public磁盘的uploads目录 // 存储文件到public磁盘的uploads目录
$info = Filesystem::disk('public')->putFile('uploads', $files); $info = Filesystem::disk('public')->putFile('uploads', $files);

View File

@ -429,4 +429,102 @@ class ResourcesController extends BaseController
return json(['code' => 0, 'msg' => '更新失败:' . $e->getMessage()]); return json(['code' => 0, 'msg' => '更新失败:' . $e->getMessage()]);
} }
} }
//获取用户资源列表
public function getUserResourceList()
{
try {
// 获取前端传递的用户ID
$userId = input('uid/d', 0);
// 验证用户ID
if ($userId <= 0) {
return json([
'code' => 1,
'msg' => '用户ID参数错误'
]);
}
// 根据用户ID获取用户名
$user = Users::where('uid', $userId)->field('uid, name')->find();
if (!$user) {
return json([
'code' => 1,
'msg' => '用户不存在'
]);
}
// 获取用户资源的分类ID列表用于批量查询分类信息
$cateIds = Resources::where([
['uploader', '=', $user['name']],
['delete_time', '=', null],
['status', '=', 1] // 已发布的资源
])->column('cate');
// 批量查询分类信息避免N+1查询问题
$categories = [];
if (!empty($cateIds)) {
$categories = ResourcesCategory::where('id', 'in', array_unique($cateIds))
->column('id,name,icon', 'id');
}
// 查询用户的资源列表
$resources = Resources::where([
['uploader', '=', $user['name']],
['delete_time', '=', null],
['status', '=', 1] // 已发布的资源
])
->field('id, title, cate, icon, uploader, create_time, views, downloads, price')
->order('create_time', 'desc')
->select();
// 处理资源数据
$resourceList = [];
if ($resources) {
foreach ($resources as $resource) {
$resourceData = $resource->toArray();
// 格式化时间
$resourceData['create_time'] = date('Y-m-d H:i:s', strtotime($resourceData['create_time']));
// 从预加载的分类数据中获取信息
$cateId = $resourceData['cate'];
if (isset($categories[$cateId])) {
$category = $categories[$cateId];
// 如果资源图片为空,使用分类图片
if (empty($resourceData['icon'])) {
$resourceData['icon'] = !empty($category['icon']) ? $category['icon'] : '/static/images/default.jpg';
}
// 设置分类名称
$resourceData['category_name'] = $category['name'];
} else {
// 如果没有找到分类信息
if (empty($resourceData['icon'])) {
$resourceData['icon'] = '/static/images/default.jpg';
}
$resourceData['category_name'] = '未分类';
}
$resourceList[] = $resourceData;
}
}
return json([
'code' => 0,
'msg' => '获取成功',
'data' => [
'resources' => $resourceList,
'total' => count($resourceList)
]
]);
} catch (\Exception $e) {
return json([
'code' => 1,
'msg' => '获取失败:' . $e->getMessage()
]);
}
}
} }

View File

@ -86,7 +86,7 @@ class UserController extends BaseController
'code' => 0, 'code' => 0,
'msg' => '登录成功', 'msg' => '登录成功',
'data' => [ 'data' => [
'user_id' => $user->id, 'uid' => $user->uid,
'user_name' => $user->name, 'user_name' => $user->name,
'user_account' => $user->account, 'user_account' => $user->account,
'user_avatar' => $user->avatar ?? '/static/images/avatar.png', 'user_avatar' => $user->avatar ?? '/static/images/avatar.png',

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

View File

@ -50,4 +50,19 @@ Route::group('api', function () {
// 搜索接口 // 搜索接口
Route::get('search', 'index/Search/apiSearch'); Route::get('search', 'index/Search/apiSearch');
// 用户文章列表接口
Route::get('user/articles', 'index/Articles/getUserArticleList');
// 用户资源列表接口
Route::get('user/resources', 'index/Resources/getUserResourceList');
// 文章分类接口
Route::get('articles/categories', 'index/Articles/getArticleCategory');
// 编辑文章接口
Route::post('articles/update', 'index/Articles/updateArticle');
// 发布文章接口
Route::post('articles/publish', 'index/Articles/publishArticle');
})->middleware(\app\middleware\Cors::class); })->middleware(\app\middleware\Cors::class);