黄贺彬 5 роки тому
батько
коміт
26c518ad4e
39 змінених файлів з 1133 додано та 115 видалено
  1. 17 1
      HiTeachCC.Model/Core/Dtos/TeamModelIdInfo.cs
  2. 0 23
      HiTeachCC.Model/Core/Models/ClassRoom.cs
  3. 2 2
      HiTeachCC.Model/Core/Models/LoginInfo.cs
  4. 1 1
      HiTeachCC.Model/Core/Models/TeamModelUser.cs
  5. 4 0
      HiTeachCC.Model/HiTeachCC.Model.csproj
  6. 18 0
      HiTeachCC.Model/PowerPoint/Border.cs
  7. 11 0
      HiTeachCC.Model/PowerPoint/Chart.cs
  8. 31 0
      HiTeachCC.Model/PowerPoint/ColorMap.cs
  9. 19 0
      HiTeachCC.Model/PowerPoint/Connector.cs
  10. 10 0
      HiTeachCC.Model/PowerPoint/Diagram.cs
  11. 16 0
      HiTeachCC.Model/PowerPoint/Fill.cs
  12. 17 0
      HiTeachCC.Model/PowerPoint/FontStyle.cs
  13. 11 0
      HiTeachCC.Model/PowerPoint/GroupShape.cs
  14. 8 25
      HiTeachCC.Model/PowerPoint/Item.cs
  15. 14 0
      HiTeachCC.Model/PowerPoint/Math.cs
  16. 26 0
      HiTeachCC.Model/PowerPoint/Paragraph.cs
  17. 15 0
      HiTeachCC.Model/PowerPoint/Picture.cs
  18. 34 0
      HiTeachCC.Model/PowerPoint/Position.cs
  19. 15 0
      HiTeachCC.Model/PowerPoint/Shape.cs
  20. 4 2
      HiTeachCC.Model/PowerPoint/Slide.cs
  21. 24 0
      HiTeachCC.Model/PowerPoint/Table.cs
  22. 20 0
      HiTeachCC.Model/Teach/Models/Lesson.cs
  23. 21 0
      HiTeachCC.Model/Teach/Models/LessonMember.cs
  24. 48 46
      HiTeachCC.Service/Core/Implement/LoginInfoService.cs
  25. 199 0
      HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs
  26. 180 0
      HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs
  27. 14 0
      HiTeachCC.Service/PowerPoint/Interface/IPowerPointService.cs
  28. 12 0
      HiTeachCC.Service/Teach/Implement/LessonService.cs
  29. 11 0
      HiTeachCC.Service/Teach/Interface/ILessonService.cs
  30. 3 0
      HiTeachCC/ClientApp/package-lock.json
  31. 32 4
      HiTeachCC/Controllers/Core/FileController.cs
  32. 20 1
      HiTeachCC/Controllers/Core/LoginController.cs
  33. 139 0
      HiTeachCC/Controllers/Teach/LessonController.cs
  34. 56 2
      HiTeachCC/HiTeachCC.csproj
  35. 50 6
      HiTeachCC/Startup.cs
  36. 1 1
      HiTeachCC/appsettings.Development.json
  37. 6 1
      HiTeachCC/appsettings.json
  38. 1 0
      HiTeachCC/wwwroot/FB9ugXCIjc.txt
  39. 23 0
      HiTeachCC/wwwroot/index.html

+ 17 - 1
HiTeachCC.Model/Core/Dtos/TeamModelIdInfo.cs

@@ -11,10 +11,26 @@ namespace HiTeachCC.Model.Core.Dtos
     [MessagePackObject(keyAsPropertyName: true)]
     public class TeamModelIdInfo
     {
+
+        public TeamModelIdInfo() {
+            productToken = new List<ProductToken>();
+        }
+        /// <summary>
+        /// 真实名称
+        /// </summary>
         public string name { get; set; }
+        public string nickname { get; set; }
         public string cellphone { get; set; }
         public string countryCode { get; set; }
         public string id { get; set; }
-        public string[] iesStation { get; set; }
+        public string profilePicture { get; set; }
+        public List<ProductToken> productToken { get; set; }
+
+    }
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class ProductToken {
+        public string station { get; set; }
+        public string url { get; set; }
+        public string token { get; set; }
     }
 }

+ 0 - 23
HiTeachCC.Model/Core/Models/ClassRoom.cs

@@ -1,23 +0,0 @@
-using MessagePack;
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace HiTeachCC.Model.Core.Models
-{
-    [MessagePackObject(keyAsPropertyName: true)]
-    public class ClassRoom
-    {
-        public string id { get; set; }
-        public string DeviceId { get; set; }
-        public string RoomNo { get; set; }
-        public string RoomName { get; set; }
-        public string FileName { get; set; }
-        public string FileUrl { get; set; }
-        public string FileSha1Code { get; set; }
-        public string FileType { get; set; }
-        public long CreateTime { get; set; }
-        public string TeamModelId { get; set; }
-        public string Name { get; set; }
-    }
-}

+ 2 - 2
HiTeachCC.Model/Core/Models/LoginInfo.cs

@@ -12,11 +12,11 @@ namespace HiTeachCC.Model.Core.Models
     public class LoginInfo : TableEntity
     {
         public string TeamModelId { get; set; }
-        public string Phone { 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; }
+       // public string CountryCode { get; set; }
         /// <summary>
         /// 登录时间
         /// </summary>

+ 1 - 1
HiTeachCC.Model/Core/Models/TeamModelUser.cs

@@ -35,7 +35,7 @@ namespace HiTeachCC.Model.Core.Models
         /// <summary>
         /// 头像
         /// </summary>
-        public string HeadimgUrl { get; set; }
+        public string HeadImgUrl { get; set; }
         /// <summary>
         /// 
         /// </summary>

+ 4 - 0
HiTeachCC.Model/HiTeachCC.Model.csproj

@@ -8,4 +8,8 @@
     <PackageReference Include="TEAMModelOS.SDK" Version="1.0.6" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Teach\Dtos\" />
+  </ItemGroup>
+
 </Project>

+ 18 - 0
HiTeachCC.Model/PowerPoint/Border.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public  class Border
+    {
+
+        public string Width { get; set; }
+        public string Color { get; set; }
+        public string Type { get; set; }
+        /// <summary>
+        /// 描边
+        /// </summary>
+        public string Stroke{ get; set; }
+    }
+}

