admin user message

This commit is contained in:
toogee 2020-03-31 23:01:00 +08:00
parent 76d48e2469
commit 642404359a
14 changed files with 579 additions and 17 deletions

View File

@ -0,0 +1,94 @@
<?php
namespace app\admin\controller;
use app\common\controller\AdminController;
use think\facade\View;
use think\facade\Request;
use think\facade\Session;
use think\facade\Db;
use app\common\model\Message as MessageModel;
use taoler\com\Message;
class Notice extends AdminController
{
//显示消息
public function index()
{
if(Request::isAjax()){
$notices = MessageModel::where(['type'=>0,'delete_time'=>0])->select();
$count = $notices->count();
$res = [];
if($count){
$res = ['code'=>0,'msg'=>'','count'=>$count];
foreach($notices as $msg){
$res['data'][] = ['id'=>$msg['id'],'type'=>$msg['type'],'title'=>$msg['title'],'user_id'=>$msg['user_id'],'content'=>$msg['content'],'ctime'=>$msg['create_time']];
}
} else {
$res = ['code'=>-1,'msg'=>'还没有发布任何通知'];
}
return json($res);
}
return View::fetch();
}
//添加消息
public function add()
{
$sendId = Session::get('user_id');
$data = Request::only(['type','title','receve_id','content']);
if($data['type'] == 1){
$receveId = $data['receve_id']; //个人通知
} else {
$receveId = 0; //系统通知
}
unset($data['receve_id']); //收信人移除
$data['user_id'] = $sendId; //发信人入信息库
//写入信息库
$result = Message::sendMsg($sendId,$receveId,$data);
if($result){
$res = ['code'=>0,'msg'=>'发布成功'];
} else {
$res = ['code'=>0,'msg'=>'发布失败'];
}
return json($res);
}
//编辑VIP积分规则
public function edit()
{
$id = input('id');
if(Request::isAjax()){
$data = Request::only(['id','title','type','content']);
$result = MessageModel::update($data);
if($result){
$res = ['code'=>0,'msg'=>'编辑成功'];
}else{
$res = ['code'=>-1,'msg'=>'编辑失败'];
}
return json($res);
}
$msg = Db::name('message')->find($id);
View::assign(['msg'=>$msg]);
return View::fetch();
}
//删除消息
public function delete($id)
{
if(Request::isAjax()){
$msg = MessageModel::find($id);
$result = $msg->delete();
if($result){
return json(['code'=>0,'msg'=>'删除成功']);
}else{
return json(['code'=>-1,'msg'=>'删除失败']);
}
}
}
}

View File

@ -19,6 +19,10 @@ class Message extends Model
return $this->hasMany('User','user_id','id');
}
//发件箱关联收件箱
public function messageto()
{
return $this->hasMany('MessageTo','message_id','id');
}
}

View File

@ -18,6 +18,11 @@ class MessageTo extends Model
return $this->hasMany('User','user_id','id');
}
public function messages()
{
//评论关联用户
return $this->belongsTo('Message','message_id','id');
}
}

View File

@ -167,7 +167,7 @@ class Article extends BaseController
} else {
$receveId = $article['user_id'];
}
$data = ['title'=>$title,'link'=>$link,'user_id'=>$sendId];
$data = ['title'=>$title,'content'=>'评论通知','link'=>$link,'user_id'=>$sendId,'type'=>1];
Message::sendMsg($sendId,$receveId,$data);
$res = ['code'=>1, 'msg'=>'留言成功'];

View File

