Browse Source

开放平台学校学生单点登录

Li 2 năm trước cách đây
mục cha
commit
c5e1697e6b

+ 77 - 0
TEAMModelOS.SDK/Models/Cosmos/OpenEntity/OStudent.cs

@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.OpenEntity
+{
+    public class OStudent
+    {
+        /// <summary>
+        /// 学生id
+        /// </summary>
+        public string id { get; set; }
+        /// <summary>
+        /// 学生名称
+        /// </summary>
+        public string name { get; set; }
+        /// <summary>
+        /// 头像
+        /// </summary>
+        public string picture { get; set; }
+        /// <summary>
+        /// 学校ID
+        /// </summary>
+        public string schoolId { get; set; }
+        /// <summary>
+        /// 邮箱
+        /// </summary>
+        public string mail { get; set; }
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string mobile { get; set; }
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string country { get; set; }
+        /// <summary>
+        /// 入学年
+        /// </summary>
+        public int year { get; set; }
+        /// <summary>
+        /// 座号
+        /// </summary>
+        public string no { get; set; }
+        /// <summary>
+        /// 班级Id
+        /// </summary>
+        public string classId { get; set; }
+        /// <summary>
+        /// 分组id
+        /// </summary>
+        public string groupId { get; set; }
+        /// <summary>
+        /// 分组名称
+        /// </summary>
+        public string groupName { get; set; }
+        /// <summary>
+        /// 学段id
+        /// </summary>
+        public string periodId { get; set; }
+        /// <summary>
+        /// 性别 M( male,男) F (female 女)  N(secret 保密) 
+        /// </summary>
+        public string gender { get; set; }
+        /// <summary>
+        /// 补充留级信息
+        /// 0在校,1毕业 
+        /// </summary>
+        public int graduate { get; set; } = 0;
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long createTime { get; set; }
+    }
+}

+ 81 - 0
TEAMModelOS/Controllers/OpenApi/OpenApiService.cs

@@ -34,6 +34,8 @@ using Microsoft.OData.Edm;
 using TEAMModelOS.Controllers.Core;
 using DocumentFormat.OpenXml.VariantTypes;
 using static TEAMModelOS.Controllers.CourseController;
+using System.IdentityModel.Tokens.Jwt;
+using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
 
 namespace TEAMModelOS.Controllers
 {
@@ -1744,5 +1746,84 @@ namespace TEAMModelOS.Controllers
             string datawebHooks = webHooks.ToJsonString();
         }
 
+        /// <summary>
+        /// 学生登录信息
+        /// </summary>
+        /// <param name="_azureCosmos"></param>
+        /// <param name="_dingDing"></param>
+        /// <param name="bizId"></param>
+        /// <param name="school"></param>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        public static async Task<ResponseData<dynamic>> GetLoginStuInfo(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string bizId, string school, JsonElement json)
+        {
+            json.TryGetProperty("stuId", out JsonElement _stuId);
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                if (!json.TryGetProperty("idToken", out JsonElement _idToken)) return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "idToken参数错误", data = null };
+                //if (!string.IsNullOrWhiteSpace($"{_idToken}") && JwtAuthExtension.ValidateApiToken($"{_idToken}", _option.JwtSecretKey))
+                //{
+                //    JwtSecurityToken jwt = new($"{_idToken}");
+                //}
+                OStudent student = new();
+                JwtSecurityToken jwt = new($"{_idToken}");
+                var iss = jwt.Payload.Iss;
+                var stuId = jwt.Payload.Sub;
+                var scId = jwt.Payload.Azp;
+                jwt.Payload.TryGetValue("name", out object stuName);
+                jwt.Payload.TryGetValue("picture", out object stuPicture);
+                if(!jwt.Payload.TryGetValue("scope", out object scope)) return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "参数错误:scope", data = null };
+                if(!jwt.Payload.TryGetValue("roles", out object _roles)) return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "参数错误:roles", data = null };
+                jwt.Payload.TryGetValue("permissions", out object permissions);
+                jwt.Payload.TryGetValue("standard", out object standard);
+                jwt.Payload.TryGetValue("area", out object area);
+                jwt.Payload.TryGetValue("website", out object website);
+
+                List<string> roles = $"{_roles}".ToObject<List<string>>();
+                if (roles.Contains("student") && $"{scope}".Equals("student")) 
+                {
+                    if (!string.IsNullOrEmpty(stuId) && !string.IsNullOrEmpty(scId))
+                    {
+                        var responseStu = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(stuId, new PartitionKey($"Base-{scId}"));
+                        if (responseStu.Status == 200)
+                        {
+                            JsonDocument jsonD = JsonDocument.Parse(responseStu.Content);
+                            student = jsonD.RootElement.ToObject<OStudent>();
+                            switch (student.gender)
+                            {
+                                case "M":
+                                    student.gender = "男";
+                                    break;
+                                case "F":
+                                    student.gender = "女";
+                                    break;
+                                case "N":
+                                    student.gender = "保密";
+                                    break;
+                            }
+                        }
+                        else
+                            return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "未找到该学生", data = new { id = stuId, schoolId = scId } };
+                    }
+                    else
+                        return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "参数错误:Sub/scId", data = null };
+                }
+                else
+                    return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "参数错误:roles/Azp", data = null };
+
+
+                return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = student };
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetLoginStuInfo()   参数:stu:{_stuId},school:{school},json:{json.ToJsonString()} \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
+            }
+
+
+
+        }
+
     }
 }

+ 53 - 0
TEAMModelOS/Controllers/OpenApi/OpenSchool/ScStudentController.cs

@@ -0,0 +1,53 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.Filter;
+using TEAMModelOS.Models;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+
+namespace TEAMModelOS.Controllers
+{
+    [Route("school")]
+    [ApiController]
+    public class ScStudentController : ControllerBase
+    {
+        private AzureCosmosFactory _azureCosmos;
+        private readonly DingDing _dingDing;
+        private readonly Option _option;
+        private readonly AzureServiceBusFactory _serviceBus;
+        private readonly AzureStorageFactory _azureStorage;
+        public IConfiguration _configuration { get; set; }
+        private readonly CoreAPIHttpService _coreAPIHttpService;
+
+
+        public ScStudentController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
+        {
+            _azureCosmos = azureCosmos;
+            _dingDing = dingDing;
+            _option = option?.Value;
+            _serviceBus = serviceBus;
+            _configuration = configuration;
+            _azureStorage = azureStorage;
+            _coreAPIHttpService = coreAPIHttpService;
+        }
+
+
+        [ProducesDefaultResponseType]
+        [HttpPost("get-student-info")]
+        [ApiToken(Auth = "2000", Name = "学生详细信息", TName = "學生詳細信息", EName = "Student Details", RWN = "R", Limit = false)]
+        public async Task<IActionResult> GetLoginStuInfo(JsonElement jsonElement)
+        {
+            var (id, school) = HttpContext.GetApiTokenInfo();
+
+            var responseDate = await OpenApiService.GetLoginStuInfo(_azureCosmos, _dingDing, _option, id, school, jsonElement);
+
+            return Ok(new { responseDate });
+        }
+    }
+
+}