调整文章模块

This commit is contained in:
Anyon 2020-11-24 15:34:49 +08:00
parent 504f4b3f03
commit 6fc60bd054
7 changed files with 771 additions and 1166 deletions

View File

@ -4,6 +4,7 @@ namespace app\data\controller;
use app\data\service\NewsService; use app\data\service\NewsService;
use think\admin\Controller; use think\admin\Controller;
use think\admin\extend\CodeExtend;
/** /**
* 文章内容管理 * 文章内容管理
@ -92,6 +93,9 @@ class NewsItem extends Controller
*/ */
protected function _form_filter(array &$data) protected function _form_filter(array &$data)
{ {
if (empty($data['code'])) {
$data['code'] = CodeExtend::uniqidDate(15, 'A');
}
if ($this->request->isGet()) { if ($this->request->isGet()) {
$query = $this->app->db->name('DataNewsMark')->where(['deleted' => 0, 'status' => 1]); $query = $this->app->db->name('DataNewsMark')->where(['deleted' => 0, 'status' => 1]);
$this->mark = $query->order('sort desc,id desc')->select()->toArray(); $this->mark = $query->order('sort desc,id desc')->select()->toArray();

View File

@ -33,17 +33,17 @@ class News extends Controller
*/ */
public function getItem() public function getItem()
{ {
if (($id = intval(input('id', 0))) > 0) { if ($code = input('code', '')) {
$this->app->db->name('DataNewsItem')->where(['id' => $id])->update([ $this->app->db->name('DataNewsItem')->where(['code' => $code])->update([
'num_read' => $this->app->db->raw('`num_read`+1'), 'num_read' => $this->app->db->raw('`num_read`+1'),
]); ]);
if (input('mid', 0) > 0) { if (($mid = input('mid', 0)) > 0) {
$history = ['mid' => input('mid'), 'cid' => $id]; $data = ['mid' => $mid, 'code' => $code, 'type' => 3];
$this->app->db->name('DataNewsXHistory')->where($history)->delete(); $this->app->db->name('DataNewsXCollect')->where($data)->delete();
$this->app->db->name('DataNewsXHistory')->insert($history); $this->app->db->name('DataNewsXCollect')->insert($data);
} }
} }
$query = $this->_query('DataNewsItem')->like('name,mark')->equal('id'); $query = $this->_query('DataNewsItem')->like('name,mark')->equal('id,code');
$query->where(['deleted' => 0, 'status' => 1])->withoutField('sort,status,deleted'); $query->where(['deleted' => 0, 'status' => 1])->withoutField('sort,status,deleted');
$result = $query->order('sort desc,id desc')->page(true, false, false, 15); $result = $query->order('sort desc,id desc')->page(true, false, false, 15);
NewsService::instance()->buildListState($result['list'], input('mid', 0)); NewsService::instance()->buildListState($result['list'], input('mid', 0));
@ -58,10 +58,10 @@ class News extends Controller
*/ */
public function getComment() public function getComment()
{ {
$map = $this->_vali(['cid.require' => '文章不能为空!']); $map = $this->_vali(['code.require' => '文章不能为空!']);
$query = $this->_query('DataNewsXComment')->where($map); $query = $this->_query('DataNewsXComment')->where($map);
$result = $query->order('id desc')->page(false, false, false, 5); $result = $query->order('id desc')->page(false, false, false, 5);
NewsService::instance()->buildListByCidAndMid($result['list']); NewsService::instance()->buildListByMinAndCode($result['list']);
$this->success('获取文章评论成功!', $result); $this->success('获取文章评论成功!', $result);
} }

View File

@ -20,11 +20,11 @@ class News extends Auth
{ {
$data = $this->_vali([ $data = $this->_vali([
'mid.value' => $this->mid, 'mid.value' => $this->mid,
'cid.require' => '文章不能为空!', 'code.require' => '文章不能为空!',
'content.require' => '内容不能为空!', 'content.require' => '内容不能为空!',
]); ]);
if ($this->app->db->name('DataNewsXComment')->insert($data) !== false) { if ($this->app->db->name('DataNewsXComment')->insert($data) !== false) {
NewsService::instance()->syncNewsTotal($data['cid']); NewsService::instance()->syncNewsTotal($data['code']);
$this->success('添加评论成功!'); $this->success('添加评论成功!');
} else { } else {
$this->error('添加评论失败!'); $this->error('添加评论失败!');
@ -39,10 +39,10 @@ class News extends Auth
*/ */
public function getComment() public function getComment()
{ {
$map = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '文章不能为空!']); $map = $this->_vali(['mid.value' => $this->mid, 'code.require' => '文章不能为空!']);
$result = $this->_query('DataNewsXComment')->where($map)->order('id desc')->page(true, false); $result = $this->_query('DataNewsXComment')->where($map)->order('id desc')->page(true, false);
if (count($result['list']) > 0) { if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result); NewsService::instance()->buildListByMinAndCode($result);
} }
$this->success('获取评论列表成功', $result); $this->success('获取评论列表成功', $result);
} }
@ -54,9 +54,9 @@ class News extends Auth
public function delComment() public function delComment()
{ {
$map = $this->_vali([ $map = $this->_vali([
'mid.value' => $this->mid, 'mid.value' => $this->mid,
'cid.require' => '文章ID不能为空', 'id.require' => '评论ID不能为空',
'id.require' => '评论ID不能为空!', 'code.require' => '文章CODE不能为空!',
]); ]);
if ($this->app->db->name('DataNewsXComment')->where($map)->delete() !== false) { if ($this->app->db->name('DataNewsXComment')->where($map)->delete() !== false) {
$this->success('评论删除成功!'); $this->success('评论删除成功!');
@ -76,7 +76,7 @@ class News extends Auth
$this->success('您已收藏!'); $this->success('您已收藏!');
} }
if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) { if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) {
NewsService::instance()->syncNewsTotal($map['cid']); NewsService::instance()->syncNewsTotal($map['code']);
$this->success('收藏成功!'); $this->success('收藏成功!');
} else { } else {
$this->error('收藏失败!'); $this->error('收藏失败!');
@ -91,7 +91,7 @@ class News extends Auth
{ {
$map = $this->_getCollectWhere(1); $map = $this->_getCollectWhere(1);
if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) { if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) {
NewsService::instance()->syncNewsTotal($map['cid']); NewsService::instance()->syncNewsTotal($map['code']);
$this->success('取消收藏成功!'); $this->success('取消收藏成功!');
} else { } else {
$this->error('取消收藏失败!'); $this->error('取消收藏失败!');
@ -108,7 +108,7 @@ class News extends Auth
$query = $this->_query('DataNewsXCollect')->where($map); $query = $this->_query('DataNewsXCollect')->where($map);
$result = $query->order('id desc')->page(true, false, false, 15); $result = $query->order('id desc')->page(true, false, false, 15);
if (count($result['list']) > 0) { if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']); NewsService::instance()->buildListByMinAndCode($result['list']);
} }
$this->success('获取收藏记录成功!', $result); $this->success('获取收藏记录成功!', $result);
} }
@ -124,7 +124,7 @@ class News extends Auth
$this->success('您已点赞!'); $this->success('您已点赞!');
} }
if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) { if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) {
NewsService::instance()->syncNewsTotal($map['cid']); NewsService::instance()->syncNewsTotal($map['code']);
$this->success('点赞成功!'); $this->success('点赞成功!');
} else { } else {
$this->error('点赞失败!'); $this->error('点赞失败!');
@ -139,7 +139,7 @@ class News extends Auth
{ {
$map = $this->_getCollectWhere(2); $map = $this->_getCollectWhere(2);
if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) { if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) {
NewsService::instance()->syncNewsTotal($map['cid']); NewsService::instance()->syncNewsTotal($map['code']);
$this->success('取消点赞成功!'); $this->success('取消点赞成功!');
} else { } else {
$this->error('取消点赞失败!'); $this->error('取消点赞失败!');
@ -152,12 +152,9 @@ class News extends Auth
*/ */
public function getLike() public function getLike()
{ {
$map = ['mid' => $this->mid, 'type' => 2]; $query = $this->_query('DataNewsXCollect')->order('id desc');
$query = $this->_query('DataNewsXCollect')->where($map); $result = $query->where(['mid' => $this->mid, 'type' => 2])->page(true, false, false, 15);
$result = $query->order('id desc')->page(true, false, false, 15); NewsService::instance()->buildListByMinAndCode($result['list']);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']);
}
$this->success('获取点赞记录成功!', $result); $this->success('获取点赞记录成功!', $result);
} }
@ -169,12 +166,9 @@ class News extends Auth
*/ */
public function getHistory() public function getHistory()
{ {
$map = ['mid' => $this->mid]; $query = $this->_query('DataNewsXCollect')->order('id desc');
$query = $this->_query('DataNewsXHistory')->where($map); $result = $query->where(['mid' => $this->mid, 'type' => 3])->page(true, false, false, 15);
$result = $query->order('id desc')->page(true, false, false, 15); NewsService::instance()->buildListByMinAndCode($result['list']);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']);
}
$this->success('获取浏览历史成功!', $result); $this->success('获取浏览历史成功!', $result);
} }
@ -183,12 +177,12 @@ class News extends Auth
* @param integer $type 数据类型 * @param integer $type 数据类型
* @return array * @return array
*/ */
private function _getCollectWhere($type = 1): array private function _getCollectWhere(int $type = 1): array
{ {
return $this->_vali([ return $this->_vali([
'mid.value' => $this->mid, 'mid.value' => $this->mid,
'type.value' => $type, 'type.value' => $type,
'cid.require' => '文章不能为空!', 'code.require' => '编号不能为空!',
]); ]);
} }

File diff suppressed because one or more lines are too long

View File

@ -13,43 +13,43 @@ class NewsService extends Service
{ {
/** /**
* 同步文章数据统计 * 同步文章数据统计
* @param integer $cid 文章ID * @param integer $code 文章编号
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
*/ */
public function syncNewsTotal(int $cid): void public function syncNewsTotal(int $code): void
{ {
[$map, $total] = [['cid' => $cid], []]; [$map, $total] = [['code' => $code], []];
$query = $this->app->db->name('DataNewsXCollect')->field('count(1) count,type'); $query = $this->app->db->name('DataNewsXCollect')->field('count(1) count,type');
$query->where($map)->group('type')->select()->map(function ($item) use (&$total) { $query->where($map)->group('type')->select()->map(function ($item) use (&$total) {
$total[$item['type']] = $item['count']; $total[$item['type']] = $item['count'];
}); });
$this->app->db->name('DataNewsItem')->where(['id' => $cid])->update([ $this->app->db->name('DataNewsItem')->where(['code' => $code])->update([
'num_collect' => $total[2] ?? 0, 'num_like' => $total[1] ?? 0, 'num_collect' => $total[2] ?? 0, 'num_like' => $total[1] ?? 0,
'num_comment' => $this->app->db->name('DataNewsXComment')->where($map)->count(), 'num_comment' => $this->app->db->name('DataNewsXComment')->where($map)->count(),
]); ]);
} }
/** /**
* 根据CID绑定列表数据 * 根据code绑定列表数据
* @param array $list 数据列表 * @param array $list 数据列表
* @return array * @return array
*/ */
public function buildListByCidAndMid(array &$list = []): array public function buildListByMinAndCode(array &$list = []): array
{ {
if (count($list) > 0) { if (count($list) > 0) {
/*! 读取文章内容 */ /*! 读取文章内容 */
$cids = array_unique(array_column($list, 'cid')); $codes = array_unique(array_column($list, 'code'));
$cols = 'id,name,cover,mark,status,deleted,create_at,num_like,num_read,num_comment,num_collect'; $colls = 'id,code,name,cover,mark,status,deleted,create_at,num_like,num_read,num_comment,num_collect';
$items = $this->app->db->name('DataNewsItem')->whereIn('id', $cids)->column($cols, 'id'); $items = $this->app->db->name('DataNewsItem')->whereIn('code', $codes)->column($colls, 'code');
$marks = $this->app->db->name('DataNewsMark')->where(['status' => 1])->column('name'); $marks = $this->app->db->name('DataNewsMark')->where(['status' => 1])->column('name');
foreach ($items as &$vo) $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks); foreach ($items as &$vo) $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks);
/*! 绑定会员数据 */ /*! 绑定会员数据 */
$mids = array_unique(array_column($list, 'mid')); $mids = array_unique(array_column($list, 'mid'));
$cols = 'id,phone,nickname,username,headimg,status'; $colls = 'id,phone,nickname,username,headimg,status';
$users = $this->app->db->name('DataMember')->whereIn('id', $mids)->column($cols, 'id'); $users = $this->app->db->name('DataMember')->whereIn('id', $mids)->column($colls, 'id');
foreach ($list as &$vo) { foreach ($list as &$vo) {
$vo['record'] = $items[$vo['cid']] ?? [];
$vo['member'] = $users[$vo['mid']] ?? []; $vo['member'] = $users[$vo['mid']] ?? [];
$vo['record'] = $items[$vo['code']] ?? [];
} }
} }
return $list; return $list;
@ -64,17 +64,17 @@ class NewsService extends Service
public function buildListState(array &$list, int $mid = 0): array public function buildListState(array &$list, int $mid = 0): array
{ {
if (count($list) > 0) { if (count($list) > 0) {
[$cid1s, $cid2s, $marks] = [[], [], []]; [$code2, $code1, $marks] = [[], [], []];
if ($mid > 0) { if ($mid > 0) {
$map = [['mid', '=', $mid], ['cid', 'in', array_unique(array_column($list, 'id'))]]; $map = [['mid', '=', $mid], ['code', 'in', array_unique(array_column($list, 'code'))]];
$marks = $this->app->db->name('DataNewsMark')->where(['status' => 1])->column('name'); $marks = $this->app->db->name('DataNewsMark')->where(['status' => 1])->column('name');
$cid1s = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 2])->column('cid'); $code1 = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 1])->column('code');
$cid2s = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 1])->column('cid'); $code2 = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 2])->column('code');
} }
foreach ($list as &$vo) { foreach ($list as &$vo) {
$vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks); $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks);
$vo['my_like_state'] = in_array($vo['id'], $cid1s) ? 1 : 0; $vo['my_like_state'] = in_array($vo['code'], $code2) ? 1 : 0;
$vo['my_coll_state'] = in_array($vo['id'], $cid2s) ? 1 : 0; $vo['my_coll_state'] = in_array($vo['code'], $code1) ? 1 : 0;
} }
} }
return $list; return $list;

