瀏覽代碼

小程序,文件上传

黄贺彬 5 年之前
父節點
當前提交
63cf3405c4
共有 31 個文件被更改,包括 1289 次插入100 次删除
  1. 43 0
      HiTeachCC.Library/Common/WeChatCryptHelper.cs
  2. 7 0
      HiTeachCC.Library/HiTeachCC.Library.csproj
  3. 28 0
      HiTeachCC.Model/Core/Dtos/MiniAPPUserInfo.cs
  4. 20 0
      HiTeachCC.Model/Core/Dtos/TeamModelIdInfo.cs
  5. 18 0
      HiTeachCC.Model/Core/Dtos/TicketInfo.cs
  6. 0 20
      HiTeachCC.Model/Core/Dtos/WeChatOauth2Token.cs
  7. 32 0
      HiTeachCC.Model/Core/Models/LoginInfo.cs
  8. 27 0
      HiTeachCC.Model/Core/Models/MiniAPPLoginInfo.cs
  9. 34 0
      HiTeachCC.Model/Core/Models/MiniAPPToken.cs
  10. 30 24
      HiTeachCC.Model/Core/Models/TeamModelUser.cs
  11. 25 0
      HiTeachCC.Model/Core/Models/WeChatToken.cs
  12. 60 20
      HiTeachCC.Model/Core/Models/WeChatUser.cs
  13. 2 2
      HiTeachCC.Model/HiTeachCC.Model.csproj
  14. 39 0
      HiTeachCC.Service/Core/Implement/BaseService.cs
  15. 65 0
      HiTeachCC.Service/Core/Implement/FileService.cs
  16. 386 0
      HiTeachCC.Service/Core/Implement/LoginInfoService.cs
  17. 15 0
      HiTeachCC.Service/Core/Interface/IBaseService.cs
  18. 10 0
      HiTeachCC.Service/Core/Interface/IBusinessService.cs
  19. 13 0
      HiTeachCC.Service/Core/Interface/IFileService.cs
  20. 20 0
      HiTeachCC.Service/Core/Interface/ILoginInfoService.cs
  21. 7 2
      HiTeachCC.Service/HiTeachCC.Service.csproj
  22. 9 3
      HiTeachCC.sln
  23. 48 0
      HiTeachCC/Controllers/Core/BaseController.cs
  24. 41 0
      HiTeachCC/Controllers/Core/FileController.cs
  25. 116 0
      HiTeachCC/Controllers/Core/LoginController.cs
  26. 3 3
      HiTeachCC/HiTeachCC.csproj
  27. 27 0
      HiTeachCC/JwtRsaFile/private.pem
  28. 9 0
      HiTeachCC/JwtRsaFile/public.pem
  29. 45 8
      HiTeachCC/Startup.cs
  30. 53 16
      HiTeachCC/appsettings.Development.json
  31. 57 2
      HiTeachCC/appsettings.json

+ 43 - 0
HiTeachCC.Library/Common/WeChatCryptHelper.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace HiTeachCC.Library.Common
+{
+  public static class WeChatCryptHelper
+    {
+        public static string AESDecrypt(string encryptedDataStr, string key, string iv)
+        {
+            RijndaelManaged rijalg = new RijndaelManaged();
+            //-----------------    
+            //设置 cipher 格式 AES-128-CBC    
+
+            rijalg.KeySize = 128;
+
+            rijalg.Padding = PaddingMode.PKCS7;
+            rijalg.Mode = CipherMode.CBC;
+
+            rijalg.Key = Convert.FromBase64String(key);
+            rijalg.IV = Convert.FromBase64String(iv);
+            byte[] encryptedData = Convert.FromBase64String(encryptedDataStr);
+            //解密    
+            ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
+            string result;
+
+            using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
+            {
+                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
+                {
+                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
+                    {
+
+                        result= srDecrypt.ReadToEnd();
+                    }
+                }
+            }
+            return result;
+        }
+    }
+}

+ 7 - 0
HiTeachCC.Library/HiTeachCC.Library.csproj

@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+  </PropertyGroup>
+
+</Project>

+ 28 - 0
HiTeachCC.Model/Core/Dtos/MiniAPPUserInfo.cs

@@ -0,0 +1,28 @@
+using MessagePack;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.Core.Dtos
+{
+    [MessagePackObject(keyAsPropertyName: true)]
+    public  class MiniAPPUserInfo
+    {
+        public string openId { get; set; }
+        public string nickName { get; set; }
+        public int gender { get; set; }
+        public string language { get; set; }
+        public string city { get; set; }
+        public string province { get; set; }
+        public string country { get; set; }
+        public string avatarUrl { get; set; }
+        public string unionId { get; set; }
+        public Watermark watermark { get; set; }
+    }
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class Watermark {
+        public int timestamp { get; set; }
+        public string appid { get; set; }
+    }
+}
+

+ 20 - 0
HiTeachCC.Model/Core/Dtos/TeamModelIdInfo.cs

@@ -0,0 +1,20 @@
+using MessagePack;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.Core.Dtos
+{
+    /// <summary>
+    /// 对接醍摩豆ID封装信息
+    /// </summary>
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class TeamModelIdInfo
+    {
+        public string name { get; set; }
+        public string cellphone { get; set; }
+        public string countryCode { get; set; }
+        public string id { get; set; }
+        public string[] iesStation { get; set; }
+    }
+}

+ 18 - 0
HiTeachCC.Model/Core/Dtos/TicketInfo.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.Core.Dtos
+{
+    /// <summary>
+    /// 前端返回获取的醍摩豆ID登录基本信息及ticket
+    /// </summary>
+    public class TicketInfo
+    {
+        public string Ticket { get; set; }
+        public string Name { get; set; }
+        public string Sign { get; set; }
+        public string TeamModelId { get; set; }
+        public string Token { get; set; }
+    }
+}

+ 0 - 20
HiTeachCC.Model/Core/Dtos/WeChatOauth2Token.cs

@@ -1,20 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace HiTeachCC.Model.Core.Dtos
-{
-    public class WeChatOauth2Token
-    { 
-        // 网页授权接口调用凭证
-        private string accessToken { get; set; }
-        // 凭证有效时长
-        private int expiresIn { get; set; }
-        // 用于刷新凭证
-        private string refreshToken { get; set; }
-        // 用户标识
-        private string openId { get; set; }
-        // 用户授权作用域
-        private string scope { get; set; }
-    }
-}

+ 32 - 0
HiTeachCC.Model/Core/Models/LoginInfo.cs

@@ -0,0 +1,32 @@
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.Core.Models
+{
+    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; }
+    }
+}

+ 27 - 0
HiTeachCC.Model/Core/Models/MiniAPPLoginInfo.cs

@@ -0,0 +1,27 @@
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+
+namespace HiTeachCC.Model.Core.Models
+{
+
+    [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class MiniAPPLoginInfo:TableEntity
+    {
+        public string openid { get; set; }
+        public string session_key { get; set; }
+        public string unionid { get; set; }
+        /// <summary>
+        /// -1      系统繁忙,此时请开发者稍候再试  
+        /// 0       请求成功  
+        /// 40029   code 无效  
+        /// 45011   频率限制,每个用户每分钟100次
+        /// </summary>
+        public int errcode { get; set; }
+        public string errmsg { get; set; }
+    }
+}

+ 34 - 0
HiTeachCC.Model/Core/Models/MiniAPPToken.cs

@@ -0,0 +1,34 @@
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+
+namespace HiTeachCC.Model.Core.Models
+{
+    /// <summary>
+    /// access_token 的存储与更新
+    ///access_token 的存储至少要保留 512 个字符空间;
+    ///access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
+    ///建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
+    ///access_token 的有效期通过返回的 expire_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
+    ///access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
+    /// </summary>
+    [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class MiniAPPToken :TableEntity
+    {
+        public string access_token { get; set; }
+        public string expires_in { get; set; }
+        /// <summary>
+        /// -1      系统繁忙,此时请开发者稍候再试  
+        /// 0       请求成功  
+        /// 40001	AppSecret 错误或者 AppSecret 不属于这个小程序,请开发者确认 AppSecret 的正确性
+        /// 40002	请确保 grant_type 字段值为 client_credential
+        /// 40013	不合法的 AppID,请开发者检查 AppID 的正确性,避免异常字符,注意大小写
+        /// </summary>
+        public int errcode { get; set; }
+        public string errmsg { get; set; }
+    }
+}

+ 30 - 24
HiTeachCC.Model/Core/Models/TeamModelUser.cs

@@ -1,4 +1,5 @@
-using Microsoft.WindowsAzure.Storage.Table;
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
 using System;
 using System.Collections.Generic;
 using System.Text;
@@ -7,71 +8,76 @@ using TEAMModelOS.SDK.Context.Attributes.Azure;
 namespace HiTeachCC.Model.Core.Models
 {
     [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
     public  class TeamModelUser : TableEntity
-    {/// <summary>
-     /// 真实姓名
-     /// </summary>
-        public string FullName { get; set; }
+    {
         /// <summary>
-        /// 昵称
+        /// 真实姓名
         /// </summary>
-        public string NickName { get; set; }
+        public string fullName { get; set; }
         /// <summary>
-        /// 性别
+        /// 昵称
         /// </summary>
-        public string Sex { get; set; }
+        public string nickName { get; set; }
         /// <summary>
-        /// 手机号
+        /// 性别
         /// </summary>
-        public string Cellphone { get; set; }
+        public int sex { get; set; }
+       
         /// <summary>
         /// 邮箱
         /// </summary>
-        public string Email { get; set; }
+        public string email { get; set; }
         /// <summary>
         /// 醍摩豆ID
         /// </summary>
-        public string TeamModelId { get; set; }
+        public string teamModelId { get; set; }
         /// <summary>
         /// 头像
         /// </summary>
-        public string Header { get; set; }
+        public string headimgUrl { get; set; }
         /// <summary>
         /// 
         /// </summary>
-        public string CountryId { get; set; }
+        public string countryId { get; set; }
         /// <summary>
         /// 国家
         /// </summary>
-        public string CountryName { get; set; }
+        public string country { get; set; }
         /// <summary>
         /// 
         /// </summary>
-        public string ProvinceId { get; set; }
+        public string provinceId { get; set; }
         /// <summary>
         /// 省
         /// </summary>
-        public string ProvinceName { get; set; }
+        public string province { get; set; }
         /// <summary>
         /// 市
         /// </summary>
-        public string CityId { get; set; }
+        public string cityId { get; set; }
         /// <summary>
         /// 
         /// </summary>
-        public string CityName { get; set; }
+        public string city { get; set; }
         /// <summary>
         /// 区县
         /// </summary>
-        public string DistrictId { get; set; }
+        public string districtId { get; set; }
         /// <summary>
         /// 
         /// </summary>
-        public string DistrictName { get; set; }
+        public string districtName { get; set; }
         /// <summary>
         /// 注册时间
         /// </summary>
-        public long RegisterTime { get; set; }
-        public string CountryCode { get; set; }
+        public long registerTime { get; set; }
+        public string phoneCode { get; set; }
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string cellphone { get; set; }
+        // 用户标识
+        public string language { get; set; }
     }
 }

+ 25 - 0
HiTeachCC.Model/Core/Models/WeChatToken.cs

@@ -0,0 +1,25 @@
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+
+namespace HiTeachCC.Model.Core.Models
+{
+    [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class WeChatToken : TableEntity
+    { 
+        // 网页授权接口调用凭证
+        public string access_token { get; set; }
+        // 凭证有效时长
+        public int expires_in { get; set; }
+        // 用于刷新凭证
+        public string refresh_token { get; set; }
+        // 用户标识
+        public string openid { get; set; }
+        // 用户授权作用域
+        public string scope { get; set; }
+    }
+}

+ 60 - 20
HiTeachCC.Model/Core/Models/WeChatUser.cs

@@ -1,4 +1,5 @@
-using Microsoft.WindowsAzure.Storage.Table;
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
 using System;
 using System.Collections.Generic;
 using System.Text;
@@ -7,25 +8,64 @@ using TEAMModelOS.SDK.Context.Attributes.Azure;
 namespace HiTeachCC.Model.Core.Models
 {
     [TableSpace(Name = "Core")]
-    public class WeChatUser:TableEntity
-    {
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class WeChatUser : TableEntity
+    {/// <summary>
+     /// 真实姓名
+     /// </summary>
+        public string fullName { get; set; }
+        /// <summary>
+        /// 昵称
+        /// </summary>
+        public string nickName { get; set; }
+        /// <summary>
+        /// 性别
+        /// </summary>
+        public int gender { get; set; }
+        /// <summary>
+        /// unionId
+        /// </summary>
+        public string unionId { get; set; }
+        /// <summary>
+        /// 头像
+        /// </summary>
+        public string avatarUrl { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string countryId { get; set; }
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string country { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string provinceId { get; set; }
+        /// <summary>
+        /// 省
+        /// </summary>
+        public string province { get; set; }
+        /// <summary>
+        /// 市
+        /// </summary>
+        public string cityId { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string city { get; set; }
+        /// <summary>
+        /// 注册时间
+        /// </summary>
+        public long registerTime { get; set; }
+        public string phoneCode { get; set; }
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string cellphone { get; set; }
         // 用户标识
-        private string OpenId { get; set; }
-        // 用户昵称
-        private string Nickname { get; set; }
-        // 性别(1是男性,2是女性,0是未知)
-        private int Sex { get; set; }
-        // 国家
-        private string Country { get; set; }
-        // 省份
-        private string Province { get; set; }
-        // 城市
-        private string City { get; set; }
-        // 用户头像链接
-        private string HeadImgUrl { get; set; }
-        public string Language { get; set; }
-        //// 用户特权信息
-        //private List<String> privilegeList;
-
+        public string openId { get; set; }
+        public string language { get; set; }
+        public string appid { get; set; }
     }
 }

+ 2 - 2
HiTeachCC.Model/HiTeachCC.Model.csproj

@@ -1,11 +1,11 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.0" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.3" />
   </ItemGroup>
 
 </Project>

+ 39 - 0
HiTeachCC.Service/Core/Implement/BaseService.cs

@@ -0,0 +1,39 @@
+using HiTeachCC.Service.Core.Interface;
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Module.AzureTable.Implements;
+
+namespace HiTeachCC.Service.Core.Implement
+{
+    public class BaseService : AzureTableDBRepository, IBaseService
+    {
+        public async Task<List<T>> FindListByDictHasAll<T>(Dictionary<string, object> dict) where T : TableEntity, new()
+        {
+            if (dict.Count <= 0)
+            {
+                return await FindAll<T>();
+            }
+            else
+            {
+                return await FindListByDict<T>(dict);
+            }
+        }
+        public async Task<int> DeleteAll<T>(Dictionary<string, object> dict) where T : TableEntity, new()
+        {
+            List<T> list = await FindListByDict<T>(dict);
+            if (list.IsNotEmpty())
+            {
+                list = await DeleteAll<T>(list);
+                return list.Count;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+}

+ 65 - 0
HiTeachCC.Service/Core/Implement/FileService.cs

@@ -0,0 +1,65 @@
+using HiTeachCC.Service.Core.Interface;
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Network.HttpHelper;
+using TEAMModelOS.SDK.Helper.Security.ShaHash;
+using TEAMModelOS.SDK.Module.AzureBlob.Container;
+using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
+using TEAMModelOS.SDK.Module.PowerPointX;
+using TEAMModelOS.SDK.Module.PowerPointX.Model;
+
+namespace HiTeachCC.Service.Core.Implement
+{
+    public class FileService : BaseService, IFileService
+    {
+
+        private readonly IAzureBlobDBRepository azureBlobDBRepository;
+
+        public FileService(IAzureBlobDBRepository _azureBlobDBRepository) {
+            azureBlobDBRepository = _azureBlobDBRepository;
+        }
+        public async Task<Dictionary<string, object>> UploadDocument(IFormFile file)
+        {
+            Dictionary<string, object> resdict = new Dictionary<string, object>();
+            string shaCode = ShaHashHelper.GetSHA1(file.OpenReadStream());
+            long length = file.Length;
+            Dictionary<string, object> dict = new Dictionary<string, object> { { "Sha1Code", shaCode } };
+            List<AzureBlobModel> models = await FindListByDict<AzureBlobModel>(dict);
+
+            if (models.IsNotEmpty())
+            {
+                resdict.Add("FileUrl", models[0].BlobUrl);
+                resdict.Add("Sha1Code", models[0].Sha1Code);
+            }
+            if (FileType.GetExtention(file.FileName).ToLower().Equals("pptx"))
+            {
+                var pptxjson = HttpHelper.HttpGet(models[0].BlobUrl);
+                AzureBlobModel azureBlobModel= await azureBlobDBRepository.UploadFile(file, "pptfiles");
+                azureBlobModel.Sha1Code = shaCode;
+                PresentationConvert convert = new PresentationConvert();
+                PPTXInfo info = convert.LoadPresentation(file.OpenReadStream());
+                resdict.Add("pptx", info);
+                resdict.Add("model", azureBlobModel);
+                resdict.Add("type", "pptx");
+                return resdict;
+            }
+            if (FileType.GetExtention(file.FileName).ToLower().Equals("pdf"))
+            {
+                AzureBlobModel azureBlobModel = await azureBlobDBRepository.UploadFile(file, "pdffiles");
+                azureBlobModel.Sha1Code = shaCode;
+                resdict.Add("model", azureBlobModel);
+                resdict.Add("type", "pdf");
+                return resdict;
+            }
+            else {
+                throw new BizException(500, "file type does not support!");
+            }
+        }
+    }
+}

+ 386 - 0
HiTeachCC.Service/Core/Implement/LoginInfoService.cs

@@ -0,0 +1,386 @@
+using HiTeachCC.Library.Common;
+using HiTeachCC.Model.Core.Dtos;
+using HiTeachCC.Model.Core.Models;
+using HiTeachCC.Service.Core.Interface;
+using IdentityModel;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Extension.HttpClient.Implements;
+using TEAMModelOS.SDK.Extension.JwtAuth.JwtHelper;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
+using TEAMModelOS.SDK.Helper.Network.HttpHelper;
+using TEAMModelOS.SDK.Helper.Security.BCryptHelper;
+
+namespace HiTeachCC.Service.Core.Implement
+{
+    public class LoginInfoService : BaseService, ILoginInfoService
+    {
+        private readonly HttpClientUserInfo _httpClientService;
+
+        public LoginInfoService(HttpClientUserInfo httpClientUserInfo)
+        {
+            _httpClientService = httpClientUserInfo;
+        }
+        public async Task<object> VerifyWeChat(Dictionary<string, object> dict) {
+            if (dict.TryGetValue("code", out object code)) {
+                WeChatToken oauth2Token = await GetWeChatAccessToken(code!=null?code.ToString():"");
+                oauth2Token.RowKey = oauth2Token.access_token;
+                oauth2Token.PartitionKey = "WeChatOauth2Token";
+                oauth2Token = await SaveOrUpdate<WeChatToken>(oauth2Token);
+
+                
+            }
+            return null; 
+        }
+        /// <summary>
+        /// 获取微信AccessToken
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        private async Task<WeChatToken> GetWeChatAccessTokenClient()
+        {
+            
+            string requestUrl = BaseConfigModel.Configuration["HaBookAuth:WeChatAccessTokenUrlClient"] + "appid={{APPID}}&secret={{SECRET}}&code={{CODE}}&grant_type=client_credential";
+            requestUrl = requestUrl.Replace("{{APPID}}", BaseConfigModel.Configuration["HaBookAuth:WeChatAppID"]);
+            requestUrl = requestUrl.Replace("{{SECRET}}", BaseConfigModel.Configuration["HaBookAuth:WeChatAppSecret"]);
+            string info = await HttpHelper.HttpGetAsync(requestUrl);
+            return MessagePackHelper.JsonToObject<WeChatToken>(info);
+        }
+
+
+        /// <summary>
+        /// 获取微信AccessToken
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        private async Task<WeChatToken> GetWeChatAccessToken(string Code ) {
+            if (string.IsNullOrEmpty(Code)) {
+                return null; 
+            }
+            string requestUrl = BaseConfigModel.Configuration["HaBookAuth:WeChatAccessTokenUrlCode"] + "appid={{APPID}}&secret={{SECRET}}&code={{CODE}}&grant_type=authorization_code";
+            requestUrl = requestUrl.Replace("{{APPID}}", BaseConfigModel.Configuration["HaBookAuth:WeChatAppID"]);
+            requestUrl = requestUrl.Replace("{{SECRET}}", BaseConfigModel.Configuration["HaBookAuth:WeChatAppSecret"]);
+            requestUrl = requestUrl.Replace("{{CODE}}", Code);
+            string  info= await HttpHelper.HttpGetAsync(requestUrl);
+            return MessagePackHelper.JsonToObject<WeChatToken>(info);
+        }
+
+        /// <summary>
+        /// 获取微信登录跳转链接
+        /// </summary>
+        /// <param name="time">13位时间戳</param>
+        /// <returns></returns>
+        public Dictionary<string, object> GetWechatConfig(string Time)
+        {
+            Dictionary<string, object> config = new Dictionary<string, object>();
+            config.Add("WeChatAuthorizeUrlCode", BaseConfigModel.Configuration["HaBookAuth:WeChatAuthorizeUrlCode"] + "?appid="+ BaseConfigModel.Configuration["HaBookAuth:WeChatAppID"] + "&redirect_uri={{redirect_uri}}&response_type=code&scope=snsapi_userinfo&state="+ Time + "#wechat_redirect");
+            return config;
+        }
+
+        public async Task<MiniAPPLoginInfo> VerifyMiniAPP(Dictionary<string, object> dict)
+        {
+            MiniAPPLoginInfo loginInfo = null ;
+            if (dict.TryGetValue("js_code", out object js_code))
+            {
+                if (string.IsNullOrEmpty(js_code != null ? js_code.ToString() : ""))
+                {
+                    throw new Exception( "Validation failure , js_code is null!");
+                }
+                string requestUrl = BaseConfigModel.Configuration["HaBookAuth:MiniAPPAuthUrl"];
+                requestUrl = requestUrl.Replace("{{APPID}}", BaseConfigModel.Configuration["HaBookAuth:MiniAPPID"]);
+                requestUrl = requestUrl.Replace("{{SECRET}}", BaseConfigModel.Configuration["HaBookAuth:MiniAPPSECRET"]);
+                requestUrl = requestUrl.Replace("{{JSCODE}}", js_code.ToString());
+                string info = await HttpHelper.HttpGetAsync(requestUrl);
+                loginInfo = MessagePackHelper.JsonToObject<MiniAPPLoginInfo>(info);
+                if (loginInfo != null)
+                {
+                    if (loginInfo.errcode != 0)
+                    {
+                        throw new Exception( loginInfo.errmsg);
+                    }
+                }
+                else {
+                    throw new Exception( "Validation failure , loginInfo is null !");
+                }
+            }
+            else {
+                throw new Exception( "js_code is null !");
+            }
+            return loginInfo;
+        }
+
+        /// <summary>
+        /// 获取微信AccessToken
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        public async Task<MiniAPPToken> GetMiniAPPAccessToken()
+        {
+            string requestUrl = BaseConfigModel.Configuration["HaBookAuth:MiniAPPAccessTokenUrl"];
+            requestUrl = requestUrl.Replace("{{APPID}}", BaseConfigModel.Configuration["HaBookAuth:MiniAPPID"]);
+            requestUrl = requestUrl.Replace("{{SECRET}}", BaseConfigModel.Configuration["HaBookAuth:MiniAPPSECRET"]);
+            string info = await HttpHelper.HttpGetAsync(requestUrl);
+            MiniAPPToken miniAPPToken= MessagePackHelper.JsonToObject<MiniAPPToken>(info);
+            if (miniAPPToken != null)
+            {
+                if (miniAPPToken.errcode != 0)
+                {
+                    throw new Exception( miniAPPToken.errmsg);
+                }
+            }
+            else {
+                throw new Exception( "Validation failure,miniAPPToken is null!");
+            }
+            return miniAPPToken;
+        }
+        /// <summary>
+        /// 获取用户登录信息
+        /// </summary>
+        /// <param name="unionid"></param>
+        /// <param name="access_token"></param>
+        /// <returns></returns>
+        public async Task<WeChatUser> GetWeChatUserInfo(string session_key ,Dictionary<string ,object> dict) {
+            string enData = "";
+            if (dict.TryGetValue("encryptedData", out object encryptedData) && dict.TryGetValue("iv", out object iv)) {
+                if (encryptedData != null && iv != null) {
+                    /**
+                     *{"openId":"oLaYK45lBS8HWSAXJisDdIlEWj3A",
+                     * "nickName":"菁華浮梦、℡",
+                     * "gender":1,
+                     * "language":"zh_CN",
+                     * "city":"Chengdu",
+                     * "province":"Sichuan",
+                     * "country":"China",
+                     * "avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83er98z4MsFd1xKML71TwQuR1Bxnt7ib3SGrNsKiaBCLYbLeS7KAT8h0ia8byiaVzurvEpVmmQpSzBQs5Nw/132",
+                     * "unionId":"oqADO5qdTR6PItxhmDEPCsWU9PqI",
+                     * "watermark":{"timestamp":1562224447,"appid":"wxf4905703824211aa"}}
+                     **/
+                    enData = WeChatCryptHelper.AESDecrypt(encryptedData.ToString(),session_key,iv.ToString());
+
+                }
+            }
+
+            //string requestUrl = BaseConfigModel.Configuration["HaBookAuth:UnionidUserinfo"];
+            //requestUrl = requestUrl.Replace("{{openid}}", unionid);
+            //WeChatToken weChatToken = await GetWeChatAccessTokenClient();
+            //requestUrl = requestUrl.Replace("{{access_token}}", weChatToken.access_token);
+            //string info = await HttpHelper.HttpGetAsync(requestUrl);
+            MiniAPPUserInfo miniAPPUser = MessagePackHelper.JsonToObject<MiniAPPUserInfo>(enData);
+            if (miniAPPUser != null)
+            {
+                WeChatUser weChatUser = new WeChatUser();
+                weChatUser.RowKey = miniAPPUser.unionId;
+                weChatUser.PartitionKey = miniAPPUser.country;
+                weChatUser.nickName = miniAPPUser.nickName;
+                weChatUser.gender = miniAPPUser.gender;
+                weChatUser.avatarUrl = miniAPPUser.avatarUrl;
+                weChatUser.country = miniAPPUser.country;
+                weChatUser.city = miniAPPUser.city;
+                weChatUser.province = miniAPPUser.province;
+                weChatUser.openId = miniAPPUser.openId;
+                weChatUser.unionId = miniAPPUser.unionId;
+                weChatUser.appid = miniAPPUser.watermark.appid;
+                await SaveOrUpdate<WeChatUser>(weChatUser);
+                return weChatUser;
+            }
+            else {
+                throw new Exception( "Validation failure,miniAPPToken is null!");
+            }
+        }
+        public async Task<JwtResponse> MiniAPPLogin(Dictionary<string, object> dict) {
+            MiniAPPLoginInfo  loginInfo= await VerifyMiniAPP(dict);
+            WeChatUser weChatUser = await GetWeChatUserInfo(loginInfo.session_key , dict);
+            JwtResponse jwt= CreateJwtToken(weChatUser);
+            LoginInfo login = new LoginInfo();
+            login.RowKey = Guid.NewGuid().ToString();
+            login.PartitionKey = weChatUser.PartitionKey;
+            login.TeamModelId = weChatUser.unionId;
+            login.Token = jwt.Access_token;
+            login.Scope = jwt.Scope;
+            return jwt; 
+        }
+        public  JwtResponse CreateJwtToken(WeChatUser user) {
+             ClaimModel model = new ClaimModel
+            {
+                Scope = "MiniAPP"
+            };
+            if (user!=null )
+            {
+                model.Claims.Add(new Claim(JwtClaimTypes.Name, user.nickName));
+                model.Claims.Add(new Claim(JwtClaimTypes.Id, user.unionId));
+                model.Claims.AddRange("Student".Split(',').Select(s => new Claim(JwtClaimTypes.Role, s)));
+                model.Roles.Add("Student");
+                JwtResponse jwtResponse = JwtHelper.IssueJWT(model, BaseConfigModel.Configuration.GetSection("JwtSetting").Get<JwtSetting>());
+                return jwtResponse;
+            }
+            else {
+                throw new Exception( "Validation failure,user is null !");
+            }
+        }
+        public JwtResponse CreateJwtToken(LoginInfo login) {
+            ClaimModel model = new ClaimModel
+            {
+                Scope = "WebAPP"
+            };
+            if (login != null)
+            {
+                model.Claims.Add(new Claim(JwtClaimTypes.Name, login.Name));
+                model.Claims.Add(new Claim(JwtClaimTypes.Id, login.TeamModelId));
+                model.Claims.AddRange("Student".Split(',').Select(s => new Claim(JwtClaimTypes.Role, s)));
+                model.Roles.Add("Teacher");
+                JwtResponse jwtResponse = JwtHelper.IssueJWT(model, BaseConfigModel.Configuration.GetSection("JwtSetting").Get<JwtSetting>());
+                return jwtResponse;
+            }
+            else
+            {
+                throw new Exception("Validation failure,user is null !");
+            }
+        }
+
+        public async Task<JwtResponse> TeamModelLogin(TicketInfo ticketInfo) {
+            if (string.IsNullOrEmpty(ticketInfo.Token))
+            {
+                if (string.IsNullOrEmpty(ticketInfo.Ticket))
+                {
+                    throw new BizException(401, "Unauthorized");
+                }
+                string code = BCryptHelper.Ecrypt(ticketInfo.Ticket + ticketInfo.TeamModelId);
+                bool f = BCryptHelper.Verify(ticketInfo.Ticket + ticketInfo.TeamModelId, ticketInfo.Sign);
+                LoginInfo login = FindOneByKey<LoginInfo>("Ticket", ticketInfo.Ticket).Result;
+                if (login != null && !string.IsNullOrEmpty(login.Token))
+                {
+                    JwtResponse token =  CreateJwtToken(login);
+                    login.Token = token.Access_token;
+                    await Update<LoginInfo>(login);
+                    return token;
+                }
+
+                ///不验证TmdID
+                #region
+                /*
+                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.phoneCode = "86";
+                JwtResponse jwtToken =  CreateJwtToken(loginInfo);
+                loginInfo.Token = jwtToken.Access_token;
+                loginInfo.Scope = jwtToken.Scope;
+                await Save<LoginInfo>(loginInfo);
+                await SaveOrUpdate<TeamModelUser>(user);
+                return jwtToken;
+                */
+                #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)
+                    {
+                        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.phoneCode = response.result.countryCode;
+                        JwtResponse jwtToken =  CreateJwtToken(loginInfo);
+                        loginInfo.Token = jwtToken.Access_token;
+                        loginInfo.Scope = jwtToken.Scope;
+                        await Save<LoginInfo>(loginInfo);
+                        await SaveOrUpdate<TeamModelUser>(user);
+                        return jwtToken;
+                    }
+                    else
+                    {
+                        throw new BizException(401, "Unauthorized");
+                    }
+                }
+                else
+                {
+                    throw new BizException(401, "Unauthorized");
+                }
+            }
+            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 JwtResponse { Access_token = loginInfo.Token, Scope = loginInfo.Scope };
+                }
+                else
+                {
+                    throw new BizException(401, "Unauthorized");
+                }
+            }
+        }
+    }
+}

+ 15 - 0
HiTeachCC.Service/Core/Interface/IBaseService.cs

@@ -0,0 +1,15 @@
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
+
+namespace HiTeachCC.Service.Core.Interface
+{
+    public interface IBaseService : IBusinessService, IAzureTableDBRepository
+    {
+       Task<List<T>> FindListByDictHasAll<T>(Dictionary<string, object> dict) where T : TableEntity, new();
+       Task<int> DeleteAll<T>(Dictionary<string, object> dict) where T : TableEntity, new();
+    }
+}

+ 10 - 0
HiTeachCC.Service/Core/Interface/IBusinessService.cs

@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Service.Core.Interface
+{
+    public interface IBusinessService
+    {
+    }
+}

+ 13 - 0
HiTeachCC.Service/Core/Interface/IFileService.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+
+namespace HiTeachCC.Service.Core.Interface
+{
+    public interface IFileService : IBusinessService, IBaseService
+    {
+        Task<Dictionary<string, object>> UploadDocument(IFormFile file);
+    }
+}

+ 20 - 0
HiTeachCC.Service/Core/Interface/ILoginInfoService.cs

@@ -0,0 +1,20 @@
+using HiTeachCC.Model.Core.Dtos;
+using HiTeachCC.Model.Core.Models;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+
+namespace HiTeachCC.Service.Core.Interface
+{
+    public interface ILoginInfoService : IBusinessService, IBaseService
+    {
+        Task<object> VerifyWeChat(Dictionary<string, object> @params);
+        Dictionary<string, object> GetWechatConfig(string Time);
+        Task<MiniAPPLoginInfo> VerifyMiniAPP(Dictionary<string, object> dict);
+        Task<MiniAPPToken> GetMiniAPPAccessToken();
+        Task<JwtResponse> MiniAPPLogin(Dictionary<string, object> @params);
+        Task<JwtResponse> TeamModelLogin(TicketInfo ticket);
+    }
+}

+ 7 - 2
HiTeachCC.Service/HiTeachCC.Service.csproj

@@ -1,11 +1,16 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>
-    <Folder Include="Core\" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\HiTeachCC.Library\HiTeachCC.Library.csproj" />
+    <ProjectReference Include="..\HiTeachCC.Model\HiTeachCC.Model.csproj" />
   </ItemGroup>
 
 </Project>

+ 9 - 3
HiTeachCC.sln

@@ -3,11 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.29020.237
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HiTeachCC", "HiTeachCC\HiTeachCC.csproj", "{069FD114-EE9D-45DB-BCBD-A385E61871C9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HiTeachCC", "HiTeachCC\HiTeachCC.csproj", "{069FD114-EE9D-45DB-BCBD-A385E61871C9}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HiTeachCC.Service", "HiTeachCC.Service\HiTeachCC.Service.csproj", "{C295FAE9-E82B-4F53-872B-204DBF0AE96A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HiTeachCC.Service", "HiTeachCC.Service\HiTeachCC.Service.csproj", "{C295FAE9-E82B-4F53-872B-204DBF0AE96A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HiTeachCC.Model", "HiTeachCC.Model\HiTeachCC.Model.csproj", "{A9DB542B-40F4-4E60-BCC3-CAAF5FF2FB9A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HiTeachCC.Model", "HiTeachCC.Model\HiTeachCC.Model.csproj", "{A9DB542B-40F4-4E60-BCC3-CAAF5FF2FB9A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HiTeachCC.Library", "HiTeachCC.Library\HiTeachCC.Library.csproj", "{2A6F52BE-1A13-4F8B-8E8E-3735B5EF25FC}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +29,10 @@ Global
 		{A9DB542B-40F4-4E60-BCC3-CAAF5FF2FB9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A9DB542B-40F4-4E60-BCC3-CAAF5FF2FB9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A9DB542B-40F4-4E60-BCC3-CAAF5FF2FB9A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2A6F52BE-1A13-4F8B-8E8E-3735B5EF25FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2A6F52BE-1A13-4F8B-8E8E-3735B5EF25FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2A6F52BE-1A13-4F8B-8E8E-3735B5EF25FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2A6F52BE-1A13-4F8B-8E8E-3735B5EF25FC}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 48 - 0
HiTeachCC/Controllers/Core/BaseController.cs

@@ -0,0 +1,48 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension.JwtAuth.JwtHelper;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+using TEAMModelOS.SDK.Context.Constant.Common;
+namespace HiTeachCC.Controllers.Core
+{
+
+    public class BaseController : Controller
+    {
+        public List<string> GetLoginUser(string claimType)
+        {
+            var tokenHeader = "";
+            HttpRequest request = HttpContext.Request;
+            if (request.Headers.ContainsKey(Constants.AUTHORIZATION))
+            {
+                tokenHeader = request.Headers[Constants.AUTHORIZATION];
+                //tokenHeader = tokenHeader.ToString().Substring("Bearer ".Length).Trim();
+                tokenHeader = tokenHeader.Replace("Bearer ", "");
+            }
+            if (request.Query.ContainsKey(Constants.ACCESS_TOKEN))
+            {
+                tokenHeader = request.Query[Constants.ACCESS_TOKEN];
+                tokenHeader = tokenHeader.Trim();
+            }
+            if (string.IsNullOrEmpty(tokenHeader))
+            {
+                return null;
+            }
+            ClaimModel claimModel = JwtHelper.SerializeJWT(tokenHeader);
+            claimModel.Claim.TryGetValue(claimType, out var claimValue);
+            List<string> claimValues = new List<string>();
+            foreach (Claim claim in claimModel.Claims)
+            {
+                if (claim.Type.Equals(claimType))
+                {
+                    claimValues.Add(claim.Value);
+                }
+            }
+            return claimValues;
+        }
+    }
+}

+ 41 - 0
HiTeachCC/Controllers/Core/FileController.cs

@@ -0,0 +1,41 @@
+using HiTeachCC.Service.Core.Interface;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+
+namespace HiTeachCC.Controllers.Core
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    [Authorize]
+    public class FileController : BaseController
+    {
+
+        private readonly IFileService fileService;
+
+        public FileController(IFileService _fileService) {
+            fileService = _fileService;
+        }
+        /// <summary>
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("UploadDocument")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<BaseJosnRPCResponse> UploadDocument([FromForm] IFormFile file)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+          
+            Dictionary<string, object> model = await fileService.UploadDocument(file);
+
+            return responseBuilder.Data(model).build();
+        }
+
+    }
+}

+ 116 - 0
HiTeachCC/Controllers/Core/LoginController.cs

@@ -0,0 +1,116 @@
+using HiTeachCC.Model.Core.Dtos;
+using HiTeachCC.Model.Core.Models;
+using HiTeachCC.Service.Core.Interface;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+
+namespace HiTeachCC.Controllers.Core
+{
+
+    [Route("api/[controller]")]
+    [ApiController]
+    public class LoginController : BaseController
+    {
+       
+        public LoginController(ILoginInfoService _loginInfoService)
+        {
+            loginInfoService = _loginInfoService;
+        }
+        private readonly ILoginInfoService loginInfoService;
+        /// <summary>
+        /// 验证微信登录
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("VerifyWeChat")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> VerifyWeChat(JosnRPCRequest<Dictionary<string ,object>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            object obj= await loginInfoService.VerifyWeChat(request.@params);
+            return responseBuilder.Data(obj).build();
+        }
+        /// <summary>
+        /// 获取微信登录配置
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("GetWechatConfig")]
+        [AllowAnonymous]
+        public  BaseJosnRPCResponse GetWechatConfig(JosnRPCRequest<string> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            Dictionary<string ,object> obj =   loginInfoService.GetWechatConfig(request.@params);
+            return responseBuilder.Data(obj).build();
+        }
+
+        /// <summary>
+        /// 验证小程序登录,获取信息
+        /// js_code :"  "
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("VerifyMiniAPP")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> VerifyMiniAPP(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            MiniAPPLoginInfo obj = await loginInfoService.VerifyMiniAPP(request.@params);
+            return responseBuilder.Data(obj).build();
+        }
+        /// <summary>
+        /// 获取小程序AccessToken
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("GetMiniAPPAccessToken")]
+        [Authorize]
+        public async Task<BaseJosnRPCResponse> GetMiniAPPAccessToken(BaseJosnRPCRequest request) {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            MiniAPPToken obj = await loginInfoService.GetMiniAPPAccessToken();
+            return responseBuilder.Data(obj).build();
+        }
+        /// <summary>
+        /// 获取小程序AccessToken
+        /// code 
+        /// encryptedData
+        /// iv
+        /// signature
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("MiniAPPLogin")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> MiniAPPLogin(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            JwtResponse obj = await loginInfoService.MiniAPPLogin(request.@params);
+            return responseBuilder.Data(obj).build();
+        }
+
+        /// <summary>
+        /// 获取小程序AccessToken
+        /// code 
+        /// encryptedData
+        /// iv
+        /// signature
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("TeamModelLogin")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> TeamModelLogin(JosnRPCRequest<TicketInfo> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            JwtResponse obj = await loginInfoService.TeamModelLogin(request.@params);
+            return responseBuilder.Data(obj).build();
+        }
+    }
+}

+ 3 - 3
HiTeachCC/HiTeachCC.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
@@ -9,12 +9,12 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.App" />
     <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
-    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.0" />
+    <PackageReference Include="TEAMModelOS.SDK" Version="1.0.3" />
   </ItemGroup>
 
 
   <ItemGroup>
-    <Folder Include="Controllers\Core\" />
+    <ProjectReference Include="..\HiTeachCC.Service\HiTeachCC.Service.csproj" />
   </ItemGroup>
 
 </Project>

+ 27 - 0
HiTeachCC/JwtRsaFile/private.pem

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAq8pNyi9hNGbjAU16coA/W6hBQb92YbLFKuePbpmRg7nc/8be
+iGI6ngl0IDmbAcyQEN5IHN8B1xma33RSXdlRO3+fiUlk81gV1uSYTaiRAWL0TryM
+Kf9avQsw+ezP5HVNQRj75lZZxeNg9YTbjVEbVAj/cF/0E8xBdplk1+AyrZTk/0Cl
+04Pr+dM5R+fisgIp3sEULORzhpow38l+S2YjoCagsckPKhSuqLEkB3KoiFJKCoHK
+UJ+dOfYoa6m3N5ylQCm79HzWeS7PSaXVq6Qh+nxNvA2FkSgcSPc1a1vNKXCwHW2H
+ShKsPGugaRCZPTHPDip05suatheVU4AhpVq9MwIDAQABAoIBAEN7ZLNXiUecYu/Q
+D5mK51iJ75h0LXyTTQBdlepMSO0FxdpztFa+v2f1Lri56Dn8sVru9kThFUf5tuyw
+NOrIwzAsIe879XvhzjJr+agH3248ANwtFKIqvOoly0dhzwhfS8mWlt0Ubo9dkmjf
+l58bjTClmDH8f1SHl++Osh5a441rmoTMfx6YyvTp5ekHLGsll24nOVE3w/6MWTvU
+wBoNFFMvkb062l3QSG/3iPgwEsk8VNX3+7MRp40gurEk51wGL91ysKQq6k8xe8JI
+fMN6x+D8ZuVSOzUMwK4JjoXR646bEEmQMTO/uypQqvXav2V2k5pLW40tlirR48il
+9OYCNAECgYEA4tjAqEbnhHuErcgtzQCHD24/vAXuDiKw58Caq+Bae6QgkqjWC2IQ
+FAkLuvZ2tQSx0EVDZ1+1qP9PLVx2Q1DYs+CwiOKaM04M3XAbppgonZ4+PWiSWUKa
+6jKXmHmQeuCWQRlCrinrrPsrRhNbc1UvhjRWFtlOeHEjMp8kkMvqKFMCgYEAwd4y
+TuaV8fAExYsNZtBTx1lyyp+2Yk3zjNG4AsxJZ7QRx5VQVXmh5Y9CMvkwB09KQonF
+IcHYWMuseLvVfweQwH3WS4D8G/zf92GISLtsIUes4bDxs3lFipoCutzJt3hcHYIs
+fcKW29VravnY5P1FBL7Kw1FV9fReC5G8Kr56+6ECgYAToDka1feVyLHz7wu3XsJQ
+nXM6KzErW+j+Q/WdxS1O4SZISf8qwPMvKJExPb2Lb7qKkFOCkA9BbcVF4WgB7u6w
+sVHUpfY9VhVa2yYpRaTN7jDoUzHGMzL/7Bydfnb3ipK1UyAnvUy8jIZz65zP36Da
+9ZA1LdvSI8ety4L4XAwILQKBgEG0D3LEHT9grA1TIhidNDeUrh3T4RkR+B/al7WD
+DMGzum7cwNwnG+JUGghygX+ItM82J/RX4P2/EVXduu6RXtKOE0mFjmvh2PnbOTgF
+JRFmXEYlFNVRnWrq5U/1MfwXM4jgrDl28G/StdQMlyCMYY7JJqjpcOuphRIAszf9
+VGrhAoGBAOEsLNr0BUZncJRgPEr+v1mI89d53WlM13J1YOaw7xVdvAPbOPlUix3f
+/ZGka2N14K4Dt1NjpwpGfMrfZFAlWKIiF9HFaXmTFjK68JK9HFJfW01k6qfiltH1
+0vhPZ/VIj6wrkHB61tuu0J8VFdap2KAtop+9HyIRiVsOjxtrASHP
+-----END RSA PRIVATE KEY-----

+ 9 - 0
HiTeachCC/JwtRsaFile/public.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq8pNyi9hNGbjAU16coA/
+W6hBQb92YbLFKuePbpmRg7nc/8beiGI6ngl0IDmbAcyQEN5IHN8B1xma33RSXdlR
+O3+fiUlk81gV1uSYTaiRAWL0TryMKf9avQsw+ezP5HVNQRj75lZZxeNg9YTbjVEb
+VAj/cF/0E8xBdplk1+AyrZTk/0Cl04Pr+dM5R+fisgIp3sEULORzhpow38l+S2Yj
+oCagsckPKhSuqLEkB3KoiFJKCoHKUJ+dOfYoa6m3N5ylQCm79HzWeS7PSaXVq6Qh
++nxNvA2FkSgcSPc1a1vNKXCwHW2HShKsPGugaRCZPTHPDip05suatheVU4AhpVq9
+MwIDAQAB
+-----END PUBLIC KEY-----

+ 45 - 8
HiTeachCC/Startup.cs

@@ -2,21 +2,37 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using HiTeachCC.Service.Core.Interface;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
 using Microsoft.AspNetCore.HttpsPolicy;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Context.Filter;
+using TEAMModelOS.SDK.Extension.HttpClient;
+using TEAMModelOS.SDK.Extension.JwtAuth;
+using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
+using TEAMModelOS.SDK.Module.AzureCosmosDB.Configuration;
+using TEAMModelOS.SDK.Module.AzureTable.Configuration;
 
 namespace HiTeachCC
 {
     public class Startup
     {
-        public Startup(IConfiguration configuration)
+        public Startup(IConfiguration configuration, IHostingEnvironment env)
         {
             Configuration = configuration;
+
+            var builder = new ConfigurationBuilder()
+               .SetBasePath(env.ContentRootPath)
+               .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
+               .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);//增加环境配置文件,新建项目默认有
+            this.Configuration = builder.Build();
+            BaseConfigModel.SetBaseConfig(Configuration, env.ContentRootPath, env.WebRootPath);
         }
 
         public IConfiguration Configuration { get; }
@@ -24,15 +40,36 @@ namespace HiTeachCC
         // This method gets called by the runtime. Use this method to add services to the container.
         public void ConfigureServices(IServiceCollection services)
         {
-            services.Configure<CookiePolicyOptions>(options =>
+            //services.Configure<CookiePolicyOptions>(options =>
+            //{
+            //    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
+            //    options.CheckConsentNeeded = context => true;
+            //    options.MinimumSameSitePolicy = SameSiteMode.None;
+            //});
+            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
+            services.Configure<FormOptions>(x =>
             {
-                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
-                options.CheckConsentNeeded = context => true;
-                options.MinimumSameSitePolicy = SameSiteMode.None;
+                x.ValueLengthLimit = int.MaxValue;
+                x.MultipartBodyLengthLimit = long.MaxValue; // In case of multipart
+                x.MultipartHeadersLengthLimit = int.MaxValue;
             });
 
-
-            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
+            //Table配置
+            //services.AddAzureTableStorage().AddConnection(Configuration.GetSection("Azure:Table").Get<AzureTableOptions>());
+            //使用Blob配置
+            services.AddAzureBlobStorage().AddConnection(Configuration.GetSection("Azure:Blob").Get<AzureBlobOptions>());
+            //CosmosDB
+            services.AddAzureCosmosDB().AddCosmosDBConnection(Configuration.GetSection("Azure:CosmosDB").Get<AzureCosmosDBOptions>());
+            //全局扫描基于IBusinessService接口的实现类
+            services.Scan(scan => scan.FromApplicationDependencies()
+               .AddClasses(classes => classes.AssignableTo<IBusinessService>())
+                   .AsImplementedInterfaces()
+                   .WithSingletonLifetime());
+            //引入Jwt配置
+            services.JwtAuth(Configuration.GetSection("JwtSetting"));
+            //HttpContextAccessor,并用来访问HttpContext。
+            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
+            services.AddHttp();
         }
 
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -48,7 +85,7 @@ namespace HiTeachCC
                 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                 app.UseHsts();
             }
-
+            app.UseMiddleware<HttpGlobalExceptionInvoke>();
             app.UseHttpsRedirection();
             app.UseStaticFiles();
             app.UseCookiePolicy();

+ 53 - 16
HiTeachCC/appsettings.Development.json

@@ -5,22 +5,59 @@
       "System": "Information",
       "Microsoft": "Information"
     },
-    "HaBookAuth": {
-      "TeamModelRegistUrl": "https://account.habookaclass.biz/regist?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
-      "TeamModelLoginUrl": "https://account.habookaclass.biz/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
-      "AccountUrl": "https://api.habookaclass.biz/account",
-      "ServiceUrl": "https://api.habookaclass.biz/service",
-      "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
-      "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",
-      "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
-      "BindingIESKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
-      "CreateTestSerialNumKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDcmVhdGVUZXN0U2VyaWFsIiwiYXVkIjoiY2hlbmdkdUNyZWF0ZVRlc3RTZXJpYWwiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM5NjgwMjUxLCJuYmYiOjE1Mzk2ODAyNTEsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.K-4rqcJ8O2mFxIdSiSJTuvo_Nwb_NfZ1yjpXJFQjKM0",
-      "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg==",
-      "WeChatAppID": "wx24935f75b589bc17",
-      "WeChatAppSecret": "7deb6aaaeb6299ffe68aac741f1fdd35",
-      "WeChatAuthorizeUrl": "https://open.weixin.qq.com/connect/oauth2/authorize",
-      "WeChatAccessTokenUrl": "https://api.weixin.qq.com/sns/oauth2/access_token",
-      "WeChatUserinfo": "https://api.weixin.qq.com/sns/userinfo"
+    "AllowedHosts": "*"
+  },
+  "Azure": {
+    "Table": {
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=hiteachcc;AccountKey=9bX1qEVLRdK67bFO396VkhzsSQbOrMdSxV3O0TOmv5p3pLswHXHsekLiXv79hyO7GjQ2CnSNNUNt2Y1RQzEMtg==;EndpointSuffix=core.chinacloudapi.cn",
+      "AzureTableDialect": ""
+    },
+    "Blob": {
+      "ConnectionString": "https://teammodelstorage.blob.core.chinacloudapi.cn/hiteachcc?st=2019-07-04T11%3A35%3A39Z&se=2070-07-05T11%3A35%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=6y93fcIRmzQpx7bz9GxJd2nqVQFFEflQqAE0U9uLZPw%3D",
+      "Container": "teammodelos",
+      "AzureTableDialect": ""
+    },
+    "CosmosDB": {
+      "ConnectionString": "https://hiteachcc.documents.azure.cn:443/",
+      "ConnectionKey": "vHZYhQDj63K0Xx5QDkcUN6s6sL2cUHrPVfRlQinrIFsSUY0APNj4E8jjfYiMPrSoFalvpBVCJgZIKM1RAmU9Pw==",
+      "Database": "HiTeachCC",
+      "AzureTableDialect": "",
+      "CollectionThroughput": 400
     }
+  },
+  "HaBookAuth": {
+    "TeamModelRegistUrl": "https://account.habookaclass.biz/regist?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "TeamModelLoginUrl": "https://account.habookaclass.biz/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "AccountUrl": "https://api.habookaclass.biz/account",
+    "ServiceUrl": "https://api.habookaclass.biz/service",
+    "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",
+    "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
+    "BindingIESKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "CreateTestSerialNumKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDcmVhdGVUZXN0U2VyaWFsIiwiYXVkIjoiY2hlbmdkdUNyZWF0ZVRlc3RTZXJpYWwiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM5NjgwMjUxLCJuYmYiOjE1Mzk2ODAyNTEsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.K-4rqcJ8O2mFxIdSiSJTuvo_Nwb_NfZ1yjpXJFQjKM0",
+    "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg==",
+    "WeChatAppID": "wx24935f75b589bc17",
+    "WeChatAppSecret": "7deb6aaaeb6299ffe68aac741f1fdd35",
+    "WeChatAuthorizeUrl": "https://open.weixin.qq.com/connect/oauth2/authorize",
+    "WeChatAccessTokenUrlClient": "https://api.weixin.qq.com/cgi-bin/token",
+    "WeChatAccessTokenUrlCode": "https://api.weixin.qq.com/sns/oauth2/access_token",
+    "WeChatUserinfo": "https://api.weixin.qq.com/sns/userinfo",
+    "MiniAPPID": "wxf4905703824211aa",
+    "MiniAPPSECRET": "5d19f01f5b0f7b15fc7c671146625539",
+    "MiniAPPAuthUrl": "https://api.weixin.qq.com/sns/jscode2session?appid={{APPID}}&secret={{SECRET}}&js_code={{JSCODE}}&grant_type=authorization_code",
+    "MiniAPPAccessTokenUrl": "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={{APPID}}&secret={{APPSECRET}}",
+    "MiniAPPMessageSend": "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token={{ACCESS_TOKEN}}",
+    "UnionidUserinfo": "https://api.weixin.qq.com/cgi-bin/user/info?access_token={{access_token}}&openid={{openid}}"
+  },
+  "JwtSetting": {
+    "Issuer": "HaBook", //Ç©·¢Õß
+    "Audience": "HiTeachCC",
+    "JwtClient": [
+      {
+        "Name": "MiniAPP",
+        "Project": "HiTeachCC",
+        "Exp": 7200
+      }
+    ]
   }
 }

+ 57 - 2
HiTeachCC/appsettings.json

@@ -1,8 +1,63 @@
 {
   "Logging": {
     "LogLevel": {
-      "Default": "Warning"
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    },
+    "AllowedHosts": "*"
+  },
+  "Azure": {
+    "Table": {
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=hiteachcc;AccountKey=9bX1qEVLRdK67bFO396VkhzsSQbOrMdSxV3O0TOmv5p3pLswHXHsekLiXv79hyO7GjQ2CnSNNUNt2Y1RQzEMtg==;EndpointSuffix=core.chinacloudapi.cn",
+      "AzureTableDialect": ""
+    },
+    "Blob": {
+      "ConnectionString": "https://teammodelstorage.blob.core.chinacloudapi.cn/hiteachcc?st=2019-07-04T11%3A35%3A39Z&se=2070-07-05T11%3A35%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=6y93fcIRmzQpx7bz9GxJd2nqVQFFEflQqAE0U9uLZPw%3D",
+      "Container": "teammodelos",
+      "AzureTableDialect": ""
+    },
+    "CosmosDB": {
+      "ConnectionString": "https://localhost:8081",
+      "ConnectionKey": "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
+      "Database": "TEAMModelOS",
+      "AzureTableDialect": "",
+      "CollectionThroughput": 400
     }
   },
-  "AllowedHosts": "*"
+  "HaBookAuth": {
+    "TeamModelRegistUrl": "https://account.habookaclass.biz/regist?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "TeamModelLoginUrl": "https://account.habookaclass.biz/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "AccountUrl": "https://api.habookaclass.biz/account",
+    "ServiceUrl": "https://api.habookaclass.biz/service",
+    "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",
+    "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
+    "BindingIESKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "CreateTestSerialNumKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDcmVhdGVUZXN0U2VyaWFsIiwiYXVkIjoiY2hlbmdkdUNyZWF0ZVRlc3RTZXJpYWwiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM5NjgwMjUxLCJuYmYiOjE1Mzk2ODAyNTEsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.K-4rqcJ8O2mFxIdSiSJTuvo_Nwb_NfZ1yjpXJFQjKM0",
+    "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg==",
+    "WeChatAppID": "wx24935f75b589bc17",
+    "WeChatAppSecret": "7deb6aaaeb6299ffe68aac741f1fdd35",
+    "WeChatAuthorizeUrl": "https://open.weixin.qq.com/connect/oauth2/authorize",
+    "WeChatAccessTokenUrlClient": "https://api.weixin.qq.com/cgi-bin/token",
+    "WeChatAccessTokenUrlCode": "https://api.weixin.qq.com/sns/oauth2/access_token",
+    "WeChatUserinfo": "https://api.weixin.qq.com/sns/userinfo",
+    "MiniAPPID": "wxf4905703824211aa",
+    "MiniAPPSECRET": "5d19f01f5b0f7b15fc7c671146625539",
+    "MiniAPPAuthUrl": "https://api.weixin.qq.com/sns/jscode2session?appid={{APPID}}&secret={{SECRET}}&js_code={{JSCODE}}&grant_type=authorization_code",
+    "MiniAPPAccessTokenUrl": "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={{APPID}}&secret={{APPSECRET}}",
+    "MiniAPPMessageSend": "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token={{ACCESS_TOKEN}}",
+    "UnionidUserinfo": "https://api.weixin.qq.com/cgi-bin/user/info?access_token={{access_token}}&openid={{openid}}"
+  },
+  "JwtSetting": {
+    "Issuer": "HaBook", //Ç©·¢Õß
+    "Audience": "HiTeachCC",
+    "JwtClient": [
+      {
+        "Name": "MiniAPP",
+        "Project": "HiTeachCC",
+        "Exp": 7200
+      }
+    ]
+  }
 }