一、聊天消息表(普通消息,申请消息,群聊消息)

CREATE TABLE MSG_INFO (
MSG_Id INT PRIMARY KEY AUTO_INCREMENT, -- 消息标识
MSG_Type INT DEFAULT 0, -- 消息类型 0 普通消息 1、申请消息 , 2、群聊消息
MSG_GroupId INT DEFAULT 0, -- 分组id //可选用 User_Id INT DEFAULT 0, -- 发送申请的用户
User_Ided INT DEFAULT 0, -- 申请用户
MSG_Content LongText, -- 消息内容 MSG_State INT DEFAULT 0, -- 默认未读 消息类型 0 即已读,未读, 消息类型为 1 则 0未读 1是等待处理 2 同意 3拒绝
MSG_Updated datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间-消息撤销时间',
MSG_IsValid INT, -- 消息是否有效
MSG_Created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() -- 用户创建时间
)

二、我们要模拟从消息中查询申请消息

1、首选我们要可以注册

-- 分组
INSERT INTO SubGroup ( `SubG_GroupName`, `Acco_ID`, `SubG_Created`) VALUES ( '我的好友1', 7, '2019-09-30 10:17:42');
-- 注册好友 -- 好友表 -没有好友
INSERT INTO `Test`.`Friend` ( `User_Id`, `Frie_ById`, `Frie_Created`, `Acco_ID`) VALUES ('', '', '2019-09-30 10:15:42', '');
-- 用户和分组关系表 -也没有好友分组关系的
INSERT INTO `Test`.`User_SubGroup` ( `User_Id`, `SubG_ById`, `Acco_ID`, `UsSu_Created`) VALUES ( '', '', '', '2019-09-30 10:23:55'); SELECT
*
FROM
SubGroup AS a
LEFT JOIN User_SubGroup AS b ON a.SubG_ID = b.SubG_ById
LEFT JOIN Friend AS c ON b.User_Id = c.Frie_ById
LEFT JOIN Users AS d ON d.User_Id = c.Frie_ById
WHERE
a.Acco_ID=12

注册代码:

    public class RegisterController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public async Task<IActionResult> AddUser([FromForm(Name = "file")] IFormFile file, string name, string password)
{
DbContext db = new DbContext(); Users user = db.Db.Queryable<Users>().Where(p => p.UserName == name).First();
//T_AccountModel userAccount = db.Db.Context..FirstOrDefault(t => t.UserName == Account);
if (user != null)
{
return Json(new { State = false, Code = , Msg = "该用户名已被注册!", Time = DateTime.Now.ToString() });
}
//图片上传
string date = DateTime.Now.ToString("yyyy-MM-dd");
string url = "/Upload/" + date + "/";
string path = Path.Combine(Environment.CurrentDirectory, "Upload", date);
if (!System.IO.Directory.Exists(path))//判断上传路径是否存在
{
System.IO.Directory.CreateDirectory(path);
}
string filePath = string.Empty;
string fileName = string.Empty;
if (file.Length > )
{
string fileFormat = System.IO.Path.GetExtension(file.FileName);//获取文件后缀格式
fileName = Guid.NewGuid().ToString("n") + fileFormat;
filePath = Path.Combine(path, fileName);//中间处理为唯一格式文件
url = url + fileName;
using (var stream = new FileStream(filePath, FileMode.Create))
{
try
{
//保存文件
await file.CopyToAsync(stream);
}
catch (Exception ex)
{
return Json(new { State = false, Code = , Msg = "文件保存失败!", Time = DateTime.Now.ToString() });
}
}
}
//return Json(new { Status = 1, Message = "保存成功" });
Users userModel = new Users
{
UserName = name,
PassWord = password,
Avatar = url
};
int userId = db.Db.Insertable(userModel).ExecuteReturnIdentity();//insert
if (userId != )
{
SubGroup subGroup = new SubGroup
{
Groupname = "我的好友",
Acco_ID = userId,
};
int res = db.Db.Insertable(subGroup).ExecuteReturnIdentity();//insert
if (res != )
{
return Json(new { State = true, Code = , Msg = "用户注册成功!", Time = DateTime.Now.ToString() });
}
else
{
return Json(new { State = false, Code = , Msg = "用户注册失败!", Time = DateTime.Now.ToString() });
}
//https://www.cnblogs.com/ZaraNet/p/9988180.html }
else
{
return Json(new { State = false, Code = , Msg = "用户注册失败!", Time = DateTime.Now.ToString() });
}
//
}
}

html

