Browse Source

初始化

psycho 6 năm trước cách đây
mục cha
commit
38d10baa6f
100 tập tin đã thay đổi với 123671 bổ sung122 xóa
  1. 42 117
      .gitignore
  2. 17 4
      LICENSE
  3. 36 0
      README.en.md
  4. 37 1
      README.md
  5. 21 0
      TEAMModelOS.Admin/ClientApp/.gitignore
  6. 29 0
      TEAMModelOS.Admin/ClientApp/README.md
  7. 5 0
      TEAMModelOS.Admin/ClientApp/babel.config.js
  8. BIN
      TEAMModelOS.Admin/ClientApp/public/favicon.ico
  9. 17 0
      TEAMModelOS.Admin/ClientApp/public/index.html
  10. 18 0
      TEAMModelOS.Admin/ClientApp/src/App.vue
  11. 20 0
      TEAMModelOS.Admin/ClientApp/src/api.js
  12. 352 0
      TEAMModelOS.Admin/ClientApp/src/assets/i18n/en-us/en-us.js
  13. 355 0
      TEAMModelOS.Admin/ClientApp/src/assets/i18n/zh-cn/zh-cn.js
  14. 353 0
      TEAMModelOS.Admin/ClientApp/src/assets/i18n/zh-tw/zh-tw.js
  15. BIN
      TEAMModelOS.Admin/ClientApp/src/assets/img/header.jpg
  16. BIN
      TEAMModelOS.Admin/ClientApp/src/assets/img/login_bg.jpg
  17. BIN
      TEAMModelOS.Admin/ClientApp/src/assets/img/logo.jpg
  18. BIN
      TEAMModelOS.Admin/ClientApp/src/assets/img/logo.png
  19. BIN
      TEAMModelOS.Admin/ClientApp/src/assets/img/team-model.png
  20. 114422 0
      TEAMModelOS.Admin/ClientApp/src/assets/static/area.json
  21. 265 0
      TEAMModelOS.Admin/ClientApp/src/assets/static/menu-info.json
  22. 0 0
      TEAMModelOS.Admin/ClientApp/src/components/FilterCondition.vue
  23. 123 0
      TEAMModelOS.Admin/ClientApp/src/components/ImportExcel.vue
  24. 274 0
      TEAMModelOS.Admin/ClientApp/src/components/SelectSchool.vue
  25. 116 0
      TEAMModelOS.Admin/ClientApp/src/http.js
  26. 15 0
      TEAMModelOS.Admin/ClientApp/src/i18n.js
  27. 20 0
      TEAMModelOS.Admin/ClientApp/src/main.js
  28. 65 0
      TEAMModelOS.Admin/ClientApp/src/router/AdminRouter.js
  29. 50 0
      TEAMModelOS.Admin/ClientApp/src/router/BizRouter .js
  30. 16 0
      TEAMModelOS.Admin/ClientApp/src/store.js
  31. 113 0
      TEAMModelOS.Admin/ClientApp/src/tools/excel.js
  32. 66 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/ClassEvaluation.vue
  33. 66 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/DormEvaluation.vue
  34. 153 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/Home.vue
  35. 130 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/LoginPage.vue
  36. 243 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/RoleManage.vue
  37. 66 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/SelfEvaluation.vue
  38. 46 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/ShcoolAccount.vue
  39. 66 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/StudentEvaluation.vue
  40. 258 0
      TEAMModelOS.Admin/ClientApp/src/views/admin/UserManage.vue
  41. 0 0
      TEAMModelOS.Admin/ClientApp/src/views/biz/Home.vue
  42. 31 0
      TEAMModelOS.Admin/Controllers/HomeController.cs
  43. 27 0
      TEAMModelOS.Admin/JwtRsaFile/private.pem
  44. 9 0
      TEAMModelOS.Admin/JwtRsaFile/public.pem
  45. 11 0
      TEAMModelOS.Admin/Models/ErrorViewModel.cs
  46. 24 0
      TEAMModelOS.Admin/Program.cs
  47. 27 0
      TEAMModelOS.Admin/Properties/launchSettings.json
  48. 107 0
      TEAMModelOS.Admin/Startup.cs
  49. 20 0
      TEAMModelOS.Admin/TEAMModelOS.Admin.csproj
  50. 9 0
      TEAMModelOS.Admin/Views/Home/Index.cshtml
  51. 25 0
      TEAMModelOS.Admin/Views/Shared/Error.cshtml
  52. 25 0
      TEAMModelOS.Admin/Views/Shared/_CookieConsentPartial.cshtml
  53. 12 0
      TEAMModelOS.Admin/Views/Shared/_Layout.cshtml
  54. 18 0
      TEAMModelOS.Admin/Views/Shared/_ValidationScriptsPartial.cshtml
  55. 3 0
      TEAMModelOS.Admin/Views/_ViewImports.cshtml
  56. 3 0
      TEAMModelOS.Admin/Views/_ViewStart.cshtml
  57. 146 0
      TEAMModelOS.Admin/appsettings.Development.json
  58. 8 0
      TEAMModelOS.Admin/appsettings.json
  59. 45 0
      TEAMModelOS.Admin/package.json
  60. 41 0
      TEAMModelOS.Admin/webpack.config.js
  61. 236 0
      TEAMModelOS.Admin/wwwroot/0.js
  62. 168 0
      TEAMModelOS.Admin/wwwroot/1.js
  63. 97 0
      TEAMModelOS.Admin/wwwroot/2.js
  64. 97 0
      TEAMModelOS.Admin/wwwroot/3.js
  65. BIN
      TEAMModelOS.Admin/wwwroot/30d910bab206d6d6fe8f42749866756a.jpg
  66. 82 0
      TEAMModelOS.Admin/wwwroot/4.js
  67. 97 0
      TEAMModelOS.Admin/wwwroot/5.js
  68. 63 0
      TEAMModelOS.Admin/wwwroot/6.js
  69. BIN
      TEAMModelOS.Admin/wwwroot/63591575514970bc16a916124c897ff2.jpg
  70. BIN
      TEAMModelOS.Admin/wwwroot/6ccbd4b5bd4670c9c9e994fd374e6bee.jpg
  71. 97 0
      TEAMModelOS.Admin/wwwroot/7.js
  72. BIN
      TEAMModelOS.Admin/wwwroot/71ea14496a6a1fc5e9c810737e0c6942.png
  73. BIN
      TEAMModelOS.Admin/wwwroot/7421c96adbf2c5fb75b086a84add0e23.png
  74. 97 0
      TEAMModelOS.Admin/wwwroot/8.js
  75. BIN
      TEAMModelOS.Admin/wwwroot/99ac3308dd8ee14f749f51538d0d5b9e.woff
  76. 870 0
      TEAMModelOS.Admin/wwwroot/a2c4a261a239aa84463dc70e4bac9b9a.svg
  77. 168 0
      TEAMModelOS.Admin/wwwroot/about.js
  78. BIN
      TEAMModelOS.Admin/wwwroot/bafa8056ecfec5c58c5152faa7732a09.jpg
  79. BIN
      TEAMModelOS.Admin/wwwroot/c8e80e2b2e5ccb4c67b00b9b2fce6f9b.jpg
  80. BIN
      TEAMModelOS.Admin/wwwroot/d535a25a79fb1365ae814b61e88fae71.ttf
  81. 2627 0
      TEAMModelOS.Admin/wwwroot/main.js
  82. 41 0
      TEAMModelOS.Api/Core/CommonController.cs
  83. 72 0
      TEAMModelOS.Api/Core/TeamModelUserController.cs
  84. 21 0
      TEAMModelOS.Api/Core/TestController.cs
  85. 20 0
      TEAMModelOS.Api/TEAMModelOS.Api.csproj
  86. 15 0
      TEAMModelOS.Model/Core/FindSchoolByCode.cs
  87. 29 0
      TEAMModelOS.Model/Core/SchoolInfo.cs
  88. 82 0
      TEAMModelOS.Model/Core/TeamModelUser.cs
  89. 12 0
      TEAMModelOS.Model/TEAMModelOS.Model.csproj
  90. 22 0
      TEAMModelOS.SDK/Context/Attributes/AllowCors/AllowCorsAttribute.cs
  91. 11 0
      TEAMModelOS.SDK/Context/Attributes/Azure/PartitionKeyAttribute.cs
  92. 12 0
      TEAMModelOS.SDK/Context/Attributes/Azure/TableSpaceAttribute.cs
  93. 16 0
      TEAMModelOS.SDK/Context/Attributes/MySQL/TextAttribute.cs
  94. 11 0
      TEAMModelOS.SDK/Context/Attributes/Table/PartitionAttribute.cs
  95. 12 0
      TEAMModelOS.SDK/Context/Attributes/Table/TableSpaceAttribute.cs
  96. 31 0
      TEAMModelOS.SDK/Context/Configuration/BaseConfigModel.cs
  97. 31 0
      TEAMModelOS.SDK/Context/Constant/Constants.cs
  98. 24 0
      TEAMModelOS.SDK/Context/Constant/FileType.cs
  99. 44 0
      TEAMModelOS.SDK/Context/Constant/FileTypeMap.cs
  100. 0 0
      TEAMModelOS.SDK/Context/Constant/GetFileType.cs

+ 42 - 117
.gitignore

@@ -1,114 +1,16 @@
-# ---> C Sharp
-# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
-[Bb]in/
-[Oo]bj/
+################################################################################
+# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
+################################################################################
 
-# mstest test results
-TestResults
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-# User-specific files
-*.suo
-*.user
-*.sln.docstates
-
-# Build results
-[Dd]ebug/
-[Rr]elease/
-x64/
-*_i.c
-*_p.c
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.log
-*.vspscc
-*.vssscc
-.builds
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opensdf
-*.sdf
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*
-
-# NCrunch
-*.ncrunch*
-.*crunch*.local.xml
-
-# Installshield output folder
-[Ee]xpress
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish
-
-# Publish Web Output
-*.Publish.xml
-
-# NuGet Packages Directory
-packages
-
-# Windows Azure Build Output
-csx
-*.build.csdef
-
-# Windows Store app package directory
-AppPackages/
+/.vs
+.DS_Store
+node_modules/
+npm-debug.log
 
-# Others
-[Bb]in
-[Oo]bj
-sql
-TestResults
-[Tt]est[Rr]esult*
-*.Cache
-ClientBin
-[Ss]tyle[Cc]op.*
-~$*
-*.dbmdl
-Generated_Code #added for RIA/Silverlight projects
+/Properties/launchSettings.json
 
-# Backup & report files from converting an old project file to a newer
-# Visual Studio version. Backup files are not needed, because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
+package-lock.json
 
-# ---> VisualStudio
 ## Ignore Visual Studio temporary files, build results, and
 ## files generated by popular Visual Studio add-ons.
 
@@ -130,13 +32,19 @@ x64/
 x86/
 build/
 bld/
-[Bb]in/
-[Oo]bj/
+bin/
+Bin/
+obj/
+Obj/
 
 # Visual Studio 2015 cache/options directory
 .vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
+/wwwroot/dist/**
+
+# Workaround for https://github.com/aspnet/JavaScriptServices/issues/235
+!/wwwroot/dist/_placeholder.txt
+
+/yarn.lock
 
 # MSTest test Results
 [Tt]est[Rr]esult*/
@@ -187,6 +95,7 @@ _Chutzpah*
 ipch/
 *.aps
 *.ncb
+*.opendb
 *.opensdf
 *.sdf
 *.cachefile
@@ -248,7 +157,7 @@ publish/
 # Publish Web Output
 *.[Pp]ublish.xml
 *.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings 
+# TODO: Comment the next line if you want to checkin your web deploy settings
 # but database connection strings (with potential passwords) will be unencrypted
 *.pubxml
 *.publishproj
@@ -262,12 +171,20 @@ publish/
 # Uncomment if necessary however generally it will be regenerated when needed
 #!**/packages/repositories.config
 
-# Windows Azure Build Output
+# Microsoft Azure Build Output
 csx/
 *.build.csdef
 
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Microsoft Azure ApplicationInsights config file
+ApplicationInsights.config
+
 # Windows Store app package directory
 AppPackages/
+BundleArtifacts/
 
 # Visual Studio cache files
 # files ending in .cache can be ignored
@@ -277,16 +194,18 @@ AppPackages/
 
 # Others
 ClientBin/
-[Ss]tyle[Cc]op.*
 ~$*
 *~
 *.dbmdl
 *.dbproj.schemaview
 *.pfx
 *.publishsettings
-node_modules/
 orleans.codegen.cs
 
+# Workaround for https://github.com/aspnet/JavaScriptServices/issues/235
+/node_modules/**
+!/node_modules/_placeholder.txt
+
 # RIA/Silverlight projects
 Generated_Code/
 
@@ -310,6 +229,9 @@ UpgradeLog*.htm
 # Microsoft Fakes
 FakesAssemblies/
 
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
 # Node.js Tools for Visual Studio
 .ntvs_analysis.dat
 
@@ -327,7 +249,10 @@ FakesAssemblies/
 **/*.Server/ModelManifest.xml
 _Pvt_Extensions
 
-# ---> VisualStudioCode
-.settings
+# Paket dependency manager
+.paket/paket.exe
 
+# FAKE - F# Make
+.fake/
 
+.vscode/

+ 17 - 4
LICENSE

@@ -1,8 +1,21 @@
 MIT License
