CrazyIter_Bin 3 years ago
parent
commit
82fb485bca

+ 8 - 10
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -343,21 +343,21 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                 await _dingDing.SendBotMsg($"ServiceBus,RefreshBlob:空间计算已经超过{timeout}秒\n容器名:{name}\n文件夹:{u}\n计算时长:{dis}", GroupNames.醍摩豆服務運維群組);
             }
         }
-
-        /// <summary>
-        /// 完善课程变更,StuListChange,  originCode是学校编码 则表示名单是学校自定义名单,如果是tmdid则表示醍摩豆的私有名单,scope=school,private。
-        /// </summary>
-        /// <data msg>
-        /// CourseChange
-        ///// </data>
         /// <param name="msg"></param>
         /// <returns></returns>
         [Function("TeacherTrainChange")]
         public async Task TeacherTrainChangeFunc([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "teacher-train-change", Connection = "Azure:ServiceBus:ConnectionString")] string msg)
+        { 
+        
+        }
+        
+        /// <param name="msg"></param>
+        /// <returns></returns>
+        //[Function("TeacherTrainChange")]
+        public async Task TeacherTrainChangeFuncBak([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "teacher-train-change", Connection = "Azure:ServiceBus:ConnectionString")] string msg)
         {
             try
             {
-                // await _dingDing.SendBotMsg($"teacher-train-change\n{msg}",GroupNames.成都开发測試群組);
                 TeacherTrainChange change = msg.ToObject<TeacherTrainChange>();
                 if (change.update == null || change.update.Count <= 0 || change.tmdids.IsEmpty())
                 {
@@ -375,7 +375,6 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
 
                 if (change.statistics != 1)
                 {
-
                     List<Task<ItemResponse<TeacherTrain>>> task = new List<Task<ItemResponse<TeacherTrain>>>();
                     teacherTrains.ForEach(x =>
                     {
@@ -419,7 +418,6 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                     {
                         try
                         {
-                            //优先找校级
                             setting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<AreaSetting>(change.school, new PartitionKey("AreaSetting"));
                         }
                         catch (CosmosException)

+ 2 - 0
TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs

@@ -38,6 +38,8 @@ namespace TEAMModelOS.SDK
     }
     public class CoreAPIHttpService
     {
+
+        public bool check=true;
         private readonly HttpClient _httpClient;
         public readonly IOptionsMonitor<CoreAPIHttpServiceOptions> options;
         public CoreAPIHttpService(HttpClient httpClient, IOptionsMonitor<CoreAPIHttpServiceOptions> optionsMonitor)

+ 1 - 1
TEAMModelOS.SDK/Models/Service/GroupListService.cs

@@ -1008,7 +1008,7 @@ namespace TEAMModelOS.SDK
                     }
                 }
 
-                if (tmdids.IsNotEmpty()) {
+                if (tmdids.IsNotEmpty() && _coreAPIHttpService.check) {
                     ///获取真实的名称 
                     var content = new StringContent(tmdids.Select(x => x.id).ToHashSet().ToJsonString(), Encoding.UTF8, "application/json");
                     string json = null;

+ 19 - 33
TEAMModelOS.SDK/Models/Service/StatisticsService.cs

@@ -67,7 +67,7 @@ namespace TEAMModelOS.SDK
                     x.update.UnionWith(change.update);
                     task.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<TeacherTrain>(x, x.id, new PartitionKey($"TeacherTrain-{change.school}")));
                 });
-                await task.TaskPage(5);
+                await task.TaskPage(50);
                 var unchange = change.tmdids.Except(teacherTrains.Select(x => x.id));
                 if (unchange != null)
                 {
@@ -86,7 +86,7 @@ namespace TEAMModelOS.SDK
                         teacherTrain.update.UnionWith(change.update);
                         task.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<TeacherTrain>(teacherTrain, new PartitionKey($"TeacherTrain-{change.school}")));
                     });
-                    await task.TaskPage(5);
+                    await task.TaskPage(100);
                 }
             }
 
