添加:消息留言添加回复功能

This commit is contained in:
wuhui_zzw 2023-03-06 10:39:40 +08:00
parent fb5c84652d
commit 54fbc09803
5 changed files with 292 additions and 63 deletions

View File

@ -12,6 +12,7 @@
*/ */
namespace addon\message\api\controller; namespace addon\message\api\controller;
use addon\message\model\Message as messageModel;
use addon\message\model\MessageRead; use addon\message\model\MessageRead;
use app\api\controller\BaseApi; use app\api\controller\BaseApi;
@ -36,6 +37,7 @@ class Message extends BaseApi{
'a.is_see', 'a.is_see',
'a.order_id', 'a.order_id',
'a.created_time', 'a.created_time',
'a.reply_content',
'mc.type', 'mc.type',
'mc.message_title', 'mc.message_title',
'mc.message_content', 'mc.message_content',
@ -65,5 +67,22 @@ class Message extends BaseApi{
return $this->response($this->success()); return $this->response($this->success());
} }
/**
* Common: 留言信息
* Author: wu-hui
* Time: 2023/03/04 18:04
* @return false|string
*/
public function remarks(){
// 用户登录
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
// 记录留言信息
(new messageModel())->addMessage($this->site_id,$this->params['remarks'],4,$this->member_id,0,'',$this->params['image_list']);
return $this->response($this->success());
}
} }

View File