-Copyright (c) <year> <copyright holders>
 
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+Copyright (c) 2019 CrazyIter_Bin
 
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# TEAMModelOS
+
+#### Description
+{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Instructions
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Contribution
+
+1. Fork the repository
+2. Create Feat_xxx branch
+3. Commit your code
+4. Create Pull Request
+
+
+#### Gitee Feature
+
+1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4. The most valuable open source project [GVP](https://gitee.com/gvp)
+5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6. The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 37 - 1
README.md

@@ -1,3 +1,39 @@
 # TEAMModelOS
 
-TEAMModelOS
+#### 介绍
+{**以下是码云平台说明,您可以替换此简介**
+码云是开源中国推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
+无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 使用说明
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 参与贡献
+
+1. Fork 本仓库
+2. 新建 Feat_xxx 分支
+3. 提交代码
+4. 新建 Pull Request
+
+
+#### 码云特技
+
+1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
+3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
+4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
+5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 21 - 0
TEAMModelOS.Admin/ClientApp/.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*

+ 29 - 0
TEAMModelOS.Admin/ClientApp/README.md

@@ -0,0 +1,29 @@
+# client-app
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
TEAMModelOS.Admin/ClientApp/babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}

BIN
TEAMModelOS.Admin/ClientApp/public/favicon.ico


+ 17 - 0
TEAMModelOS.Admin/ClientApp/public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>client-app</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but client-app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 18 - 0
TEAMModelOS.Admin/ClientApp/src/App.vue

@@ -0,0 +1,18 @@
+<template>
+    <div id="app">
+        <router-view></router-view>
+    </div>
+</template>
+<script>
+    export default {
+        
+    }
+</script>
+<style>
+    html, body, #app, .body {
+        width: 100%;
+        height: 100%;
+        margin: 0px;
+        padding: 0px;
+    }
+</style>

+ 20 - 0
TEAMModelOS.Admin/ClientApp/src/api.js

@@ -0,0 +1,20 @@
+import {get, post} from "./http.js"
+
+const getSchoolUrl = 'api/common/getSchool';
+const testUrl = 'api/test/test';
+function handleRequestData(url, data) {
+    return {
+        method: url.substring(url.lastIndexOf("/") + 1, url.length),
+        params: data
+    }
+}
+const api = {
+    getSchoolApi(data) {
+        return post(getSchoolUrl, handleRequestData(getSchoolUrl, data));
+    },
+    testApi(params) {
+        return get(testUrl, params);
+    }
+}
+
+export default api;

+ 352 - 0
TEAMModelOS.Admin/ClientApp/src/assets/i18n/en-us/en-us.js

@@ -0,0 +1,352 @@
+module.exports = { 
+    menu: {
+        'home': 'Home',
+        'activity': 'Activity',
+        'declare': 'Declare activity',
+        'language': 'Languages',
+        'myActivity': 'MyAcitivity',
+        'join': 'JoinAcitivity',
+        'manage': 'ManageAcitivity',
+        'check': 'CheckAcitivity',
+        'loginOut': 'Sign out',
+        'login': 'LOG IN',
+        'registered': 'SIGN UP',
+        'promptMsg': 'Please login to TeamModel account',
+        'rootManage': 'RootManage'
+    },
+    home: {
+        'centerTopTitle': '支持系统',
+        'centerTopEn': 'SUPPORT SYSTEM',
+        'hitaTitle': 'HiTA TEAM Model Smarter Classroom',
+        'hitaInfo': 'Smartphones plus interactive whiteboards provide a new smart teaching approach ',
+        'tblTitle': 'TBL TEAM Model Smarter Classroom ',
+        'tblInfo': 'Team-Based Learning; a student self-study, discussion, and presentation environment ',
+        'irsTitle': 'IRS TEAM Model Smarter Classroom',
+        'irsInfo': "A lively, interactive, proactive classroom; seeing every child's thinking",
+        'mobileTitle': 'Mobile TEAM Model Smarter Classroom',
+        'mobileInfo': 'Smartphones are the best classroom learning tools ',
+        'preTitle': 'Premium TEAM Model Smarter Classroom',
+        'preInfo': 'Smarter classrooms: integration of AI and varied teaching approaches ',
+        'proTitle': '1-to-1 TEAM Model Smarter Classroom',
+        'proInfo': 'Promoting individualized learning through student tablets; training students to explore independently',
+        'centerTitle': '近期活動',
+        'centerEn': 'RECENT ACTIVITIES',
+        'eventsUnit': 'Host organization',
+        'eventsInfo': 'Activity Info',
+        'centerButtomTitle': '活动流程',
+        'centerButtomEn': 'ACTIVITY PROCESS',
+        'declare': 'Declare activity',
+        'check': 'Check activitiy',
+        'signUp': 'Activitiy registration',
+        'upload': 'Upload works',
+        'review': 'Review works',
+        'announce': 'Announce score',
+        'carouselTitle': '活动展示',
+        'carouselEn': 'PICTURE SHOW',
+        'register': 'REGISTER NOW',
+        'eventEnd': 'ACTIVITY END'
+    },
+    footer: {
+        'title': 'TeamModel OS',
+        'copyright': 'Copyright © All Rights Reserved by Habook Group | Chengdu (TeamModel) Information Technology Co., Ltd.'
+    },
+    declare: {
+        basicTitle: 'Basic Information of Activities',
+        activityName: 'activityName:',
+        activityNameP: 'Please enter the event title name',
+        introduce: 'Introduction to the event',
+        introduceP: 'Please enter the event title name:',
+        unit: 'Please enter event organizer',
+        unitP: 'Please enter the event organizer',
+        file: 'Activity file:',
+        fileP: 'Upload activity file',
+        img: 'Promotional graphics:',
+        imgP: 'Upload promotional pictures(1920*800px)',
+        level: 'Scope of activities:',
+        levelItem: [
+            //{
+            //    id: 1,
+            //    label: 'school'
+            //},
+            //{
+            //    id: 2,
+            //    label: 'District'
+            //},
+            //{
+            //    id: 3,
+            //    label: 'National'
+            //},
+            //{
+            //    id: 4,
+            //    label: 'International'
+            //}
+            'school', 'District', 'National', 'International'
+        ],
+        modular: 'Required module:',
+        modulars: [
+            {
+                id: 1,
+                label: "Event registration module",
+                mod: "signUp"
+            },
+            {
+                id: 2,
+                label: "Upload work module",
+                mod: "upload"
+            },
+            {
+                id: 3,
+                label: "Work review module",
+                mod: "review"
+            },
+            {
+                id: 4,
+                label: "Grade publicity module",
+                mod: "publish"
+            }
+        ],
+        signTitle: 'Upload module configuration:',
+        signStart: 'Start registration time:',
+        signEnd: 'Deadline for registration:',
+        limitNum: 'Restrict the number of applicants:',
+        publishActivity: 'Public event information:',
+        publishName: 'Announce the registration list:',
+        needHiTeach: 'Assign Hiteach serial number:',
+        needIES: 'Assign IES Accounts:',
+        needSocrates: 'Open Socrates permission:',
+        contestType: 'Entry method:',
+        contestTypeItem: [
+            {
+                id: 1,
+                label: 'Individual competition'
+            },
+            {
+                id: 2,
+                label: 'Team competition'
+            },
+            {
+                id: 3,
+                label: 'Individual and team competitions'
+            }
+        ],
+        groupNum: 'Number of teams:',
+        uploadTitle: 'Module Configuration of Upload Works',
+        uploadStart: 'Start upload time:',
+        uploadEnd: 'Deadline upload time:',
+        uploadType: 'Upload work type:',
+        uploadTypeItem: [
+            {
+                id: 1,
+                label: "file"
+            },
+            {
+                id: 2,
+                label: "video"
+            },
+            {
+                id: 3,
+                label: "Work link"
+            },
+            {
+                id: 4,
+                label: "Socrates film"
+            }
+        ],
+        reviewTitle: 'Assessment module configuration',
+        reviewStart: 'Start review time:',
+        reviewEnd: 'End review time:',
+        publishTitle: 'Performance announcement module configuration',
+        publishStart: 'Start publishing time:',
+        publishEnd: 'End of publication time:',
+        publishMode: 'Method of publication of results:',
+        publishModeType: [
+            {
+                id: 1,
+                label: 'Upload awardList'
+            },
+            {
+                id: 2,
+                label: 'Customize page'
+            }
+        ],
+        yesOrNo: [
+            {
+                id: 1,
+                label: "Yes"
+            },
+            {
+                id: 2,
+                label: "No"
+            }
+        ],
+        bookInfo: 'Registration information:',
+        start: "Start time",
+        end: "End time",
+        submit: 'submit',
+        contacts: 'Activity Manager',
+        contactsPhone: 'Cell Phone',
+        contactsP: 'Please enter the person in charge of the activity',
+        contactsPhoneP: 'Please enter the phone number of the person in charge'
+    },
+    join: {
+        joinState1: "All activities",
+        joinState2: "Closed activities",
+        joinState3: "Ongoing activities",
+        joinTitle1: "Basic Information of Activities",
+        joinTitle2: "Registration information",
+        joinTitle3: "Works Information",
+        joinTitle4: "Achievement announcement information",
+        joinData: "No data for the time being",
+        joinLang: "Please select the activities you participated in",
+        joinManual: "Click to view the Registration Manual",
+        joinIES: "Upload entries",
+        joinTeam: "Team information",
+        joinOut: "Exit team",
+        joinNull: "No team information, go to join the team",
+        joinInTeam: "Join the team",
+        joinIn: "To join",
+        joinCreate: 'Create',
+        overNum:'This team is full, please join other teams, or contact this team!'
+
+    },
+    selectActivity: {
+        msg: 'View managed activities',
+        prompt:'No matching data'
+    },
+    signUp: {
+        teamPrompt: "Team teachers are required to belong to the same school and apply for several subjects, humanities, and natural subjects (excluding mathematics)!",
+        signLabel: 'Fill in the registration information',
+        fixLabel: 'Modify registration information',
+        confirm: "CONFIRM",
+        confirmInfo:'Modify information successfully',
+        submit: 'Sign up ',
+        member: 'Team Members:',
+        teamName: 'Team name:',
+        teamNameP: 'Please enter team name',
+        teamJoin: "To join",
+        teamInput: "Join the team",
+        teamCreat: "Create team"
+    },
+    ConfirmeDecInfo: {
+        download: "Download file",
+        cancel: "cancel",
+        confirm: "confirm"
+    },
+    manageSport: {
+        manageAct: "Management activities",
+        manageFind: "View the activities",
+        manageStatu: "Management activity status",
+        manageReview: "View registration data",
+        manageUpload: "View uploaded data",
+        manageInfo: "Import review information",
+        managePoint: "Allocation of judging works",
+        manageProgress: "Review progress",
+        manageNum: "View the score",
+        manageView: "Activity data graph",
+        manageStart: "Activity to be started",
+        manageIn: "Ongoing activity",
+        manageEnd: "Activities completed",
+        manageAdd: 'Added Administrator'
+    },
+    manageInfo: {
+        manageTitle: "Activity basic information",
+        titleName: "Activity theme name",
+        manageIntroduce: "Introduction of activities",
+        manageUnit: "Event organizer",
+        manageFile: "Activity file",
+        manageUpload: "Click download to view the file",
+        manageLevel: "Activity level",
+        manageStatus: "Active state",
+        manageId: "The notifier",
+        manageTeamModelId: "Rubbing the ID",
+        ManageinfoData: "No active data yet"
+    },
+    basicInfo: {
+        basicUnit: "Sponsor unit:",
+        basicLevel: "Range:",
+        basicStartDate: "Start Time:",
+        basicEndDate: "End Time:",
+        basicMatch: "Competition documents",
+        basicFile: "Download File",
+        basicCompetition: "Introduction:",
+        basicIntroduce: "Download Files",
+    },
+    checkSport: {
+        checkAct:"Audit activities",
+        checkFind:"View activity",
+        checkData:"Check the registration data",
+        checkUpload:"View Uploaded Data",
+        checkInput:"Import review information",
+        checkReview:"Distribution of Judged Works",
+        checkSpeed:"Review progress",
+        checkNum:"View the Score of Works",
+        checkAudited:"Audited activities",
+        checkUnaudited:"Unaudited activities",
+        checkPass:"Audit approved activities"
+    },
+    checkInfo: {
+        checkInfo:"Basic Information of Activities",
+        infoName:"Activity Theme Name",
+        infoIntroduce:"Activity Brief",
+        infoUnit:"Organizers of the event",
+        infoFile:"Active document",
+        infoFileUrl:"Click Download to View Files",
+        infoLevel:"Activity level",
+        infoStatus:"Activity state",
+        infoDeclarant:"Declarant",
+        infoTeamModelId:"Claimant's TeamModelID",
+        infoData:"No active data available"
+    },
+    rulePrompt: {
+        name: 'Please enter the activity theme name.',
+        introduce: 'Please enter a brief introduction of the activities.',
+        level: 'Please select the activity category.',
+        unit: 'Please enter the organizer.',
+        fileUrl: 'Please upload the relevant documents of the activity.',
+        imgUrl: 'Please upload the activity theme picture.',
+        limitNum: 'Please choose whether to limit the number of enrollees.',
+        publishActivity: 'Please select whether the activity information is displayed on the home page.',
+        entryCard: 'Please choose whether to generate the entry certificate',
+        publishName: 'Please choose whether to publish the successful registration list',
+        contestType: 'Please choose the way to compete',
+        needHiTeach: 'Please choose whether to assign HiTeach serial number',
+        needIES: 'Please choose whether to allocate IES accounts',
+        needSocrates: 'Please choose whether to open Socrates or not',
+        partIds: 'Please select the information you need to fill in for the registration of the event',
+        uploadType: 'Please select the type of upload work',
+        publishMode: 'Please choose the way to publish your results',
+        contactsPhone: 'Please enter the phone number of the person in charge',
+        contacts: 'Please enter the name of the person in charge',
+    },
+    formConfigP: {
+        input: 'Please Enter ',
+        select: 'Please Select ',
+        country: 'Country',
+        province: 'Province',
+        city: 'City',
+        school:'School'
+    },
+    prompt: {
+        signUp: {
+            completeInfo: 'Please complete the registration information and re-register!',
+            loginOut: 'The login is invalid. Please login again for registration!',
+            teamNumFirst: 'Team size should not exceed',
+            teamNumLast: '!(Including yourself)',
+            teamRuleFirst: 'The number of teams required for the competition is',
+            teamRuleLast: ',Please continue to add members. If the team member has not registered, please invite the last member to join the team!',
+            success: 'You have successfully registered for the event. You can check the information of the event in which I participated!'
+        },
+        homePage: {
+            activityStatus:'This activity has been closed!'
+        },
+        homeHeader: {
+            login: 'Please login Team Model ID!',
+            manage: 'Please contact the administrator for declaration activities!'
+        }
+    },
+    public: {
+        year: '-',
+        month: '-',
+        day: ''
+    }
+}

+ 355 - 0
TEAMModelOS.Admin/ClientApp/src/assets/i18n/zh-cn/zh-cn.js

@@ -0,0 +1,355 @@
+module.exports = {
+    menu: {
+        'home': '首页',
+        'activity': '近期活动',
+        'declare': '申报活动',
+        'language': '选择语言',
+        'myActivity': '我的活动',
+        'join': '参加的活动',
+        'manage': '管理的活动',
+        'check':'审核的活动',
+        'loginOut': '退出',
+        'login': '登录',
+        'registered': '注册',
+        'promptMsg': '请先登录醍摩豆账号',
+        'rootManage': '后台管理'
+    },
+    home: {
+        'centerTopTitle': '支持系统',
+        'centerTopEn': 'SUPPORT SYSTEM',
+        'hitaTitle': 'HITA智慧教室',
+        'hitaInfo': '教师手机结合互动白板,开创智慧教学新风貌。',
+        'tblTitle': 'TBL智慧教室',
+        'tblInfo': '团队合作学习,学生自学、讨论、发表的环境。',
+        'irsTitle': 'IRS智慧教室',
+        'irsInfo': '生动、互动、主动的课堂,看见每个孩子的思考。',
+        'mobileTitle': '移动学习智慧教室',
+        'mobileInfo': '智能手机就是最好的课堂学习载具',
+        'preTitle': '旗舰版智慧教室',
+        'preInfo': '整合AI人工智能与多元教学型态于一体,智慧教室的极致展现',
+        'proTitle': '电子书包智慧教室',
+        'proInfo':'一生一平板促进个人化学习,训练学生自主探究培养高阶思维',
+        'centerTitle': '近期活动',
+        'centerEn': 'RECENT ACTIVITIES',
+        'eventsUnit': '主办单位',
+        'eventsInfo': '活动简介',
+        'centerButtomTitle': '活动流程',
+        'centerButtomEn': 'ACTIVITY PROCESS',
+        'declare': '活动申报',
+        'check': '活动审核',
+        'signUp': '活动报名',
+        'upload': '上传作品',
+        'review': '评审作品',
+        'announce': '公布成绩',
+        'carouselTitle': '精彩记录',
+        'carouselEn': 'PICTURE SHOW',
+        'register': '立即报名',
+        'eventEnd':'活动已结束'
+
+
+    },
+    footer: {
+        'title':'醍摩豆智慧云',
+        'copyright':'Copyright © 网奕资讯科技集团 | 醍摩豆(成都)信息技术有限公司版权所有'
+    },
+    declare: {
+        basicTitle: '活动基本信息',
+        activityName: '活动主题名称:',
+        activityNameP: '请输入活动主题名称',
+        introduce: '活动简介:',
+        introduceP: '请输入活动主题简介',
+        unit: '活动主办单位:',
+        unitP: '请输入活动主办单位',
+        file: '活动文件:',
+        fileP: '上传活动文件',
+        img: '主题图片:',
+        imgP: '上传主题图片(1920*800px)',
+        level: '活动类别:',
+        levelItem: [
+            //{
+            //    id:1,
+            //    label: '校级'
+            //},
+            //{
+            //    id: 2,
+            //    label: '区级'
+            //},
+            //{
+            //    id: 3,
+            //    label: '全国'
+            //},
+            //{
+            //    id: 4,
+            //    label: '国际'
+            //}
+            '校级', '区级', '全国', '国际'
+        ],
+        modular:'所需模块:',
+        modulars: [
+            {
+                id: 1,
+                label: "活动报名模块",
+                mod: "signUp"
+            },
+            {
+                id: 2,
+                label: "上传作品模块",
+                mod: "upload"
+            },
+            {
+                id: 3,
+                label: "作品评审模块",
+                mod: "review"
+            },
+            {
+                id: 4,
+                label: "成绩公示模块",
+                mod: "publish"
+            }
+        ],
+        signTitle: '报名模块配置',
+        signStart: '开始报名时间:',
+        signEnd: '截至报名时间:',
+        limitNum: '限制报名人数:',
+        publishActivity: '公开活动信息:',
+        publishName: '公布报名名单:',
+        needHiTeach: '分配HiTeach序列号:',
+        needIES: '分配IES账号:',
+        needSocrates: '开通苏格拉底权限:',
+        contestType: '参赛方式:',
+        contestTypeItem: [
+            {
+                id: 1,
+                label: '个人赛'
+            },
+            {
+                id: 2,
+                label: '团队赛'
+            },
+            {
+                id: 3,
+                label: '个人赛和团队赛'
+            }
+        ],
+        groupNum:'团队人数:',
+        uploadTitle: '上传作品配置',
+        uploadStart: '开始上传时间:',
+        uploadEnd: '截止上传时间:',
+        uploadType: '上传作品类型:',
+        uploadTypeItem: [
+            { 
+                id: 1,
+                label: "文件",
+            },
+            {
+                id: 2,
+                label: "视频",
+            },
+            {
+                id: 3,
+                label: "作品链接",
+            },
+            {
+                id: 4,
+                label: "苏格拉底影片",
+            }
+        ],
+        reviewTitle: '评审模块配置',
+        reviewStart: '开始评审时间:',
+        reviewEnd: '结束评审时间:',
+        publishTitle: '成绩公示模块配置',
+        publishStart: '开始公布时间:',
+        publishEnd: '结束公布时间:',
+        publishMode: '成绩公布方式:',
+        publishModeType: [
+            {
+                id: 1,
+                label:'上传获奖名单'
+            },
+            {
+                id: 2,
+                label:'自定义页面'
+            }
+        ],
+        yesOrNo: [
+            {
+                id: 1,
+                label:"是"
+            },
+            {
+                id: 2,
+                label:"否"
+            }
+        ],
+        bookInfo: '报名填写信息:',
+        start: "开始时间",
+        end: "结束时间",
+        submit: '提交',
+        contacts: '活动负责人',
+        contactsPhone: '负责人手机',
+        contactsP: '请输入活动负责人',
+        contactsPhoneP: '请输入负责人手机号码'
+    },
+    join: {
+        joinState1: "所有的活动",
+        joinState2: "已结束的活动",
+        joinState3: "进行中的活动",
+        joinTitle1: "活动基本信息",
+        joinTitle2: "报名信息",
+        joinTitle3: "作品信息",
+        joinTitle4: "成绩公布信息",
+        joinData: "暂无数据",
+        joinLang: "请选择参加的活动",
+        joinManual: "点击查看报名操作手册",
+        joinIES: "上传参赛作品",
+        joinTeam: "组队信息",
+        joinOut: "退出团队",
+        joinNull: "暂无组队信息,前往加入团队",
+        joinInTeam: "加入团队",
+        joinIn: "加入",
+        joinCreate: '创建',
+        overNum:'此团队人数已满,请加入其它团队,或联系此团队人员!'
+    },
+    selectActivity:{
+        msg: '查看管理的活动',
+        prompt:'暂无匹配数据'
+    },
+    signUp: {
+        teamPrompt: "组队教师必须是同一所学校,且分别报名不同的学科!",
+        signLabel: '填写报名信息',
+        fixLabel: '修改报名信息',
+        confirm: "确认",
+        confirmInfo: '修改信息成功',
+        submit: '立刻报名',
+        member: '团队成员:',
+        teamName:'团队名称:',
+        teamNameP: '请输入团队名称',
+        teamJoin: "加入",
+        teamInput: "加入团队",
+        teamCreat:"创建团队"
+    },
+    ConfirmeDecInfo: {
+        download: "下载文件",
+        cancel: "取消",
+        confirm:"确认"
+    },
+    manageSport: {
+        manageAct: "管理的活动",
+        manageFind: "查看活动",
+        manageStatu: "管理活动状态",
+        manageReview: "查看报名数据",
+        manageUpload: "查看上传数据",
+        manageInfo: "导入评审信息",
+        managePoint: "分配评审作品",
+        manageProgress: "查看评审进度",
+        manageNum: "查看作品分数",
+        manageView: "活动数据图表",
+        manageStart: "待启动的活动",
+        manageIn: "进行中的活动",
+        manageEnd: "已结束的活动",
+        manageAdd: '添加管理员'
+    },
+    manageInfo: {
+        manageTitle: "活动基本信息",
+        titleName: "活动主题名称",
+        manageIntroduce: "活动简介",
+        manageUnit: "活动主办单位",
+        manageFile: "活动文件",
+        manageUpload: "点击下载查看文件",
+        manageLevel: "活动范围",
+        manageStatus: "活动状态",
+        manageId: "申报人",
+        manageTeamModelId: "申报者醍摩豆ID",
+        ManageinfoData:"暂无活动数据"
+    },
+    basicInfo: {
+        basicUnit: "主办单位:",
+        basicLevel: "活动范围:",
+        basicStartDate: "开始时间:",
+        basicEndDate: "截止时间:",
+        basicMatch:"大赛文件:",
+        basicFile: "下载文件:",
+        basicCompetition: "大赛简介:",
+        basicIntroduce: "下载活动文件", 
+        
+    },
+    checkSport: {
+        checkAct: "审核的活动",
+        checkFind: "查看活动",
+        checkData: "查看报名数据",
+        checkUpload: "查看上传数据",
+        checkInput: "导入评审信息",
+        checkReview: "分配评审作品",
+        checkSpeed: "查看评审进度",
+        checkNum: "查看作品分数",
+        checkAudited: "已审核的活动",
+        checkUnaudited: "未审核的活动",
+        checkPass: "审核通过的活动"
+    },
+    checkInfo: {
+        infoBasic: "活动基本信息",
+        infoName: "活动主题名称",
+        infoIntroduce: "活动简介",
+        infoUnit: "活动主办单位",
+        infoFile: "活动文件",
+        infoFileUrl: "点击下载查看文件",
+        infoLevel: "活动级别",
+        infoStatus: "活动状态",
+        infoDeclarant: "申报人",
+        infoTeamModelId: "申报者醍摩豆ID",
+        infoData: "暂无活动数据"
+    },
+    rulePrompt: {
+        name: '请输入活动主题名称',
+        introduce:  '请输入主题简介',
+        level: '请选择活动类别',
+        unit: '请输入主办单位',
+        fileUrl: '请上传活动相关文件',
+        imgUrl: '请上传活动主题图片',
+        limitNum: '请选择是否限制报名人数',
+        publishActivity: '请选择是否首页显示活动信息',
+        entryCard:  '请选择是否生成参赛证明',
+        publishName: '请选择是否公布报名成功名单',
+        contestType:  '请选择参赛方式',
+        needHiTeach:  '请选择是否分配HiTeach序列号',
+        needIES: '请选择是否分配IES账号',
+        needSocrates: '请选择是否开通苏格拉底权限',
+        partIds: '请选择活动报名需要填写的信息',
+        uploadType: '请选择上传作品类型',
+        publishMode: '请选择公布成绩方式',
+        contactsPhone:'请输入负责人手机号',
+        contacts: '请输入负责人姓名',
+    },
+    formConfigP: {
+        input: '请输入',
+        select: '请选择',
+        country: '国家',
+        province: '省份',
+        city: '城市',
+        school: '学校'
+    },
+    prompt: {
+        signUp: {
+            completeInfo: '请完善报名信息,再报名!',
+            loginOut: '登录失效,请重新登录进行报名!',
+            teamNumFirst: '团队人数不能超过',
+            teamNumLast: '人!(包括自己)',
+            teamRuleFirst: '竞赛规定团队人数为',
+            teamRuleLast: '人,请继续添加组员。如果组员还未报名请最后报名的组员进行组队!',
+            success:'您已报名成功,可在我参加的活动中查看活动信息!'
+        },
+        homePage: {
+            activityStatus: '此活动已结束!'
+        },
+        homeHeader: {
+            login: '请登录醍摩豆账号!',
+            manage:'申报活动请联系管理员!'
+        }
+    },
+    public: {
+        year: '年',
+        month: '月',
+        day:'日'
+    }
+
+}

+ 353 - 0
TEAMModelOS.Admin/ClientApp/src/assets/i18n/zh-tw/zh-tw.js

@@ -0,0 +1,353 @@
+module.exports = {
+    menu: {
+        'home': '首頁',
+        'activity': '近期活動',
+        'declare': '申報活動',
+        'language': '選擇語言',
+        'login': '登入',
+        'myActivity': '我的活動',
+        'join': '參加的活動',
+        'manage': '管理的活動',
+        'check': '審核的活動',
+        'loginOut': '登出',
+        'registered': '註冊',
+        'promptMsg': '请先登录醍摩豆账号',
+        'rootManage':'後台管理'
+    },
+    home: {
+        'centerTopTitle': '支援系統',
+        'centerTopEn': 'SUPPORT SYSTEM',
+        'hitaTitle': 'HITA智慧教室',
+        'hitaInfo': '教師行動手機結合電子白板,開創智慧教學新風貌。',
+        'tblTitle': 'TBL智慧教室',
+        'tblInfo': '團隊合作學習,學生自學、討論、發表的環境。',
+        'irsTitle': 'IRS智慧教室',
+        'irsInfo': '生動、互動、主動的課堂,看見每個孩子的思考。',
+        'mobileTitle': '移動學習智慧教室',
+        'mobileInfo': '行動手機就是最好的課堂學習載具',
+        'preTitle': '旗艦版智慧教室',
+        'preInfo': '整合AI人工智能與多元教學形態于一體,智慧教室的極致展現',
+        'proTitle': '電子書包智慧教室',
+        'proInfo': '一生一平板促進個人化學習,訓練學生自主探究培養高階思維',
+        'centerTitle': '近期活動',
+        'centerEn': 'RECENT ACTIVITIES',
+        'eventsUnit': '舉辦單位',
+        'eventsInfo': '活動簡介',
+        'centerButtomTitle': '活動流程',
+        'centerButtomEn': 'ACTIVITY PROCESS',
+        'declare': '活動申報',
+        'check': '活動審核',
+        'signUp': '活動報名',
+        'upload': '上傳作品',
+        'review': '評審作品',
+        'announce': '公佈成績',
+        'carouselTitle': '精彩記錄',
+        'carouselEn': 'PICTURE SHOW',
+        'register': '立即報名',
+        'eventEnd': '活動已結束'
+
+    },
+    footer: {
+        'title': '醍摩豆智慧雲',
+        'copyright': 'Copyright © 網奕資訊科技集團 | 醍摩豆(成都)信息技術有限公司版權所有'
+    },
+    declare: {
+        basicTitle: '活動基本信息',
+        activityName: '活動主題名稱:',
+        activityNameP: '請輸入活動主題名稱',
+        introduce: '活動簡介:',
+        introduceP: '請輸入活動主題簡介',
+        unit: '活動主辦單位:',
+        unitP: '請輸入活動主辦單位',
+        file: '活動文件:',
+        fileP: '上傳活動文件',
+        img: '主題圖片:',
+        imgP: '上傳主題圖片(1920*800px)',
+        level: '活動範圍:',
+        levelItem: [
+            //{
+            //    id: 1,
+            //    label: '校級'
+            //},
+            //{
+            //    id: 2,
+            //    label: '區級'
+            //},
+            //{
+            //    id: 3,
+            //    label: '全國'
+            //},
+            //{
+            //    id: 4,
+            //    label: '國際'
+            //}
+            '校級', '區級', '全國', '國際'
+        ],
+        modular: '所需模塊:',
+        modulars: [
+            {
+                id: 1,
+                label: "活動報名模塊",
+                mod: "signUp"
+            },
+            {
+                id: 2,
+                label: "上傳作品模塊",
+                mod: "upload"
+            },
+            {
+                id: 3,
+                label: "作品評審模塊",
+                mod: "review"
+            },
+            {
+                id: 4,
+                label: "成績公示模塊",
+                mod: "publish"
+            }
+        ],
+        signTitle: '報名模塊配置:',
+        signStart: '開始報名時間:',
+        signEnd: '截止報名時間:',
+        limitNum: '限制報名人數:',
+        publishActivity: '公開活動信息:',
+        publishName: '公佈報名名單:',
+        needHiTeach: '分配HiTeach序列號:',
+        needIES: '分配IES賬號:',
+        needSocrates: '開通蘇格拉底權限:',
+        contestType: '參賽方式:',
+        contestTypeItem: [
+            {
+                id: 1,
+                label: '個人賽'
+            },
+            {
+                id: 2,
+                label: '團隊賽'
+            },
+            {
+                id: 3,
+                label: '個人賽和團隊賽'
+            }
+        ],
+        groupNum: '團隊人數:',
+        uploadTitle: '上傳作品配置',
+        uploadStart: '開始上傳時間:',
+        uploadEnd: '截止上傳時間:',
+        uploadType: '上傳作品類型:',
+        uploadTypeItem: [
+            {
+                id: 1,
+                label: "文件",
+            },
+            {
+                id: 2,
+                label: "視頻",
+            },
+            {
+                id: 3,
+                label: "作品鏈接",
+            },
+            {
+                id: 4,
+                label: "蘇格拉底影片",
+            }
+        ],
+        reviewTitle: '評審模塊配置',
+        reviewStart: '開始評審時間:',
+        reviewEnd: '截止上傳時間:',
+        publishTitle: '成績公示模塊',
+        publishStart: '開始公佈時間:',
+        publishEnd: '結束公佈時間:',
+        publishMode: '成績公佈方式:',
+        publishModeType: [
+            {
+                id: 1,
+                label: '上傳獲獎名單'
+            },
+            {
+                id: 2,
+                label: '自定義頁面'
+            }
+        ],
+        yesOrNo: [
+            {
+                id: 1,
+                label: "是"
+            },
+            {
+                id: 2,
+                label: "否"
+            }
+        ],
+        bookInfo: '報名填寫信息:',
+        start: "開始時間",
+        end: "結束時間",
+        submit: '提交',
+        contacts: '活動負責人',
+        contactsPhone: '負責人手機',
+        contactsP: '請輸入活動負責人姓名',
+        contactsPhoneP: '請輸入活動負責人手機號'
+    },
+    join: {
+        joinState1: "所有的活動",
+        joinState2: "已結束的活動",
+        joinState3: "進行中的活動",
+        joinTitle1: "活動基本信息",
+        joinTitle2: "報名信息",
+        joinTitle3: "作品信息",
+        joinTitle4: "成績公布信息",
+        joinData: "暫無數據",
+        joinLang: "請選擇參加的活動",
+        joinManual: "點擊查看報名操作手冊",
+        joinIES: "上傳參賽作品",
+        joinTeam: "組隊信息",
+        joinOut: "退出團隊",
+        joinNull: "暫無組隊信息,前往加入團隊",
+        joinInTeam: "加入團隊",
+        joinIn: "加入",
+        joinCreate: '創建',
+        overNum:'此團隊人數已滿,請加入其它團隊,或聯系此團隊人員!'
+    },
+    selectActivity: {
+        msg: '查看管理的活動',
+        prompt:'暫無匹配數據'
+    }, 
+    signUp: {
+        teamPrompt: "組隊教師需隸屬同一學校,且分別報名數學科、人文社會科學、自然科學!如果團體組未滿三人則此團體報名自動不成立",
+        signLable: '填寫報名信息',
+        fixLabel: '修改報名信息',
+        confirm: "確認",
+        confirmInfo: '修改信息成功',
+        submit: '立刻報名',
+        member: '團隊成員:',
+        teamName: '團隊名稱:',
+        teamNameP: '请输入团队名称',
+        teamJoin: "加入",
+        teamInput: "加入團隊",
+        teamCreat: "創建團隊"
+    },
+    ConfirmeDecInfo: {
+        download: "下載文件",
+        cancel: "取消",
+        confirm: "確認"
+    },
+    manageSport: {
+        manageAct: "管理的活動",
+        manageFind: "查看活動",
+        manageStatu: "管理活動狀態",
+        manageReview: "查看報名數據",
+        manageUpload: "查看上傳數據",
+        manageInfo: "導入評審信息",
+        managePoint: "分配評審作品",
+        manageProgress: "查看評審進度",
+        manageNum: "查看作品分數",
+        manageView: "活動數據圖表",
+        manageStart: "待啟動的活動",
+        manageIn: "進行中的活動",
+        manageEnd: "已結束的活動",
+        manageAdd:'添加管理員'
+
+    },
+    manageInfo: {
+        manageTitle: "活動基本信息",
+        titleName: "活動主題名稱",
+        manageIntroduce: "活動簡介",
+        manageUnit: "活動主辦單位",
+        manageFile: "活動文件",
+        manageUpload: "點擊下載查看文件",
+        manageLevel: "活動級別",
+        manageStatus: "活動狀態",
+        manageId: "申報人",
+        manageTeamModelId: "申報者醍摩豆ID",
+        ManageinfoData: "暫無活動數據"
+    },
+    basicInfo: {
+        basicUnit: "主辦單位:",
+        basicLevel: "活動範圍:",
+        basicStartDate: "開始時間:",
+        basicEndDate: "截止時間:",
+        basicMatch: "大賽文件:",
+        basicFile: "下載文件:",
+        basicCompetition: "大賽簡介:",
+        basicIntroduce: "查看詳情",
+    },
+    checkSport: {
+        checkAct: "審核的活動",
+        checkFind: "查看活動",
+        checkData: "查看報名數據",
+        checkUpload: "查看上傳數據",
+        checkInput: "導入評審信息",
+        checkReview: "分配評審作品",
+        checkSpeed: "查看評審進度",
+        checkNum: "查看作品分數",
+        checkAudited: "已審核的活動",
+        checkUnaudited: "未審核的活動",
+        checkPass: "審核通過的活動"
+    },
+    checkInfo: {
+        infoBasic: "活動基本信息",
+        infoName: "活動主題名稱",
+        infoIntroduce: "活動簡介",
+        infoUnit: "活動主辦單位",
+        infoFile: "活動文件",
+        infoFileUrl: "點擊下載查看文件",
+        infoLevel: "活動級別",
+        infoStatus: "活動狀態",
+        infoDeclarant: "申報人",
+        infoTeamModelId: "申報者醍摩豆ID",
+        infoData: "暫無活動數據"
+    },
+    rulePrompt: {
+        name: '請輸入活動名稱',
+        introduce: '請輸入活動簡介',
+        level: '請選擇活動類別',
+        unit: '請輸入主辦單位',
+        fileUrl: '請上傳活動相關文件',
+        imgUrl: '請上傳活動主題圖片',
+        limitNum: '請選擇是否限制人數',
+        publishActivity: '請選擇則首頁是否顯示活動信息',
+        entryCard: '請選擇是否生成參賽證明',
+        publishName: '請選擇是否公佈報名成功名單',
+        contestType: '請選擇參賽方式',
+        needHiTeach: '請選擇是否分配HiTeach序列號',
+        needIES: '請選擇是否分配IES賬號',
+        needSocrates: '請選擇是否開動蘇格拉底權限',
+        partIds: '請選擇報名需要填寫的信息',
+        uploadType: '請選擇上傳作品類型',
+        publishMode: '請選擇公佈成績方式',
+        contactsPhone: '請輸入負責人手機號',
+        contacts: '請輸入負責人姓名'
+    },
+    formConfigP: {
+        input: '請輸入',
+        select: '請選擇',
+        country: '國家',
+        province: '省份',
+        city: '城市',
+        school: '學校'
+    },
+    prompt: {
+        signUp: {
+            completeInfo: '請完善報名信息,再報名!',
+            loginOut: '登入失效,請重新登入進行報名!',
+            teamNumFirst: '團隊人數不能超過',
+            teamNumLast: '人!(包括自己)',
+            teamRuleFirst: '競賽規定團隊人數為',
+            teamRuleLast: '人,請繼續添加組員。如果組員還未報名請最後報名的組員進行組隊!',
+            success: '您已報名成功,可在我參加的活動中查看活動資訊!'
+        },
+        homePage: {
+            activityStatus: '此活動已結束!'
+        },
+        homeHeader: {
+            login: '請登入醍摩豆賬號!',
+            manage: '申請活動請聯繫管理員!'
+        }
+    },
+    public: {
+        year: '年',
+        month: '月',
+        day: '日'
+    }
+}

BIN
TEAMModelOS.Admin/ClientApp/src/assets/img/header.jpg


BIN
TEAMModelOS.Admin/ClientApp/src/assets/img/login_bg.jpg


BIN
TEAMModelOS.Admin/ClientApp/src/assets/img/logo.jpg


BIN
TEAMModelOS.Admin/ClientApp/src/assets/img/logo.png


BIN
TEAMModelOS.Admin/ClientApp/src/assets/img/team-model.png


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 114422 - 0
TEAMModelOS.Admin/ClientApp/src/assets/static/area.json


+ 265 - 0
TEAMModelOS.Admin/ClientApp/src/assets/static/menu-info.json

@@ -0,0 +1,265 @@
+{
+  "systemMenu": [
+    {
+      "id": 0,
+      "label": "平台模块",
+      "role": "admin",
+      "icon": "md-analytics",
+      "name": "modulars",
+      "type": "menuItem",
+      "subItem": [
+        {
+          "id": 0,
+          "label": "德育系统",
+          "role": "admin",
+          "router": "/shcoolAccount",
+          "name": "moral",
+          "icon": "md-thumbs-up"
+        },
+        {
+          "id": 1,
+          "label": " 电子班牌",
+          "role": "admin",
+          "router": "",
+          "name": "classCard",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 2,
+          "label": " 排课走班",
+          "role": "admin",
+          "router": "",
+          "name": "classSchedule",
+          "icon": "ios-stats"
+        }
+      ]
+    },
+    {
+      "id": 1,
+      "label": "系统设置",
+      "role": "systemSetting",
+      "icon": "ios-settings-outline",
+      "name": "manageSchool",
+      "type": "menuItem",
+      "subItem": [
+        {
+          "id": 0,
+          "label": "菜单设置",
+          "role": "admin",
+          "router": "/shcoolAccount",
+          "name": "shcoolAccount",
+          "icon": "md-thumbs-up"
+        },
+        {
+          "id": 1,
+          "label": " 其他设置",
+          "role": "admin",
+          "router": "",
+          "name": "scoreManagement",
+          "icon": "ios-stats"
+        }
+      ]
+    }
+  ],
+  "personMenu": [
+    {
+      "id": 0,
+      "label": "个人信息",
+      "role": "admin",
+      "router": "",
+      "name": "userInfo",
+      "icon": "ios-keypad"
+    },
+    {
+      "id": 1,
+      "label": "切换身份",
+      "role": "admin",
+      "router": "",
+      "name": "switchIdentity",
+      "icon": "ios-keypad"
+    },
+    {
+      "id": 2,
+      "label": "退出登录",
+      "role": "admin",
+      "router": "/Login",
+      "name": "logout",
+      "icon": "ios-keypad"
+    }
+  ],
+  "moralFirstMenu": [
+    {
+      "id": 0,
+      "label": "班级评价",
+      "role": "admin",
+      "router": "",
+      "name": "classEvaluation",
+      "icon": "ios-keypad"
+    },
+    {
+      "id": 1,
+      "label": "寝室评价",
+      "role": "admin,sdu",
+      "router": "",
+      "name": "dormitoryEvaluation",
+      "icon": "ios-create"
+    },
+    {
+      "id": 2,
+      "label": "学生评价",
+      "role": "sutdent ",
+      "router": "",
+      "name": "studentEvaluation",
+      "icon": "ios-ribbon"
+    },
+    {
+      "id": 3,
+      "label": "学生自评",
+      "role": "admin",
+      "router": "",
+      "name": "selfEvaluation",
+      "icon": "md-thumbs-up"
+    }
+  ],
+  "moralSecondMenu": [
+    {
+      "id": 0,
+      "label": "学校管理",
+      "role": "admin",
+      "icon": "ios-school-outline",
+      "name": "manageSchool",
+      "type": "menuItem",
+      "subItem": [
+        {
+          "id": 1,
+          "label": " 教师管理",
+          "role": "admin",
+          "router": "",
+          "name": "scoreManagement",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 2,
+          "label": " 学生管理",
+          "role": "admin",
+          "router": "",
+          "name": "scoreManagement1",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 3,
+          "label": " 寝室管理",
+          "role": "admin",
+          "router": "",
+          "name": "scoreManagement2",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 4,
+          "label": " 作业管理",
+          "role": "admin",
+          "router": "",
+          "name": "scoreManagement3",
+          "icon": "ios-stats"
+        }
+
+      ]
+    },
+    {
+      "id": 2,
+      "label": "评价标准",
+      "role": "admin",
+      "icon": "ios-paper-outline",
+      "type": "menuItem",
+      "name": "evaluationStandard",
+      "subItem": [
+        {
+          "id": 0,
+          "label": "班级评价",
+          "role": "admin",
+          "router": "/Home/ClassEvaluation",
+          "name": "1",
+          "icon": "md-thumbs-up"
+        },
+        {
+          "id": 1,
+          "label": "寝室评价",
+          "role": "admin",
+          "router": "/Home/DormEvaluation",
+          "name": "2",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 2,
+          "label": "学生评价",
+          "role": "admin",
+          "router": "/Home/StudentEvaluation",
+          "name": "3",
+          "icon": "ios-stats"
+        },
+        {
+          "id": 3,
+          "label": "学生自评",
+          "role": "admin",
+          "router": "/Home/SelfEvaluation",
+          "name": "4",
+          "icon": "ios-stats"
+        }
+      ]
+    },
+    {
+      "id": 4,
+      "label": "系统管理",
+      "role": "admin",
+      "icon": "ios-paper-outline",
+      "type": "menuItem",
+      "name": "manageRole1",
+      "subItem": [
+        {
+          "id": 0,
+          "label": "角色管理",
+          "role": "admin",
+          "router": "/Home/RoleManage",
+          "name": "10",
+          "icon": "md-thumbs-up"
+        },
+        {
+          "id": 1,
+          "label": "用户管理",
+          "role": "admin",
+          "router": "/Home/UserManage",
+          "name": "20",
+          "icon": "ios-stats"
+        }
+      ]
+    },
+    {
+      "id": 5,
+      "label": "消息中心",
+      "role": "admin",
+      "icon": "ios-paper-outline",
+      "type": "menuItem",
+      "name": "message",
+      "subItem": [
+        {
+          "id": 0,
+          "label": "我发布的",
+          "role": "admin",
+          "router": "",
+          "name": "10",
+          "icon": "md-thumbs-up"
+        },
+        {
+          "id": 1,
+          "label": "我接收的",
+          "role": "admin",
+          "router": "",
+          "name": "20",
+          "icon": "ios-stats"
+        }
+      ]
+    }
+
+  ]
+
+}

+ 0 - 0
TEAMModelOS.Admin/ClientApp/src/components/FilterCondition.vue


+ 123 - 0
TEAMModelOS.Admin/ClientApp/src/components/ImportExcel.vue

@@ -0,0 +1,123 @@
+<template>
+    <div class="form-body">
+        <Row>
+            <div class="ivu-upload-list-file" v-if="file !== null">
+                <Icon type="ios-stats"></Icon>
+                {{ file.name }}
+                <Icon v-show="showRemoveFile" type="ios-close" class="ivu-upload-list-remove" @click.native="handleRemove()"></Icon>
+            </div>
+        </Row>
+        <Row>
+            <transition name="fade">
+                <Progress v-if="showProgress" :percent="progressPercent" :stroke-width="2">
+                    <div v-if="progressPercent == 100">
+                        <Icon type="ios-checkmark-circle"></Icon>
+                        <span>成功</span>
+                    </div>
+                </Progress>
+            </transition>
+        </Row>
+        <Row>
+            <Table :columns="tableTitle" :data="tableData" :loading="tableLoading" style="max-height:590px; overflow-y:scroll;"></Table>
+            <div style="background-color:white; width:100%; height:50px;">
+                <Upload action="" :before-upload="handleBeforeUpload" accept=".xls, .xlsx" style="display:block; float:right;">
+                    <Button :loading="uploadLoading" @click="openUploadFile" icon="ios-folder-open" class="btn">
+                        打开文件
+                    </Button>
+                    <Button :loading="uploadLoading" @click.stop="sendUploadFile" icon="md-cloud-upload" class="btn">
+                        上传文件
+                    </Button>
+                </Upload>
+            </div>
+        </Row>
+    </div>
+</template>
+<script>
+    import excel from '../tools/excel.js'
+    export default {
+        data() {
+            return {
+                uploadLoading: false,
+                progressPercent: 0,
+                showProgress: false,
+                showRemoveFile: false,
+                file: null,
+                tableData: [],
+                tableTitle: [],
+                tableLoading: false
+            }
+        },
+        methods: {
+            initUpload() {
+                this.file = null
+                this.showProgress = false
+                this.loadingProgress = 0
+                this.tableData = []
+                this.tableTitle = []
+            },
+            openUploadFile() {
+                this.initUpload()
+            },
+            handleRemove() {
+                this.initUpload()
+                this.$Message.info('打开的文件已删除!')
+            },
+            handleBeforeUpload(file) {
+                const fileExt = file.name.split('.').pop().toLocaleLowerCase()
+                if (fileExt === 'xlsx' || fileExt === 'xls') {
+                    this.readFile(file)
+                    this.file = file
+                } else {
+                    this.$Notice.warning({
+                        title: '文件类型错误',
+                        desc: '文件:' + file.name + '不是EXCEL文件,请选择后缀为.xlsx或者.xls的EXCEL文件。'
+                    })
+                }
+                return false
+            },
+            // 读取文件
+            readFile(file) {
+                const reader = new FileReader();
+                reader.readAsArrayBuffer(file);
+                reader.onloadstart = e => {
+                    this.uploadLoading = true
+                    this.tableLoading = true
+                    this.showProgress = true
+                }
+                reader.onprogress = e => {
+                    this.progressPercent = Math.round(e.loaded / e.total * 100)
+                }
+                reader.onerror = e => {
+                    this.$Message.error('文件读取出错')
+                }
+                reader.onload = e => {
+                    this.$Message.info('文件读取成功');
+                    const data = e.target.result;
+                    const { header, results } = excel.read(data, 'array');
+                    const tableTitle = header.map(item => { return { title: item, key: item } });
+                    this.tableData = results;
+                    this.tableTitle = tableTitle;
+                    this.uploadLoading = false;
+                    this.tableLoading = false;
+                    this.showRemoveFile = true;
+                    console.log(this.tableData);
+                }
+            },
+            sendUploadFile() {
+            }
+        },
+        mounted() {
+        }
+    }
+</script>
+<style scoped>
+    .btn {
+        background: white;
+        margin-top: 15px;
+        font-size: 15px;
+        padding: 5px 10px;
+        width: 120px;
+        padding: 4px 10px;
+        margin-left: 10px;
+    }
+</style>

+ 274 - 0
TEAMModelOS.Admin/ClientApp/src/components/SelectSchool.vue

@@ -0,0 +1,274 @@
+<template>
+    <div style="width:50%">
+        <div class="selection-component row">
+            <Icon type="md-home" size="20" style="margin-right:10px;" />
+            <label class="selection-label">{{$t('formConfigP.school')+':'}}</label>
+            <Row style="width:90%;">
+
+                <Col :xs="18" :sm="6" :md="5" :lg="4">
+                <Select v-model="country.countryId" class="my-select" :placeholder="$t('formConfigP.country')" @on-change="getSelctValue('country',$event)" :disabled="$i18n.locale.indexOf('en') != -1">
+                    <Option v-for="item in countryData" :value="item.countryId" :key="item.sysAddID">{{ item.countryName }}</Option>
+                </Select>
+                </Col>
+                <Col :xs="18" :sm="6" :md="5" :lg="4">
+                <Select v-model="schoolInfo.province.provinceId" v-show="country.countryId != 'TW'" class="my-select" :placeholder="$t('formConfigP.province')" :disabled="(checkCountry != 'CN' &&  checkCountry != 'TW' && checkCountry != null) || $i18n.locale.indexOf('en') != -1" clearable ref="province" @on-change="getSelctValue('province',$event)">
+                    <Option v-for="item in provinceData" :value="item.provinceId" :key="item.sysAddID">{{ item.provinceName }}</Option>
+                </Select>
+                </Col>
+                <Col :xs="18" :sm="6" :md="5" :lg="4">
+                <Select v-model="schoolInfo.city.cityId" class="my-select" :placeholder="$t('formConfigP.city')" :disabled="(checkCountry != 'CN' &&  checkCountry != 'TW' && checkCountry != null) || $i18n.locale.indexOf('en') != -1" clearable ref="city" @on-change="getSelctValue('city',$event)">
+                    <Option v-for="item in cityData" :value="item.cityId" :key="item.sysAddID">{{ item.cityName }}</Option>
+                </Select>
+                </Col>
+                <Col :xs="18" :sm="6" :md="5" :lg="12">
+                <Select v-model="schoolInfo.school.name" class="my-select" :placeholder="$t('formConfigP.school')" :disabled="(checkCountry != 'CN' &&  checkCountry != 'TW' && checkCountry != null) || $i18n.locale.indexOf('en') != -1" clearable ref="school" @on-change="getSelctValue('school',$event)" filterable :loading="loading" not-found-text="">
+                    <Option v-for="item in schoolData" :value="item.name" :key="item.sysAddID">{{ item.name }}</Option>
+                </Select>
+                </Col>
+            </Row>
+        </div>
+        <div class="selection-component " style="margin-left:26px;">
+            <label class="selection-label"></label>
+            <Row style="width:90%; margin-top:20px;" v-if="(checkCountry != 'CN' &&  checkCountry != 'TW' && checkCountry != null) || $i18n.locale.indexOf('en') != -1">
+                <Col :xs="24" :sm="6" :md="5" :lg="6" style="display:none;">
+                <Input v-model="schoolInfoInput.country" class="my-select" placeholder="country" style="width: 95%;" />
+                </Col>
+                <Col :xs="24" :sm="6" :md="5" :lg="6">
+
+                <Input v-model="schoolInfoInput.city" class="my-select" placeholder="city" style="width: 95%" />
+                </Col>
+                <Col :xs="24" :sm="6" :md="5" :lg="12">
+                <Input v-model="schoolInfoInput.school" class="my-select" placeholder="school" style="width: 90%;" @on-change="getInputValue" />
+                </Col>
+            </Row>
+        </div>
+
+
+    </div>
+</template>
+
+<script>
+    export default {
+        props: {
+
+        },
+        data() {
+            return {
+                model: "",
+                zhCnData: [],
+                zhTwData: [],
+                enUsData: [],
+                schoolData: [],
+                country: {},
+                schoolInfoInput: {
+                    province: '',
+                    city: '',
+                    school: '',
+                },
+                schoolInfo: {
+                    province: {},
+                    city: {},
+                    school: {},
+                },
+                loading: false
+            };
+        },
+        methods: {
+            //getValue() {
+            //    this.$emit("get-value", [
+            //        this.model,
+            //        this.selections.field
+            //    ]);
+            //},
+            getCountryInfo(data) {
+                let result = [];
+                let currentCountry = '';
+                for (let i = 0; i < data.length; i++) {
+                    if (currentCountry != data[i].countryName && data[i].countryName != null && data[i].provinceName == null && data[i].cityName == null) {
+                        currentCountry = data[i].countryName;
+                        result.push(data[i]);
+                    }
+                }
+                return result;
+            },
+            getProvinceInfo(data, country) {
+                let result = [];
+                let currentProvince = '';
+                for (let i = 0; i < data.length; i++) {
+                    if (currentProvince != data[i].provinceName && data[i].provinceName != null && data[i].countryId == country.countryId) {
+                        currentProvince = data[i].provinceName;
+                        result.push(data[i]);
+                    }
+                }
+                return result;
+            },
+            getCityInfo(data, province) {
+                let result = [];
+                let currentCity = '';
+                if (province != undefined) {
+                    for (let i = 0; i < data.length; i++) {
+                        if (currentCity != data[i].cityName && data[i].cityName != null && data[i].provinceId == province.provinceId) {
+                            currentCity = data[i].cityName;
+                            result.push(data[i]);
+                        }
+                    }
+                }
+                return result;
+            },
+            getSchoolInfo(CountryId, ProvinceId, CityId) {
+                let params = {
+                    CountryId: CountryId,
+                    ProvinceId: ProvinceId,
+                    CityId: CityId
+                }
+                this.loading = true;
+
+                //发送请求获取学校列表
+                this.$api.getSchoolApi(params).then(
+                    (res) => {
+                        if (res.error == null) {
+                            if (res.result.data.length == 0 || !res.result.data) {
+                                alert("暂未收录此地区学校,请手动输入!");
+                            } else {
+                                this.schoolData = res.result.data;
+                                //this.schoolInfo.school = res.result.data[0];
+                            }
+
+                        } else {
+                            alert("服务器错误!");
+                        }
+                        this.loading = false;
+                    },
+                    (err) => {
+                        console.log(err);
+                        this.loading = false;
+                    }
+                );
+            },
+            getSelctValue(flag, value) {
+                if (flag == 'country') {
+                    this.$refs.school.clearSingleSelect();
+                    this.$refs.city.clearSingleSelect();
+                    this.$refs.province.clearSingleSelect();
+                } else if (flag == 'province') {
+                    this.$refs.school.clearSingleSelect();
+                    this.$refs.city.clearSingleSelect();
+                } else if (flag == 'city') {
+                    this.$refs.school.clearSingleSelect();
+                    this.getSchoolInfo(this.country.countryId, this.schoolInfo.province.provinceId, this.schoolInfo.city.cityId);
+                } else if (flag == 'school') {
+                    this.schoolInfo['checkCountry'] = this.checkCountry;
+                    this.schoolInfo['country'] = this.country;
+                    this.$emit("school-info", this.schoolInfo);
+                }
+            },
+            getInputValue() {
+                this.schoolInfoInput['checkCountry'] = this.checkCountry;
+                this.schoolInfoInput['country'] = this.country;
+                this.$emit("school-info", this.schoolInfoInput);
+            }
+        },
+        computed: {
+            countryData() {
+                let countryInfo = [];
+                if (this.$i18n.locale == 'zh-CN') {
+                    countryInfo = this.getCountryInfo(this.zhCnData);
+
+                } else if (this.$i18n.locale == 'zh-TW') {
+                    countryInfo = this.getCountryInfo(this.zhTwData);
+                } else if (this.$i18n.locale.indexOf('en') != -1) {
+                    countryInfo = this.getCountryInfo(this.enUsData);
+                }
+                return countryInfo;
+            },
+            provinceData() {
+                let provinceInfo = [];
+                if (this.$i18n.locale == 'zh-CN') {
+                    provinceInfo = this.getProvinceInfo(this.zhCnData, this.country);
+                } else if (this.$i18n.locale == 'zh-TW') {
+                    provinceInfo = this.getProvinceInfo(this.zhTwData, this.country);
+                } else if (this.$i18n.locale.indexOf('en') != -1) {
+                    provinceInfo = this.getProvinceInfo(this.enUsData, this.country);
+                }
+                return provinceInfo;
+            },
+            cityData() {
+                let cityInfo = [];
+                if (this.$i18n.locale == 'zh-CN') {
+                    cityInfo = this.getCityInfo(this.zhCnData, this.schoolInfo.province);
+                } else if (this.$i18n.locale == 'zh-TW') {
+                    cityInfo = this.getCityInfo(this.zhTwData, this.schoolInfo.province);
+                } else if (this.$i18n.locale.indexOf('en') != -1) {
+                    cityInfo = this.getCityInfo(this.enUsData, this.schoolInfo.province);
+                }
+                return cityInfo;
+            },
+            checkCountry() {
+                //if (this.schoolInfo.country.countryId == undefined) {
+                //    return 0;
+                //}
+                //if (this.schoolInfo.country.countryId == 'CN' || this.schoolInfo.country.countryId == 'TW') {
+                //    return 1;
+                //} else {
+                //    return 2;
+                //}
+                if (this.country.countryId == undefined) {
+                    return null;
+                } else {
+                    return this.country.countryId;
+                }
+            }
+        },
+        mounted() {
+            let area = require("../assets/static/area.json");
+            for (let i = 0; i < area.length; i++) {
+                if (area[i].lang == 'en-us') {
+                    this.enUsData.push(area[i]);
+                } else if (area[i].lang == 'zh-tw') {
+                    this.zhTwData.push(area[i]);
+                } else if (area[i].lang == 'zh-cn') {
+                    this.zhCnData.push(area[i]);
+                }
+            }
+
+        }
+    };
+</script>
+
+<style scoped>
+    .selection-component {
+        width: 100%;
+        position: relative;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+    }
+
+    .ivu-select-selection {
+        width: 150px !important;
+    }
+
+    .selection-label {
+        width: 80px;
+        font-size: 15px;
+        /*color: #67B6E5;*/
+    }
+
+    .my-select {
+        width: 90%;
+    }
+
+        .my-select > > > .ivu-select-selection {
+            border: 1px solid #67B6E5;
+        }
+
+        .my-select > > > .ivu-select-selected-value {
+            color: #67B6E5;
+            font-size: 15px;
+        }
+
+        .my-select > > > .ivu-select-input {
+            color: #67B6E5;
+            font-size: 13px;
+        }
+</style>

+ 116 - 0
TEAMModelOS.Admin/ClientApp/src/http.js

@@ -0,0 +1,116 @@
+import axios from 'axios';
+
+axios.defaults.timeout = 10000;
+axios.defaults.baseURL = '';
+
+//http request 拦截器
+axios.interceptors.request.use(
+    config => {
+        // const token = getCookie('名称');注意使用的时候需要引入cookie方法,推荐js-cookie
+        config.data = JSON.stringify(config.data);
+        config.headers = {
+            'Content-Type': 'application/json'
+        }
+        // if(token){
+        //   config.params = {'token':token}
+        // }
+        return config;
+    },
+    error => {
+        return Promise.reject(err);
+    }
+);
+
+
+//http response 拦截器
+axios.interceptors.response.use(
+    response => {
+        if (response.data.errCode == 2) {
+            router.push({
+                path: "/login",
+                querry: { redirect: router.currentRoute.fullPath }//从哪个页面跳转
+            })
+        }
+        return response;
+    },
+    error => {
+        return Promise.reject(error)
+    }
+)
+
+
+/**
+ * 封装get方法
+ * @param url
+ * @param data
+ * @returns {Promise}
+ */
+
+export function get(url, params = {}) {
+    return new Promise((resolve, reject) => {
+        axios.get(url, {
+            params: params
+        })
+            .then(response => {
+                resolve(response.data);
+            })
+            .catch(err => {
+                reject(err)
+            })
+    })
+}
+
+
+/**
+ * 封装post请求
+ * @param url
+ * @param data
+ * @returns {Promise}
+ */
+
+export function post(url, data = {}) {
+    return new Promise((resolve, reject) => {
+        axios.post(url, data)
+            .then(response => {
+                resolve(response.data);
+            }, err => {
+                reject(err)
+            })
+    })
+}
+
+/**
+* 封装patch请求
+* @param url
+* @param data
+* @returns {Promise}
+*/
+
+export function patch(url, data = {}) {
+    return new Promise((resolve, reject) => {
+        axios.patch(url, data)
+            .then(response => {
+                resolve(response.data);
+            }, err => {
+                reject(err)
+            })
+    })
+}
+
+/**
+* 封装put请求
+* @param url
+* @param data
+* @returns {Promise}
+*/
+
+export function put(url, data = {}) {
+    return new Promise((resolve, reject) => {
+        axios.put(url, data)
+            .then(response => {
+                resolve(response.data);
+            }, err => {
+                reject(err)
+            })
+    })
+}

+ 15 - 0
TEAMModelOS.Admin/ClientApp/src/i18n.js

@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+Vue.use(VueI18n)
+
+// 以下为语言包单独设置的场景,单独设置时语言包需单独引入
+const messages = {
+    'zh-CN': require('./assets/i18n/zh-cn/zh-cn'),   // 中文簡體语言包
+    'en': require('./assets/i18n/en-us/en-us'),    // 英文语言包
+    'zh-TW': require('./assets/i18n/zh-tw/zh-tw')    // 中文繁體
+}
+
+export default new VueI18n({
+    locale: 'zh-CN', // set locale 默认显示英文
+    messages: messages // set locale messages
+})

+ 20 - 0
TEAMModelOS.Admin/ClientApp/src/main.js

@@ -0,0 +1,20 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router/AdminRouter'
+import store from './store'
+import iView from 'iview'
+import i18n from './i18n'
+import 'iview/dist/styles/iview.css';
+import api from './api.js'
+import animate from 'animate.css'
+
+Vue.use(animate);
+Vue.prototype.$api = api;
+Vue.config.productionTip = false
+Vue.use(iView);
+new Vue({
+    router,
+    store,
+    i18n,
+    render: h => h(App)
+}).$mount('#app')

+ 65 - 0
TEAMModelOS.Admin/ClientApp/src/router/AdminRouter.js

@@ -0,0 +1,65 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Home from '@/views/admin/Home.vue'
+import Login from '@/views/admin/LoginPage.vue'
+
+Vue.use(Router)
+
+export default new Router({
+    mode: 'history',
+    base: process.env.BASE_URL,
+    routes: [
+        {
+            path: '/', 
+            redirect:'/Login',
+        },
+        {
+            path: '/Login',
+            name: 'Login',
+            component: Login
+        },
+        {
+            path: '/Home',
+            name: 'Home',
+            component: Home,
+            children: [
+                {
+                    path: 'RoleManage',
+                    name: 'RoleManage',
+                    component: () => import('@/views/admin/RoleManage.vue')
+                },
+                {
+                    path: 'UserManage',
+                    name: 'UserManage',
+                    component: () => import('@/views/admin/UserManage.vue')
+                },
+                {
+                    path: 'ClassEvaluation',
+                    name: 'ClassEvaluation',
+                    component: () => import('@/views/admin/ClassEvaluation.vue')
+                },
+                {
+                    path: 'DormEvaluation',
+                    name: 'DormEvaluation',
+                    component: () => import('@/views/admin/DormEvaluation.vue')
+                },
+                {
+                    path: 'StudentEvaluation',
+                    name: 'StudentEvaluation',
+                    component: () => import('@/views/admin/StudentEvaluation.vue')
+                },
+                {
+                    path: 'SelfEvaluation',
+                    name: 'SelfEvaluation',
+                    component: () => import('@/views/admin/SelfEvaluation.vue')
+                }
+
+            ]
+        },
+        {
+            path: '/ShcoolAccount',
+            name: 'ShcoolAccount',
+            component: () => import( '@/views/admin/ShcoolAccount.vue')
+        }
+    ]
+})

+ 50 - 0
TEAMModelOS.Admin/ClientApp/src/router/BizRouter .js

@@ -0,0 +1,50 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Home from './views/admin/Home.vue'
+import Login from './views/admin/LoginPage.vue'
+
+Vue.use(Router)
+
+export default new Router({
+    mode: 'history',
+    base: process.env.BASE_URL,
+    routes: [
+        {
+            path: '/', 
+            redirect:'/Login',
+        },
+        {
+            path: '/Login',
+            name: 'Login',
+            component: Login
+        },
+        {
+            path: '/Home',
+            name: 'Home',
+            component: Home,
+            children: [
+                {
+                    path: 'RoleManage',
+                    name: 'RoleManage',
+                    component: () => import('./views/admin/RoleManage.vue')
+                },
+                {
+                    path: 'UserManage',
+                    name: 'UserManage',
+                    component: () => import('./views/admin/UserManage.vue')
+                },
+                {
+                    path: 'ClassEvaluation',
+                    name: 'ClassEvaluation',
+                    component: () => import('./views/admin/ClassEvaluation.vue')
+                }
+
+            ]
+        },
+        {
+            path: '/ShcoolAccount',
+            name: 'ShcoolAccount',
+            component: () => import( './views/admin/ShcoolAccount.vue')
+        }
+    ]
+})

+ 16 - 0
TEAMModelOS.Admin/ClientApp/src/store.js

@@ -0,0 +1,16 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  state: {
+
+  },
+  mutations: {
+
+  },
+  actions: {
+
+  }
+})