@{
Layout = null;
}
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>注册中心</title>
<!-- Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.bootcss.com/normalize/8.0.1/normalize.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="~/lib/upload.js"></script>
<script src="https://cdn.bootcss.com/layer/2.3/layer.js"></script>
<style>
/*web background*/
.container {
display: table;
height: %;
}
.row {
display: table-cell;
vertical-align: middle;
}
/* centered columns styles */
.row-centered {
text-align: center;
}
.col-centered {
display: inline-block;
float: none;
text-align: left;
margin-right: -4px;
}
</style>
</head> <body>
<div class="container">
<div class="row row-centered">
<div class="well col-md-4 col-xs-8 col-sm-7 col-centered">
<h2 style="text-align:center;padding-bottom:30px;">用户注册</h2>
<div action="/login" method="post" role="form">
<div class="input-group input-group-md form-group" style="margin:20px auto">
<div id="drop_area" ></div>
</div>
<div class="input-group input-group-md form-group">
<span class="input-group-addon" id="sizing-addon1"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>
<input type="text" class="form-control" id="name" placeholder="请输入用户名" />
</div>
<div class="input-group input-group-md form-group">
<span class="input-group-addon" id="sizing-addon1"><i class="glyphicon glyphicon-lock"></i></span>
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码" />
</div>
<br />
<button type="submit" class="btn btn-info btn-block">登录</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var files;
$(function () {
var dragImgUpload = new DragImgUpload("#drop_area", {
callback: function (ele) {
//回调函数,可以传递给后台等等
files = ele[];
//console.log(file.name);
}
})
$('.btn-block').click(function () {
if (!files) {
layer.msg('请上传图片');
return ;
}
if ($('#name').val() == "") {
layer.msg('请输入用户名');
return;
}
if ($('#password').val() == "") {
layer.msg('请输入密码');
return;
}
var formData = new FormData();
formData.append("name", $('#name').val());
formData.append("password", $('#password').val());
formData.append("file", files); $.ajax({
url: '/Register/AddUser',
type: 'post',
timeout: ,
contentType: false,
enctype: 'multipart/form-data',
//告诉jQuery不要去设置Content-Type请求头
processData: false,
//告诉jQuery不要去处理发送的数据
data: formData,
success: function (data) {
console.log(data)
if (data.state || data.code == ) {
window.location.href = '@Url.Action("Index", "Login")';
} else {
//console.log("登陆异常!" + data)
layer.msg(data.msg);
}
},
fail: function (err, status) {
console.log("请求失败!" + err)
}, error: function (err) {
console.log("请求异常!"+err)
}
});
});
});
</script>
</body>
</html>

消息盒子-我们要从数据库的拿到消息盒子所以signalr要配合数据查询

因为前端调用Signalr内方法,所以在signalr 内写数据库操作。反之不能(想都不要想,不可以,难道控制器ajax请求触发推送消息吗,哪怕是个别的,我都有Signalr了。)

解决办法:(从项目model拿到创建一个DbHelper类库内,提供项目调用和Signalr调用,解决类库调用项目出现的依赖冲突。)

消息盒子和消息列表的问题:

消息盒子用Signalr从数据库读取(1、解决多个端的问题。2、不用ajax单独获取是否了 第二次 第三次的推送,不如直接一开始就用Signalr 是否有消息)

消息状态:0未读 1已读 2同意 3拒绝

A发送申请通知,又发一次通知,B点击之前第一个好友请求

针对第二种情况(单一用户多请求、获取请求添加列表不获取发送请求列表):A展示以及显示:-一开始分页获取所有用户请求,根据请求操作状态展示。

拿到数据 渲后前端判断如果0 则请求将拿到的后台数据更改已读,

然后点,同意则前端自动处理 该用户其他变灰,后台设置该用户其他所有请求无效,无效则灰色

点击拒绝 ,等价 前端数据该用的数据变灰,请求到后台更改这个消息为3拒绝,并且所有信息为灰色,即不可点击

多端的情况:

但是如果单户多端,则是点击该用户也要通知下自己放一个监听即可。仅通知更改状态,第二种情况,A户多端有一条,b户多端也有多条,就要a 添加 更改,就要更改与这个相关信息b端的所有相互的请求通知,并通知那个用户b页面则消息无效即可。b页面接受消息仅更改a用户请求通知的信息状态(a点击通知后台已经把这个全部改了)哪怕b从刷新也没关系。所以 a添加的时候 ,更改本页面,也要更改a的其他页面(signalr过滤本标志即可省力),并通知b其他页面,这个信息,区别是 ab是同一个监听是处理的 ,后台根据 a的id b的id 遍历发送 a的id参数 id 即可b的页面id即可

其实做的就是四步骤:

1、页面根据申请状态渲染

2、申请列表点击操作的时候,更改状态。

3、2步骤点击后,后台处理该用户所有消息为失效。并且设置该消息为操作的状态。

4、2步骤点击后,页面将该用户设置失效,并且通知B用户状态。