@ -24,15 +24,16 @@ class Message extends BaseModel{
*/ */
public function getList($siteId){ public function getList($siteId){
// 参数获取 // 参数获取
$page = input('page',1); $page = input('page',1);
$pageSize = input('page_size',PAGE_LIST_ROWS); $pageSize = input('page_size',PAGE_LIST_ROWS);
$title = input('title',''); $title = input('title','');
$type = input('type',''); $type = input('type','');
// 条件生成 // 条件生成
$where = [ $where = [
['a.site_id','=',$siteId], ['a.site_id','=',$siteId],
['a.type','in',[2,3]], ['a.type','in',[2,3]]
]; ];
// 其他条件
if($title) $where[] = ['a.message_title','like',"%{$title}%"]; if($title) $where[] = ['a.message_title','like',"%{$title}%"];
if($type) $where[] = ['a.type','=',$type]; if($type) $where[] = ['a.type','=',$type];
// 列表获取 // 列表获取
@ -65,7 +66,7 @@ class Message extends BaseModel{
* @param string $title * @param string $title
* @return array * @return array
*/ */
public function addMessage(int $siteId,string $content,int $type,$member_id = 'all',int $orderId = 0,$title = ''){ public function addMessage(int $siteId,string $content,int $type,$member_id = 'all',int $orderId = 0,$title = '',$image = ''){
if(!$content) return $this->error('','消息不能为空!'); if(!$content) return $this->error('','消息不能为空!');
// 记录消息信息 // 记录消息信息
try{ try{
@ -75,7 +76,8 @@ class Message extends BaseModel{
'type' => $type, 'type' => $type,
'message_title' => $title ?? $this->types[$type], 'message_title' => $title ?? $this->types[$type],
'message_content' => $content, 'message_content' => $content,
'created_time' => time() 'created_time' => time(),
'image_list' => $image,
]); ]);
// 关联用户信息 // 关联用户信息
if($member_id == 'all'){ if($member_id == 'all'){
@ -122,5 +124,73 @@ class Message extends BaseModel{
return $this->success(); return $this->success();
} }
/**
* Common: 获取留言信息
* Author: wu-hui
* Time: 2023/03/04 18:07
* @param $siteId
* @return array
* @throws \think\db\exception\DbException
*/
public function getRemarks($siteId){
// 参数获取
$page = input('page',1);
$pageSize = input('page_size',PAGE_LIST_ROWS);
$nickname = input('nickname','');
$type = (int)input('type',0);
// 条件生成
$where = [
['a.site_id','=',$siteId],
['a.type','=',4]
];
if($nickname) $where[] = ['m.username|m.nickname','like',"%{$nickname}%"];
if($type > 0) $where[] = ['mcr.is_see','=',$type == 1 ? 0 : 1];// 是否已读0=未读1=已读
// 列表获取
$result = Db::name('message_center')
->alias('a')
->field('a.id,a.type,a.created_time,mcr.member_id,mcr.is_see,m.username,m.nickname,m.headimg')
->join('message_center_read mcr','mcr.message_center_id = a.id', 'left')
->join('member m','m.member_id = mcr.member_id','left')
->where($where)
->group('a.id')
->order('a.id','DESC')
->paginate(['list_rows' => $pageSize,'page' => $page]);
if($result) $result = $result->toArray();
$list = [
'count' => $result['total'],
'list' => $result['data'],
'page_count' => $result['last_page'],
];
return $this->success($list);
}
/**
* Common: 获取单条信息
* Author: wu-hui
* Time: 2023/03/06 9:38
* @param array $where
* @param string $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getInfo($where = [], $field = '*'){
$result = Db::name('message_center')
->alias('a')
->field($field)
->join('message_center_read mcr','mcr.message_center_id = a.id', 'left')
->join('member m','m.member_id = mcr.member_id','left')
->where($where)
->find();
return $this->success($result);
}
} }

View File

@ -16,15 +16,51 @@ use app\shop\controller\BaseShop;
use addon\message\model\Message as messageModel; use addon\message\model\Message as messageModel;
class Remark extends BaseShop{ class Remark extends BaseShop{
// 进入留言管理 /**
* Common: 进入留言管理
* Author: wu-hui
* Time: 2023/03/06 9:12
* @return array|mixed
* @throws \think\db\exception\DbException
*/
public function index(){ public function index(){
if(request()->isAjax()) return (new messageModel())->getList($this->site_id); if(request()->isAjax()) return (new messageModel())->getRemarks($this->site_id);
$this->forthMenu(); $this->forthMenu();
return $this->fetch('remark/index'); return $this->fetch('remark/index');
} }
/**
* Common: 查看详情&回复内容
* Author: wu-hui
* Time: 2023/03/06 10:09
* @return array|mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function seeInfo(){
// 获取基本信息
$messageCenterId = input('message_center_id');
Model('message_center_read')->update(['is_see'=>1],['message_center_id'=>$messageCenterId]);
if(request()->isAjax()) {
// 回复内容
$replyContent = input('reply_content');
Model('message_center_read')->update(['reply_content'=>$replyContent],['message_center_id'=>$messageCenterId]);
return success();
}
// 获取信息
$where = [
['a.id','=',$messageCenterId]
];
$field = 'a.id,a.created_time,a.message_content,a.image_list,mcr.is_see,m.username,m.nickname,m.headimg';
$info = (new messageModel())->getInfo($where,$field)['data'];
$info['image_list'] = $info['image_list'] ? explode(',',$info['image_list']) : [];
$this->assign('info',$info);
$this->assign('message_center_id',$messageCenterId);
return $this->fetch('remark/see');
}

View File

@ -15,24 +15,23 @@
<div class="layui-colla-content layui-form layui-show" lay-filter="search_form"> <div class="layui-colla-content layui-form layui-show" lay-filter="search_form">
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">消息标题</label> <label class="layui-form-label">用户昵称</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input type="text" name="title" placeholder="消息标题" autocomplete="off" class="layui-input"/> <input type="text" name="nickname" placeholder="用户昵称" autocomplete="off" class="layui-input"/>
</div> </div>
</div> </div>
<div class="layui-inline"> <div class="layui-inline">
<label class="layui-form-label">消息类型</label> <label class="layui-form-label">是否已读</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<select name="type"> <select name="type">
<option value="">全部</option> <option value="">全部</option>
<option value="2">系统消息</option> <option value="1">未读</option>
<option value="3">通知消息</option> <option value="2">已读</option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
<div class="form-row"> <div class="form-row">
<button class="layui-btn publish-btn" lay-submit lay-filter="publish">发布</button>
<button class="layui-btn" lay-submit lay-filter="search">筛选</button> <button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button> <button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div> </div>
@ -44,7 +43,22 @@
<!-- 操作 --> <!-- 操作 -->
<script type="text/html" id="operation"> <script type="text/html" id="operation">
<div class="table-btn"> <div class="table-btn">
<a class="layui-btn" lay-event="deleteInfo">删除</a> <a class="layui-btn" lay-event="seeInfo">查看</a>
</div>
</script>
<!--会员信息-->
<script type="text/html" id="memberInfo">
<div class='table-title'>
<div class='title-pic'>
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}' ">
</div>
<div class='title-content'>
{{# if(d.username){ }}
<p class="layui-elip">{{d.username}}</p>
{{# } else { }}
<p class="layui-elip">{{d.nickname}}</p>
{{# } }}
</div>
</div> </div>
</script> </script>
{/block} {/block}
@ -74,41 +88,28 @@
// 内容获取 // 内容获取
table = new Table({ table = new Table({
elem: '#listContent', elem: '#listContent',
url: ns.url("message://shop/message/index"), url: ns.url("message://shop/remark/index"),
cols: [[ cols: [[
{align: 'center', field: 'id', title: 'ID', width: '5%', unresize: 'false'}, {align: 'center', field: 'id', title: 'ID', width: '5%', unresize: 'false'},
{align: 'center', title: '消息标题', field:'message_title', unresize: 'area'}, {align: 'left', title: '留言用户', unresize: 'area',templet: '#memberInfo'},
{align: 'center', title: '接收人数', field: 'total',unresize: 'area'},
{ {
align: 'center',width: '10%', templet: function (d) { align: 'center', templet: function (d) {
// 消息类型1=交易信息2=系统消息3=通知消息4=留言反馈 // 是否已读0=未读1=已读
let statusText = ''; let statusText = '';
switch (parseInt(d.type)) { switch (parseInt(d.is_see)) {
case 1: statusText = '<p style="color: #07c160;">交易信息</p>'; break; case 0: statusText = '<p style="color: #1989fa;">未读</p>'; break;
case 2: statusText = '<p style="color: #1989fa;">系统消息</p>'; break; case 1: statusText = '<p>已读</p>'; break;
case 3: statusText = '<p style="color: #7232dd;">通知消息</p>'; break;
case 4: statusText = '<p style="color: #ad0000;">留言反馈</p>'; break;
} }
return statusText; return statusText;
}, title: '消息类型', unresize: 'false' }, title: '是否已读', unresize: 'false'
}, },
{align: 'center', title: '留言时间', field: 'created_time',unresize: 'area',
templet: function(data) {
return ns.time_to_date(data.created_time);
}},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'right'} {title: '操作', toolbar: '#operation', unresize: 'false', align: 'right'}
]], ]],
}); });
// 点击发布
form.on('submit(publish)', function(data) {
layer.open({
type: 2,
title: '消息发布',
skin: 'layer-tips-class',
area: ['80%','90%'],
content: ns.url("message://shop/message/sendMessage"),
end: function(){
table.reload();
}
});
});
// 点击搜索 // 点击搜索
form.on('submit(search)', function(data) { form.on('submit(search)', function(data) {
table.reload({ table.reload({
@ -122,7 +123,7 @@
// 重置表单 // 重置表单
form.on('submit(reset)', function(data) { form.on('submit(reset)', function(data) {
let field = { let field = {
"title": "", "nickname": "",
"type": "", "type": "",
}; };
form.val("search_form", field); form.val("search_form", field);
@ -141,28 +142,19 @@
eval(obj.event)(data) eval(obj.event)(data)
}); });
}); });
// 删除消息 // 查看信息详情
function deleteInfo(data){ function seeInfo(data){
layer.confirm('确认删除当前消息?删除后所有已发送给用户当前消息将同步删除。', {icon: 3, title:'提示'}, function(index){ layer.open({
layer.close(index); type: 2,
$.ajax({ title: '消息发布',
type: 'POST', skin: 'layer-tips-class',
dataType: 'JSON', area: ['80%','90%'],
url: ns.url("message://shop/message/delMessage"), content: ns.url("message://shop/remark/seeInfo",{ message_center_id: data.id }),
data: { id: data.id }, end: function(){
async: false, table.reload();
success: function(res){ }
if (res.code == 0) {
layer.alert('删除成功', function(index){
layer.close(index);
table.reload();
});
}else{
layer.msg(res.message);
}
}
})
}); });
} }
</script> </script>
{/block} {/block}

View File

@ -0,0 +1,112 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.tips{
font-size: 13px;
color: #cccccc;
}
.hide{
display: none;
}
.avatar{
width: 80px;
height: 80px;
border-radius: 50%;
}
.nickname{
text-align: center;
font-size: 13px;
}
.image-list-item{
max-width: 150px;
height: 150px;
}
</style>
{/block}
{block name="body"}
<div class="layui-form form-wrap" lay-filter="formInfo">
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable short-label">用户信息:</label>
<div class="layui-input-inline">
<img class="avatar" src="{:img($info['headimg'])}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}'">
<div class="nickname">{$info['nickname'] ?? $info['username']}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable short-label">提交时间:</label>
<div class="layui-input-inline">
{:date('Y-m-d H:i:s',$info['created_time'])}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable short-label">消息内容:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" rows="10" disabled>{$info['message_content']}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable short-label">相关图片:</label>
<div class="layui-input-inline">
{foreach $info['image_list'] as $img}
<img class="image-list-item" layer-src src="{:img($img)}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}'"/>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable short-label">回复内容:</label>
<div class="layui-input-inline">
<textarea name="reply_content" class="layui-textarea len-long" rows="10">{$info['reply_content'] ?? ''}</textarea>
</div>
</div>
<!--提交按钮-->
<div class="form-row">
<input type="text" value="{$message_center_id}" name="message_center_id" autocomplete="off" class="layui-input hide"/>
<button class="layui-btn" lay-submit lay-filter="save">提交回复</button>
<button class="layui-btn layui-btn-primary" onclick="closeIframe()">关闭</button>
</div>
</div>
{/block}
{block name="script"}
<script>
var _thisIndex,form,repeat_flag = false,goods_info = {};
$(function () {
// 基本参数
_thisIndex = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
// 表单内容
layui.use(['form'], function() {
form = layui.form;
form.render();
// 表单提交
form.on('submit(save)', function(data){
var field = data.field;
// 判断信息是否完整
if(!field['reply_content']){
layer.msg('请输入回复内容!');
return false;
}
// 数据提交
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("message://shop/remark/seeInfo"),
data: field,
async: false,
success: function(res){
if (parseInt(res.code) === 0) {
layer.msg(res.message);
parent.layer.close(_thisIndex);
}else{
layer.msg(res.message);
}
}
})
});
});
});
// 点击关闭弹框
function closeIframe() {
parent.layer.close(_thisIndex); //再执行关闭
}
</script>
{/block}