+ 11 - 0
HiTeachCC.Model/PowerPoint/Chart.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Chart : Item
+    {
+        
+    }
+}

+ 31 - 0
HiTeachCC.Model/PowerPoint/ColorMap.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class ColorMap
+    {
+
+
+
+
+
+
+
+        public string accent1 { get; set; }
+        public string accent2 { get; set; }
+        public string accent3 { get; set; }
+        public string accent4 { get; set; }
+        public string accent5 { get; set; }
+        public string accent6 { get; set; }
+        public string lt1 { get; set; }
+        public string lt2 { get; set; }
+        public string tx1 { get; set; }
+        public string tx2 { get; set; }
+        public string dk1 { get; set; }
+        public string dk2 { get; set; }
+        public string hlink { get; set; }
+        public string folHlink { get; set; }
+    }
+}

+ 19 - 0
HiTeachCC.Model/PowerPoint/Connector.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+
+    public class Connector : Item
+    {
+        
+        /// <summary>
+        ///连接线 p:cxnSp
+        /// </summary>
+        public string Type { get; set; }
+        public string HeadEnd { get; set; }
+        public string TailEnd { get; set; }
+        public Border border { get; set; }
+    }
+}

+ 10 - 0
HiTeachCC.Model/PowerPoint/Diagram.cs

@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Diagram :Item
+    {
+    }
+}

+ 16 - 0
HiTeachCC.Model/PowerPoint/Fill.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Fill
+    {
+        /// <summary>
+        /// 1.纯色填充 2.渐变填充 3.图片或纹理填充 4.图案填充
+        /// </summary>
+        public string Type;
+        public string Color;
+        public string Image;
+    }
+}

+ 17 - 0
HiTeachCC.Model/PowerPoint/FontStyle.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public  class FontStyle
+    {
+        public string Color { get; set; }
+        public int Size { get; set; }
+        public string Type { get; set; }
+        public string Bold { get; set; }
+        public string Italic { get; set; }
+        public string Decoration { get; set; }
+        public string VerticalAlign { get; set; }
+    }
+}

+ 11 - 0
HiTeachCC.Model/PowerPoint/GroupShape.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class GroupShape : Item
+    {
+        public Shape Shape { get; set; }
+    }
+}

+ 8 - 25
HiTeachCC.Model/PowerPoint/Item.cs

@@ -6,30 +6,13 @@ namespace HiTeachCC.Model.PowerPoint
 {
     public class Item
     {
-        //旋转角度
-        public double Rot { get; set; }
-        //水平翻转
-        public bool FlipH { get; set; }
-        //垂直翻转
-        public bool FlipV { get; set; }
-        //x轴
-        public double X { get; set; }
-        //y轴
-        public double Y { get; set; }
-        //宽度
-        public double Cx { get; set; }
-        //高度
-        public double Cy { get; set; }
-        //初始坐标x
-        public double ChX { get; set; }
-        //初始坐标Y
-        public double ChY { get; set; }
-        //拉伸宽度
-        public double ChcX { get; set; }
-        //拉伸高度
-        public double ChCY { get; set; }
-        //层级
-        public int Index { get; set; }
-
+        public string Type { get; set; }
+        public Position Position { get; set; }
+        public string Xml { get; set; }
+        //public Picture Picture { get; set; }
+        //public Shape Shape { get; set; }
+        //public Math Math { get; set; }
+        //public Table Table { get; set; }
+        //public Chart Chart { get; set; }
     }
 }

+ 14 - 0
HiTeachCC.Model/PowerPoint/Math.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Math : Item
+    {
+    
+        public string Content { get; set; }
+        public Fill Fill { get; set; }
+        public Border Border { get; set; }
+    }
+}

+ 26 - 0
HiTeachCC.Model/PowerPoint/Paragraph.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Paragraph
+    {
+
+        public ParagraphStyle ParagraphStyle { get; set; }
+        public Paragraph() {
+            Texts = new List<Text>();
+        }
+        public List<Text> Texts { get; set; }
+    }
+    public class Text
+    {
+        public string Content;
+        public FontStyle FontStyle; 
+    }
+    public class ParagraphStyle
+    {
+        public string LeftMargin { get; set; }
+        public string Alignment { get; set; }
+    }
+}

+ 15 - 0
HiTeachCC.Model/PowerPoint/Picture.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public   class Picture : Item
+    {
+        
+        //base64编码信息
+        public string Data { get; set; }
+        public Fill Fill { get; set; }
+        public Border Border { get; set; }
+    }
+}

+ 34 - 0
HiTeachCC.Model/PowerPoint/Position.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Position
+    {
+        //旋转角度
+        public double Rot { get; set; }
+        //水平翻转
+        public bool FlipH { get; set; }
+        //垂直翻转
+        public bool FlipV { get; set; }
+        //x轴
+        public double X { get; set; }
+        //y轴
+        public double Y { get; set; }
+        //宽度
+        public double Cx { get; set; }
+        //高度
+        public double Cy { get; set; }
+        //初始坐标x
+        public double ChX { get; set; }
+        //初始坐标Y
+        public double ChY { get; set; }
+        //拉伸宽度
+        public double ChcX { get; set; }
+        //拉伸高度
+        public double ChCY { get; set; }
+        //层级
+        public int Index { get; set; }
+    }
+}

