调整文章模块

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

View File

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

View File

@ -20,11 +20,11 @@ class News extends Auth
{
$data = $this->_vali([
'mid.value' => $this->mid,
'cid.require' => '文章不能为空!',
'code.require' => '文章不能为空!',
'content.require' => '内容不能为空!',
]);
if ($this->app->db->name('DataNewsXComment')->insert($data) !== false) {
NewsService::instance()->syncNewsTotal($data['cid']);
NewsService::instance()->syncNewsTotal($data['code']);
$this->success('添加评论成功!');
} else {
$this->error('添加评论失败!');
@ -39,10 +39,10 @@ class News extends Auth
*/
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);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result);
NewsService::instance()->buildListByMinAndCode($result);
}
$this->success('获取评论列表成功', $result);
}
@ -54,9 +54,9 @@ class News extends Auth
public function delComment()
{
$map = $this->_vali([
'mid.value' => $this->mid,
'cid.require' => '文章ID不能为空',
'id.require' => '评论ID不能为空!',
'mid.value' => $this->mid,
'id.require' => '评论ID不能为空',
'code.require' => '文章CODE不能为空!',
]);
if ($this->app->db->name('DataNewsXComment')->where($map)->delete() !== false) {
$this->success('评论删除成功!');
@ -76,7 +76,7 @@ class News extends Auth
$this->success('您已收藏!');
}
if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) {
NewsService::instance()->syncNewsTotal($map['cid']);
NewsService::instance()->syncNewsTotal($map['code']);
$this->success('收藏成功!');
} else {
$this->error('收藏失败!');
@ -91,7 +91,7 @@ class News extends Auth
{
$map = $this->_getCollectWhere(1);
if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) {
NewsService::instance()->syncNewsTotal($map['cid']);
NewsService::instance()->syncNewsTotal($map['code']);
$this->success('取消收藏成功!');
} else {
$this->error('取消收藏失败!');
@ -108,7 +108,7 @@ class News extends Auth
$query = $this->_query('DataNewsXCollect')->where($map);
$result = $query->order('id desc')->page(true, false, false, 15);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']);
NewsService::instance()->buildListByMinAndCode($result['list']);
}
$this->success('获取收藏记录成功!', $result);
}
@ -124,7 +124,7 @@ class News extends Auth
$this->success('您已点赞!');
}
if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) {
NewsService::instance()->syncNewsTotal($map['cid']);
NewsService::instance()->syncNewsTotal($map['code']);
$this->success('点赞成功!');
} else {
$this->error('点赞失败!');
@ -139,7 +139,7 @@ class News extends Auth
{
$map = $this->_getCollectWhere(2);
if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) {
NewsService::instance()->syncNewsTotal($map['cid']);
NewsService::instance()->syncNewsTotal($map['code']);
$this->success('取消点赞成功!');
} else {
$this->error('取消点赞失败!');
@ -152,12 +152,9 @@ class News extends Auth
*/
public function getLike()
{
$map = ['mid' => $this->mid, 'type' => 2];
$query = $this->_query('DataNewsXCollect')->where($map);
$result = $query->order('id desc')->page(true, false, false, 15);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']);
}
$query = $this->_query('DataNewsXCollect')->order('id desc');
$result = $query->where(['mid' => $this->mid, 'type' => 2])->page(true, false, false, 15);
NewsService::instance()->buildListByMinAndCode($result['list']);
$this->success('获取点赞记录成功!', $result);
}
@ -169,12 +166,9 @@ class News extends Auth
*/
public function getHistory()
{
$map = ['mid' => $this->mid];
$query = $this->_query('DataNewsXHistory')->where($map);
$result = $query->order('id desc')->page(true, false, false, 15);
if (count($result['list']) > 0) {
NewsService::instance()->buildListByCidAndMid($result['list']);
}
$query = $this->_query('DataNewsXCollect')->order('id desc');
$result = $query->where(['mid' => $this->mid, 'type' => 3])->page(true, false, false, 15);
NewsService::instance()->buildListByMinAndCode($result['list']);
$this->success('获取浏览历史成功!', $result);
}
@ -183,12 +177,12 @@ class News extends Auth
* @param integer $type 数据类型
* @return array
*/
private function _getCollectWhere($type = 1): array
private function _getCollectWhere(int $type = 1): array
{
return $this->_vali([
'mid.value' => $this->mid,
'type.value' => $type,
'cid.require' => '文章不能为空!',
'mid.value' => $this->mid,
'type.value' => $type,
'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
*/
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->where($map)->group('type')->select()->map(function ($item) use (&$total) {
$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_comment' => $this->app->db->name('DataNewsXComment')->where($map)->count(),
]);
}
/**
* 根据CID绑定列表数据
* 根据code绑定列表数据
* @param array $list 数据列表
* @return array
*/
public function buildListByCidAndMid(array &$list = []): array
public function buildListByMinAndCode(array &$list = []): array
{
if (count($list) > 0) {
/*! 读取文章内容 */
$cids = array_unique(array_column($list, 'cid'));
$cols = 'id,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');
$codes = array_unique(array_column($list, 'code'));
$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('code', $codes)->column($colls, 'code');
$marks = $this->app->db->name('DataNewsMark')->where(['status' => 1])->column('name');
foreach ($items as &$vo) $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks);
/*! 绑定会员数据 */
$mids = array_unique(array_column($list, 'mid'));
$cols = 'id,phone,nickname,username,headimg,status';
$users = $this->app->db->name('DataMember')->whereIn('id', $mids)->column($cols, 'id');
$colls = 'id,phone,nickname,username,headimg,status';
$users = $this->app->db->name('DataMember')->whereIn('id', $mids)->column($colls, 'id');
foreach ($list as &$vo) {
$vo['record'] = $items[$vo['cid']] ?? [];
$vo['member'] = $users[$vo['mid']] ?? [];
$vo['record'] = $items[$vo['code']] ?? [];
}
}
return $list;
@ -64,17 +64,17 @@ class NewsService extends Service
public function buildListState(array &$list, int $mid = 0): array
{
if (count($list) > 0) {
[$cid1s, $cid2s, $marks] = [[], [], []];
[$code2, $code1, $marks] = [[], [], []];
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');
$cid1s = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 2])->column('cid');
$cid2s = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 1])->column('cid');
$code1 = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 1])->column('code');
$code2 = $this->app->db->name('DataNewsXCollect')->where($map)->where(['type' => 2])->column('code');
}
foreach ($list as &$vo) {
$vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks);
$vo['my_like_state'] = in_array($vo['id'], $cid1s) ? 1 : 0;
$vo['my_coll_state'] = in_array($vo['id'], $cid2s) ? 1 : 0;
$vo['my_like_state'] = in_array($vo['code'], $code2) ? 1 : 0;
$vo['my_coll_state'] = in_array($vo['code'], $code1) ? 1 : 0;
}
}
return $list;

View File

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

View File

@ -25,6 +25,7 @@
<th class='list-table-sort-td'>
<button type="button" data-reload class="layui-btn layui-btn-xs"> </button>
</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'>
<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 class="text-left nowrap">{$vo.code|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">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">已激活</span>{/if}</td>