Commit e1c6451e authored by liudong1993's avatar liudong1993

解决冲突

parents eb7bba50 88263164
...@@ -88,7 +88,7 @@ namespace Edu.Cache.User ...@@ -88,7 +88,7 @@ namespace Edu.Cache.User
/// <param name="Id">账号Id</param> /// <param name="Id">账号Id</param>
/// <param name="apiRequestFromEnum">请求来源</param> /// <param name="apiRequestFromEnum">请求来源</param>
/// <returns></returns> /// <returns></returns>
public static AppStudentInfo GetUserLoginInfo(object Id, ApiRequestFromEnum apiRequestFromEnum= ApiRequestFromEnum.AppStudent) public static AppStudentInfo GetUserLoginInfo(object Id, ApiRequestFromEnum apiRequestFromEnum = ApiRequestFromEnum.AppStudent)
{ {
AppStudentInfo userInfo = null; AppStudentInfo userInfo = null;
if (Id != null) if (Id != null)
...@@ -100,7 +100,7 @@ namespace Edu.Cache.User ...@@ -100,7 +100,7 @@ namespace Edu.Cache.User
} }
catch (Exception ex) catch (Exception ex)
{ {
Common.Plugin.LogHelper.Write(ex, "GetUserLoginInfo"); Common.Plugin.LogHelper.Write(ex, "GetUserLoginInfo");
} }
if (userInfo == null) if (userInfo == null)
{ {
...@@ -136,5 +136,111 @@ namespace Edu.Cache.User ...@@ -136,5 +136,111 @@ namespace Edu.Cache.User
} }
return userInfo; return userInfo;
} }
#region 账户密码登录的时候连续5次密码错误冻结账户10分钟
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="model"></param>
public static void StudentFrozenSet(string cacheKey, AppStudentInfo model, int JwtExpirTime)
{
try
{
TimeSpan ts = GetExpirTime(JwtExpirTime);
redis.StringSet<AppStudentInfo>(cacheKey, model, ts);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "StudentFrozenSet缓存设置失败");
}
}
/// <summary>
/// 获取用户登录信息
/// </summary>
/// <param name="Id">账号Id</param>
/// <param name="apiRequestFromEnum">请求来源</param>
/// <returns></returns>
public static AppStudentInfo GetStudentFrozen(object Id, ApiRequestFromEnum apiRequestFromEnum = ApiRequestFromEnum.AppStudent)
{
AppStudentInfo userInfo = null;
if (Id != null)
{
string cacheKey = Cache.CacheKey.Student_Frozen_Key + Id.ToString();
try
{
userInfo = redis.StringGet<AppStudentInfo>(cacheKey);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "GetStudentFrozen");
}
if (userInfo == null)
{
userInfo = new AppStudentInfo();
}
}
else
{
userInfo = new AppStudentInfo();
}
return userInfo;
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="model"></param>
public static void StudentErrorLoginSet(string cacheKey, AppStudentLoginError model, int JwtExpirTime)
{
try
{
TimeSpan ts = GetExpirTime(JwtExpirTime);
redis.StringSet<AppStudentLoginError>(cacheKey, model, ts);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "StudentErrorLoginSet缓存设置失败");
}
}
/// <summary>
/// 获取用户登录信息
/// </summary>
/// <param name="Id">账号Id</param>
/// <param name="apiRequestFromEnum">请求来源</param>
/// <returns></returns>
public static AppStudentLoginError GetStudentErrorLogin(object Id, ApiRequestFromEnum apiRequestFromEnum = ApiRequestFromEnum.AppStudent)
{
AppStudentLoginError userInfo = null;
if (Id != null)
{
string cacheKey = Cache.CacheKey.Student_ErrorLogin_Key + Id.ToString();
try
{
userInfo = redis.StringGet<AppStudentLoginError>(cacheKey);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "GetStudentErrorLogin");
}
if (userInfo == null)
{
userInfo = new AppStudentLoginError();
}
}
else
{
userInfo = new AppStudentLoginError();
}
return userInfo;
}
#endregion
} }
} }
\ No newline at end of file
...@@ -24,6 +24,18 @@ namespace Edu.Cache ...@@ -24,6 +24,18 @@ namespace Edu.Cache
public static string MsgStudent_Send_Code_List = "Msg_Student_Code_List_"; public static string MsgStudent_Send_Code_List = "Msg_Student_Code_List_";
/// <summary>
/// 学生登录错误缓存Key
/// </summary>
public static string Student_ErrorLogin_Key = "Edu_Student_ErrorLogin_";
/// <summary>
/// 学生冻结key
/// </summary>
public static string Student_Frozen_Key = "Edu_Student_Frozen_";
} }
} }
...@@ -436,5 +436,17 @@ namespace Edu.Common ...@@ -436,5 +436,17 @@ namespace Edu.Common
return ReadConfigKey("ContractDefaultTitle"); return ReadConfigKey("ContractDefaultTitle");
} }
} }
/// <summary>
/// 是否推送消息
/// </summary>
public static int IsPushMessage
{
get
{
int.TryParse(ReadConfigKey("IsPushMessage"), out int IsPushMessage);
return IsPushMessage;
}
}
} }
} }
\ No newline at end of file
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.8" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.8" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NPOI" Version="2.5.1" /> <PackageReference Include="NPOI" Version="2.5.1" />
<PackageReference Include="RabbitMQ.Client" Version="5.1.2" />
<PackageReference Include="Spire.Doc" Version="8.12.14" /> <PackageReference Include="Spire.Doc" Version="8.12.14" />
</ItemGroup> </ItemGroup>
......
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.Message
{
/// <summary>
/// 消息发送
/// </summary>
public class MessageHelper
{
/// <summary>
/// 获取连接
/// </summary>
/// <param name="rabbitConfig">连接配置实体</param>
/// <returns></returns>
private static ConnectionFactory GetConnectionFactory(RabbitConfig rabbitConfig)
{
ConnectionFactory factory = new ConnectionFactory
{
HostName = rabbitConfig.HostName,
//默认端口
Port = rabbitConfig.Port,
UserName = rabbitConfig.UserName,
Password = rabbitConfig.Password,
};
return factory;
}
/// <summary>
/// 发送信息
/// </summary>
/// <param name="message"></param>
public static void SendMessage(PushMessageModel message)
{
Int32.TryParse(Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Port"), out int Port);
RabbitConfig rabbitConfig = new RabbitConfig()
{
HostName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "HostName"),
Password = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Password"),
Port = Port,
UserName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "UserName"),
QueenName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "QueenName"),
};
var obj = new
{
Id = 0,// 主键
message.Title,
message.Content,
message.CoverImg,
message.CategoryId,
message.Platform,
message.SendType,
message.SendTime,
message.ReceiveId,
message.JumpUrl,
message.CreateByName,
message.MsgSign,
message.MsgTemplateCode,
Status = 0,
CreateTime = DateTime.Now,
AppId = Common.Config.ReadConfigKey("PushAppId"),
};
using (IConnection conn = GetConnectionFactory(rabbitConfig).CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare(rabbitConfig.QueenName, true, false, false, null);
byte[] buffer = Encoding.UTF8.GetBytes(Common.Plugin.JsonHelper.Serialize(obj));
IBasicProperties properties = channel.CreateBasicProperties();
properties.DeliveryMode = 2;
channel.BasicPublish("", rabbitConfig.QueenName, properties, buffer);
}
}
}
/// <summary>
/// 批量推送
/// </summary>
/// <param name="msgList"></param>
public static void SendMessage(List<PushMessageModel> msgList)
{
foreach (var item in msgList)
{
SendMessage(item);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.Message
{
/// <summary>
/// 消息推送实体
/// </summary>
public class PushMessageModel
{
/// <summary>
/// 推送标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 推送内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 封面图
/// </summary>
public string CoverImg { get; set; }
/// <summary>
/// 所属分类
/// </summary>
public int CategoryId { get; set; }
/// <summary>
/// 推送平台[1-手机端,2-Web端,3-短信,4-邮件]
/// </summary>
public int Platform { get; set; }
/// <summary>
/// 推送类型(0-立即推送,1-指定时间推送)
/// </summary>
public int SendType { get; set; }
/// <summary>
/// 推送时间
/// </summary>
public DateTime SendTime { get; set; }
/// <summary>
/// 接收人员
/// </summary>
public string ReceiveId { get; set; }
/// <summary>
/// 跳转地址
/// </summary>
public string JumpUrl { get; set; }
/// <summary>
/// 创建人姓名
/// </summary>
public string CreateByName { get; set; }
/// <summary>
/// 短信模板代码
/// </summary>
public string MsgTemplateCode { get; set; }
/// <summary>
/// 短信签名
/// </summary>
public string MsgSign { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.Message
{
/// <summary>
/// 消息队列配置文件
/// </summary>
public class RabbitConfig
{
/// <summary>
/// 主机名:ip地址
/// </summary>
public string HostName { get; set; }
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; }
/// <summary>
/// 队列名称
/// </summary>
public string QueenName { get; set; }
}
}
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
"Microsoft.Extensions.Configuration.Json": "3.1.8", "Microsoft.Extensions.Configuration.Json": "3.1.8",
"NPOI": "2.5.1", "NPOI": "2.5.1",
"Newtonsoft.Json": "12.0.3", "Newtonsoft.Json": "12.0.3",
"RabbitMQ.Client": "5.1.2",
"Spire.Doc": "8.12.14" "Spire.Doc": "8.12.14"
}, },
"runtime": { "runtime": {
...@@ -519,6 +520,14 @@ ...@@ -519,6 +520,14 @@
} }
} }
}, },
"RabbitMQ.Client/5.1.2": {
"runtime": {
"lib/netstandard2.0/RabbitMQ.Client.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.1.2.0"
}
}
},
"runtime.native.System/4.0.0": { "runtime.native.System/4.0.0": {
"dependencies": { "dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0", "Microsoft.NETCore.Platforms": "2.0.0",
...@@ -1272,6 +1281,13 @@ ...@@ -1272,6 +1281,13 @@
"path": "portable.bouncycastle/1.8.6", "path": "portable.bouncycastle/1.8.6",
"hashPath": "portable.bouncycastle.1.8.6.nupkg.sha512" "hashPath": "portable.bouncycastle.1.8.6.nupkg.sha512"
}, },
"RabbitMQ.Client/5.1.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Xhj+un0pw4N7h37SZWptxl/NEv7f1RLHwZhXjqzkCm3w3IdbFJh+HjVyPaciD848BUYLGoEQzadx90nShsbs4Q==",
"path": "rabbitmq.client/5.1.2",
"hashPath": "rabbitmq.client.5.1.2.nupkg.sha512"
},
"runtime.native.System/4.0.0": { "runtime.native.System/4.0.0": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
"Microsoft.Extensions.Configuration.Json": "3.1.8", "Microsoft.Extensions.Configuration.Json": "3.1.8",
"NPOI": "2.5.1", "NPOI": "2.5.1",
"Newtonsoft.Json": "12.0.3", "Newtonsoft.Json": "12.0.3",
"RabbitMQ.Client": "5.1.2",
"Spire.Doc": "8.12.14" "Spire.Doc": "8.12.14"
}, },
"runtime": { "runtime": {
...@@ -519,6 +520,14 @@ ...@@ -519,6 +520,14 @@
} }
} }
}, },
"RabbitMQ.Client/5.1.2": {
"runtime": {
"lib/netstandard2.0/RabbitMQ.Client.dll": {
"assemblyVersion": "5.0.0.0",
"fileVersion": "5.1.2.0"
}
}
},
"runtime.native.System/4.0.0": { "runtime.native.System/4.0.0": {
"dependencies": { "dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0", "Microsoft.NETCore.Platforms": "2.0.0",
...@@ -1272,6 +1281,13 @@ ...@@ -1272,6 +1281,13 @@
"path": "portable.bouncycastle/1.8.6", "path": "portable.bouncycastle/1.8.6",
"hashPath": "portable.bouncycastle.1.8.6.nupkg.sha512" "hashPath": "portable.bouncycastle.1.8.6.nupkg.sha512"
}, },
"RabbitMQ.Client/5.1.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Xhj+un0pw4N7h37SZWptxl/NEv7f1RLHwZhXjqzkCm3w3IdbFJh+HjVyPaciD848BUYLGoEQzadx90nShsbs4Q==",
"path": "rabbitmq.client/5.1.2",
"hashPath": "rabbitmq.client.5.1.2.nupkg.sha512"
},
"runtime.native.System/4.0.0": { "runtime.native.System/4.0.0": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
......
{ {
"ConnectionStrings": { "ConnectionStrings": {
//"DefaultConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ", //"DefaultConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
//"DefaultConnectionPName": "MySql.Data.MySqlClient", //"DefaultConnectionPName": "MySql.Data.MySqlClient",
//"FinanceConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ", //"FinanceConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ",
//"FinanceConnectionPName": "MySql.Data.MySqlClient", //"FinanceConnectionPName": "MySql.Data.MySqlClient",
//"DataStatisticsConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ", //"DataStatisticsConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ",
//"DataStatisticsConnectionPName": "MySql.Data.MySqlClient" //"DataStatisticsConnectionPName": "MySql.Data.MySqlClient"
"DefaultConnection": "server=rm-bp1tj77h6kp0d02fb.mysql.rds.aliyuncs.com;user id=reborn;password=Reborn@2018;database=uat_reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ", "DefaultConnection": "server=rm-bp1tj77h6kp0d02fb.mysql.rds.aliyuncs.com;user id=reborn;password=Reborn@2018;database=uat_reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient", "DefaultConnectionPName": "MySql.Data.MySqlClient",
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"IsSendMsg": 2, "IsSendMsg": 2,
"AllowedHosts": "*", "AllowedHosts": "*",
"OpenValidation": "False", "OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.214:8120", "UploadSiteUrl": "http://192.168.20.214:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com", "ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"ErpViewFileSiteUrl": "http://imgfile.oytour.com", "ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017", "Mongo": "mongodb://47.96.25.130:27017",
......
...@@ -62,7 +62,7 @@ namespace Edu.Model.CacheModel ...@@ -62,7 +62,7 @@ namespace Edu.Model.CacheModel
/// </summary> /// </summary>
public string Token { get; set; } public string Token { get; set; }
/// <summary> /// <summary>
/// 集团Logo /// 集团Logo
...@@ -81,5 +81,40 @@ namespace Edu.Model.CacheModel ...@@ -81,5 +81,40 @@ namespace Edu.Model.CacheModel
public object UploadConfig { get; set; } public object UploadConfig { get; set; }
public int ActivationStatus { get; set; } public int ActivationStatus { get; set; }
/// <summary>
/// 是否冻结,1-是
/// </summary>
public int IsFrozen { get; set; }
}
public class AppStudentLoginError
{
/// <summary>
/// 账号编号
/// </summary>
public int Id { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 学校编号
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 错误数
/// </summary>
public int ErrorNum { get; set; }
/// <summary>
/// 最近一次错误时间
/// </summary>
public System.DateTime? ErrorTime { get; set; }
} }
} }
\ No newline at end of file
...@@ -129,5 +129,12 @@ namespace Edu.Model.CacheModel ...@@ -129,5 +129,12 @@ namespace Edu.Model.CacheModel
public int ActivationStatus { get; set; } public int ActivationStatus { get; set; }
/// <summary>
/// 班级信息
/// </summary>
public object ClassInfo { get; set; }
} }
} }
\ No newline at end of file
...@@ -62,8 +62,11 @@ namespace Edu.Model.Entity.Course ...@@ -62,8 +62,11 @@ namespace Edu.Model.Entity.Course
/// </summary> /// </summary>
public int CheckStatus { get; set; } public int CheckStatus { get; set; }
/// <summary>
/// 学习分钟数(单位:分钟)
/// </summary>
public int StudyNum { get; set; }
/// <summary> /// <summary>
/// 创建人 /// 创建人
/// </summary> /// </summary>
......
...@@ -21,6 +21,11 @@ namespace Edu.Model.Entity.Course ...@@ -21,6 +21,11 @@ namespace Edu.Model.Entity.Course
/// </summary> /// </summary>
public string RoomName { get; set; } public string RoomName { get; set; }
public int SeatNum { get; set; }
public string RoomPic { get; set; }
/// <summary> /// <summary>
/// 集团编号 /// 集团编号
/// </summary> /// </summary>
...@@ -55,5 +60,6 @@ namespace Edu.Model.Entity.Course ...@@ -55,5 +60,6 @@ namespace Edu.Model.Entity.Course
/// 更新时间 /// 更新时间
/// </summary> /// </summary>
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
} }
} }
...@@ -10,39 +10,56 @@ namespace Edu.Model.Entity.Course ...@@ -10,39 +10,56 @@ namespace Edu.Model.Entity.Course
[DB(ConnectionName = "DefaultConnection")] [DB(ConnectionName = "DefaultConnection")]
public class RB_Class_Time public class RB_Class_Time
{ {
/// <summary> /// <summary>
/// 上课时间编号 /// 上课时间编号
/// </summary> /// </summary>
public int ClassTimeId { get; set; } public int ClassTimeId { get; set; }
/// <summary> /// <summary>
/// 班级编号 /// 班级编号
/// </summary> /// </summary>
public int ClassId { get; set; } public int ClassId { get; set; }
/// <summary> /// <summary>
/// 上课计划编号 /// 上课计划编号
/// </summary> /// </summary>
public int ClassPlanId { get; set; } public int ClassPlanId { get; set; }
/// <summary> /// <summary>
/// 上课开始时间 /// 上课开始时间
/// </summary> /// </summary>
public string StartTime { get; set; } public string StartTime { get; set; }
/// <summary> /// <summary>
/// 上课结束时间 /// 上课结束时间
/// </summary> /// </summary>
public string EndTime { get; set; } public string EndTime { get; set; }
/// <summary> /// <summary>
/// 集团编号 /// 集团编号
/// </summary> /// </summary>
public int Group_Id { get; set; } public int Group_Id { get; set; }
/// <summary> /// <summary>
/// 学校编号 /// 学校编号
/// </summary> /// </summary>
public int School_Id { get; set; } public int School_Id { get; set; }
}
/// <summary>
/// 上课状态0-待上课,1-上课中,2-下课
/// </summary>
public int ClassStatus { get; set; }
/// <summary>
/// 课堂随拍图片
/// </summary>
public string SuiPai { get; set; }
/// <summary>
/// 课堂视频
/// </summary>
public string VideoUrl { get; set; }
}
} }
...@@ -21,6 +21,7 @@ namespace Edu.Model.ViewModel.Course ...@@ -21,6 +21,7 @@ namespace Edu.Model.ViewModel.Course
/// ids /// ids
/// </summary> /// </summary>
public string Q_ClassIds { get; set; } public string Q_ClassIds { get; set; }
/// <summary> /// <summary>
/// 签到统计 /// 签到统计
/// </summary> /// </summary>
...@@ -30,5 +31,9 @@ namespace Edu.Model.ViewModel.Course ...@@ -30,5 +31,9 @@ namespace Edu.Model.ViewModel.Course
/// 已上课分钟数 /// 已上课分钟数
/// </summary> /// </summary>
public int MinutesNum { get; set; } public int MinutesNum { get; set; }
/// 学员名称
/// </summary>
public string GuestName { get; set; }
} }
} }
using Edu.Common.Plugin; using System.Collections.Generic;
using Edu.Common.Plugin;
using Edu.Model.Entity.Course; using Edu.Model.Entity.Course;
namespace Edu.Model.ViewModel.Course namespace Edu.Model.ViewModel.Course
...@@ -42,5 +43,10 @@ namespace Edu.Model.ViewModel.Course ...@@ -42,5 +43,10 @@ namespace Edu.Model.ViewModel.Course
/// 教室编号【查询使用】 /// 教室编号【查询使用】
/// </summary> /// </summary>
public string QRoomIds { get; set; } public string QRoomIds { get; set; }
/// <summary>
/// 教室图片
/// </summary>
public List<string> RoomPicList { get; set; }
} }
} }
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.Course
{
public class RB_Class_Time_Extend
{
/// <summary>
/// 老师名称
/// </summary>
public string TeacherName { get; set; }
/// <summary>
/// 老师头像
/// </summary>
public string TeacherIcon { get; set; }
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 课程名称
/// </summary>
public string CourseName { get; set; }
/// <summary>
/// 第几课
/// </summary>
public string CourseNum { get; set; }
/// <summary>
/// 计划id
/// </summary>
public int ClassPlanId { get; set; }
/// <summary>
/// 班级id
/// </summary>
public int ClassId { get; set; }
/// <summary>
/// 教室id
/// </summary>
public int ClassRoomId { get; set; }
/// <summary>
/// 集团
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 学校
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 老师id
/// </summary>
public int TeacherId { get; set; }
/// <summary>
/// 上课时间id
/// </summary>
public int ClassTimeId { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public string StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string EndTime { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? NewPlanDateTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? NewEndPlanDateTime { get; set; }
/// <summary>
/// 课时
/// </summary>
public int ClassHours { get; set; }
/// <summary>
/// 备课id
/// </summary>
public int LessonPlanId { get; set; }
public string SuiPai { get; set; }
/// <summary>
/// 上课状态0-待上课,1-上课中,2-下课
/// </summary>
public int ClassStatus { get; set; }
}
}
using Edu.Model.Entity.Course; using System.Collections.Generic;
using Edu.Model.Entity.Course;
namespace Edu.Model.ViewModel.Course namespace Edu.Model.ViewModel.Course
{ {
...@@ -21,5 +22,10 @@ namespace Edu.Model.ViewModel.Course ...@@ -21,5 +22,10 @@ namespace Edu.Model.ViewModel.Course
/// 上课时间【日期+开始时间】 /// 上课时间【日期+开始时间】
/// </summary> /// </summary>
public string NewPlanDateTime { get; set; } public string NewPlanDateTime { get; set; }
/// <summary>
/// 随拍list
/// </summary>
public List<string> SuiPaiList { get; set; }
} }
} }
\ No newline at end of file
...@@ -1530,5 +1530,90 @@ namespace Edu.Module.Course ...@@ -1530,5 +1530,90 @@ namespace Edu.Module.Course
#endregion #endregion
#region 教师上课挂件查询
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId, int Group_Id)
{
return class_TimeRepository.GetClassTimeByRoomId(RoomId, Group_Id);
}
public int GetNowClassHours(RB_Class_Time_Extend model)
{
int classHours = 0;
//班级完成的总分钟数
var FinishMinutes = class_CheckRepository.GetClassFinishMinutesRepository(model.ClassId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
//基础课时分钟数
var BasicMinutes = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = model.Group_Id })?.BasicMinutes ?? 45;
var nowHours = model.NewEndPlanDateTime.Value.Subtract(model.NewPlanDateTime.Value).TotalSeconds;
if (FinishMinutes > 0)
{
//完成课时数
classHours = Convert.ToInt32((FinishMinutes + Convert.ToDecimal(nowHours)) / BasicMinutes);
}
else
{
classHours = Convert.ToInt32(FinishMinutes / BasicMinutes);
}
return classHours;
}
/// <summary>
/// 更新课堂随拍
/// </summary>
/// <param name="SuiPai"></param>
/// <param name="Id"></param>
/// <returns></returns>
public bool UpdateTimeSuiPai(string SuiPai, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.SuiPai),SuiPai},
};
return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
}
/// <summary>
/// 更新课堂上课状态
/// </summary>
/// <param name="SuiPai"></param>
/// <param name="Id"></param>
/// <returns></returns>
public bool UpdateTimeClassStatus(int classStatus, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
};
return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
}
/// <summary>
/// 更新课堂视频
/// </summary>
/// <param name="SuiPai"></param>
/// <param name="Id"></param>
/// <returns></returns>
public bool UpdateTimeClassVideo(string videoUrl, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.VideoUrl),videoUrl},
};
return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
}
#endregion
} }
} }
...@@ -57,6 +57,8 @@ namespace Edu.Module.Course ...@@ -57,6 +57,8 @@ namespace Edu.Module.Course
{nameof(RB_Class_Room_ViewModel.UpdateBy),extModel.UpdateBy }, {nameof(RB_Class_Room_ViewModel.UpdateBy),extModel.UpdateBy },
{nameof(RB_Class_Room_ViewModel.UpdateTime),extModel.UpdateTime }, {nameof(RB_Class_Room_ViewModel.UpdateTime),extModel.UpdateTime },
{nameof(RB_Class_Room_ViewModel.School_Id),extModel.School_Id }, {nameof(RB_Class_Room_ViewModel.School_Id),extModel.School_Id },
{nameof(RB_Class_Room_ViewModel.SeatNum),extModel.SeatNum },
{nameof(RB_Class_Room_ViewModel.RoomPic),extModel.RoomPic },
}; };
flag = class_RoomRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Room_ViewModel.RoomId), extModel.RoomId)); flag = class_RoomRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Room_ViewModel.RoomId), extModel.RoomId));
} }
......
...@@ -70,19 +70,21 @@ namespace Edu.Module.Public ...@@ -70,19 +70,21 @@ namespace Edu.Module.Public
/// <returns></returns> /// <returns></returns>
public List<object> GetStudyAbroadListModule() public List<object> GetStudyAbroadListModule()
{ {
List<object> list = new List<object>(); List<object> list = new List<object>
list.Add(new
{ {
Id = Common.Config.StudyAbroadDirectorId, new
AuditType=1, {
Name = "部门主管审核" Id = Common.Config.StudyAbroadDirectorId,
}); AuditType = 1,
list.Add(new Name = "部门主管审核"
{ },
Id = Common.Config.StudyAbroadManagerId, new
AuditType = 2, {
Name = "部门负责人审核" Id = Common.Config.StudyAbroadManagerId,
}); AuditType = 2,
Name = "部门负责人审核"
}
};
return list; return list;
} }
#endregion #endregion
......
...@@ -18,7 +18,10 @@ namespace Edu.Repository.Course ...@@ -18,7 +18,10 @@ namespace Edu.Repository.Course
public List<RB_Class_Check_ViewModel> GetClassCheckListRepository(RB_Class_Check_ViewModel query) public List<RB_Class_Check_ViewModel> GetClassCheckListRepository(RB_Class_Check_ViewModel query)
{ {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.AppendFormat(@" SELECT A.* FROM RB_Class_Check AS A WHERE 1=1 "); builder.AppendFormat(@"
SELECT A.*,IFNULL(B.GuestName,'') AS GuestName
FROM RB_Class_Check AS A LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id
WHERE 1=1 ");
if (query != null) if (query != null)
{ {
if (query.Group_Id > 0) if (query.Group_Id > 0)
......
...@@ -31,6 +31,10 @@ WHERE 1=1 ...@@ -31,6 +31,10 @@ WHERE 1=1
{ {
builder.AppendFormat(" AND {0}={1} ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.ClassPlanId); builder.AppendFormat(" AND {0}={1} ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.ClassPlanId);
} }
if (query.ClassTimeId > 0)
{
builder.AppendFormat(" AND {0}={1} ", nameof(RB_Class_Time_ViewModel.ClassTimeId), query.ClassTimeId);
}
if (!string.IsNullOrEmpty(query.QClassPlanIds)) if (!string.IsNullOrEmpty(query.QClassPlanIds))
{ {
builder.AppendFormat(" AND {0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.QClassPlanIds); builder.AppendFormat(" AND {0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.QClassPlanIds);
...@@ -101,5 +105,28 @@ WHERE 1=1 ...@@ -101,5 +105,28 @@ WHERE 1=1
builder.AppendFormat(" GROUP BY A.ClassId "); builder.AppendFormat(" GROUP BY A.ClassId ");
return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList(); return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList();
} }
#region 教师上课挂件查询
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId,int Group_Id)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat($@"SELECT t.TeacherName,t.TeacherIcon,c.ClassHours,c.ClassName,cou.CourseName,lp.LessonPlanId,A.ClassPlanId,A.ClassId,A.`Status`,A.ClassRoomId,A.Group_Id,A.School_Id,A.TeacherId,B.ClassTimeId,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
B.EndTime,B.StartTime,B.SuiPai,B.ClassStatus,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') AS NewEndPlanDateTime
FROM rb_class_plan AS A INNER JOIN rb_class_time AS B ON A.ClassPlanId=B.ClassPlanId
LEFT JOIN rb_teacher as t on a.TeacherId=t.TId
LEFT JOIN rb_class as c on c.ClassId=a.ClassId
LEFT JOIN rb_course as cou on cou.CourseId=c.CouseId
LEFT JOIN (SELECT ClassPlanId,MAX(LessonPlanId) as LessonPlanId from rb_class_lessonplan where `Status`=0 GROUP BY ClassPlanId) as lp on lp.ClassPlanId=a.ClassPlanId
where a.`Status`=0 and c.ClassStatus =2 and a.ClassRoomId={RoomId} and a.Group_Id={Group_Id} and DATE_FORMAT(A.ClassDate,'%Y-%m-%d')>=DATE_FORMAT(NOW(),'%Y-%m-%d') ORDER BY CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') asc LIMIT 10");
return Get<RB_Class_Time_Extend>(builder.ToString()).ToList();
}
#endregion
} }
} }
...@@ -95,22 +95,90 @@ namespace Edu.WebApi.Controllers.APP ...@@ -95,22 +95,90 @@ namespace Edu.WebApi.Controllers.APP
} }
else else
{ {
AppStudentInfo frozenInfo = Cache.User.AppStudentReidsCache.GetStudentFrozen(model.Id);
if (frozenInfo != null && frozenInfo.Id > 0 && frozenInfo.IsFrozen == 1)
{
AppStudentLoginError errorObj = Cache.User.AppStudentReidsCache.GetStudentErrorLogin(model.Id);
if (errorObj != null && errorObj.Id > 0)
{
int ts = Convert.ToInt32((System.DateTime.Now - errorObj.ErrorTime.Value).TotalMinutes);
if ((10 - ts) == 0)
{
ts = 1;
}
else
{
ts = 10 - ts;
}
return ApiResult.Failed(message: $"账号已冻结,{ ts}分钟后才能重新登录", new { Error = 0 });
}
return ApiResult.Failed(message: $"账号已冻结,请稍等再重新登录", new { Error = 0 });
}
if (model.ActivationStatus == 0) if (model.ActivationStatus == 0)
{ {
return ApiResult.Failed("账号未激活", new { Error = 1 }); return ApiResult.Failed("账号未激活", new { Error = 1 });
} }
if (password != "Viitto!@#123") if (password != "Viitto!@#123")
{ {
password = Common.DES.Encrypt(password); password = Common.DES.Encrypt(password);
if (model.Password != password) if (model.Password != password)
{ {
AppStudentLoginError errorObj = Cache.User.AppStudentReidsCache.GetStudentErrorLogin(model.Id);
if (errorObj != null && errorObj.Id > 0)
{
errorObj.ErrorNum = errorObj.ErrorNum + 1;
errorObj.ErrorTime = System.DateTime.Now;
}
else
{
errorObj = new AppStudentLoginError
{
ErrorNum = 1,
ErrorTime = System.DateTime.Now,
Id = model.Id,
Group_Id = model.Group_Id,
School_Id = model.School_Id,
};
}
if (errorObj.ErrorNum >= 5)
{
AppStudentInfo frozenObj = new AppStudentInfo
{
Id = model.Id,
AccountType = model.AccountType,
Group_Id = model.Group_Id,
GroupName = model.GroupName,
School_Id = model.School_Id,
AccountId = model.AccountId,
AccountName = model.AccountName,
SchoolName = model.SchoolName,
GroupLogo = model.GroupLogo,
UserIcon = model.UserIcon,
ApiRequestFromEnum = Common.Enum.ApiRequestFromEnum.AppStudent,
IsFrozen = 1
};
Cache.User.AppStudentReidsCache.StudentFrozenSet(Cache.CacheKey.Student_Frozen_Key + model.Id, frozenObj, 600);
Cache.User.AppStudentReidsCache.StudentErrorLoginSet(Cache.CacheKey.Student_ErrorLogin_Key + model.Id, errorObj, 600);
return ApiResult.Failed(message: $"账号已冻结,10分钟后才能重新登录", new { Error = 0 });
}
Cache.User.AppStudentReidsCache.StudentErrorLoginSet(Cache.CacheKey.Student_ErrorLogin_Key + model.Id, errorObj, 600);
return ApiResult.Failed("密码错误", new { Error = 0 }); return ApiResult.Failed("密码错误", new { Error = 0 });
} }
else
{
AppStudentLoginError errorObj = Cache.User.AppStudentReidsCache.GetStudentErrorLogin(model.Id);
if (errorObj != null && errorObj.Id > 0)
{
Cache.User.AppStudentReidsCache.StudentErrorLoginSet(Cache.CacheKey.Student_ErrorLogin_Key + model.Id, errorObj, 0);
}
}
} }
if (model.Status == Common.Enum.DateStateEnum.Delete) if (model.Status == Common.Enum.DateStateEnum.Delete)
{ {
return ApiResult.Failed(message: $"此账号【{ account }】已禁用", new { Error = 2 }); return ApiResult.Failed(message: $"此账号【{ account }】已禁用", new { Error = 2 });
} }
//生成教育token //生成教育token
EduUserInfoToken eduUserInfo = new EduUserInfoToken() EduUserInfoToken eduUserInfo = new EduUserInfoToken()
{ {
...@@ -447,7 +515,7 @@ namespace Edu.WebApi.Controllers.APP ...@@ -447,7 +515,7 @@ namespace Edu.WebApi.Controllers.APP
JObject jobj = JObject.Parse(RequestParm.Msg.ToString()); JObject jobj = JObject.Parse(RequestParm.Msg.ToString());
string account = jobj.GetStringValue("account"); string account = jobj.GetStringValue("account");
string sendcode = jobj.GetStringValue("sendcode"); string sendcode = jobj.GetStringValue("sendcode");
string openid = jobj.GetStringValue("openid"); string openid = jobj.GetStringValue("openid");
string password = jobj.GetStringValue("password"); string password = jobj.GetStringValue("password");
if (string.IsNullOrWhiteSpace(sendcode)) if (string.IsNullOrWhiteSpace(sendcode))
......
...@@ -142,6 +142,7 @@ namespace Edu.WebApi.Controllers.APP ...@@ -142,6 +142,7 @@ namespace Edu.WebApi.Controllers.APP
} }
catch (Exception ex) catch (Exception ex)
{ {
Common.Plugin.LogHelper.Write(ex, "GetSystemMsgDetails");
} }
} }
var retult = new var retult = new
......
...@@ -84,5 +84,15 @@ namespace Edu.WebApi.Controllers ...@@ -84,5 +84,15 @@ namespace Edu.WebApi.Controllers
} }
/// <summary>
/// 用户缓存
/// </summary>
public AppStudentLoginError StudentLoginErrorInfo(object Id)
{
AppStudentLoginError userInfo = AppStudentReidsCache.GetStudentErrorLogin(Id);
return userInfo;
}
} }
} }
\ No newline at end of file
...@@ -116,6 +116,72 @@ namespace Edu.WebApi.Controllers.Course ...@@ -116,6 +116,72 @@ namespace Edu.WebApi.Controllers.Course
var flag = classRoomModule.RemoveClassRoomModule(RoomId, Status); var flag = classRoomModule.RemoveClassRoomModule(RoomId, Status);
return flag ? ApiResult.Success() : ApiResult.Failed(); return flag ? ApiResult.Success() : ApiResult.Failed();
} }
#endregion
#region 甲鹤上课管理系统- 教室注册
/// <summary>
/// 获取教室列表
/// </summary>
/// <returns></returns>
[HttpGet]
[HttpPost]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public ApiResult GetDropClassRoomList()
{
var query = new RB_Class_Room_ViewModel()
{
Group_Id = 100000
};
var list = classRoomModule.GetClassRoomListRepository(query);
var result = list.Select(x => new
{
x.School_Id,
x.RoomId,
x.RoomName,
RoomPicList = string.IsNullOrWhiteSpace(x.RoomPic) ? new List<string>() : JsonHelper.DeserializeObject<List<string>>(x.RoomPic),
x.SeatNum,
x.Group_Id
});
return ApiResult.Success(data: result);
}
/// <summary>
/// 添加修改教室
/// </summary>
/// <returns></returns>
[HttpPost]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public ApiResult SetNoLoginClassRoom()
{
var extModel = Common.Plugin.JsonHelper.DeserializeObject<RB_Class_Room_ViewModel>(RequestParm.Msg.ToString());
if (extModel.RoomId == 0)
{
extModel.CreateTime = DateTime.Now;
extModel.CreateBy = 1;
}
extModel.UpdateBy = 1;
extModel.UpdateTime = DateTime.Now;
extModel.Group_Id = extModel.Group_Id == 0 ? 100000 : extModel.Group_Id;
if (extModel.RoomPicList != null && extModel.RoomPicList.Any())
{
extModel.RoomPic = Common.Plugin.JsonHelper.Serialize(extModel.RoomPicList);
}
else
{
extModel.RoomPic = "";
}
bool flag = classRoomModule.SetClassRoomModule(extModel);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
#endregion #endregion
} }
} }
...@@ -301,6 +301,24 @@ namespace Edu.WebApi.Controllers.User ...@@ -301,6 +301,24 @@ namespace Edu.WebApi.Controllers.User
var flag = schoolModule.RemoveSchoolModule(SId); var flag = schoolModule.RemoveSchoolModule(SId);
return flag ? ApiResult.Success() : ApiResult.Failed(); return flag ? ApiResult.Success() : ApiResult.Failed();
} }
/// <summary>
/// 获取学校列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public ApiResult GetDropSchoolList()
{
var Group_Id = base.ParmJObj.GetInt("Group_Id", 100000);
var query = Common.Plugin.JsonHelper.DeserializeObject<RB_School_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = Group_Id;
var list = schoolModule.GetSchoolListModule(query);
return ApiResult.Success(data: list);
}
#endregion #endregion
#region 讲师管理 #region 讲师管理
......
...@@ -36,11 +36,12 @@ namespace Edu.WebApi ...@@ -36,11 +36,12 @@ namespace Edu.WebApi
}); });
List<string> corsArray = new List<string>() List<string> corsArray = new List<string>()
{ {
"http://192.168.1.214:8400", "http://192.168.20.214:8400",
"http://localhost:8400", "http://localhost:8400",
"http://localhost:8081", "http://localhost:8081",
"http://localhost:8080", "http://localhost:8080",
"http://localhost:8181", "http://localhost:8181",
"http://localhost:8182",
"http://localhost:8082", "http://localhost:8082",
"http://127.0.0.1:50512", "http://127.0.0.1:50512",
"http://127.0.0.1:20224", "http://127.0.0.1:20224",
......
...@@ -33,7 +33,8 @@ ...@@ -33,7 +33,8 @@
"VirtualHost": "/", "VirtualHost": "/",
"Port": 5672, "Port": 5672,
"UserName": "guest", "UserName": "guest",
"Password": "viitto2019" "Password": "viitto2019",
"QueenName": "vt_sys_message"
}, },
"RedisSetting": { "RedisSetting": {
"RedisServer": "47.96.23.199", "RedisServer": "47.96.23.199",
...@@ -56,5 +57,10 @@ ...@@ -56,5 +57,10 @@
//留学就业部门负责人审核编号[姚顺先] //留学就业部门负责人审核编号[姚顺先]
"StudyAbroadManagerId": 52, "StudyAbroadManagerId": 52,
//合同默认抬头 //合同默认抬头
"ContractDefaultTitle": "JH-DZ-CD-" "ContractDefaultTitle": "JH-DZ-CD-",
//消息推送AppId
"PushAppId": "JiaHeJiaoYu",
//是否推送消息
"IsPushMessage": "0"
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment