添加:消息留言添加回复功能
This commit is contained in:
parent
fb5c84652d
commit
54fbc09803
|
|
@ -12,6 +12,7 @@
|
|||
*/
|
||||
namespace addon\message\api\controller;
|
||||
|
||||
use addon\message\model\Message as messageModel;
|
||||
use addon\message\model\MessageRead;
|
||||
use app\api\controller\BaseApi;
|
||||
|
||||
|
|
@ -36,6 +37,7 @@ class Message extends BaseApi{
|
|||
'a.is_see',
|
||||
'a.order_id',
|
||||
'a.created_time',
|
||||
'a.reply_content',
|
||||
'mc.type',
|
||||
'mc.message_title',
|
||||
'mc.message_content',
|
||||
|
|
@ -65,5 +67,22 @@ class Message extends BaseApi{
|
|||
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -31,8 +31,9 @@ class Message extends BaseModel{
|
|||
// 条件生成
|
||||
$where = [
|
||||
['a.site_id','=',$siteId],
|
||||
['a.type','in',[2,3]],
|
||||
['a.type','in',[2,3]]
|
||||
];
|
||||
// 其他条件
|
||||
if($title) $where[] = ['a.message_title','like',"%{$title}%"];
|
||||
if($type) $where[] = ['a.type','=',$type];
|
||||
// 列表获取
|
||||
|
|
@ -65,7 +66,7 @@ class Message extends BaseModel{
|
|||
* @param string $title
|
||||
* @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('','消息不能为空!');
|
||||
// 记录消息信息
|
||||
try{
|
||||
|
|
@ -75,7 +76,8 @@ class Message extends BaseModel{
|
|||
'type' => $type,
|
||||
'message_title' => $title ?? $this->types[$type],
|
||||
'message_content' => $content,
|
||||
'created_time' => time()
|
||||
'created_time' => time(),
|
||||
'image_list' => $image,
|
||||
]);
|
||||
// 关联用户信息
|
||||
if($member_id == 'all'){
|
||||
|
|
@ -122,5 +124,73 @@ class Message extends BaseModel{
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -16,15 +16,51 @@ use app\shop\controller\BaseShop;
|
|||
use addon\message\model\Message as messageModel;
|
||||
|
||||
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(){
|
||||
if(request()->isAjax()) return (new messageModel())->getList($this->site_id);
|
||||
if(request()->isAjax()) return (new messageModel())->getRemarks($this->site_id);
|
||||
|
||||
$this->forthMenu();
|
||||
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');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,24 +15,23 @@
|
|||
<div class="layui-colla-content layui-form layui-show" lay-filter="search_form">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">消息标题:</label>
|
||||
<label class="layui-form-label">用户昵称:</label>
|
||||
<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 class="layui-inline">
|
||||
<label class="layui-form-label">消息类型:</label>
|
||||
<label class="layui-form-label">是否已读:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="type">
|
||||
<option value="">全部</option>
|
||||
<option value="2">系统消息</option>
|
||||
<option value="3">通知消息</option>
|
||||
<option value="1">未读</option>
|
||||
<option value="2">已读</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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 type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
|
|
@ -44,7 +43,22 @@
|
|||
<!-- 操作 -->
|
||||
<script type="text/html" id="operation">
|
||||
<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>
|
||||
</script>
|
||||
{/block}
|
||||
|
|
@ -74,41 +88,28 @@
|
|||
// 内容获取
|
||||
table = new Table({
|
||||
elem: '#listContent',
|
||||
url: ns.url("message://shop/message/index"),
|
||||
url: ns.url("message://shop/remark/index"),
|
||||
cols: [[
|
||||
{align: 'center', field: 'id', title: 'ID', width: '5%', unresize: 'false'},
|
||||
{align: 'center', title: '消息标题', field:'message_title', unresize: 'area'},
|
||||
{align: 'center', title: '接收人数', field: 'total',unresize: 'area'},
|
||||
{align: 'left', title: '留言用户', unresize: 'area',templet: '#memberInfo'},
|
||||
{
|
||||
align: 'center',width: '10%', templet: function (d) {
|
||||
// 消息类型:1=交易信息,2=系统消息,3=通知消息,4=留言反馈
|
||||
align: 'center', templet: function (d) {
|
||||
// 是否已读:0=未读,1=已读
|
||||
let statusText = '';
|
||||
switch (parseInt(d.type)) {
|
||||
case 1: statusText = '<p style="color: #07c160;">交易信息</p>'; break;
|
||||
case 2: statusText = '<p style="color: #1989fa;">系统消息</p>'; break;
|
||||
case 3: statusText = '<p style="color: #7232dd;">通知消息</p>'; break;
|
||||
case 4: statusText = '<p style="color: #ad0000;">留言反馈</p>'; break;
|
||||
switch (parseInt(d.is_see)) {
|
||||
case 0: statusText = '<p style="color: #1989fa;">未读</p>'; break;
|
||||
case 1: statusText = '<p>已读</p>'; break;
|
||||
}
|
||||
|
||||
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'}
|
||||
]],
|
||||
});
|
||||
// 点击发布
|
||||
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) {
|
||||
table.reload({
|
||||
|
|
@ -122,7 +123,7 @@
|
|||
// 重置表单
|
||||
form.on('submit(reset)', function(data) {
|
||||
let field = {
|
||||
"title": "",
|
||||
"nickname": "",
|
||||
"type": "",
|
||||
};
|
||||
form.val("search_form", field);
|
||||
|
|
@ -141,28 +142,19 @@
|
|||
eval(obj.event)(data)
|
||||
});
|
||||
});
|
||||
// 删除消息
|
||||
function deleteInfo(data){
|
||||
layer.confirm('确认删除当前消息?删除后所有已发送给用户当前消息将同步删除。', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
dataType: 'JSON',
|
||||
url: ns.url("message://shop/message/delMessage"),
|
||||
data: { id: data.id },
|
||||
async: false,
|
||||
success: function(res){
|
||||
if (res.code == 0) {
|
||||
layer.alert('删除成功', function(index){
|
||||
layer.close(index);
|
||||
// 查看信息详情
|
||||
function seeInfo(data){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '消息发布',
|
||||
skin: 'layer-tips-class',
|
||||
area: ['80%','90%'],
|
||||
content: ns.url("message://shop/remark/seeInfo",{ message_center_id: data.id }),
|
||||
end: function(){
|
||||
table.reload();
|
||||
});
|
||||
}else{
|
||||
layer.msg(res.message);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
|
|
@ -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}
|
||||
Loading…
Reference in New Issue