+ 15 - 0
HiTeachCC.Model/PowerPoint/Shape.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+     public class Shape : Item
+    { 
+        public string Type;
+        public Paragraph Paragraph { get; set; }
+        public Fill Fill { get; set; }
+        public Border Border { get; set; }
+
+    }
+}

+ 4 - 2
HiTeachCC.Model/PowerPoint/Slide.cs

@@ -8,8 +8,10 @@ namespace HiTeachCC.Model.PowerPoint
     {
         public Slide()
         {
-            items = new List<Item>();
+            Items = new List<Item>();
         }
-        public List<Item> items { get; set; }
+        public List<Item> Items { get; set; }
+        public Fill Fill { get; set; }
+        public string Xml { get; set; }
     }
 }

+ 24 - 0
HiTeachCC.Model/PowerPoint/Table.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Model.PowerPoint
+{
+    public class Table :Item
+    {
+        public Border Border { get; set; }
+        public Fill Fill { get; set; }
+        public List<Tr> Tr { get; set; }
+    }
+
+    public class Tr {
+        public List<Td> Td { get; set; }
+
+    }
+    public class Td
+    {
+        public int Rowspan { get; set; }
+        public int Colspan { get; set; }
+        public Paragraph Paragraph { get; set; }
+    }
+}

+ 20 - 0
HiTeachCC.Model/Teach/Models/Lesson.cs

@@ -0,0 +1,20 @@
+using MessagePack;
+using Microsoft.WindowsAzure.Storage.Table;
+using System.ComponentModel.DataAnnotations;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+namespace HiTeachCC.Model.Teach.Models
+{
+    [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class Lesson: TableEntity
+    {
+        public string TeamModelId { get; set; }
+        public string Teacher { get; set; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string GroupNum { get; set; }
+        public long CreateTime { get; set; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string DeviceId { get; set; }
+        public int Status { get; set; } = 1;
+    }
+}

+ 21 - 0
HiTeachCC.Model/Teach/Models/LessonMember.cs

@@ -0,0 +1,21 @@
+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.Teach.Models
+{
+    [TableSpace(Name = "Core")]
+    [MessagePackObject(keyAsPropertyName: true)]
+    public class LessonMember : TableEntity
+    {
+        public string  LessonId { get; set; }
+        public long JoinTime { get; set; }
+        public string UnionID { get; set; }
+        public int Status { get; set; }
+        public string Name { get; set; }
+        public string AvatarUrl { get; set; }
+    }
+}

+ 48 - 46
HiTeachCC.Service/Core/Implement/LoginInfoService.cs

@@ -248,7 +248,7 @@ namespace HiTeachCC.Service.Core.Implement
                 throw new Exception("Validation failure,user is null !");
             }
         }
-        public JwtResponse CreateJwtToken(LoginInfo login ,string tiket)
+        public JwtResponse CreateJwtToken(LoginInfo login, string tiket)
         {
             ClaimModel model = new ClaimModel
             {
@@ -275,12 +275,12 @@ namespace HiTeachCC.Service.Core.Implement
             string authorizationCode = HttpContextHelper.GetAuthorizationCode(httpContextAccessor, "");
             if (string.IsNullOrEmpty(authorizationCode))
             {
-                if (string.IsNullOrEmpty(ticketInfo.Ticket))
+                if (ticketInfo != null && 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);
+                // 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))
                 {
@@ -289,53 +289,55 @@ namespace HiTeachCC.Service.Core.Implement
                     await Update<LoginInfo>(login);
                     return token;
                 }
-
-                ///不验证TmdID
-                #region
-                /*
-                LoginInfo loginInfo = new LoginInfo
+                // LoginInfo loginInfo = new LoginInfo
+                // {
+                //     PartitionKey = "loginInfo",
+                //    // Phone = response.result.cellphone,
+                //     RowKey = Guid.NewGuid().ToString(),
+                //     TeamModelId = ticketInfo.TeamModelId,
+                //     Name = ticketInfo.Name,
+                //     Ticket = ticketInfo.Ticket,
+                //     //CountryCode = response.result.countryCode
+                // };
+                // TeamModelUser user = await FindOneByKey<TeamModelUser>("TeamModelId", ticketInfo.TeamModelId);
+                // if (user == null || string.IsNullOrEmpty(user.RowKey))
+                // {
+                //     user = new TeamModelUser { RowKey = Guid.NewGuid().ToString(), PartitionKey ="userInfo", RegisterTime = DateTimeHelper.ConvertToTimeStamp13(DateTime.Now) };
+                // }
+                //// user.Cellphone = response.result.cellphone;
+                // user.NickName = ticketInfo.Name;
+                // if (string.IsNullOrEmpty(user.FullName))
+                // {
+                //     user.FullName = ticketInfo.Name;
+                // }
+                // user.TeamModelId = ticketInfo.TeamModelId;
+                // //user.PhoneCode = response.result.countryCode;
+                // JwtResponse jwtToken = CreateJwtToken(loginInfo, ticketInfo.Ticket);
+                // loginInfo.Token = jwtToken.Access_token;
+                // loginInfo.Scope = jwtToken.Scope;
+                // await Save<LoginInfo>(loginInfo);
+                // await SaveOrUpdate<TeamModelUser>(user);
+                // return jwtToken;
+                string jwttoken = ticketInfo.Token.Replace("Bearer ", "");
+                Dictionary<string, string> headers = new Dictionary<string, string>
                 {
-                    PartitionKey = "15283771540",
-                    Phone = "15283771540",
-                    RowKey = Guid.NewGuid().ToString(),
-                    TeamModelId = ticketInfo.TeamModelId,
-                    Name = ticketInfo.Name,
-                    Ticket = ticketInfo.Ticket,
-                    CountryCode = "86"
+                    { Constants.AUTHORIZATION,"Bearer "+jwttoken },
                 };
-                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"
+                    method = "UserInfoManage"
                 };
-
+              
                 Dictionary<string, object> ticket = new Dictionary<string, object>
                 {
-                    { "ticket", ticketInfo.Ticket }
+                    { "idToken",ticketInfo.Ticket },
+                    { "method", "get" },
+                    { "option", "userInfo"},
+                    { "extraInfo", new object() }
                 };
                 request.@params = ticket;
                 string data = MessagePackHelper.ObjectToJson(request);
-                string jsonStr = _httpClientService.HttpPost(ticketInfo.ServiceUrl+ "/account", data, Constants.CONTENT_TYPE_JSON, Encoding.UTF8);
+                string jsonStr = HttpHelper.HttpPost(BaseConfigModel.Configuration["HaBookAuth:AccountUrl"], data, headers, Constants.CONTENT_TYPE_JSON,1000, Encoding.UTF8);
                 if (!string.IsNullOrEmpty(jsonStr))
                 {
                     JosnRPCResponse<TeamModelIdInfo> response = MessagePackHelper.JsonToObject<JosnRPCResponse<TeamModelIdInfo>>(jsonStr);
@@ -344,27 +346,27 @@ namespace HiTeachCC.Service.Core.Implement
                         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 = new TeamModelUser { RowKey = Guid.NewGuid().ToString(), PartitionKey = response.result.countryCode, RegisterTime = DateTimeHelper.ConvertToTimeStamp13(DateTime.Now) };
                         }
                         user.Cellphone = response.result.cellphone;
-                        user.NickName = response.result.name;
+                        user.FullName= response.result.name;
+                        user.NickName = response.result.nickname;
+                        user.HeadImgUrl = response.result.profilePicture;
                         if (string.IsNullOrEmpty(user.FullName))
                         {
                             user.FullName = response.result.name;
                         }
                         user.TeamModelId = response.result.id;
                         user.PhoneCode = response.result.countryCode;
-                        JwtResponse jwtToken = CreateJwtToken(loginInfo,ticketInfo.Ticket);
+                        JwtResponse jwtToken = CreateJwtToken(loginInfo, ticketInfo.Ticket);
                         loginInfo.Token = jwtToken.Access_token;
                         loginInfo.Scope = jwtToken.Scope;
                         await Save<LoginInfo>(loginInfo);

+ 199 - 0
HiTeachCC.Service/PowerPoint/Implement/PowerPointHelper.cs

@@ -0,0 +1,199 @@
+using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
+using Theme = DocumentFormat.OpenXml.Drawing.Theme;
+
+
+namespace HiTeachCC.Service.PowerPoint.Implement
+{
+    public class PowerPointHelper
+    { /// <summary>
+      /// 在主题Theme中获取颜色
+      /// </summary>
+      /// <param name="scv"></param>
+      /// <param name="theme"></param>
+      /// <returns></returns>
+        public static string ColorForThemeClr(string scv, DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme ,ColorMap colorMap )
+        {
+            string colorStr = "";
+            if (scv.Equals("tx1")) {
+                string s = colorMap.Text1; 
+                colorStr = ColorForThemeClr(colorMap.Text1, colorScheme, colorMap);
+                return colorStr;
+            }
+            else if (scv.Equals("tx2"))
+            {
+                string s = colorMap.Text2;
+                colorStr = ColorForThemeClr(colorMap.Text2, colorScheme, colorMap);
+                return colorStr;
+            }
+            else if (scv.Equals("dk1"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("dk2"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Dark2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Dark2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent1"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent2"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent3"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent3Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent3Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent4"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent4Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent4Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent5"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent5Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent5Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("accent6"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Accent6Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Accent6Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("lt1"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light1Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("lt2"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Light2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Light2Color.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("hlink"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.Hyperlink.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.Hyperlink.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            else if (scv.Equals("folHlink"))
+            {
+                DocumentFormat.OpenXml.Drawing.SystemColor sysColor = colorScheme.FollowedHyperlinkColor.ChildElements.First<DocumentFormat.OpenXml.Drawing.SystemColor>();
+                if (sysColor != null)
+                {
+                    return sysColor.LastColor;
+                }
+                DocumentFormat.OpenXml.Drawing.RgbColorModelHex rgbColor = colorScheme.FollowedHyperlinkColor.ChildElements.First<DocumentFormat.OpenXml.Drawing.RgbColorModelHex>();
+                if (rgbColor != null)
+                {
+                    return rgbColor.Val;
+                }
+                return colorStr;
+            }
+            return colorStr;
+        }
+    }
+}

+ 180 - 0
HiTeachCC.Service/PowerPoint/Implement/PowerPointService.cs

@@ -0,0 +1,180 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Presentation;
+using HiTeachCC.Model.PowerPoint;
+using HiTeachCC.Service.Core.Implement;
+using HiTeachCC.Service.PowerPoint.Interface;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using ColorMap = DocumentFormat.OpenXml.Presentation.ColorMap;
+using Theme = DocumentFormat.OpenXml.Drawing.Theme;
+
+namespace HiTeachCC.Service.PowerPoint.Implement
+{
+    public class PowerPointService : BaseService,  IPowerPointService
+    {
+        const double inchpixel = 96.00, inchpt = 72.00, pxBase = 914400.00, ptBase = 12700;
+        const double rotBase = 60000.00;
+
+        /// <summary>
+        /// 加载PPTX文件
+        /// </summary>
+        /// <param name="presentationFile"></param>
+        /// <returns></returns>
+        public Pptx LoadPresentation(Stream presentationStream)
+        {
+            using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationStream, false))
+            {
+                if (presentationDocument == null)
+                {
+                    throw new ArgumentNullException("presentationDocument");
+                }
+                // Get a PresentationPart object from the PresentationDocument object.
+
+                var thumbnailPart = presentationDocument.ThumbnailPart;
+                var contentType = thumbnailPart.ContentType;
+                string base64 = "";
+                using (var stream = thumbnailPart.GetStream())
+                {
+                    byte[] buffer = new byte[stream.Length];
+                    stream.Read(buffer, 0, buffer.Length);
+                    stream.Close();
+                    base64 = System.Convert.ToBase64String(buffer);
+                    base64 = "data:" + contentType + ";base64," + base64;
+                }
+                PresentationPart presentationPart = presentationDocument.PresentationPart;
+                if (presentationPart != null && presentationPart.Presentation != null)
+                {
+                    // Get a Presentation object from the PresentationPart object.
+                    Presentation presentation = presentationPart.Presentation;
+                    int pageSize = 0;
+                    var slideMasterParts = presentationPart.SlideMasterParts;
+                    ColorMap colorMap = null;
+                    Theme theme = null;
+                    foreach (var slideMasterPart in slideMasterParts)
+                    {
+                        if (colorMap != null && theme != null)
+                        {
+                            break;
+                        }
+                        colorMap = slideMasterPart.SlideMaster.ColorMap;
+                        theme = slideMasterPart.ThemePart.Theme;
+                    }
+                    Dictionary<string,string> colors=   DoColorMap(colorMap, theme);
+                    //获取PPT 一页大小
+                    double x = presentation.SlideSize.Cx * inchpixel / pxBase;
+                    double y = presentation.SlideSize.Cy * inchpixel / pxBase;
+                    List<HiTeachCC.Model.PowerPoint.Slide> slides = new List<HiTeachCC.Model.PowerPoint.Slide>();
+                    if (presentation.SlideIdList != null)
+                    {
+
+                      //  presentation.SlideIdList.OrderBy(x=>x.);
+                        // Get the title of each slide in the slide order.
+                        // 获取的是几页PPT数量
+                        foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
+                        {
+                            HiTeachCC.Model.PowerPoint.Slide slide = new HiTeachCC.Model.PowerPoint.Slide();
+                            // 获取这一页 PPT 的id 
+                            string id = slideId.RelationshipId;
+                            SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
+                            //获取当前页 PPT 的所有元素
+                            // slide.Items = GetSlideElement(slidePart, theme, colorMap);
+                            //slide.Xml = slidePart.Slide.OuterXml;
+                            slides.Add(slide);
+                            pageSize++;
+                        }
+                    }
+                    Pptx info = new Pptx { Slides = slides, Width = x, Height = y, PageSize = pageSize, Thumbnail = base64 };
+                    return info;
+                }
+                return null;
+            }
+        }
+        public HiTeachCC.Model.PowerPoint.Slide GetSlideElement(SlidePart slidePart, Dictionary<string, string>  colors) {
+            var shapeTrees = from shap in slidePart.Slide.Descendants<ShapeTree>() select shap;
+            if (shapeTrees.Count() > 0 && shapeTrees.First().ChildElements.Count > 0)
+            {
+                OpenXmlElementList openXmlElements = shapeTrees.First().ChildElements;
+                int index = 0;
+                foreach (OpenXmlElement element in openXmlElements)
+                {
+                    ProcessNodesInSlide(element ,slidePart, colors, index);
+                    index++;
+                }
+            }
+            return null; 
+        }
+        public string     ProcessNodesInSlide(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int  index ) {
+            if (element is DocumentFormat.OpenXml.Presentation.Shape sp)//p:sp
+            {
+                //  pptElement = ShapeConvert(shape, theme, colorMap, index);
+                ProcessSpNode(sp, slidePart,colors,  index);
+            }
+            else if (element is DocumentFormat.OpenXml.Presentation.Picture pic)//p:pic
+            {
+                ProcessPicNode(pic, slidePart, colors, index);
+                // pptElement = PictureConvert(picture, theme, colorMap, slidePart, index);
+            }
+            else if (element is DocumentFormat.OpenXml.AlternateContent mc)//mc:alternatecontent 
+            {
+                ProcessMcNode(mc, slidePart, colors, index);
+                /// pptElement = AlternateContentConvert(content, theme, colorMap, slidePart, index);
+            }
+            else if(element is DocumentFormat.OpenXml.Presentation.GraphicFrame graphicFrame)//p:graphicFrame
+            {
+                ProcessGraphicFrameNode(graphicFrame, slidePart, colors, index);
+                /// pptElement = GraphicFrameConvert(graphicFrame, theme, colorMap, index);
+            }
+            else  if (element is DocumentFormat.OpenXml.Presentation.GroupShape grpSp)//p:grpSp
+            {
+                ProcessGrpSpNode(grpSp, slidePart, colors, index);
+                /// pptElement = GroupShapeConvert(groupShape, theme, colorMap, index);
+            }
+            else if (element is DocumentFormat.OpenXml.Presentation.ConnectionShape cxnSp) // p:cxnSp
+            {
+                ProcessCxnSpNode(cxnSp, slidePart, colors, index);
+                ///  pptElement = ConnectionShapeConvert(connectionShape, theme, colorMap, index);
+            }
+            return null; 
+        }
+        public string ProcessSpNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index) {
+            return null;
+        }
+        public string ProcessPicNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index)
+        {
+            return null;
+        }
+        public string ProcessMcNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index)
+        {
+            return null;
+        }
+        public string ProcessGraphicFrameNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index)
+        {
+            return null;
+        }
+        public string ProcessGrpSpNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index)
+        {
+            var shapes = from shap in element.Descendants<DocumentFormat.OpenXml.Presentation.Shape>() select shap;
+            foreach (var shape in shapes) {
+               string s =  ProcessNodesInSlide(shape, slidePart, colors, index);
+            }
+            return null;
+        }
+        public string ProcessCxnSpNode(OpenXmlElement element, SlidePart slidePart, Dictionary<string, string> colors, int index)
+        {
+            return null;
+        }
+        public Dictionary<string, string> DoColorMap(ColorMap colorMap , Theme theme) {
+            string[] colors = { "accent1", "accent2", "accent3", "accent4", "accent5", "accent6",
+                                "lt1", "lt2", "tx1", "tx2", "dk1","dk2","hlink","folHlink" };
+            DocumentFormat.OpenXml.Drawing.ColorScheme colorScheme = theme.ThemeElements.ColorScheme;
+            Dictionary<string, string> pairs = new Dictionary<string, string>();
+            foreach (var col in colors) {
+                pairs.Add(col, PowerPointHelper.ColorForThemeClr(col, colorScheme, colorMap));
+            }
+            return pairs; 
+        }
+    }
+}

+ 14 - 0
HiTeachCC.Service/PowerPoint/Interface/IPowerPointService.cs

@@ -0,0 +1,14 @@
+using HiTeachCC.Model.PowerPoint;
+using HiTeachCC.Service.Core.Interface;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace HiTeachCC.Service.PowerPoint.Interface
+{
+    public interface IPowerPointService : IBusinessService, IBaseService
+    {
+        Pptx LoadPresentation(Stream presentationStream); 
+    }
+}

+ 12 - 0
HiTeachCC.Service/Teach/Implement/LessonService.cs

@@ -0,0 +1,12 @@
+using HiTeachCC.Service.Core.Implement;
+using HiTeachCC.Service.Teach.Interface;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Service.Teach.Implement
+{
+    public class LessonService : BaseService, ILessonService
+    {
+    }
+}

+ 11 - 0
HiTeachCC.Service/Teach/Interface/ILessonService.cs

@@ -0,0 +1,11 @@
+using HiTeachCC.Service.Core.Interface;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HiTeachCC.Service.Teach.Interface
+{
+    public interface ILessonService : IBusinessService, IBaseService
+    {
+    }
+}

+ 3 - 0
HiTeachCC/ClientApp/package-lock.json

@@ -0,0 +1,3 @@
+{
+  "lockfileVersion": 1
+}

+ 32 - 4
HiTeachCC/Controllers/Core/FileController.cs

@@ -1,5 +1,8 @@
-using HiTeachCC.Service.Core.Interface;
+using HiTeachCC.Model.PowerPoint;
+using HiTeachCC.Service.Core.Interface;
+using HiTeachCC.Service.PowerPoint.Interface;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -19,9 +22,35 @@ namespace HiTeachCC.Controllers.Core
 
         private readonly IFileService fileService;
 
-        public FileController(IFileService _fileService) {
+        private readonly IPowerPointService powerPointService;
+
+        public FileController(IFileService _fileService , IPowerPointService _powerPointService) {
             fileService = _fileService;
+            powerPointService = _powerPointService;
         }
+        /// <summary>
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        //[HttpOptions("UploadDocument")]
+        //public async Task<BaseJosnRPCResponse> UploadDocument([FromForm] IFormFile file)
+        //{
+        //    JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+        //    return responseBuilder.Data("").build();
+        //}
+        /// <summary>
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("UploadPowerPoint")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<BaseJosnRPCResponse> UploadPowerPoint([FromForm] IFormFile file)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            Pptx model =   powerPointService.LoadPresentation(file.OpenReadStream());
+            return responseBuilder.Data(model).build();
+        }
+
         /// <summary>
         /// </summary>
         /// <param name="request"></param>
@@ -31,11 +60,10 @@ namespace HiTeachCC.Controllers.Core
         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();
         }
-
     }
 }

+ 20 - 1
HiTeachCC/Controllers/Core/LoginController.cs

@@ -10,6 +10,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Extension.JwtAuth.Models;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 
 namespace HiTeachCC.Controllers.Core
 {
@@ -72,7 +73,8 @@ namespace HiTeachCC.Controllers.Core
         /// <param name="request"></param>
         /// <returns></returns>
         [HttpPost("GetMiniAPPAccessToken")]
-        public async Task<BaseJosnRPCResponse> GetMiniAPPAccessToken(JosnRPCRequest<Dictionary<string, object>> request) {
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> GetMiniAPPAccessToken() {
             JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
             MiniAPPToken obj = await loginInfoService.GetMiniAPPAccessToken();
             return responseBuilder.Data(obj).build();
@@ -114,5 +116,22 @@ namespace HiTeachCC.Controllers.Core
             JwtResponse obj = await loginInfoService.TeamModelLogin(request.@params);
             return responseBuilder.Data(obj).build();
         }
+
+        /// <summary>
+        /// 醍摩豆ID用户信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("TeamModelInfo")]
+        public async Task<BaseJosnRPCResponse> TeamModelInfo(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            List<string> ids = GetLoginUser("id");
+            TeamModelUser user = null;
+            if (ids.IsNotEmpty()) {
+                user = await loginInfoService.FindOneByKey<TeamModelUser>("TeamModelId", ids[0]);
+            }
+            return responseBuilder.Data(user).build();
+        }
     }
 }

+ 139 - 0
HiTeachCC/Controllers/Teach/LessonController.cs

@@ -0,0 +1,139 @@
+using HiTeachCC.Controllers.Core;
+using HiTeachCC.Model.Teach.Models;
+using HiTeachCC.Service.Teach.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.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using HiTeachCC.Model.Core.Models;
+
+namespace HiTeachCC.Controllers.Teach
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    [Authorize]
+    public class LessonController : BaseController
+    {
+        public ILessonService lessonService;
+
+        public LessonController(ILessonService _lessonService)
+        {
+            lessonService = _lessonService;
+        }
+
+        /// <summary>
+        /// 创建教室
+        /// GroupNumb 教室号
+        /// DeviceId  设备号
+        /// UnionID   小程序ID 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("GetLessonMember")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> GetLessonMember(JosnRPCRequest<Dictionary<string, string>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            Dictionary<string, string> dict = request.@params;
+            Dictionary<string, object> param = new Dictionary<string, object>();
+            if (dict.TryGetValue("GroupNum", out string GroupNum) && dict.TryGetValue("DeviceId", out string DeviceId))
+            {
+                param.Add("LessonId", DeviceId + "-" + GroupNum);
+                if (dict.TryGetValue("UnionID", out string unionID))
+                {
+                    param.Add("UnionID", unionID);
+                }
+                var obj = await lessonService.FindListByDict<LessonMember>(param);
+                return responseBuilder.Data(obj).build();
+            }
+            return responseBuilder.Error("GroupNum or DeviceId is null!", 500).build();
+        }
+
+
+        /// <summary>
+        /// 小程序加入教室
+        /// GroupNumb 教室号
+        /// DeviceId  设备号
+        /// UnionID 小程序
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("MiniAPPJoinLesson")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> MiniAPPJoinLesson(JosnRPCRequest<Dictionary<string, string>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            Dictionary<string, string> dict = request.@params;
+            if (dict.TryGetValue("GroupNum", out string GroupNum) && 
+                dict.TryGetValue("DeviceId", out string DeviceId) && 
+                dict.TryGetValue("UnionID", out string UnionID))
+            {
+                var  user = await lessonService.FindOneByKey<WeChatUser>("unionId", UnionID);
+                if (user != null && string.IsNullOrEmpty(user.RowKey) ) {
+
+                }
+                LessonMember lesson = new LessonMember
+                    {
+                        RowKey = DeviceId + "-" + GroupNum + "-" + UnionID,
+                        PartitionKey = "LessonMember",
+                        JoinTime = DateTimeHelper.ConvertToTimeStamp13(DateTime.Now),
+                        UnionID = UnionID,
+                        LessonId = DeviceId + "-" + GroupNum,
+                        Status = 1,
+                        Name=user.nickName,
+                        AvatarUrl=user.avatarUrl
+                    };
+                    var obj = await lessonService.SaveOrUpdate<LessonMember>(lesson);
+                    return responseBuilder.Data(obj).build();
+            }
+            return responseBuilder.Error("params is null!", 500).build();
+        }
+
+        /// <summary>
+        /// 创建教室
+        /// GroupNumb 教室号
+        /// DeviceId  设备号
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("CreateLesson")]
+        [AllowAnonymous]
+        public async Task<BaseJosnRPCResponse> CreateLesson(JosnRPCRequest<Dictionary<string, string>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = JsonRPCResponseBuilder.custom();
+            Dictionary<string, string> dict = request.@params;
+            if (dict.TryGetValue("GroupNum", out string GroupNum) && dict.TryGetValue("DeviceId", out string DeviceId))
+            {
+                List<string> ids = GetLoginUser("id");
+                List<string> names = GetLoginUser("name");
+                if (ids.IsNotEmpty() && names.IsNotEmpty())
+                {
+                    Lesson lesson = new Lesson
+                    {
+                        RowKey = DeviceId +"-"+GroupNum ,
+                        PartitionKey = "Lesson",
+                        CreateTime = DateTimeHelper.ConvertToTimeStamp13(DateTime.Now),
+                        TeamModelId = ids[0],
+                        Teacher = names[0],
+                        DeviceId = DeviceId,
+                        GroupNum = GroupNum,
+                        Status = 1
+                    };
+                    var obj = await lessonService.SaveOrUpdate<Lesson>(lesson);
+                    return responseBuilder.Data(obj).build();
+                }
+                else {
+                    return responseBuilder.Error(Constants.AUTHORIZATION+" code vaild error!", 500).build();
+                }
+            }
+            return responseBuilder.Error("GroupNum or DeviceId is null!", 500).build();
+        }
+    }
+}

+ 56 - 2
HiTeachCC/HiTeachCC.csproj

@@ -3,9 +3,15 @@
   <PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
     <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
+    <!-- Quasar start  -->
+    <SpaRoot>ClientApp\</SpaRoot>
+    <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
+    <!-- Quasar end  -->
   </PropertyGroup>
 
-
+  <ItemGroup>
+    <None Include="wwwroot\FB9ugXCIjc.txt" />
+  </ItemGroup>
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.App" />
     <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
@@ -18,6 +24,54 @@
   </ItemGroup>
 
 
-  <ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" appsettings_1development_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
+  <ItemGroup>
+    <Folder Include="ClientApp\" />
+  </ItemGroup>
+
+
+  <ProjectExtensions>
+    <VisualStudio>
+      <UserProperties appsettings_1json__JsonSchema="" appsettings_1development_1json__JsonSchema="" />
+    </VisualStudio>
+  </ProjectExtensions>
+
+
+  <!-- Quasar start  -->
+  <Target Name="DebugEnsureNodeEnv" BeforeTargets="Build">
+    <!-- Build Target:  Ensure Node.js is installed -->
+    <Exec Command="node --version" ContinueOnError="true">
+      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
+    </Exec>
+    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE." />
+  </Target>
+
+  <Target Name="DebugEnsureNpm" AfterTargets="DebugEnsureNodeEnv">
+    <!-- Build Target:  Ensure Node.js is installed -->
+    <Exec Command="npm --version" ContinueOnError="true">
+      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
+    </Exec>
+  </Target>
+
+  <Target Name="EnsureNodeModulesInstalled" BeforeTargets="Build" Inputs="package.json" Outputs="packages-lock.json">
+    <!-- Build Target: Restore NPM packages using npm -->
+    <Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
+
+    <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
+  </Target>
+
+  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
+    <!-- Build Target: Run webpack dist build -->
+    <Message Importance="high" Text="Running npm build..." />
+    <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build" />
 
+    <!-- Include the newly-built files in the publish output -->
+    <ItemGroup>
+      <DistFiles Include="$(SpaRoot)dist\**" />
+      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
+        <RelativePath>%(DistFiles.Identity)</RelativePath>
+        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
+      </ResolvedFileToPublish>
+    </ItemGroup>
+  </Target>
+  <!-- Quasar end  -->
 </Project>

+ 50 - 6
HiTeachCC/Startup.cs

@@ -48,17 +48,38 @@ namespace HiTeachCC
             //    options.CheckConsentNeeded = context => true;
             //    options.MinimumSameSitePolicy = SameSiteMode.None;
             //});
-            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
+            // 配置跨域处理,允许所有来源
+            //services.AddCors(options =>
+            //   options.AddPolicy("any",
+            //       builder => builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
+
+            services.AddCors(options =>
+            {
+                // CorsPolicy 是自訂的 Policy 名稱
+                options.AddPolicy("CorsPolicy", policy =>
+                {
+                    policy
+                           .AllowAnyOrigin()
+                          //.WithOrigins("http://localhost:5001")
+                          .AllowAnyHeader()
+                          .AllowAnyMethod()
+                          .AllowCredentials();
+                });
+            });
+            services.AddMvc(options =>
+            {
+               // options.Filters.Add(new HiTeachCC.Controllers.AllowCorsAttribute());
+            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
             services.Configure<FormOptions>(x =>
             {
                 x.ValueLengthLimit = int.MaxValue;
                 x.MultipartBodyLengthLimit = long.MaxValue; // In case of multipart
                 x.MultipartHeadersLengthLimit = int.MaxValue;
             });
-            services.AddMvc(options =>
-            {
-                options.Filters.Add(new AllowCorsAttribute());
-            });
+            //services.AddMvc(options =>
+            //{
+            //    options.Filters.Add(new AllowCorsAttribute());
+            //});
             //Table配置
             //services.AddAzureTableStorage().AddConnection(Configuration.GetSection("Azure:Table").Get<AzureTableOptions>());
             //使用Blob配置
@@ -75,6 +96,10 @@ namespace HiTeachCC
             //HttpContextAccessor,并用来访问HttpContext。
             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
             services.AddHttp();
+            services.AddSpaStaticFiles(configuration =>
+            {
+                configuration.RootPath = "ClientApp/dist";
+            });
         }
 
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -95,14 +120,33 @@ namespace HiTeachCC
             app.UseMiddleware<HttpGlobalExceptionInvoke>();
             app.UseHttpsRedirection();
             app.UseStaticFiles();
+            app.UseSpaStaticFiles();
             //app.UseCookiePolicy();
-
+            //在Startup的Configure()中添加app.UseCors(); 保证其在app.UseMvc(); 之前
+            app.UseCors("CorsPolicy");
+            //app.UseMvc();
             app.UseMvc(routes =>
             {
                 routes.MapRoute(
                     name: "default",
                     template: "{controller=Home}/{action=Index}/{id?}");
             });
+            app.UseSpa(spa =>
+            {
+                spa.Options.SourcePath = "ClientApp";
+                //if (env.IsDevelopment())
+                //{
+                //    spa.UseVueCli(npmScript: "serve", port: 8080); // optional port
+                //}
+            });
+            //app.UseCors(builder =>
+            //{
+            //    //builder.WithOrigins("http://localhost:5000", "http://127.0.0.1");
+            //    builder.AllowAnyOrigin();
+            //    builder.AllowAnyMethod();
+            //    builder.AllowAnyHeader();
+            //    builder.AllowCredentials();
+            //});
         }
     }
 }

+ 1 - 1
HiTeachCC/appsettings.Development.json

@@ -28,7 +28,7 @@
   "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",
+    "AccountUrl": "https://coreapiscn.chinacloudsites.cn/account",
     "ServiceUrl": "https://api.habookaclass.biz/service",
     "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
     "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",

+ 6 - 1
HiTeachCC/appsettings.json

@@ -28,7 +28,7 @@
   "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",
+    "AccountUrl": "https://coreapiscn.chinacloudsites.cn/account",
     "ServiceUrl": "https://api.habookaclass.biz/service",
     "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
     "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",
@@ -57,6 +57,11 @@
         "Name": "MiniAPP",
         "Project": "HiTeachCC",
         "Exp": 86400
+      },
+      {
+        "Name": "WebAPP",
+        "Project": "HiTeachCC",
+        "Exp": 86400
       }
     ]
   }

+ 1 - 0
HiTeachCC/wwwroot/FB9ugXCIjc.txt

@@ -0,0 +1 @@
+f627d56d49c4104246319a1c1be3b736

+ 23 - 0
HiTeachCC/wwwroot/index.html

@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>使用 jQuery validate 表单验证</title>
+    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
+   
+</head>
+<body>
+    <form enctype='multipart/form-data' action="http://hiteachcc.chinacloudsites.cn/api/file/UploadDocument" method="post">
+        <input type="file" name='file'>
+        <input type="submit">
+    </form>
+</body>
+</html>
+
+<script>
+$(function(){
+    $.post("http://hiteachcc.chinacloudsites.cn/api/login/GetMiniAPPAccessToken",function(data,status){
+        console.log("Data: " + data + "nStatus: " + status);
+    });
+    });
+</script>