+ 113 - 0
TEAMModelOS.Admin/ClientApp/src/tools/excel.js

@@ -0,0 +1,113 @@
+/* eslint-disable */
+import XLSX from 'xlsx';
+
+function auto_width(ws, data) {
+    /*set worksheet max width per col*/
+    const colWidth = data.map(row => row.map(val => {
+        /*if null/undefined*/
+        if (val == null) {
+            return { 'wch': 10 };
+        }
+        /*if chinese*/
+        else if (val.toString().charCodeAt(0) > 255) {
+            return { 'wch': val.toString().length * 2 };
+        } else {
+            return { 'wch': val.toString().length };
+        }
+    }))
+    /*start in the first row*/
+    let result = colWidth[0];
+    for (let i = 1; i < colWidth.length; i++) {
+        for (let j = 0; j < colWidth[i].length; j++) {
+            if (result[j]['wch'] < colWidth[i][j]['wch']) {
+                result[j]['wch'] = colWidth[i][j]['wch'];
+            }
+        }
+    }
+    ws['!cols'] = result;
+}
+
+function json_to_array(key, jsonData) {
+    return jsonData.map(v => key.map(j => { return v[j] }));
+}
+
+// fix data,return string
+function fixdata(data) {
+    let o = ''
+    let l = 0
+    const w = 10240
+    for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
+    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
+    return o
+}
+
+// get head from excel file,return array
+function get_header_row(sheet) {
+    const headers = []
+    const range = XLSX.utils.decode_range(sheet['!ref'])
+    let C
+    const R = range.s.r /* start in the first row */
+    for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
+        var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */
+        var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
+        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
+        headers.push(hdr)
+    }
+    return headers
+}
+
+export const export_table_to_excel = (id, filename) => {
+    const table = document.getElementById(id);
+    const wb = XLSX.utils.table_to_book(table);
+    XLSX.writeFile(wb, filename);
+
+    /* the second way */
+    // const table = document.getElementById(id);
+    // const wb = XLSX.utils.book_new();
+    // const ws = XLSX.utils.table_to_sheet(table);
+    // XLSX.utils.book_append_sheet(wb, ws, filename);
+    // XLSX.writeFile(wb, filename);
+}
+
+export const export_json_to_excel = ({ data, key, title, filename, autoWidth }) => {
+    const wb = XLSX.utils.book_new();
+    data.unshift(title);
+    const ws = XLSX.utils.json_to_sheet(data, { header: key, skipHeader: true });
+    if (autoWidth) {
+        const arr = json_to_array(key, data);
+        auto_width(ws, arr);
+    }
+    XLSX.utils.book_append_sheet(wb, ws, filename);
+    XLSX.writeFile(wb, filename + '.xlsx');
+}
+
+export const export_array_to_excel = ({ key, data, title, filename, autoWidth }) => {
+    const wb = XLSX.utils.book_new();
+    const arr = json_to_array(key, data);
+    arr.unshift(title);
+    const ws = XLSX.utils.aoa_to_sheet(arr);
+    if (autoWidth) {
+        auto_width(ws, arr);
+    }
+    XLSX.utils.book_append_sheet(wb, ws, filename);
+    XLSX.writeFile(wb, filename + '.xlsx');
+}
+
+export const read = (data, type) => {
+    /* if type == 'base64' must fix data first */
+    // const fixedData = fixdata(data)
+    // const workbook = XLSX.read(btoa(fixedData), { type: 'base64' })
+    const workbook = XLSX.read(data, { type: type });
+    const firstSheetName = workbook.SheetNames[0];
+    const worksheet = workbook.Sheets[firstSheetName];
+    const header = get_header_row(worksheet);
+    const results = XLSX.utils.sheet_to_json(worksheet);
+    return { header, results };
+}
+
+export default {
+    export_table_to_excel,
+    export_array_to_excel,
+    export_json_to_excel,
+    read
+}