@ -11,6 +11,7 @@ use think\facade\Cookie;
use think\facade\Cache;
use think\facade\View;
use app\common\model\User as userModel;
use taoler\com\Message;
class Login extends BaseController
{
@ -56,6 +57,9 @@ class Login extends BaseController
$user = new \app\common\model\User();
$res = $user->login($data);
if ($res == 1) {
//获取系统站内通知信息
Message::insertMsg(session('user_id'));
return json(['code'=>0,'msg'=>'登陆成功','url'=>'/']);
} else {
return json(['code'=>-1,'msg'=>$res]);

View File

@ -5,6 +5,8 @@ use app\common\controller\BaseController;
use think\facade\Session;
use think\facade\Request;
use think\facade\Db;
use app\common\model\Message as MessageModel;
use app\common\model\MessageTo;
use taoler\com\Message as MessageApi;
class Message extends BaseController
@ -33,12 +35,13 @@ class Message extends BaseController
if($count){
$res = ['status'=>0,'msg'=>'','count'=>$count];
foreach ($msg as $k => $v){
$data = ['id'=>$v['id'],'name'=>$v['name'],'content'=>$v['title'],'time'=>date("Y-m-d H:i",$v['create_time']),'link'=>$v['link'],'read'=>$v['is_read'] ? '已读':'未读'];
$data = ['id'=>$v['id'],'name'=>$v['name'],'title'=>$v['title'],'content'=>$v['content'],'time'=>date("Y-m-d H:i",$v['create_time']),'link'=>$v['link'],'read'=>$v['is_read'] ? '已读':'未读','type'=>$v['message_type']];
$res['rows'][] = $data;
}
} else {
$res = ['status'=>0,'msg'=>'','rows'=>''];;
}
//var_dump($res);
return json($res);
}
@ -46,11 +49,17 @@ class Message extends BaseController
public function read()
{
$id =input('id');
$msg = Db::name('message_to')->where('id',$id)->save(['is_read'=>1]);
$res=['status' =>0];
//$msg = Db::name('message_to')->where('id',$id)->save(['is_read'=>1]);
$msg = MessageTo::field('id,message_id')->with(['messages' => function($query){
$query->where('delete_time',0)->field('id,content');
}])->where('id',$id)->find();
//改变读状态
$result = $msg->update(['id'=>$id,'is_read'=>1]);
if($result){
$res=['status' =>0,'content'=>$msg['messages']['content']];
return json($res);
}
}

View File

@ -173,7 +173,11 @@ INSERT INTO `tao_auth_rule` VALUES ('72', 'admin/Vip/add', '添加vip等级', '1
INSERT INTO `tao_auth_rule` VALUES ('73', 'admin/Vip/vipEdit', '编辑vip等级', '1', '1', '1', '1', '', '0', '21', '', '1585548029', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('74', 'admin/Vip/delete', '删除vip等级', '1', '1', '2', '1', '', '0', '22', '', '1585548077', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('75', 'admin/Set/email', '邮箱设置', '1', '1', '2', '1', '', '0', '23', '', '1585548143', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('76', 'admin/User/auth', '设置超级用户', '1', '1', '1', '1', '', '0', '22', '', '1578984801', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('76', 'admin/Notice/index', '发布通知', '1', '1', '4', '1', '', '1', '10', '', '1585618141', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('77', 'admin/Notice/add', '添加通知', '1', '1', '4', '1', '', '0', '11', '', '1585663336', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('78', 'admin/Notice/edit', '编辑通知', '1', '1', '4', '1', '', '0', '12', '', '1585663366', '1585663465', '0');
INSERT INTO `tao_auth_rule` VALUES ('79', 'admin/Notice/delete', '删除通知', '1', '1', '4', '1', '', '0', '13', '', '1585663412', '0', '0');
INSERT INTO `tao_auth_rule` VALUES ('83', 'admin/User/auth', '设置超级用户', '1', '1', '1', '1', '', '0', '22', '', '1578984801', '0', '0');
DROP TABLE IF EXISTS `tao_cate`;
CREATE TABLE `tao_cate` (
@ -243,9 +247,10 @@ DROP TABLE IF EXISTS `tao_message`;
CREATE TABLE `tao_message` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
`title` varchar(255) NOT NULL COMMENT '消息标题',
`content` tinytext COMMENT '消息内容',
`content` text COMMENT '消息内容',
`user_id` int(11) NOT NULL COMMENT '发送人ID',
`link` varchar(255) NOT NULL COMMENT '链接',
`type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '消息类型0系统消息1普通消息',
`create_time` int(11) NOT NULL COMMENT '创建时间',
`update_time` int(11) NOT NULL COMMENT '更新时间',
`delete_time` int(11) NOT NULL COMMENT '删除时间',
@ -258,6 +263,7 @@ CREATE TABLE `tao_message_to` (
`send_id` int(11) NOT NULL COMMENT '发送人ID',
`receve_id` int(11) NOT NULL COMMENT '接收人ID',
`message_id` varchar(255) NOT NULL COMMENT '消息标题',
`message_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '消息类型0系统消息1普通消息',
`is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '消息状态',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',

View File

@ -39,7 +39,8 @@ class Auth
if (!$auth->check($app . '/' . $controller . '/' . $action, $admin_id) && $admin_id != 1) {
//return response('<script>alert("没有权限");location.back()</script>');
return response('没有权限');
//return response('没有权限');
return json(['code'=>-1,'msg'=>'没有权限!']);
}
}
}

View File

@ -11,11 +11,21 @@ class Message
//send msg
public static function sendMsg($sendId,$receveId,$data)
{
$msg = MessageModel::create($data);
//写入消息库
$msg = MessageModel::create($data); //写入消息库
$msgId = $msg->id;
$result = MessageTo::create(['send_id'=>$sendId,'receve_id'=>$receveId,'message_id'=>$msgId]);
if($result){
//类型1为用户写入用户收件箱
if($data['type'] == 1){
$result = MessageTo::create(['send_id'=>$sendId,'receve_id'=>$receveId,'message_id'=>$msgId,'message_type'=>$data['type']]);
if(!$result){
return false;
}
}
if($msg){
return true;
} else {
return false;
}
}
@ -26,7 +36,7 @@ class Message
->alias('t')
->join('message m','t.message_id = m.id' )
->join('user u','t.send_id = u.id')
->field('t.id as id,name,title,link,receve_id,t.create_time as create_time,is_read')
->field('t.id as id,name,title,content,link,receve_id,t.create_time as create_time,message_type,is_read')
->where('t.receve_id',$uid)
->where(['t.delete_time'=>0])
->order(['t.create_time'=>'desc'])
@ -34,4 +44,21 @@ class Message
return $msg;
}
//登录后插入系统消息
public static function insertMsg($uid)
{
//得到所有系统消息
$sysmsg = MessageModel::where(['type'=>0,'delete_time'=>0])->select();
foreach($sysmsg as $smg){
//检验通知是否被写入个人收件箱
$msgId = Db::name('message_to')->where('message_id',$smg['id'])->find();
if(!$msgId){
$result = MessageTo::create(['send_id'=>$smg['user_id'],'receve_id'=>$uid,'message_id'=>$smg['id'],'message_type'=>$smg['type']]);
}
}
if($result){
return true;
}
}
}

View File

@ -0,0 +1,193 @@
//网站后台综合设置
layui.define(['table', 'form', 'layedit'], function(exports){
var $ = layui.$
,table = layui.table
,form = layui.form
,layedit = layui.layedit;
var index = layedit.build('L_content',{
height: 180 //设置编辑器高度
,tool: [
'strong' //加粗
,'italic' //斜体
,'underline' //下划线
,'del' //删除线
,'|' //分割线
,'left' //左对齐
,'center' //居中对齐
,'right' //右对齐
,'link' //超链接
,'unlink' //清除链接
,'face' //表情
,'image' //插入图片
],
});
//得到编辑器内容异步到表单中
form.verify({
content: function(value){
return layedit.sync(index);
}
});
//通知列表
table.render({
elem: '#notice-list',
url: '/admin/Notice/index',
limit: 5,
cols:[[
{type: 'numbers', fixed: 'left'},
{field: 'type',title: '类型'},
{field: 'title',title: '标题'},
{field: 'user_id',title: '发信ID'},
{field: 'content',title: '内容'},
{field: 'ctime',title: '时间'},
{title: '操作', width: 150, align:'center', fixed: 'right', toolbar: '#notice-tool'}
]]
,page: true
,limit: 10
,height: 'full-220'
,text: '对不起,加载出现异常!'
});
//发站内通知信息
form.on('select(type)', function(data){
var tpl = '<div class="layui-col-md12">\
<label for="L_title" class="layui-form-label">收件人</label>\
<div class="layui-input-block">\
<input type="text" id="receve_id" name="receve_id" required lay-verify="required" autocomplete="off" class="layui-input" >\
</div>\
</div>';
//如果选择是用户追加收件人
if(data.value == 1){
$(this).parents('div .layui-col-md3').next('div').after(tpl);
}else{
$(this).parents('div .layui-col-md3').nextAll('div .layui-col-md12').remove();
}
});
//发布通知
form.on('submit(notice-add)', function(data){
var field = data.field;
console.log(field);
$.ajax({
type:"post",
url:"/admin/Notice/add",
data:field,
dataType:"json",
success:function (data){
if (data.code == 0) {
layer.msg(data.msg,{
icon:6,
time:2000
});
} else {
layer.open({
content:data.msg,
icon:5,
anim:6
});
}
}
});
table.reload('notice-list'); //数据刷新
return false;
});
//监听工具条
table.on('tool(notice-list)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.prompt({
formType: 1
,title: '敏感操作,请验证口令'
}, function(value, index){
layer.close(index);
layer.confirm('真的删除行么', function(index){
//obj.del();
$.ajax({
type:'post',
url:"/admin/Notice/delete",
data:{id:data.id},
dataType:'json',
success:function(data){
if(data.code == 0){
layer.msg(data.msg,{
icon:6,
time:2000
});
} else {
layer.open({
title:'删除失败',
content:data.msg,
icon:5,
adim:6
})
}
}
});
table.reload('notice-list');
layer.close(index);
});
});
} else if(obj.event === 'edit'){
var tr = $(obj.tr);
layer.open({
type: 2
,title: '编辑签到'
,content: '/admin/Notice/edit?id='+ data.id
,maxmin: true
,area: ['500px', '450px']
,btn: ['确定', '取消']
,yes: function(index, layero){
var iframeWindow = window['layui-layer-iframe'+ index]
,submitID = 'notice-edit'
,submit = layero.find('iframe').contents().find('#'+ submitID);
//监听提交
iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
var field = data.field; //获取提交的字段
//提交 Ajax 成功后,静态更新表格中的数据
$.ajax({
type:"post",
url:"/admin/Notice/edit",
data:{id:field.id,title:field.title,content:field.content,type:field.type},
daType:"json",
success:function (res){
if (res.code == 0) {
layer.msg(res.msg,{
icon:6,
time:2000
});
} else {
layer.open({
tiele:'修改失败',
content:res.msg,
icon:5,
anim:6
});
}
}
});
table.reload('notice-list'); //数据刷新
layer.close(index); //关闭弹层
});
submit.trigger('click');
}
,success: function(layero, index){
}
});
}
});
exports('appset', {})
});

View File

@ -308,7 +308,11 @@ layui.define(['laypage', 'fly', 'element', 'flow'], function(exports){
<ul class="mine-msg">\
{{# for(var i = 0; i < len; i++){ }}\
<li data-id="{{d.rows[i].id}}">\
<blockquote class="layui-elem-quote"><a href="/index/jump?name={{ d.rows[i].name}}" target="_blank"><cite>{{ d.rows[i].name}}</cite></a><a target="_blank" class="art-title" id-data="{{ d.rows[i].id}}" href="{{ d.rows[i].link}}"><cite>{{ d.rows[i].content}}</cite></a> <span class="float:right">{{ d.rows[i].read}}</span></blockquote>\
{{# if(d.rows[i].type == 1){ }}\
<blockquote class="layui-elem-quote"><a href="/index/jump?name={{ d.rows[i].name}}" target="_blank"><cite>{{ d.rows[i].name}}</cite></a><a target="_blank" class="art-title" id-data="{{ d.rows[i].id}}" href="{{ d.rows[i].link}}"><cite>{{ d.rows[i].title}}</cite></a> <span class="float:right">{{ d.rows[i].read}}</span></blockquote>\
{{# } else { }}\
<blockquote class="layui-elem-quote">系统消息<a class="sys-title" id-data="{{ d.rows[i].id}}" href="javascript:;"><cite>{{ d.rows[i].title}}</cite></a> <span class="float:right">{{ d.rows[i].read}}</span></blockquote>\
{{# } }}\
<p><span>{{d.rows[i].time}}</span><a href="javascript:;" class="layui-btn layui-btn-sm layui-btn-danger fly-delete"></a></p>\
</li>\
{{# } }}\

View File

@ -0,0 +1,68 @@
{extend name="public/base" /}
{block name="body"}
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-form layui-form-pane">
<div class="layui-tab layui-tab-brief" lay-filter="timeline">
<div class="layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
<div class="layui-tab-item layui-show">
<div class="layui-row layui-col-space15 layui-form-item">
<div class="layui-col-md3">
<label class="layui-form-label">发送类型</label>
<div class="layui-input-block">
<select lay-verify="required" name="type" lay-filter="type">
<option {if condition="$msg.type eq 0"} selected {/if} value="0">站内通知</option>
</select>
</div>
</div>
<div class="layui-col-md9">
<label for="L_title" class="layui-form-label">标题</label>
<div class="layui-input-block">
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" value="{$msg.title}">
</div>
</div>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea " >{$msg.content}</textarea>
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="text" name="id" class="layui-input" value="{$msg.id}">
</div>
<div class="layui-form-item layui-hide">
<button type="submit" class="layui-btn" lay-filter="notice-edit" lay-submit id="notice-edit">立即发布</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="js"}
<script>
layui.config({
base: '/static/admin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index','appset'],function(){
var $ = layui.jquery;
});
</script>
{/block}

View File

@ -0,0 +1,121 @@
{extend name="public/base" /}
{block name="body"}
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-form layui-form-pane">
<div class="layui-tab layui-tab-brief" lay-filter="timeline">
<div class="layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
<div class="layui-tab-item layui-show">
<div class="layui-row layui-col-space15 layui-form-item">
<div class="layui-col-md3">
<label class="layui-form-label">发送类型</label>
<div class="layui-input-block">
<select lay-verify="required" name="type" lay-filter="type">
<option value="0">站内通知</option>
<option value="1">用户通知</option>
</select>
</div>
</div>
<div class="layui-col-md9">
<label for="L_title" class="layui-form-label">标题</label>
<div class="layui-input-block">
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea "></textarea>
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn" lay-filter="notice-add" lay-submit id="notice-add">立即发布</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<table id="notice-list" lay-filter="notice-list"></table>
<script type="text/html" id="notice-tool">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
</script>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="js"}
<script>
layui.config({
base: '/static/admin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index','appset', 'layedit','form' ,'table'],function(){
var $ = layui.jquery
,layedit = layui.layedit
,table = layui.table
,form = layui.form;
/*
//发站内通知信息
form.on('select(type)', function(data){
var tpl = '<div class="layui-col-md12">\
<label for="L_title" class="layui-form-label">收件人</label>\
<div class="layui-input-block">\
<input type="text" id="receve_id" name="receve_id" required lay-verify="required" autocomplete="off" class="layui-input" >\
</div>\
</div>';
//如果选择是用户追加收件人
if(data.value == 1){
$(this).parents('div .layui-col-md3').next('div').after(tpl);
}else{
$(this).parents('div .layui-col-md3').nextAll('div .layui-col-md12').remove();
}
});
//发布通知
form.on('submit(notice-add)', function(data){
var field = data.field;
console.log(field);
$.ajax({
type:"post",
url:"{:url('Notice/add')}",
data:field,
dataType:"json",
success:function (data){
if (data.code == 0) {
layer.msg(data.msg,{
icon:6,
time:2000
});
} else {
layer.open({
content:data.msg,
icon:5,
anim:6
});
}
}
});
table.reload('notice-list'); //数据刷新
return false;
});
*/
});
</script>
{/block}

View File

@ -22,11 +22,10 @@
}).extend({
fly: 'index'
}).use('fly');
//
//点开标题写入帖子已读
$('#LAY_minemsg').on('click','.art-title', function(){
var id = $(this).attr('id-data');
var othis = $(this);
console.log(othis);
$.ajax({
type:"post",
url:"{:url('message/read')}",
@ -42,5 +41,32 @@
});
});
//点开标题写入系统信已读
$('#LAY_minemsg').on('click','.sys-title', function(){
var id = $(this).attr('id-data');
//var othis = $(this);
console.log(id);
$.ajax({
type:"post",
url:"{:url('message/read')}",
data:{"id":id},
daType:"json",
success:function (res){
if(res.status == 0){
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
area: ['420px', '240px'], //宽高
content: '<div class="layui-form" tyle="padding: 20px 30px 0 0;"> '+ res.content +'</div>'
});
//location.reload();
//othis.append('<span class="float:right">已读</span>');
}
}
});
});
</script>
{/block}