@@ -108,7 +108,7 @@ namespace TEAMModelOS.SDK
                     x.update.UnionWith(list.update);
                     task.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<TeacherTrain>(x, x.id, new PartitionKey($"TeacherTrain-{list.school}")));
                 });
-                await task.TaskPage(5);
+                await task.TaskPage(50);
                 var unchange = list.tmdids.Except(teacherTrains.Select(x => x.id));
                 if (unchange != null)
                 {
@@ -127,25 +127,9 @@ namespace TEAMModelOS.SDK
                         teacherTrain.update.UnionWith(list.update);
                         task.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<TeacherTrain>(teacherTrain, new PartitionKey($"TeacherTrain-{list.school}")));
                     });
-                    await task.TaskPage(1);
+                    await task.TaskPage(100);
                 }
             }
-
-            //var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
-            //if (list.tmdids.IsNotEmpty() && list.update.IsNotEmpty())
-            //{
-            //    TeacherTrainChange change = new TeacherTrainChange
-            //    {
-            //        standard = list.standard,
-            //        tmdids = list.tmdids,
-            //        school = list.school,
-            //        update = new HashSet<string>(list.update),
-            //        statistics = list.statistics
-            //    };
-            //    var messageChange = new ServiceBusMessage(change.ToJsonString());
-            //    messageChange.ApplicationProperties.Add("name", "TeacherTrainChange");
-            //    await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
-            //}
         }
 
         public static async Task GetAreaAndAreaSetting(string schoolId, string _standard, CosmosClient client, HttpContext httpContext)
@@ -189,6 +173,8 @@ namespace TEAMModelOS.SDK
         }
         public static async Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> StatisticsSchool(CoreAPIHttpService _coreAPIHttpService,string school, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
         {
+            _coreAPIHttpService.check = false;
+    
             List<RGroupList> yxtrain = await GroupListService.GetGroupListMemberByType(_coreAPIHttpService, client, "yxtrain", new List<string> { "school" }, $"{school}", _dingDing);
             List<TeacherTrain> trains = new List<TeacherTrain>();
             var members = yxtrain.SelectMany(x => x.members).ToList();
@@ -809,7 +795,7 @@ namespace TEAMModelOS.SDK
                 }
             }
             Currency currency = new Currency();
-            Currency currencyAll = new Currency();
+           // Currency currencyAll = new Currency();
 
 
             abilitySubs.ForEach(item => {
@@ -835,7 +821,7 @@ namespace TEAMModelOS.SDK
                         {
                             currency.uploadDone += item.uploads.Count;
                         }
-                        currencyAll.uploadDone += item.uploads.Count;
+                      //  currencyAll.uploadDone += item.uploads.Count;
                     }
                     //通过能力点自测
                     if (item.exerciseScore > 0)
@@ -852,11 +838,11 @@ namespace TEAMModelOS.SDK
 
                         }
                         //并且完全看完视频和文档。
-                        if (item.allDone)
-                        {
-                            currencyAll.learnAbility += 1;
-                        }
-                        currencyAll.exerciseAbility += ability.abilityCount;
+                        //if (item.allDone)
+                        //{
+                        //    currencyAll.learnAbility += 1;
+                        //}
+                        //currencyAll.exerciseAbility += ability.abilityCount;
                     }
 
                     List<TeacherHprecord> hprecords = new List<TeacherHprecord>();
@@ -966,15 +952,15 @@ namespace TEAMModelOS.SDK
                         currency.uploadTotal += ability.stds.FindAll(x => x.task.IsNotEmpty()).Select(y => y.task).Count();
                         currency.teacherAilities.Add(teacherAbility);
                     }