+ 66 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/ClassEvaluation.vue

@@ -0,0 +1,66 @@
+<template>
+    <div>
+        <h2 class="title">班级评价标准</h2>
+        <Button type="primary" shape="circle" :icon="importExcel ? 'md-search' : 'md-add-circle'" class="toggle-btn" @click="toggle">{{importExcel?'查看标准':'批量导入'}}</Button>
+        <ImportExcel v-if="importExcel" class="animated slideInUp"></ImportExcel>
+        <Table v-if="!importExcel" class="animated slideInUp" stripe :columns="columns" :data="data"></Table>
+    </div>
+</template>
+<script>
+    import ImportExcel from '@/components/ImportExcel.vue'
+    export default {
+        data() {
+            return {
+                importExcel: false,
+                columns: [
+                    {
+                        title: '评价类型',
+                        key: 'name'
+                    },
+                    {
+                        title: '检查名称',
+                        key: 'age'
+                    },
+                    {
+                        title: '检查类型',
+                        key: 'address'
+                    },
+                    {
+                        title: '表扬/待改进',
+                        key:'praise'
+                    },
+                    {
+                        title: '指标',
+                        key: 'standard'
+                    },
+                    {
+                        title: '分值',
+                        key: 'score'
+                    }
+                ],
+                data:[]
+            }
+        },
+        components: {
+            ImportExcel
+        },
+        methods: {
+            toggle() {
+                this.importExcel = !this.importExcel;
+            }
+        },
+        mounted() {
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align: center;
+        margin-bottom: 15px;
+    }
+    .toggle-btn {
+        padding: 3px 12px;
+        float: right;
+        margin-top: -45px;
+    }
+</style>

+ 66 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/DormEvaluation.vue

@@ -0,0 +1,66 @@
+<template>
+    <div>
+        <h2 class="title">寝室评价标准</h2>
+        <Button type="primary" shape="circle" :icon="importExcel ? 'md-search' : 'md-add-circle'" class="toggle-btn" @click="toggle">{{importExcel?'查看标准':'批量导入'}}</Button>
+        <ImportExcel v-if="importExcel" class="animated slideInUp"></ImportExcel>
+        <Table v-if="!importExcel" class="animated slideInUp" stripe :columns="columns" :data="data"></Table>
+    </div>
+</template>
+<script>
+    import ImportExcel from '@/components/ImportExcel.vue'
+    export default {
+        data() {
+            return {
+                importExcel: false,
+                columns: [
+                    {
+                        title: '评价类型',
+                        key: 'name'
+                    },
+                    {
+                        title: '检查名称',
+                        key: 'age'
+                    },
+                    {
+                        title: '检查类型',
+                        key: 'address'
+                    },
+                    {
+                        title: '表扬/待改进',
+                        key:'praise'
+                    },
+                    {
+                        title: '指标',
+                        key: 'standard'
+                    },
+                    {
+                        title: '分值',
+                        key: 'score'
+                    }
+                ],
+                data:[]
+            }
+        },
+        components: {
+            ImportExcel
+        },
+        methods: {
+            toggle() {
+                this.importExcel = !this.importExcel;
+            }
+        },
+        mounted() {
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align: center;
+        margin-bottom: 15px;
+    }
+    .toggle-btn {
+        padding: 3px 12px;
+        float: right;
+        margin-top: -45px;
+    }
+</style>

+ 153 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/Home.vue

@@ -0,0 +1,153 @@
+<template>
+    <div class="layout">
+        <Layout>
+            <Header class="header">
+                <Menu mode="horizontal" theme="dark" active-name="1">
+                    <div class="layout-logo">
+                        <img src="@/assets/img/logo.png" height="40" />
+                    </div>
+                    <div style="float:right;line-height:62px;margin-right:30px;">
+                        <Dropdown @on-click="personMenu">
+                            <a href="javascript:void(0)">
+                                <Avatar src="https://i.loli.net/2017/08/21/599a521472424.jpg" />
+                            </a>
+                            <DropdownMenu slot="list" >
+                                <DropdownItem v-for="(item,index) in menuInfo.personMenu" :key="index" :name ="item.name">{{ item.label }}</DropdownItem>
+                            </DropdownMenu>
+                        </Dropdown>
+                    </div>
+                    <div class="layout-nav">
+                        <Menu mode="horizontal" theme="dark">
+                            <Submenu v-for="(item,index) in menuInfo.systemMenu" :name="item.name" :key="index">
+                                <template slot="title">
+                                    <Icon :type="item.icon" />
+                                    {{item.label}}
+                                </template>
+                                <MenuItem v-for="(subItem,subIndex) in item.subItem" :key="subIndex" :name="subItem.name" @click.native="getSystemRouter(item.label,subItem.label)">{{subItem.label}}</MenuItem>
+                            </Submenu>
+                        </Menu>
+                    </div>
+                </Menu>
+            </Header>
+            <Layout class="body">
+                <Sider hide-trigger style="background: #fff;height:100%;">
+                    <Menu active-name="1-2" theme="dark" width="240px" :open-names="['1']" accordion>
+                        <Submenu v-for="(item,index) in menuInfo.moralSecondMenu" :key="index" :name="item.name">
+                            <template slot="title">
+                                <Icon :type="item.icon" size="18"></Icon>
+                                {{item.label}}
+                            </template>
+                            <MenuItem v-for="(subItem, subIndex) in item.subItem" :key="subIndex" :name="subItem.name" :to="subItem.router" @click.native="currentRouter(item.label,subItem.label)">{{subItem.label}}</MenuItem>
+                        </Submenu>
+                    </Menu>
+                </Sider>
+                <Layout :style="{padding: '0 80px 24px'}">
+                    <Breadcrumb :style="{margin: '24px 0'}" separator="<b class='breadcrumb-separator'>></b>">
+                        <BreadcrumbItem v-for="(item,index) in systemRouter" :key="index">{{item}}</BreadcrumbItem>
+                        <BreadcrumbItem v-for="(item,index) in breadCrumbList" :key="index">{{item}}</BreadcrumbItem>
+                    </Breadcrumb>
+                    <Content :style="{padding: '24px', minHeight: '280px', background: '#fff'}">
+                        <router-view>
+                        </router-view>
+                    </Content>
+                </Layout>
+            </Layout>
+        </Layout>
+    </div>
+</template>
+
+<script>
+// @ is an alias to /src
+
+export default {
+        data() {
+            return {
+                menuInfo: {},
+                systemRouter: ["平台模块", "德育系统"],
+                breadCrumbList: []
+            }
+        },
+        mounted() {
+            this.menuInfo = require("@/assets/static/menu-info.json");
+            console.log(this.menuInfo);
+            this.$api.testApi({
+                test: "456"
+            }).then(
+                (res) => {
+                    console.log(res);
+                },
+                (err) => {
+                    console.log(err);
+                }
+            );
+        },
+        methods: {
+            currentRouter(item, subItem) {
+                this.breadCrumbList = this.breadCrumbList.slice(0, 0);
+                this.breadCrumbList.push(item);
+                this.breadCrumbList.push(subItem);
+            },
+            getSystemRouter(item, subItem) {
+                this.systemRouter = this.systemRouter.slice(0, 0);
+                this.breadCrumbList = this.breadCrumbList.slice(0, 0);
+                this.systemRouter.push(item);
+                this.systemRouter.push(subItem);
+            },
+            personMenu(name) {
+                switch (name) {
+                    case 'logout':
+                        this.$router.push({
+                            path: this.menuInfo.personMenu[2].router
+                        });
+                        break;
+                }
+            }
+        }
+}
+</script>
+<style scoped>
+    .layout {
+        background: #f5f7f9;
+        position: relative;
+        overflow: hidden;
+        height:100%;
+    }
+
+    .layout-logo {
+        border-radius: 3px;
+        float: left;
+        position: relative;
+        top: 10px;
+        left: 18px;
+        display:flex;
+        flex-direction:row;
+        align-items:center;
+    }
+
+    .layout-nav {
+        margin: 0 auto;
+        float:right;
+        margin-right: 20px;
+    }
+    .breadcrumb-separator {
+        color:#3399ff;
+    }
+    .layout /deep/ .ivu-layout {
+        height: 100%;
+    }
+    .layout /deep/ .ivu-menu-light {
+        height:100%;
+        padding-top:15px;
+    }
+    .layout /deep/ .ivu-layout-header {
+        background-color:#001529;
+    }
+    .header /deep/ .ivu-menu-dark {
+        background:#001529;
+    }
+    .body /deep/ .ivu-menu {
+        height:100%;
+        padding-top:16px;
+    }
+
+</style>

+ 130 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/LoginPage.vue

@@ -0,0 +1,130 @@
+<template>
+    <div class="login">
+        <div class="drag">
+            <div style="background:rgba(255,255,255,0.1); border-radius:5px;" >
+                <Card icon="log-in" title="欢迎登录" :bordered="false" class="login-card">
+                    <div class="form-con">
+                        <Form ref="loginForm" :model="form" :rules="rules" @keydown.enter.native="handleSubmit">
+                            <FormItem prop="userName">
+                                <Input v-model="form.userName" placeholder="请输入用户名">
+                                <span slot="prepend">
+                                    <Icon :size="16" type="ios-person"></Icon>
+                                </span>
+                                </Input>
+                            </FormItem>
+                            <FormItem prop="password">
+                                <Input type="password" v-model="form.password" placeholder="请输入密码">
+                                <span slot="prepend">
+                                    <Icon :size="14" type="md-lock"></Icon>
+                                </span>
+                                </Input>
+                            </FormItem>
+                            <FormItem>
+                                <Button @click="handleSubmit" type="primary" long>登录</Button>
+                            </FormItem>
+                        </Form>
+                        <p class="login-tip">输入任意用户名和密码即可</p>
+                    </div>
+                </Card>
+            </div>
+        </div>
+        
+        
+    </div>
+</template>
+<script>
+    export default {
+        name: 'LoginForm',
+        props: {
+            userNameRules: {
+                type: Array,
+                default: () => {
+                    return [
+                        { required: true, message: '账号不能为空', trigger: 'blur' }
+                    ]
+                }
+            },
+            passwordRules: {
+                type: Array,
+                default: () => {
+                    return [
+                        { required: true, message: '密码不能为空', trigger: 'blur' }
+                    ]
+                }
+            }
+        },
+        data() {
+            return {
+                form: {
+                    userName: 'super_admin',
+                    password: ''
+                }
+            }
+        },
+        computed: {
+            rules() {
+                return {
+                    userName: this.userNameRules,
+                    password: this.passwordRules
+                }
+            }
+        },
+        methods: {
+            handleSubmit() {
+                this.$refs.loginForm.validate((valid) => {
+                    if (valid) {
+                        if (this.password == 'habook') {
+                            this.$router.push({ path: '/home' });
+                        } else {
+                            this.$router.push({ path: '/home' });
+                        }
+                    }
+                })
+            }
+        }
+    }
+</script>
+<style scoped>
+    .login {
+        background-image:url('../../assets/img/login_bg.jpg');
+        width:100%;
+        height:100%;
+        background-size:cover;
+        display:flex;
+        flex-direction:row;
+        align-items:center;
+        justify-content:center;
+    }
+        .login:after {
+            content: "";
+            width: 100%;
+            height: 100%;
+            position: absolute;
+            left: 0;
+            top: 0;
+            background: inherit;
+            filter: blur(4px);
+            z-index: 1;
+        }
+    .drag {
+        position: absolute;
+        text-align: center;
+        z-index: 11;
+        border-radius: 5px;
+        box-shadow: 0 0 10px 6px rgba(0,0,0,.5);
+        width: 90%;
+        max-width: 350px;
+    }
+    .login-tip {
+        color:white;
+    }
+    .drag >>> .ivu-card-head p span {
+        color:white;
+        font-size:18px;
+    }
+    .login-card {
+        background: none;
+        color: white;
+        width:100%;
+    }
+</style>

+ 243 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/RoleManage.vue

@@ -0,0 +1,243 @@
+<template>
+    <div class="animated slideInUp home">
+        <h2 class="title">系统角色管理</h2>
+        <Table border :columns="tableColumns" :data="tableData" width="80%">
+            <template slot-scope="{ row ,index }" slot="role">
+                <strong><Input v-model="row.role" placeholder="" :disabled="index != currentIndex" :class="index != currentIndex ? 'disabeld-status' : ''" @on-blur="tableData[index].role = row.role "/></strong>
+            </template>
+            <template slot-scope="{ row ,index }" slot="auth">
+                <Input v-model="row.auth.join(' / ')" placeholder="" :disabled="index != currentIndex" :class="index != currentIndex ? 'disabeld-status' : ''" @on-focus="showDialog" />
+            </template>
+            <template slot-scope="{ row, index }" slot="operation">
+                <Button type="primary" size="small" style="margin-right: 5px" @click="update(index)">{{index != currentIndex ? '修改' : '保存'}}</Button>
+                <Button type="error" size="small" @click="remove(index)">删除</Button>
+            </template>
+        </Table>
+        <Button type="info" size="small" @click="addRole()" style="margin-top:15px;">添加用户角色</Button>
+        <Modal v-model="dialogStatus"
+               @on-ok="confirm"
+               @on-cancel="cancel" class="auth-wrap" width="1000px">
+            <div slot="header">
+                <span class="modal-title">设置角色权限</span>
+                <Checkbox style="margin-left:30px;" :value="checkAll" :indeterminate="indeterminate" @click.prevent.native="handleCheckAll">全选</Checkbox>
+                <!--<Checkbox style="margin-left:30px;" :indeterminate="indeterminate" @click.prevent.native="handleCheckReverse">反选</Checkbox>-->
+            </div>
+            <CheckboxGroup v-model="roleAuths" @on-change="checkAllGroupChange">
+                <Row>
+                    <Col :xs="24" :sm="12" :md="12" :lg="12" v-for="(item,index) in auths" :key="index">
+                    <Checkbox class="auth-item" :label="item.name">
+                        <div class="auth-content">
+                            <p><strong>{{item.name}}</strong></p>
+                            <p style="color:#999999">{{item.description}}</p>
+                        </div>
+                    </Checkbox>
+                    </Col>
+                </Row>
+
+            </CheckboxGroup>
+        </Modal>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'home',
+        components: {
+
+        },
+        data() {
+            return {
+                roleAuths: [],
+                indeterminate: false,
+                checkAll: false,
+                currentIndex: -1,
+                dialogStatus:false,
+                tableColumns: [
+                    {
+                        title: '系统角色',
+                        slot: 'role',
+                        width:'200'
+                    },
+                    {
+                        title: '角色权限',
+                        slot: 'auth'
+                    },
+                    {
+                        title: '操作',
+                        slot: 'operation',
+                        width: 150,
+                        align: 'center'
+                    }
+                ],
+                tableData: [
+                    {
+                        role: "系统管理员",
+                        auth: [
+                            "系统管理员权限"
+                        ]
+                    },
+                    {
+                        role: "系统管理员",
+                        auth: [
+                            "主管领导权限"
+                        ]
+                    },
+                    {
+                        role: "系统管理员",
+                        auth: [
+                            "校长权限"
+                        ]
+                    },
+                    {
+                        role: "系统管理员",
+                        auth: [
+                            "区域管理权限"
+                        ]
+                    }
+                ],
+                auths: [
+                    {
+                        id: "1",
+                        name: "系统管理员权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "2",
+                        name: "区域管理权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "3",
+                        name: "校长权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "4",
+                        name: "主管领导权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "5",
+                        name: "班主任理权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "6",
+                        name: "科任老师权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "7",
+                        name: "学生权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    }
+                ]
+            }
+        },
+        methods: {
+            update(index) {
+                if (this.currentIndex == -1) {
+                    this.currentIndex = index;
+                    this.roleAuths = this.tableData[index].auth;
+                } else {
+                    this.currentIndex = -1;
+                }
+            },
+            remove(index) {
+                this.tableData.splice(index, 1);
+            },
+            confirm() {
+                this.tableData[this.currentIndex].auth = this.roleAuths;
+            },
+            cancel() {
+                this.$Message.info('Clicked cancel');
+            },
+            showDialog() {
+                undefined
+                this.dialogStatus = true;
+            },
+            handleCheckAll() {
+                if (this.indeterminate) {
+                    this.checkAll = false;
+                } else {
+                    this.checkAll = !this.checkAll;
+                }
+                this.indeterminate = false;
+
+                if (this.checkAll) {
+                    this.roleAuths = [];
+                    for (let i = 0; i < this.auths.length; i++) {
+                        this.roleAuths.push(this.auths[i].name);
+                    }
+                    //this.roleAuths = ['香蕉', '苹果', '西瓜'];
+                } else {
+                    this.roleAuths = [];
+                }
+            },
+            addRole() {
+                this.tableData.push({
+                    role: "",
+                    auth:[]
+                });
+                this.currentIndex = this.tableData.length - 1;
+            },
+            checkAllGroupChange(data) {
+                if (data.length === this.auths.length) {
+                    this.indeterminate = false;//全部选中 √
+                    this.checkAll = true;
+                } else if (data.length > 0) {
+                    this.indeterminate = true;//选中一部分 -
+                    this.checkAll = false;
+                } else {
+                    this.indeterminate = false;//未选中 没有样式
+                    this.checkAll = false;
+                }
+            }
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align:center;
+        margin-bottom:15px;
+    }
+    .disabeld-status /deep/ .ivu-input {
+        border: none;
+    }
+
+    .disabeld-status /deep/ .ivu-input-disabled {
+        background-color: transparent;
+        color: black;
+    }
+    .auth-item {
+        width:90%;
+        padding:5px 12px 15px 12px;
+        margin-left:5%;
+        margin-top:10px;
+        border-bottom:1px solid #eeeeee;
+    }
+        .auth-item:hover {
+            box-shadow: 0px 1px 2px;
+        }
+        .auth-item /deep/ .ivu-checkbox {
+            float:right;
+            margin-top:12px;
+        }
+
+    .auth-content {
+        text-align: left;
+        display:inline;
+        float:left;
+    }
+        .auth-content p {
+            font-size:15px;
+        }
+    .auth-wrap /deep/ .ivu-modal-body {
+        max-height:600px;
+        overflow-y:scroll;
+    }
+    .modal-title {
+        font-size:16px;
+        font-weight:600;
+    }
+
+</style>

+ 66 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/SelfEvaluation.vue

@@ -0,0 +1,66 @@
+<template>
+    <div>
+        <h2 class="title">学生自评标准</h2>
+        <Button type="primary" shape="circle" :icon="importExcel ? 'md-search' : 'md-add-circle'" class="toggle-btn" @click="toggle">{{importExcel?'查看标准':'批量导入'}}</Button>
+        <ImportExcel v-if="importExcel" class="animated slideInUp"></ImportExcel>
+        <Table v-if="!importExcel" class="animated slideInUp" stripe :columns="columns" :data="data"></Table>
+    </div>
+</template>
+<script>
+    import ImportExcel from '@/components/ImportExcel.vue'
+    export default {
+        data() {
+            return {
+                importExcel: false,
+                columns: [
+                    {
+                        title: '评价类型',
+                        key: 'name'
+                    },
+                    {
+                        title: '检查名称',
+                        key: 'age'
+                    },
+                    {
+                        title: '检查类型',
+                        key: 'address'
+                    },
+                    {
+                        title: '表扬/待改进',
+                        key:'praise'
+                    },
+                    {
+                        title: '指标',
+                        key: 'standard'
+                    },
+                    {
+                        title: '分值',
+                        key: 'score'
+                    }
+                ],
+                data:[]
+            }
+        },
+        components: {
+            ImportExcel
+        },
+        methods: {
+            toggle() {
+                this.importExcel = !this.importExcel;
+            }
+        },
+        mounted() {
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align: center;
+        margin-bottom: 15px;
+    }
+    .toggle-btn {
+        padding: 3px 12px;
+        float: right;
+        margin-top: -45px;
+    }
+</style>

+ 46 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/ShcoolAccount.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="about">
+        <select-school style="width:55%;float:left;" @school-info="getSchoolInfo"></select-school>
+        <Tag type="dot" closable v-show="schoolName != '00'">{{schoolName}}</Tag>
+        <!--<Form :model="formItem" :label-width="80">
+            <FormItem label="Input">
+                <Input  placeholder="Enter something..."></Input>
+            </FormItem>
+        </Form>-->
+    </div>
+</template>
+<script>
+    import SelectSchool from "@/components/SelectSchool.vue"
+    export default {
+        data() {
+            return {
+                schoolInfo: {}
+            }
+        },
+        components: {
+            SelectSchool
+        },
+        mounted() {
+
+        },
+        methods: {
+            getSchoolInfo(data) {
+                console.log(data);
+                this.schoolInfo = data;
+            }
+        },
+        computed: {
+            schoolName() {
+                if (this.schoolInfo.checkCountry == 'CN' || this.schoolInfo.checkCountry == 'TW') {
+                    return this.schoolInfo.school.name;
+                } else if (this.schoolInfo.checkCountry == null) {
+                    return '00';
+                } else {
+                    return this.schoolInfo.school;
+                }
+            }
+        }
+    }
+</script>
+<style>
+</style>

+ 66 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/StudentEvaluation.vue

@@ -0,0 +1,66 @@
+<template>
+    <div>
+        <h2 class="title">学生评价标准</h2>
+        <Button type="primary" shape="circle" :icon="importExcel ? 'md-search' : 'md-add-circle'" class="toggle-btn" @click="toggle">{{importExcel?'查看标准':'批量导入'}}</Button>
+        <ImportExcel v-if="importExcel" class="animated slideInUp"></ImportExcel>
+        <Table v-if="!importExcel" class="animated slideInUp" stripe :columns="columns" :data="data"></Table>
+    </div>
+</template>
+<script>
+    import ImportExcel from '@/components/ImportExcel.vue'
+    export default {
+        data() {
+            return {
+                importExcel: false,
+                columns: [
+                    {
+                        title: '评价类型',
+                        key: 'name'
+                    },
+                    {
+                        title: '检查名称',
+                        key: 'age'
+                    },
+                    {
+                        title: '检查类型',
+                        key: 'address'
+                    },
+                    {
+                        title: '表扬/待改进',
+                        key:'praise'
+                    },
+                    {
+                        title: '指标',
+                        key: 'standard'
+                    },
+                    {
+                        title: '分值',
+                        key: 'score'
+                    }
+                ],
+                data:[]
+            }
+        },
+        components: {
+            ImportExcel
+        },
+        methods: {
+            toggle() {
+                this.importExcel = !this.importExcel;
+            }
+        },
+        mounted() {
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align: center;
+        margin-bottom: 15px;
+    }
+    .toggle-btn {
+        padding: 3px 12px;
+        float: right;
+        margin-top: -45px;
+    }
+</style>

+ 258 - 0
TEAMModelOS.Admin/ClientApp/src/views/admin/UserManage.vue

@@ -0,0 +1,258 @@
+<template>
+    <div class="animated slideInUp home">
+        <h2 class="title">用户信息管理</h2>
+        <Table border :columns="tableColumns" :data="tableData" width="80%" >
+            <template slot-scope="{ row ,index }" slot="name">
+                <strong><Input v-model="row.name" placeholder="" :disabled="index != currentIndex" :class="index != currentIndex ? 'disabeld-status' : ''" @on-blur="tableData[index].role = row.role " /></strong>
+            </template>
+            <template slot-scope="{ row ,index }" slot="account">
+                <Input v-model="row.account" placeholder="" :disabled="index != currentIndex" :class="index != currentIndex ? 'disabeld-status' : ''"  @on-blur="tableData[index].role = row.role " />
+            </template>
+            <template slot-scope="{ row ,index }" slot="school">
+                <Input v-model="row.school" placeholder="" :disabled="index != currentIndex" :class="index != currentIndex ? 'disabeld-status' : ''"  @on-blur="tableData[index].role = row.role " />
+            </template>
+            <template slot-scope="{ row, index }" slot="password">
+                <Button type="warning" size="small">重置密码</Button>
+            </template>
+            <template slot-scope="{ row, index }" slot="operation">
+                <Button type="primary" size="small" style="margin-right: 5px" @click="update(index)">{{index != currentIndex ? '修改' : '保存'}}</Button>
+                <Button type="error" size="small" @click="remove(index)">删除</Button>
+            </template>
+
+        </Table>
+        <Button type="info" size="small" @click="addRole()" style="margin-top:15px;">创建用户账号</Button>
+        <Modal v-model="dialogStatus"
+               @on-ok="confirm"
+               @on-cancel="cancel" class="auth-wrap" width="1000px">
+            <div slot="header">
+                <span class="modal-title">设置角色权限</span>
+                <Checkbox style="margin-left:30px;" :value="checkAll" :indeterminate="indeterminate" @click.prevent.native="handleCheckAll">全选</Checkbox>
+                <!--<Checkbox style="margin-left:30px;" :indeterminate="indeterminate" @click.prevent.native="handleCheckReverse">反选</Checkbox>-->
+            </div>
+            <CheckboxGroup v-model="roleAuths" @on-change="checkAllGroupChange">
+                <Row>
+                    <Col :xs="24" :sm="12" :md="12" :lg="12" v-for="(item,index) in auths" :key="index">
+                    <Checkbox class="auth-item" :label="item.name">
+                        <div class="auth-content">
+                            <p><strong>{{item.name}}</strong></p>
+                            <p style="color:#999999">{{item.description}}</p>
+                        </div>
+                    </Checkbox>
+                    </Col>
+                </Row>
+
+            </CheckboxGroup>
+        </Modal>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'home',
+        components: {
+
+        },
+        data() {
+            return {
+                roleAuths: [],
+                indeterminate: false,
+                checkAll: false,
+                currentIndex: -1,
+                dialogStatus:false,
+                tableColumns: [
+                    {
+                        title: '用户名',
+                        slot: 'name',
+                        width:'200'
+                    },
+                    {
+                        title: '账号',
+                        slot: 'account',
+                        width:'200'
+                    },
+                    {
+                        title: '学校',
+                        slot: 'school',
+                        align: 'center'
+                    },
+                    {
+                        title: '密码',
+                        slot: 'password',
+                        width: '150',
+                        align: 'center'
+                    },
+                    {
+                        title: '操作',
+                        slot: 'operation',
+                        width:'200',
+                        align: 'center'
+                    }
+                ],
+                tableData: [
+                    {
+                        name: "系统管理员",
+                        account: "habook",
+                        school:"紫藤小学"
+                    },
+                    {
+                        name: "系统管理员",
+                        account: "habook",
+                        school:"紫藤小学"
+                    },
+                    {
+                        name: "系统管理员",
+                        account: "habook",
+                        school:"紫藤小学"
+                    },
+                    {
+                        name: "系统管理员",
+                        account: "habook",
+                        school:"紫藤小学"
+                    }
+                ],
+                auths: [
+                    {
+                        id: "1",
+                        name: "系统管理员权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "2",
+                        name: "区域管理权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "3",
+                        name: "校长权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "4",
+                        name: "主管领导权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "5",
+                        name: "班主任理权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "6",
+                        name: "科任老师权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    },
+                    {
+                        id: "7",
+                        name: "学生权限",
+                        description: "拥有系统所有数据的操作权限 "
+                    }
+                ]
+            }
+        },
+        methods: {
+            update(index) {
+                if (this.currentIndex == -1) {
+                    this.currentIndex = index;
+                    this.roleAuths = this.tableData[index].auth;
+                } else {
+                    this.currentIndex = -1;
+                }
+            },
+            remove(index) {
+                this.tableData.splice(index, 1);
+            },
+            confirm() {
+                this.tableData[this.currentIndex].auth = this.roleAuths;
+            },
+            cancel() {
+                this.$Message.info('Clicked cancel');
+            },
+            showDialog() {
+                undefined
+                this.dialogStatus = true;
+            },
+            handleCheckAll() {
+                if (this.indeterminate) {
+                    this.checkAll = false;
+                } else {
+                    this.checkAll = !this.checkAll;
+                }
+                this.indeterminate = false;
+
+                if (this.checkAll) {
+                    this.roleAuths = [];
+                    for (let i = 0; i < this.auths.length; i++) {
+                        this.roleAuths.push(this.auths[i].name);
+                    }
+                    //this.roleAuths = ['香蕉', '苹果', '西瓜'];
+                } else {
+                    this.roleAuths = [];
+                }
+            },
+            addRole() {
+                this.tableData.push({
+                    role: "",
+                    auth:[]
+                });
+                this.currentIndex = this.tableData.length - 1;
+            },
+            checkAllGroupChange(data) {
+                if (data.length === this.auths.length) {
+                    this.indeterminate = false;//全部选中 √
+                    this.checkAll = true;
+                } else if (data.length > 0) {
+                    this.indeterminate = true;//选中一部分 -
+                    this.checkAll = false;
+                } else {
+                    this.indeterminate = false;//未选中 没有样式
+                    this.checkAll = false;
+                }
+            }
+        }
+    }
+</script>
+<style scoped>
+    .title {
+        text-align:center;
+        margin-bottom:15px;
+    }
+    .disabeld-status /deep/ .ivu-input {
+        border: none;
+    }
+
+    .disabeld-status /deep/ .ivu-input-disabled {
+        background-color: transparent;
+        color: black;
+    }
+    .auth-item {
+        width:90%;
+        padding:5px 12px 15px 12px;
+        margin-left:5%;
+        margin-top:10px;
+        border-bottom:1px solid #eeeeee;
+    }
+        .auth-item:hover {
+            box-shadow: 0px 1px 2px;
+        }
+        .auth-item /deep/ .ivu-checkbox {
+            float:right;
+            margin-top:12px;
+        }
+
+    .auth-content {
+        text-align: left;
+        display:inline;
+        float:left;
+    }
+        .auth-content p {
+            font-size:15px;
+        }
+    .auth-wrap /deep/ .ivu-modal-body {
+        max-height:600px;
+        overflow-y:scroll;
+    }
+    .modal-title {
+        font-size:16px;
+        font-weight:600;
+    }
+
+</style>

+ 0 - 0
TEAMModelOS.Admin/ClientApp/src/views/biz/Home.vue


+ 31 - 0
TEAMModelOS.Admin/Controllers/HomeController.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using TEAMModelOS.Admin.Models;
+
+namespace TEAMModelOS.Admin.Controllers
+{
+    public class HomeController : Controller
+    {
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        public IActionResult Privacy()
+        {
+            return View();
+        }
+
+        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
+        public IActionResult Error()
+        {
+            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
+        }
+
+		
+	}
+}

+ 27 - 0
TEAMModelOS.Admin/JwtRsaFile/private.pem

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

+ 9 - 0
TEAMModelOS.Admin/JwtRsaFile/public.pem

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

+ 11 - 0
TEAMModelOS.Admin/Models/ErrorViewModel.cs

@@ -0,0 +1,11 @@
+using System;
+
+namespace TEAMModelOS.Admin.Models
+{
+    public class ErrorViewModel
+    {
+        public string RequestId { get; set; }
+
+        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+    }
+}

+ 24 - 0
TEAMModelOS.Admin/Program.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+
+namespace TEAMModelOS.Admin
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            CreateWebHostBuilder(args).Build().Run();
+        }
+
+        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
+            WebHost.CreateDefaultBuilder(args)
+                .UseStartup<Startup>();
+    }
+}

+ 27 - 0
TEAMModelOS.Admin/Properties/launchSettings.json

@@ -0,0 +1,27 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": false, 
+    "anonymousAuthentication": true, 
+    "iisExpress": {
+      "applicationUrl": "http://localhost:53532",
+      "sslPort": 44395
+    }
+  },
+  "profiles": {
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "TEAMModelOS.Admin": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:5001;http://localhost:5000",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}

+ 107 - 0
TEAMModelOS.Admin/Startup.cs

@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.HttpsPolicy;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.SpaServices.Webpack;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Context.Filter;
+using TEAMModelOS.SDK.Extension.HttpClient;
+using TEAMModelOS.SDK.Extension.JwtAuth;
+using TEAMModelOS.SDK.Extension.JwtAuth.Filters;
+using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
+using TEAMModelOS.Service.Core.Interfaces;
+
+namespace TEAMModelOS.Admin
+{
+    public class Startup
+    {
+        public Startup(IConfiguration configuration, IHostingEnvironment env)
+        {
+            Configuration = configuration;
+            var builder = new ConfigurationBuilder()
+               .SetBasePath(env.ContentRootPath)
+               .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
+               .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);//增加环境配置文件,新建项目默认有
+            this.Configuration = builder.Build();
+            BaseConfigModel.SetBaseConfig(Configuration, env.ContentRootPath, env.WebRootPath);
+        }
+
+        public IConfiguration Configuration { get; }
+
+        // This method gets called by the runtime. Use this method to add services to the container.
+        public void ConfigureServices(IServiceCollection services)
+        {
+            //services.Configure<CookiePolicyOptions>(options =>
+            //{
+            //    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
+            //    options.CheckConsentNeeded = context => true;
+            //    options.MinimumSameSitePolicy = SameSiteMode.None;
+            //});
+            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
+            //上传文件最大处理
+            services.Configure<FormOptions>(x =>
+            {
+                x.ValueLengthLimit = int.MaxValue;
+                x.MultipartBodyLengthLimit = long.MaxValue; // In case of multipart
+                x.MultipartHeadersLengthLimit = int.MaxValue;
+            });
+            //使用Blob配置
+            services.AddAzureBlobStorage().AddConnection(Configuration.GetSection("Azure:Blob").Get<AzureBlobOptions>());
+            //全局扫描基于IBusinessService接口的实现类
+            services.Scan(scan => scan.FromApplicationDependencies()
+               .AddClasses(classes => classes.AssignableTo<IBusinessService>())
+                   .AsImplementedInterfaces()
+                   .WithTransientLifetime());
+            //引入Jwt配置
+            services.JwtAuth(Configuration.GetSection("JwtSetting"));
+            //HttpContextAccessor,并用来访问HttpContext。
+            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
+            //Http   https://blog.yowko.com/httpclientfactory-dotnet-core-dotnet-framework/
+            //services.AddHttpClient();
+			services.AddHttp();
+			//services.AddTransient<ITeamModelUserService, ITeamModelUserService>();
+		}
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+				app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
+				{
+					HotModuleReplacement = true
+				});
+			}
+            else
+            {
+                app.UseExceptionHandler("/Home/Error");
+                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+                app.UseHsts();
+            }
+
+            app.UseHttpsRedirection();
+            app.UseStaticFiles();
+            //app.UseCookiePolicy();
+            app.UseMiddleware<JwtAuthorizationFilter>();
+            app.UseMiddleware<HttpGlobalExceptionInvoke>();
+            app.UseMvc(routes =>
+            {
+                routes.MapRoute(
+                    name: "default",
+                    template: "{controller=Home}/{action=Index}/{id?}");
+				routes.MapSpaFallbackRoute(
+					name: "spa-fallback",
+					defaults: new { controller = "Home", action = "Index" });
+			});
+        }
+    }
+}