(具体这里A可以一直申请好友通知信息,比如B点击同意,B后台此A与B的好友请求全部失效,并更改此消息状态为2,通知用户标识为A的用户更改-为了单户多端)

(然后继续通知操作的那个用户B,更改B页面的B与A的好友为失效状态)

这里未作申请消息处理日志以及我的申请没法查看,只可以查看别人申请给你的信息,你点击同意的,就直接添加到好友。

  

四、续绑定SignaIR的用户管理-(添加好友和消息盒子)的更多相关文章

  1. 四、绑定SignaIR的用户管理

    一.用户分组(第一个默认我的好友,禁删和更改) 没有分组id,更改layim代码: 更改id即可. layui.define('jquery', function (exports) { " ...

  2. Easyradius 1.699更新,增加用户设备绑定、桥接用户管理功能

    最近几天,由于IDC机房设备的问题,导致OA连接3天一天挂2次,真是把我抑闷着,最事一个烦事特别多 好不容易等了一个五一假期,也不得空,把最近一些网友反馈的OA的一些功能及BUG进行修复,主要是以下几 ...

  3. (四)图数据neo4j用户管理

    1.用户管理 neo4j可通过内置函数,进行用户的创建.查看.删除. (1)用户创建; CALL dbms.security.createUser(name,password,requridchang ...

  4. 笔记:安装VM Tools、vim编辑器、压缩包、Linux用户管理

    一.VM Tools安装 1.作用:方便我们在虚拟机和宿主机之间复制数据或移动文件等. 2.安装步骤: step1:在菜单栏找到虚拟机---->找到安装vm tools ,点击: step2:进 ...

  5. asp.net微信开发第四篇----已关注用户管理

    公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过 ...

  6. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现)

    “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现) 一.前三篇的内容是否对您有帮助呢?如果有的话,请您继续关注这篇吧,这篇主要是实现”用户管理“的 ...

  7. 四、oracle 用户管理(Profile)

    oracle 用户管理 :profile + tablespace + role + user  一.使用profile管理用户口令概述:profile是口令限制,资源限制的命令集合,当建立数据库时, ...

  8. Zabbix (四)用户管理

    本文章主要介绍zabbix用户管理,包括用户增删改查.用户报警媒介管理.用户权限管理 安装完zabbix后,系统会自带两个用户,分别为:Admin和Guests 一.超级管理员 zabbix安装完成后 ...

  9. Cockroachdb 四、用户管理及授权

    四 用户管理及授权 用户管理 简介# Create a user:cockroach user set <username> <flags> # List all users: ...

随机推荐

  1. php GD库简单使用和封装

    GD库创建图像步骤 <?php //1.创建画布 $width = 300; $height= 200; $image=imagecreatetruecolor($width,$height); ...

  2. Http协议:客户端提交数据给服务端和从服务端获得数据,像WebView也是向百度的服务端发出一条Http请求,服务端返回HTML页面,客户端(浏览器)解析后展示出页面

    提交数据和获得数据的方式有很多,这里介绍一种,使用HttpURLConnection来向服务器提交数据或者获得数据. 获得数据: //传入网址,获得请求网页数据(XML文件数据或JSON文件数据) p ...

  3. hdu5988(费用流,对数相乘做加法)

    题意:一个网络流的图,有n个点,从1~n,然后m条边,每个点有两个值,一个是人的数量si一个是饭的数量bi.每条m边有容量ci,还有走上去可能踩断电线的概率pi(第一次踩上去没有事,之后都要p概率). ...

  4. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)G GCD Guessing Game

    G: 要你去才Paul的年龄,Paul的年龄在1~n之间,你每猜一个Paul会告诉你,你猜的这个数和他年龄的gcd,问在最坏情况下最少要猜多少次. 题解: 什么是最坏情况,我们直到如果他的年龄是1的话 ...

  5. GoldenGate—AUTORESTART配置

    AUTORESTART Valid For Manager Description Use the AUTORESTART parameter to start one or more Extract ...

  6. 【洛谷P2016战略游戏】

    树形dp的经典例题 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的 ...

  7. 异步分发任务celery

    Celery简介 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单. celery适用异步处理问题,当遇到发送邮件.或者文件上传, 图像处理等等一些比较耗时的 ...

  8. import 和组件库按需引入

    概述 今天查资料查到了一些有趣的东西,记录下来,供以后开发时参考,相信对其他人也有用. 参考资料: import.require.export.module.exports 混合使用详解 从 impo ...

  9. Failed building wheel for netifaces

    目录 文章目录 目录 问题 解决 问题 安装 OpenStackClient 的时候发现问题: Failed building wheel for netifaces Running setup.py ...

  10. Gradle原理动画讲解(五)

    Gradle原理动画讲解