-                    currencyAll.subCount += 1;
-                    currencyAll.uploadTotal += ability.stds.FindAll(x => x.task.IsNotEmpty()).Select(y => y.task).Count();
-                    currencyAll.teacherAilities.Add(teacherAbility);
+                   // currencyAll.subCount += 1;
+                   // currencyAll.uploadTotal += ability.stds.FindAll(x => x.task.IsNotEmpty()).Select(y => y.task).Count();
+                  //  currencyAll.teacherAilities.Add(teacherAbility);
                 }
             });
             train.currency = currency;
-            train.currencyAll = currencyAll;
+           // train.currencyAll = currencyAll;
             train.currency.videoTime = train.currency.teacherAilities.Select(x => x.videoTime).Sum();
-            train.currencyAll.videoTime = train.currencyAll.teacherAilities.Select(x => x.videoTime).Sum();
+          //  train.currencyAll.videoTime = train.currencyAll.teacherAilities.Select(x => x.videoTime).Sum();
             //如果总分钟数超过20学时,则直接复制20学时。
             var videoTime = setting.lessonMinutes != 0 ? (int)(train.currency.videoTime / setting.lessonMinutes) : 0;
             train.onlineTime = videoTime > setting.onlineTime ? setting.onlineTime : videoTime;
@@ -984,7 +970,7 @@ namespace TEAMModelOS.SDK
             {
                 ///要全部合格才能获得学时。
                 train.currency.submitTime = setting.submitTime;
-                train.currencyAll.submitTime = setting.submitTime;
+               // train.currencyAll.submitTime = setting.submitTime;
             }
             return train;
         }

+ 163 - 0
TEAMModelOS/Controllers/Normal/AbilityStatisticsController.cs

@@ -141,6 +141,169 @@ namespace TEAMModelOS.Controllers
                 return Ok(new { error = 1, msg = "你没有学习记录" });
             }
         }