+ 20 - 0
TEAMModelOS.Admin/TEAMModelOS.Admin.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
+  </PropertyGroup>
+
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.App" />
+  </ItemGroup>
+
+
+  <ItemGroup>
+    <ProjectReference Include="..\TEAMModelOS.Api\TEAMModelOS.Api.csproj" />
+    <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
+    <ProjectReference Include="..\TEAMModelOS.Service\TEAMModelOS.Service.csproj" />
+  </ItemGroup>
+
+</Project>

+ 9 - 0
TEAMModelOS.Admin/Views/Home/Index.cshtml

@@ -0,0 +1,9 @@
+@{
+    ViewData["Title"] = "醍摩豆德育后台管理系统";
+}
+
+<div id="app"></div>
+
+@section scripts {
+    <script src="~/main.js" asp-append-version="true"></script>
+}

+ 25 - 0
TEAMModelOS.Admin/Views/Shared/Error.cshtml

@@ -0,0 +1,25 @@
+@model ErrorViewModel
+@{
+    ViewData["Title"] = "Error";
+}
+
+<h1 class="text-danger">Error.</h1>
+<h2 class="text-danger">An error occurred while processing your request.</h2>
+
+@if (Model.ShowRequestId)
+{
+    <p>
+        <strong>Request ID:</strong> <code>@Model.RequestId</code>
+    </p>
+}
+
+<h3>Development Mode</h3>
+<p>
+    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
+</p>
+<p>
+    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
+    It can result in displaying sensitive information from exceptions to end users.
+    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
+    and restarting the app.
+</p>

