소스 검색

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10000/TEAMMODEL/TEAMModelOS into develop5.0-tmd

XW 4 년 전
부모
커밋
61af39e7a5
100개의 변경된 파일2365개의 추가작업 그리고 759개의 파일을 삭제
  1. 1 1
      TEAMModelFunction/ActivityHttpTrigger.cs
  2. 2 1
      TEAMModelFunction/MonitorCosmosDB.cs
  3. 1 1
      TEAMModelFunction/TriggerExam.cs
  4. 4 1
      TEAMModelOS.SDK/DI/DingDing/DingDing.cs
  5. 171 0
      TEAMModelOS.SDK/Extension/CoreTokenExtensions.cs
  6. 3 3
      TEAMModelOS.SDK/Models/Cosmos/Common/Bloblog.cs
  7. 16 7
      TEAMModelOS.SDK/Models/Cosmos/Common/Inner/SyllabusTree.cs
  8. 14 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Syllabus.cs
  9. 12 0
      TEAMModelOS.SDK/Models/Cosmos/Common/TmdInfo.cs
  10. 3 16
      TEAMModelOS.SDK/Models/Cosmos/Common/Volume.cs
  11. 0 111
      TEAMModelOS.SDK/Models/Cosmos/Teacher/Favorite.cs
  12. 127 0
      TEAMModelOS.SDK/Models/Cosmos/Teacher/Share.cs
  13. 77 0
      TEAMModelOS.SDK/Models/Service/NotificationService.cs
  14. 3 0
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  15. 1 0
      TEAMModelOS/ClientApp/package.json
  16. 73 9
      TEAMModelOS/ClientApp/src/api/blob.js
  17. 2 0
      TEAMModelOS/ClientApp/src/api/index.js
  18. 6 1
      TEAMModelOS/ClientApp/src/api/schoolSetting.js
  19. 7 0
      TEAMModelOS/ClientApp/src/api/service.js
  20. 3 0
      TEAMModelOS/ClientApp/src/api/syllabus.js
  21. 141 3
      TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html
  22. 27 3
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css
  23. 1 1
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js
  24. 42 0
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json
  25. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf
  26. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff
  27. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2
  28. BIN
      TEAMModelOS/ClientApp/src/assets/image/1-1.jpg
  29. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-1.jpg
  30. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-2.png
  31. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-3.png
  32. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-4.png
  33. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-5.png
  34. BIN
      TEAMModelOS/ClientApp/src/assets/login/1-7.png
  35. BIN
      TEAMModelOS/ClientApp/src/assets/login/2-1.png
  36. BIN
      TEAMModelOS/ClientApp/src/assets/login/2-2.jpg
  37. BIN
      TEAMModelOS/ClientApp/src/assets/login/3-1.jpg
  38. BIN
      TEAMModelOS/ClientApp/src/assets/login/3-2.png
  39. 54 0
      TEAMModelOS/ClientApp/src/assets/mark/0.svg
  40. 47 0
      TEAMModelOS/ClientApp/src/assets/mark/1.svg
  41. 57 0
      TEAMModelOS/ClientApp/src/assets/mark/2.svg
  42. 51 0
      TEAMModelOS/ClientApp/src/assets/mark/3.svg
  43. 63 0
      TEAMModelOS/ClientApp/src/assets/mark/4.svg
  44. 94 0
      TEAMModelOS/ClientApp/src/assets/mark/5.svg
  45. 77 0
      TEAMModelOS/ClientApp/src/assets/mark/6.svg
  46. 62 0
      TEAMModelOS/ClientApp/src/assets/mark/7.svg
  47. 54 0
      TEAMModelOS/ClientApp/src/assets/mark/8.svg
  48. BIN
      TEAMModelOS/ClientApp/src/assets/mark/img0.jpg
  49. BIN
      TEAMModelOS/ClientApp/src/assets/mark/img1.jpg
  50. BIN
      TEAMModelOS/ClientApp/src/assets/mark/img2.jpg
  51. 5 5
      TEAMModelOS/ClientApp/src/common/BaseAreaPicker.vue
  52. 5 31
      TEAMModelOS/ClientApp/src/common/BaseLayout.less
  53. 73 23
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  54. 136 31
      TEAMModelOS/ClientApp/src/common/BaseNotification.vue
  55. 0 1
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  56. 63 8
      TEAMModelOS/ClientApp/src/common/UploadModal.vue
  57. 41 30
      TEAMModelOS/ClientApp/src/components/app-root.vue
  58. 1 3
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  59. 1 1
      TEAMModelOS/ClientApp/src/components/public/frontEndMain/Index.less
  60. 149 109
      TEAMModelOS/ClientApp/src/components/public/frontEndMain/Index.vue
  61. 147 144
      TEAMModelOS/ClientApp/src/components/syllabus/DragTree.vue
  62. 65 3
      TEAMModelOS/ClientApp/src/components/syllabus/InviteTeacher.vue
  63. 6 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/home.js
  64. 93 47
      TEAMModelOS/ClientApp/src/locale/lang/en-US/settings.js
  65. 4 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/stuAccount.js
  66. 3 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js
  67. 3 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/teachContent.js
  68. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/updModal.js
  69. 3 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/classMgmt.js
  70. 6 6
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/courseManage.js
  71. 3 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js
  72. 7 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  73. 6 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/home.js
  74. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js
  75. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/knowledge.js
  76. 9 9
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js
  77. 10 10
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/login.js
  78. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/regist.js
  79. 5 5
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  80. 4 4
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolMgmt.js
  81. 21 21
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/serviceDriveAuth.js
  82. 28 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/settings.js
  83. 10 6
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/stuAccount.js
  84. 9 9
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  85. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/survey.js
  86. 61 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/syllabus.js
  87. 9 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js
  88. 3 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/talMgmt.js
  89. 3 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachContent.js
  90. 34 34
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachermgmt.js
  91. 5 4
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  92. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/updModal.js
  93. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/vote.js
  94. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/classMgmt.js
  95. 4 4
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/courseManage.js
  96. 9 9
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js
  97. 7 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  98. 6 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/home.js
  99. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js
  100. 0 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js

+ 1 - 1
TEAMModelFunction/ActivityHttpTrigger.cs

@@ -411,7 +411,7 @@ namespace TEAMModelFunction
             }
             List<ItemCond> itemConds = new List<ItemCond>();
             items.GroupBy(x => x.periodId).ToList().ForEach( x=> {
-                ItemCond cond = new ItemCond() { id=x.Key,code=$"ItemCond-hbcn" };
+                ItemCond cond = new ItemCond() { id=x.Key,code=$"ItemCond-hbcn" ,pk= "ItemCond" ,ttl=-1};
                 x.ToList().ForEach(y => {
                    ItemService.CountItemCond(y, null, cond);
                 });

+ 2 - 1
TEAMModelFunction/MonitorCosmosDB.cs

@@ -40,7 +40,8 @@ namespace TEAMModelFunction
             databaseName: "TEAMModelOS",
             collectionName: "Common",
             ConnectionStringSetting = "Azure:Cosmos:ConnectionString",
-            LeaseCollectionName = "leases")]IReadOnlyList<Document> inputs, ILogger log)
+            LeaseCollectionName = "leases",
+            LeaseCollectionPrefix = "TEAMModelOS")]IReadOnlyList<Document> inputs, ILogger log)
         {
             if (inputs != null && inputs.Count > 0)
             {

+ 1 - 1
TEAMModelFunction/TriggerExam.cs

@@ -222,7 +222,7 @@ namespace TEAMModelFunction
                                                             int month = DateTimeOffset.UtcNow.Month;
                                                             int day = DateTimeOffset.UtcNow.Day;
                                                             int time =  month > semester.month ?  0 :  1;
-                                                            int eyear = year - time;
+                                                            int eyear = classroom.year - time;
                                                             result.gradeId = (year - eyear).ToString();
                                                         }
                                                     }

+ 4 - 1
TEAMModelOS.SDK/DI/DingDing/DingDing.cs

@@ -99,7 +99,10 @@ namespace TEAMModelOS.SDK.DI
         [Description("82aba2fccfa8442c575db3ac0442fa5aea90cd7574bb9a71d5abf210ea72a3aa,SEC3f38eca87cd4fd10505d136f91071a2e8b14cd863bd6bbafb24c612fc751a59a")]
         成都开发測試群組,
         [Description("1a316ce4edc2db88231d40d80072b00f2751d7d9e2e5871c5dc061885b01c48d,SECff60201ac9b219943b9f8fc397fda1a617d0cbc140850f5ea9cb4f131479d39a")]
-        醍摩豆服務運維群組
+        醍摩豆服務運維群組,
+        [Description("a83ea4ead63bf1b4e087723b3a7ccdf7f4c96708a22493f489bb928999f50d87,SECf1d22db7d00580dc7c0e597e31112a25ae1025500fc998b5b30961d91e115271")]
+        AI智慧學校申請通知群
+
     }
 
 

+ 171 - 0
TEAMModelOS.SDK/Extension/CoreTokenExtensions.cs

@@ -0,0 +1,171 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IdentityModel.Tokens.Jwt;
+using System.Security.Claims;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.Identity.Client;
+using System.ComponentModel;
+using System.Threading.Tasks;
+using Azure.Security.KeyVault.Secrets;
+using Azure.Core;
+using Azure.Identity;
+using System.Net.Http;
+using System.Collections.Concurrent;
+using System.Diagnostics;
+
+namespace TEAMModelOS.SDK.Extension
+{
+    public static class CoreTokenExtensions
+    {       //var issuer = Configuration.GetValue<string>("JwtSettings:Issuer");
+            //var signKey = Configuration.GetValue<string>("JwtSettings:SignKey");
+        private const string issuer = "account.teammodel";
+        //Azure AD 租用戶識別碼(國際、大陸)
+        private static List<string> tenantids = new List<string> { "73a2bcc5-fe99-4566-aa8a-07e7bb287df1", "4807e9cf-87b8-4174-aa5b-e76497d7392b" };
+        private static ConcurrentDictionary<string, KeyVaultSecret> KeyVaultSecrets { get; } = new ConcurrentDictionary<string, KeyVaultSecret>();
+              
+
+        #region  Access Token
+        /// <summary>
+        /// 產生AccessToken
+        /// </summary>
+        /// <param name="clientID"></param>
+        /// <param name="location">服務位置,Global or China ...</param>
+        /// <returns></returns>
+        public static async ValueTask<AuthenticationResult> CreateAccessToken(string clientID, string clientSecret, string location)
+        {
+            //從金鑰庫取出秘密,此作法讓所有端直接刷新金鑰,無需傳送秘密,SPA更適用
+            var secret = clientSecret ?? (await GetClientIDSecret(clientID, location)).Value;
+
+            var sts = Enum.Parse<STSEndpoint>(location, true);
+
+            IConfidentialClientApplication app;
+            app = ConfidentialClientApplicationBuilder.Create(clientID)
+                                                      .WithClientSecret(secret)
+                                                      .WithAuthority(new Uri(sts.GetDescriptionText()))
+                                                      .Build();
+            var scope = ((STSScope)sts).GetDescriptionText();
+            var result = await app.AcquireTokenForClient(new[] { scope }).ExecuteAsync();
+            return result;
+        }
+
+        /// <summary>
+        /// 驗證是否為公司Azure發行金鑰,支援大陸國際
+        /// </summary>
+        /// <param name="token"></param>
+        /// <returns></returns>
+        public static bool ValidateAccessToken(JwtSecurityToken token)
+        {
+            try
+            {
+                if (token.Payload.TryGetValue("tid", out var value) && value is string tokenTenantId)
+                {
+                    return tenantids.Contains(tokenTenantId);
+                }
+                return false;
+            }
+            catch (Exception)
+            {
+                return false;
+            }
+        }
+
+        public static bool ValidateIdToken(string token, string salt)
+        {
+            try
+            {
+                var handler = new JwtSecurityTokenHandler();
+                var validationParameters = new TokenValidationParameters
+                {
+                    RequireExpirationTime = true,
+                    ValidateIssuer = false,
+                    ValidateAudience = false,
+                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt)),
+                    ValidateLifetime = false,
+                    //LifetimeValidator = LifetimeValidator,
+                    ClockSkew = TimeSpan.Zero                    
+                };
+                ClaimsPrincipal principal = handler.ValidateToken(token, validationParameters, out SecurityToken securityToken);
+                return true;
+            }
+            catch(Exception ex)
+            {
+                Trace.WriteLine(ex.Message);
+                return false;
+            }
+        }
+        #endregion
+
+        private static async ValueTask<KeyVaultSecret> GetClientIDSecret(string clientID, string location)
+        {   //Azure 金鑰庫處理
+            var s = await Task.Run(() =>
+            {
+                var secret = KeyVaultSecrets.GetOrAdd(clientID, (x) =>
+                {
+                    try
+                    {
+                        var sts = Enum.Parse<CoreServiceClient>(location, true);
+                        var scrtetstring = sts.GetDescriptionText().Split(",");
+                        //TODO 之後驗證端點用KnownAuthorityHosts取代,此SDK版本無支援
+                        var secret = new ClientSecretCredential(scrtetstring[0], scrtetstring[1], scrtetstring[2], new TokenCredentialOptions() { AuthorityHost = new Uri(scrtetstring[3]) });
+                        var client = new SecretClient(new Uri(((KeyVaultEndpoint)sts).GetDescriptionText()), secret);
+                        var clientSecret = client.GetSecretAsync(clientID).ConfigureAwait(false);
+                        return clientSecret.GetAwaiter().GetResult();
+                    }
+                    catch
+                    {
+                        return null;
+                    }
+                });
+                return secret;
+            });
+            return s;
+        }
+
+        public static bool LifetimeValidator(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
+        {
+            return true;
+            //if (expires != null)
+            //{
+            //    if (DateTime.UtcNow < expires)
+            //    {
+            //        return true;
+            //    }
+            //}
+
+            //return false;
+        }
+
+        private enum STSEndpoint
+        {
+            [Description("https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b")]
+            China,
+            [Description("https://login.microsoftonline.com/73a2bcc5-fe99-4566-aa8a-07e7bb287df1")]
+            Global
+        }
+
+        private enum STSScope
+        {
+            [Description("api://72643704-b2e7-4b26-b881-bd5865e7a7a5/.default")]
+            China,
+            [Description("api://8768b06f-c5c5-4b0c-abfb-d7ded354626d/.default")]
+            Global
+        }
+
+        private enum KeyVaultEndpoint
+        {
+            [Description("https://corekeyvaultcn.vault.azure.cn/")]
+            China,
+            [Description("https://corekeyvaultjp.vault.azure.net/")]
+            Global
+        }
+
+        private enum CoreServiceClient
+        {
+            [Description("4807e9cf-87b8-4174-aa5b-e76497d7392b,72643704-b2e7-4b26-b881-bd5865e7a7a5,tRYbDXtotEOe2Bbmo=[3h9Hbu_Trt:c6,https://login.partner.microsoftonline.cn")]
+            China,
+            [Description("73a2bcc5-fe99-4566-aa8a-07e7bb287df1,8768b06f-c5c5-4b0c-abfb-d7ded354626d,7=O./yws0L89WcEsece:9/4deJHP4E=F,https://login.microsoftonline.com/")]
+            Global
+        }
+    }
+}

+ 3 - 3
TEAMModelOS.SDK/Models/Cosmos/Common/Bloblog.cs

@@ -13,9 +13,9 @@ namespace TEAMModelOS.SDK.Models
         public string url { get; set; }
         public long  time { get; set; }
         public long  size { get; set; }
-        public string periodId { get; set; }
-        public string subjectId { get; set; }
-        public string gradeId { get; set; }
+        public List<string> periodId { get; set; } = new List<string>() { "" };
+        public List<string> subjectId { get; set; } = new List<string>() { "" };
+        public List<string> gradeId { get; set; } = new List<string>() { "" };
         /// <summary>
         /// audio 音频,video 视频 ,doc文档,image图片,other 其他,res教材,thum缩略图
         /// </summary>

+ 16 - 7
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/SyllabusTree.cs

@@ -10,14 +10,23 @@ namespace TEAMModelOS.SDK.Models
         }
         public List<SyllabusTree> children { get; set; }
     }
-    public class SyllabusTreeNode{
-        public string id { get; set; }
-       // public string code { get; set; }
-        public string scope { get; set; }
-        public SyllabusTreeNode() {
+    public class SyllabusTreeNode {
+
+        public SyllabusTreeNode(){
             trees = new List<SyllabusTree>();
         }
-        public List<SyllabusTree> trees { get; set; }
-    }
+        /// <summary>
+        /// 课纲章节id
+        /// </summary>
+        public string  id { get; set; }
+        /// <summary>
+        /// 册别的id
+        /// </summary>
+        public string volumeId { get; set; }
+       // public string code { get; set; }
+        public string scope { get; set; }
+        public  List<SyllabusTree>  trees  { get; set; }
 
+        public List<SyllabusAuth> auth { get; set; } = new List<SyllabusAuth>();
+    }
 }

+ 14 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Syllabus.cs

@@ -20,5 +20,19 @@ namespace TEAMModelOS.SDK.Models
         [Required(ErrorMessage = "{0} 必须填写")]
         public List<Tnode> children { get; set; }
         public string volumeId { get; set; }
+        public List<SyllabusAuth> auth { get; set; } = new List<SyllabusAuth>();
+        public string scope { get; set; }
+}
+
+    /// <summary>
+    /// 只要创建课纲的creatorId 才能编辑课纲的分享,共编权限 25600 74200  27500 2000
+    /// ,共编者 谁创建的节点只能谁删除,而且删除时能删除子节点(包含不是自己创建的)。
+    /// </summary>
+    public class SyllabusAuth
+    {
+        public string tmdid { get; set; }
+        public string tmdname { get; set; }
+        public bool coedit { get; set; }
+        public bool share { get; set; }
     }
 }

+ 12 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/TmdInfo.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models
+{
+    public  class TmdInfo
+    {
+        public string tmdid { get; set; }
+        public string tmdname { get; set; }
+    }
+}

+ 3 - 16
TEAMModelOS.SDK/Models/Cosmos/Common/Volume.cs

@@ -82,22 +82,9 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         /// </summary>
         [Required(ErrorMessage = "scope 必须设置")]
         public string scope { get; set; }
-        public List<SyllabusAuth> auth { get; set; } = new List<SyllabusAuth>();
-    }
 
-    /// <summary>
-    /// 只要创建课纲的creatorId 才能编辑课纲的分享,共编权限 25600 74200  27500 2000
-    /// ,共编者 谁创建的节点只能谁删除,而且删除时能删除子节点(包含不是自己创建的)。
-    /// </summary>
-    public class SyllabusAuth
-    {
-        public string tmdid { get; set; }
-        public string name { get; set; }
-        public bool coedit { get; set; }
-        public bool share { get; set; }
-        /// <summary>
-        ///分享的节点 all  或者節點id
-        /// </summary>
-        public List<string> snodes { get; set; } = new List<string>();
+        public List<string> syllabusIds { get; set; } = new List<string>();
+
     }
+
 }

+ 0 - 111
TEAMModelOS.SDK/Models/Cosmos/Teacher/Favorite.cs

@@ -36,115 +36,4 @@ namespace TEAMModelOS.SDK.Models.Cosmos
         [Required(ErrorMessage = "引用来源课纲code 必须设置")]
         public string fromCode { get; set; }
     }
-
-    /*
-     {
-        "id":"课纲册别id",
-        "code":"Share-接收者tmdid",
-        "issuer":"分享者tmdid",
-        "createTime":分享时间,
-        "scode":"引用来源课纲册别code",
-        "scope":"school/private",
-        "school":"hbcn",
-        "issuer":"颁发权限的id"
-    }
-     */
-    /// <summary>
-    /// 主动分享给谁, 分享功能只会发生在个人课纲中
-    /// </summary>
-    public class Share : CosmosEntity {
-        public Share(){
-            pk = "Share";
-        }
-
-        public string scode { get; set; }
-        /// <summary>
-        /// 权限颁发者
-        /// </summary>
-        public string issuer { get; set; }
-        public long  createTime { get; set; }
-        /// <summary>
-        /// 学校编码或教师tmdid
-        /// </summary>
-        [Required(ErrorMessage = "school 必须设置")]
-        public string school { get; set; }
-        /// <summary>
-        /// school|private
-        /// </summary>
-        [Required(ErrorMessage = "scope 必须设置")]
-        public string scope { get; set; }
-        /// <summary>
-        /// 共编
-        /// </summary>
-        public bool coedit { get; set; }
-        /// <summary>
-        /// 分享
-        /// </summary>
-        public bool share { get; set; }
-        /// <summary>
-        /// 课纲名称
-        /// </summary>
-        public string sname { get; set; }
-    }
-         
-    /// <summary>
-    /// 主动分享给谁,当接收者接收并完成相关资源复制后则删除本条数据。
-    /// </summary>
-    public class ShareData
-    {
-        /// <summary>
-        /// 学校编码
-        /// </summary>
-        [Required(ErrorMessage = "school 必须设置")]
-        public string school { get; set; }
-        /// <summary>
-        /// school|private
-        /// </summary>
-        [Required(ErrorMessage = "scope 必须设置")]
-        public string scope { get; set; }
-        /// <summary>
-        /// add/edit/del
-        /// </summary>
-        [Required(ErrorMessage = "opt 必须设置")]
-        public string opt { get; set; }
-
-        [Required(ErrorMessage = "tmdid 必须设置")]
-        public string tmdid { get; set; }
-        /// <summary>
-        /// tmdname
-        /// </summary>
-        public string name { get; set; }
-        /// <summary>
-        /// 课纲册别的id
-        /// </summary>
-        [Required(ErrorMessage = "sid 必须设置")]
-        public string sid { get; set; }
-        /// <summary>
-        /// 课纲册别的分区键
-        /// </summary>
-        [Required(ErrorMessage = "socde 必须设置")]
-        public string scode { get; set; }
-        /// <summary>
-        /// 课纲册别的名称
-        /// </summary>
-        [Required(ErrorMessage = "sname 必须设置")]
-        public string sname { get; set; }
-        /// <summary>
-        /// 共编权限
-        /// </summary>
-        public bool coedit { get; set; } = false;
-        /// <summary>
-        /// 分享权限
-        /// </summary>
-        public bool share { get; set; } = false;
-        /// <summary>
-        /// 分享的节点 all  或者節點id
-        /// </summary>
-        public List<string> snodes { get; set; } = new List<string>();
-        /// <summary>
-        /// 共编 分享权限颁发者
-        /// </summary>
-        [Required(ErrorMessage = "issuer 必须设置")]
-        public string issuer { get; set; }
-    }
 }

+ 127 - 0
TEAMModelOS.SDK/Models/Cosmos/Teacher/Share.cs

@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models
+{
+    /*
+     {
+        "id":"课纲册别id",
+        "code":"Share-接收者tmdid",
+        "issuer":"分享者tmdid",
+        "createTime":分享时间,
+        "scode":"引用来源课纲册别code",
+        "scope":"school/private",
+        "school":"hbcn",
+        "issuer":"颁发权限的id"
+    }
+     */
+    /// <summary>
+    /// 主动分享给谁, 分享功能只会发生在个人课纲中
+    /// </summary>
+    public class Share : CosmosEntity
+    {
+        /// <summary>
+        /// id 为章节id, code为Share-tmdid
+        /// </summary>
+        public Share()
+        {
+            pk = "Share";
+        }
+        /// <summary>
+        /// 权限颁发者
+        /// </summary>
+        public string issuer { get; set; }
+        public long createTime { get; set; }
+        /// <summary>
+        /// 学校编码或教师tmdid
+        /// </summary>
+        [Required(ErrorMessage = "school 必须设置")]
+        public string school { get; set; }
+        /// <summary>
+        /// school|private
+        /// </summary>
+        [Required(ErrorMessage = "scope 必须设置")]
+        public string scope { get; set; }
+        /// <summary>
+        /// 共编
+        /// </summary>
+        public bool coedit { get; set; }
+        /// <summary>
+        /// 分享
+        /// </summary>
+        public bool share { get; set; }
+        /// <summary>
+        /// 册别id
+        /// </summary>
+        public string volumeId { get; set; }
+        /// <summary>
+        /// 课纲章节的name
+        /// </summary>
+        [Required(ErrorMessage = "syllabusName 必须设置")]
+        public string syllabusName { get; set; }
+        /// <summary>
+        /// 册别名称
+        /// </summary>
+        public string volumeName { get; set; }
+    }
+    /// <summary>
+    /// 主动分享给谁,当接收者接收并完成相关资源复制后则删除本条数据。
+    /// </summary>
+    public class ShareData
+    {
+        /// <summary>
+        /// 学校编码
+        /// </summary>
+        [Required(ErrorMessage = "school 必须设置")]
+        public string school { get; set; }
+        /// <summary>
+        /// school|private
+        /// </summary>
+        [Required(ErrorMessage = "scope 必须设置")]
+        public string scope { get; set; }
+        /// <summary>
+        /// add/edit/del
+        /// </summary>
+        [Required(ErrorMessage = "opt 必须设置")]
+        public string opt { get; set; }
+
+        [Required(ErrorMessage = "tmdid 必须设置")]
+        public List<TmdInfo> tmdInfo { get; set; } = new List<TmdInfo>();
+        
+        /// <summary>
+        /// 共编权限
+        /// </summary>
+        public bool coedit { get; set; } = false;
+        /// <summary>
+        /// 分享权限
+        /// </summary>
+        public bool share { get; set; } = false;
+        /// <summary>
+        /// 课纲章节的id
+        /// </summary>
+        [Required(ErrorMessage = "syllabusId 必须设置")]
+        public string syllabusId { get; set; }
+        /// <summary>
+        /// 课纲章节的name
+        /// </summary>
+        [Required(ErrorMessage = "syllabusName 必须设置")]
+        public string syllabusName { get; set; }
+        /// <summary>
+        /// 册别名称
+        /// </summary>
+        public string volumeName { get; set; }
+        /// <summary>
+        /// 册别id
+        /// </summary>
+        public string volumeId { get; set; }
+        /// <summary>
+        /// 共编 分享权限颁发者
+        /// </summary>
+        [Required(ErrorMessage = "issuer 必须设置")]
+        public string issuer { get; set; }
+    }
+
+
+}

+ 77 - 0
TEAMModelOS.SDK/Models/Service/NotificationService.cs

@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Http;
+using System.Net.Http.Json;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension;
+
+namespace TEAMModelOS.SDK.Models.Service
+{
+    public class NotificationService
+    {
+        private readonly HttpClient _httpClient;
+        public NotificationService(HttpClient httpClient)
+        {
+            _httpClient = httpClient;
+        }
+        public    async Task<int> SendNotification(string clientID, string clientSecret, string location, string url, Notification notification) {
+            if (location.Contains("China")) {
+                location = "China";
+            }
+            else if (location.Contains("Global"))
+            {
+                location = "Global";
+            }
+            var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
+            _httpClient.DefaultRequestHeaders.Add("Authorization",$"Bearer {token.AccessToken}" );
+            HttpResponseMessage responseMessage = await _httpClient.PostAsJsonAsync(url, notification);
+            if (responseMessage.StatusCode == HttpStatusCode.OK)
+            {
+                return 200;
+            }
+            else if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
+            {
+                return 401;
+            }
+            else {
+                return 500;
+            }
+        }
+    }
+
+    public class Notification {
+        /// <summary>
+        /// App name (hita) 小寫
+        /// </summary>
+        public string hubName { get; set; }
+        /// <summary>
+        /// 通知訊息種類,分為msg,info及notice。       
+        /// msg : 一般訊息,會存Redis,拿了就刪。
+        /// info : 公告訊息或給多人讀取的訊息,會存Redis,拿了不刪,只能等時間到期或透過API刪除。
+        /// notice : 屬於系統層級訊息,不存Redis,直接裸送訊息。
+        /// </summary>
+        public string type { get; set; }
+        /// <summary>
+        /// 送訊息的來源端 格式為"{服務}:{類別}: ..." 如"ies5:hbrd","ies5:hbrd:hb0901"
+        /// </summary>
+        public string from { get; set; }
+        /// <summary>
+        /// 接收對象或手機註冊的tag,ID或服務等...
+        /// </summary>
+        public List<string> to { get; set; }
+        /// <summary>
+        /// 	標題。
+        /// </summary>
+        public string label { get; set; }
+        /// <summary>
+        /// 正文。
+        /// </summary>
+        public string body { get; set; }
+        /// <summary>
+        /// 該訊息到期時間(UTC),單位為秒,且必須大於現在時間。
+        /// </summary>
+        public long expires { get; set; }
+    }
+}

+ 3 - 0
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -13,7 +13,9 @@
   <ItemGroup>
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.2.0" />
     <PackageReference Include="Azure.Cosmos" Version="4.0.0-preview3" />
+    <PackageReference Include="Azure.Identity" Version="1.4.0" />
     <PackageReference Include="Azure.Messaging.ServiceBus" Version="7.1.1" />
+    <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.1.0" />
     <PackageReference Include="Azure.Storage.Blobs.Batch" Version="12.5.1" />
     <PackageReference Include="Azure.Storage.Queues" Version="12.6.1" />
     <PackageReference Include="ClouDASLibx" Version="1.2.7" />
@@ -22,6 +24,7 @@
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.10" />
     <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
     <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.4" />
+    <PackageReference Include="Microsoft.Identity.Client" Version="4.32.1" />
     <PackageReference Include="StackExchange.Redis" Version="2.2.4" />
     <PackageReference Include="SvgNet" Version="2.1.1" />
     <PackageReference Include="System.Drawing.Common" Version="5.0.2" />

+ 1 - 0
TEAMModelOS/ClientApp/package.json

@@ -33,6 +33,7 @@
 		"firebase": "^7.19.0",
 		"firestore": "^1.1.6",
 		"html2canvas": "^1.0.0-rc.7",
+		"html2pdf.js": "^0.9.3",
 		"imports-loader": "^0.8.0",
 		"increase-memory-limit": "^1.0.7",
 		"js-sha1": "^0.6.0",

+ 73 - 9
TEAMModelOS/ClientApp/src/api/blob.js

@@ -1,10 +1,26 @@
 import { fetch, post } from '@/api/http'
+import { GLOBAL } from '@/static/Global.js';
+//获取文件后缀和类型
+function getExAndType(fileName) {
+    let ex = fileName.substring(fileName.lastIndexOf('.') + 1)
+    let type = 'other'
+    ex = ex.toUpperCase()
+    for (let key in GLOBAL.CONTENT_TYPES) {
+        if (GLOBAL.CONTENT_TYPES[key].indexOf(ex) != -1) {
+            type = key
+            break
+        }
+    }
+    return {
+        ex, type
+    }
+}
 export default {
-    getBlobSAS: function(data) {
+    getBlobSAS: function (data) {
         return post('/api/File/getBlobSAS', data)
     },
     //最开始使用的blob授权API
-    getContainerSAS: function(data) {
+    getContainerSAS: function (data) {
         return post('/api/File/getContainerSAS', data)
     },
     //获取blob容器读写创建
@@ -12,31 +28,79 @@ export default {
         return post('/blob/sas-rcwld', data)
     },
     //获取blob容器只读创建
-    blobSasR: function(data) {
+    blobSasR: function (data) {
         return post('/blob/sas-r', data)
     },
     //单文件只读权限
-    urlSasR: function(data) {
+    urlSasR: function (data) {
         return post('/blob/sas-url-r', data)
     },
     //获取容器空间
     getContainerSize: function (data) {
         return post('/blob/get-blobsize', data)
     },
-	// 删除blob指定目录下的所有文件
-	deletePrefix: function (data) {
+    // 删除blob指定目录下的所有文件
+    deletePrefix: function (data) {
         return post('/blob/delete-prefix', data)
     },
     // 批量删除blob
-	deleteBlobs: function (data) {
+    deleteBlobs: function (data) {
         return post('/blob/delete-blobs', data)
     },
     // 上传文件之前需要先检查文件是否存在
-	checkBlobs: function (data) {
+    checkBlobs: function (data) {
         return post('/blob/check-blobsize', data)
     },
     // 上传文件之后需要更新blob空间
-	updateSize: function (data) {
+    updateSize: function (data) {
         return post('/blob/update-blobsize', data)
+    },
+    /**
+     * 上传文件之后保存文件的描述信息
+     * opt: add 更新
+     * opt: del 删除
+     **/
+    upsertBlobInfo: function (data) {
+        return post('/blob/bloblog-opt', data)
+    },
+    /**
+     * 查询资源信息
+     * 这里统一将返回数据处理成原来前端直接listBlob返回的数据格式
+     * @returns 
+     */
+    listBlobInfo: function (data, host, container) {
+        return new Promise((r, j) => {
+            post('/blob/bloblog-list', data).then(
+                res => {
+                    console.log(res)
+                    let blobs = []
+                    res.bloblogs.forEach(item => {
+                        let blobName = item.url
+                        let info = getExAndType(item.url)
+                        let i = {
+                            url: host + '/' +container + '/' + item.url,
+                            blob: '/' + item.url,
+                            name: blobName.substring(blobName.lastIndexOf('/') + 1),
+                            size: item.size,
+                            createTime: item.time,
+                            extension: info.ex,
+                            type: info.type,
+                            periodId: item.periodId,
+                            subjectId: item.subjectId,
+                            gradeId: item.gradeId,
+                            id: item.id
+                        }
+                        blobs.push(i)
+                    })
+                    r(blobs)
+                },
+                err => {
+                    j(err)
+                }
+            )
+
+        })
+
+        // return post('/blob/bloblog-list', data)
     }
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/api/index.js

@@ -29,6 +29,7 @@ import spaceAuth from './spaceAuth'
 import room from './room'
 import mark from './mark'
 import openMgmt from './openMgmt';
+import service from './service';
 
 export default {
     accessToken,
@@ -59,6 +60,7 @@ export default {
     room,
     mark,
     openMgmt,
+	service,
 
     // 获取登录跳转链接
     getLoginLink: function (data) {

+ 6 - 1
TEAMModelOS/ClientApp/src/api/schoolSetting.js

@@ -73,5 +73,10 @@ export default {
     //根据私有班级id集合查询班级详细信息
     getClassByIds: function (data) {
         return post('/school/classroom/name', data)
-    }
+    },
+	
+	// 申请建立学校
+	applySchool:function (data) {
+        return post('/core/apply-school', data)
+    },
 }

+ 7 - 0
TEAMModelOS/ClientApp/src/api/service.js

@@ -0,0 +1,7 @@
+import { fetch, post } from '@/api/http'
+export default {
+	/* 获取端外通知 */
+    getNotification: function (data) {
+        return post('https://api2.teammodel.net/service/getnotification', data)
+    },
+}

+ 3 - 0
TEAMModelOS/ClientApp/src/api/syllabus.js

@@ -19,6 +19,9 @@ export default {
 	DeleteTree:function(data) {
 	    return post('/common/syllabus/delete', data)
 	},
+	ShareTree:function(data) {
+	    return post('/teacher/share/to', data)
+	},
 	// 查找知识块数量
 	FindBlockCount: function (data) {
 		return post('/knowledges/find-count', data)

+ 141 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html

@@ -54,6 +54,42 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe718;</span>
+                <div class="name">在籍学生</div>
+                <div class="code-name">&amp;#xe718;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe633;</span>
+                <div class="name">icon_icon_ 学生管理</div>
+                <div class="code-name">&amp;#xe633;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe637;</span>
+                <div class="name">教师</div>
+                <div class="code-name">&amp;#xe637;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe630;</span>
+                <div class="name">学生</div>
+                <div class="code-name">&amp;#xe630;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe659;</span>
+                <div class="name">微信 (1)</div>
+                <div class="code-name">&amp;#xe659;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe643;</span>
+                <div class="name">地球</div>
+                <div class="code-name">&amp;#xe643;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe603;</span>
                 <div class="name">手机未认证</div>
@@ -774,9 +810,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1621999720250') format('woff2'),
-       url('iconfont.woff?t=1621999720250') format('woff'),
-       url('iconfont.ttf?t=1621999720250') format('truetype');
+  src: url('iconfont.woff2?t=1623427872430') format('woff2'),
+       url('iconfont.woff?t=1623427872430') format('woff'),
+       url('iconfont.ttf?t=1623427872430') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -802,6 +838,60 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont icon-student1"></span>
+            <div class="name">
+              在籍学生
+            </div>
+            <div class="code-name">.icon-student1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-student2"></span>
+            <div class="name">
+              icon_icon_ 学生管理
+            </div>
+            <div class="code-name">.icon-student2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-teacher"></span>
+            <div class="name">
+              教师
+            </div>
+            <div class="code-name">.icon-teacher
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-student"></span>
+            <div class="name">
+              学生
+            </div>
+            <div class="code-name">.icon-student
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-wechat"></span>
+            <div class="name">
+              微信 (1)
+            </div>
+            <div class="code-name">.icon-wechat
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-earth"></span>
+            <div class="name">
+              地球
+            </div>
+            <div class="code-name">.icon-earth
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont icon-phone-unverify"></span>
             <div class="name">
@@ -1882,6 +1972,54 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-student1"></use>
+                </svg>
+                <div class="name">在籍学生</div>
+                <div class="code-name">#icon-student1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-student2"></use>
+                </svg>
+                <div class="name">icon_icon_ 学生管理</div>
+                <div class="code-name">#icon-student2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-teacher"></use>
+                </svg>
+                <div class="name">教师</div>
+                <div class="code-name">#icon-teacher</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-student"></use>
+                </svg>
+                <div class="name">学生</div>
+                <div class="code-name">#icon-student</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-wechat"></use>
+                </svg>
+                <div class="name">微信 (1)</div>
+                <div class="code-name">#icon-wechat</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-earth"></use>
+                </svg>
+                <div class="name">地球</div>
+                <div class="code-name">#icon-earth</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-phone-unverify"></use>

+ 27 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2000444 */
-  src: url('iconfont.woff2?t=1621999720250') format('woff2'),
-       url('iconfont.woff?t=1621999720250') format('woff'),
-       url('iconfont.ttf?t=1621999720250') format('truetype');
+  src: url('iconfont.woff2?t=1623427872430') format('woff2'),
+       url('iconfont.woff?t=1623427872430') format('woff'),
+       url('iconfont.ttf?t=1623427872430') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,30 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-student1:before {
+  content: "\e718";
+}
+
+.icon-student2:before {
+  content: "\e633";
+}
+
+.icon-teacher:before {
+  content: "\e637";
+}
+
+.icon-student:before {
+  content: "\e630";
+}
+
+.icon-wechat:before {
+  content: "\e659";
+}
+
+.icon-earth:before {
+  content: "\e643";
+}
+
 .icon-phone-unverify:before {
   content: "\e603";
 }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js


+ 42 - 0
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json

@@ -5,6 +5,48 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "8827519",
+      "name": "在籍学生",
+      "font_class": "student1",
+      "unicode": "e718",
+      "unicode_decimal": 59160
+    },
+    {
+      "icon_id": "19109549",
+      "name": "icon_icon_ 学生管理",
+      "font_class": "student2",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "8156489",
+      "name": "教师",
+      "font_class": "teacher",
+      "unicode": "e637",
+      "unicode_decimal": 58935
+    },
+    {
+      "icon_id": "3904398",
+      "name": "学生",
+      "font_class": "student",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "1382584",
+      "name": "微信 (1)",
+      "font_class": "wechat",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "2678587",
+      "name": "地球",
+      "font_class": "earth",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
     {
       "icon_id": "21777109",
       "name": "手机未认证",

BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2


BIN
TEAMModelOS/ClientApp/src/assets/image/1-1.jpg


BIN
TEAMModelOS/ClientApp/src/assets/login/1-1.jpg


BIN
TEAMModelOS/ClientApp/src/assets/login/1-2.png


BIN
TEAMModelOS/ClientApp/src/assets/login/1-3.png


BIN
TEAMModelOS/ClientApp/src/assets/login/1-4.png


BIN
TEAMModelOS/ClientApp/src/assets/login/1-5.png


BIN
TEAMModelOS/ClientApp/src/assets/login/1-7.png


BIN
TEAMModelOS/ClientApp/src/assets/login/2-1.png


BIN
TEAMModelOS/ClientApp/src/assets/login/2-2.jpg


BIN
TEAMModelOS/ClientApp/src/assets/login/3-1.jpg


BIN
TEAMModelOS/ClientApp/src/assets/login/3-2.png


+ 54 - 0
TEAMModelOS/ClientApp/src/assets/mark/0.svg

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<polygon class="st0" points="833.28,590.14 635.35,787.28 620.58,801.99 501.47,683.35 714.17,471.5 		"/>
+		<path class="st3" d="M370.34,693.63L88.72,413.14L412.74,90.42l342.03,340.66L491.16,693.63
+			C457.79,726.85,403.7,726.85,370.34,693.63z"/>
+		<path class="st0" d="M921.61,243.59c0,13.16-5.04,26.32-15.12,36.35L695.46,490.15l-60.11-59.87l-65.82-65.55l65.82-65.55
+			l92.32-91.94c49.39-49.19,129.45-49.19,178.83,0C916.57,217.27,921.61,230.44,921.61,243.59z"/>
+		<path class="st3" d="M921.61,243.59c0,13.16-5.04,26.32-15.12,36.35L695.46,490.15l-60.11-59.87v-131.1l92.32-91.94
+			c49.39-49.19,129.45-49.19,178.83,0C916.57,217.27,921.61,230.44,921.61,243.59z"/>
+		<path class="st2" d="M728.53,457.2L491.15,693.63c-33.36,33.23-87.45,33.23-120.81,0c-82.23-81.9-82.23-214.69,0-296.59
+			c41.12-40.96,95-61.43,148.9-61.43c40.5,0,81.03,11.57,116.11,34.72c11.59,7.64,22.58,16.54,32.78,26.71L728.53,457.2z"/>
+		<path class="st5" d="M385.03,275.88l-76.82-76.51c-29.53-29.42-29.53-77.11,0-106.53l0,0c29.53-29.42,77.42-29.42,106.95,0
+			l76.82,76.51c29.53,29.42,29.53,77.11,0,106.53l0,0C462.45,305.29,414.57,305.29,385.03,275.88z"/>
+		<path class="st5" d="M276.5,383.97l-76.82-76.51c-29.53-29.42-29.53-77.11,0-106.53l0,0c29.53-29.42,77.42-29.42,106.95,0
+			l76.82,76.51c29.53,29.42,29.53,77.11,0,106.53l0,0C353.92,413.39,306.04,413.39,276.5,383.97z"/>
+		<path class="st5" d="M167.97,492.07l-76.82-76.51c-29.53-29.42-29.53-77.11,0-106.53l0,0c29.53-29.42,77.42-29.42,106.95,0
+			l76.82,76.51c29.53,29.42,29.53,77.11,0,106.53l0,0C245.39,521.48,197.51,521.48,167.97,492.07z"/>
+		<polygon class="st3" points="833.28,590.14 635.35,787.28 635.35,550.01 714.17,471.5 		"/>
+		<polygon class="st1" points="955,630.5 635.35,948.87 630.98,953.23 482.44,805.27 635.35,652.98 806.45,482.56 		"/>
+		<polygon class="st4" points="955,630.5 635.35,948.87 635.35,652.98 806.45,482.56 		"/>
+		<path class="st5" d="M728.53,457.2l-93.19,92.81V370.33c11.59,7.64,22.58,16.54,32.78,26.71L728.53,457.2z"/>
+		<ellipse class="st3" cx="834.99" cy="617.4" rx="49.43" ry="49.23"/>
+		<ellipse class="st3" cx="741.47" cy="710.54" rx="49.43" ry="49.23"/>
+	</g>
+</g>
+</svg>

+ 47 - 0
TEAMModelOS/ClientApp/src/assets/mark/1.svg

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<path class="st0" d="M850.73,854.26V955H173.27V854.26c0-65.03,53.02-117.72,118.41-117.72h440.63
+			C797.71,736.54,850.73,789.24,850.73,854.26z"/>
+		<rect x="389.74" y="363.91" class="st1" width="244.52" height="372.63"/>
+		<path class="st6" d="M389.74,628.94h-0.28c-51.87,0-93.93-42.05-93.93-93.93v-77.17c0-51.87,42.05-93.93,93.93-93.93h0.28V628.94z
+			"/>
+		<path class="st7" d="M634.54,628.94h-0.27V363.91h0.27c51.87,0,93.93,42.05,93.93,93.93v77.17
+			C728.46,586.89,686.41,628.94,634.54,628.94z"/>
+		<ellipse class="st0" cx="512" cy="199.6" rx="131.36" ry="130.6"/>
+		<polygon class="st1" points="566.14,777.34 566.14,914.2 459.25,914.2 459.25,860.04 429.8,860.04 429.8,823.44 476.91,777.34 		
+			"/>
+		<path class="st3" d="M850.73,854.26V955H512V736.54h220.32C797.71,736.54,850.73,789.24,850.73,854.26z"/>
+		<rect x="512" y="777.34" class="st4" width="54.14" height="136.86"/>
+		<rect x="512" y="363.91" class="st4" width="122.26" height="372.63"/>
+		<path class="st3" d="M643.36,199.6c0,72.13-58.81,130.6-131.36,130.6V69C584.55,69,643.36,127.47,643.36,199.6z"/>
+	</g>
+</g>
+</svg>

+ 57 - 0
TEAMModelOS/ClientApp/src/assets/mark/2.svg

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<polygon class="st0" points="578.56,845.59 445.44,845.59 474.93,574.8 549.07,574.8 		"/>
+		<polygon class="st3" points="578.56,845.59 510.59,845.59 510.59,574.8 549.07,574.8 		"/>
+		<path class="st3" d="M318.64,482.85h-86.28c-73.58,0-133.45-59.56-133.45-132.77c0-54.14,44.27-98.18,98.68-98.18h121.05
+			c22.05,0,39.92,17.78,39.92,39.72v151.52C358.55,465.07,340.68,482.85,318.64,482.85z M197.58,331.33
+			c-10.39,0-18.84,8.41-18.84,18.74c0,29.41,24.05,53.34,53.61,53.34h46.36v-72.08H197.58z"/>
+		<path class="st3" d="M665.45,443.13V291.62c0-21.94,17.87-39.72,39.92-39.72h121.05c54.41,0,98.68,44.04,98.68,98.18
+			c0,73.21-59.86,132.77-133.45,132.77h-86.28C683.32,482.85,665.45,465.07,665.45,443.13z M745.28,331.33v72.08h46.36
+			c29.56,0,53.61-23.93,53.61-53.34c0-10.33-8.45-18.74-18.84-18.74H745.28z"/>
+		<path class="st2" d="M749.8,224.68v161c0,130.67-106.47,236.6-237.8,236.6h-1.41c-130.68-0.77-236.39-106.4-236.39-236.6v-161
+			H749.8z"/>
+		<path class="st0" d="M827.13,146.85c0,21.49-8.76,40.95-22.91,55.03c-14.16,14.08-33.71,22.8-55.31,22.8H275.1
+			c-43.21,0-78.23-34.84-78.23-77.83c0-21.49,8.76-40.95,22.91-55.05C233.94,77.71,253.5,69,275.1,69h473.8
+			C792.11,69,827.13,103.86,827.13,146.85z"/>
+		<polygon class="st1" points="561.86,393.46 573.64,461.74 512,429.51 510.59,430.24 450.36,461.74 462.14,393.46 412.27,345.1 
+			481.18,335.14 510.59,275.86 512,273.01 542.82,335.14 611.73,345.1 		"/>
+		<polygon class="st4" points="561.86,393.46 573.64,461.74 512,429.51 512,273.01 542.82,335.14 611.73,345.1 		"/>
+		<path class="st3" d="M827.13,146.85c0,21.49-8.76,40.95-22.91,55.03c-14.16,14.08-33.71,22.8-55.31,22.8H510.59V69H748.9
+			C792.11,69,827.13,103.86,827.13,146.85z"/>
+		<path class="st5" d="M749.8,224.68v161c0,130.67-106.47,236.6-237.8,236.6h-1.41v-397.6H749.8z"/>
+		<path class="st2" d="M694.81,955H329.19c0-30.21,12.3-57.57,32.2-77.36c19.91-19.81,47.39-32.05,77.76-32.05h145.71
+			C645.58,845.59,694.81,894.57,694.81,955z"/>
+		<path class="st5" d="M694.81,955H510.59V845.59h74.27C645.58,845.59,694.81,894.57,694.81,955z"/>
+		<polygon class="st4" points="561.86,393.46 573.64,461.74 512,429.51 510.59,430.24 510.59,275.86 512,273.01 542.82,335.14 
+			611.73,345.1 		"/>
+	</g>
+</g>
+</svg>

+ 51 - 0
TEAMModelOS/ClientApp/src/assets/mark/3.svg

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<path class="st0" d="M863.84,430.19v490.27c0,19.08-15.5,34.54-34.62,34.54H194.79c-19.12,0-34.62-15.46-34.62-34.54V430.19
+			H863.84z"/>
+		<path class="st1" d="M357.23,69c-56.53,0-102.34,45.71-102.34,102.1c0,28.2,11.45,53.71,29.97,72.19s44.11,29.91,72.37,29.91
+			h102.34V171.1C459.57,114.71,413.75,69,357.23,69z M388.52,202.32h-31.3c-17.26,0-31.29-14.01-31.29-31.22
+			c0-17.21,14.03-31.22,31.29-31.22c17.25,0,31.3,14.01,31.3,31.22V202.32z"/>
+		<path class="st4" d="M564.43,171.1v102.1h102.34c28.26,0,53.85-11.43,72.37-29.91s29.97-43.99,29.97-72.19
+			c0-56.38-45.81-102.1-102.34-102.1C610.26,69,564.43,114.71,564.43,171.1z M635.48,171.1c0-17.21,14.04-31.22,31.3-31.22
+			c17.26,0,31.29,14.01,31.29,31.22c0,17.21-14.03,31.22-31.29,31.22h-31.3V171.1z"/>
+		<path class="st3" d="M863.84,430.19v490.27c0,19.08-15.5,34.54-34.62,34.54H512V430.19H863.84z"/>
+		<path class="st2" d="M892.6,309.09v121.1H131.4v-121.1c0-19.82,16.12-35.9,35.98-35.9h689.23
+			C876.48,273.19,892.6,289.27,892.6,309.09z"/>
+		<path class="st5" d="M892.6,309.09v121.1H512v-157h344.61C876.48,273.19,892.6,289.27,892.6,309.09z"/>
+		<rect x="459.57" y="273.19" class="st6" width="104.86" height="157"/>
+		<rect x="459.57" y="430.19" class="st1" width="104.86" height="524.81"/>
+		<rect x="160.16" y="581.23" class="st6" width="703.67" height="104.61"/>
+		<rect x="512" y="430.19" class="st4" width="52.43" height="524.81"/>
+		<rect x="512" y="273.19" class="st7" width="52.43" height="157"/>
+		<rect x="512" y="581.23" class="st7" width="351.84" height="104.61"/>
+	</g>
+</g>
+</svg>

+ 63 - 0
TEAMModelOS/ClientApp/src/assets/mark/4.svg

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<polygon class="st0" points="559.21,330.91 955,723.6 732.07,944.65 336.28,551.95 		"/>
+		<polygon class="st3" points="492.81,396.75 888.59,789.45 798.47,878.8 402.69,486.11 		"/>
+		<polygon class="st6" points="464.22,330.84 69,722.97 292.25,944.33 687.47,552.2 		"/>
+		<polygon class="st7" points="530.72,396.78 135.5,788.91 225.75,878.39 620.97,486.26 		"/>
+		<g>
+			<g>
+				<path class="st2" d="M515.71,419.53c0,0,7.63,154.93-37.63,199.8s-118.63,44.87-163.89,0s-45.26-117.62,0-162.49
+					S515.71,419.53,515.71,419.53z"/>
+				<path class="st5" d="M515.71,419.53c0,0,156.26-7.56,201.52,37.31s45.26,117.62,0,162.49s-118.63,44.87-163.89,0
+					S515.71,419.53,515.71,419.53z"/>
+				<path class="st5" d="M515.71,419.53c0,0-7.63-154.93,37.63-199.8s118.63-44.87,163.89,0s45.26,117.62,0,162.49
+					S515.71,419.53,515.71,419.53z"/>
+				<path class="st2" d="M515.71,419.53c0,0-156.26,7.56-201.52-37.31s-45.26-117.62,0-162.49s118.63-44.87,163.89,0
+					S515.71,419.53,515.71,419.53z"/>
+			</g>
+			<path class="st0" d="M515.71,419.53c0,0-126.54,138.33-203.59,138.33s-139.52-61.93-139.52-138.33S235.06,281.2,312.12,281.2
+				S515.71,419.53,515.71,419.53z"/>
+			<path class="st0" d="M655.22,621.39c0,76.4-62.45,138.33-139.51,138.33h-0.5c-76.85-0.27-139.02-62.11-139.02-138.33
+				c0-73.73,129.97-193.18,139.02-201.4c0.33-0.31,0.5-0.46,0.5-0.46S655.22,544.99,655.22,621.39z"/>
+			<path class="st3" d="M515.71,419.53c0,0,126.54-138.33,203.59-138.33s139.52,61.93,139.52,138.33S796.36,557.86,719.3,557.86
+				S515.71,419.53,515.71,419.53z"/>
+			<path class="st0" d="M655.22,217.69c0,76.4-139.51,201.84-139.51,201.84s-0.17-0.15-0.5-0.46
+				c-9.05-8.22-139.02-127.65-139.02-201.38c0-76.24,62.18-138.06,139.02-138.33h0.5C592.77,79.35,655.22,141.27,655.22,217.69z"/>
+			<path class="st3" d="M655.22,621.39c0,76.4-62.45,138.33-139.51,138.33h-0.5V419.99c0.33-0.31,0.5-0.46,0.5-0.46
+				S655.22,544.99,655.22,621.39z"/>
+			<path class="st3" d="M655.22,217.69c0,76.4-139.51,201.84-139.51,201.84s-0.17-0.15-0.5-0.46V79.35h0.5
+				C592.77,79.35,655.22,141.27,655.22,217.69z"/>
+			<ellipse class="st5" cx="515.22" cy="419.07" rx="107.05" ry="106.13"/>
+			<ellipse class="st1" cx="515.22" cy="419.07" rx="58.15" ry="57.65"/>
+		</g>
+	</g>
+</g>
+</svg>

+ 94 - 0
TEAMModelOS/ClientApp/src/assets/mark/5.svg

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<g>
+			<path class="st1" d="M644.91,389.7c-4.15,4.02-6.04,9.83-5.04,15.52l22.44,127.87c2.51,14.27-12.48,25.17-25.25,18.38
+				L522.6,490.57c-2.54-1.35-5.34-2.03-8.14-2.03c-2.79,0-5.6,0.67-8.15,2.03l-114.47,60.89c-12.77,6.8-27.75-4.11-25.25-18.38
+				l22.44-127.87c1-5.69-0.88-11.5-5.03-15.52l-93.19-90.23c-10.4-10.07-4.67-27.71,9.64-29.74L428.8,251.6
+				c5.71-0.8,10.65-4.4,13.18-9.59l56.87-116.66c3.18-6.51,9.39-9.76,15.61-9.76c6.22,0,12.42,3.26,15.6,9.76l56.87,116.66
+				c2.53,5.19,7.47,8.78,13.18,9.59l128.33,18.13c14.32,2.02,20.04,19.67,9.64,29.74L644.91,389.7z"/>
+			<polygon class="st6" points="603.62,382.43 625.06,507.71 514.46,449.39 512.86,448.56 400.66,507.71 422.1,382.43 
+				331.33,293.68 456.76,275.4 512.86,161.41 514.46,164.65 568.96,275.4 694.39,293.68 			"/>
+			<path class="st4" d="M644.91,389.7c-4.15,4.02-6.04,9.83-5.04,15.52l22.44,127.87c2.51,14.27-12.48,25.17-25.25,18.38
+				L522.6,490.57c-2.54-1.35-5.34-2.03-8.14-2.03V115.58c6.22,0,12.42,3.26,15.6,9.76l56.87,116.66c2.53,5.19,7.47,8.78,13.18,9.59
+				l128.33,18.13c14.32,2.02,20.04,19.67,9.64,29.74L644.91,389.7z"/>
+			<polygon class="st7" points="603.62,382.43 625.06,507.71 514.46,449.39 514.46,164.65 568.96,275.4 694.39,293.68 			"/>
+			<polygon class="st0" points="546.12,355.64 553.84,399.62 514.46,378.68 475.08,399.62 482.8,355.64 450.74,324.59 
+				494.89,318.36 514.46,278.22 534.02,318.36 578.17,324.59 			"/>
+			<polygon class="st3" points="546.12,355.64 553.84,399.62 514.46,378.68 514.46,278.22 534.02,318.36 578.17,324.59 			"/>
+		</g>
+		<g>
+			<path class="st8" d="M512,774.68c-188.27,0-340.9-152.88-340.9-341.48c0-89.41,34.31-170.8,90.45-231.67"/>
+			<path class="st0" d="M256.31,383.43c-20.56,18.43-47.99,24.29-72.91,18.1c-3.41-25.48,5.43-52.16,26-70.6
+				c20.57-18.44,48.01-24.3,72.92-18.09C285.72,338.34,276.87,365,256.31,383.43z"/>
+			<path class="st0" d="M157.51,323.47c14.55,23.49,15.55,51.56,5.13,75.07c-25.64-1.06-50.33-14.42-64.89-37.91
+				c-14.56-23.49-15.55-51.58-5.12-75.07C118.29,286.63,142.96,299.98,157.51,323.47z"/>
+			<path class="st0" d="M252.87,482.35c-15.39,22.94-40.53,35.39-66.21,35.54c-9.58-23.85-7.57-51.89,7.83-74.84
+				c15.4-22.95,40.55-35.4,66.22-35.53C270.27,431.39,268.26,459.41,252.87,482.35z"/>
+			<path class="st0" d="M142.36,448.62c19.88,19.17,27.76,46.13,23.44,71.49c-25.11,5.3-52.33-1.55-72.22-20.72
+				c-19.89-19.18-27.76-46.15-23.43-71.49C95.28,422.61,122.48,429.46,142.36,448.62z"/>
+			<path class="st0" d="M288.47,569.42c-6.59,26.84-25.93,47.18-50,56.16c-17.17-19.11-24.9-46.13-18.31-72.98
+				c6.59-26.85,25.95-47.2,50.01-56.15C287.34,515.57,295.06,542.57,288.47,569.42z"/>
+			<path class="st0" d="M173.12,575.76c25.25,11.16,41.88,33.77,46.53,59.07c-21.77,13.62-49.67,16.55-74.93,5.39
+				c-25.26-11.17-41.9-33.79-46.52-59.08C119.98,567.53,147.88,564.6,173.12,575.76z"/>
+			<path class="st0" d="M360.2,642.76c1.49,27.6-11.1,52.7-31.52,68.3c-21.98-13.27-37.22-36.87-38.71-64.49
+				c-1.49-27.61,11.11-52.72,31.53-68.3C343.48,591.57,358.71,615.16,360.2,642.76z"/>
+			<path class="st0" d="M251.69,682.45c27.4,3.32,49.88,20.1,61.67,42.95c-16.87,19.38-42.72,30.31-70.12,26.99
+				c-27.41-3.32-49.91-20.12-61.67-42.96C198.46,690.06,224.29,679.13,251.69,682.45z"/>
+			<path class="st0" d="M256.11,271.1c-14.36,23.6-38.93,37.16-64.57,38.44c-10.62-23.4-9.86-51.5,4.51-75.11
+				c14.37-23.61,38.95-37.17,64.58-38.44C271.24,219.42,270.47,247.5,256.11,271.1z"/>
+			<path class="st8" d="M512,774.68c188.27,0,340.9-152.88,340.9-341.48c0-89.41-34.31-170.8-90.45-231.67"/>
+			<path class="st3" d="M767.69,383.43c20.56,18.43,47.99,24.29,72.91,18.1c3.41-25.48-5.43-52.16-26-70.6
+				c-20.57-18.44-48.01-24.3-72.92-18.09C738.28,338.34,747.13,365,767.69,383.43z"/>
+			<path class="st3" d="M866.49,323.47c-14.55,23.49-15.55,51.56-5.13,75.07c25.64-1.06,50.33-14.42,64.89-37.91
+				c14.56-23.49,15.55-51.58,5.12-75.07C905.71,286.63,881.04,299.98,866.49,323.47z"/>
+			<path class="st3" d="M771.13,482.35c15.39,22.94,40.53,35.39,66.21,35.54c9.58-23.85,7.57-51.89-7.83-74.84
+				c-15.4-22.95-40.55-35.4-66.22-35.53C753.73,431.39,755.74,459.41,771.13,482.35z"/>
+			<path class="st3" d="M881.64,448.62c-19.88,19.17-27.76,46.13-23.44,71.49c25.11,5.3,52.33-1.55,72.22-20.72
+				c19.89-19.18,27.76-46.15,23.43-71.49C928.72,422.61,901.52,429.46,881.64,448.62z"/>
+			<path class="st3" d="M735.53,569.42c6.59,26.84,25.93,47.18,50,56.16c17.17-19.11,24.9-46.13,18.31-72.98
+				c-6.59-26.85-25.95-47.2-50.01-56.15C736.66,515.57,728.94,542.57,735.53,569.42z"/>
+			<path class="st3" d="M850.88,575.76c-25.25,11.16-41.88,33.77-46.53,59.07c21.77,13.62,49.67,16.55,74.93,5.39
+				c25.26-11.17,41.9-33.79,46.52-59.08C904.02,567.53,876.12,564.6,850.88,575.76z"/>
+			<path class="st3" d="M663.8,642.76c-1.49,27.6,11.1,52.7,31.52,68.3c21.98-13.27,37.22-36.87,38.71-64.49
+				c1.49-27.61-11.11-52.72-31.53-68.3C680.52,591.57,665.29,615.16,663.8,642.76z"/>
+			<path class="st3" d="M772.31,682.45c-27.4,3.32-49.88,20.1-61.67,42.95c16.87,19.38,42.72,30.31,70.12,26.99
+				c27.41-3.32,49.91-20.12,61.67-42.96C825.54,690.06,799.71,679.13,772.31,682.45z"/>
+			<path class="st3" d="M767.89,271.1c14.36,23.6,38.93,37.16,64.57,38.44c10.62-23.4,9.86-51.5-4.51-75.11
+				C813.58,210.82,789,197.26,763.37,196C752.76,219.42,753.53,247.5,767.89,271.1z"/>
+			<ellipse class="st2" cx="510.25" cy="774.67" rx="133.53" ry="133.75"/>
+			<path class="st5" d="M643.78,774.67c0,73.87-59.78,133.75-133.53,133.75V640.91C583.99,640.91,643.78,700.8,643.78,774.67z"/>
+			<path class="st0" d="M570.55,774.67c0,33.36-26.99,60.4-60.3,60.4s-60.31-27.04-60.31-60.4c0-33.36,27-60.4,60.31-60.4
+				S570.55,741.31,570.55,774.67z"/>
+			<path class="st3" d="M570.55,774.67c0,33.36-26.99,60.4-60.3,60.4v-120.8C543.55,714.27,570.55,741.31,570.55,774.67z"/>
+		</g>
+	</g>
+</g>
+</svg>

+ 77 - 0
TEAMModelOS/ClientApp/src/assets/mark/6.svg

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<path class="st2" d="M690.41,548.08l-46.02,16.25c-14.57,5.15-21.46,21.79-14.79,35.73l20.97,43.81
+			c10.56,22.06-12.42,45.16-34.53,34.72l-44.79-21.14c-13.88-6.54-30.38,0.29-35.56,14.75l-16.61,46.41
+			c-4.35,12.15-15.5,17.86-26.25,17.15c-9.57-0.63-18.82-6.34-22.69-17.15l-16.61-46.41c-5.18-14.46-21.68-21.29-35.56-14.75
+			l-44.79,21.14c-22.11,10.44-45.09-12.66-34.53-34.72l20.97-43.81c6.67-13.94-0.22-30.58-14.79-35.73l-46.02-16.25
+			c-23.11-8.16-23.11-40.84,0-49l46.02-16.25c14.57-5.15,21.46-21.78,14.79-35.72l-20.97-43.82
+			c-10.56-22.05,12.42-45.16,34.53-34.72l44.79,21.14c13.88,6.55,30.38-0.29,35.56-14.74l16.61-46.41
+			c3.87-10.81,13.12-16.53,22.69-17.16c10.75-0.71,21.9,5.02,26.25,17.16l16.61,46.41c5.18,14.45,21.68,21.29,35.56,14.74
+			l44.79-21.14c22.11-10.44,45.09,12.67,34.53,34.72l-20.97,43.82c-6.67,13.94,0.22,30.57,14.79,35.72l46.02,16.25
+			C713.52,507.24,713.52,539.92,690.41,548.08z"/>
+		<path class="st0" d="M587.35,533.07l-0.78,0.75c-9.97,9.6-14.55,23.51-12.24,37.15l0.23,1.36c5.8,34.15-30.04,60.15-60.7,44.04
+			l-1.97-1.04c-5.96-3.13-12.51-4.74-19.05-4.8c-6.74-0.07-13.51,1.49-19.67,4.69l-1.97,1.03c-30.75,15.95-66.46-10.26-60.46-44.38
+			l0.23-1.35c2.4-13.63-2.11-27.56-12.02-37.22l-0.77-0.75c-24.92-24.25-11.1-66.54,23.32-71.4l1.59-0.23
+			c13.61-1.92,25.4-10.41,31.55-22.7l0.93-1.86c7.69-15.37,22.48-23.06,37.28-23.11c14.97-0.05,29.96,7.72,37.66,23.32l0.92,1.86
+			c6.08,12.33,17.83,20.88,31.43,22.88l1.58,0.23C598.81,466.6,612.39,508.96,587.35,533.07z"/>
+		<ellipse class="st4" cx="373.01" cy="899.53" rx="55.86" ry="55.47"/>
+		<ellipse class="st1" cx="347.63" cy="152.97" rx="55.86" ry="55.47"/>
+		<ellipse class="st1" cx="741.21" cy="102.97" rx="34.2" ry="33.97"/>
+		<ellipse class="st6" cx="182.17" cy="670.65" rx="34.2" ry="33.97"/>
+		<ellipse class="st3" cx="841.83" cy="645.65" rx="34.2" ry="33.97"/>
+		<ellipse class="st3" cx="592.27" cy="161.36" rx="34.2" ry="33.97"/>
+		<g>
+			<line class="st8" x1="715.55" y1="304.19" x2="807.62" y2="212.75"/>
+			<line class="st8" x1="181.61" y1="834.42" x2="273.69" y2="742.98"/>
+			<line class="st8" x1="715.55" y1="742.98" x2="807.62" y2="834.42"/>
+			<line class="st8" x1="181.61" y1="212.75" x2="273.69" y2="304.19"/>
+		</g>
+		<path class="st5" d="M690.41,548.08l-46.02,16.25c-14.57,5.15-21.46,21.79-14.79,35.73l20.97,43.81
+			c10.56,22.06-12.42,45.16-34.53,34.72l-44.79-21.14c-13.88-6.54-30.38,0.29-35.56,14.75l-16.61,46.41
+			c-4.35,12.15-15.5,17.86-26.25,17.15V311.4c10.75-0.71,21.9,5.02,26.25,17.16l16.61,46.41c5.18,14.45,21.68,21.29,35.56,14.74
+			l44.79-21.14c22.11-10.44,45.09,12.67,34.53,34.72l-20.97,43.82c-6.67,13.94,0.22,30.57,14.79,35.72l46.02,16.25
+			C713.52,507.24,713.52,539.92,690.41,548.08z"/>
+		<path class="st3" d="M587.35,533.07l-0.78,0.75c-9.97,9.6-14.55,23.51-12.24,37.15l0.23,1.36c5.8,34.15-30.04,60.15-60.7,44.04
+			l-1.97-1.04c-5.96-3.13-12.51-4.74-19.05-4.8V413.25c14.97-0.05,29.96,7.72,37.66,23.32l0.92,1.86
+			c6.08,12.33,17.83,20.88,31.43,22.88l1.58,0.23C598.81,466.6,612.39,508.96,587.35,533.07z"/>
+		<path class="st3" d="M630.72,772.48l7.47,17.13c1.54,3.54,5.21,5.65,9.04,5.22l18.57-2.1c7.63-0.86,12.61,7.78,8.06,13.95
+			l-11.1,15.03c-2.29,3.1-2.29,7.34,0,10.44l11.1,15.03c4.56,6.17-0.43,14.81-8.06,13.95l-18.57-2.1c-3.83-0.43-7.5,1.68-9.04,5.22
+			l-7.47,17.13c-3.07,7.03-13.04,7.03-16.11,0l-7.47-17.13c-1.54-3.54-5.21-5.65-9.04-5.22l-18.57,2.1
+			c-7.63,0.86-12.61-7.78-8.06-13.95l11.1-15.03c2.29-3.1,2.29-7.34,0-10.44l-11.1-15.03c-4.56-6.17,0.43-14.81,8.06-13.95
+			l18.57,2.1c3.83,0.43,7.5-1.68,9.04-5.22l7.47-17.13C617.68,765.45,627.66,765.45,630.72,772.48z"/>
+		<path class="st0" d="M224.43,338.16l7.47,17.13c1.54,3.54,5.21,5.65,9.04,5.22l18.57-2.1c7.63-0.86,12.61,7.78,8.06,13.95
+			l-11.1,15.03c-2.29,3.1-2.29,7.34,0,10.44l11.1,15.03c4.56,6.17-0.43,14.81-8.06,13.95l-18.57-2.1c-3.83-0.43-7.5,1.68-9.04,5.22
+			l-7.47,17.13c-3.07,7.03-13.04,7.03-16.11,0l-7.47-17.13c-1.54-3.54-5.21-5.65-9.04-5.22l-18.57,2.1
+			c-7.63,0.86-12.61-7.78-8.06-13.95l11.1-15.03c2.29-3.1,2.29-7.34,0-10.44l-11.1-15.03c-4.56-6.17,0.43-14.81,8.06-13.95
+			l18.57,2.1c3.83,0.43,7.5-1.68,9.04-5.22l7.47-17.13C211.39,331.13,221.37,331.13,224.43,338.16z"/>
+	</g>
+</g>
+</svg>

+ 62 - 0
TEAMModelOS/ClientApp/src/assets/mark/7.svg

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<polygon class="st0" points="619.2,737.25 404.8,737.25 467.66,430.27 556.34,430.27 		"/>
+		<path class="st1" d="M695.79,797.31v74.05H328.21v-74.05c0-33.17,26.95-60.06,60.22-60.06h247.14
+			C668.84,737.25,695.79,764.14,695.79,797.31z"/>
+		<path class="st0" d="M723.74,895.87V955H300.26v-59.13c0-13.54,11-24.51,24.57-24.51h374.32
+			C712.73,871.36,723.74,882.33,723.74,895.87z"/>
+		<path class="st3" d="M723.74,895.87V955H511.28v-83.64h187.88C712.73,871.36,723.74,882.33,723.74,895.87z"/>
+		<path class="st4" d="M695.79,797.31v74.05H511.28V737.25h124.29C668.84,737.25,695.79,764.14,695.79,797.31z"/>
+		<polygon class="st3" points="619.2,737.25 511.28,737.25 511.28,430.27 556.34,430.27 		"/>
+		<g>
+			<path class="st1" d="M660.62,380.46c-4.73,4.57-6.88,11.17-5.74,17.63l25.56,145.29c2.86,16.21-14.21,28.6-28.76,20.88
+				l-130.4-69.19c-2.9-1.54-6.08-2.31-9.27-2.31c-3.18,0-6.38,0.76-9.28,2.31l-130.41,69.19c-14.55,7.72-31.62-4.67-28.76-20.88
+				l25.56-145.29c1.14-6.46-1.01-13.07-5.73-17.63L257.23,277.94c-11.84-11.44-5.33-31.49,10.99-33.79l146.21-20.6
+				c6.5-0.91,12.13-5,15.01-10.89l64.79-132.56C497.84,72.7,504.92,69,512,69c7.09,0,14.15,3.7,17.78,11.09l64.79,132.56
+				c2.88,5.89,8.51,9.98,15.02,10.89l146.2,20.6c16.31,2.3,22.83,22.35,10.99,33.79L660.62,380.46z"/>
+			<polygon class="st6" points="613.58,372.2 638.01,514.56 512,448.29 510.18,447.35 382.36,514.56 406.78,372.2 303.38,271.36 
+				446.27,250.59 510.18,121.07 512,124.76 574.09,250.59 716.98,271.36 			"/>
+			<path class="st4" d="M660.62,380.46c-4.73,4.57-6.88,11.17-5.74,17.63l25.56,145.29c2.86,16.21-14.21,28.6-28.76,20.88
+				l-130.4-69.19c-2.9-1.54-6.08-2.31-9.27-2.31V69c7.09,0,14.15,3.7,17.78,11.09l64.79,132.56c2.88,5.89,8.51,9.98,15.02,10.89
+				l146.2,20.6c16.31,2.3,22.83,22.35,10.99,33.79L660.62,380.46z"/>
+			<polygon class="st7" points="613.58,372.2 638.01,514.56 512,448.29 512,124.76 574.09,250.59 716.98,271.36 			"/>
+			<polygon class="st0" points="548.07,341.77 556.86,391.74 512,367.94 467.14,391.74 475.93,341.77 439.42,306.49 489.71,299.41 
+				512,253.8 534.29,299.41 584.58,306.49 			"/>
+			<polygon class="st3" points="548.07,341.77 556.86,391.74 512,367.94 512,253.8 534.29,299.41 584.58,306.49 			"/>
+		</g>
+		<path class="st0" d="M601.49,806.45c0,6.32-2.57,12.04-6.73,16.19c-4.16,4.15-9.9,6.72-16.25,6.72H445.49
+			c-12.69,0-22.98-10.26-22.98-22.91c0-6.33,2.57-12.06,6.73-16.2c4.16-4.15,9.9-6.72,16.25-6.72h133.02
+			C591.2,783.53,601.49,793.79,601.49,806.45z"/>
+		<path class="st3" d="M601.49,806.45c0,6.32-2.57,12.04-6.73,16.19c-4.16,4.15-9.9,6.72-16.25,6.72h-68.33v-45.82h68.33
+			C591.2,783.53,601.49,793.79,601.49,806.45z"/>
+	</g>
+</g>
+</svg>

+ 54 - 0
TEAMModelOS/ClientApp/src/assets/mark/8.svg

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFB300;}
+	.st1{fill:#4A6DFB;}
+	.st2{fill:#FBEC6D;}
+	.st3{fill:#FA7D15;}
+	.st4{fill:#2746E0;}
+	.st5{fill:#FFDD2E;}
+	.st6{fill:#B1C1FF;}
+	.st7{fill:#7999FF;}
+	.st8{fill:none;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st9{fill:#FFFFFF;}
+	.st10{fill:none;}
+	.st11{fill:#FFB300;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st12{fill:#4A6DFB;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st13{fill:#FBEC6D;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st14{fill:#FA7D15;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st15{fill:#2746E0;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st16{fill:#FFDD2E;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st17{fill:#B1C1FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st18{fill:#7999FF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+	.st19{fill:#FFFFFF;stroke:#3E3A39;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<g id="图层_1">
+</g>
+<g id="图层_2">
+	<g>
+		<rect x="222.43" y="180.69" class="st12" width="580.76" height="215.05"/>
+		<rect x="222.43" y="244.75" class="st13" width="580.76" height="86.94"/>
+		<polygon class="st12" points="479.66,743.94 69,332.75 220.87,180.69 631.54,591.87 		"/>
+		<polygon class="st13" points="524.9,698.64 114.24,287.46 175.63,225.98 586.3,637.17 		"/>
+		<rect x="512.81" y="180.69" class="st15" width="290.38" height="215.05"/>
+		<rect x="512.81" y="244.75" class="st16" width="290.38" height="86.94"/>
+		<polygon class="st12" points="544.34,743.94 955,332.75 803.13,180.69 392.46,591.87 		"/>
+		<polygon class="st11" points="499.1,698.64 909.76,287.46 848.37,225.98 437.7,637.17 		"/>
+		<path class="st13" d="M722.02,633.03c0,115.87-93.59,209.84-209.21,210.28c-0.27,0.01-0.54,0.01-0.81,0.01
+			c-115.99,0-210.02-94.14-210.02-210.29c0-116.14,94.03-210.28,210.02-210.28c0.27,0,0.54,0,0.81,0.01
+			C628.43,423.19,722.02,517.16,722.02,633.03z"/>
+		<path class="st11" d="M653.76,633.03c0,78.12-63.02,141.5-140.94,141.95H512c-78.29,0-141.76-63.55-141.76-141.95
+			c0-78.38,63.46-141.94,141.76-141.94h0.81C590.74,491.53,653.76,554.91,653.76,633.03z"/>
+		<polygon class="st12" points="604.43,665.75 540.57,675.04 512.81,731.34 512,732.99 483.43,675.04 419.57,665.75 465.78,620.64 
+			454.87,556.96 512,587.02 512.81,586.6 569.13,556.96 558.22,620.64 		"/>
+		<polygon class="st17" points="558.22,657.36 569.13,721.05 512.81,691.4 512,690.98 454.87,721.05 465.78,657.36 419.57,612.25 
+			483.43,602.96 512,545.01 512.81,546.66 540.57,602.96 604.43,612.25 		"/>
+		<path class="st16" d="M722.02,633.03c0,115.87-93.59,209.84-209.21,210.28V422.76C628.43,423.19,722.02,517.16,722.02,633.03z"/>
+		<path class="st14" d="M653.76,633.03c0,78.12-63.02,141.5-140.94,141.95V491.09C590.74,491.53,653.76,554.91,653.76,633.03z"/>
+		<polygon class="st15" points="604.43,665.75 540.57,675.04 512.81,731.34 512.81,586.6 569.13,556.96 558.22,620.64 		"/>
+		<polygon class="st18" points="558.22,657.36 569.13,721.05 512.81,691.4 512.81,546.66 540.57,602.96 604.43,612.25 		"/>
+	</g>
+</g>
+</svg>

BIN
TEAMModelOS/ClientApp/src/assets/mark/img0.jpg


BIN
TEAMModelOS/ClientApp/src/assets/mark/img1.jpg


BIN
TEAMModelOS/ClientApp/src/assets/mark/img2.jpg


+ 5 - 5
TEAMModelOS/ClientApp/src/common/BaseAreaPicker.vue

@@ -38,12 +38,12 @@
 </script>
 <style>
 	.distpicker-address-wrapper select {
-		background-color: #575757;
-		color: #cacaca;
+		background-color: #575757 !important;
+		color: #cacaca !important;
 		margin: 5px 0;
-		font-size: 14px;
-		height: 35px;
-		border: 0;
+		font-size: 14px !important;
+		height: 35px !important;
+		border: 0 !important;
 		display: inline-block;
 		position: relative;
 		outline: none;

+ 5 - 31
TEAMModelOS/ClientApp/src/common/BaseLayout.less

@@ -38,7 +38,7 @@
         top: 70px;
         bottom: 0px;
         width: 100%;
-        padding-left: 191px;
+        padding-left: 192px;
         overflow-y: auto;
         background: var(--body-bg);
         transition: padding-left 0.4s;
@@ -128,14 +128,14 @@
     width: 100%;
     text-align: right;
     cursor: pointer;
-    transition: background 1s;
+    transition: background 0.5s;
     padding-right: 5px;
-    padding-top: 5px;
-    padding-bottom: 5px;
+    padding-top: 1px;
+    padding-bottom: 1px;
     background:var(--side-bg);
     &:hover {
         background: #404040;
-        transition: background 1s;
+        transition: background 0.5s;
     }
 
     &:hover .collapse-icon {
@@ -148,33 +148,7 @@
     transform: translateX(-18px);
     transition:transform 0.2s;
 }
-.sub-item-wrap {
-    position: relative;
-}
-
-.sub-item-wrap::before {
-    content: '';
-    z-index: -1;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    pointer-events: none;
-    background-image: linear-gradient(270deg, rgba(30, 30, 30, 0) 0%, rgba(110, 110, 110, 0.2) 50%, rgba(110, 110, 110, 0.4) 100%);
-    transform-origin: center right;
-    transform: scaleX(0);
-}
 
-.sub-item-wrap-active {
-    z-index: 1;
-}
-
-.sub-item-wrap-active::before {
-    transform-origin: center left;
-    transform: scaleX(1);
-    transition: transform 0.3s ease-in-out;
-}
 .menu-item-text {
     display: inline-block;
     overflow: hidden;

+ 73 - 23
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -31,11 +31,11 @@
                                         <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                         <span>{{item.name}}</span>
                                     </template>
-                                    <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll">
+                                    <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll">
                                     <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                         <Icon class="sub-menu-icon" :custom="menuItem.icon" size="16" />
                                     </Tooltip>
-                                    <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="16"/>
+                                    <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="16" />
                                     <span>
                                         {{menuItem.name}}
                                         <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
@@ -49,7 +49,13 @@
                                     <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                 </Tooltip>
                                 <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
-                                <span>{{item.name}}</span>
+                                <span>
+                                    {{item.name}}
+                                    <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
+                                        {{item.tag}}
+                                    </span>
+                                </span>
+
                                 </MenuItem>
                             </div>
                         </div>
@@ -64,7 +70,7 @@
                                     <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                     <span>{{item.name}}</span>
                                 </template>
-                                <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll && menuItem.isShow">
+                                <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll && menuItem.isShow">
                                 <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                     <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
                                 </Tooltip>
@@ -82,11 +88,15 @@
                                 <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                             </Tooltip>
                             <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
-                            <span>{{item.name}}</span>
+                            <span>
+                                {{item.name}}
+                                <span style="color: aqua;margin-left: 2px;font-size: 12px;margin-top:3px">
+                                    {{item.tag}}
+                                </span>
+                            </span>
                             </MenuItem>
                         </div>
                     </MenuGroup>
-
                 </vuescroll>
             </Menu>
             <p class="copyright-info" v-show="!isCollapsed">
@@ -461,7 +471,7 @@ export default {
                     icon: 'iconfont icon-task',
                     name: this.$t('system.menu.taskList'),
                     router: '/home/taskList',
-                    tag: '',
+                    tag: '预览',
                     role: 'teacher',
                     permission: '',
                     child: [],
@@ -488,7 +498,7 @@ export default {
             if (cloudSetting.menuStatus == 'close') {
                 this.isCollapsed = true
             }
-			this.isShowLogo = cloudSetting.logoStatus === 'open'
+            this.isShowLogo = cloudSetting.logoStatus === 'open'
         }
     },
     mounted() {
@@ -549,7 +559,30 @@ export default {
     font-size: 12px;
     line-height: 30px;
     height: 30px;
+    position: relative;
+    color: white;
+}
+.ivu-menu-item-group{
+    position: relative;
+}
+.biz-menu .ivu-menu-vertical .ivu-menu-item-group::after {
+    content: "";
+    width: 100%;
+    height: 1px;
+    background: #303030;
+    position: absolute;
+    right: 0px;
+    bottom: -10px;
+    box-shadow:0px 12px 8px -12px #000;
+}
+.biz-menu  .ivu-menu-item-group:nth-child(2)::after {
+    background: transparent;
 }
+.biz-menu  .ivu-menu-item-group:nth-child(2) {
+    margin-top: 30px;
+}
+
+
 .biz-menu .ivu-menu-item-group:first-child {
     margin-top: 0px;
 }
@@ -561,7 +594,8 @@ export default {
 }
 
 .biz-menu .ivu-menu-light {
-    background: var(--side-bg);
+    // background: var(--side-bg);
+    background: #1d1e23;
     color: var(--primary-textColor);
 }
 
@@ -572,7 +606,8 @@ export default {
 .biz-menu
     .ivu-menu-light.ivu-menu-vertical
     .ivu-menu-item-active:not(.ivu-menu-submenu) {
-    background: #101117;
+    background: #33343a;
+    color: white;
     z-index: 2;
 }
 
@@ -585,8 +620,8 @@ export default {
 .menu-item span {
     display: inline-block;
     white-space: nowrap;
-    font-size: 16px;
-    position: absolute;
+    font-size: 15px;
+    // position: absolute;
     width: ~"calc(100% - 50px)";
     max-width: 150px;
     vertical-align: top;
@@ -596,22 +631,25 @@ export default {
 }
 
 .menu-item i {
+    margin-right: 10px;
     transform: translateX(0px);
     transition: font-size 0.5s ease, transform 0.5s ease;
-    vertical-align: sub;
     font-size: 16px;
-    /*color: var(--primary-text-color);*/
 }
 
 .menu-item .ivu-menu .ivu-menu-item {
     color: #cccccc;
 }
 .menu-item .ivu-menu-item {
-    color: hsla(0,0%,100%,.7);
+    color: hsla(0, 0%, 100%, 0.7);
+    display: flex;
+    align-items: center;
 }
 
 .menu-item .ivu-menu-submenu-title {
-    color: hsla(0,0%,100%,.7);
+    color: hsla(0, 0%, 100%, 0.7);
+    display: flex;
+    align-items: center;
 }
 
 .collapsed-menu i {
@@ -623,10 +661,8 @@ export default {
 
 .biz-menu .ivu-icon-ios-arrow-down:before {
     position: absolute;
-    top: -5px;
-    font-size: 12px;
-    opacity: 0.8;
-    color: hsla(0,0%,100%,.7);
+    top: -6px;
+    font-size: 15px;
 }
 
 .collapsed-menu .ivu-icon-ios-arrow-down:before {
@@ -661,25 +697,39 @@ export default {
 
 .biz-menu .ivu-menu-vertical .ivu-menu-item,
 .biz-menu .ivu-menu-vertical .ivu-menu-submenu-title {
-    padding: 10px 24px;
+    padding: 13px 24px;
+}
+.biz-menu .ivu-menu-submenu .ivu-menu-item {
+    background: #101117;
+    display: flex;
+    align-items: center;
 }
 
 .biz-menu
     .ivu-menu-light.ivu-menu-vertical
     .ivu-menu-item-active:not(.ivu-menu-submenu) {
-    color: #1cc0f3;
+    color: #ffffff;
 }
 
 .biz-menu
     .ivu-menu-light.ivu-menu-vertical
     .ivu-menu-item-active:not(.ivu-menu-submenu):after {
+    // background: transparent;
     background: #1cc0f3;
+    width: 1px;
 }
 
 // .ivu-menu-submenu-title:hover .ivu-menu-submenu-title-icon::before,.ivu-menu-submenu-title:hover span, .ivu-menu-submenu-title:hover .ivu-icon{
 //     color: #fff;
 // }
-.ivu-menu-submenu-title:hover .ivu-menu-submenu-title-icon::before{
+.ivu-menu-submenu-title:hover .ivu-menu-submenu-title-icon::before {
     color: rgb(45, 183, 245);
 }
+.ivu-menu-item:hover,
+.ivu-menu-submenu-title:hover {
+    color: white !important;
+    .ivu-icon-ios-arrow-down:before {
+        color: white !important;
+    }
+}
 </style>

+ 136 - 31
TEAMModelOS/ClientApp/src/common/BaseNotification.vue

@@ -1,69 +1,174 @@
 <template>
 	<div class="base-notification">
 		<Poptip :title="$t('utils.newNotice')" class="dark-iview-poptip">
-			<Icon type="md-notifications" />
-			<!-- <div slot="content" class="notice-wrap">
-				<div class="notice-item">
-					<p class="item-name">青城山学校</p>
-					<p class="item-content">活动[2020下学期国文期末考]达成率已达100%</p>
-					<span class="item-time">2020-08-14 18:22</span>
+			<Badge :count="msgArr.length">
+				<Icon type="md-notifications" />
+			</Badge>
+			<div slot="content" class="notice-wrap">
+				<div v-if="!msgArr.length" class="notice-empty">
+					<Icon type="md-text" />
+					暂无通知
 				</div>
-				<div class="notice-item">
-					<p class="item-name">成都市高新区芳草小学</p>
-					<p class="item-content">已成功加入</p>
-					<span class="item-time">2020-08-14 18:22</span>
+				<div class="notice-item" v-for="(item,index) in msgArr" :key="index" @click="doClickMsg(item)">
+					<p class="item-name">{{ getMsgType(item) }}</p>
+					<p class="item-content">{{ getMsgContent(item) }}</p>
+					<!-- <span class="item-time">{{ item.expires }}</span> -->
 				</div>
-				<div class="notice-item">
-					<p class="item-name">成都市泡桐树小学</p>
-					<p class="item-content">活动[2020下学期国文期末考]达成率已达100%</p>
-					<span class="item-time">2020-08-14 18:22</span>
-				</div>
-			</div> -->
+			</div>
 		</Poptip>
 	</div>
 </template>
 
 <script>
+	export default {
+		props: {
+			msgs: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				msgArr: [],
+				msgTypes: {
+					'request_school': '申请通知',
+					'invite_school': '邀请通知',
+				}
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			getBodyJson(str) {
+				let reg = /\\/g;
+				//使用replace方法将全部匹配正则表达式的转义符替换为空
+				let replaceAfter = str.replace(reg, '').replace(/=/g, ':');
+				return replaceAfter
+			},
+			getMsgType(msg) {
+				return this.msgTypes[msg.label]
+			},
+			getMsgContent(msg) {
+				let body = JSON.parse(this.getBodyJson(msg.body))
+				console.log(body)
+				switch (msg.label) {
+					case 'request_school':
+						return `${body.tmdname}(${body.tmdid}) 申请加入 ${body.schoolname}`
+						break;
+					case 'invite_school':
+						return `${body.tmdname}(${body.tmdid}) 邀请您加入 ${body.schoolname}`
+						break;
+					case 'request-join_school':
+						return `${body.schoolname} 已同意您的加入请求`
+						break;
+					case 'invite-join_school':
+						return `${body.tmdname}(${body.tmdid}) 已接受您的加入 ${body.schoolname} 的邀请`
+						break;
+					case 'remove_school':
+						return `${body.schoolname} 已将您移除`
+						break;
+					default:
+						break;
+				}
+			},
+			doClickMsg(msg) {
+				switch (msg.label) {
+					case 'request_school':
+						this.$router.push('teachermgmt')
+						break;
+					case 'invite_school':
+						this.$router.push('settings')
+						break;
+					default:
+						break;
+				}
+			}
+		},
+		watch: {
+			msgs: {
+				handler(n, o) {
+					this.msgArr = n
+					console.log(this.msgArr)
+				}
+			}
+		}
+	}
 </script>
 
 <style lang="less">
-	.base-notification{
-		.ivu-icon{
+	.base-notification {
+		font-family: 'NotoSerif', '微软正黑体', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Sans-serif;
+
+		.ivu-icon {
 			font-size: 22px;
 			color: #d0d0d0;
 			cursor: pointer;
 		}
-		
-		.dark-iview-poptip .ivu-poptip-popper{
+
+		.dark-iview-poptip .ivu-poptip-popper {
 			padding: 0;
 			top: 40px !important;
+			z-index: 9999;
+		}
+
+		.ivu-badge-count {
+			width: 16px;
+			height: 16px;
+			display: inline-block;
+			border-radius: 50%;
+			color: white;
+			border: none;
+			font-size: 12px;
+			line-height: 16px;
+			text-align: center;
+			margin-left: 10px;
+			min-width: 16px;
+			box-shadow: none;
+			padding: 0;
 		}
 		
-		.notice-wrap{
+		.notice-empty{
 			display: flex;
 			flex-direction: column;
+			justify-content: center;
+			align-items: center;
+			margin: 20px 0;
+			color: #b3b3b3;
 			
-			.notice-item{
+			.ivu-icon{
+				font-size: 44px;
+				margin-bottom: 20px;
+				color: #6c6c6c;
+			}
+		}
+
+		.notice-wrap {
+			display: flex;
+			flex-direction: column;
+
+			.notice-item {
 				position: relative;
 				padding: 10px;
-				color:#d0d0d0;
+				color: #d0d0d0;
 				border-bottom: 1px solid #424242;
-				
-				&:last-child{
+				cursor: pointer;
+
+				&:last-child {
 					border: none;
 				}
-				
-				.item-name{
+
+				.item-name {
 					font-size: 16px;
 					font-weight: bold;
-					color:#fff;
+					color: #fff;
 					margin: 10px 0;
 				}
-				
-				.item-time{
+
+				.item-time {
 					margin-top: 5px;
 					font-size: 12px;
-					color:#777777;
+					color: #777777;
 					float: right;
 				}
 			}

+ 0 - 1
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -42,7 +42,6 @@
 			this.defaultLogo = require('@/assets/icon/default_school.png')
 			// 获取本地存储中的 用户信息
 			let user = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
-			console.log(user)
 			let schoolProfile = localStorage.school_profile ? JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")) :undefined;
 			this.user.schools = user.schools
 			let joinSchools = user.schools && user.schools.length ?  user.schools.filter(i => i.status === 'join') : null

+ 63 - 8
TEAMModelOS/ClientApp/src/common/UploadModal.vue

@@ -1,18 +1,22 @@
 <template>
-    <Modal v-model="uploadStatus" :ok-text="textLoading ? $t('updModal.uploading') : isComplete ? $t('updModal.complete'):$t('updModal.comfirmUpd')" :cancel-text="$t('updModal.cancelUpd')" :title="$t('teachContent.btnUpload')" class="upload-modal dark-iview-modal" width="800" :mask-closable="false" :closable="false" @on-ok="modalOk" @on-cancel="modalCancel" :loading="modalLoading">
+    <Modal v-model="uploadStatus" :ok-text="textLoading ? $t('updModal.uploading') : isComplete ? $t('updModal.complete'):$t('updModal.comfirmUpd')" :cancel-text="$t('updModal.cancelUpd')" :title="$t('teachContent.btnUpload')" class="upload-modal dark-iview-modal" width="900" :mask-closable="false" :closable="false" @on-ok="modalOk" @on-cancel="modalCancel" :loading="modalLoading">
         <div class="upload-file-box">
-            <!-- <p>上传到:{{pdInfo.filterPeriodName}}</p> -->
-            <ResBelong v-show="routerScope == 'school'" showLabel class="upd-to-pd" :pdId="pdId"></ResBelong>
+            <ResBelong @tag-change="getResTags" v-show="routerScope == 'school'" showLabel class="upd-to-pd" :pdId="pdId"></ResBelong>
             <Upload type="drag" action="" :show-upload-list="false" multiple :before-upload="customUpload" class="upload-wrap" :disabled="textLoading">
                 <Icon class="upload-icon" custom="iconfont icon-upload" v-show="!uploadedList.length" />
                 <p class="upload-text" :style="{marginTop: uploadedList.length ? '25px':'0px'}">
                     <Icon size="24" style="font-size: 22px;vertical-align: baseline;margin-right: 5px;" custom="iconfont icon-upload" v-show="uploadedList.length" />
                     {{$t('teachContent.uploadText')}}
                 </p>
-                <p class="upload-text" style="font-size:12px;">{{$t('updModal.tips1')}}</p>
-                <p class="upload-text" :style="{fontSize:'12px',marginBottom: uploadedList.length ? '25px':'50px'}">
+                <p class="upload-text" style="font-size:12px;">
+                    {{$t('updModal.tips1')}}
+                </p>
+                <p class="upload-text" style="font-size:12px;">
                     {{$t('updModal.tips3')}}
                 </p>
+                <p class="upload-text" :style="{fontSize:'12px',marginBottom: uploadedList.length ? '25px':'50px'}">
+                    {{$t('updModal.tips2')}}
+                </p>
             </Upload>
             <div class="upload-file-box">
                 <div class="upload-file-item" v-for="(item,index) in uploadedList" :key="index">
@@ -80,7 +84,12 @@ export default {
             textLoading: false,
             modalLoading: false,
             isComplete: false, //是否完成上传
-            loadingCount: 0
+            loadingCount: 0,
+            tags: {
+                period: '',
+                gradeId: [],
+                subjectId: []
+            }
         }
     },
     props: {
@@ -132,6 +141,13 @@ export default {
         }
     },
     methods: {
+        //资源标签:学段、学科、年级
+        getResTags(data) {
+            console.log(data)
+            this.tags.period = data.period
+            this.tags.subjectId = data.subjects
+            this.tags.gradeId = data.grades
+        },
         //删除文件
         deleteFile(index) {
             this.containerClient.deleteBlob(this.uploadedList[index].blob).then(
@@ -268,6 +284,40 @@ export default {
         modalOk() {
             //已完成上传操作,关闭对话框、emit
             if (this.isComplete) {
+                //保存Blob描述信息
+                //API设计可以优化,如果API参数为对象数据,这里可以避免for循环里面发起请求影响性能
+                if (this.routerScope == 'school') {
+                    this.uploadedList.forEach(item => {
+                        item.periodId = this.tags.period
+                        item.gradeId = this.tags.gradeId.map(item => item + '')
+                        item.subjectId = this.tags.subjectId
+                        let requestData = {
+                            periodId: this.tags.period,
+                            gradeId: this.tags.gradeId.map(item => item + ''),
+                            subjectId: this.tags.subjectId,
+                            scope: 'school',
+                            name: this.$store.state.userInfo.schoolCode,
+                            url: item.blob.substring(1, item.blob.length),
+                            opt: 'add'
+                        }
+                        this.$api.blob.upsertBlobInfo(requestData)
+                    })
+                }
+                //个人资源不用关联学段、学科、年级等信息
+                else {
+                    this.uploadedList.forEach(item => {
+                        let requestData = {
+                            periodId: [],
+                            gradeId: [],
+                            subjectId: [],
+                            scope: 'private',
+                            name: this.$store.state.userInfo.TEAMModelId,
+                            url: item.blob.substring(1, item.blob.length),
+                            opt: 'add'
+                        }
+                        this.$api.blob.upsertBlobInfo(requestData)
+                    })
+                }
                 this.$emit("successData", this.uploadedList)
                 this.uploadedList = []
             } else { //还未上传文件,则上传文件
@@ -362,7 +412,6 @@ export default {
                 this.textLoading = false
                 this.isComplete = true
                 this.modalLoading = false
-
             }
         },
         //处理图片缩略图
@@ -409,12 +458,18 @@ export default {
             }
         }
         // 使用组件接收的值
-        else{
+        else {
             this.routerScope = this.scope
         }
 
     },
     watch: {
+        pdId: {
+            handler(n, o) {
+                this.tags.period = this.pdId
+            },
+            immediate: true
+        },
         urlString: {
             handler(v, o) {
                 if (this.urlString && this.containerName && this.sasString) {

+ 41 - 30
TEAMModelOS/ClientApp/src/components/app-root.vue

@@ -1,43 +1,54 @@
 <template>
     <div id="app" class="container-fluid">
-        <router-view v-if="isRouterAlive"/>
+        <router-view v-if="isRouterAlive" />
     </div>
 </template>
 
 <script>
-    import NavMenu from './nav-menu'
+import NavMenu from './nav-menu'
 
-    export default {
-        components: {
-            'nav-menu': NavMenu,
-        },
-        provide () {    //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。                                             
-            return {
-                reload: this.reload                                              
-            }
-        },
-        methods: {
-            reload() {
-                this.isRouterAlive = false
-                this.$nextTick(function () {
-                    this.isRouterAlive = true
-                })
-            }
-        },
-        data() {
-            return {
-                isRouterAlive:true
-            }
-        },
-        created() {
+export default {
+    components: {
+        'nav-menu': NavMenu,
+    },
+    provide() {    //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。                                             
+        return {
+            reload: this.reload
+        }
+    },
+    methods: {
+        reload() {
+            this.isRouterAlive = false
+            this.$nextTick(function () {
+                this.isRouterAlive = true
+            })
+        }
+    },
+    data() {
+        return {
+            isRouterAlive: true
+        }
+    },
+    created() {
+    },
+    watch: {
+        '$i18n.locale': {
+            handler(n, o) {
+                document.title = this.$t('system.title')
+            },
+            immediate: true
         }
     }
+}
 </script>
 
 <style scoped>
-    #app, body, html {
-        width: 100%;
-        height: 100%;
-        font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI','Microsoft YaHei','微软雅黑', 'Microsoft JhengHei';
-    }
+#app,
+body,
+html {
+    width: 100%;
+    height: 100%;
+    font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI",
+        "Microsoft YaHei", "微软雅黑", "Microsoft JhengHei";
+}
 </style>

+ 1 - 3
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -202,7 +202,6 @@
 			};
 		},
 		created() {
-			console.log('接收到的',this.analysisJson)
 			this.pageSize = this.isAnalysis ? 999 : 5
 			this.pageChange(1)
 		},
@@ -365,7 +364,6 @@
 		},
 		mounted() {
 			this.selectList = this.selQue
-			console.log(this.optionRate)
 		},
 		computed: {
 			curScope() {
@@ -401,7 +399,7 @@
 			optionRate:{
 				handler(n,o){
 					if(n){
-						console.log(n)
+						// console.log(n)
 					}
 				},
 				immediate:true,

+ 1 - 1
TEAMModelOS/ClientApp/src/components/public/frontEndMain/Index.less

@@ -1,7 +1,7 @@
 .login{
     width: 100%;
     height: 100%;
-    background-image: url('../../../assets/image/lgoin_bg.jpg');
+    // background-image: url('../../../assets/login/1-1.jpg');
     background-repeat: no-repeat;
     background-attachment: fixed;
     background-position: center;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 149 - 109
TEAMModelOS/ClientApp/src/components/public/frontEndMain/Index.vue


+ 147 - 144
TEAMModelOS/ClientApp/src/components/syllabus/DragTree.vue

@@ -1,18 +1,21 @@
 <template>
 	<div class="syllabus-tree-main">
 		<vuescroll>
-			<el-tree :data="treeDatas" :props="defaultProps" class="tree" node-key="id"  default-expand-all highlight-current
-				@node-drop="handleDrop" @node-click="onNodeClick" :draggable="editable" :expand-on-click-node="false">
+			<el-tree :data="treeDatas" :props="defaultProps" :allow-drop="allowDrop" class="tree" node-key="id"
+				default-expand-all highlight-current @node-drop="handleDrop" @node-click="onNodeClick"
+				:draggable="editable" :expand-on-click-node="false" ref="tree">
 				<span class="custom-tree-node" slot-scope="{ node, data }">
 					<span class="tree-node-lable">
 						{{data.title}}
-						<Icon type="md-cube" title="有关联资源" v-if="data.rnodes && data.rnodes.length"/>
+						<!-- {{data.id}} -->
+						<Icon type="md-cube" :title="$t('syllabus.tree.hasResource')" v-if="data.rnodes && data.rnodes.length" />
 					</span>
 					<span class="custom-tree-tools" v-if="editable">
-						<Icon type="md-create" size="16" title="编辑" @click="onEditItem(node,data,$event)" />
-						<Icon type="md-add" size="16" title="添加" @click="onAddNode(data,$event)" />
-						<Icon type="md-remove" size="16" title="删除" @click="remove(node,data)" />
-						<Icon type="md-share" v-if="isFirstLevel(data.pid)" @click="doShare(data)"/>
+						<Icon type="md-create" size="16" :title="$t('syllabus.tree.edit')" @click="onEditItem(node,data,$event)" />
+						<Icon type="md-add" size="16" :title="$t('syllabus.tree.add')" @click="onAddNode(node,data,$event)" />
+						<Icon type="md-remove" size="16" :title="$t('syllabus.tree.remove')" @click="remove(node,data)" />
+						<Icon type="md-share" v-if="isFirstLevel(data)" :title="isSchool ? $t('syllabus.tree.coEdit') : $t('syllabus.tree.share')"
+							@click="doShare(data)" />
 					</span>
 				</span>
 			</el-tree>
@@ -20,14 +23,15 @@
 
 		<!-- 新增或者编辑弹窗 -->
 		<Modal v-model="isEditOrAdd" width="500" footer-hide class="tree-modal">
-			<div class="modal-header" slot="header">{{ isEditItem ? '编辑节点':'新增节点'}}</div>
+			<div class="modal-header" slot="header">{{ isEditItem ? $t('syllabus.tree.editTitle'):$t('syllabus.tree.addTitle')}}</div>
 			<div class="modal-content">
-				<p class="node-title">父节点</p>
+				<p class="node-title">{{ $t('syllabus.tree.parent') }}</p>
 				<Input v-model="nodeInfo.parent" style="width: 100%" disabled />
-				<p class="node-title">节点名称</p>
-				<Input v-model="nodeInfo.title" placeholder="请输入节点名称..." style="width: 100%" />
+				<p class="node-title">{{ $t('syllabus.tree.nodeName') }}</p>
+				<Input v-model="nodeInfo.title" :placeholder="$t('syllabus.tree.place1')" style="width: 100%" />
 			</div>
-			<Button @click="onSubmitNode" class="modal-btn" style="width: 88%;margin-left: 6%;margin-bottom: 20px;">确认</Button>
+			<Button @click="onSubmitNode" class="modal-btn"
+				style="width: 88%;margin-left: 6%;margin-bottom: 20px;">{{ $t('syllabus.tree.confirm') }}</Button>
 		</Modal>
 	</div>
 </template>
@@ -65,7 +69,8 @@
 				currentParentData: null,
 				currentResources: [],
 				currentItems: [],
-				curNode:null,
+				curNode: null,
+				curData:null,
 				nodeInfo: {
 					id: null,
 					title: '',
@@ -79,22 +84,50 @@
 					pid: '',
 					code: '',
 					status: 1,
-					parent: ''
-				}
+					parent: '',
+					rnodes:[]
+				},
+				isSchool: false,
+				flatArr:[]
 			}
 		},
+		created() {
+			this.isSchool = this.$route.name === 'syllabus'
+		},
 		methods: {
 			onNodeClick(data, node) {
-				console.log(data, node)
-				this.curNode = data
-				this.$emit('onNodeClick',data)
+				this.curNode = node
+				this.curData = data
+				this.$emit('onNodeClick', {
+					data:data,
+					node:node
+				})
+			},
+
+			doShare(data) {
+				this.$emit('doShare', data)
 			},
 			
-			doShare(data){
-				this.$emit('doShare',data)
+			/* 禁止一级节点往下级进行拖拽 */
+			allowDrop(draggingNode, dropNode, dropType) {
+				if (draggingNode.level === dropNode.level) {
+					if(draggingNode.level === 1){
+						return dropType === 'prev' || dropType === 'after'
+					}else{
+						return dropType === 'prev' || dropType === 'after' ||  dropType === 'inner'
+					}
+				} else {
+					// 如果是二三级拖到其他级别 则正常拖拽 但是不能拖到第一级
+					if(draggingNode.level !== 1 && dropNode.level !== 1){
+						return dropType === 'prev' || dropType === 'after' ||  dropType === 'inner'
+					}
+					
+				}
 			},
 			// 拖拽完成回调
 			handleDrop(draggingNode, dropNode, dropType) {
+				this.$emit('addModifyId',this.getChapterIdById(draggingNode.data.id))
+				this.$emit('addModifyId',this.getChapterIdById(dropNode.data.id))
 				switch (dropType) {
 					case 'before':
 						draggingNode.data.pid = dropNode.data.pid
@@ -109,35 +142,58 @@
 						break
 				}
 				this.$parent.hasModify = true
+
 			},
 
 			// 删除节点操作
 			remove(node, data) {
+				let isFirstLevel = this.isFirstLevel(data)
 				this.$Modal.confirm({
-					title: '删除节点',
-					content: '<p>确认删除该节点?</p>',
-					okText: '确认',
-					cancelText: '取消',
+					title: this.$t('syllabus.tree.removeTitle'),
+					content: this.$t('syllabus.tree.removeConfirm'),
 					onOk: () => {
 						const parent = node.parent
 						const children = parent.data.children || parent.data
 						const index = children.findIndex(d => d.id === data.id)
-						children.splice(index, 1)
-						this.$Message.success('删除成功')
-						this.$parent.hasModify = true
+						// 如果是删除的第一层的节点 则直接访问API进行删除 如果不是 则记录子节点的PID
+						if(isFirstLevel){
+							this.$api.syllabus.DeleteTree({
+								id:data.id,
+								code:this.volume.id,
+								scope:this.volume.scope
+							}).then(res => {
+								if (!res.error) {
+									if(res.code === 404){
+										this.$parent.modifyIdArr  = this.$parent.modifyIdArr.filter(i => i !== data.id)
+									}
+									children.splice(index, 1)
+									this.$Message.success(this.$t('syllabus.tree.removeSucTip'))
+								} else {
+									this.$Message.warning(res.error);
+								}
+							}).catch(err => {
+								this.$Message.error(err);
+							})
+						}else{
+							children.splice(index, 1)
+							this.$Message.success(this.$t('syllabus.tree.removeSucTip'))
+							this.$parent.hasModify = true
+							this.$emit('addModifyId',this.getChapterIdById(data.id))
+						}
 					}
 				})
 			},
 
 			// 点击添加展开弹窗
-			onAddNode(data, e) {
+			onAddNode(node,data, e) {
 				e.stopPropagation() // 防止点击事件穿透到父层
 				this.isEditItem = false
 				this.isEditOrAdd = true
-
 				this.currentParentData = data // 当前点击节点即为父节点
 				this.nodeInfo.parent = data.title
+				this.nodeInfo.id = data.id
 				this.nodeInfo.title = ''
+				this.curNode = node
 			},
 
 			// 编辑节点操作
@@ -145,73 +201,27 @@
 				e.stopPropagation() // 防止点击事件穿透到父层
 				this.isEditOrAdd = true
 				this.isEditItem = true
-
 				this.currentEditData = data
 				this.nodeInfo.parent = node.parent.data.title || this.volume.name
 				this.nodeInfo.title = node.data.title
+				this.nodeInfo.id = node.data.id
+				this.curNode = node
 			},
-
-
-			onRelatedContent(node, data, e) {
-				e.stopPropagation() // 防止点击事件穿透到父层
-				this.isRelatedContent = true
-				this.currentEditData = data
-			},
-
-			onShowContent(val, data) {
-				console.log(data)
-				this.contentIndex = val
-				this.currentItems = []
-				this.currentResources = []
-				// data.items.length && this.findQuestionById(data.items)
-				data.resources.length && this.findResourceById(data.resources)
-				this.isShowContent = true
-			},
-
-			/**
-			 * 通过id查询内容信息
-			 * */
-			findResourceById(ids) {
-
-				this.$api.learnActivity.FindSyllabusResourceById(ids).then(
-					res => {
-						if (!res.error) {
-							this.currentResources = res.result.data
-						} else {
-							this.$Message.error("API ERROR")
-						}
-					},
-					err => {
-						this.$Message.error("API ERROR")
-
-					}
-				)
-
-			},
-			/**
-			 * 通过id查询题目信息
-			 * */
-			findQuestionById(ids) {
-				this.$api.learnActivity.FindQuestionById(ids).then(
-					res => {
-						if (!res.error) {
-							this.currentItems = res.result.data
-						} else {
-							this.$Message.error("API ERROR")
-						}
-					},
-					err => {
-						this.$Message.error("API ERROR")
-
-					}
-				)
+			
+			/* 根据节点获取它所在的章节信息 */
+			getChapterByNode(node){
+				console.log(node)
+				if(node.level === 1){
+					return node
+				}else{
+					return this.getChapterByNode(node.parent)
+				}
 			},
 
-
 			// 提交编辑或者新增
 			onSubmitNode() {
 				if (!this.nodeInfo.title) {
-					this.$Message.warning('节点名称不能为空')
+					this.$Message.warning(this.$t('syllabus.tree.nodeNameTip'))
 					return
 				}
 				if (this.isEditItem) {
@@ -231,55 +241,54 @@
 					}
 					this.currentParentData.children.push(newChild)
 				}
-
 				this.isEditOrAdd = false
 				this.$parent.hasModify = true
-				this.$Message.success(this.isEditItem ? '编辑成功' : '添加成功')
-			},
-
-
-			/**
-			 * 选择关联题目
-			 * @param val 当前已选题目
-			 */
-			onSelectQuestion(val) {
-				this.questionList = val.questions
-			},
-
-			/**
-			 * 选择关联内容
-			 * @param val 当前已选内容
-			 */
-			onSelectFile(val) {
-				this.fileList = val.files
-				console.log(val)
+				this.$emit('addModifyId',this.getChapterIdById(this.curData.id))
+				this.$Message.success(this.isEditItem ? this.$t('syllabus.tree.editSucTip') : this.$t('syllabus.tree.addSucTip'))
 			},
-
-			/** 保存内容与题目关联 */
-			onSaveNode() {
-				this.isLoading = true
-				this.currentEditData.items = this.currentEditData.items ? [...new Set(this.currentEditData.items.concat(
-					this.questionList.map(item => item.id)))] : [...new Set(this.questionList.map(item => item.id))]
-				this.currentEditData.resources = this.currentEditData.resources ? [...new Set(this.currentEditData
-					.resources.concat(this.fileList.map(item => item.url)))] : [...new Set(this.fileList.map(item =>
-					item.url))]
-				this.$api.syllabus.SaveOrUpdateAsNodes([this.currentEditData]).then(res => {
-					if (!res.error && res) {
-						this.isRelatedContent = false
-						this.$emit('onTreeUpdate')
-						this.isLoading = false
-						this.$parent.hasModify = true
-					} else {
-						this.$Message.warning('获取数据失败')
-					}
+			
+			/* 获取整个树的章节与子节点归属 */
+			getAllChild(arr){
+				let result = []
+				arr.forEach(item => {
+					result.push({
+						chapterId:item.id,
+						children:this.flatChildren(item.children)
+					})
 				})
+				this.flatArr = result
 			},
+			
+			/* 递归拉平所有children */
+			flatChildren(children){
+				let result = []
+				const fn = (source)=>{
+				    source.forEach(i => {
+				    	result.push(i.id)
+				    	if(i.children.length){
+				    		fn(i.children)
+				    	}
+				    })
+				}
+				fn(children)
+				return result
+			},
+			
+			/* 根据某个节点ID换取它对应的章节ID */
+			getChapterIdById(id){
+				if(this.flatArr.map(i => i.chapterId).includes(id)){
+					return id
+				}else{
+					let targetChapter = this.flatArr.find(i => i.children.includes(id))
+					return targetChapter.chapterId
+				}
+			}
 
 		},
-		computed:{
-			isFirstLevel(){
-				return pid => {
-					return pid === this.volume.id
+		computed: {
+			isFirstLevel() {
+				return data => {
+					return data.pid === this.volume.id
 				}
 			},
 		},
@@ -288,21 +297,15 @@
 			treeData: {
 				handler: function(n, o) {
 					// 以下为拼接树形数据以及册别数据
-					// let defaultTree = []
-					// let volumeParent = {
-					//     title: this.volume.name,
-					//     id: this.volume.id,
-					//     code: this.volume.code,
-					//     pid: 'Root',
-					//     children: []
-					// }
-					// volumeParent.children = n
-					// defaultTree.push(volumeParent)
-					this.treeDatas = n
-					this.$nextTick().then(() =>{
+					this.treeDatas = n.map(i => {
+						i.trees[0].auth = i.auth
+						return i.trees[0]
+					})
+					this.getAllChild(this.treeDatas)
+					this.$nextTick().then(() => {
 						const firstNode = document.querySelector('.el-tree-node')
 						firstNode.click();
-					  })
+					})
 				},
 				immediate: true
 			},
@@ -358,7 +361,7 @@
 	}
 
 	.tree /deep/ .el-tree-node:before {
-		border-left: 1px dashed #343434;
+		border-left: 1px dashed #626262;
 		bottom: 0px;
 		height: 100%;
 		top: -20px;
@@ -366,7 +369,7 @@
 	}
 
 	.tree /deep/ .el-tree-node:after {
-		border-top: 1px dashed #343434;
+		border-top: 1px dashed #626262;
 		height: 20px;
 		top: 20px;
 		width: 12px;

+ 65 - 3
TEAMModelOS/ClientApp/src/components/syllabus/InviteTeacher.vue

@@ -18,7 +18,7 @@
 				</template>
 				<template slot-scope="{ row }" slot="action">
 					<div style="display: flex;align-items: center;">
-						<i-switch true-color="#13ce66"></i-switch>
+						<i-switch true-color="#13ce66" :value="hasAuth(row.id)" :before-change="handleBeforeChange"  @on-change="onSwitchChange(row,$event)"></i-switch>
 					</div>
 				</template>
 			</Table>
@@ -34,6 +34,7 @@
 					</div>
 					<p v-if="!curTeacher && hasSearchResult" class="search-none">暂未查询到相关结果</p>
 					<p v-if="hasSearchResult" class="re-search" @click="onReSearch">重新搜索</p>
+					<Button type="success" v-if="hasSearchResult"  @click="doShare">确认分享</Button>
 				</div>
 			</div>
 		</div>
@@ -112,7 +113,7 @@
 						if (res.code == 0) {
 							this.$Message.error('無法取得使用者資料')
 						} else {
-							this.teacherList = this.$store.state.user.schoolUserList.filter(i => i.status === 'join')
+							this.teacherList = this.$store.state.user.schoolUserList.filter(i => i.status === 'join' && i.id !== this.$store.state.userInfo.TEAMModelId)
 							this.originList = JSON.parse(JSON.stringify(this.teacherList))
 						}
 					},
@@ -151,11 +152,72 @@
 				this.searchIdVal = ''
 				this.curTeacher = null
 				this.hasSearchResult = false
+			},
+			/* 修改共编权限前回调 */
+			handleBeforeChange(){
+				return new Promise((resolve) => {
+					this.$Modal.confirm({
+						title: '修改确认',
+						content: '确认修改当前用户的共编状态?',
+						onOk: () => {
+							resolve();
+						}
+					});
+				});
+			},
+			/* 修改共编权限 */
+			onSwitchChange(val,e){
+				let curVolume = this.$parent.$parent.curVolume
+				this.$api.syllabus.ShareTree({
+					"school": curVolume.school,
+					"scope": curVolume.scope,
+					"tmdInfo": [
+						{
+							"tmdid": val.id,
+							"tmdname": val.name
+						}
+					],
+					"coedit": true,
+					"share": false,
+					"issuer": this.$store.state.userInfo.TEAMModelId,
+					"opt": e ? 'add' : 'del',
+					"syllabusId": this.nodeInfo.id,
+					"syllabusName": this.nodeInfo.title,
+					"volumeId": curVolume.id,
+					"volumeName": curVolume.name
+				}).then(res => {
+					if(res.code === 200){
+						this.$Message.success('操作成功!')
+					}
+				}).catch(err => {
+					this.$Message.error(err)
+				})
+			},
+			/* 分享课纲操作 */
+			doShare(){
+				console.log(this.curTeacher);
 			}
 		},
 		mounted() {
 			this.isSchool && this.getAllTeacher()
 		},
+		computed:{
+			hasAuth(){
+				return id => {
+					if(!this.nodeInfo.auth){
+						return false
+					}else{
+						let matchItem = this.nodeInfo.auth.filter(i => i.tmdid === id)
+						console.log(matchItem)
+						if(matchItem.length && matchItem[0].coedit){
+							return true
+						}else{
+							return false
+						}
+					}
+				}
+			}
+		},
 		watch: {
 			node: {
 				handler(n, o) {
@@ -211,7 +273,7 @@
 			}
 			
 			.id-search{
-				height: 400px;
+				min-height: 400px;
 				width: 100%;
 				display: flex;
 				flex-direction: column;

+ 6 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/home.js

@@ -30,5 +30,10 @@ export default{
     verifySchool:'加入学校',
     toSchool:'加入学校>>>',
     schoolSuccess:'您已加入学校!',
-    hasJoin:'已加入'
+    hasJoin:'已加入',
+    myCourse:'我的課表',
+    tmwCus:'明日課程',
+    course:'課程:',
+    className:'班級:',
+    tmwNoCus:'明天沒有課程安排'
 }

+ 93 - 47
TEAMModelOS/ClientApp/src/locale/lang/en-US/settings.js

@@ -1,52 +1,56 @@
 export default {
-    setting_title1: 'School Manage',
-	setting_title2: 'Normal Settings',
-    setting_title3: '开放平台',
-	schoolList:'已添加或申请学校',
-	langSetting:'网站语言设定',
-	langTips:'请选择网站要用来显示选单、互动页面以及通知信息的语言',
-	langCheck:'使用浏览器语系展示',
-	themeSetting:'网站色彩模式',
-	themeTips:'请选择网站显示的色彩模式,以便提供最佳的用户体验',
-	menuSetting:'菜单显示设置',
-	menuTips:'选择左侧Menu在网站载入时的预设显示模式',
-	menuOpen:'预设展开显示',
-	menuClose:'预设关闭显示',
-	logoSetting:'Logo显示设置',
-	logoTips:'选择是否隐藏左上角平台Logo',
-	logoOpen:'预设显示',
-	logoHide:'预设隐藏',
-	defaultSchool:'默认学校',
-	curSchool:'当前学校',
-	courseNum:'课程数',
-	activityNum:'活动数',
-	joinStatus:'提出加入请求',
-	requestStatus:'送出添加邀请',
-	goSchool:'前往学校',
-	agreeJoin:'同意加入',
-	cancelAdd:'拒绝加入',
-	undoJoin:'撤销申请',
-	requestJoin:'申请加入',
-	inputSearch:'输入要搜索的学校名称',
-	modalTip1:'注意',
-	modalTip2:'此举动将使您离开当前学校的 IES5 站台,并前往',
-	modalTip3:'当前页面未保存的资料将会丢失,是否同意此操作?',
-	columnName:'学校名称',
-	columnArea:'地区',
-	columnId:'校代码',
-	columnTool:'操作',
-	modalTip4:'温馨提示',
-	modalTip5:'确认加入',
-	modalTip6:'确认取消加入',
-	submitSucTips:'提交成功',
-	submitFailTips:'操作失败',
-	joinSucTips:'加入成功!',
-	status1:'已加入',
-	status2:'收到邀请',
-	status3:'申请中',
-	openList: '开放平台列表',
-	openInfo: '平台信息',
+	setting_title1: '学校管理',
+	setting_title2: '一般设置',
+	setting_title3: '开放平台',
+	schoolList: '已添加或申请学校',
+	langSetting: '网站语言设定',
+	langTips: '请选择网站要用来显示选单、互动页面以及通知信息的语言',
+	langCheck: '使用浏览器语系展示',
+	themeSetting: '网站色彩模式',
+	themeTips: '请选择网站显示的色彩模式,以便提供最佳的用户体验',
+	menuSetting: '菜单显示设置',
+	menuTips: '选择左侧Menu在网站载入时的预设显示模式',
+	menuOpen: '预设展开显示',
+	menuClose: '预设关闭显示',
+	logoSetting: 'Logo显示设置',
+	logoTips: '选择是否隐藏左上角平台Logo',
+	logoOpen: '预设显示',
+	logoHide: '预设隐藏',
+	defaultSchool: '默认学校',
+	curSchool: '当前学校',
+	courseNum: '课程数',
+	activityNum: '活动数',
+	joinStatus: '提出加入请求',
+	requestStatus: '送出添加邀请',
+	goSchool: '前往学校',
+	agreeJoin: '同意加入',
+	cancelAdd: '拒绝加入',
+	undoJoin: '撤销申请',
+	requestJoin: '申请加入',
+	inputSearch: '输入要搜索的学校名称',
+	modalTip1: '注意',
+	modalTip2: '此举动将使您离开当前学校的 IES5 站台,并前往',
+	modalTip3: '当前页面未保存的资料将会丢失,是否同意此操作?',
+	columnName: '学校名称',
+	columnArea: '地区',
+	columnId: '校代码',
+	columnTool: '操作',
+	modalTip4: '温馨提示',
+	modalTip5: '确认加入',
+	modalTip6: '确认取消加入',
+	submitSucTips: '提交成功',
+	submitFailTips: '操作失败',
+	joinSucTips: '加入成功!',
+	status1: '已加入',
+	status2: '收到邀请',
+	status3: '申请中',
+	searchTip: '请输入<span>学校名称</span>或者<span>学校代码</span>进行搜索',
+	searchNone: '* 如未搜索到您想要的学校,可点击下方申请建立您的学校',
+	applyBtn: '申请建立学校',
+	openList: '开放平台应用列表',
+	openInfo: '应用信息',
 	openName: '应用名称',
+	opName: "开放平台应用",
 	token: 'ApiToken',
 	des: '描述',
 	openStatus: '状态',
@@ -55,6 +59,48 @@ export default {
 	apiName: '接口名称',
 	apiAddress: '接口地址',
 	apiMethod: '请求方法',
+	apiParams: '参数示例',
 	openKeep: '保存平台',
+	edit: "编辑应用",
 	unedit: '取消编辑',
+	delModal1: "您确定删除",
+	delModal2: "吗?",
+	delModal3: "删除成功",
+	delModal4: "删除失败",
+	delModal5: "已取消删除",
+	keepModal1: "保存成功",
+	keepModal2: "保存失败",
+	refreshModal1: "刷新成功",
+	refreshModal2: "刷新失败",
+	refreshModal3: "刷新后,原有的金钥会失效,您确定要刷新吗?",
+	refreshModal4: "已取消刷新",
+	copyModal1: "复制成功",
+	copyModal2: "复制失败",
+	openModal1: "应用列表获取失败",
+	openModal2: "api列表获取失败",
+	applyForm: {
+		title: '申请建立AI智慧学校',
+		name: '学校/机构名称',
+		id: '学校/机构简码',
+		code: '学校/机构代码',
+		address: '学校/机构地址',
+		manager: '学校/机构负责人',
+		cellphone: '学校/机构联系电话',
+		content: '备注信息',
+		place1: '选择学校所在地区',
+		place2: '请输入学校详细地址',
+		place3: '请输入您的手机号,邮箱等联系方式',
+		place4: '可填写您的备注信息',
+		place5: '请输入管理员的称呼',
+		place6: '请选择学校所在地区',
+		submit: '提交申请',
+		submitSuc: '已成功提交申请!',
+		errTip1: '请选择正确的地区!',
+		errTip2: '请将信息填写完整!',
+		rule1: '学校名称不能为空',
+		rule2: '管理员信息不能为空',
+		rule3: '联系方式不能为空',
+		rule4: '学校地址不能为空',
+		applyTip: '* 提交申请后,将会于5个工作日内审核完毕,并通知申请人。'
+	}
 }

+ 4 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/stuAccount.js

@@ -37,6 +37,9 @@ export default {
   delOk:'删除成功',
   isBottom:'已经到底了',
   edit:'修改',
+  adminClass:'行政班管理',
+  teachClass:'教學班管理',
+  stuMgt:'學生管理',
 
   // AddStudent.vue
   accountInfo: '账号资讯',
@@ -90,6 +93,7 @@ export default {
   idWarning:'警告:Excel 內账号重复!',
   gradeWarning:'警告:年级错误',
   setNoErr:"错误:座位号已在校內重复",
+  downloadText:'(下載名單模板)',
 
   // Authorization.vue
   authTitle: '服务授权管理',

+ 3 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js

@@ -1,11 +1,13 @@
 export default {
+    preview:'P',
+    title:'TEAM Model Cloud',
     loading:'加载中',
     menu:{
         school:'学校',
         private:'个人',
         noSchool1:'学校暂未购买服务',
         noSchool2:'暂未加入学校',
-        copyright:'©2021 Powered by 醍摩豆',
+        copyright:'©2021 HABOOK Group',
         schoolMgt:'学校管理',
         schoolRes:'校本资源',
         baseSetting:'基础设置',

+ 3 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/teachContent.js

@@ -52,6 +52,8 @@ export default {
   delBatchTips2:'请先选择需要删除的文件!',
   specialChart:'不能包含特殊字符',
   noData:'暂无数据',
-  uploadTo:'上传至:',
+  applyPd:'适用学段:',
+  applySub:'适用学科:',
+   applyGrade:'适用年级:',
   public:'公共资源'
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/updModal.js

@@ -4,7 +4,7 @@
     comfirmUpd:'确认上传',
     cancelUpd:'取消上传',
     tips1:'* 上传相同名字的文件会自动覆盖',
-    tips2:'* 勾选',
+    tips2:'您可以为资源设置适用学段、学科和年级',
     tips3:'支持PPTX文档转换成HTEX教材',
     fileType1:'教材',
     fileType2:'图片',

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/classMgmt.js

@@ -70,9 +70,9 @@ export default {
     grade12: '十二年级',
     smartClass: '智慧教室',
     sokratesClass: '议课教室',
-    selfpace: '书面问答',
+    selfpace: '测验模式',
     blankPageAdd: '新增档案',
-    pptImport: '入.pptx',
+    pptImport: '入.pptx',
     powerclick: 'PowerClick',
     hteOpen: '开启.hte',
     Other: '白板',
@@ -80,7 +80,7 @@ export default {
     ActIrsMode: '互动模式',
     edit: '编辑模式',
     ActPowerClickMode: 'Power Click',
-    ActSelfPaceMode: '书面问答',
+    ActSelfPaceMode: '测验模式',
     ActDscMode: '远距模式',
     ActElimitedMode: '挑战赛模式',
 

+ 6 - 6
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/courseManage.js

@@ -17,7 +17,7 @@ export default {
         courseName: '课程名称',
         coursePeriod: '设置学段',
         courseGrade: '设置年级',
-        courseSubject: '设置科',
+        courseSubject: '设置科',
         courseNotice: '课程公告',
         teachers: '协同教师设置',
         teachers1: '任课教师设置',
@@ -33,17 +33,17 @@ export default {
         selectClassroomHolder: '请选择教室'
     },
     syllabus: {
-        schoolSyllabus: '校课纲',
+        schoolSyllabus: '校课纲',
         personalSyllabus: '个人课纲',
-        period: '学:',
+        period: '学:',
         subject: '学科:',
         grade: '年级:',
         text: '显示未选择的所有课纲',
         knowledge: '知识点:',
         content: '内容:',
         question: '题库:',
-        placeHolder1: '请选择学',
-        placeHolder2: '请选择科',
+        placeHolder1: '请选择学',
+        placeHolder2: '请选择科',
         placeHolder3: '请选择年级'
     },
     classroom: {
@@ -80,7 +80,7 @@ export default {
         searchHolder1: '关键字搜索',
         classroomTableC1: '教室编码',
         classroomTableC2: '教室名称',
-        classroomTableC3: '学',
+        classroomTableC3: '学',
         classroomTableC4: '年级',
         classroomTableC5: '学生人数',
         personalClassroomTitle: '创建个人教室',

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js

@@ -52,7 +52,7 @@ export default {
     //MyCourse.vue
     scCus:'标准课程',
     cusInfo:'课程信息',
-    noScCus:'暂无校课程',
+    noScCus:'暂无校课程',
     privCus:'个人课程',
     noPrivCus:'暂未创建课程',
     noCusClass:'暂未安排课程名单',
@@ -95,7 +95,7 @@ export default {
     sl:'自主学习',
     acTime:'活动时间',
     private:'个人',
-    school:'校',
+    school:'校',
     noRecord:'暂无课堂记录',
 
     //ManageClass.vue
@@ -234,7 +234,7 @@ export default {
     sat:'星期六',
     sun:'星期日',
     nameListType:'类型',
-    scClass:'校班级',
+    scClass:'校班级',
     customNameList:'自定义名单',
 
 }

+ 7 - 7
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -12,7 +12,7 @@ export default {
 	},
 	filter:{
 		origin:'来源',
-		schoolBank:'校题库',
+		schoolBank:'校题库',
 		privateBank:'个人题库',
 		all:'全部',
 		diff:'难度',
@@ -20,7 +20,7 @@ export default {
 		type:'题型',
 		period:'学段',
 		grade:'年级',
-		subject:'科',
+		subject:'科',
 		sort:'排序',
 		createTime:'新增时间',
 		useCount:'使用次数'
@@ -68,12 +68,12 @@ export default {
 	cancelSuc:'取消成功',
 	addSuc:'添加成功',
 	newExercise:{
-		newSchoolItem:'新建校题目',
+		newSchoolItem:'新建校题目',
 		newPrivateItem:'新建个人题目',
 		backToBank:'返回题库',
 		choosePeriod:'选择学段',
 		chooseGrade:'选择年级',
-		chooseSubject:'选择科',
+		chooseSubject:'选择科',
 		gradePlaceholder:'不选择则默认选中全部年级',
 		diff:'题目难度',
 		field:'关联认知层次', 
@@ -200,8 +200,8 @@ export default {
 	createPaper:{
 		setAutoConditions:'设置自动出题条件',
 		origin:'题目来源',
-		schoolRate:'校占比',
-		rateTip:'默认相同比例校优先',
+		schoolRate:'校占比',
+		rateTip:'默认相同比例校优先',
 		doAutoCreate:'开始组题',
 		random:'随机',
 		average:'平均分配',
@@ -221,7 +221,7 @@ export default {
 	points:{
 		addPoint:'新增知识点',
 		searchPoint:'搜索知识点',
-		noPoint:'当前科下暂无知识点',
+		noPoint:'当前科下暂无知识点',
 		checkedPoint:'已选知识点',
 		pointName:'知识点名称',
 		inputNewPoint:'输入新知识点名称',

+ 6 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/home.js

@@ -30,5 +30,10 @@ export default{
     verifySchool:'暂未加入学校',
     toSchool:'加入学校>>>',
     schoolSuccess:'您已加入学校!',
-    hasJoin:'已加入'
+    hasJoin:'已加入',
+    myCourse:'我的课表',
+    tmwCus:'明日课程',
+    course:'课程:',
+    className:'班级:',
+    tmwNoCus:'明天没有课程安排'
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js

@@ -32,6 +32,7 @@ import http from './http'
 import utils from './utils'
 import knowledge from './knowledge'
 import task from './task'
+import syllabus from './syllabus'
 export default {
   schoolBaseInfo,
   classMgmt,
@@ -67,6 +68,7 @@ export default {
   utils,
   knowledge,
   task,
+  syllabus,
   test: '测试',
   formConfigP: {
     input: '请输入',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/knowledge.js

@@ -1,5 +1,5 @@
 export default {
-    subject: '科',
+    subject: '科',
     label: '名称',
     blockP: '请输入知识块名称',
     confirm: '确认',

+ 9 - 9
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js

@@ -21,7 +21,7 @@ export default{
         autoTips2:'此功能仅用于展示情景快速模拟教师评分数据,且分数为随机生成,仅供参考!',
         autoScore:'一键评分',
         autoAnswer:'一键作答',
-        evSubject:'测试科:',
+        evSubject:'测试科:',
         returnTop:'返回顶部',
         mockOk:'模拟成功',
         mockErr:'模拟失败',
@@ -55,7 +55,7 @@ export default{
         evType:'评测类型',
         examType:'考试类别',
         courseType:'课程类别',
-        cusLabel1:'校课程',
+        cusLabel1:'校课程',
         cusLabel2:'个人课程',
         evTarget:'施测对象',
         publishType:'发布方式',
@@ -64,7 +64,7 @@ export default{
         endTime:'结束时间',
         eTimeHolder:'请选择结束时间',
         addSubject:'添加学科',
-        noSubject:'暂无科,请添加科',
+        noSubject:'暂无科,请添加科',
         noSubject1:'* 请先选择测试学段',
         papersLabel:'试卷库',
         perviewLabel:'试卷预览',
@@ -86,13 +86,13 @@ export default{
         formWarning:'请先完善评测基础信息!',
         paperWarning:'请挑选或导入试卷!',
         paperWarning1:'还没有试卷,请挑选或导入试卷!',
-        pdWarning:'请添加测试科!',
+        pdWarning:'请添加测试科!',
         publishOk:'评测发布成功!',
         togglePeriod:'切换学段',
         togglePdTip1:'您已添加',
-        togglePdTip2:'的测试科,如果现在切换学段会清空已选科,确定切换学段吗?',
+        togglePdTip2:'的测试科,如果现在切换学段会清空已选科,确定切换学段吗?',
         toggleOkText:'切换',
-        delPdTitle:'删除科',
+        delPdTitle:'删除科',
         delPdContent:'是否确认删除',
         delOk:'删除成功',
         pdTips:'请先选择测试学段!',
@@ -102,12 +102,12 @@ export default{
     manual:{
         source:'来源:',
         sourceP:'个人试卷库',
-        sourceS:'校试卷库',
+        sourceS:'校试卷库',
         pdLabel:'学段:',
         subjectLabel:'学科:',
         gradeLabel:'年级:',
         fitPd:'适用学段:',
-        fitSubject:'适用科:',
+        fitSubject:'适用科:',
         quCount:'题量:',
         useCount:'使用次数:',
         stdPaper:'已选试卷',
@@ -251,7 +251,7 @@ export default{
         unassigned:'未分配',
         teaProgress:'教师阅卷进度',
         schedule:'调度',
-        subject:'科',
+        subject:'科',
         stuNum:'考试人数',
         scanProg:'扫描进度',
         assignStatus:'阅卷分配',

+ 10 - 10
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/login.js

@@ -1,34 +1,34 @@
 export default {
     title: {
         ser: '数据中心位置',
-        IDLogin: '醍摩豆号登入',
+        IDLogin: '醍摩豆号登入',
         QRLogin: 'QRCode 扫玛登入',
-        schoolLogin: '校内号登入'
+        schoolLogin: '校内号登入'
     },
     subTitle: {
         IDLogin: '系统管理者、教师、学生与家长登入口',
         QRLogin: '使用HiTA或AClassONE扫描进行登入',
-        schoolLogin: '由学校统一分配给学生使用的号登入口'
+        schoolLogin: '由学校统一分配给学生使用的号登入口'
     },
     serAdress: {
-        China: '中国',
+        China: '大陸',
         Global: '全球'
     },
     tooltip: {
-        text1: '藉由完整的醍摩豆号体验教师的多校教学资源与课程串联,以及学生的在升学过程中产生的完整学习历程。 ',
-        text2: '使用学校提供的学生专属号与密码登入本校,体验本校提供的活动、缴交作业或参与考试等任务。 '
+        text1: '藉由完整的醍摩豆号体验教师的多校教学资源与课程串联,以及学生的在升学过程中产生的完整学习历程。 ',
+        text2: '使用学校提供的学生专属号与密码登入本校,体验本校提供的活动、缴交作业或参与考试等任务。 '
     },
     placeholder: {
         id : '醍摩豆ID / 手机号码 / E-Mail',
         psw: '密码',
         schoolMenu: '选择学校',
-        schoolID : '号',
+        schoolID : '号',
         schoolPsw: '密码'
     },
     link: {
         QRLogin: 'QRCode登入',
-        IDLogin: '号登入',
-        regist: '注册号',
+        IDLogin: '号登入',
+        regist: '注册号',
         forgetPsw: '忘记密码'
     },
     communy:{
@@ -38,7 +38,7 @@ export default {
         wechat: 'WeChat',
     },
     apiError:{
-        text1:'您的号或密码不正确'
+        text1:'您的号或密码不正确'
     },
     sse:{
         error:{

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/regist.js

@@ -1,5 +1,5 @@
 export default {
-    title: '建立号',
+    title: '建立号',
     form:{
         text1: '认证方式',
         text2: '手机',

+ 5 - 5
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -20,15 +20,15 @@ export default {
   acType2:'新增通用学科',
   sltSubect:'选择学科',
   subName:'学科名称',
-  applyPd:'应用学',
-  periodSettingLabel: '学',
+  applyPd:'应用学',
+  periodSettingLabel: '学',
   order: '依建立时间排序',
   semesterSetting: '学期(季)设置',
   gradeSetting: '年级设置',
   subjectSetting: '学科设置',
   semesterNum: '学期数:',
   gradeNum: '年级数:',
-  periodNum: '科数:',
+  periodNum: '科数:',
   startDate: '开始于',
   semesterDuration: '学期时长:',
   dayUnit: '天',
@@ -83,7 +83,7 @@ export default {
   delCampusTitle: '删除校区',
   delSmTitle: '删除学期',
   delContent: '后与之关联的数据将不能查询,确认删除吗?',
-  campusWarning: '对不起,学/学院数量已到系统授权最多数量!',
+  campusWarning: '对不起,学/学院数量已到系统授权最多数量!',
   authWarning: '您暂无此操作权限!',
   saveErr: '保存失败!',
   saveWarning: '保存提醒',
@@ -113,7 +113,7 @@ export default {
   setGrade: '设置教室年级',
   setHiteachCode: 'HiTeach软件序号',
   addClassroom: '新增教室',
-  schoolPlan: '校平面图与教室位置设置',
+  schoolPlan: '校平面图与教室位置设置',
   uploadPlan: '上传平面图',
   hiteachList: 'HiTeach序号列表',
   codeSearchHolder: '请输入关键字搜索',

+ 4 - 4
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolMgmt.js

@@ -1,10 +1,10 @@
 export default {
   pageButton1: '智慧教室管理仪表板',
   pageButton2: '智慧学校管理表板',
-  block1Title1: '号启用逐日变化 (每日启用)',
+  block1Title1: '号启用逐日变化 (每日启用)',
   block1Title2: '课程列表',
-  block1SubTitle1: '总教师号启用数',
-  block1SubTitle2: '总学生号启用数',
+  block1SubTitle1: '总教师号启用数',
+  block1SubTitle2: '总学生号启用数',
   block1SubTitle3: '今日启用数',
   block1SubTitle4: '学习历程',
   block1SubTitle5: '参与学生',
@@ -73,7 +73,7 @@ export default {
   text39: '题目数',
   text40: '教材数',
   text41: '分享课例数',
-  text42: '校课纲数',
+  text42: '校课纲数',
   text43: '各年级资源产出分佈',
   text44: '一年级',
   text45: '二年级',

+ 21 - 21
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/serviceDriveAuth.js

@@ -48,11 +48,11 @@ export default {
   '僅顯示HiTeach TBL序號': '仅显示HiTeach TBL序号',
   僅顯示已完成綁定的序號: '仅显示已完成绑定的序号',
   僅顯示已到期序號: '仅显示已到期序号',
-  已成功解除授權: '已成功解除授',
+  已成功解除授權: '已成功解除授',
 
   //SpaceStatus.vue
-  智慧教服務空間狀態: '智慧教学服务空间状态',
-  分配教空間: '分配教学空间',
+  智慧教服務空間狀態: '智慧教学服务空间状态',
+  分配教空間: '分配教学空间',
   空間總數: '空间总数',
   已使用空間總數: '已使用空间总数',
   空間使用狀況: '空间使用状况',
@@ -64,11 +64,11 @@ export default {
   '基本 1GB 永久授權': '基本 1GB 永久授权',
   '到期後將變更為IES基本空間,超出基本空間值將被收回': '到期后将变更为IES基本空间,超出基本空间值将被收回',
   購買記錄: '购买记录',
-  醍摩豆智慧教服務空間: '醍摩豆智慧教学服务空间',
+  醍摩豆智慧教服務空間: '醍摩豆智慧教学服务空间',
   訂單日期: '订单日期:',
   到期日: '到期日:',
   添購其他服務: '添购其他服务',
-  '空間已到期,超過僅供檢視': '空間已到期,超過僅供檢視',
+  '空間已到期,超過僅供檢視': '空间已到期,超过仅供检视',
 
   //SpaceChart.vue
   文件: '文件',
@@ -77,19 +77,19 @@ export default {
   圖片: '图片',
   題目與試卷: '题目与试卷',
   其他: '其他',
-  生使用: '学生使用',
+  生使用: '学生使用',
   已分配至教師: '已分配至教师',
   未使用: '未使用',
   空間: '空間',
   空間數: '空間數',
   空間比率: '空間比率',
 
-  //生帳號頁面的授權管理控件 student-account / AclassOneAuth.vue
-  確定收回所有授權: '確定收回所有授權',
+  //生帳號頁面的授權管理控件 student-account / AclassOneAuth.vue
+  確定收回所有授權: '确定收回所有授权',
   '收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。': '收回授权后使用数会直接设置为0,如欲给予授权可针对目标对象进行套用。',
   服務授權管理: '服务授权管理',
-  AClassONE智慧伴服務授權: 'AClassONE智慧学伴服务授权',
-  '賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限': '赋予持有该服务授权的学生TEAM Modal ID使用AClassONE智慧学伴App的权限',
+  AClassONE智慧伴服務授權: 'AClassONE智慧学伴服务授权',
+  '賦予持有該服務授權的学生TEAM Modal ID使用AClassONE智慧学伴App的權限': '赋予持有该服务授权的学生TEAM Modal ID使用AClassONE智慧学伴App的权限',
   總授權數: '总授权数',
   本次套用數: '本次套用数',
   已使用數: '已使用数',
@@ -125,14 +125,14 @@ export default {
   個固定分配: '个固定分配',
   '保存失敗,超過可用授權數!': '保存失败,超过可用授权数! ',
   全部收回成功: '全部收回成功',
-  請先勾選欲授權之生: '请先勾选欲授权之学生',
+  請先勾選欲授權之生: '请先勾选欲授权之学生',
   '請設定有效的目標項 !': '请设定有效的目标项 !',
-  '目前所選學制人數為 0 人!': '目前所选学制人数为 0 人!',
-  '請先選學制!': '请先选学制!',
-  '目前所選級人數為 0 人!': '目前所选学级人数为 0 人!',
-  '請先選級!': '请先选学级!',
+  '目前所選学制人數為 0 人!': '目前所选学段人数为 0 人!',
+  '請先選学制!': '请先选学段!',
+  '目前所選級人數為 0 人!': '目前所选学级人数为 0 人!',
+  '請先選級!': '请先选学级!',
   '目前所選班級人數為 0 人!': '目前所选班级人数为 0 人!',
-  '請先選班級!': '请先选学级!',
+  '請先選班級!': '请先选班級!',
   '全校人數超過所購買授權數,無法使用': '全校人数超过所购买授权数,无法使用',
   全部收回成功: '全部收回成功',
 
@@ -150,14 +150,14 @@ export default {
   目前可被分配總量:'目前可被分配总量',
   至:'至',
   每人分配:'每人分配',
-  當前勾選之教師帳號:'当前勾选之教师号',
+  當前勾選之教師帳號:'当前勾选之教师号',
   所有:'所有',
   進階權限:'进阶权限',
   一般權限:'一般权限',
-  之教師帳號:'之教师号',
+  之教師帳號:'之教师号',
   職稱為:'职称为',
-  的教師帳號:'的教师号',
-  所有教師帳號:'所有教师号',
+  的教師帳號:'的教师号',
+  所有教師帳號:'所有教师号',
 
   //下方method區塊
   '請手動輸入數字!': '请手动输入数字!',
@@ -175,7 +175,7 @@ export default {
   '先輸入有效數字,並進行勾選,再套用': '先输入有效数字,并进行勾选,再套用',
 
   //store/spaceAuth.js
-  校已使用空間:'学校已使用空间',
+  校已使用空間:'学校已使用空间',
   已分配給教師空間:'已分配给教师空间',
   剩餘空間:'剩余空间'
 }

+ 28 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/settings.js

@@ -44,6 +44,9 @@ export default {
 	status1:'已加入',
 	status2:'收到邀请',
 	status3:'申请中',
+	searchTip:'请输入<span>学校名称</span>或者<span>学校代码</span>进行搜索',
+	searchNone:'* 如未搜索到您想要的学校,可点击下方申请建立您的学校',
+	applyBtn:'申请建立学校',
 	openList: '开放平台应用列表',
 	openInfo: '应用信息',
 	openName: '应用名称',
@@ -75,4 +78,29 @@ export default {
 	copyModal2: "复制失败",
 	openModal1: "应用列表获取失败",
 	openModal2: "api列表获取失败",
+	applyForm:{
+		title:'申请建立AI智慧学校',
+		name:'学校/机构名称',
+		id:'学校/机构简码',
+		code:'学校/机构代码',
+		address:'学校/机构地址',
+		manager:'学校/机构负责人',
+		cellphone:'学校/机构联系电话',
+		content:'备注信息',
+		place1:'选择学校所在地区',
+		place2:'请输入学校详细地址',
+		place3:'请输入您的手机号,邮箱等联系方式',
+		place4:'可填写您的备注信息',
+		place5:'请输入管理员的称呼',
+		place6:'请选择学校所在地区',
+		submit:'提交申请',
+		submitSuc:'已成功提交申请!',
+		errTip1:'请选择正确的地区!',
+		errTip2:'请将信息填写完整!',
+		rule1:'学校名称不能为空',
+		rule2:'管理员信息不能为空',
+		rule3:'联系方式不能为空',
+		rule4:'学校地址不能为空',
+		applyTip:'* 提交申请后,将会于5个工作日内审核完毕,并通知申请人。'
+	}
 }

+ 10 - 6
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/stuAccount.js

@@ -13,12 +13,12 @@ export default {
 
   // Index.vue
   menuAuth: '授权管理',
-  importStu: '入名单',
+  importStu: '入名单',
   addStu: '新增学生',
   editInfo: '编辑资讯',
   delStu: '删除学生',
   searchHolder: '输入关键字或账号资讯搜索',
-  periodHolder: '选择学',
+  periodHolder: '选择学',
   gradeHolder: '选择年级',
   classroomHolder: '选择班级',
   tips1: '请选择需要修改的学生!',
@@ -37,6 +37,9 @@ export default {
   delOk:'删除成功',
   isBottom:'已经到底了',
   edit:'修改',
+  adminClass:'行政班管理',
+  teachClass:'教学班管理',
+  stuMgt:'学生管理',
 
   // AddStudent.vue
   accountInfo: '账号资讯',
@@ -51,7 +54,7 @@ export default {
   classroomInfo: '教室信息',
   classroomInfoHolder: '请选择教室',
   newClassroom: '建立新教室',
-  periodInfo: '学',
+  periodInfo: '学',
   gradeInfo: '年级',
   submitAccount: '建立账号',
   submitActive: '保存',
@@ -62,7 +65,7 @@ export default {
 
   // ImportStudent.vue
   importTitle: '导入学生名单',
-  importTips1: '拖拽欲入的学生账号和表格档案至此',
+  importTips1: '拖拽欲入的学生账号和表格档案至此',
   importTips2: '或',
   importTips3: '点击文件图示打开文件浏览上传',
   importTips4: '打开的文件已删除!',
@@ -79,7 +82,7 @@ export default {
   importInfo3: '座号重复:',
   importInfo4: '没有对应教室:',
   importInfo5: '系统已存在账号:',
-  importInfo6: '可入:',
+  importInfo6: '可入:',
   passwordTips: '*未找到密码的项目将默认密码与账号相同',
   submitList: '建立账号',
   lackAttr:'Excel栏位有缺:',
@@ -90,6 +93,7 @@ export default {
   idWarning:'警告:Excel 內账号重复!',
   gradeWarning:'警告:年级错误',
   setNoErr:"错误:座位号已在校內重复",
+  downloadText:'(下载名单模板)',
 
   // Authorization.vue
   authTitle: '服务授权管理',
@@ -98,7 +102,7 @@ export default {
   authCount: '学校总授权数',
   alreadyUse: '今日已取用授权数',
   mayUse: '可使用授权数',
-  authNum: '各学授权使用状态',
+  authNum: '各学授权使用状态',
 
   //StudentList.vue
   filterLabel:'筛选条件:',

+ 9 - 9
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -44,13 +44,13 @@ export default {
         makeupExam: '可补考',
         makeupHw: '可补交',
         selectActivity: '请从列表挑选一个活动',
-        allSubject: '综合科'
+        allSubject: '综合科'
     },
     'settingView-title': '个人设定',
     'teammodel-account-management': {
-        'page-title': 'TeamModel 号管理',
+        'page-title': 'TeamModel 号管理',
         name: '姓名',
-        account: '号',
+        account: '号',
         password: '密码',
         phone: '手机号码',
         'e-mail': 'E-mail',
@@ -67,7 +67,7 @@ export default {
     'change-school': {
         'page-title': '切换学校',
         'current-data-school': '目前资料来源学校',
-        'Habook-smart-school': 'Habook智慧校'
+        'Habook-smart-school': 'Habook智慧校'
     },
     'homeView-title': '首页资讯总览',
     calenderCardTitle: '行事历',
@@ -171,7 +171,7 @@ export default {
     makeupHW: '可补交',
     empty: '目前无资料 ~',
     baseInfo: {
-        subject: '科:',
+        subject: '科:',
         teacher: '教师:',
         period: '活动期限:',
         postTime: '发布时间:',
@@ -259,7 +259,7 @@ export default {
     exam: {
         examLink: '试卷链接',
         isSubject: '科试卷',
-        subjectNow: '当前科',
+        subjectNow: '当前科',
         examData: '评测内容',
         gradeReport: '成绩报告',
         gradeAnalyse: '成绩分析',
@@ -390,7 +390,7 @@ export default {
             comIndex: '综合难度',
             objItem: '客观',
             subItem: '主观',
-            subjects: '科',
+            subjects: '科',
             item: '题目',
             objItems: '客观题',
             subItems: '主观题',
@@ -453,7 +453,7 @@ export default {
     },
     'calendar-title': '行事历 - 109学年度第二学期',
     today: '今天',
-    importEvent: '校班级要事',
+    importEvent: '校班级要事',
     deadlineTasks: '截止活动任务',
     schedule: '表定课表',
     des: '描述',
@@ -461,7 +461,7 @@ export default {
     place: '地点',
     course: '课程',
     mockcourses: ['阅读与写作', '英文简报', '电子电路专题实验', '计算机概论', '微处理机实验'],
-    importEventTitle: '校班级要事',
+    importEventTitle: '校班级要事',
     Thatday: '当日',
     deadlineTasksTitle: '当日截止未完成活动任务'
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/survey.js

@@ -31,7 +31,7 @@ export default {
 		namePlace:'请输入问卷名称',
 		target:'问卷对象',
 		privateClass:'个人班级',
-		schoolClass:'校班级',
+		schoolClass:'校班级',
 		targetPlace:'请选择问卷发布对象',
 		noFoundText:'暂未创建班级',
 		time:'起止时间',

+ 61 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/syllabus.js

@@ -0,0 +1,61 @@
+export default{
+	praviteSyllabus:'个人课纲',
+	btnSave:'存储变更',
+	volumeList:'册别清单',
+	place1:'输入册别名称...',
+	syllabusMenu:'课纲目录',
+	relate:'关联资源',
+	addResource:'添加资源',
+	type1:'内容资源',
+	type2:'试题资源',
+	type3:'试卷资源',
+	type4:'本地文件',
+	type5:'超链接',
+	preview:'查看',
+	remove:'删除',
+	upload:'上传本地文件',
+	editVolume:'编辑册别',
+	addVolume:'新增册别',
+	grade:'年级',
+	semester:'学期',
+	name:'名称',
+	place2:'非必填,默认由年级+科目+学期组成...',
+	place3:'填写册别名称',
+	confirm:'确认',
+	addLink:'添加超链接',
+	linkName:'超链接标题',
+	linkUrl:'超链接地址',
+	chooseCoTeacher:'选择共编教师',
+	chooseShareTeacher:'选择分享教师',
+	score:'配分',
+	count:'题数',
+	deleteVolume:'删除册别',
+	deleteConfirm:'确认删除该册别?',
+	deleteSuc:'删除成功',
+	deleteFail:'删除失败',
+	uploadSuc:'上传成功',
+	removeConfirm:'确定要移除该资源吗?',
+	doSuc:'操作成功',
+	isExistVolume:'已存在相同册别',
+    tree:{
+		hasResource:'有关联资源',
+		edit:'编辑',
+		add:'添加',
+		remove:'删除',
+		coEdit:'共编该章节',
+		share:'分享该章节',
+		editTitle:'编辑节点',
+		addTitle:'新增节点',
+		parent:'父节点',
+		nodeName:'节点名称',
+		place1:'请输入节点名称...',
+		confirm:'确认',
+		removeTitle:'删除节点',
+		removeConfirm:'确认删除该节点?',
+		cancel:'取消',
+		removeSucTip:'删除成功',
+		nodeNameTip:'节点名称不能为空',
+		editSucTip:'编辑成功',
+		addSucTip:'添加成功',
+	}
+}

+ 9 - 7
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js

@@ -1,13 +1,15 @@
 export default {
+    preview:'预览',
+    title:'醍摩豆云平台',
     loading:'加载中',
     menu:{
         school:'学校',
         private:'个人',
         noSchool1:'学校暂未购买服务',
         noSchool2:'暂未加入学校',
-        copyright:'©2021 Powered by 醍摩豆',
+        copyright:'©2021 HABOOK Group',
         schoolMgt:'学校管理',
-        schoolRes:'校资源',
+        schoolRes:'校资源',
         baseSetting:'基础设置',
         teacherMgt:'教师管理',
         stuMgt:'学生管理',
@@ -16,14 +18,14 @@ export default {
         cusPlanMgt:'排课管理',
         authMgt:'授权管理',
         preview:'预览',
-        scSyllabus:'校课纲',
-        scContent:'校内容',
-        scQuBack:'校题库',
+        scSyllabus:'校课纲',
+        scContent:'校内容',
+        scQuBack:'校题库',
         kdBack:'知识点库',
         staAna:'统计分析',
         evAna:'学情分析',
-        scAna:'校分析',
-        scAc:'校活动',
+        scAna:'校分析',
+        scAc:'校活动',
         scEv:'评量测验',
         scVote:'投票活动',
         scQu:'问卷调查',

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/talMgmt.js

@@ -9,7 +9,7 @@ export default {
     text8: '近30日',
     text9: '本学期',
     text10: '年级',
-    text11: '科',
+    text11: '科',
     text12: '一年级',
     text13: '二年级',
     text14: '三年级',
@@ -22,7 +22,7 @@ export default {
     text21: '艺术',
     text22: '其他',
     text23: '科技互动指数关系图(年级)',
-    text24: '科技互动指数关系图(科)',
+    text24: '科技互动指数关系图(科)',
     text25: '音乐',
     text26: '软件测试',
     text27: '语文',
@@ -55,7 +55,7 @@ export default {
     text55: '科学',
     text56: '综合',
     text57: '教法应用指数关系图(年级)',
-    text58: '教法应用指数关系图(科)',
+    text58: '教法应用指数关系图(科)',
     text59: '互动 = 技术互动指数',
     text60: '教法 = 教学应用指数',
     text61: '裡,',

+ 3 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachContent.js

@@ -52,6 +52,8 @@ export default {
   delBatchTips2:'请先选择需要删除的文件!',
   specialChart:'不能包含特殊字符',
   noData:'暂无数据',
-  uploadTo:'上传至:',
+  applyPd:'适用学段:',
+  applySub:'适用学科:',
+  applyGrade:'适用年级:',
   public:'公共资源'
 }

+ 34 - 34
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachermgmt.js

@@ -1,9 +1,9 @@
 export default {
     page:{
-        text1: '教师号管理',
-        text2: '添加教师号'
+        text1: '教师号管理',
+        text2: '添加教师号'
     },
-    blurryFilter: '通过关键字或号资讯搜索',
+    blurryFilter: '通过关键字或号资讯搜索',
     mulitSet: '批量权限管理',
     table: {
         text1: '基本',
@@ -15,11 +15,11 @@ export default {
     },
     authSet:{
         title:'权限设定',
-        subTitle: '欲进行授权变更的号',
+        subTitle: '欲进行授权变更的号',
         area1:{
-            title:'区、班、校管理页面',
-            read: '允许检视区、班、校管理页面',
-            auth1: '允许编辑学制内容,包括年级、学期科目资讯'
+            title:'区、校、班管理页面',
+            read: '允许检视区、校、班理页面',
+            auth1: '允许编辑学段内容,包括年级、学期学科资讯'
         },
         reset: '回復预设',
         save: '保存变更',
@@ -63,13 +63,13 @@ export default {
     },
     authority:{
         'classroom':'班级教室管理',
-        'system':'校基础数据管理',
+        'system':'校基础数据管理',
         'studentAccount':'学生账号管理',
         'teachermgmt':'教师账号管理',
         'classroom-read':'检视班级教室资料',
         'classroom-upd':'变更班级教室设定',
-        'schoolSetting-read':'检视校基础设定',
-        'schoolSetting-upd':'变更校基础设定',
+        'schoolSetting-read':'检视校基础设定',
+        'schoolSetting-upd':'变更校基础设定',
         'student-read':'检视学生账号',
         'student-upd':'变更学生账号',
         'teacher-checkTeacher':'检查老师可否看',
@@ -84,30 +84,30 @@ export default {
         'serviceDriveAuth': '授权管理',
         'auth-read': '查看授权管理信息',
         'auth-upd': '修改授权管理信息',
-        'syllabus': '校课纲管理',
-        'syllabus-read': '查看校课纲信息',
-        'syllabus-upd': '修改校课纲信息',
-        'schoolContent': '校内容管理',
-        'content-read': '查看校内容信息',
-        'content-upd': '修改校内容信息',
-        'schoolBank': '校题库管理',
-        'exercise-read': '查看校题库信息',
-        'exercise-upd': '修改校题库信息',
+        'syllabus': '校课纲管理',
+        'syllabus-read': '查看校课纲信息',
+        'syllabus-upd': '修改校课纲信息',
+        'schoolContent': '校内容管理',
+        'content-read': '查看校内容信息',
+        'content-upd': '修改校内容信息',
+        'schoolBank': '校题库管理',
+        'exercise-read': '查看校题库信息',
+        'exercise-upd': '修改校题库信息',
         'knowledge': '知识点库管理',
         'knowledge-read': '查看知识点库信息',
         'knowledge-upd': '修改知识点库信息',
         'totalIndex': '学情分析',
-        'analysis-read': '查看校学情分析',
-        'scboard': '校园分析',
-        'scboard-read': '查看校园分析',
-        'schoolAc': '校活动',
-        'schoolAc-read': '查看校活动',
-        'schoolAc-upd':'发布校活动',
+        'analysis-read': '查看校学情分析',
+        'scboard': '统计分析',
+        'scboard-read': '查看统计分析',
+        'schoolAc': '校活动',
+        'schoolAc-read': '查看校活动',
+        'schoolAc-upd':'发布校活动',
         'schoolEvaluation':'模拟评测数据',
         'mock-eva':'一键模拟评测作答和评分数据'
     },
     modal:{
-        text1: '此帐号权限已变更,是否要给此帐号更加合适的职称',
+        text1: '此账号权限已变更,是否要给此账号更加合适的职称',
         text2: '保存'
     },
     users:{
@@ -126,24 +126,24 @@ export default {
         title: '添加教师',
         btn: {
             download: '下载范本',
-            upload: '入名单',
+            upload: '入名单',
             search: '搜寻教师',
             sendInvite:'发送邀请',
             backHome: '重新检索'
         },
-        content: '<span>请输入<span class="point">教师号</span>、<span class="point">电话</span>或<span class="point">电子信箱</span >等资讯进行搜寻</span>',
+        content: '<span>请输入<span class="point">教师号</span>、<span class="point">电话</span>或<span class="point">电子信箱</span >等资讯进行搜寻</span>',
         skyBox:{
             text1: '本次搜寻结果',
             text2: '档案资料数',
-            text3: '成功汇入帐号数',
-            text4: '重复号资料数',
-            text5: '汇入失败帐号数',
+            text3: '成功导入账号数',
+            text4: '重复号资料数',
+            text5: '导入失败账号数',
             unit: '笔',
-            error1: '检索到相同号',
-            error2: '重复邀请或找不到号'
+            error1: '检索到相同号',
+            error2: '重复邀请或找不到号'
         },
         impUsersBox:{
-            removeUser: '取消入'
+            removeUser: '取消入'
         },
         groundBox:{
             inviteAll: '全部发送邀请'

+ 5 - 4
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -3,13 +3,14 @@ export default {
 		title:'学情分析仪表盘',
 		tab1:'统计数据',
 		tab2:'评测数据',
+        noData: '暂时找不到数据!'
 	},
 	rateLineTitle:'选项选答率分析',
 	trueAnswerRate:'正答率',
 	PHAnswerRate:'高分组正答率',
 	PLAnswerRate:'低分组正答率',
 	R1R6LineTitle:'R1-R6作答曲线',
-	noKnowPointTip:'该科下未收集到知识点数据',
+	noKnowPointTip:'该科下未收集到知识点数据',
 	lostStu:'缺考人数',
 	showAnalysis:'数据分析',
 	allSubjects:'全科',
@@ -38,7 +39,7 @@ export default {
 	condition8: '发布年份',
     // totalIndex.vue
     ti_title1: '基本数据统计',
-    ti_title2: '评测数据统计',
+    ti_title2: '学情分析',
     ti_title3: '学科对比统计',
     ti_title4: '年级优生率统计',
     ti_title5: '评测列表数据',
@@ -90,7 +91,7 @@ export default {
     module4: '知识点掌握',
     module5: '认知层次掌握',
     exportTable: '导出表格',
-    currentSubject: '当前科',
+    currentSubject: '当前科',
 	goExamList:'查看更多评测',
 
     // AchievementAnalysis.vue
@@ -281,7 +282,7 @@ export default {
 		RLRate:'低分组选答率',
 		tip:'* 绿色代表进线,蓝色代表踩线'
 	},
-	paperSubject:'试卷科',
+	paperSubject:'试卷科',
 	paperItemsCount:'试卷题数',
 	backUp:'返回上级'
 

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/updModal.js

@@ -4,7 +4,7 @@
     comfirmUpd:'确认上传',
     cancelUpd:'取消上传',
     tips1:'* 上传相同名字的文件会自动覆盖',
-    tips2:'* 勾选',
+    tips2:'您可以为资源设置适用学段、学科和年级',
     tips3:'支持PPTX文档转换成HTEX教材',
     fileType1:'教材',
     fileType2:'图片',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/vote.js

@@ -25,7 +25,7 @@ export default {
 		namePlace:'请输入投票名称',
 		target:'投票对象',
 		privateClass:'个人班级',
-		schoolClass:'校班级',
+		schoolClass:'校班级',
 		targetPlace:'请选择投票发布对象',
 		noFoundText:'暂未创建班级',
 		time:'起止时间',

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/classMgmt.js

@@ -70,7 +70,7 @@ export default {
     grade12: '十二年級',
     smartClass: '智慧教室',
     sokratesClass: '議課教室',
-    selfpace: '書面問答',
+    selfpace: '測驗模式',
     blankPageAdd: '新增檔案',
     pptImport: '匯入.pptx',
     powerclick: 'PowerClick',
@@ -78,7 +78,7 @@ export default {
     ActIrsMode: '互動模式',
     edit: '編輯模式',
     ActPowerClickMode: 'Power Click',
-    ActSelfPaceMode: '書面問答',
+    ActSelfPaceMode: '測驗模式',
     ActDscMode: '遠距模式',
     ActElimitedMode: '挑戰賽模式',
     Other: '白板',

+ 4 - 4
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/courseManage.js

@@ -15,9 +15,9 @@ export default {
     base: {
         baseTag: '基礎設定',
         courseName: '課程名稱',
-        coursePeriod: '設定學',
+        coursePeriod: '設定學',
         courseGrade: '設定年級',
-        courseSubject: '設定科',
+        courseSubject: '設定科',
         courseNotice: '課程公告',
         teachers: '協同教師設定',
         teachers1: '任課教師設定',
@@ -43,7 +43,7 @@ export default {
         content: '內容:',
         question: '題庫:',
         placeHolder1: '請選擇學制',
-        placeHolder2: '請選擇科',
+        placeHolder2: '請選擇科',
         placeHolder3: '請選擇年級'
     },
     classroom: {
@@ -81,7 +81,7 @@ export default {
         classroomTableC3: '學制',
         classroomTableC4: '年級',
         classroomTableC5: '學生人數',
-        personalClassroomTitle: '建個人教室',
+        personalClassroomTitle: '建個人教室',
         invitationCode: '教室邀請碼',
         classroomName: '教室名稱',
         closeChoose: '關閉選擇教室',

+ 9 - 9
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js

@@ -10,8 +10,8 @@ export default {
     nameHolder: '請輸入課程名稱',
     cusCode: '課程編碼',
     codeHolder: '請輸入課程編碼',
-    cusPd: '課程學',
-    pdHolder: '請選擇學',
+    cusPd: '課程學',
+    pdHolder: '請選擇學',
     cusSubject: '課程學科',
     sjHolder: '請選擇學科',
     cusTeachers: '授課教師',
@@ -22,7 +22,7 @@ export default {
     tableCol1: '序號',
     tableCol2: '課程名稱',
     tableCol3: '課程編碼',
-    tableCol4: '學',
+    tableCol4: '學',
     tableCol5: '學科',
     tableCol6: '教師人數',
     tableCol7: '授課教師',
@@ -32,7 +32,7 @@ export default {
     addErr: '新增成功!',
     editOk: '修改成功!',
     editErr: '修改失敗!',
-    formTips: '請先完善資訊,再存!',
+    formTips: '請先完善資訊,再存!',
     noSchool: '尚未加入學校,沒有學校數據',
     sltCusTips: '請選擇課程',
 
@@ -84,7 +84,7 @@ export default {
     lessonContent: '課例教材',
     share: '分享到頻道',
     noAc: '暫無記錄',
-    pdLabel: '學:',
+    pdLabel: '學:',
     noClassCus: '課程未安排教室:',
     noTImeCus: '課程未設定時間:',
     listMode: '清單模式',
@@ -127,13 +127,13 @@ export default {
     groupType3: '依座順序S形分組',
     action: '操作',
     atLeast: '至少保留一組',
-    checkName: '請先輸入組名再建組別',
+    checkName: '請先輸入組名再建組別',
     noStuTips: '暫無學生可以進行分組',
     groupCount: '分組數量最少為1',
     groupTypeTips: '請設定分組管道',
     groupUnit: '組',
     stuNameList: '學生名單',
-    saveGroup: '存分組',
+    saveGroup: '存分組',
 
     //NewCusMgt.vue
     schdTable: '課表模式',
@@ -148,7 +148,7 @@ export default {
     removeList: '移除名單',
     addrLabel:'上課教室:',
     nameLabel:'班級名單:',
-    defaultList: '默認名單',
+    defaultList: '預設名單',
     noSet: '未設定',
     defaultTips: '預設名單為教室對應的名單,否則需要指定自定義名單。',
     noStu: '暫無學生',
@@ -234,7 +234,7 @@ export default {
     sat: '星期六',
     sun: '星期日',
     nameListType:'類型',
-    scClass:'校班級',
+    scClass:'校班級',
     customNameList:'自定義名單',
     
 }

+ 7 - 7
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js

@@ -2,7 +2,7 @@ export default {
 	index: {
 		item: '試題',
 		paper: '試卷',
-		addExercise: '新建題',
+		addExercise: '新建題',
 		openAll: '全部展開',
 		collapseAll: '全部折疊',
 		autoCreate: '智慧組卷',
@@ -18,9 +18,9 @@ export default {
 		diff: '難度',
 		level: '層次',
 		type: '題型',
-		period: '學',
+		period: '學',
 		grade: '年級',
-		subject: '科',
+		subject: '科',
 		sort: '排序',
 		createTime: '建立時間',
 		useCount: '使用次數'
@@ -71,9 +71,9 @@ export default {
 		newSchoolItem: '新建學校題目',
 		newPrivateItem: '新建個人題目',
 		backToBank: '返回題庫',
-		choosePeriod: '選擇學',
+		choosePeriod: '選擇學',
 		chooseGrade: '選擇年級',
-		chooseSubject: '選擇科',
+		chooseSubject: '選擇科',
 		gradePlaceholder: '不選擇則預設選中全部年級',
 		diff: '題目難度',
 		field: '關聯認知層次',
@@ -132,7 +132,7 @@ export default {
 		noOptionTip: '試題題幹或選項資訊有誤,請刪除或者重新匯入正確檔案!'
 	},
 	paperList: {
-		usePeriod: '適用學',
+		usePeriod: '適用學',
 		useGrade: '適用年級',
 		itemCount: '題量',
 		paperAnalysis: '試卷分析',
@@ -221,7 +221,7 @@ export default {
 	points: {
 		addPoint: '新增知識點',
 		searchPoint: '搜尋知識點',
-		noPoint: '當前科下暫無知識點',
+		noPoint: '當前科下暫無知識點',
 		checkedPoint: '已選知識點',
 		pointName: '知識點名稱',
 		inputNewPoint: '輸入新知識點名稱',

+ 6 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/home.js

@@ -30,5 +30,10 @@ export default {
     verifySchool:'加入學校',
     toSchool:'加入學校>>>',
     schoolSuccess:'您已加入學校! ',
-    hasJoin:'已加入'
+    hasJoin:'已加入',
+    myCourse:'我的課表',
+    tmwCus:'明日課程',
+    course:'課程:',
+    className:'班級:',
+    tmwNoCus:'明天沒有課程安排'
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js

@@ -32,6 +32,7 @@ import http from './http'
 import utils from './utils'
 import knowledge from './knowledge'
 import task from './task'
+import syllabus from './syllabus'
 export default {
   
   schoolBaseInfo,
@@ -68,6 +69,7 @@ export default {
   utils,
   knowledge,
   task,
+  syllabus,
   test: '測試',
   formConfigP: {
     input: '請輸入',

+ 0 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.