瀏覽代碼

提交修改学生及教师

CrazyIter 5 年之前
父節點
當前提交
5ea50fcd8a

+ 36 - 0
TEAMModelOS.Service/Models/Core/LoginInfo.cs

@@ -0,0 +1,36 @@
+using Microsoft.WindowsAzure.Storage.Table;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+
+namespace TEAMModelOS.Service.Models.Core
+{
+    /// <summary>
+    /// 登录信息
+    /// </summary>
+    [TableSpace(Name = "Core")]
+    public class LoginInfo : TableEntity
+    {
+        public string TeamModelId { get; set; }
+        public string Phone { get; set; }
+        public string Ticket { get; set; }
+        public string Name { get; set; }
+        public string Token { get; set; }
+        public string CountryCode { get; set; }
+        /// <summary>
+        /// 登录时间
+        /// </summary>
+        public long LoginTime { get; set; }
+        /// <summary>
+        /// 超时时间
+        /// </summary>
+        public long Timeout { get; set; }
+        /// <summary>
+        /// 到期时间
+        /// </summary>
+        public long Expires { get; set; }
+        /// <summary>
+        /// 作用域
+        /// </summary>
+        public string Scope { get; set; }
+
+    }
+}

+ 41 - 0
TEAMModelOS.Service/Models/Core/Teacher.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace TEAMModelOS.Service.Models.Core
+{
+    public class Teacher
+    {
+        public string id { get; set; }
+        /// <summary>
+        /// 0 动态id  透過第三方申請,未認證手機號,TEAMModelId暫時為virtualId但是不顯示在介面上,當使用者驗證手機號後TEAMModelId會變為手機號。
+        /// 1 动态id  透過手機號申請,TEAMModelId為手機號
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int type { get; set; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string name { get; set; }
+        public string email { get; set; }
+        public string cellphone { get; set; }
+        public string countryCode { get; set; }
+        public int verifyFlg { get; set; }
+        public int status { get; set; } = 0;
+        public long createDate { get; set; }
+        public Password password { get; set; }
+        public string exValue { get; set; }
+        public string product { get; set; }
+        public List<ProductToken> productToken { get; set; }
+        public string shortCode { get; set; }
+        public string profilePicture { get; set; }
+        public string profilePictureUrl { get; set; }
+        public string TEAMModelId { get; set; }
+        public string loginTime { get; set; }
+        public string virtualId { get; set; }
+        public List<Oauth> oauth { get; set; } // 0 1
+        public string haveDevice { get; set; }//2
+        public Classroom classroom { get; set; }
+        public string studentId { get; set; }
+        public int seatNo { get; set; }
+    }
+}

+ 245 - 0
TEAMModelOS/Controllers/Core/LoginController.cs

@@ -0,0 +1,245 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.Models;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
+using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
+using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
+using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
+using TEAMModelOS.Service.Models.Core;
+
+namespace TEAMModelOS.Controllers.Core
+{
+    public class LoginController
+    {
+        private readonly IAzureTableDBRepository azureTableDBRepository;
+        private readonly IAzureCosmosDBRepository azureCosmosDBRepository;
+        public LoginController(IAzureTableDBRepository _azureTableDBRepository , IAzureCosmosDBRepository _azureCosmosDBRepository) {
+            azureTableDBRepository = _azureTableDBRepository;
+            azureCosmosDBRepository = _azureCosmosDBRepository;
+        }
+        /// <summary>
+        /// 登录验证
+        /// </summary>
+        /// <param name="test"></param>
+        /// <returns></returns>
+        [HttpPost("CheckLogin")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> CheckLogin(JosnRPCRequest<TicketInfo> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+
+            if (ValidateHelper.IsValid(request.@params))
+            {
+                LoginResult result = await CheckLoginAsync(request.@params);
+                if (result.CheckTicket)
+                {
+                    responseBuilder.Data(result);
+                }
+                else
+                {
+                    responseBuilder.Error(false, ResponseCode.FAILED, "ticket error!");
+                }
+            }
+            else
+            {
+                responseBuilder.Error(false, ResponseCode.FAILED, "ticket error!");
+            }
+            return responseBuilder.build();
+        }
+
+        public async Task<LoginResult> CheckLoginAsync(TicketInfo ticketInfo)
+        {
+
+            // string jtoken = HttpContextHelper.GetValueInHttp(_httpContextAccessor.HttpContext.Request, Constants.AUTHORIZATION);
+            if (string.IsNullOrEmpty(ticketInfo.Token))
+            {
+                LoginResult result = new LoginResult();
+                if (string.IsNullOrEmpty(ticketInfo.Ticket))
+                {
+                    result.CheckTicket = false;
+                    return result;
+                }
+
+                LoginInfo login = azureTableDBRepository.FindOneByKey<LoginInfo>("Ticket", ticketInfo.Ticket).Result;
+                if (login != null && !string.IsNullOrEmpty(login.Token))
+                {
+                    result.CheckTicket = true;
+                    JwtResponse token = await CreateJwtToken(login);
+                    result.JwtToken = token;
+                    login.Token = token.Access_token;
+                    result.JwtToken.Scope = login.Scope;
+                    await azureTableDBRepository.Update<LoginInfo>(login);
+                    return result;
+                }
+
+                ///不验证TmdID
+                #region
+                result.CheckTicket = true;
+                LoginInfo loginInfo = new LoginInfo
+                {
+                    PartitionKey = "15283771540",
+                    Phone = "15283771540",
+                    RowKey = Guid.NewGuid().ToString(),
+                    TeamModelId = ticketInfo.TeamModelId,
+                    Name = ticketInfo.Name,
+                    Ticket = ticketInfo.Ticket,
+                    CountryCode = "86"
+                };
+
+
+                TeamModelUser user = await FindOneByKey<TeamModelUser>("TeamModelId", ticketInfo.TeamModelId);
+                if (user == null || string.IsNullOrEmpty(user.RowKey))
+                {
+                    user = new TeamModelUser { RowKey = Guid.NewGuid().ToString(), PartitionKey = loginInfo.CountryCode, RegisterTime = DateTimeHelper.ConvertToTimeStamp13(DateTime.Now) };
+                }
+                user.Cellphone = "15283771540";
+                user.NickName = ticketInfo.Name;
+                if (string.IsNullOrEmpty(user.FullName))
+                {
+                    user.FullName = ticketInfo.Name;
+                }
+                user.TeamModelId = ticketInfo.TeamModelId;
+                user.CountryCode = "86";
+                JwtResponse jwtToken = await CreateJwtToken(loginInfo);
+                loginInfo.Token = jwtToken.Access_token;
+                loginInfo.Scope = jwtToken.Scope;
+                result.JwtToken = jwtToken;
+                await Save<LoginInfo>(loginInfo);
+                await SaveOrUpdate<TeamModelUser>(user);
+                //  JosnRPCResponse<TeamModelIdInfo> response = MessagePackHelper.JsonToObject<JosnRPCResponse<TeamModelIdInfo>>(jsonStr);
+                return result;
+                #endregion
+                /*
+                JosnRPCRequest<Dictionary<string, object>> request = new JosnRPCRequest<Dictionary<string, object>>
+                {
+                    method = "UserInfo"
+                };
+               
+                    Dictionary<string, object> ticket = new Dictionary<string, object>
+                {
+                    { "ticket", ticketInfo.Ticket }
+                };
+                request.@params = ticket;
+                string data = MessagePackHelper.ObjectToJson(request);
+                string jsonStr = _httpClientService.HttpPost(BaseConfigModel.Configuration["HaBookAuth:AccountUrl"], data,  Constants.CONTENT_TYPE_JSON, Encoding.UTF8);
+                if (!string.IsNullOrEmpty(jsonStr))
+                {
+                    JosnRPCResponse<TeamModelIdInfo> response = MessagePackHelper.JsonToObject<JosnRPCResponse<TeamModelIdInfo>>(jsonStr);
+                    if (response.error == null && response != null)
+                    {
+                        result.CheckTicket = true;
+                        LoginInfo loginInfo = new LoginInfo
+                        {
+                            PartitionKey = response.result.cellphone,
+                            Phone = response.result.cellphone,
+                            RowKey = Guid.NewGuid().ToString(),
+                            TeamModelId = response.result.id,
+                            Name = response.result.name,
+                            Ticket = ticketInfo.Ticket,
+                            CountryCode = response.result.countryCode
+                        };
+                        TeamModelUser user= await FindOneByKey<TeamModelUser>("TeamModelId", response.result.id);
+                        if (user == null || string.IsNullOrEmpty(user.RowKey))
+                        {
+                            user = new TeamModelUser { RowKey = Guid.NewGuid().ToString(), PartitionKey = loginInfo.CountryCode ,RegisterTime=DateTimeHelper.ConvertToTimeStamp13(DateTime.Now) };
+                        }
+                        user.Cellphone = response.result.cellphone;
+                        user.NickName = response.result.name;
+                        if (string.IsNullOrEmpty(user.FullName)) {
+                            user.FullName = response.result.name;
+                        }
+                        user.TeamModelId = response.result.id;
+                        user.CountryCode = response.result.countryCode;
+                        JwtResponse jwtToken = await CreateJwtToken(loginInfo);
+                        loginInfo.Token = jwtToken.Access_token;
+                        loginInfo.Scope = jwtToken.Scope;
+                        result.JwtToken = jwtToken;
+                        await Save<LoginInfo>(loginInfo);
+                        await SaveOrUpdate<TeamModelUser>(user);
+                        return result;
+                    }
+                    else
+                    {
+                        result.CheckTicket = false;
+                        return result;
+                    }
+                }
+                else
+                {
+                    result.CheckTicket = false;
+                    return result;
+                }
+                */
+            }
+            else
+            {
+                ClaimModel claimModel = JwtHelper.SerializeJWT(ticketInfo.Token);
+
+                var dateTime = DateTimeHelper.ConvertToTimeStamp10(DateTime.Now);
+                var expExt = claimModel.Claim.TryGetValue("exp", out var exp);
+                if (expExt == false || dateTime > long.Parse(exp.ToString()))
+                {
+                    throw new BizException(401, "Unauthorized");
+                }
+
+                Dictionary<string, object> msp = new Dictionary<string, object>
+                {
+                    { "Token", ticketInfo.Token }
+                };
+                LoginInfo loginInfo = FindOneByDict<LoginInfo>(msp).Result;
+                if (loginInfo != null && !string.IsNullOrEmpty(loginInfo.Token))
+                {
+                    return new LoginResult { JwtToken = new JwtResponse { Access_token = loginInfo.Token, Scope = loginInfo.Scope }, CheckTicket = true };
+                }
+                else
+                {
+                    throw new BizException(401, "Unauthorized");
+                }
+            }
+        }
+        public async Task<JwtResponse> CreateJwtToken(LoginInfo loginInfo)
+        {
+            Dictionary<string, object> dict = new Dictionary<string, object>
+            {
+                { "Phone", loginInfo.Phone },
+                { "AreaCode", loginInfo.CountryCode },
+                { "TeamModelId",  loginInfo.TeamModelId }
+            };
+            string role = "";
+            List<RoleUser> roleUsers = await FindListByDict<RoleUser>(dict);
+            if (roleUsers.IsNotEmpty())
+            {
+                foreach (RoleUser roleUser in roleUsers)
+                {
+                    role = role + roleUser.RoleCode + ",";
+                }
+                role = role.Substring(0, role.Length - 1);
+            }
+            else
+            {
+                role = "Teacher";
+            }
+
+            ClaimModel model = new ClaimModel
+            {
+                Scope = "WebApp"
+            };
+            model.Claims.Add(new Claim(JwtClaimTypes.Name, loginInfo.Name));
+            model.Claims.Add(new Claim(JwtClaimTypes.Id, loginInfo.TeamModelId));
+            ////保护隐私
+            //model.Claims.Add(new Claim(JwtClaimTypes.PhoneNumber, loginInfo.Phone));
+            model.Claims.AddRange(role.Split(',').Select(s => new Claim(JwtClaimTypes.Role, s)));
+            model.Roles.Add(role);
+            JwtResponse jwtResponse = JwtHelper.IssueJWT(model, _options.Value);
+            return jwtResponse;
+        }
+    }
+}

+ 6 - 6
TEAMModelOS/Controllers/Core/StudentController.cs

@@ -57,11 +57,11 @@ namespace TEAMModelOS.Controllers.Syllabus
             }
             }
         }
         }
         [HttpPost("SaveAllStudent")]
         [HttpPost("SaveAllStudent")]
-        public async Task<BaseJosnRPCResponse> SaveAllStudentInfo(JosnRPCRequest<List<StudentDto>> request)
+        public async Task<BaseJosnRPCResponse> SaveAllStudentInfo(JosnRPCRequest<List<Student>> request)
         {
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            Dictionary<string, List<StudentDto>> dictInfo = new Dictionary<string, List<StudentDto>>();
-            foreach (IGrouping<string, StudentDto> group in request.@params.GroupBy(c => c.classroomCode))
+            Dictionary<string, List<Student>> dictInfo = new Dictionary<string, List<Student>>();
+            foreach (IGrouping<string, Student> group in request.@params.GroupBy(c => c.classroom.classroomCode))
             {
             {
                 dictInfo.Add(group.Key, group.ToList());
                 dictInfo.Add(group.Key, group.ToList());
             }
             }
@@ -72,7 +72,7 @@ namespace TEAMModelOS.Controllers.Syllabus
                 if (classrooms.IsNotEmpty())
                 if (classrooms.IsNotEmpty())
                 {
                 {
                     long createDate = DateTimeOffset.UtcNow.Ticks;
                     long createDate = DateTimeOffset.UtcNow.Ticks;
-                    dictInfo.TryGetValue(key, out List<StudentDto> sts);
+                    dictInfo.TryGetValue(key, out List<Student> sts);
                     List<long>  ids= IdWorker.getIdsByCount(sts.Count);
                     List<long>  ids= IdWorker.getIdsByCount(sts.Count);
                     sts.ForEach(x => {
                     sts.ForEach(x => {
                         Student student = new Student
                         Student student = new Student
@@ -90,7 +90,7 @@ namespace TEAMModelOS.Controllers.Syllabus
                         }
                         }
                         Classroom classroom = new Classroom
                         Classroom classroom = new Classroom
                         {
                         {
-                            classroomCode = x.classroomCode,
+                            classroomCode = x.classroom.classroomCode,
                             gradeCode = classrooms[0].gradeCode,
                             gradeCode = classrooms[0].gradeCode,
                             periodCode = classrooms[0].periodCode,
                             periodCode = classrooms[0].periodCode,
                             schoolCode = classrooms[0].schoolCode,
                             schoolCode = classrooms[0].schoolCode,
@@ -105,7 +105,7 @@ namespace TEAMModelOS.Controllers.Syllabus
         }
         }
 
 
         [HttpPost("UpdateStudent")]
         [HttpPost("UpdateStudent")]
-        public async Task<BaseJosnRPCResponse> UpdateStudent(JosnRPCRequest<StudentDto> request)
+        public async Task<BaseJosnRPCResponse> UpdateStudent(JosnRPCRequest<Student> request)
         {
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             //设置密码 isSet 是否加密 如果加密则不会再次加密
             //设置密码 isSet 是否加密 如果加密则不会再次加密

+ 14 - 0
TEAMModelOS/Models/LoginResult.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+
+namespace TEAMModelOS.Models
+{
+    public class LoginResult
+    {
+        public JwtResponse JwtToken { get; set; }
+        public bool CheckTicket { get; set; } = false;
+    }
+}

+ 0 - 17
TEAMModelOS/Models/StudentDto.cs

@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using TEAMModelOS.Service.Models.Core;
-
-namespace TEAMModelOS.Models
-{
-    /// <summary>
-    /// 用于批量导入使用
-    /// </summary>
-    public class StudentDto :Student
-    {
-        public string classroomCode { get; set; }
-        
-    }
-}

+ 23 - 0
TEAMModelOS/Models/TicketInfo.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.Models
+{
+    /// <summary>
+    /// 前端返回获取的醍摩豆ID登录基本信息及ticket
+    /// </summary>
+    public class TicketInfo
+    {
+        //[Required(ErrorMessage = "{0} 必须填写")]
+        public string Ticket { get; set; }
+        //[Required(ErrorMessage = "{0} 必须填写")]
+        public string Name { get; set; }
+        //[Required(ErrorMessage = "{0} 必须填写")]
+        public string Sign { get; set; }
+        // [Required(ErrorMessage = "{0} 必须填写")]
+        public string TeamModelId { get; set; }
+        public string Token { get; set; }
+    }
+}