+ 25 - 0
TEAMModelOS.Admin/Views/Shared/_CookieConsentPartial.cshtml

@@ -0,0 +1,25 @@
+@using Microsoft.AspNetCore.Http.Features
+
+@{
+    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
+    var showBanner = !consentFeature?.CanTrack ?? false;
+    var cookieString = consentFeature?.CreateConsentCookie();
+}
+
+@if (showBanner)
+{
+    <div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert">
+        Use this space to summarize your privacy and cookie use policy. <a asp-area="" asp-controller="Home" asp-action="Privacy">Learn More</a>.
+        <button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
+            <span aria-hidden="true">Accept</span>
+        </button>
+    </div>
+    <script>
+        (function () {
+            var button = document.querySelector("#cookieConsent button[data-cookie-string]");
+            button.addEventListener("click", function (event) {
+                document.cookie = button.dataset.cookieString;
+            }, false);
+        })();
+    </script>
+}

+ 12 - 0
TEAMModelOS.Admin/Views/Shared/_Layout.cshtml

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>@ViewData["Title"] - TEAMModelOS.Admin</title>
+</head>
+<body>
+    @RenderBody()
+    @RenderSection("Scripts", required: false)
+</body>
+</html>

+ 18 - 0
TEAMModelOS.Admin/Views/Shared/_ValidationScriptsPartial.cshtml

