四、续绑定SignaIR的用户管理-(添加好友和消息盒子)
一、聊天消息表(普通消息,申请消息,群聊消息)
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的用户管理-(添加好友和消息盒子)的更多相关文章
- 四、绑定SignaIR的用户管理
一.用户分组(第一个默认我的好友,禁删和更改) 没有分组id,更改layim代码: 更改id即可. layui.define('jquery', function (exports) { " ...
- Easyradius 1.699更新,增加用户设备绑定、桥接用户管理功能
最近几天,由于IDC机房设备的问题,导致OA连接3天一天挂2次,真是把我抑闷着,最事一个烦事特别多 好不容易等了一个五一假期,也不得空,把最近一些网友反馈的OA的一些功能及BUG进行修复,主要是以下几 ...
- (四)图数据neo4j用户管理
1.用户管理 neo4j可通过内置函数,进行用户的创建.查看.删除. (1)用户创建; CALL dbms.security.createUser(name,password,requridchang ...
- 笔记:安装VM Tools、vim编辑器、压缩包、Linux用户管理
一.VM Tools安装 1.作用:方便我们在虚拟机和宿主机之间复制数据或移动文件等. 2.安装步骤: step1:在菜单栏找到虚拟机---->找到安装vm tools ,点击: step2:进 ...
- asp.net微信开发第四篇----已关注用户管理
公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过 ...
- “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现)
“MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现) 一.前三篇的内容是否对您有帮助呢?如果有的话,请您继续关注这篇吧,这篇主要是实现”用户管理“的 ...
- 四、oracle 用户管理(Profile)
oracle 用户管理 :profile + tablespace + role + user 一.使用profile管理用户口令概述:profile是口令限制,资源限制的命令集合,当建立数据库时, ...
- Zabbix (四)用户管理
本文章主要介绍zabbix用户管理,包括用户增删改查.用户报警媒介管理.用户权限管理 安装完zabbix后,系统会自带两个用户,分别为:Admin和Guests 一.超级管理员 zabbix安装完成后 ...
- Cockroachdb 四、用户管理及授权
四 用户管理及授权 用户管理 简介# Create a user:cockroach user set <username> <flags> # List all users: ...
随机推荐
- Ajax监测开始执行及结束执行
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- Mysql锁表问题解决过程
开发中难免会遇到数据库操作锁表问题,这里说下解决过程,算是记录了. show OPEN TABLES where In_use > 0; 查看哪些表被锁了 show processlist 查看 ...
- SecureCRT通过密钥登录
转载 https://blog.csdn.net/langkeziju/article/details/53024031 说明:一般的密码方式登录容易被密码暴力破解.所以一般我们会将 SSH 的端口 ...
- JavaScript-Load-Image
如何将图片显示为canvas https://github.com/blueimp/JavaScript-Load-Image/blob/master/js/load-image-scale.js h ...
- nodejs 文件操作
前言: nodejs 自带的文件操作的模块 fs 就是对文件的增删查改: 就像我们用的服务器,我们没有办法在运行的文件上进行一直的修改,因为他不向浏览器,刷新后我们的文件会自己修改: 如果想要更改我 ...
- 线性时间求取第 K 大数
求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 \(O(nlogK)\).借助于分治思想,以及快速排序的区间划分,我们可以做到 \(O(n)\) 时间复杂度.具体算法 ...
- python - from … import …
from . import XXX 默认的就是在当前程序所在文件夹里__init__.py程序中导入XXX from .A import XXX 如果当前程序所在文件夹里没有 ...
- virtualbox压缩虚拟机硬盘文件vhd
命令如下: VBoxManage modifyhd D:\pc1\pc1.vhd --compact 当提示以下内容时,将整个虚拟机文件夹拷贝盘符根目录下,将[D:\pc1\pc1.vhd]改为相应 ...
- gts测试流程
测试目的: 用于检测你做的Android gms包是否满足兼容性要求,通俗点说,gms包,就是Google自己的apk,提供基础服务,例如YouTube.playstore等. 测试前提: 1.发货u ...
- 使用Sklearn构建朴素贝叶斯分类器-新闻分类
# -*- coding: UTF-8 -*- import jieba import os import random from sklearn.naive_bayes import Multino ...