View File

@ -40,18 +40,20 @@
<textarea class="layui-textarea" placeholder="请输入文章内容" name="content">{$vo.content|default=''}</textarea> <textarea class="layui-textarea" placeholder="请输入文章内容" name="content">{$vo.content|default=''}</textarea>
</label> </label>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
{notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty} {notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty}
{notempty name='vo.code'}<input type='hidden' value='{$vo.code}' name='code'>{/notempty}
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
<button type="submit" class="layui-btn">保存数据</button> <button type="submit" class="layui-btn">保存数据</button>
<button type='button' class="layui-btn layui-btn-danger" data-confirm="确定要取消编辑吗?" data-close>取消编辑</button> <button type='button' class="layui-btn layui-btn-danger" data-confirm="确定要取消编辑吗?" data-close>取消编辑</button>
</div> </div>
</div> </div>
<script>
require(['ckeditor'], function () {
window.createEditor('[name=content]', {height: 300});
});
</script>
</form> </form>
<script>
require(['ckeditor'], function () {
window.createEditor('[name=content]', {height: 300});
});
</script>
{/block} {/block}

View File

@ -25,6 +25,7 @@
<th class='list-table-sort-td'> <th class='list-table-sort-td'>
<button type="button" data-reload class="layui-btn layui-btn-xs"> </button> <button type="button" data-reload class="layui-btn layui-btn-xs"> </button>
</th> </th>
<th class="text-left nowrap">文章编号</th>
<th class="text-left nowrap">文章名称</th> <th class="text-left nowrap">文章名称</th>
<th class="text-left nowrap">搜索标签</th> <th class="text-left nowrap">搜索标签</th>
<th class="text-left nowrap">文章状态</th> <th class="text-left nowrap">文章状态</th>
@ -42,6 +43,7 @@
<td class='list-table-sort-td'> <td class='list-table-sort-td'>
<label><input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input"></label> <label><input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input"></label>
</td> </td>
<td class="text-left nowrap">{$vo.code|default=''}</td>
<td class="text-left nowrap">{$vo.name|default=''}</td> <td class="text-left nowrap">{$vo.name|default=''}</td>
<td class="text-left nowrap">{notempty name='vo.mark'}{foreach $vo.mark as $tag}<span data-tips-text="热搜标签" class="margin-right-5 layui-badge layui-bg-cyan">{$tag}</span>{/foreach}{/notempty}<br></td> <td class="text-left nowrap">{notempty name='vo.mark'}{foreach $vo.mark as $tag}<span data-tips-text="热搜标签" class="margin-right-5 layui-badge layui-bg-cyan">{$tag}</span>{/foreach}{/notempty}<br></td>
<td class="text-left nowrap">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">已激活</span>{/if}</td> <td class="text-left nowrap">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">已激活</span>{/if}</td>