@@ -0,0 +1,18 @@
+<environment include="Development">
+    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
+    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
+</environment>
+<environment exclude="Development">
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"
+            asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
+            asp-fallback-test="window.jQuery && window.jQuery.validator"
+            crossorigin="anonymous"
+            integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
+    </script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
+            asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
+            asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
+            crossorigin="anonymous"
+            integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
+    </script>
+</environment>

+ 3 - 0
TEAMModelOS.Admin/Views/_ViewImports.cshtml

@@ -0,0 +1,3 @@
+@using TEAMModelOS.Admin
+@using TEAMModelOS.Admin.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 3 - 0
TEAMModelOS.Admin/Views/_ViewStart.cshtml

@@ -0,0 +1,3 @@
+@{
+    Layout = "_Layout";
+}

+ 146 - 0
TEAMModelOS.Admin/appsettings.Development.json

@@ -0,0 +1,146 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    }
+  },
+  "AllowedHosts": "*",
+  "Azure": {
+    "Blob": {
+      "ConnectionString": "https://teammodelstorage.blob.core.chinacloudapi.cn/teammodelcontest?st=2019-03-11T08%3A20%3A19Z&se=2040-03-12T08%3A20%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=mZ%2BnzDWpcw0Vn2AQRCzo8I9%2Bh%2FnbujjWo8ObOwHwZjg%3D",
+      "Container": "teammodelos",
+      "AzureTableDialect": ""
+    }
+  },
+  "DBConnection": {
+    "MySqlConnectionString": "server=106.12.23.251;port=3308;database=TEAMModel;uid=root;pwd=habook;sslmode=none;charset=utf8mb4;"
+  },
+  "HaBookAuth": {
+    "TeamModelRegistUrl": "https://account.habookaclass.biz/regist?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "TeamModelLoginUrl": "https://account.habookaclass.biz/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJsb2dpbiIsImF1ZCI6ImNoZW5nZHVMb2dpbiIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYxMzUwNDcsIm5iZiI6MTUzNjEzNTA0NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.F4AnkbJrMRoZvJ6SC-lqZEYIYSoq5x8lvX6_a3YqSgM&callback=",
+    "AccountUrl": "https://api.habookaclass.biz/account",
+    "ServiceUrl": "https://api.habookaclass.biz/service",
+    "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
+    "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg=="
+  },
+  "Language": [
+    {
+      "Name": "臺灣",
+      "CountryCode": "886",
+      "SmsLang": "CHT",
+      "Language": "zh-tw"
+    },
+    {
+      "Name": "香港",
+      "CountryCode": "852",
+      "SmsLang": "CHT",
+      "Language": "zh-hk"
+    },
+    {
+      "Name": "澳門",
+      "CountryCode": "853",
+      "SmsLang": "CHT",
+      "Language": "zh-mo"
+    },
+    {
+      "Name": "大陆",
+      "CountryCode": "86",
+      "SmsLang": "CHS",
+      "Language": "zh-ch"
+    },
+    {
+      "Name": "Other",
+      "CountryCode": "000",
+      "SmsLang": "EN",
+      "Language": "en"
+    }
+  ],
+  "JwtSetting": {
+    "Issuer": "CDHaBook.TEAMModel", //签发者
+    "Audience": "TEAMModelOS.Admin",
+    "JwtClient": [
+      {
+        "Name": "WebApp",
+        "Project": "TEAMModelOS.Admin",
+        "Exp": 86400
+      }
+    ]
+  },
+  "RoleUser": {
+    "Root": [
+      {
+        "name": "Power",
+        "phone": "886935180824"
+      },
+      {
+        "name": "黄贺彬",
+        "phone": "8615283771540"
+      },
+      {
+        "name": "李棋坤",
+        "phone": "8613096300695"
+      },
+      {
+        "name": "梁仁楷",
+        "phone": "8613263110175"
+      },
+      {
+        "name": "Jaelys",
+        "phone": "886988896630"
+      },
+      {
+        "name": "周胜",
+        "phone": "8617781294959"
+      },
+      {
+        "name": "李思淳",
+        "phone": "8615287300526"
+      },
+      {
+        "name": "田志杰",
+        "phone": "8618786723407"
+      },
+      {
+        "name": "周响军",
+        "phone": "8618482133094"
+      }
+    ],
+    "Admin": [
+      {
+        "name": "陈权",
+        "phone": "8613880505117"
+      },
+      {
+        "name": "王彬琰",
+        "phone": "8613982151576"
+      },
+      {
+        "name": "刘彬",
+        "phone": "8618981903918"
+      },
+      {
+        "name": "黄贺彬",
+        "phone": "8615283771540"
+      },
+      {
+        "name": "李棋坤",
+        "phone": "8613096300695"
+      },
+      {
+        "name": "周胜",
+        "phone": "8617781294959"
+      },
+      {
+        "name": "李思淳",
+        "phone": "8615287300526"
+      },
+      {
+        "name": "田志杰",
+        "phone": "8618786723407"
+      }
+    ]
+  }
+}

+ 8 - 0
TEAMModelOS.Admin/appsettings.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

+ 45 - 0
TEAMModelOS.Admin/package.json