+
+        /// <summary>
+        /// 区级数据统计
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("statistics-area-simple")]
+        [AuthToken(Roles = "teacher,admin,area")]
+        [Authorize(Roles = "IES")]
+        public async Task<IActionResult> StatisticsAreaSimple(JsonElement request)
+        {
+            var (userid, _, _, _) = HttpContext.GetAuthTokenInfo();
+            request.TryGetProperty("standard", out JsonElement _standard);
+            string standard = $"{_standard}";
+            if (string.IsNullOrEmpty(standard))
+            {
+                return BadRequest();
+            }
+            var client = _azureCosmos.GetCosmosClient();
+            Area area = null;
+            string sql = $"select value(c) from c where c.standard='{standard}'";
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: sql,
+                  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+            {
+                area = item;
+            }
+            AreaSetting setting = null;
+            if (area != null)
+            {
+                try
+                {
+                    setting = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<AreaSetting>(area.id, new PartitionKey("AreaSetting"));
+                }
+                catch (CosmosException)
+                {
+                    setting = null;
+                }
+            }
+            if (setting == null)
+            {
+                setting = new AreaSetting
+                {
+                    allTime = 50,
+                    classTime = 5,
+                    submitTime = 15,
+                    onlineTime = 20,
+                    offlineTime = 10,
+                    lessonMinutes = 45,
+                };
+            }
+
+            try
+            {
+                List<TeacherTrain> teacherTrains = new List<TeacherTrain>();
+                List<School> schools = new List<School>();
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{area.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                {
+
+                    schools.Add(item);
+                }
+                List<Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>> trains = new List<Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>>();
+                int countArea = 0;
+                int appraiseArea = 0;
+                List<SchoolInfos> schoolInfos = new List<SchoolInfos>();
+                foreach (var school in schools)
+                {
+                    
+                    schoolInfos.Add(new SchoolInfos { schoolId = school.id, schoolName = school.name, picture = school.picture });
+                    //增加评审人员总人数,学习总人数。
+                    trains.Add(StatisticsService.StatisticsSchool(_coreAPIHttpService, school.id, setting, area, client, _dingDing, null));
+                }
+                int pagesize = 100;
+                if (trains.Count <= pagesize)
+                {
+                    (List<TeacherTrain> trains, List<RGroupList> yxtrain)[] tasks = await Task.WhenAll(trains);
+                    tasks.ToList().ForEach(x => {
+                        teacherTrains.AddRange(x.trains);
+                        schoolInfos.ForEach(y => {
+                            var list = x.yxtrain.Find(z => z.school.Equals(y.schoolId));
+                            if (list != null)
+                            {
+                                y.trainCount = list.members.Count;
+                            }
+                        });
+                    });
+                }
+                else
+                {
+                    int pages = (trains.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                    for (int i = 0; i < pages; i++)
+                    {
+                        var listssb = trains.Skip((i) * pagesize).Take(pagesize).ToList();
+                        (List<TeacherTrain> trains, List<RGroupList> yxtrain)[] tasks = await Task.WhenAll(listssb);
+                        tasks.ToList().ForEach(x => {
+                            teacherTrains.AddRange(x.trains);
+                            schoolInfos.ForEach(y => {
+                                var list = x.yxtrain.Find(z => z.school.Equals(y.schoolId));
+                                if (list != null)
+                                {
+                                    y.trainCount = list.members.Count;
+                                }
+                            });
+                        });
+                    }
+                }
+                long totalTime = teacherTrains.Select(x => x.totalTime).Sum();
+                int hgcount = teacherTrains.Where(x => x.finalScore == 1 || x.finalScore == 2).Count();
+                setting.accessConfig = null;
+
+
+
+                List<dynamic> dynamics = new List<dynamic>();
+                teacherTrains.ForEach(x => {
+                    x.currency.videoTime = (int)x.currency.videoTime;
+                    x.currency.teacherAilities.ForEach(y => {
+                        y.videoTime = (int)y.videoTime;
+                        y.onlineTime = (int)y.onlineTime;
+                        y.debateOrther = y.debateOrther > 0 ? y.debateOrther : 0;
+                    });
+                    dynamic dynamic = new {
+                        x.classTime,
+                        x.finalScore,
+                        x.name,
+                        x.offlineTime,
+                        x.onlineTime,
+                        x.school,
+                        x.id,
+                        x.totalTime,
+                        currency =new {
+                            x.currency.submitTime,
+                            x.currency.exerciseAbility,
+                            x.currency.learnAbility,
+                            x.currency.uploadDone,
+                            x.currency.uploadTotal,
+                            x.currency.videoTime,
+                            teacherAilities= x.currency.teacherAilities.Select(t => new {
+                                t.onlineTime,
+                                t.videoTime,
+                                t.no,
+                                t.name,
+                                t.dimension,
+                                t.zpscore,t.xzscore,t.hpscore
+                            })
+                        } 
+                    };
+                    dynamics.Add(dynamic);
+                });
+
+
+                return Ok(new { teacherTrains= dynamics, setting, schools = schoolInfos, totalTime, hgcount, teacherCount = countArea, appraiseCount = appraiseArea });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},UpsertSubmitScore/UpsertSubmitScore()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest(new { ex.Message, ex.StackTrace });
+
+            }
+        }
+
+
+
+
         /// <summary>
         /// 区级数据统计
         /// </summary>

+ 299 - 0
TEAMModelOS/Controllers/Third/Xkw/OpenAuthClient.cs

@@ -0,0 +1,299 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Security.Cryptography;
+using System.Text;
+using TEAMModelOS.SDK.Extension;
+
+namespace TEAMModelOS.Controllers.Third.Xkw
+{
+	public abstract class OpenAuthClient
+	{
+		public string ClientName { get; protected set; }
+		public string AppKey { get; protected set; }
+		public string AppSecret { get; protected set; }
+		public string RedirectUrl { get; set; }
+		public string AccessToken { get; set; }
+
+		public bool IsAuthorized
+		{
+			get { return isAccessTokenSet && !string.IsNullOrEmpty(AccessToken); }
+		}
+
+		protected bool isAccessTokenSet = false;
+		public abstract string GetAuthorizationUrl();
+		public abstract void GetAccessTokenByCode(string code, string schoolId);
+
+
+		public OpenAuthClient(string clientId, string appSecret, string redirectUrl, string accessToken = null)
+		{
+			this.AppKey = clientId;
+			this.AppSecret = appSecret;
+			this.RedirectUrl = redirectUrl;
+			this.AccessToken = accessToken;
+
+			if (!string.IsNullOrEmpty(accessToken))
+			{
+				isAccessTokenSet = true;
+			}
+		}
+
+	}
+
+    public class XkwOAuthClient : OpenAuthClient
+    {
+        public string AUTH_HOST { get; set; }
+        public string AUTH_URL { get; set; }
+        public string TOKEN_URL { get; set; }
+        public string PROFILE_URL { get; set; }
+
+        public string SERVICE_URL { get; set; }
+        public string OpenId { get; set; }
+        public string UserId { get; set; }
+        /// <summary>
+        /// 静默注册参数
+        /// </summary>
+        public string Extra { get; set; }
+        public string ErrorMessage { get; set; }
+        public XkwOAuthClient(string appKey, string appSecret, string redirectUrl, string oauthHost, string accessToken = null, string openid = null, string userId = null)
+            : base(appKey, appSecret, redirectUrl, accessToken)
+        {
+            ClientName = "Xkw Demo Client";
+            OpenId = openid;
+            UserId = userId;
+            AUTH_HOST = oauthHost;
+            AUTH_URL = AUTH_HOST + "authorize";
+            TOKEN_URL = AUTH_HOST + "accessToken";
+            PROFILE_URL = AUTH_HOST + "profile";
+
+            if (!(string.IsNullOrEmpty(accessToken) && string.IsNullOrEmpty(openid)))
+            {
+                isAccessTokenSet = true;
+            }
+        }
+
+        /// <summary>
+        /// 进行认证
+        /// </summary>
+        /// <returns></returns>
+        public override string GetAuthorizationUrl()
+        {
+            string openSecret = "";
+            if (!string.IsNullOrEmpty(OpenId))
+            {
+                openSecret = CryptoUtils.EncryptAES(OpenId, AppSecret);
+            }
+            string timespan = CryptoUtils.EncryptAES(GetTimeStamp(), AppSecret);
+            string url = string.Format(AUTH_URL + "?client_id={0}&open_id={1}&service={2}&redirect_uri={3}&timespan={4}",
+                  AppKey, openSecret, SERVICE_URL, RedirectUrl, timespan);
+            if (!string.IsNullOrEmpty(Extra))
+            {
+                url = string.Format("{0}&extra={1}", url, Extra);
+            }
+            string retUrl = url + "&signature=" + SignatureHelper.GenerateSignature(url, AppSecret);
+            return retUrl.Replace("+", "%2B");
+        }
+
+        /// <summary>
+        /// 根据code获取accessToken和用户信息
+        /// </summary>
+        /// <param name="code">code</param>
+        /// <param name="schoolId">学校ID</param>
+		public override void GetAccessTokenByCode(string code, string schoolId = null)
+        {
+            var client = new WebClient();
+            client.Encoding = System.Text.Encoding.UTF8;
+            try
+            {
+                //验证服务器证书回调自动验证
+                ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
+                string url = string.Format(TOKEN_URL + "?client_id={0}&code={1}&redirect_uri={2}", AppKey, code, RedirectUrl);
+                string retUrl = url + "&signature=" + SignatureHelper.GenerateSignature(url, AppSecret);
+                string data = client.DownloadString(retUrl);
+                IDictionary<string, string> access_token_dic = data.ToObject<IDictionary<string,string>>();
+                if (access_token_dic.ContainsKey("access_token"))
+                    AccessToken = access_token_dic["access_token"];
+                //获取用户openid
+                string userProfileUrl = string.Format(PROFILE_URL + "?access_token={0}&schoolId={1}", AccessToken, schoolId);
+                string ret = client.DownloadString(userProfileUrl);
+                IDictionary<string, string> openId_dic = ret.ToObject<IDictionary<string, string>>();
+                if (openId_dic.ContainsKey("open_id"))
+                {
+                    OpenId = openId_dic["open_id"];
+                }
+                if (!string.IsNullOrEmpty(OpenId))
+                {
+                    isAccessTokenSet = true;
+                }
+                else
+                {
+                    if (openId_dic.ContainsKey("error"))
+                    {
+                        ErrorMessage = openId_dic["error"];
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                ErrorMessage = "服务器异常:" + ex.Message;
+            }
+        }
+
+        /// <summary>
+        /// 获取当前时间的时间戳
+        /// </summary>
+        /// <returns></returns>
+        private string GetTimeStamp()
+        {
+            TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
+            return ((long)ts.TotalMilliseconds).ToString();
+        }
+
+    }
+    class SignatureHelper
+    {
+        /// <summary>
+        /// 获取参数签名
+        /// </summary>
+        /// <param name="url">需要生成签名的url</param>
+        /// <returns></returns>
+        public static string GenerateSignature(String url, String secret)
+        {
+            int index = url.IndexOf("?");
+            if (index > -1)
+            {
+                //将参数按参数名进行排序,然后对参数值进行加密
+                string paramStr = url.Substring(index + 1);
+                string[] paramKeyValues = paramStr.Split('&');
+                Array.Sort(paramKeyValues);
+                StringBuilder paramValueStr = new StringBuilder();
+                foreach (string param in paramKeyValues)
+                {
+                    string[] paramKeyValue = param.Split(new char[] { '=' }, 2);
+                    paramValueStr.Append(paramKeyValue[1]);
+                }
+                paramValueStr.Append(secret);
+                return CryptoUtils.EncryptMD5(paramValueStr.ToString());
+            }
+            return "";
+        }
+
+        /// <summary>
+        /// 获取参数签名
+        /// </summary>
+        /// <param name="paramDic">参数键值对</param>
+        /// <param name="secret">加密秘钥</param>
+        /// <returns></returns>
+        public static string GenerateSignature(SortedDictionary<string, string> paramDic, String secret)
+        {
+            if (paramDic.Count > 0)
+            {
+                string paramStr = string.Concat(string.Join("", paramDic.Values), secret);
+                return CryptoUtils.EncryptMD5(paramStr);
+            }
+            return "";
+        }
+
+        /// <summary>
+        /// 获取参数签名
+        /// </summary>
+        /// <param name="paramList">参数键值对</param>
+        /// <param name="secret">加密秘钥</param>
+        /// <returns></returns>
+        public static string GenerateSignature(SortedList<string, string> paramList, String secret)
+        {
+            if (paramList.Count > 0)
+            {
+                string paramStr = string.Concat(string.Join("", paramList.Values), secret);
+                return CryptoUtils.EncryptMD5(paramStr);
+            }
+            return "";
+        }
+    }
+    public class CryptoUtils
+    {
+        /// <summary>
+        /// MD5加密
+        /// </summary>
+        /// <param name="encryptString">待加密的字符串</param>
+        /// <returns>加密过的字符串</returns>
+        public static string EncryptMD5(string encryptString)
+        {
+            byte[] result = Encoding.UTF8.GetBytes(encryptString);
+            MD5 md5 = new MD5CryptoServiceProvider();
+            byte[] output = md5.ComputeHash(result);
+            string encryptResult = BitConverter.ToString(output).Replace("-", "");
+            return encryptResult;
+        }
+
+        #region AES
+        /// <summary>  
+        /// AES加密  
+        /// </summary>  
+        /// <param name="str">待加密字符串</param>  
+        /// <returns>加密后字符串</returns>  
+        public static string EncryptAES(string str, string key)
+        {
+            try
+            {
+                //分组加密算法  
+                AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
+                byte[] inputByteArray = Encoding.UTF8.GetBytes(str);//得到需要加密的字节数组   
+                //设置密钥及密钥向量  
+                aes.Key = Encoding.UTF8.GetBytes(key);
+                //aes.IV = Encoding.UTF8.GetBytes(key);  
+                aes.Mode = CipherMode.ECB;
+                aes.Padding = PaddingMode.PKCS7;
+                byte[] cipherBytes = null;
+                using (MemoryStream ms = new MemoryStream())
+                {
+                    using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
+                    {
+                        cs.Write(inputByteArray, 0, inputByteArray.Length);
+                        cs.FlushFinalBlock();
+                        cipherBytes = ms.ToArray();//得到加密后的字节数组  
+                        cs.Close();
+                        ms.Close();
+                    }
+                }
+                return Convert.ToBase64String(cipherBytes);
+            }
+            catch { }
+            return str;
+        }
+
+        /// <summary>  
+        /// AES解密  
+        /// </summary>  
+        /// <param name="str">待解密字符串</param>  
+        /// <returns>解密后字符串</returns>  
+        public static string DecryptAES(string str, string key)
+        {
+            try
+            {
+                byte[] cipherText = Convert.FromBase64String(str);
+                AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
+                aes.Key = Encoding.UTF8.GetBytes(key);
+                //aes.IV = Encoding.UTF8.GetBytes(key);  
+                aes.Mode = CipherMode.ECB;
+                aes.Padding = PaddingMode.PKCS7;
+                byte[] decryptBytes = new byte[cipherText.Length];
+                using (MemoryStream ms = new MemoryStream(cipherText))
+                {
+                    using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))
+                    {
+                        cs.Read(decryptBytes, 0, decryptBytes.Length);
+                        cs.Close();
+                        ms.Close();
+                    }
+                }
+                return Encoding.UTF8.GetString(decryptBytes).Replace("\0", "");   //将字符串后尾的'\0'去掉  
+            }
+            catch { }
+            return str;
+        }
+        #endregion
+
+    }
+}

+ 38 - 5
TEAMModelOS/Controllers/Third/Xkw/XkwOAuth2Controller.cs

@@ -29,6 +29,9 @@ using System.Web;
 using static TEAMModelOS.Controllers.FixDataController;
 using static TEAMModelOS.SDK.SchoolService;
 using Microsoft.AspNetCore.Hosting;
+using TEAMModelOS.Filter;
+using TEAMModelOS.Controllers.Third.Xkw;
+
 namespace TEAMModelOS.Controllers
 {
     // <summary>
@@ -39,7 +42,7 @@ namespace TEAMModelOS.Controllers
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //
     //[Route("")]
-    //[Route("api/[controller]")]
+    [Route("xkw")]
     [ApiController]
     public class XkwOAuth2Controller : ControllerBase
     {
@@ -94,11 +97,41 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
 
-        [HttpGet("{path}/oauth2")]
-        [AllowAnonymous]
-        public async Task<IActionResult> Oauth2([FromQuery] OAuth oauth2, string path) {
+        [HttpGet("oauth")]
+        [Authorize(Roles = "IES")]
+        [AuthToken(Roles = "teacher,admin,area,student")]
+        public async Task<IActionResult> Oauth2() {
             //https://ssoserviceurl/oauth2/authorize?client_id=APPKEY&openid=OPENID=&service=SERVICE
-            return Ok(new { oauth2, path });
+            var (tmdid, _, _, school) = HttpContext.GetAuthTokenInfo();
+            var client = GetOpenAuthClient(tmdid);
+            string url = client.GetAuthorizationUrl();
+            return Redirect(url);
+        }
+
+
+        /// <summary>
+        /// 封装一个方法来初始化OpenAuth客户端
+        /// </summary>
+        /// <returns></returns>
+        private XkwOAuthClient GetOpenAuthClient(string tmdid)
+        {
+            // var accessToken = Session["access_token"] == null ? string.Empty : (string)Session["access_token"];
+
+            string accessToken = "";//应该从别的地方获取 不是mvc 无法从Session 获取 
+            //var userId = Request.Cookies["userId"] == null ? string.Empty : Request.Cookies["userId"].Value;
+            var userId = tmdid;//直接传递获取
+            //var openId = xkwOAuthTxtHelper.GetOpenIdByUserId(userId);
+            var openId = "";//直接从数据库获取
+           // var settings = ConfigurationManager.AppSettings;
+           // var client = new XkwOAuthClient(settings["OAuth_Xkw_AppKey"], settings["OAuth_Xkw_AppSecret"], settings["OAuth_Xkw_RedirectUrl"], settings["OAuth_Xkw_OAuthHost"], accessToken, openId, userId);
+            string OAuth_Xkw_AppKey = "";//直接从配置文件获取
+            string OAuth_Xkw_AppSecret = "";//直接从配置文件获取
+            string OAuth_Xkw_RedirectUrl = "";//直接从配置文件获取
+            string OAuth_Xkw_OAuthHost = "";//直接从配置文件获取
+            string OAuth_Xkw_ServiceUrl = "";
+            var client = new XkwOAuthClient(OAuth_Xkw_AppKey, OAuth_Xkw_AppSecret, OAuth_Xkw_RedirectUrl, OAuth_Xkw_OAuthHost, accessToken, openId, userId);
+            client.SERVICE_URL = OAuth_Xkw_ServiceUrl;
+            return client;
         }
     }
 }

+ 6 - 11
TEAMModelOS/appsettings.Development.json

@@ -25,7 +25,7 @@
     },
     "Cosmos": {
       //"ConnectionString": "AccountEndpoint=https://teammodel.documents.azure.com:443/;AccountKey=opemBAZi0yATewIlhxDYoIEUqncT5qJh3pUBZsBkTqEkuLYTuu3VS7oaDGJlPp8ASwm5SVSrK2caJsjgmqRw9g==;"
-      "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
+     "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
       //"ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"
     },
     "Redis": {
@@ -99,16 +99,11 @@
 
     ///学科网测试站
     "xkw": {
-      "appKey": "key808", //学科网分配的appkey
-      "appSecret": "ed4545f513444725bd811e909d3ac79f", //学科网分配的appSecret
-      "service": "http://t.zxxk.com/user/uc", // 学科网的服务,如http://www.zxxk.com/、http://zujuan.xkw.com/等,注意域名后面的斜杠不能少,更多服务可联系客服获取
-      "oauthServerUrl": "https://t.zxxk.com" //学科网Oauth认证平台地址
+      "OAuth_Xkw_AppKey": "key808", //学科网分配的appkey
+      "OAuth_Xkw_AppSecret": "ed4545f513444725bd811e909d3ac79f", //学科网分配的appSecret
+      "OAuth_Xkw_RedirectUrl": "http://kong.sso.com/Demo/Authorized",
+      "OAuth_Xkw_OAuthHost": "https://t.zxxk.com/oauth2/", // 学科网的服务,如http://www.zxxk.com/、http://zujuan.xkw.com/等,注意域名后面的斜杠不能少,更多服务可联系客服获取
+      "OAuth_Xkw_ServiceUrl": "https://t.zxxk.com/user/info" //学科网Oauth认证平台地址
     }
-    //"xkw": {
-    //  "appKey": "key808", //学科网分配的appkey
-    //  "appSecret": "ed4545f513444725bd811e909d3ac79f", //学科网分配的appSecret
-    //  "service": "http://t.zxxk.com/user/uc", // 学科网的服务,如http://www.zxxk.com/、http://zujuan.xkw.com/等,注意域名后面的斜杠不能少,更多服务可联系客服获取
-    //  "oauthServerUrl": "https://t.zxxk.com" //学科网Oauth认证平台地址
-    //}
   }
 }