@@ -0,0 +1,45 @@
+{
+  "name": "ClientApp",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "start": "webpack-dev-server --open --config webpack.config.js"
+  },
+  "dependencies": {
+    "animate.css": "^3.7.0",
+    "aspnet-webpack": "^3.0.0",
+    "axios": "^0.18.0",
+    "core-js": "^2.6.5",
+    "iview": "^3.3.3",
+    "vue": "^2.6.6",
+    "vue-i18n": "^8.10.0",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.0.1",
+    "xlsx": "^0.14.2"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.5.0",
+    "@vue/cli-service": "^3.5.0",
+    "babel-loader": "^8.0.5",
+    "css-loader": "^2.1.1",
+    "file-loader": "^3.0.1",
+    "style-loader": "^0.23.1",
+    "url-loader": "^1.1.2",
+    "vue-loader": "^15.7.0",
+    "vue-style-loader": "^4.1.2",
+    "vue-template-compiler": "^2.6.10",
+    "webpack": "^4.29.6",
+    "webpack-dev-server": "^3.2.1",
+    "webpack-hot-middleware": "^2.24.3"
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 41 - 0
TEAMModelOS.Admin/webpack.config.js

@@ -0,0 +1,41 @@
+
+const path = require('path');
+const webpackDevServer = require('webpack-dev-server');
+const VueLoaderPlugin = require('vue-loader/lib/plugin');
+const webpack = require('webpack');
+
+module.exports = {
+    mode: "development",
+    entry: {
+        "main":"./ClientApp/src/main.js"
+    },
+    output: { 
+        path: path.join(__dirname, "/wwwroot"),
+        filename: "[name].js",
+        publicPath: "/"
+    },
+    devServer: {
+        contentBase: "/",
+        hot: true
+        //hotOnly: true 
+    },
+    module: {
+        rules: [
+            { test: /\.vue$/, use: 'vue-loader' },
+            { test: /\.js$/, include: /ContestApp/, use: 'babel-loader' },
+            { test: /\.css$/, use: ["vue-style-loader","css-loader"] },
+            { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
+            { test: /\.(eot|svg|ttf|woff|woff2)$/, loader: 'file-loader' },
+            { test: /\.less$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }, { loader: "less-loader", options: { javascriptEnabled: true } }] }
+        ]
+    },
+    resolve: {
+        alias: {
+            "@": path.resolve(__dirname, './ClientApp/src')
+        }
+    },
+    plugins: [
+        new VueLoaderPlugin(),
+        new webpack.HotModuleReplacementPlugin()
+    ]
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 236 - 0
TEAMModelOS.Admin/wwwroot/0.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 168 - 0
TEAMModelOS.Admin/wwwroot/1.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 97 - 0
TEAMModelOS.Admin/wwwroot/2.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 97 - 0
TEAMModelOS.Admin/wwwroot/3.js


BIN
TEAMModelOS.Admin/wwwroot/30d910bab206d6d6fe8f42749866756a.jpg


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 82 - 0
TEAMModelOS.Admin/wwwroot/4.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 97 - 0
TEAMModelOS.Admin/wwwroot/5.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 63 - 0
TEAMModelOS.Admin/wwwroot/6.js


BIN
TEAMModelOS.Admin/wwwroot/63591575514970bc16a916124c897ff2.jpg


BIN
TEAMModelOS.Admin/wwwroot/6ccbd4b5bd4670c9c9e994fd374e6bee.jpg


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 97 - 0
TEAMModelOS.Admin/wwwroot/7.js


BIN
TEAMModelOS.Admin/wwwroot/71ea14496a6a1fc5e9c810737e0c6942.png


BIN
TEAMModelOS.Admin/wwwroot/7421c96adbf2c5fb75b086a84add0e23.png


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 97 - 0
TEAMModelOS.Admin/wwwroot/8.js


BIN
TEAMModelOS.Admin/wwwroot/99ac3308dd8ee14f749f51538d0d5b9e.woff


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 870 - 0
TEAMModelOS.Admin/wwwroot/a2c4a261a239aa84463dc70e4bac9b9a.svg


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 168 - 0
TEAMModelOS.Admin/wwwroot/about.js


BIN
TEAMModelOS.Admin/wwwroot/bafa8056ecfec5c58c5152faa7732a09.jpg


BIN
TEAMModelOS.Admin/wwwroot/c8e80e2b2e5ccb4c67b00b9b2fce6f9b.jpg


BIN
TEAMModelOS.Admin/wwwroot/d535a25a79fb1365ae814b61e88fae71.ttf


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2627 - 0
TEAMModelOS.Admin/wwwroot/main.js


+ 41 - 0
TEAMModelOS.Api/Core/CommonController.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.Model.Core;
+using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
+using TEAMModelOS.Service.Core.Implements;
+using TEAMModelOS.Service.Core.Interfaces;
+
+namespace TEAMModelOS.Admin.Controllers
+{
+	[Route("api/[controller]")]
+	[ApiController]
+	public class CommonController : Controller
+	{
+		private readonly ISchoolsService _schoolsService;
+		public CommonController(ISchoolsService schoolsService ) {
+			_schoolsService = schoolsService;
+		}
+		[HttpPost("getSchool")]
+		public async Task<BaseJosnRPCResponse> GetSchoolAsync(JosnRPCRequest<FindSchoolByCode> getSchool)
+		{
+
+			JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+			if (ValidateHelper.IsValid(getSchool))
+			{
+				List<SchoolInfo> schoolInfos = await _schoolsService.GetSchools(getSchool);
+				if (schoolInfos != null && schoolInfos.Count > 0)
+				{
+					builder.Data(schoolInfos);
+				}
+				else builder.Data(null);
+			}
+			return builder.build();
+
+		}
+	}
+}

+ 72 - 0
TEAMModelOS.Api/Core/TeamModelUserController.cs

@@ -0,0 +1,72 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Microsoft.IdentityModel.Tokens;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.Model.Core;
+using TEAMModelOS.SDK.Module.SqlSugar.Configuration.Data;
+using TEAMModelOS.Service.Core.Interfaces;
+
+namespace TEAMModelOS.Api.Core
+{
+    [Route("api/user")]
+    [ApiController]
+    public class TeamModelUserController : Controller
+    {
+        private readonly ITeamModelUserService _teamModelUserService;
+        public TeamModelUserController(ITeamModelUserService teamModelUserService)
+        {
+            _teamModelUserService = teamModelUserService;
+        }
+
+
+        /// <summary>
+        /// 查询列表
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpGet("getpages")]
+        public async Task<JsonResult> GetPages(PageParm parm)
+        {
+            var res = await _teamModelUserService.GetPagesAsync(parm);
+            return Json(new { code = 0, msg = "success", count = res.data.TotalItems, data = res.data.Items });
+        }
+
+        /// <summary>
+        /// 获得字典栏目Tree列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("add")]
+        public async Task<ApiResult<string>> AddAdmin(TeamModelUser parm)
+        {
+            return await _teamModelUserService.AddAsync(parm);
+        }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("delete")]
+        public async Task<ApiResult<string>> DeleteAdmin(string parm)
+        {
+            return await _teamModelUserService.DeleteAsync(parm);
+        }
+
+        /// <summary>
+        /// 修改
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("edit")]
+        public async Task<ApiResult<string>> EditAdmin(TeamModelUser parm)
+        {
+            return await _teamModelUserService.ModifyAsync(parm);
+        }
+    }
+}

+ 21 - 0
TEAMModelOS.Api/Core/TestController.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+
+// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
+
+namespace TEAMModelOS.Admin.Controllers
+{
+	[Route("api/[controller]")]
+	//[ApiController]
+	public class TestController : Controller
+	{
+		[HttpGet("test")]
+		public string Test(string test)
+		{
+			return "test"+test;
+		}
+	}
+}

+ 20 - 0
TEAMModelOS.Api/TEAMModelOS.Api.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Folder Include="Moral\" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\TEAMModelOS.Service\TEAMModelOS.Service.csproj" />
+  </ItemGroup>
+
+</Project>

+ 15 - 0
TEAMModelOS.Model/Core/FindSchoolByCode.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.Model.Core
+{
+	public class FindSchoolByCode
+	{
+		public string CountryId { get; set; }//国家
+
+		public string ProvinceId { get; set; }//省份
+
+		public string CityId { get; set; }//城市
+	}
+}

+ 29 - 0
TEAMModelOS.Model/Core/SchoolInfo.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using MessagePack;
+
+namespace TEAMModelOS.Model.Core
+{
+	[MessagePackObject(keyAsPropertyName: true)]
+	public class SchoolInfo
+	{
+		public string code { get; set; }
+		public string name { get; set; }
+		public string countryId { get; set; }
+		public string countryName { get; set; }
+		public string provinceId { get; set; }
+		public string provinceName { get; set; }
+		public string cityId { get; set; }
+		public string cityName { get; set; }
+		public string address { get; set; }
+		public string typeId { get; set; }
+		public string typeName { get; set; }
+		public string source { get; set; }
+		public string distId { get; set; }
+		public string distName { get; set; }
+		public string schoolDist { get; set; }
+		public string aliasName { get; set; }
+		public string shortCode { get; set; }
+	}
+}

+ 82 - 0
TEAMModelOS.Model/Core/TeamModelUser.cs

@@ -0,0 +1,82 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.Model.Core
+{
+    /// <summary>
+    /// FreeSQL https://www.cnblogs.com/kellynic/p/10645049.html
+    /// </summary>
+    [SugarTable("CoreTeamModelUser")]
+    public class TeamModelUser
+    {
+        public string PartitionKey { get; set; }
+        public string RowKey { get; set; }
+        /// <summary>
+        /// 真实姓名
+        /// </summary>
+        public string FullName { get; set; }
+        /// <summary>
+        /// 昵称
+        /// </summary>
+        public string NickName { get; set; }
+        /// <summary>
+        /// 性别
+        /// </summary>
+        public string Sex { get; set; }
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string Cellphone { get; set; }
+        /// <summary>
+        /// 邮箱
+        /// </summary>
+        public string Email { get; set; }
+        /// <summary>
+        /// 醍摩豆ID
+        /// </summary>
+        public string TeamModelId { get; set; }
+        /// <summary>
+        /// 头像
+        /// </summary>
+        public string Header { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string CountryId { get; set; }
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string CountryName { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ProvinceId { get; set; }
+        /// <summary>
+        /// 省
+        /// </summary>
+        public string ProvinceName { get; set; }
+        /// <summary>
+        /// 市
+        /// </summary>
+        public string CityId { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string CityName { get; set; }
+        /// <summary>
+        /// 区县
+        /// </summary>
+        public string DistrictId { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string DistrictName { get; set; }
+        /// <summary>
+        /// 注册时间
+        /// </summary>
+        public long RegisterTime { get; set; }
+        public string CountryCode { get; set; }
+    }
+}

+ 12 - 0
TEAMModelOS.Model/TEAMModelOS.Model.csproj

@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="MessagePack" Version="1.7.3.4" />
+    <PackageReference Include="sqlSugarCore" Version="4.9.9.5" />
+  </ItemGroup>
+
+</Project>

+ 22 - 0
TEAMModelOS.SDK/Context/Attributes/AllowCors/AllowCorsAttribute.cs

@@ -0,0 +1,22 @@
+using Microsoft.AspNetCore.Mvc.Filters;
+
+namespace TEAMModelOS.SDK.Context.Attributes.AllowCors
+{
+    /// <summary>
+    /// 跨域处理
+    /// </summary>
+    public class AllowCorsAttribute : ActionFilterAttribute
+    {
+        public override void OnActionExecuting(ActionExecutingContext filterContext)
+        {
+            var context = filterContext.HttpContext;
+            //context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
+            context.Response.Headers.Add("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
+            context.Response.Headers.Add("Access-Control-Allow-Headers", "Access-Control-Allow-Headers," +
+                                         " Origin,Accept, X-Requested-With, Content-Type, " +
+                                         "Access-Control-Request-Method, Access-Control-Request-Headers," +
+                                         "Content-Type,Accept,access_token,token,Authorization");
+            base.OnActionExecuting(filterContext);
+        }
+    }
+}

+ 11 - 0
TEAMModelOS.SDK/Context/Attributes/Azure/PartitionKeyAttribute.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Context.Attributes.Azure
+{
+    [AttributeUsage(AttributeTargets.Property)]
+    public class PartitionKeyAttribute : Attribute
+    {
+    }
+}

+ 12 - 0
TEAMModelOS.SDK/Context/Attributes/Azure/TableSpaceAttribute.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Context.Attributes.Azure
+{
+    [AttributeUsage(AttributeTargets.Class)]
+    public class TableSpaceAttribute :Attribute
+    {
+        public string Name { get; set; }
+    }
+}

+ 16 - 0
TEAMModelOS.SDK/Context/Attributes/MySQL/TextAttribute.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Context.Attributes.MySQL
+{
+    public class TextAttribute : Attribute
+    {
+        public TextAttribute(string value)
+        {
+            Value = value;
+        }
+
+        public string Value { get; set; }
+    }
+}

+ 11 - 0
TEAMModelOS.SDK/Context/Attributes/Table/PartitionAttribute.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Context.Attributes.Table
+{
+    [AttributeUsage(AttributeTargets.Property)]
+    public class PartitionAttribute : Attribute
+    {
+    }
+}

+ 12 - 0
TEAMModelOS.SDK/Context/Attributes/Table/TableSpaceAttribute.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Context.Attributes.Table
+{
+    [AttributeUsage(AttributeTargets.Class)]
+    public class TableSpaceAttribute :Attribute
+    {
+        public string Name { get; set; }
+    }
+}

+ 31 - 0
TEAMModelOS.SDK/Context/Configuration/BaseConfigModel.cs

@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Configuration;
+
+namespace TEAMModelOS.SDK.Context.Configuration
+{
+    public class BaseConfigModel
+    {
+        public static IConfiguration Configuration { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+
+        public static string ContentRootPath { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+
+        public static string WebRootPath { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="config"></param>
+        /// <param name="contentRootPath"></param>
+        /// <param name="webRootPath"></param>
+        public static void SetBaseConfig(IConfiguration config, string contentRootPath, string webRootPath)
+        {
+            Configuration = config;
+            ContentRootPath = contentRootPath;
+            WebRootPath = webRootPath;
+        }
+    }
+}

+ 31 - 0
TEAMModelOS.SDK/Context/Constant/Constants.cs

@@ -0,0 +1,31 @@
+
+namespace TEAMModelOS.SDK.Context.Constant.Common
+{
+    public static class Constants
+    {
+        /// <summary>
+        /// access_token
+        /// </summary>
+		public static readonly string ACCESS_TOKEN = "access_token";
+        /// <summary>
+        /// 引用页
+        /// </summary>
+		public static readonly string REFERER = "referer";
+        /// <summary>
+        /// token 请求头
+        /// </summary>
+		public static readonly string AUTHORIZATION = "Authorization";
+        /// <summary>
+        /// josn格式
+        /// </summary>
+		public static readonly string CONTENT_TYPE_JSON = "application/json";
+        /// <summary>
+        /// 苏格拉底作品类型--团队组
+        /// </summary>
+		public static readonly string SIGNUPTYPEGRP = "2018TMCNTSGRP";
+        /// <summary>
+        /// 苏格拉底作品类型--个人组
+        /// </summary>
+		public static readonly string SIGNUPTYPEINT = "2018TMCNTSIND";
+    }
+}

+ 24 - 0
TEAMModelOS.SDK/Context/Constant/FileType.cs

@@ -0,0 +1,24 @@
+namespace TEAMModelOS.SDK.Context.Constant.Common
+{
+	public class FileType
+	{
+		public string Id { get; set;}
+		public string Extention { get; set; }
+		public string Type { get; set; }
+
+		public FileType(string id, string extention, string type)
+		{
+			Id = id;
+			Extention = extention;
+			Type = type;
+		}
+		public static string GetExtention(string fileName) {
+			if (string.IsNullOrEmpty(fileName)) {
+				return "";
+			} else {
+				return fileName.Substring(fileName.LastIndexOf(".") + 1);
+			}
+			
+		}
+	}
+}

+ 44 - 0
TEAMModelOS.SDK/Context/Constant/FileTypeMap.cs

@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+
+
+namespace TEAMModelOS.SDK.Context.Constant.Common
+{
+	public class FileTypeMap
+	{
+		private Dictionary<string, FileType> FileTpyeMap { get; set; }
+
+		public FileTypeMap FileTypes(FileType fileType) {
+			if (this.FileTpyeMap == null)
+			{
+				FileTpyeMap = new Dictionary<string, FileType>();
+				//fileTpyeMap.Add(fileType.Type, fileType);
+			}
+			if(!FileTpyeMap.ContainsKey(fileType.Extention)) {
+				FileTpyeMap.Add(fileType.Extention, fileType);
+			}
+			return this;
+		}
+		public Dictionary<string, FileType> GetFileTypes() {
+			FileTypes(new FileType("1", "jpg", "img")).
+			FileTypes(new FileType("2", "png", "img")).
+			FileTypes(new FileType("3", "bmp", "img")).
+			FileTypes(new FileType("4", "jpeg", "img")).
+			FileTypes(new FileType("5", "gif", "img")).
+			FileTypes(new FileType("6", "mp4", "video")).
+			FileTypes(new FileType("7", "avi", "video")).
+			FileTypes(new FileType("8", "mpeg", "video")).
+			FileTypes(new FileType("9", "mov", "video")).
+			FileTypes(new FileType("10", "wmv", "video")).
+			FileTypes(new FileType("11", "doc", "file")).
+			FileTypes(new FileType("12", "docx", "file")).
+			FileTypes(new FileType("13", "ppt", "file")).
+			FileTypes(new FileType("14", "pptx", "file")).
+			FileTypes(new FileType("15", "xls", "file")).
+			FileTypes(new FileType("16", "xlsx", "file")).
+			FileTypes(new FileType("17", "zip", "file")).
+			FileTypes(new FileType("18", "rar", "file")).
+			FileTypes(new FileType("19", "pdf", "file"));
+			return FileTpyeMap;
+		}
+	}
+}

+ 0 - 0
TEAMModelOS.SDK/Context/Constant/GetFileType.cs


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác