Bladeren bron

Merge branch 'TPE/develop' into TPE/feat/classmgmtToHiteach

osbert 4 jaren geleden
bovenliggende
commit
6fe74d2bae
24 gewijzigde bestanden met toevoegingen van 1206 en 518 verwijderingen
  1. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/index.js
  2. 181 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/serviceDriveAuth.js
  3. 0 8
      TEAMModelOS/ClientApp/src/locale/lang/en-US/seviceDriveAuth.js
  4. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js
  5. 181 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/serviceDriveAuth.js
  6. 0 8
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/seviceDriveAuth.js
  7. 182 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/serviceDriveAuth.js
  8. 8 0
      TEAMModelOS/ClientApp/src/store/module/serviceDriveAuth.js
  9. 12 11
      TEAMModelOS/ClientApp/src/store/module/spaceAuth.js
  10. 45 49
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/Index.vue
  11. 6 6
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/AclassOneChart.vue
  12. 52 62
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/HiteachAuthList.less
  13. 61 51
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/HiteachAuthList.vue
  14. 32 0
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/ServiceList.less
  15. 72 27
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/ServiceList.vue
  16. 14 13
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/SpaceChart.vue
  17. 27 21
      TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/SpaceStatus.vue
  18. 131 128
      TEAMModelOS/ClientApp/src/view/student-account/AclassOneAuth.less
  19. 80 63
      TEAMModelOS/ClientApp/src/view/student-account/AclassOneAuth.vue
  20. 43 2
      TEAMModelOS/ClientApp/src/view/student-account/AddStudent.vue
  21. 3 0
      TEAMModelOS/ClientApp/src/view/student-account/AuthNumChart.vue
  22. 2 2
      TEAMModelOS/ClientApp/src/view/student-account/Index.vue
  23. 5 5
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue
  24. 65 51
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/SubComponent/SpaceAuth.vue

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/index.js

@@ -17,7 +17,7 @@ import regist from './regist'
 import forgotPW from './forgotPW'
 import studentWeb from './studentWeb'
 import settings from './settings'
-import seviceDriveAuth from './seviceDriveAuth'
+import serviceDriveAuth from './serviceDriveAuth'
 import elui from './elui'
 import global from './global'
 import system from './system'
@@ -41,7 +41,7 @@ export default {
   forgotPW,
   studentWeb,
   settings,
-  seviceDriveAuth,
+  serviceDriveAuth,
   test: 'test',
   elui,
   global,

+ 181 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/serviceDriveAuth.js

@@ -0,0 +1,181 @@
+export default {
+  //ServiceList.vue
+  AEGMCPLY: 'AClass One',
+  RYGVCPLY: 'AClass One',
+  IPALYEIY: 'Smart Teaching Service Space',
+  '6BOPC6MD': 'Teaching and learning big data management services',
+  ON6MBDOP: 'Smart School Big Data Management Service',
+  服務授權列表: 'Service authorization list',
+  智慧教室授權管理: 'Smart classroom authorization management',
+  未購買: 'not purchased',
+  已購買: 'purchased',
+  '服務啟用 / 到期日:': 'Service activation / expiration date:',
+  剩餘: 'Remaining',
+  天: 'days',
+  無週期授權數量: 'No periodic authorization quantity',
+  有週期授權數量: 'Periodic authorization quantity',
+  固定分配數: 'Fixed allocation',
+  動態分配數: 'Dynamic allocation number',
+  剩餘分配數: 'Remain allocation',
+  總使用率: 'Total usage',
+  詳細服務內容: 'Detailed service content',
+  管理AClassOne授權: 'Manage AClassOne authorization',
+
+  //HiteachAuthList.vue
+  確定解除授權: 'Confirm deauthorization',
+  當前您所選中的PC: 'The currently selected PC',
+  ',確定解除授權?': ', are you sure to deauthorize?',
+  '解除授權後,可在教室中的電腦再次進行綁定授權。': 'After the authorization is cancelled, the binding authorization can be performed again on the computer in the classroom.',
+  取消: 'Cancel',
+  確定: 'OK',
+  Hiteach序號數: 'Hiteach serial number',
+  大量: 'Multi',
+  單一: 'Single',
+  授權: 'Authorization',
+  可啟用裝置數: 'Number of devices that can be activated',
+  已啟用裝置數: 'Number of activated devices',
+  管理Hiteach教室: 'Manage Hiteach classroom',
+  暂无数据: 'No data',
+  序號到期日: 'Serial number expiration date: ',
+  無到期日: 'No expiration date',
+  已到期: 'Expired',
+  序號使用狀況: 'Serial number usage status: ',
+  未命名機台: 'Unnamed machine',
+  解除授權: 'Deauthorize',
+  顯示全部: 'Show all serial numbers',
+  '僅顯示HiTeach STD序號': 'Display HiTeach STD serial number only',
+  '僅顯示HiTeach PRO序號': 'Display HiTeach PRO serial number only',
+  '僅顯示HiTeach TBL序號': 'Display HiTeach TBL serial number only',
+  僅顯示已完成綁定的序號: 'Only display the serial number of the completed binding',
+  僅顯示已到期序號: 'Show only expired serial numbers',
+  已成功解除授權: 'Successfully deauthorized',
+
+  //SpaceStatus.vue
+  智慧教學服務空間狀態: 'Space status',
+  分配教學空間: 'Allocate teaching space',
+  空間總數: 'Total space',
+  已使用空間總數: 'Total used space',
+  空間使用狀況: 'Space usage status',
+  未使用空間數: 'Unused space',
+  未使用空間比率: 'Ratio',
+  可使用空間數: 'Usable spaces',
+  可使用空間比率: 'Ratio',
+  當前空間到期日: 'Expiration date: ',
+  '基本 1GB 永久授權': 'Basic 1GB perpetual license',
+  '到期後將變更為IES基本空間,超出基本空間值將被收回': 'After the expiration, it will be changed to the IES basic space.',
+  購買記錄: 'Purchase record',
+  醍摩豆智慧教學服務空間: 'TeamModel Space',
+  訂單日期: 'Order Date: ',
+  到期日: 'Expiry date:',
+  添購其他服務: 'Add other services',
+  '空間已到期,超過僅供檢視': 'Space has expired, more than is only for viewing',
+
+  //SpaceChart.vue
+  文件: 'File',
+  永久授權: 'Permanent authorization',
+  影片: 'Video',
+  圖片: 'Image',
+  題目與試卷: 'Questions and examinations',
+  其他: 'Others',
+  學生使用: 'Student use',
+  已分配至教師: 'Assigned to teacher',
+  未使用: 'Unused',
+  空間: ' Space',
+  空間數: ' Spaces',
+  空間比率: ' Ratio',
+
+  //學生帳號頁面的授權管理控件 student-account / AclassOneAuth.vue
+  確定收回所有授權: 'Make sure to reclaim all authorizations',
+  '收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。': 'After the authorization is withdrawn, the number of uses will be directly set to 0. If you want to grant authorization, you can apply it to the target object.',
+  服務授權管理: 'Service authorization management',
+  AClassONE智慧學伴服務授權: 'AClassONE Authorization',
+  '賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限': 'Grant the TEAM Modal ID of the student who holds the service authorization to use the AClassONE Smart Learning Companion App',
+  總授權數: 'Total number of authorizations',
+  本次套用數: 'Number of applications this time',
+  已使用數: 'Used number',
+  授權總覽: 'Authorization overview',
+  授權管理: 'Authorization management',
+  已購授權總數: 'Total Purchased :',
+  note: 'The authorization of fixed allocation is set by the school uniformly. Users should set the authorization object in the authorization management page. The dynamic access authorization will be automatically recycled at 23:59:59 every day, and students can activate it again the next day.',
+  快速套用授權: 'Quickly apply authorization',
+  套用至所有當前勾選項目: 'Apply to all checked items',
+  套用: 'Apply',
+  套用至: 'Apply to',
+  套用至當前勾選目標第: 'Apply to the checked item',
+  項至第: 'to',
+  項: 'item',
+  所有項目: 'all items',
+  未关联班级: 'Unlinked class',
+  套用至全校所有項目: 'Apply to all items in the school',
+  共: 'total',
+  個: '',
+  '大於總授權數,無法使用': 'Greater than the total number of authorizations, can not be used',
+  添購其他授權: 'Add other licenses',
+  收回所有授權: 'Recover all authorizations',
+  保存所有變更: 'Save all changes',
+  選擇班級: 'class',
+
+  //下方method區塊
+  固定分配授權數: 'Fixed allocation',
+  今日動態取用數: 'Dynamic access number',
+  今日可用授權數: 'Available',
+  '請先選擇套用,再按保存': 'Please select apply first, then press save',
+  '保存成功,本次尚無新增授權數量': 'Save successfully, there is no new authorization number this time',
+  '保存成功,本次新增': 'Save successfully, add this time',
+  個固定分配: 'Fixed allocation',
+  '保存失敗,超過可用授權數!': 'Save failed, the number of available authorizations exceeded!',
+  全部收回成功: 'All recovered successfully',
+  請先勾選欲授權之學生: 'Please check the students who want to authorize',
+  '請設定有效的目標項 !': 'Please set a valid target item!',
+  '目前所選學制人數為 0 人!': 'The number of students currently selected for the school system is 0!',
+  '請先選學制!': 'Please choose the school system first!',
+  '目前所選學級人數為 0 人!': 'The number of students currently selected is 0!',
+  '請先選學級!': 'Please choose the grade first!',
+  '目前所選班級人數為 0 人!': 'The number of currently selected class is 0!',
+  '請先選班級!': 'Please choose a class first!',
+  '全校人數超過所購買授權數,無法使用': 'The number of people in the school exceeds the number of licenses purchased and cannot be used',
+  全部收回成功: 'All recovered successfully',
+
+  //老師帳號分配空間授權控件  teachermgmt/index.vue 空間欄位部分
+  空間分配: 'Space allocation',
+  確定收回所有空間: 'Confirm to reclaim all space',
+  '確定後全部每位教師都直接設置為0GB。': 'After confirming, all teachers are directly set to 0GB.',
+  保存提醒: 'Save reminder',
+  '当前空間数据尚未保存。如果關閉,修改的数据将不会保存!': 'The current spatial data has not been saved. If closed, the modified data will not be saved!',
+  回收空間: 'Reclaimed space',
+  保存變更: 'Save changes',
+  空間分配狀態: 'Space allocation status',
+  總空間量: 'Total space:',
+  單人固定容量分配: 'Single fixed capacity allocation',
+  目前可被分配總量: 'The total amount currently available for distribution',
+  至: ' to',
+  每人分配: 'Allocation per person',
+  當前勾選之教師帳號: 'Teacher account currently checked',
+  所有: 'all',
+  進階權限: ' Advanced permissions',
+  一般權限: ' General permissions',
+  之教師帳號: ' teacher account',
+  職稱為: 'Job title',
+  的教師帳號: 'teacher account',
+  所有教師帳號: 'All teacher accounts',
+
+  //下方method區塊
+  '請手動輸入數字!': 'Please enter the numbers manually!',
+  '輸入了開頭為0的數字,請重新輸入!': 'Enter a number that starts with 0, please re-enter!',
+  回收成功: 'Successful recovery',
+  更新成功: 'Successful update',
+  超出該校使用空間: 'Exceeding the space used by the school',
+  有不存在老師的ID: 'There is no teacher ID',
+  保存失敗: 'Save failed',
+  '您未進行任何個別變更或批次套用,無需保存': 'You have not made any individual changes or batch application, no need to save',
+  '超出剩餘空間量,套用失敗': 'Exceeding the amount of remaining space, application failed',
+  '套用完成,記得按保存': 'Apply complete, remember to press save',
+  '先輸入有效數字,再進行套用': 'Enter a valid number first, then apply it',
+  套用完成: 'Application complete',
+  '先輸入有效數字,並進行勾選,再套用': 'Enter a valid number first, then check it, then apply',
+
+  //store/spaceAuth.js
+  學校已使用空間:'School used space',
+  已分配給教師空間:'Allocated to teacher space',
+  剩餘空間:'Remaining space'
+}

+ 0 - 8
TEAMModelOS/ClientApp/src/locale/lang/en-US/seviceDriveAuth.js

@@ -1,8 +0,0 @@
-export default {
-    //授權管理服務清單
-    "AEGMCPLY":"AClass One 週期",
-    'RYGVCPLY':'AClass One 無週期',
-    'IPALYEIY':'智慧教學服務空間',
-    '6BOPC6MD':'教與學大數據管理服務',
-    'ON6MBDOP':'智慧學校大數據管理服務'
-    }

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

@@ -17,7 +17,7 @@ import regist from './regist'
 import forgotPW from './forgotPW'
 import studentWeb from './studentWeb'
 import settings from './settings'
-import seviceDriveAuth from './seviceDriveAuth'
+import serviceDriveAuth from './serviceDriveAuth'
 import elui from './elui'
 import evaluation from './evaluation'
 import learnActivity from './learnActivity'
@@ -43,7 +43,7 @@ export default {
   forgotPW,
   studentWeb,
   settings,
-  seviceDriveAuth,
+  serviceDriveAuth,
   elui,
   evaluation,
   learnActivity,

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

@@ -0,0 +1,181 @@
+export default {
+  //ServiceList.vue
+  AEGMCPLY: 'AClass One', //AClass One 周期
+  RYGVCPLY: 'AClass One', //AClass One 无周期
+  IPALYEIY: '智慧教学服务空间',
+  '6BOPC6MD': '教与学大数据管理服务',
+  ON6MBDOP: '智慧学校大数据管理服务',
+  服務授權列表: '服务授权列表',
+  智慧教室授權管理: '智慧教室授权管理',
+  未購買: '未购买',
+  已購買: '已购买',
+  '服務啟用 / 到期日:': '服务启用 / 到期日:',
+  剩餘: '剩余',
+  天: '天',
+  無週期授權數量: '无周期授权数量',
+  有週期授權數量: '有周期授权数量',
+  固定分配數: '固定分配数',
+  動態分配數: '动态分配数',
+  剩餘分配數: '剩餘分配數',
+  總使用率: '总使用率',
+  詳細服務內容: '详细服务内容',
+  管理AClassOne授權: '管理AClassOne授权',
+
+  //HiteachAuthList.vue
+  確定解除授權: '确定解除授权',
+  當前您所選中的PC: '当前您所选中的PC',
+  ',確定解除授權?': ',确定解除授权?',
+  '解除授權後,可在教室中的電腦再次進行綁定授權。': '解除授权后,可在教室中的电脑再次进行绑定授权。',
+  取消: '取消',
+  確定: '确定',
+  Hiteach序號數: 'Hiteach序号数',
+  大量: '大量',
+  單一: '单一',
+  授權: '授权',
+  可啟用裝置數: '可启用装置数',
+  已啟用裝置數: '已启用装置数',
+  管理Hiteach教室: '管理Hiteach教室',
+  暂无数据: '暂无数据',
+  序號到期日: '序号到期日:',
+  無到期日: '无到期日',
+  已到期: '已到期',
+  序號使用狀況: '序号使用状况:',
+  未命名機台: '未命名机台',
+  解除授權: '解除授权',
+  顯示全部: '顯示全部',
+  '僅顯示HiTeach STD序號': '仅显示HiTeach STD序号',
+  '僅顯示HiTeach PRO序號': '仅显示HiTeach PRO序号',
+  '僅顯示HiTeach TBL序號': '仅显示HiTeach TBL序号',
+  僅顯示已完成綁定的序號: '仅显示已完成绑定的序号',
+  僅顯示已到期序號: '仅显示已到期序号',
+  已成功解除授權: '已成功解除授權',
+
+  //SpaceStatus.vue
+  智慧教學服務空間狀態: '智慧教学服务空间状态',
+  分配教學空間: '分配教学空间',
+  空間總數: '空间总数',
+  已使用空間總數: '已使用空间总数',
+  空間使用狀況: '空间使用状况',
+  未使用空間數: '未使用空间数',
+  未使用空間比率: '未使用空间比率',
+  可使用空間數: '可使用空间数',
+  可使用空間比率: '可使用空间比率',
+  當前空間到期日: '当前空间到期日',
+  '基本 1GB 永久授權': '基本 1GB 永久授权',
+  '到期後將變更為IES基本空間,超出基本空間值將被收回': '到期后将变更为IES基本空间,超出基本空间值将被收回',
+  購買記錄: '购买记录',
+  醍摩豆智慧教學服務空間: '醍摩豆智慧教学服务空间',
+  訂單日期: '订单日期:',
+  到期日: '到期日:',
+  添購其他服務: '添购其他服务',
+  '空間已到期,超過僅供檢視': '空間已到期,超過僅供檢視',
+
+  //SpaceChart.vue
+  文件: '文件',
+  永久授權: '永久授权',
+  影片: '影片',
+  圖片: '图片',
+  題目與試卷: '题目与试卷',
+  其他: '其他',
+  學生使用: '学生使用',
+  已分配至教師: '已分配至教师',
+  未使用: '未使用',
+  空間: '空間',
+  空間數: '空間數',
+  空間比率: '空間比率',
+
+  //學生帳號頁面的授權管理控件 student-account / AclassOneAuth.vue
+  確定收回所有授權: '確定收回所有授權',
+  '收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。': '收回授权后使用数会直接设置为0,如欲给予授权可针对目标对象进行套用。',
+  服務授權管理: '服务授权管理',
+  AClassONE智慧學伴服務授權: 'AClassONE智慧学伴服务授权',
+  '賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限': '赋予持有该服务授权的学生TEAM Modal ID使用AClassONE智慧学伴App的权限',
+  總授權數: '总授权数',
+  本次套用數: '本次套用数',
+  已使用數: '已使用数',
+  授權總覽: '授权总览',
+  授權管理: '授权管理',
+  已購授權總數: '已购授权总数:',
+  note: '固定分配之授权由校方统一设置,使用者请于授权管理分页进行授权对象的设定。动态取用之授权每日23:59:59将自动回收,学生可于次日再次启用。',
+  快速套用授權: '快速套用授权',
+  套用至所有當前勾選項目: '套用至所有当前勾选项目',
+  套用: '套用',
+  套用至: '套用至',
+  套用至當前勾選目標第: '套用至当前勾选目标第',
+  項至第: '项至第',
+  項: '项',
+  所有項目: '所有项目',
+  未关联班级: '未关联班级',
+  套用至全校所有項目: '套用至全校所有项目',
+  共: '共',
+  個: '个',
+  '大於總授權數,無法使用': '大于总授权数,无法使用',
+  添購其他授權: '添购其他授权',
+  收回所有授權: '收回所有授权',
+  保存所有變更: '保存所有变更',
+  選擇班級: '選擇班級',
+
+  //下方method區塊
+  固定分配授權數: '固定分配授权数',
+  今日動態取用數: '今日动态取用数',
+  今日可用授權數: '今日可用授权数',
+  '請先選擇套用,再按保存': '请先选择套用,再按保存',
+  '保存成功,本次尚無新增授權數量': '保存成功,本次尚无新增授权数量',
+  '保存成功,本次新增': '保存成功,本次新增',
+  個固定分配: '个固定分配',
+  '保存失敗,超過可用授權數!': '保存失败,超过可用授权数! ',
+  全部收回成功: '全部收回成功',
+  請先勾選欲授權之學生: '请先勾选欲授权之学生',
+  '請設定有效的目標項 !': '请设定有效的目标项 !',
+  '目前所選學制人數為 0 人!': '目前所选学制人数为 0 人!',
+  '請先選學制!': '请先选学制!',
+  '目前所選學級人數為 0 人!': '目前所选学级人数为 0 人!',
+  '請先選學級!': '请先选学级!',
+  '目前所選班級人數為 0 人!': '目前所选班级人数为 0 人!',
+  '請先選班級!': '请先选学级!',
+  '全校人數超過所購買授權數,無法使用': '全校人数超过所购买授权数,无法使用',
+  全部收回成功: '全部收回成功',
+
+  //老師帳號分配空間授權控件teachermgmt/index.vue 空間欄位部分
+  空間分配:'空间分配',
+  確定收回所有空間:'确定收回所有空间',
+  '確定後全部每位教師都直接設置為0GB。':'确定后全部每位教师都直接设置为0GB。',
+  保存提醒:'保存提醒',
+  '当前空間数据尚未保存。如果關閉,修改的数据将不会保存!':'当前空間数据尚未保存。如果關閉,修改的数据将不会保存!',
+  回收空間:'回收空间',
+  保存變更:'保存变更',
+  空間分配狀態:'空间分配状态',
+  總空間量:'总空间量:',
+  單人固定容量分配:'单人固定容量分配',
+  目前可被分配總量:'目前可被分配总量',
+  至:'至',
+  每人分配:'每人分配',
+  當前勾選之教師帳號:'当前勾选之教师帐号',
+  所有:'所有',
+  進階權限:'进阶权限',
+  一般權限:'一般权限',
+  之教師帳號:'之教师帐号',
+  職稱為:'职称为',
+  的教師帳號:'的教师帐号',
+  所有教師帳號:'所有教师帐号',
+
+  //下方method區塊
+  '請手動輸入數字!': '请手动输入数字!',
+  '輸入了開頭為0的數字,請重新輸入!': '输入了开头为0的数字,请重新输入!',
+  回收成功: '回收成功',
+  更新成功: '更新成功',
+  超出該校使用空間: '超出该校使用空间',
+  有不存在老師的ID: '有不存在老师的ID',
+  保存失敗: '保存失败',
+  '您未進行任何個別變更或批次套用,無需保存': '您未进行任何个别变更或批次套用,无需保存',
+  '超出剩餘空間量,套用失敗': '超出剩余空间量,套用失败',
+  '套用完成,記得按保存': '套用完成,记得按保存',
+  '先輸入有效數字,再進行套用': '先输入有效数字,再进行套用',
+  套用完成: '套用完成',
+  '先輸入有效數字,並進行勾選,再套用': '先输入有效数字,并进行勾选,再套用',
+
+  //store/spaceAuth.js
+  學校已使用空間:'学校已使用空间',
+  已分配給教師空間:'已分配给教师空间',
+  剩餘空間:'剩余空间'
+}

+ 0 - 8
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/seviceDriveAuth.js

@@ -1,8 +0,0 @@
-export default {
-    //授權管理服務清單
-    "AEGMCPLY":"AClass One 週期",
-    'RYGVCPLY':'AClass One 無週期',
-    'IPALYEIY':'智慧教學服務空間',
-    '6BOPC6MD':'教與學大數據管理服務',
-    'ON6MBDOP':'智慧學校大數據管理服務'
-    }

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

@@ -1,8 +1,183 @@
 export default {
-//授權管理服務清單
-"AEGMCPLY":"AClass One 週期",
-'RYGVCPLY':'AClass One 無週期',
-'IPALYEIY':'智慧教學服務空間',
-'6BOPC6MD':'教與學大數據管理服務',
-'ON6MBDOP':'智慧學校大數據管理服務'
-}
+  //ServiceList.vue
+  AEGMCPLY: 'AClass One',
+  RYGVCPLY: 'AClass One',
+  IPALYEIY: '智慧教學服務空間',
+  '6BOPC6MD': '教與學大數據管理服務',
+  ON6MBDOP: '智慧學校大數據管理服務',
+  服務授權列表: '服務授權列表',
+  智慧教室授權管理: '智慧教室授權管理',
+  未購買: '未購買',
+  已購買: '已購買',
+  '服務啟用 / 到期日:': '服務啟用 / 到期日:',
+  剩餘: '剩餘',
+  天: '天',
+  無週期授權數量: '無週期授權數量',
+  有週期授權數量: '有週期授權數量',
+  固定分配數: '固定分配數',
+  動態分配數: '動態分配數',
+  剩餘分配數: '剩餘分配數',
+  總使用率: '總使用率',
+  詳細服務內容: '詳細服務內容',
+  管理AClassOne授權: '管理AClassOne授權',
+
+  //HiteachAuthList.vue
+  確定解除授權: '確定解除授權',
+  當前您所選中的PC: '當前您所選中的PC',
+  ',確定解除授權?': ',確定解除授權?',
+  '解除授權後,可在教室中的電腦再次進行綁定授權。': '解除授權後,可在教室中的電腦再次進行綁定授權。',
+  取消: '取消',
+  確定: '確定',
+  Hiteach序號數: 'Hiteach序號數',
+  大量: '大量',
+  單一: '單一',
+  授權: '授權',
+  可啟用裝置數: '可啟用裝置數',
+  已啟用裝置數: '已啟用裝置數',
+  管理Hiteach教室: '管理Hiteach教室',
+  暂无数据: '暂无数据',
+  序號到期日: '序號到期日:',
+  無到期日: '無到期日',
+  已到期: '已到期',
+  序號使用狀況: '序號使用狀況:',
+  未命名機台: '未命名機台',
+  解除授權: '解除授權',
+  顯示全部: '顯示全部',
+  '僅顯示HiTeach STD序號': '僅顯示HiTeach STD序號',
+  '僅顯示HiTeach PRO序號': '僅顯示HiTeach PRO序號',
+  '僅顯示HiTeach TBL序號': '僅顯示HiTeach TBL序號',
+  僅顯示已完成綁定的序號: '僅顯示已完成綁定的序號',
+  僅顯示已到期序號: '僅顯示已到期序號',
+  已成功解除授權: '已成功解除授權',
+
+  //SpaceStatus.vue
+  智慧教學服務空間狀態: '智慧教學服務空間狀態',
+  分配教學空間: '分配教學空間',
+  空間總數: '空間總數',
+  已使用空間總數: '已使用空間總數',
+  空間使用狀況: '空間使用狀況',
+  未使用空間數: '未使用空間數',
+  未使用空間比率: '未使用空間比率',
+  可使用空間數: '可使用空間數',
+  可使用空間比率: '可使用空間比率',
+  當前空間到期日: '當前空間到期日',
+  '基本 1GB 永久授權': '基本 1GB 永久授權',
+  '到期後將變更為IES基本空間,超出基本空間值將被收回': '到期後將變更為IES基本空間,超出基本空間值將被收回',
+  購買記錄: '購買記錄',
+  醍摩豆智慧教學服務空間: '醍摩豆智慧教學服務空間',
+  訂單日期: '訂單日期:',
+  到期日: '到期日:',
+  添購其他服務: '添購其他服務',
+  '空間已到期,超過僅供檢視': '空間已到期,超過僅供檢視',
+
+  //SpaceChart.vue
+  文件: '文件',
+  永久授權: '永久授權',
+  影片: '影片',
+  圖片: '圖片',
+  題目與試卷: '題目與試卷',
+  其他: '其他',
+  學生使用: '學生使用',
+  已分配至教師: '已分配至教師',
+  未使用: '未使用',
+  空間比率: '空間比率',
+  空間: '空間',
+  空間數: '空間數:',
+  空間比率: '空間比率:',
+
+  //學生帳號頁面的授權管理控件 student-account / AclassOneAuth.vue
+  確定收回所有授權: '確定收回所有授權',
+  '收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。': '收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。',
+  服務授權管理: '服務授權管理',
+  AClassONE智慧學伴服務授權: 'AClassONE智慧學伴服務授權',
+  '賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限': '賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限',
+  總授權數: '總授權數',
+  本次套用數: '本次套用數',
+  已使用數: '已使用數',
+  授權總覽: '授權總覽',
+  授權管理: '授權管理',
+  已購授權總數: '已購授權總數:',
+  note: '固定分配之授權由校方統一設置,使用者請於授權管理分頁進行授權對象的設定。動態取用之授權每日23:59:59將自動回收,學生可於次日再次啟用。',
+  快速套用授權: '快速套用授權',
+  套用至所有當前勾選項目: '套用至所有當前勾選項目',
+  套用: '套用',
+  套用至: '套用至',
+  套用至當前勾選目標第: '套用至當前勾選目標第',
+  項至第: '項至第',
+  項: '項',
+  所有項目: '所有項目',
+  未关联班级: '未关联班级',
+  套用至全校所有項目: '套用至全校所有項目',
+  共: '共',
+  個: '個',
+  '大於總授權數,無法使用': '大於總授權數,無法使用',
+  添購其他授權: '添購其他授權',
+  收回所有授權: '收回所有授權',
+  保存所有變更: '保存所有變更',
+  選擇班級: '選擇班級',
+
+  //下方method區塊
+  固定分配授權數: '固定分配授權數',
+  今日動態取用數: '今日動態取用數',
+  今日可用授權數: '今日可用授權數',
+  '請先選擇套用,再按保存': '請先選擇套用,再按保存',
+  '保存成功,本次尚無新增授權數量': '保存成功,本次尚無新增授權數量',
+  '保存成功,本次新增': '保存成功,本次新增',
+  個固定分配: '個固定分配',
+  '保存失敗,超過可用授權數!': '保存失敗,超過可用授權數!',
+  全部收回成功: '全部收回成功',
+  請先勾選欲授權之學生: '請先勾選欲授權之學生',
+  '請設定有效的目標項 !': '請設定有效的目標項 !',
+  '目前所選學制人數為 0 人!': '目前所選學制人數為 0 人!',
+  '請先選學制!': '請先選學制!',
+  '目前所選學級人數為 0 人!': '目前所選學級人數為 0 人!',
+  '請先選學級!': '請先選學級!',
+  '目前所選班級人數為 0 人!': '目前所選班級人數為 0 人!',
+  '請先選班級!': '請先選班級!',
+  '全校人數超過所購買授權數,無法使用': '全校人數超過所購買授權數,無法使用',
+  全部收回成功: '全部收回成功',
+
+  //老師帳號分配空間授權控件  teachermgmt/index.vue 空間欄位部分
+  空間分配: '空間分配',
+  確定收回所有空間: '確定收回所有空間',
+  '確定後全部每位教師都直接設置為0GB。': '確定後全部每位教師都直接設置為0GB。',
+  保存提醒: '保存提醒',
+  '当前空間数据尚未保存。如果關閉,修改的数据将不会保存!': '当前空間数据尚未保存。如果關閉,修改的数据将不会保存!',
+  回收空間: '回收空間',
+  保存變更: '保存變更',
+  空間分配狀態: '空間分配狀態',
+  總空間量: '總空間量:',
+  單人固定容量分配: '單人固定容量分配',
+  目前可被分配總量: '目前可被分配總量',
+  至: '至',
+
+  每人分配: '每人分配',
+  當前勾選之教師帳號: '當前勾選之教師帳號',
+  所有: '所有',
+  進階權限: '進階權限',
+  一般權限: '一般權限',
+  之教師帳號: '之教師帳號',
+  職稱為: '職稱為',
+  的教師帳號: '的教師帳號',
+  所有教師帳號: '所有教師帳號',
+
+  //下方method區塊
+  '請手動輸入數字!': '請手動輸入數字!',
+  '輸入了開頭為0的數字,請重新輸入!': '輸入了開頭為0的數字,請重新輸入!',
+  回收成功: '回收成功',
+  更新成功: '更新成功',
+  超出該校使用空間: '超出該校使用空間',
+  有不存在老師的ID: '有不存在老師的ID',
+  保存失敗: '保存失敗',
+  '您未進行任何個別變更或批次套用,無需保存': '您未進行任何個別變更或批次套用,無需保存',
+  '超出剩餘空間量,套用失敗': '超出剩餘空間量,套用失敗',
+  '套用完成,記得按保存': '套用完成,記得按保存',
+  '先輸入有效數字,再進行套用': '先輸入有效數字,再進行套用',
+  套用完成: '套用完成',
+  '先輸入有效數字,並進行勾選,再套用': '先輸入有效數字,並進行勾選,再套用',
+
+  //store/spaceAuth.js
+  學校已使用空間:'學校已使用空間',
+  已分配給教師空間:'已分配給教師空間',
+  剩餘空間:'剩餘空間'
+}

+ 8 - 0
TEAMModelOS/ClientApp/src/store/module/serviceDriveAuth.js

@@ -17,6 +17,7 @@ export default {
     spaceStatus: undefined,
     serviceIntroIsOpen: [],
     hiteachListItemIsOpen: [], //存放每個開關
+    currentTab:0,//0 服務清單, 1 hiteach 清單
 
     //接實際api使用,一開始序號為空
 
@@ -83,8 +84,15 @@ export default {
         return {};
       }
     },
+    getTab(state){
+      return state.currentTab
+    }
   },
   mutations: {
+    setTab(state,page){
+      state.currentTab = page;
+
+    },
     setServiceIntroIsOpen(state, data) {
       state.serviceIntroIsOpen = data;
     },

+ 12 - 11
TEAMModelOS/ClientApp/src/store/module/spaceAuth.js

@@ -1,4 +1,5 @@
 import apiTools from '@/api'
+import i18n from '@/locale'
 export default {
   namespaced: true,
   state: {
@@ -13,9 +14,9 @@ export default {
     currentSelectedTeacherId: [], //目前所選存放的老師的id,勾選給空間用
 
     pieNumData: [
-      { value: 0, name: '學校已使用空間' },
-      { value: 0, name: '已分配給教師空間' },
-      { value: 0, name: '剩餘空間' }
+      { value: 0, name: i18n.t("serviceDriveAuth['學校已使用空間']") },
+      { value: 0, name: i18n.t("serviceDriveAuth['已分配給教師空間']") },
+      { value: 0, name: i18n.t("serviceDriveAuth['剩餘空間']") }
     ],
     isKeyInSpace: false //存放是否有進行手動輸入
   },
@@ -108,17 +109,17 @@ export default {
       state.originalSpace = data.avaliable
       state.schoolUsedSpace = data.usedSpace
       state.pieNumData = [
-        { value: state.schoolUsedSpace, name: '學校已使用空間' },
-        { value: state.teacherUsedSpaceNum, name: '已分配給教師空間' },
-        { value: state.originalSpace - state.schoolUsedSpace - state.teacherUsedSpaceNum, name: '剩餘空間' }
+        { value: state.schoolUsedSpace, name: i18n.t("serviceDriveAuth['學校已使用空間']") },
+        { value: state.teacherUsedSpaceNum, name: i18n.t("serviceDriveAuth['已分配給教師空間']") },
+        { value: state.originalSpace - state.schoolUsedSpace - state.teacherUsedSpaceNum, name: i18n.t("serviceDriveAuth['剩餘空間']") }
       ]
       state.maxFixedAssignedValue = state.originalSpace - state.schoolUsedSpace
     },
     updatePieNumData(state) {
       state.pieNumData = [
-        { value: state.schoolUsedSpace, name: '學校已使用空間' },
-        { value: state.teacherUsedSpaceNum, name: '已分配給教師空間' },
-        { value: state.originalSpace - state.schoolUsedSpace - state.teacherUsedSpaceNum, name: '剩餘空間' }
+        { value: state.schoolUsedSpace, name: i18n.t("serviceDriveAuth['學校已使用空間']") },
+        { value: state.teacherUsedSpaceNum, name: i18n.t("serviceDriveAuth['已分配給教師空間']") },
+        { value: state.originalSpace - state.schoolUsedSpace - state.teacherUsedSpaceNum, name: i18n.t("serviceDriveAuth['剩餘空間']") }
       ]
     }
     //處理介面上的即時數據
@@ -168,10 +169,10 @@ export default {
           context.commit('updatePieNumData')
           context.commit('setIsLoading', false)
           context.commit('setMsgNum', 2)
-          if(res.status=='1'){
+          if (res.status == '1') {
             context.commit('setMsgNum', 3)
           }
-          if(res.status=='2'){
+          if (res.status == '2') {
             context.commit('setMsgNum', 4)
           }
         },

+ 45 - 49
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/Index.vue

@@ -1,43 +1,41 @@
 <style lang="less" scoped>
-@import "./Index.less";
+@import './Index.less';
 </style>
 
 <template>
   <div id="serviceDriveAuth">
     <Loading v-if="isloading == true"></Loading>
     <Row>
-      <i-col :xs="24" :sm="24" :md="24" :lg="7">
-        <ServiceList :serviceList="serviceList" :windowWidth='windowWidth' :windowHeight='windowHeight'/> 
-      </i-col>
-       <i-col :xs="24" :sm="24" :md="24" :lg="11">
-        <HiteachAuthList :hiteachAuthList="hiteachAuthList" :windowWidth='windowWidth' :windowHeight='windowHeight'/>
+      <i-col :xs="24" :sm="24" :md="24" :lg="18">
+        <ServiceList v-show="currentTab == 0" :serviceList="serviceList" :windowWidth="windowWidth" :windowHeight="windowHeight" />
+        <HiteachAuthList v-show="currentTab == 1" :hiteachAuthList="hiteachAuthList" :windowWidth="windowWidth" :windowHeight="windowHeight" />
       </i-col>
+
       <i-col :xs="24" :sm="24" :md="24" :lg="6">
-        <SpaceStatus :spaceStatus="spaceStatus" :windowWidth='windowWidth' :windowHeight='windowHeight' :isloading='isloading'/>
+        <SpaceStatus :spaceStatus="spaceStatus" :windowWidth="windowWidth" :windowHeight="windowHeight" :isloading="isloading" />
       </i-col>
     </Row>
   </div>
 </template>
 
 <script>
-import { mapGetters, mapMutations } from "vuex";
-import apiTools from "@/api";
-import PersonalPhoto from "@/components/public/personalPhoto/Index.vue";
-import ServiceList from "./SubComponents/ServiceList.vue";
-import Spacebar from "./SubComponents/Spacebar.vue";
-import HiteachAuthList from "./SubComponents/HiteachAuthList.vue";
-import SpaceStatus from "./SubComponents/SpaceStatus.vue" ;
-import Loading from '@/common/Loading.vue';
+import { mapGetters, mapMutations } from 'vuex'
+import apiTools from '@/api'
+import PersonalPhoto from '@/components/public/personalPhoto/Index.vue'
+import ServiceList from './SubComponents/ServiceList.vue'
+import Spacebar from './SubComponents/Spacebar.vue'
+import HiteachAuthList from './SubComponents/HiteachAuthList.vue'
+import SpaceStatus from './SubComponents/SpaceStatus.vue'
+import Loading from '@/common/Loading.vue'
 export default {
-  name: "serviceDriveAuth",
+  name: 'serviceDriveAuth',
   components: {
     PersonalPhoto,
     ServiceList,
     Spacebar,
     HiteachAuthList,
     SpaceStatus,
-    Loading,
-  
+    Loading
   },
   watch: {},
 
@@ -45,31 +43,30 @@ export default {
     return {
       isloading: true,
       windowWidth: window.innerWidth,
-      windowHeight: window.innerHeight,
-    };
+      windowHeight: window.innerHeight
+    }
   },
 
   computed: {
     ...mapGetters({
-      serviceList: "serviceDriveAuth/getServiceList",
-      hiteachAuthList:"serviceDriveAuth/getHiteachAuthList",
-      spaceStatus:"serviceDriveAuth/getSpaceStatus"
-    }),
+      serviceList: 'serviceDriveAuth/getServiceList',
+      hiteachAuthList: 'serviceDriveAuth/getHiteachAuthList',
+      spaceStatus: 'serviceDriveAuth/getSpaceStatus',
+      currentTab: 'serviceDriveAuth/getTab'
+    })
   },
 
-
-
   methods: {
-    getSchoolProduct(schoolCode){
-      this.$store.dispatch("serviceDriveAuth/getSchoolProduct",schoolCode).then(
-        (res) => {
-          this.isloading=false
-          this.$Message.success("取得API資料");
+    getSchoolProduct(schoolCode) {
+      this.$store.dispatch('serviceDriveAuth/getSchoolProduct', schoolCode).then(
+        res => {
+          this.isloading = false
+          this.$Message.success('取得API資料')
         },
-        (err) => {
-          this.$Message.error("取得資料失敗");
+        err => {
+          this.$Message.error('取得資料失敗')
         }
-      );
+      )
     },
     /*getDataAsyc() {
       this.$store.dispatch("serviceDriveAuth/getServiceListDataAsyc").then(
@@ -81,26 +78,25 @@ export default {
         }
       );
     },*/
-     onResize() {
-      this.windowWidth = window.innerWidth;
-      this.windowHeight = window.innerHeight;
-    },
+    onResize() {
+      this.windowWidth = window.innerWidth
+      this.windowHeight = window.innerHeight
+    }
   },
   mounted() {
     //console.log(this.$store.state.user.schoolCode)
-   
-    this.getSchoolProduct(this.$store.state.user.schoolCode);
+
+    this.getSchoolProduct(this.$store.state.user.schoolCode)
     //this.getDataAsyc();
-     this.$nextTick(() => {
-      window.addEventListener("resize", this.onResize);
-    });
+    this.$nextTick(() => {
+      window.addEventListener('resize', this.onResize)
+    })
   },
   beforeDestroy() {
-    window.removeEventListener("resize", this.onResize);
-  },
-
-};
+    window.removeEventListener('resize', this.onResize)
+  }
+}
 </script>
-<style lang="less" >
-@import "./serviceDriveAuthIview.less";
+<style lang="less">
+@import './serviceDriveAuthIview.less';
 </style>

+ 6 - 6
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/AclassOneChart.vue

@@ -14,9 +14,9 @@ export default {
 
       mockdata: {
         pieNumData: [
-          { value: this.used, name: '固定分配數' },
-          { value: this.less, name: '動態分配數' },
-          { value: this.avaliable - this.less - this.used, name: '剩餘分配數' }
+          { value: this.used, name:  this.$t("serviceDriveAuth['固定分配數']")},
+          { value: this.less, name: this.$t("serviceDriveAuth['動態分配數']") },
+          { value: this.avaliable - this.less - this.used, name: this.$t("serviceDriveAuth['剩餘分配數']") }
         ]
       }
     }
@@ -29,9 +29,9 @@ export default {
       if (val !== 0) {
         this.mockdata = {
           pieNumData: [
-            { value: this.serviceList[0].staUsed, name: '固定分配數' },
-            { value: this.serviceList[0].dynUsed, name: '動態分配數' },
-            { value: this.serviceList[0].avaliable - this.serviceList[0].dynUsed - this.serviceList[0].staUsed, name: '剩餘分配數' }
+            { value: this.serviceList[0].staUsed, name: this.$t("serviceDriveAuth['固定分配數']") },
+            { value: this.serviceList[0].dynUsed, name: this.$t("serviceDriveAuth['動態分配數']") },
+            { value: this.serviceList[0].avaliable - this.serviceList[0].dynUsed - this.serviceList[0].staUsed, name: this.$t("serviceDriveAuth['剩餘分配數']") }
           ]
         }
         this.drawLine(this.mockdata.pieNumData)

+ 52 - 62
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/HiteachAuthList.less

@@ -1,9 +1,38 @@
 .hiteachAuth-list {
-  .no-data-text{
+  .title-item {
+    margin-right: 30px;
+    position: relative;
+    font-weight: 400;
+    cursor: pointer;
+  }
+  .title-checked {
+    font-weight: 900;
+
+    .title-checked-line {
+      border-bottom: 2px solid #1cc0f3;
+      animation: 0.1s expand;
+      width: 100%;
+      height: 2px;
+      top: 32px;
+      left: 0px;
+      position: absolute;
+    }
+    @keyframes expand {
+      0% {
+        width: 0px;
+      }
+      100% {
+        width: 100%;
+      }
+    }
+  }
+
+  .no-data-text {
     text-align: center;
-    padding:40px;
+    padding: 40px;
   }
   .ivu-select-dropdown {
+    margin-left: 15%;
     border-radius: 4px !important;
     width: auto;
     background: #000;
@@ -27,26 +56,10 @@
       font-size: 10px;
       font-weight: 500;
     }
-    background: -webkit-linear-gradient(
-      360deg,
-      rgba(30, 30, 30, 0) 0%,
-      rgb(30, 30, 30)
-    );
-    background: -webkit-linear-gradient(
-      360deg,
-      rgba(30, 30, 30, 0) 0%,
-      rgb(30, 30, 30)
-    );
-    background: -webkit-linear-gradient(
-      360deg,
-      rgba(30, 30, 30, 0) 0%,
-      rgb(30, 30, 30)
-    );
-    background: -webkit-linear-gradient(
-      360deg,
-      rgba(30, 30, 30, 0) 0%,
-      rgb(30, 30, 30)
-    );
+    background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgb(30, 30, 30));
+    background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgb(30, 30, 30));
+    background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgb(30, 30, 30));
+    background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgb(30, 30, 30));
     padding: 10px 30px;
   }
   .hiteach-info {
@@ -57,7 +70,7 @@
       position: relative;
       top: 0px;
       left: 0px;
-      margin-right:4px;
+      margin-right: 4px;
       display: inline-block;
       font-size: 8px !important;
       font-weight: bolder;
@@ -74,13 +87,13 @@
       margin-top: -5px;
       font-weight: 500;
     }
-    .info-num-small{
+    .info-num-small {
       font-size: 30px;
       display: inline-block;
       font-weight: 500;
       position: relative;
       line-height: 25px;
-      left:15px;
+      left: 15px;
       top: 6px;
     }
   }
@@ -88,7 +101,7 @@
   .action-btn {
     cursor: pointer;
     border-radius: 5px;
-    margin-top: 15px;
+    margin-top: 35px;
     padding: 5px 12px;
     font-size: 12px;
     display: inline-block;
@@ -101,10 +114,8 @@
     &:hover {
       background-color: darken(#1cc0f3, 10%);
     }
-   
   }
   .hiteach-list {
-   
     padding-bottom: 80px;
     overflow: auto;
     border-top: 1px solid rgba(98, 97, 101, 0.4);
@@ -121,7 +132,7 @@
         z-index: 2;
         font-size: 30px;
         cursor: pointer;
-        &:hover{
+        &:hover {
           color: #1cc0f3;
         }
       }
@@ -177,7 +188,7 @@
         border-radius: 3px;
       }
       .pclist {
-        margin-left: 40px;
+        margin-left: 12%;
         @keyframes Itemfadein {
           0% {
             opacity: 0;
@@ -197,37 +208,17 @@
           .action-btn {
             display: block;
           }
-          background: -webkit-linear-gradient(
-            360deg,
-            rgba(30, 30, 30, 0) 0%,
-            rgba(110, 110, 110, 0.2) 50%,
-            rgba(110, 110, 110, 0.4) 100%
-          );
-          background: -webkit-linear-gradient(
-            360deg,
-            rgba(30, 30, 30, 0) 0%,
-            rgba(110, 110, 110, 0.2) 50%,
-            rgba(110, 110, 110, 0.4) 100%
-          );
-          background: -webkit-linear-gradient(
-            360deg,
-            rgba(30, 30, 30, 0) 0%,
-            rgba(110, 110, 110, 0.2) 50%,
-            rgba(110, 110, 110, 0.4) 100%
-          );
-          background: -webkit-linear-gradient(
-            360deg,
-            rgba(30, 30, 30, 0) 0%,
-            rgba(110, 110, 110, 0.2) 50%,
-            rgba(110, 110, 110, 0.4) 100%
-          );
+          background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgba(110, 110, 110, 0.2) 50%, rgba(110, 110, 110, 0.4) 100%);
+          background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgba(110, 110, 110, 0.2) 50%, rgba(110, 110, 110, 0.4) 100%);
+          background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgba(110, 110, 110, 0.2) 50%, rgba(110, 110, 110, 0.4) 100%);
+          background: -webkit-linear-gradient(360deg, rgba(30, 30, 30, 0) 0%, rgba(110, 110, 110, 0.2) 50%, rgba(110, 110, 110, 0.4) 100%);
         }
         &:first-child {
           border-bottom: none;
         }
         padding: 20px;
 
-        padding-left: 65px;
+        padding-left: 28px;
         list-style: none;
         .pc-title {
           font-size: 16px;
@@ -240,19 +231,18 @@
         .action-btn {
           display: none;
           position: absolute;
-          bottom: 36px;
+          bottom: 35%;
           border-radius: 4px !important;
         }
       }
-      .remove-pc{
+      .remove-pc {
         animation: 2s removeOut;
-      
+
         @keyframes removeOut {
-          0%{
+          0% {
             transform: translate(0px);
-            
           }
-          100%{
+          100% {
             transform: translate(130px);
             opacity: 0;
           }
@@ -265,7 +255,7 @@
     }
     .hicon-wrap {
       padding: 32px;
-      padding-left: 12px;
+      padding-left: 30%;
       * {
         font-size: 50px;
       }

+ 61 - 51
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/HiteachAuthList.vue

@@ -3,38 +3,39 @@
     <!-- 新增知识点弹窗 -->
     <Modal
       id="hiteachAuth-modal"
-      v-model="isOpenRemove"
-      :title="'確定解除授權'"
       ref="pointRef"
+      v-model="isOpenRemove"
+      :title="title"
+      
     >
-      <p>當前您所選中的PC【{{ currentConfirmRemovePC }}】,確定解除授權?</p>
-      <p>解除授權後,可在教室中的電腦再次進行綁定授權。</p>
+      <p>{{$t("serviceDriveAuth['當前您所選中的PC']")}}【{{ currentConfirmRemovePC }}】{{$t("serviceDriveAuth[',確定解除授權?']")}}</p>
+      <p>{{$t("serviceDriveAuth['解除授權後,可在教室中的電腦再次進行綁定授權。']")}}</p>
 
       <div slot="footer">
-        <Button type="text" @click="isOpenRemove = false">取消</Button>
+        <Button type="text" @click="isOpenRemove = false">{{$t("serviceDriveAuth['取消']")}}</Button>
         <Button type="primary" @click="removeUserPC(currentConfirmRemovePC)"
-          >確定</Button
+          >{{$t("serviceDriveAuth['確定']")}}</Button
         >
       </div>
     </Modal>
     <Loading v-if="isloading == true"></Loading>
     <div class="service-list">
-      <div class="service-listTitle">智慧教室授權管理</div>
+      <div class="service-listTitle"><span class="title-item" @click="setTab(0)">{{$t("serviceDriveAuth['服務授權列表']")}}</span> <span class="title-item" @click="setTab(1)" :class="{ 'title-checked': true }" >{{$t("serviceDriveAuth['智慧教室授權管理']")}}<span class="title-checked-line"></span></span></div>
       <Row>
         <i-col :xs="24" :sm="24" :md="24" :lg="19">
           <Row>
             <i-col :xs="24" :sm="24" :md="24" :lg="13">
               <div class="hiteach-info">
-                <p class="nomal-text">Hiteach序號數</p>
+                <p class="nomal-text">{{$t("serviceDriveAuth['Hiteach序號數']")}}</p>
                 <Row>
                   <i-col :xs="24" :sm="24" :md="24" :lg="12">
-                    <p class="device-max">大量</p>
-                    &nbsp;<span class="nomal-text">授權</span>
+                    <p class="device-max">{{$t("serviceDriveAuth['大量']")}}</p>
+                    &nbsp;<span class="nomal-text">{{$t("serviceDriveAuth['授權']")}}</span>
                     <p class="info-num-small">{{ serialInfo.multiAuthNum }}</p>
                   </i-col>
                   <i-col :xs="24" :sm="24" :md="24" :lg="12">
-                    <p class="device-max">單一</p>
-                    &nbsp;<span class="nomal-text">授權</span>
+                    <p class="device-max">{{$t("serviceDriveAuth['單一']")}}</p>
+                    &nbsp;<span class="nomal-text">{{$t("serviceDriveAuth['授權']")}}</span>
                     <p class="info-num-small">{{ serialInfo.singleAuthNum }}</p>
                   </i-col>
                 </Row>
@@ -44,7 +45,7 @@
             </i-col>
             <i-col :xs="24" :sm="24" :md="24" :lg="5">
               <div class="hiteach-info">
-                <p class="nomal-text">可啟用裝置數</p>
+                <p class="nomal-text">{{$t("serviceDriveAuth['可啟用裝置數']")}}</p>
                 <p class="info-num">
                   {{ serialInfo.couldActiveNum }}
                 </p>
@@ -52,7 +53,7 @@
             </i-col>
             <i-col :xs="24" :sm="24" :md="24" :lg="6">
               <div class="hiteach-info">
-                <p class="nomal-text">已啟用裝置數</p>
+                <p class="nomal-text">{{$t("serviceDriveAuth['已啟用裝置數']")}}</p>
                 <p class="info-num">
                   {{ serialInfo.activeNum }}
                 </p>
@@ -62,7 +63,7 @@
         >
         <i-col :xs="24" :sm="24" :md="24" :lg="5">
           <div class="action-btn" @click="gotoHiteachMgmt()">
-            管理Hiteach教室
+            {{$t("serviceDriveAuth['管理Hiteach教室']")}}
           </div>
         </i-col>
       </Row>
@@ -100,7 +101,7 @@
         class="no-data-text"
       >
         <img src="../../../assets/icon/no_data.png" width="120" />
-        <p style="color: #808080">暂无数据</p>
+        <p style="color: #808080">{{$t("serviceDriveAuth['暂无数据']")}}</p>
       </div>
 
 
@@ -144,7 +145,7 @@
               <span v-if="i.prodCode === '3222C6D2'" >HiTeach TBL </span>
               <span v-if="i.prodCode === 'J223IZAM'" >HiTeach PRO </span>
               <span class="device-max">{{
-                i.deviceMax == 1 ? "單一" : "大量"
+                i.deviceMax == 1 ? $t("serviceDriveAuth['單一']") : $t("serviceDriveAuth['大量']")
               }}</span>
             </p>
             <p
@@ -169,20 +170,20 @@
             <Row>
               <i-col :xs="24" :sm="24" :md="24" :lg="7">
                 <p class="nomal-text">
-                  序號到期日:<span
+                  {{$t("serviceDriveAuth['序號到期日']") }}<span
                     class="strong-text"
                     v-if="i.expireStatus == 'A' || i.expireStatus === ''"
-                    >{{ i.endDate == 0 ? "無到期日" : converTime(i.endDate) }}
+                    >{{ i.endDate == 0 ?  $t("serviceDriveAuth['無到期日']")  : converTime(i.endDate) }}
                   </span>
                   <!--span  class="strong-text" v-if="i.expireStatus === ''">(未啟用)</span-->
                   <span class="strong-text" v-if="i.expireStatus == 'F'"
-                    >已到期</span
+                    >{{$t("serviceDriveAuth['已到期']")}}</span
                   >
                 </p>
               </i-col>
               <i-col :xs="24" :sm="24" :md="24" :lg="17"
                 ><p class="nomal-text" style="margin-left: 4%">
-                  序號使用狀況:<span class="strong-text"
+                 {{$t("serviceDriveAuth['序號使用狀況']")}}<span class="strong-text"
                     >{{ i.deviceBound.length }} / {{ i.deviceMax }} ({{
                       (i.deviceBound.length > i.deviceMax
                         ? 100
@@ -211,7 +212,7 @@
             class="pclist-item"
           >
             <p class="pc-title">
-              {{ pc.pcname == null ? "未命名機台" : pc.pcname }}
+              {{ pc.pcname == null ? $t("serviceDriveAuth['未命名機台']") : pc.pcname }}
             </p>
             <p class="nomal-text" v-if="pc.ip!==null">
               {{ pc.ip }} | {{ pc.uuid != null ? pc.uuid : pc.uuid2 }}
@@ -228,7 +229,7 @@
               class="action-btn"
               @click="comfirmRemovePC(pc.uuid != null ? pc.uuid : pc.uuid2)"
             >
-              <Icon type="md-close" /> 解除授權
+              <Icon type="md-close" /> {{$t("serviceDriveAuth['解除授權']")}}
             </div>
           </li>
           <!--div v-if="i.deviceBound==0" class='pclist-empty' >尚未綁定任何機台</div-->
@@ -243,7 +244,7 @@ import "@/icons/svg/hiteach_std.svg";
 import "@/icons/svg/hiteach_pro.svg";
 import "@/icons/svg/hiteach_tbl.svg";
 import Loading from "@/common/Loading.vue";
-import { mapGetters } from "vuex";
+import { mapGetters,mapMutations } from "vuex";
 export default {
   props: ["hiteachAuthList", "windowHeight", "windowWidth"],
   name: "HiteachAuthList",
@@ -252,49 +253,55 @@ export default {
   },
   data() {
     return {
-      filterListItem: [
+     
+      tempRemovePCs: [], //暫存解綁的UserPC的Mac
+      hiteachListItemIsOpen: {},
+      filterType: "1",
+      currentConfirmRemovePC: "", //暫存讓使用者確認的UserPC
+      isOpenRemove: false,
+      isloading: false,
+    };
+  },
+  created() {
+    this.hiteachListItemIsOpen = this.hiteachListItemIsOpenVuex;
+  },
+  computed: {
+    ...mapGetters({
+      serialInfo: "serviceDriveAuth/getHiteachAuthListInfo",
+      aprules: "schoolBaseInfo/getAprules", //讀取周邊產品列表
+      hiteachListItemIsOpenVuex: "serviceDriveAuth/getHiteachListItemIsOpen",
+    }),
+    title:function(){
+      return this.$t('serviceDriveAuth["確定解除授權"]')
+    },
+    filterListItem:function(){
+      return [
         {
           name: 1,
-          text: "顯示全部",
+          text: this.$t('serviceDriveAuth["顯示全部"]'),
         },
         {
           name: 2,
-          text: "僅顯示HiTeach STD序號",
+          text: this.$t('serviceDriveAuth["僅顯示HiTeach STD序號"]'),
         },
         {
           name: 3,
-          text: "僅顯示HiTeach PRO序號",
+          text: this.$t('serviceDriveAuth["僅顯示HiTeach PRO序號"]'),
         },
         {
           name: 4,
-          text: "僅顯示HiTeach TBL序號",
+          text: this.$t('serviceDriveAuth["僅顯示HiTeach TBL序號"]'),
         },
         {
           name: 5,
-          text: "僅顯示已完成綁定的序號",
+          text: this.$t('serviceDriveAuth["僅顯示已完成綁定的序號"]'),
         },
         {
           name: 6,
-          text: "僅顯示已到期序號",
+          text: this.$t('serviceDriveAuth["僅顯示已到期序號"]'),
         },
-      ],
-      tempRemovePCs: [], //暫存解綁的UserPC的Mac
-      hiteachListItemIsOpen: {},
-      filterType: "1",
-      currentConfirmRemovePC: "", //暫存讓使用者確認的UserPC
-      isOpenRemove: false,
-      isloading: false,
-    };
-  },
-  created() {
-    this.hiteachListItemIsOpen = this.hiteachListItemIsOpenVuex;
-  },
-  computed: {
-    ...mapGetters({
-      serialInfo: "serviceDriveAuth/getHiteachAuthListInfo",
-      aprules: "schoolBaseInfo/getAprules", //讀取周邊產品列表
-      hiteachListItemIsOpenVuex: "serviceDriveAuth/getHiteachListItemIsOpen",
-    }),
+      ]
+    }
   },
   watch: {
     hiteachAuthList: function (value) {
@@ -313,8 +320,11 @@ export default {
     },
   },
   methods: {
+    ...mapMutations({
+      setTab: 'serviceDriveAuth/setTab'
+    }),
+
     //先讓使用者確定是否解除授權
-   
     comfirmRemovePC(mac) {
       this.isOpenRemove = true;
       this.currentConfirmRemovePC = mac;
@@ -330,7 +340,7 @@ export default {
       setTimeout(() => {
         document.getElementById(`PC${mac}`).style.display = "none";
 
-        this.$Message.success("已成功解除授權!");
+        this.$Message.success(this.$t('serviceDriveAuth["已成功解除授權"]'));
       }, 1800);
       this.isloading = true;
       setTimeout(() => {

+ 32 - 0
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/ServiceList.less

@@ -10,7 +10,39 @@
   .listTitle-noMargin {
     margin-left: 0px;
     padding-left: 20px;
+    .title-item{
+      margin-right:30px;
+      position: relative;
+      font-weight: 400; 
+      cursor: pointer;
+     
+    }
+    
+    .title-checked{
+      
+      font-weight: 900; 
+     
+      .title-checked-line{
+        border-bottom: 2px solid #1cc0f3;
+        animation: 0.1s expand ;
+        width: 100%;
+        height: 2px;
+        top:32px;
+        left:0px;
+        position: absolute;
+      }
+      @keyframes expand {
+        0%{
+          width: 0px;
+  
+        }
+        100%{
+          width: 100%;
+        }
+      }
+    }
   }
+  
   .service-search {
     position: relative;
     margin-top: -60px;

+ 72 - 27
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/ServiceList.vue

@@ -1,28 +1,29 @@
 <template>
   <div class="service-list">
-    <div class="service-listTitle listTitle-noMargin">服務授權列表</div>
+    <div class="service-listTitle listTitle-noMargin"><span class="title-item" :class="{ 'title-checked': true }" @click="setTab(0)">{{$t("serviceDriveAuth['服務授權列表']")}}<span class="title-checked-line"></span></span> <span class="title-item" @click="setTab(1)">{{$t("serviceDriveAuth['智慧教室授權管理']")}}</span></div>
     <div class="serviceList-wrap" :style="{ height: windowHeight - 116 + 'px' }">
-      <div class="service-item" v-for="(item, index) in serviceList" :key="index">
+      <div class="service-item" v-for="(item, index) in serviceList" :key="index" v-show="item.prodCode != 'AEGMCPLY'">
         <div class="detail-btn" @click="setIntroOpen(index)">
           <Icon v-show="serviceIntroIsOpen[index].isOpen == false" type="ios-arrow-down" />
           <Icon v-show="serviceIntroIsOpen[index].isOpen == true" type="ios-arrow-up" />
         </div>
         <div v-for="(proName, index) in serviceNameList" :key="index">
-          <p class="service-name" v-if="item.prodCode == proName">
+          <p class="service-name" v-if="item.prodCode == proName && proName != 'AEGMCPLY'">
             {{ $t(`serviceDriveAuth['${proName}']`) }}
           </p>
         </div>
-        <p class="unbuy" v-if="item.hasOwnProperty('notbuy') == true">未購買</p>
-        <p class="isbuy" v-else>已購買</p>
+        <p class="unbuy" v-if="item.hasOwnProperty('notbuy') == true">{{$t("serviceDriveAuth['未購買']")}}</p>
+        <p class="isbuy" v-else>{{$t("serviceDriveAuth['已購買']")}}</p>
 
         <p class="nomal-text">
-          服務啟用 / 到期日:
-          <span class="strong-text" v-if="item.startDate != 0">{{ converTime(item.startDate) }} - {{ converTime(item.endDate) }}</span>
-          <span class="strong-text" v-if="item.startDate == 0">--</span>
+          {{$t("serviceDriveAuth['服務啟用 / 到期日:']")}}
+          <span class="strong-text" v-if="item.startDate != 0 && item.prodCode != 'RYGVCPLY'">{{ converTime(item.startDate) }} - {{ converTime(item.endDate) }}</span>
+          <span class="strong-text" v-if="item.startDate == 0 && item.prodCode != 'RYGVCPLY'">--</span>
+          <span class="strong-text" v-if="item.prodCode == 'RYGVCPLY' && isNaN(aclassOneTimeLimitData.startDate) == false">{{ converTime(aclassOneTimeLimitData.startDate) }} - {{ converTime(aclassOneTimeLimitData.endDate) }}</span>
         </p>
         <div v-if="item.hasOwnProperty('notbuy') != true">
           <Row class="time-bar-wrap">
-            <i-col :xs="24" :sm="24" :md="24" :lg="16" style="padding-right: 10px">
+            <i-col :xs="24" :sm="24" :md="24" :lg="20" style="padding-right: 10px">
               <div class="time-bar" v-if="item.startDate != 0"></div>
               <div
                 class="remain-bar"
@@ -33,38 +34,71 @@
                 }"
               ></div>
             </i-col>
-            <i-col :xs="24" :sm="24" :md="24" :lg="8" v-if="item.startDate != 0">
-              <span class="remainDay">剩餘</span>
+            <i-col :xs="24" :sm="24" :md="24" :lg="4" v-if="item.startDate != 0">
+              <span class="remainDay">{{$t("serviceDriveAuth['剩餘']")}}</span>
               <span
                 class="remainDay-text"
                 :style="{
                   color: colorPercent(converTime(item.startDate), converTime(item.endDate)) ? '#ad3435' : '#1cc0f3'
                 }"
                 >{{ dateRemain(today(), converTime(item.endDate)) }}</span
-              ><span class="remainDay">天</span>
+              ><span class="remainDay">{{$t("serviceDriveAuth['天']")}}</span>
+            </i-col>
+          </Row>
+          <Row class="time-bar-wrap" v-if="isNaN(aclassOneTimeLimitData.startDate) == false">
+            <i-col :xs="24" :sm="24" :md="24" :lg="20" style="padding-right: 10px">
+              <div class="time-bar" v-if="item.prodCode == 'RYGVCPLY'"></div>
+              <div
+                class="remain-bar"
+                v-if="item.prodCode == 'RYGVCPLY'"
+                :style="{
+                  width: (dateRemain(today(), converTime(aclassOneTimeLimitData.endDate)) / dateRemain(converTime(aclassOneTimeLimitData.startDate), converTime(aclassOneTimeLimitData.endDate))).toFixed(2) * 100 + '%',
+                  'background-color': colorPercent(converTime(aclassOneTimeLimitData.startDate), converTime(aclassOneTimeLimitData.endDate)) ? '#ad3435' : '#1cc0f3'
+                }"
+              ></div>
+            </i-col>
+
+            <i-col :xs="24" :sm="24" :md="24" :lg="4" v-if="item.prodCode == 'RYGVCPLY'">
+              <span class="remainDay">{{$t("serviceDriveAuth['剩餘']")}}</span>
+              <span
+                class="remainDay-text"
+                :style="{
+                  color: colorPercent(converTime(aclassOneTimeLimitData.startDate), converTime(aclassOneTimeLimitData.endDate)) ? '#ad3435' : '#1cc0f3'
+                }"
+                >{{ dateRemain(today(), converTime(aclassOneTimeLimitData.endDate)) }}</span
+              ><span class="remainDay">{{$t("serviceDriveAuth['天']")}}</span>
             </i-col>
           </Row>
         </div>
         <!--給AclassOne-->
         <div class="detailinfo-block" v-if="index == 0 && serviceIntroIsOpen[index].isOpen == true">
-          <p class="nomal-text auth-num" v-if="item.hasOwnProperty('notbuy') == false">
-            授權數量:<span class="strong-text">{{ item.avaliable }}</span>
-          </p>
+          <Row>
+            <i-col :xs="24" :sm="24" :md="24" :lg="10">
+              <p class="nomal-text auth-num" v-if="item.hasOwnProperty('notbuy') == false">
+                {{$t("serviceDriveAuth['無週期授權數量']")}}:<span class="strong-text">{{ item.avaliable }}</span>
+              </p>
+            </i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="14">
+              <p class="nomal-text auth-num" v-if="aclassOneTimeLimitData != ''">
+                {{$t("serviceDriveAuth['有週期授權數量']")}}:<span class="strong-text">{{ aclassOneTimeLimitData.avaliable }}</span>
+              </p></i-col
+            >
+          </Row>
           <Row v-if="item.hasOwnProperty('notbuy') == false">
             <i-col :xs="24" :sm="24" :md="24" :lg="10">
               <div class="title-rec"></div>
               <p class="nomal-text title-withRec">
-                固定分配數:<span class="strong-text">{{ item.staUsed }} ({{ ((item.staUsed / item.avaliable) * 100).toFixed(1) }}%)</span>
+                 {{$t("serviceDriveAuth['固定分配數']")}}:<span class="strong-text">{{ item.staUsed }} ({{ ((item.staUsed / item.avaliable) * 100).toFixed(1) }}%)</span>
               </p>
               <br />
               <div class="title-rec"></div>
               <p class="nomal-text title-withRec">
-                動態分配數:<span class="strong-text">{{ item.dynUsed }} ({{ ((item.dynUsed / item.avaliable) * 100).toFixed(1) }}%)</span>
+                 {{$t("serviceDriveAuth['動態分配數']")}}:<span class="strong-text">{{ item.dynUsed }} ({{ ((item.dynUsed / item.avaliable) * 100).toFixed(1) }}%)</span>
               </p></i-col
             >
             <i-col :xs="24" :sm="24" :md="24" :lg="7">
               <p class="nomal-text">
-                總使用率:<span class="strong-text"> {{ (((item.dynUsed + item.staUsed) / item.avaliable) * 100).toFixed(1) }}%</span>
+                 {{$t("serviceDriveAuth['總使用率']")}}:<span class="strong-text"> {{ (((item.dynUsed + item.staUsed) / item.avaliable) * 100).toFixed(1) }}%</span>
               </p></i-col
             >
             <i-col :xs="24" :sm="24" :md="24" :lg="7"> <AclassOneChart :less="item.dynUsed" :used="item.staUsed" :avaliable="item.avaliable"/></i-col>
@@ -76,23 +110,23 @@
               'margin-top': item.hasOwnProperty('notbuy') != true ? '0px' : '10px'
             }"
           >
-            詳細服務內容:
+            {{$t("serviceDriveAuth['詳細服務內容']")}}:
           </p>
           <Row v-if="item.hasOwnProperty('notbuy') == true">
-            <i-col :xs="24" :sm="24" :md="24" :lg="16"> <p class="intro-text">實際行銷簡介文本待提供</p></i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="16"> <p class="intro-text">待提供</p></i-col>
           </Row>
           <div class="action-btn" @click="gotoStudentManagent()">
-            管理AClassOne授權
+            {{$t("serviceDriveAuth['管理AClassOne授權']")}}:
           </div>
         </div>
 
         <!--給其他產品-->
         <div class="detailinfo-block" v-if="index != 0 && serviceIntroIsOpen[index].isOpen == true">
           <p class="detail" :style="{ 'margin-top': item.hasOwnProperty('notbuy') != true ? '0px' : '10px' }">
-            詳細服務內容:
+            {{$t("serviceDriveAuth['詳細服務內容']")}}:
           </p>
           <Row>
-            <i-col :xs="24" :sm="24" :md="24" :lg="16"> <p class="intro-text">實際行銷簡介文本待提供</p></i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="16"> <p class="intro-text">待提供</p></i-col>
           </Row>
         </div>
       </div>
@@ -101,16 +135,17 @@
 </template>
 
 <script>
-import router from '../../../router'
+
 import AclassOneChart from './AclassOneChart'
-import { mapGetters } from 'vuex'
+import { mapGetters,mapMutations } from 'vuex'
 export default {
   props: ['serviceList', 'windowWidth', 'windowHeight'],
   name: 'ServiceList',
   data() {
     return {
       serviceIntroIsOpen: {},
-      oriIndex: ''
+      oriIndex: '',
+      aclassOneTimeLimitData: ''
     }
   },
   components: {
@@ -137,12 +172,22 @@ export default {
           isOpen: false
         })
         temp[0].isOpen = true //預設把AclassOne細節打開
+        if (this.serviceList[i].prodCode == 'AEGMCPLY' && this.serviceList[i].hasOwnProperty('notbuy') != true) {
+          //console.log(this.serviceList[i])
+          this.aclassOneTimeLimitData = this.serviceList[i]
+        }
       }
       this.serviceIntroIsOpen = temp
     }
   },
-
+  beforeRouteLeave(to, from, next) {
+    this.setTab(0)
+    next()
+  },
   methods: {
+    ...mapMutations({
+      setTab: 'serviceDriveAuth/setTab'
+    }),
     converTime: function(time) {
       //time: Unix timestamp(秒)
       let datetime = new Date()

+ 14 - 13
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/SpaceChart.vue

@@ -27,31 +27,31 @@ export default {
       (this.mockdata.pieNumData = [
         {
           value: value.doc,
-          name: "文件",
-          days: value.endDate == 0 ? "永久授權" : this.remainDays,
+          name: this.$t("serviceDriveAuth['文件']"),
+          days: value.endDate == 0 ? this.$t("serviceDriveAuth['永久授權']") : this.remainDays,
          
         },
-        { value: value.video, name: "影片", days: this.remainDays },
-        { value: value.image, name: "圖片", days: this.remainDays },
+        { value: value.video, name: this.$t("serviceDriveAuth['影片']"), days: this.remainDays },
+        { value: value.image, name: this.$t("serviceDriveAuth['圖片']"), days: this.remainDays },
         {
           value: value.item + value.paper,
-          name: "題目與試卷",
+          name: this.$t("serviceDriveAuth['題目與試卷']"),
           days: this.remainDays
         },
-        { value: value.other, name: "其他", days: this.remainDays },
+        { value: value.other, name: this.$t("serviceDriveAuth['其他']"), days: this.remainDays },
         {
           value: value.student,
-          name: "學生使用",
+          name: this.$t("serviceDriveAuth['學生使用']"),
           days: this.remainDays
         },
         {
           value: value.teacher,
-          name: "已分配至教師",
+          name: this.$t("serviceDriveAuth['已分配至教師']"),
           days: this.remainDays
         },
         {
           value: value.unUsed > 0?Math.abs(value.unUsed):0,
-          name: "未使用",
+          name: this.$t("serviceDriveAuth['未使用']"),
           days: this.remainDays
         },
       ]),
@@ -78,18 +78,18 @@ export default {
           formatter: function (v) {
             if (v.color != "#48474c") _this._data.currentColor = v.color;
             else _this._data.currentColor = "white";
-             console.log(this) 
+             //console.log(this) 
             return `
             <div class='chart-toolTip'> 
-             <p id='color-title'  >${v.data.name}空間</p>
-             <p class='title'>${v.data.name}空間數:<span class='value'>&nbsp;${
+             <p id='color-title'  >${v.data.name}${_this.$t("serviceDriveAuth['空間']")}</p>
+             <p class='title'>${v.data.name}${_this.$t("serviceDriveAuth['空間數']")}<span class='value'>&nbsp;${
               v.value / Math.pow(2, 20) < 1024
                 ? (v.value / Math.pow(2, 20)).toFixed(2) + "&nbspMB"
                 : (v.value / Math.pow(2, 30)).toFixed(2) + "&nbspGB"
             } </span></p>
              <p class='title'>${
                v.data.name
-             }空間比率:<span class='value'>&nbsp;${v.percent} %</span></p>
+             }${_this.$t("serviceDriveAuth['空間比率']")}<span class='value'>&nbsp;${v.percent} %</span></p>
 
              
             `;
@@ -251,6 +251,7 @@ export default {
 
 <style lang='less'>
 #space-chart {
+ 
   position: relative;
   height: 250px;
   margin-top: -20px;

+ 27 - 21
TEAMModelOS/ClientApp/src/view/serviceDriveAuth/SubComponents/SpaceStatus.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="space-status" :style="{ height: windowHeight - 68 + 'px' }">
     <div class="service-list">
-      <div class="service-listTitle">智慧教學服務空間狀態</div>
+      <div class="service-listTitle">{{$t("serviceDriveAuth['智慧教學服務空間狀態']")}}</div>
       <div class="action-btn" @click="gotoTeacherManagent()">
-        <Icon class="share-icon" type="md-share" /> 分配教學空間
+        <Icon class="share-icon" type="md-share" />{{$t("serviceDriveAuth['分配教學空間']")}} 
       </div>
     </div>
     <div
@@ -12,7 +12,7 @@
       style="margin-bottom: -50%"
     >
       <img src="../../../assets/icon/no_data.png" width="120" />
-      <p style="color: #808080">暂无数据</p>
+      <p style="color: #808080">{{$t("serviceDriveAuth['暂无数据']")}} </p>
     </div>
    
     <Row
@@ -20,18 +20,18 @@
       :style="{ visibility: isloading == true? 'hidden' : 'visible' }"
     >
       <i-col :xs="24" :sm="24" :md="24" :lg="12">
-        <p class="nomal-title">空間總數</p>
+        <p class="nomal-title">{{$t("serviceDriveAuth['空間總數']")}}</p>
         <p class="info-text">
           <span class="info-num">{{ totalavaliable }}</span>
           {{ totalavaliableText }}
         </p>
       </i-col>
       <i-col :xs="24" :sm="24" :md="24" :lg="12">
-        <p class="nomal-title">已使用空間總數</p>
+        <p class="nomal-title">{{$t("serviceDriveAuth['已使用空間總數']")}}</p>
         <p class="info-text" :class="{'over-used':totalused>totalavaliable}">
           <span class="info-num" >{{ totalused }}</span>
           {{ totalusedText }} 
-          <Tooltip transfer theme="light" content="空間已到期,超過僅供檢視"  placement="bottom" offset="-20">
+          <Tooltip transfer theme="light" :content="tooltipstext"  placement="bottom" offset="-20">
                         <Icon type="ios-alert-outline" color="#1cc0f3" size="20" v-if='totalused>totalavaliable'  style="position:absolute;top:-17px;margin-left:2px" />
                     </Tooltip>
         </p>
@@ -39,25 +39,25 @@
 
       <i-col :xs="24" :sm="24" :md="24" :lg="24">
         <div class="chart-wrap">
-          <p class="nomal-title">空間使用狀況</p>
+          <p class="nomal-title">{{$t("serviceDriveAuth['空間使用狀況']")}}</p>
           <SpaceChart :spaceStatus="spaceStatus" :remainDays="remainDays" />
           <!--放置餅圖剩下的空間狀態-->
           <div class="remail-data" v-if="totalavaliable>=totalused">
-            <p class="title">未使用空間數</p>
+            <p class="title">{{$t("serviceDriveAuth['未使用空間數']")}}</p>
             <p class="num">
               {{ unUsed }}<span class="small-text"> {{ unUsedText }}</span>
             </p>
-            <p class="title">未使用空間比率</p>
+            <p class="title">{{$t("serviceDriveAuth['未使用空間比率']")}}</p>
             <p class="num">
               {{ spaceStatus.unUsedPercent }}<span class="small-text"> %</span>
             </p>
           </div>
           <div class="remail-data" v-if="totalavaliable<totalused">
-            <p class="title">可使用空間數</p>
+            <p class="title">{{$t("serviceDriveAuth['可使用空間數']")}}</p>
             <p class="num">
                0 <span class="small-text"> GB</span>
             </p>
-            <p class="title">可使用空間比率</p>
+            <p class="title">{{$t("serviceDriveAuth['可使用空間比率']")}}</p>
             <p class="num">
               0<span class="small-text"> %</span>
             </p>
@@ -67,13 +67,13 @@
       </i-col>
       <i-col :xs="24" :sm="24" :md="24" :lg="24">
         <p class="deadline-title">
-          當前空間到期日:<span class="deadline-time" v-if="totalavaliable>=totalused"
-            >{{ converTime(spaceStatus.endDate) }} ({{ remainDays }} 天)</span
-          ><span v-else>基本 1GB 永久授權</span>
+          {{$t("serviceDriveAuth['當前空間到期日']")}}<span class="deadline-time" v-if="totalavaliable>=totalused"
+            >{{ converTime(spaceStatus.endDate) }} ({{ remainDays }} {{$t("serviceDriveAuth['']")}})</span
+          ><span v-else>{{$t("serviceDriveAuth['基本 1GB 永久授權']")}}</span>
         </p>
 
         <p class="note" v-if="totalavaliable>=totalused">
-          ( 到期後將變更為IES基本空間,超出基本空間值將被收回 )
+          ( {{$t("serviceDriveAuth['到期後將變更為IES基本空間,超出基本空間值將被收回']")}} )
         </p>
       </i-col>
     </Row>
@@ -82,7 +82,7 @@
       class="service-list buy-list"
       :style="{ visibility: isloading == true ? 'hidden' : 'visible' }"
     >
-      <div class="service-listTitle">購買記錄</div>
+      <div class="service-listTitle">{{$t("serviceDriveAuth['購買記錄']")}}</div>
 
       <div class="list-wrap">
         <!--無資料時-->
@@ -91,7 +91,7 @@
           class="no-data-text"
         >
           <img src="../../../assets/icon/no_data.png" width="120" />
-          <p style="color: #808080">暂无数据</p>
+          <p style="color: #808080">{{$t("serviceDriveAuth['暂无数据']")}}</p>
         </div>
         <!--有資料時-->
         <div
@@ -105,20 +105,20 @@
             ></i-col>
             <i-col :xs="24" :sm="24" :md="24" :lg="21"
               ><p class="title">
-                醍摩豆智慧教學服務空間
+                {{$t("serviceDriveAuth['醍摩豆智慧教學服務空間']")}}
                 {{ numberWithCommas(i.number) }} {{ i.unit }}
               </p>
               <Row s>
                 <i-col :xs="24" :sm="24" :md="24" :lg="12"
                   ><p class="nomal-text">
-                    訂單日期:<span class="strong-text">{{
+                    {{$t("serviceDriveAuth['訂單日期']")}}<span class="strong-text">{{
                       converTime(i.orderDate)
                     }}</span>
                   </p></i-col
                 >
                 <i-col :xs="24" :sm="24" :md="24" :lg="12"
                   ><p class="nomal-text">
-                    到期日:<span class="strong-text">{{
+                    {{$t("serviceDriveAuth['到期日']")}}<span class="strong-text">{{
                       converTime(i.endDate)
                     }}</span>
                   </p></i-col
@@ -128,7 +128,7 @@
           </Row>
         </div>
       </div>
-      <div class="buy-btn">添購其他服務</div>
+      <div class="buy-btn">{{$t("serviceDriveAuth['添購其他服務']")}}</div>
     </div>
   </div>
 </template>
@@ -153,6 +153,11 @@ export default {
       unUsedText: "",
     };
   },
+  computed:{
+    tooltipstext:function(){
+      return this.$t("serviceDriveAuth['空間已到期,超過僅供檢視']")
+    }
+  },
   watch: {
     spaceStatus: function (value) {
       console.log(value)
@@ -171,6 +176,7 @@ export default {
     },
   },
   methods: {
+    
     finalFormatNum(byte) {
       return this.numberWithCommas(this.formatBytes(byte)).substr(
         0,

+ 131 - 128
TEAMModelOS/ClientApp/src/view/student-account/AclassOneAuth.less

@@ -1,78 +1,79 @@
 .aclassone-auth {
-.dark-iview-select{
-  margin:0 10px;
-  position: relative;
   
-  width: 180px;
-   .ivu-select-selection{
-    outline: none !important;
-
-    background-color: #333237 !important;
-    border:#4a4a4d 1px solid !important ;
-    &:active,&:hover,&:focus{
+  position: absolute;
+  background-color: #2b2a2f;
+  border-left: 1px solid #434247;
+  width: 50%;
+  height: 100vh;
+  top: -45px;
+  right: -50% !important;
+  padding-left: 20px;
+  overflow: auto;
+  padding-bottom: 100px;
+  .dark-iview-select {
+    margin: 0 10px;
+    position: relative;
+    width: 180px;
+    .ivu-select-selection {
       outline: none !important;
-      border:#909096 1px solid !important ;
-     }
-    
-   }
-  
-}
-.input-num{
-  text-align: center;
-   color: #c0c0c0;
-   font-weight: 700;
-   font-size: 14px;
-   outline: none;
-   background-color: #333237;
-   width: 50px;
-   border-radius: 5px;
-   padding:4px 3px;
-   margin:0 5px;
-   top:-4px;
-   position: relative;
-   border:#4a4a4d 1px solid !important ;
-   &:focus{
-    border:#909096 1px solid !important ;
-   }
-    
-}  
-
-@keyframes slideIn {
-  0% {
-    right: 0%;
-  }
 
-  100% {
-    right: -50%;
+      background-color: #333237 !important;
+      border: #4a4a4d 1px solid !important ;
+      &:active,
+      &:hover,
+      &:focus {
+        outline: none !important;
+        border: #909096 1px solid !important ;
+      }
+    }
+  }
+  .input-num {
+    text-align: center;
+    color: #c0c0c0;
+    font-weight: 700;
+    font-size: 14px;
+    outline: none;
+    background-color: #333237;
+    width: 50px;
+    border-radius: 5px;
+    padding: 4px 3px;
+    margin: 0 5px;
+    top: -4px;
+    position: relative;
+    border: #4a4a4d 1px solid !important ;
+    &:focus {
+      border: #909096 1px solid !important ;
+    }
   }
-}
 
-@keyframes slideout {
-  0% {
-    right: 0%;
+  @keyframes slideIn {
+    0% {
+      right: 0%;
+    }
+
+    100% {
+      right: -50%;
+    }
   }
 
-  100% {
-    right: -30%;
+  @keyframes slideout {
+    0% {
+      right: 0%;
+    }
+
+    100% {
+      right: -30%;
+    }
   }
-}
-@keyframes fadeIn{
-  0%{
+  @keyframes fadeIn {
+    0% {
       opacity: 0;
-  }
-  100%{
+    }
+    100% {
       opacity: 1;
+    }
   }
 
-}
-  position: absolute;
-  background-color: #2b2a2f;
-  border-left: 1px solid #434247;
-  width: 50%;
-  height: 100vh;
-  top: -45px;
-  right: -50% !important;
-  padding-left: 20px;
 
   .title {
     color: #bab8c0;
@@ -150,13 +151,22 @@
   }
 
   .tabContent-wrap {
+    .bottom-border {
+      display: block;
+      margin-top:10px;
+      position: relative;
+      width: 110%;
+      border-bottom: 1px solid #434247;
+    }
+    position: relative;
     border-top: 1px solid #434247;
-    border-bottom: 1px solid #434247;
     margin-top: 15px;
     padding-right: 25%;
     margin-left: 10px;
     animation: fadeIn 0.5s !important;
 
+    overflow: auto;
+
     .chart-title {
       font-size: 16px;
       font-weight: 500;
@@ -218,60 +228,57 @@
       }
     }
   }
-    .option-group{
-      padding:15px;
-      animation: fadeIn 0.5s !important;
-      .small-title{
-        font-size: 10px;
-        font-weight: 400;
-        color: #797979;
-        margin-bottom: 25px;
-      }
-      
-      .assign-btn{
-        
-        cursor: pointer;
-        position: absolute;
-        line-height: 20px;
-       
-        right:-50px;
-        background-color: #515151;
-        color: #c0c0c0;
-        text-align: center;
-        display: inline-block;
-        font-size: 10px;
-        padding:2px 16px;
-        font-weight: 700;
-        border-radius: 5px;
-        &:hover {
-          color: #f5f5f5;
-          transition: 0.2s;
-          background-color: #1cc0f3
-        }
-       
-      }
-      
-      .option-text{
-        color: #797979;
-        font-size: 13px;
-        font-weight: 500;
-        line-height: 24px;
-      }
-      .option-item{
-       height: 48px;
-      }
-      .option-item:nth-child(3){
-        margin-top:-4px;
+  .option-group {
+    padding: 15px;
+    animation: fadeIn 0.5s !important;
+    .small-title {
+      font-size: 10px;
+      font-weight: 400;
+      color: #797979;
+      margin-bottom: 25px;
+    }
+
+    .assign-btn {
+      cursor: pointer;
+      position: absolute;
+      line-height: 20px;
+
+      right: -50px;
+      background-color: #515151;
+      color: #c0c0c0;
+      text-align: center;
+      display: inline-block;
+      font-size: 10px;
+      padding: 2px 16px;
+      font-weight: 700;
+      border-radius: 5px;
+      &:hover {
+        color: #f5f5f5;
+        transition: 0.2s;
+        background-color: #1cc0f3;
       }
     }
-  .unAssign-btn{
+
+    .option-text {
+      color: #797979;
+      font-size: 13px;
+      font-weight: 500;
+      line-height: 24px;
+    }
+    .option-item {
+      height: 48px;
+    }
+    .option-item:nth-child(3) {
+      margin-top: -4px;
+    }
+  }
+  .unAssign-btn {
     cursor: pointer;
     animation: fadeIn 0.7s !important;
-    position: absolute;
-    bottom: 135px;
+
     border-radius: 5px;
     margin: 20px;
-    width: 75%;
+    width: 100%;
     margin-left: 3%;
     padding: 10px 12px;
     font-size: 16px;
@@ -281,18 +288,18 @@
     font-weight: 700;
 
     &:hover {
-      background-color: darken( #616161, 10%);
+      background-color: darken(#616161, 10%);
     }
   }
-  
+
   .save-btn {
     cursor: pointer;
     animation: fadeIn 0.7s !important;
-    position: absolute;
-    bottom: 80px;
+    //position: absolute;
+    //bottom: 80px;
     border-radius: 5px;
     margin: 20px;
-    width: 75%;
+    width: 100%;
     margin-left: 3%;
     padding: 10px 12px;
     font-size: 16px;
@@ -300,36 +307,32 @@
     color: white;
     text-align: center;
     font-weight: 700;
-    
+
     &:hover {
       background-color: darken(#1cc0f3, 10%);
     }
   }
-  .buy-btn{
-    
-      width: 62% !important;
-      margin-left: 10%;
-    
+  .buy-btn {
+    width: 100% !important;
   }
 }
 
-
 .closeShow {
   animation: slideout 0.7s !important;
   right: 30%;
 }
 
-.light-btn{
+.light-btn {
   color: #ffffff !important;
   transition: 0.2s;
-  background-color: #1cc0f3 !important
+  background-color: #1cc0f3 !important;
 }
-.disabled-btn{
+.disabled-btn {
   background-color: #333333 !important;
   color: #a0a0a0 !important;
   &:hover {
     color: #a0a0a0 !important;
     background-color: #333333 !important;
   }
-  cursor:not-allowed !important
-}
+  cursor: not-allowed !important;
+}

+ 80 - 63
TEAMModelOS/ClientApp/src/view/student-account/AclassOneAuth.vue

@@ -1,51 +1,51 @@
 <template>
   <div class="aclassone-auth" :class="{ closeShow: closefromBtn == true }">
     <!--收回授權弹窗 -->
-    <Modal class="aclassone-auth-modal" v-model="isOpenRemove" :title="'確定收回所有授權'">
-      <p>收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。</p>
+    <Modal class="aclassone-auth-modal" v-model="isOpenRemove" :title="titletext">
+      <p>{{ $t("serviceDriveAuth['收回授權後使用數會直接設置為0,如欲給予授權可針對目標對象進行套用。']") }}</p>
 
       <div slot="footer">
-        <Button type="text" @click="isOpenRemove = false">取消</Button>
-        <Button type="primary" @click="resetAll">確定</Button>
+        <Button type="text" @click="isOpenRemove = false">{{ $t("serviceDriveAuth['取消']") }}</Button>
+        <Button type="primary" @click="resetAll">{{ $t("serviceDriveAuth['確定']") }}</Button>
       </div>
     </Modal>
     <div class="title">
-      服務授權管理<span @click="close()"><v-icon class="close-icon" iconClass="close"/></span>
+      {{ $t("serviceDriveAuth['服務授權管理']") }}<span @click="close()"><v-icon class="close-icon" iconClass="close"/></span>
     </div>
-    <div class="dashboard-title">AClassONE智慧學伴服務授權</div>
+    <div class="dashboard-title">{{ $t("serviceDriveAuth['AClassONE智慧學伴服務授權']") }}</div>
     <p class="dashboard-note">
-      賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限
+      {{ $t("serviceDriveAuth['賦予持有該服務授權的學生TEAM Modal ID使用AClassONE智慧學伴App的權限']") }}
     </p>
     <Row class="dashboard">
       <i-col :xs="24" :sm="8" :md="8" :lg="8">
         <p class="info-num">
           <CountTo class="auth-info-num" :endVal="totalAuth" :duration="600"></CountTo>
         </p>
-        <p class="info-text">總授權數</p>
+        <p class="info-text">{{ $t("serviceDriveAuth['總授權數']") }}</p>
       </i-col>
       <i-col :xs="24" :sm="8" :md="8" :lg="8">
         <p class="info-num">
           <CountTo class="auth-info-num" :endVal="currentAssignNum" :duration="600"></CountTo>
         </p>
-        <p class="info-text">本次套用數</p>
+        <p class="info-text">{{ $t("serviceDriveAuth['本次套用數']") }}</p>
       </i-col>
       <i-col :xs="24" :sm="8" :md="8" :lg="8">
         <p class="info-num">
           <CountTo class="auth-info-num" :endVal="usedAuth" :duration="600"></CountTo>
         </p>
-        <p class="info-text">已使用數</p>
+        <p class="info-text">{{ $t("serviceDriveAuth['已使用數']") }}</p>
       </i-col>
     </Row>
 
     <!--分頁控件--->
-    <span class="tab-btn" :class="{ 'tab-now': currentTab == 0 }" @click="setCurrentTab(0)">授權總覽</span>
-    <span class="tab-btn" :class="{ 'tab-now': currentTab == 1 }" @click="setCurrentTab(1)">授權管理</span>
+    <span class="tab-btn" :class="{ 'tab-now': currentTab == 0 }" @click="setCurrentTab(0)">{{ $t("serviceDriveAuth['授權總覽']") }}</span>
+    <span class="tab-btn" :class="{ 'tab-now': currentTab == 1 }" @click="setCurrentTab(1)">{{ $t("serviceDriveAuth['授權管理']") }}</span>
     <Row class="tabContent-wrap">
       <!--授權總攬-->
-      <div v-if="currentTab == 0">
+      <div v-if="currentTab == 0" class="tab-page">
         <i-col :xs="24" :sm="12" :md="12" :lg="16">
           <p class="chart-title">
-            已購授權總數:<span class="chart-totalnum">{{ totalAuth }}</span>
+            {{ $t("serviceDriveAuth['已購授權總數']") }}<span class="chart-totalnum">{{ totalAuth }}</span>
           </p>
           <AuthNumChart :clickTab="clickTab" :dbPieNumData="pieNumData" />
         </i-col>
@@ -57,24 +57,28 @@
           </div>
         </i-col>
 
-        <div class="chart-note"><span class="list-icon">*</span>&nbsp;固定分配之授權由校方統一設置,使用者請於授權管理分頁進行授權對象的設定。動態取用之授權每日23:59:59將自動回收,學生可於次日再次啟用。</div>
+        <div class="chart-note"><span class="list-icon">*</span>&nbsp;{{ $t("serviceDriveAuth['note']") }}</div>
+        <div class="bottom-border" />
+        <div v-if="currentTab == 0" class="save-btn buy-btn">{{ $t("serviceDriveAuth['添購其他授權']") }}</div>
       </div>
       <!--授權管理-->
       <div v-if="currentTab == 1" class="option-group">
-        <p class="small-title">快速套用授權</p>
+        <p class="small-title">{{ $t("serviceDriveAuth['快速套用授權']") }}</p>
         <Row class="option-item">
-          <i-col :xs="24" :sm="12" :md="12" :lg="22"><p class="option-text">套用至所有當前勾選項目</p></i-col>
+          <i-col :xs="24" :sm="12" :md="12" :lg="22"
+            ><p class="option-text">{{ $t("serviceDriveAuth['套用至所有當前勾選項目']") }}</p></i-col
+          >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
             ><div class="assign-btn" style="margin-top: -2px" @click="assignType(1)" :class="{ 'light-btn': currentAssignType == 1 }">
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
             </div></i-col
           >
         </Row>
         <Row class="option-item">
           <i-col :xs="24" :sm="12" :md="12" :lg="22"
             ><p class="option-text">
-              套用至當前勾選目標第
-              <input :disabled="selected.length == 0" class="input-num" v-model="inputSelectMin" type="number" placeholder="-" :max="selected.length" min="1" />項至第 <input :disabled="selected.length == 0" placeholder="-" class="input-num" v-model="inputSelectMax" type="number" :min="inputSelectMin" :max="selected.length" />項
+              {{ $t("serviceDriveAuth['套用至當前勾選目標第']") }}
+              <input :disabled="selected.length == 0" class="input-num" v-model="inputSelectMin" type="number" placeholder="-" :max="selected.length" min="1" />{{ $t("serviceDriveAuth['項至第']") }} <input :disabled="selected.length == 0" placeholder="-" class="input-num" v-model="inputSelectMax" type="number" :min="inputSelectMin" :max="selected.length" />{{ $t("serviceDriveAuth['']") }}
             </p></i-col
           >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
@@ -87,18 +91,19 @@
                 'disabled-btn': inputSelectMin > selected.length == true || inputSelectMax > selected.length == true || inputSelectMin > inputSelectMax == true || inputSelectMax <= 0 || inputSelectMax == '' || inputSelectMin <= 0 || inputSelectMin == ''
               }"
             >
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
             </div></i-col
           >
         </Row>
         <Row class="option-item">
           <i-col :xs="24" :sm="12" :md="12" :lg="22"
             ><p class="option-text">
-              套用至
+              {{ $t("serviceDriveAuth['套用至']") }}
               <!-- 學制Select -->
               <Select class="dark-iview-select" v-model="searchPeriod" :placeholder="$t('stuAccount.periodHolder')" clearable @on-clear="currentFilter = -1" @on-open-change="cleanData(0)" @on-change="filterData">
-                <Option v-for="(item, index) in periods" :value="item.id" :key="index">{{ item.name }}</Option> </Select
-              >所有項目
+                <Option v-for="(item, index) in periods" :value="item.id" :key="index">{{ item.name }}</Option>
+              </Select>
+              {{ $t("serviceDriveAuth['所有項目']") }}
             </p></i-col
           >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
@@ -111,19 +116,20 @@
                 'disabled-btn': currentFilter != 0 || searchPeriod == ''
               }"
             >
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
             </div></i-col
           >
         </Row>
         <Row class="option-item">
           <i-col :xs="24" :sm="12" :md="12" :lg="22"
             ><p class="option-text">
-              套用至
+              {{ $t("serviceDriveAuth['套用至']") }}
 
               <!-- 學級Select -->
               <Select class="dark-iview-select" v-model="searchGrade" :placeholder="$t('stuAccount.gradeHolder')" not-found-text="请先选择学段" clearable @on-clear="currentFilter = -1" @on-open-change="cleanData(1)" @on-change="filterData">
-                <Option v-for="(item, index) in grades" :value="item.id" :key="index">{{ item.name }}</Option> </Select
-              >所有項目
+                <Option v-for="(item, index) in grades" :value="item.id" :key="index">{{ item.name }}</Option>
+              </Select>
+              {{ $t("serviceDriveAuth['所有項目']") }}
             </p></i-col
           >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
@@ -136,19 +142,20 @@
                 'disabled-btn': currentFilter != 1 || searchGrade == ''
               }"
             >
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
             </div></i-col
           >
         </Row>
         <Row class="option-item">
           <i-col :xs="24" :sm="12" :md="12" :lg="22"
             ><p class="option-text">
-              套用至
+              {{ $t("serviceDriveAuth['套用至']") }}
               <!-- 教室Select -->
-              <Select v-model="searchClassroom" class="dark-iview-select" ref="classroom" placeholder="選擇班級" clearable @on-clear="currentFilter = -1" @on-open-change="cleanData(2)" @on-change="filterData" :not-found-text="searchGrade ? '此年级暂无教室' : '请先选择年级'">
+              <Select v-model="searchClassroom" class="dark-iview-select" ref="classroom" :placeholder="selectClasses" clearable @on-clear="currentFilter = -1" @on-open-change="cleanData(2)" @on-change="filterData" :not-found-text="searchGrade ? '此年级暂无教室' : '请先选择年级'">
                 <Option v-for="(item, index) in classes" :value="item.id" :key="index">{{ item.name }}</Option>
-                <Option value="noclass">未关联班级</Option> </Select
-              >所有項目
+                <Option value="noclass">{{ $t("serviceDriveAuth['未关联班级']") }}</Option>
+              </Select>
+              {{ $t("serviceDriveAuth['所有項目']") }}
             </p></i-col
           >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
@@ -161,13 +168,13 @@
                 'disabled-btn': currentFilter != 2 || searchClassroom == ''
               }"
             >
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
             </div></i-col
           >
         </Row>
         <Row class="option-item">
           <i-col :xs="24" :sm="12" :md="12" :lg="22"
-            ><p class="option-text">套用至全校所有項目 (共 {{ students.length }} 個,{{ students.length > totalAuth ? '大於總授權數,無法使用' : '' }})</p></i-col
+            ><p class="option-text">{{ $t("serviceDriveAuth['套用至全校所有項目']") }} ({{ $t("serviceDriveAuth['']") }} {{ students.length }} {{ $t("serviceDriveAuth['']") }},{{ students.length > totalAuth ? $t("serviceDriveAuth['大於總授權數,無法使用']") : '' }})</p></i-col
           >
           <i-col :xs="24" :sm="12" :md="12" :lg="2"
             ><div
@@ -179,19 +186,23 @@
                 'disabled-btn': students.length > totalAuth
               }"
             >
-              套用
+              {{ $t("serviceDriveAuth['套用']") }}
+            </div></i-col
+          >
+        </Row>
+        <Row>
+          <i-col :xs="24" :sm="24" :md="24" :lg="24">
+             <div class="bottom-border" />
+            <div v-if="currentTab == 1" class="unAssign-btn" @click="isOpenRemove = true">
+              {{ $t("serviceDriveAuth['收回所有授權']") }}
+            </div>
+            <div v-if="currentTab == 1" class="save-btn" @click="saveAuth()">
+              {{ $t("serviceDriveAuth['保存所有變更']") }}
             </div></i-col
           >
         </Row>
       </div>
     </Row>
-    <div v-if="currentTab == 0" class="save-btn buy-btn">添購其他授權</div>
-    <div v-if="currentTab == 1" class="unAssign-btn" @click="isOpenRemove = true">
-      收回所有授權
-    </div>
-    <div v-if="currentTab == 1" class="save-btn" @click="saveAuth()">
-      保存所有變更
-    </div>
   </div>
 </template>
 
@@ -230,9 +241,9 @@ export default {
       basicCount: 99,
       pointNum: 0,
       pieNumData: [
-        { value: 0, name: '固定分配授權數' },
-        { value: 0, name: '今日動態取用數' },
-        { value: 0, name: '今日可用授權數' }
+        { value: 0, name: this.$t("serviceDriveAuth['固定分配授權數']") },
+        { value: 0, name: this.$t("serviceDriveAuth['今日動態取用數']") },
+        { value: 0, name: this.$t("serviceDriveAuth['今日可用授權數']") }
       ],
 
       color: ['#eb974e', '#fb62bb', '#00f492'],
@@ -252,6 +263,12 @@ export default {
       classes: 'user/getClasses', // 教室ID
       aclassOneInfoNum: 'studentAclassOneAuth/getSchoolAclassOneInfoNum'
     }),
+    selectClasses: function() {
+      return this.$t("serviceDriveAuth['選擇班級']")
+    },
+    titletext: function() {
+      return this.$t("serviceDriveAuth['確定收回所有授權']")
+    },
     filterGrades: function() {
       var data = this.grades
       if (this.searchPeriod) {
@@ -302,7 +319,7 @@ export default {
 
     saveAuth() {
       if (this.currentAssignType == 0) {
-        this.$Message.warning('請先選擇套用,再按保存')
+        this.$Message.warning(this.$t("serviceDriveAuth['請先選擇套用,再按保存']"))
       }
 
       //情況1:純勾選
@@ -350,15 +367,15 @@ export default {
         //傳給後端
         this.$store.dispatch('studentAclassOneAuth/setSchoolAclassOneState', this.sentParams)
         if (this.finalAdd == 0) {
-          this.$Message.success('保存成功,本次尚無新增授權數量')
+          this.$Message.success(this.$t("serviceDriveAuth['保存成功,本次尚無新增授權數量']"))
         } else {
-          this.$Message.success('保存成功,本次新增' + this.finalAdd + '個固定分配')
+          this.$Message.success(this.$t("serviceDriveAuth['保存成功,本次新增']") + this.finalAdd + this.$t("serviceDriveAuth['個固定分配']"))
           //保存後重置狀態
           this.pieNumData[0].value = this.aclassOneInfoNum.total - this.aclassOneInfoNum.dyncNum
           this.pieNumData[2].value = this.aclassOneInfoNum.total - (this.pieNumData[1].value + this.pieNumData[0].value)
         }
       } else {
-        this.$Message.error('保存失敗,超過可用授權數!')
+        this.$Message.error(this.$t("serviceDriveAuth['保存失敗,超過可用授權數!']"))
       }
 
       this.currentFilter = -1
@@ -377,16 +394,16 @@ export default {
       this.$store.dispatch('studentAclassOneAuth/getSchoolAclassOne', schoolCode).then(
         res => {
           this.isloading = false
-          this.$Message.success('取得getSchoolAclassOne API資料')
+          //this.$Message.success('取得getSchoolAclassOne API資料')
         },
         err => {
-          this.$Message.error('取得getSchoolAclassOne API資料失敗')
+          //this.$Message.error('取得getSchoolAclassOne API資料失敗')
         }
       )
     },
     resetAll() {
       this.$store.dispatch('studentAclassOneAuth/recallSchoolAclassOne', this.$store.state.user.schoolCode)
-      this.$Message.success('全部收回成功')
+      this.$Message.success(this.$t("serviceDriveAuth['全部收回成功']"))
       this.isOpenRemove = false
     },
 
@@ -403,7 +420,7 @@ export default {
           this.searchGrade = ''
           this.searchClassroom = ''
           if (this.selected.length == 0) {
-            this.$Message.warning('請先勾選欲授權之學生 !')
+            this.$Message.warning(this.$t("serviceDriveAuth['請先勾選欲授權之學生']"))
           }
           this.currentAssignNum = this.selected.length
 
@@ -414,10 +431,10 @@ export default {
           this.searchGrade = ''
           this.searchClassroom = ''
           if (this.selected.length == 0) {
-            this.$Message.warning('請先勾選欲授權之學生')
+            this.$Message.warning(this.$t("serviceDriveAuth['請先勾選欲授權之學生']"))
           }
           if (this.inputSelectMin > this.selected.length == true || this.inputSelectMax > this.selected.length == true || this.inputSelectMin > this.inputSelectMax == true || this.inputSelectMax <= 0 || this.inputSelectMax == '' || this.inputSelectMin <= 0 || this.inputSelectMin == '') {
-            this.$Message.warning('請設定有效的目標項 !')
+            this.$Message.warning(this.$t("serviceDriveAuth['請設定有效的目標項 !']"))
             this.currentAssignNum = 0
           } else {
             this.currentAssignNum = parseInt(this.inputSelectMax) - (parseInt(this.inputSelectMin) - 1)
@@ -428,10 +445,10 @@ export default {
           if (this.currentFilter == 0) {
             this.currentAssignNum = this.tableFilterData.length
             if (this.tableFilterData.length == 0) {
-              this.$Message.warning('目前所選學制人數為 0 人!')
+              this.$Message.warning(this.$t("serviceDriveAuth['目前所選學制人數為 0 人!']"))
             }
           } else {
-            this.$Message.warning('請先選學制!')
+            this.$Message.warning(this.$t("serviceDriveAuth['請先選學制!']"))
             this.currentAssignNum = 0
           }
           break
@@ -439,10 +456,10 @@ export default {
           if (this.currentFilter == 1) {
             this.currentAssignNum = this.tableFilterData.length
             if (this.tableFilterData.length == 0) {
-              this.$Message.warning('目前所選學級人數為 0 人!')
+              this.$Message.warning(this.$t("serviceDriveAuth['目前所選學級人數為 0 人!']"))
             }
           } else {
-            this.$Message.warning('請先選學級!')
+            this.$Message.warning(this.$t("serviceDriveAuth['請先選學級!']"))
             this.currentAssignNum = 0
           }
           break
@@ -450,10 +467,10 @@ export default {
           if (this.currentFilter == 2) {
             this.currentAssignNum = this.tableFilterData.length
             if (this.tableFilterData.length == 0) {
-              this.$Message.warning('目前所選班級人數為 0 人!')
+              this.$Message.warning(this.$t("serviceDriveAuth['目前所選班級人數為 0 人!']"))
             }
           } else {
-            this.$Message.warning('請先選班級!')
+            this.$Message.warning(this.$t("serviceDriveAuth['請先選班級!']"))
             this.currentAssignNum = 0
           }
           break
@@ -465,7 +482,7 @@ export default {
             this.searchGrade = ''
             this.searchClassroom = ''
             if (this.students.length > this.totalAuth) {
-              this.$Message.warning('全校人數超過所購買授權數,無法使用')
+              this.$Message.warning(this.$t("serviceDriveAuth['全校人數超過所購買授權數,無法使用']"))
               this.currentAssignNum = 0
             } else {
               this.currentAssignNum = this.students.length

+ 43 - 2
TEAMModelOS/ClientApp/src/view/student-account/AddStudent.vue

@@ -87,10 +87,25 @@
             <FormItem :label="$t('stuAccount.stuName')" prop="name">
                 <Input v-model="studentInfo.name" :placeholder="$t('stuAccount.stuNameHolder')"></Input>
             </FormItem>
+            <!-- 學制、學級 -->
+            <div style="display:flex;justify-content: space-between;">
+                <!-- 學制 -->
+                <FormItem :label="$t('學制')" style="width:45%">
+                    <Select v-model="searchPeriod" style="width: 100%;" :placeholder="$t('stuAccount.periodHolder')" clearable >
+                        <Option v-for="(item, index) in periods" :value="item.id" :key="index">{{ item.name }}</Option>
+                    </Select>
+                </FormItem>
+                <!-- 學級 -->
+                <FormItem :label="$t('學級')" style="width:45%">
+                    <Select v-model="searchGrade" style="width: 100%; margin-left: 5px" :placeholder="$t('stuAccount.gradeHolder')" not-found-text="请先选择学段" clearable>
+                        <Option v-for="(item, index) in filterGrades" :value="item.id" :key="index">{{ item.name }}</Option>
+                    </Select>
+                </FormItem>
+            </div>
             <!-- 教室資訊 -->
             <FormItem :label="$t('stuAccount.classroomInfo')" prop="classId">
                 <Select filterable style="width:100%" :placeholder="$t('stuAccount.classroomInfoHolder')" v-model="studentInfo.classId" clearable>
-                    <Option v-for="(item,index) in classes.filter((item)=>{ return item.openType == '1'})" :value="item.id" :key="index" @click.native="setCurrentClassDetail(item)">{{ item.name }}</Option>
+                    <Option v-for="(item,index) in filterClasses" :value="item.id" :key="index" @click.native="setCurrentClassDetail(item)">{{ item.name }}</Option>
                 </Select>
                 <span style="float:right;color:#6DE2C4;cursor:pointer;text-decoration:underline;font-size:12px;" @click="createClassroom">{{$t('stuAccount.newClassroom')}}</span>
             </FormItem>
@@ -246,7 +261,9 @@
                         { validator: validateclassId, trigger: 'blur' },
                     ]
                 },
-                modal_loading: false
+                modal_loading: false,
+                searchPeriod: '',
+                searchGrade: ''
             }
         },
         computed: {
@@ -256,6 +273,30 @@
                 classes: 'user/getClasses', // 教室ID,
                 students: 'schoolBaseInfo/getStudent', // 學生List
             }),
+            filterGrades: function() {
+                var data = this.grades
+                if (this.searchPeriod) {
+                    let periodId = this.searchPeriod
+                    data = data.filter(function(item) {
+                        return item.periodId == periodId
+                    })
+                    return data
+                } else {
+                    return []
+                }
+            },
+            filterClasses: function() {
+                var data = this.classes
+                if (this.searchGrade) {
+                    let gradeId = this.searchGrade
+                    data = data.filter(function(item) {
+                        return item.gradeId == gradeId && item.openType == '1'
+                    })
+                    return data
+                } else {
+                    return []
+                }
+            },
             show: {
                 get() {
                     // if (this.bizType == 2 && this.isShow == true) {

+ 3 - 0
TEAMModelOS/ClientApp/src/view/student-account/AuthNumChart.vue

@@ -19,6 +19,7 @@ export default {
     setTimeout(
       () => {
         this.drawLine(this.dbPieNumData)
+        document.getElementById('authNum-chart').style.width='300px'
       },
       this.clickTab == false || this.isFirstOpenAuth == true ? 2300 : 0
     )
@@ -161,8 +162,10 @@ export default {
         setTimeout(function() {
           window.onresize = function() {
             myChart.resize()
+            document.getElementById('authNum-chart').style.width='auto'
           }
         }, 100)
+      
       }
     }
   }

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-account/Index.vue

@@ -595,11 +595,11 @@ export default {
         getSchoolAclassOne(schoolCode) {
             this.$store.dispatch('studentAclassOneAuth/getSchoolAclassOne', schoolCode).then(
                 res => {
-                    this.$Message.success('取得getSchoolAclassOne API資料')
+                    //this.$Message.success('取得getSchoolAclassOne API資料')
                     this.isloading = false
                 },
                 err => {
-                    this.$Message.error('取得getSchoolAclassOne API資料失敗')
+                    this.$Message.error('get API error')
                 }
             )
         },

+ 5 - 5
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue

@@ -222,7 +222,7 @@
     <div class="userLists" :class="{ isSetting: authMulti || isOpenSpaceAuth == true }">
       <div class="serch-box">
         <Input class="serch-inp" suffix="ios-search" :placeholder="$t('teachermgmt.blurryFilter')" v-model="blurryFilter" />
-        <Button class="multiSet" type="text" @click="openSpaceAuth()" v-if="!authMulti && isOpenSpaceAuth == false"><Icon class="share-icon" type="md-share" /> 分配教學空間</Button>
+        <Button class="multiSet" type="text" @click="openSpaceAuth()" v-if="!authMulti && isOpenSpaceAuth == false"><Icon class="share-icon" type="md-share" />&nbsp;{{ $t("serviceDriveAuth['分配教學空間']") }}</Button>
         <Button v-if="!authMulti && isOpenSpaceAuth == false" class="multiSet" type="text" @click="multiSet()"><icon class="icon" icon="shield-alt" /> {{ $t('teachermgmt.mulitSet') }}</Button>
       </div>
       <div class="userListContent">
@@ -661,7 +661,7 @@ export default {
           },
           {
             title: this.$t('teachermgmt.table.th3'),
-            width: 150,
+           
             key: 'job',
             sortable: true,
             render: (h, params) => {
@@ -677,7 +677,7 @@ export default {
             sortable: true,
 
             show: true,
-            width: 150,
+           
             render: (h, params) => {
               if (params.row.permissionCount > 0) {
                 return h(
@@ -695,8 +695,8 @@ export default {
             }
           },
           {
-            title: '空間分配',
-            width: 300,
+            title: this.$t("serviceDriveAuth['空間分配']"),
+            width: 250,
             slot: 'spaceShare',
             align: 'center'
           }

+ 65 - 51
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/SubComponent/SpaceAuth.vue

@@ -1,36 +1,36 @@
 <template>
   <div class="space-auth" :class="{ closeShow: closefromBtn == true }">
     <!--收回授權弹窗 -->
-    <Modal class="space-auth-modal" v-model="isOpenRemove" :title="'確定收回所有空間'">
-      <p>確定後全部每位教師都直接設置為0GB。</p>
+    <Modal class="space-auth-modal" v-model="isOpenRemove" :title="popupTitleOne">
+      <p>{{ $t("serviceDriveAuth['確定後全部每位教師都直接設置為0GB。']") }}</p>
 
       <div slot="footer">
-        <Button type="text" @click="isOpenRemove = false">取消</Button>
-        <Button type="primary" @click="resetAllSpace()">確定</Button>
+        <Button type="text" @click="isOpenRemove = false">{{ $t("serviceDriveAuth['取消']") }}</Button>
+        <Button type="primary" @click="resetAllSpace()">{{ $t("serviceDriveAuth['確定']") }}</Button>
       </div>
     </Modal>
     <!--未存關閉弹窗 -->
-    <Modal class="space-auth-modal" v-model="isOpenComfirmClose" :title="'保存提醒'">
-      <p>当前空間数据尚未保存。如果關閉,修改的数据将不会保存!</p>
+    <Modal class="space-auth-modal" v-model="isOpenComfirmClose" :title="popupTitleTwo">
+      <p>{{ $t("serviceDriveAuth['当前空間数据尚未保存。如果關閉,修改的数据将不会保存!']") }}</p>
 
       <div slot="footer">
-        <Button type="text" @click="isOpenComfirmClose = false">取消</Button>
-        <Button type="primary" @click="closeAuth()">確定</Button>
+        <Button type="text" @click="isOpenComfirmClose = false">{{ $t("serviceDriveAuth['取消']") }}</Button>
+        <Button type="primary" @click="closeAuth()">{{ $t("serviceDriveAuth['確定']") }}</Button>
       </div>
     </Modal>
     <div class="title">
-      分配教學空間<span @click="beforeCloseAuth()"><v-icon class="close-icon" iconClass="close"/></span>
+      {{ $t("serviceDriveAuth['分配教學空間']") }}<span @click="beforeCloseAuth()"><v-icon class="close-icon" iconClass="close"/></span>
       <div class="title-btn-group">
-        <div class="assign-btn" @click="isOpenRemove = true">回收空間</div>
-        <div class="assign-btn" @click="confirmSave()">保存變更</div>
+        <div class="assign-btn" @click="isOpenRemove = true">{{ $t("serviceDriveAuth['回收空間']") }}</div>
+        <div class="assign-btn" @click="confirmSave()">{{ $t("serviceDriveAuth['保存變更']") }}</div>
       </div>
     </div>
     <div id="scrollTarget" class="scroll-sprite" :style="{ height: tableHeight + 12 + 'px' }">
-      <p class="small-title">空間分配狀態</p>
+      <p class="small-title">{{ $t("serviceDriveAuth['空間分配狀態']") }}</p>
       <Row class="chart-view">
         <i-col :xs="24" :sm="12" :md="12" :lg="15" align="center">
           <p class="chart-title">
-            總空間量:<span class="chart-totalnum">{{ numberWithCommas(originalSpace) }} GB</span>
+            {{ $t("serviceDriveAuth['總空間量']") }}<span class="chart-totalnum">{{ numberWithCommas(originalSpace) }} GB</span>
           </p>
           <SpaceStatusChart />
         </i-col>
@@ -49,40 +49,46 @@
       <div>
         <!--目前只需要單人-->
         <div>
-          <p class="controlarea-title">單人固定容量分配 (目前可被分配總量:{{ maxFixedAssignedValue }} GB)</p>
+          <p class="controlarea-title">{{ $t("serviceDriveAuth['單人固定容量分配']") }} ({{ $t("serviceDriveAuth['目前可被分配總量']") }}:{{ maxFixedAssignedValue }} GB)</p>
 
           <Row class="option-item">
             <p class="option-text">
-              每人分配
+              {{ $t("serviceDriveAuth['每人分配']") }}
               <input step="1" @keydown="preventDot" type="number" placeholder="-" min="1" class="input-num" v-model="multiAssignValue" />
-              GB至
+              GB{{ $t("serviceDriveAuth['']") }}
             </p>
           </Row>
           <Row class="option-item">
             <i-col :xs="24" :sm="12" :md="12" :lg="16">
-              <p class="option-text">當前勾選之教師帳號</p>
+              <p class="option-text">{{ $t("serviceDriveAuth['當前勾選之教師帳號']") }}</p>
             </i-col>
             <i-col :xs="24" :sm="12" :md="12" :lg="8">
-              <div class="assign-btn" @click="setSelectedSpace()">套用</div>
+              <div class="assign-btn" @click="setSelectedSpace()">{{ $t("serviceDriveAuth['套用']") }}</div>
             </i-col>
           </Row>
           <Row class="option-item">
             <i-col :xs="24" :sm="12" :md="12" :lg="16">
-              <p class="option-text">所有<span class="strong-text">進階權限</span>之教師帳號</p>
+              <p class="option-text">
+                {{ $t("serviceDriveAuth['所有']") }}<span class="strong-text">{{ $t("serviceDriveAuth['進階權限']") }}</span
+                >{{ $t("serviceDriveAuth['之教師帳號']") }}
+              </p>
             </i-col>
             <i-col :xs="24" :sm="12" :md="12" :lg="8">
               <div class="assign-btn" @click="setAdvancedPerMissionSpace(0)">
-                套用
+                {{ $t("serviceDriveAuth['套用']") }}
               </div>
             </i-col>
           </Row>
           <Row class="option-item">
             <i-col :xs="24" :sm="12" :md="12" :lg="16">
-              <p class="option-text">所有<span class="strong-text">一般權限</span>之教師帳號</p>
+              <p class="option-text">
+                {{ $t("serviceDriveAuth['所有']") }}<span class="strong-text">{{ $t("serviceDriveAuth['一般權限']") }}</span
+                >{{ $t("serviceDriveAuth['之教師帳號']") }}
+              </p>
             </i-col>
             <i-col :xs="24" :sm="12" :md="12" :lg="8">
               <div class="assign-btn" @click="setAdvancedPerMissionSpace(1)">
-                套用
+                {{ $t("serviceDriveAuth['套用']") }}
               </div>
             </i-col>
           </Row>
@@ -90,22 +96,23 @@
           <Row class="option-item">
             <i-col :xs="24" :sm="12" :md="12" :lg="16">
               <p class="option-text">
-                職稱為
+                {{ $t("serviceDriveAuth['職稱為']") }}
                 <Select v-model="selectJob" class="dark-iview-select">
                   <Option :value="item" v-for="(item, index) in this.jobs" :key="index">{{ item == null ? '教師' : item }}</Option></Select
-                >的教師帳號
+                >
+                {{ $t("serviceDriveAuth['的教師帳號']") }}
               </p>
             </i-col>
             <i-col :xs="24" :sm="12" :md="12" :lg="8">
-              <div class="assign-btn" @click="setJobSpace()">套用</div>
+              <div class="assign-btn" @click="setJobSpace()">{{ $t("serviceDriveAuth['套用']") }}</div>
             </i-col>
           </Row>
           <Row class="option-item">
             <i-col :xs="24" :sm="12" :md="12" :lg="16">
-              <p class="option-text">所有教師帳號</p>
+              <p class="option-text">{{ $t("serviceDriveAuth['所有教師帳號']") }}</p>
             </i-col>
             <i-col :xs="24" :sm="12" :md="12" :lg="8">
-              <div class="assign-btn" @click="setAllSpace()">套用</div>
+              <div class="assign-btn" @click="setAllSpace()">{{ $t("serviceDriveAuth['套用']") }}</div>
             </i-col>
           </Row>
         </div>
@@ -161,6 +168,12 @@ export default {
       getCurrentSelectedTeacherId: 'spaceAuth/getCurrentSelectedTeacherId',
       isKeyInSpace: 'spaceAuth/getIsKeyInSpace'
     }),
+    popupTitleOne: function() {
+      return this.$t("serviceDriveAuth['確定收回所有空間']")
+    },
+    popupTitleTwo: function() {
+      return this.$t("serviceDriveAuth['保存提醒']")
+    },
     advancedAcountNum: function() {
       let num = 0
       this.teacherSpaceData.forEach(item => {
@@ -196,34 +209,34 @@ export default {
     multiAssignValue: function(val) {
       //input初步過濾負數與英文
       if (val == '') {
-        this.$Message.warning('請手動輸入數字!')
+        this.$Message.warning(this.$t("serviceDriveAuth['請手動輸入數字!']"))
         this.multiAssignValue = '-'
       }
       //輸入的數字開頭為0
       if (this.isFloat(parseFloat(val)) == false && val.length > 1 && val[0] == 0) {
-        this.$Message.warning('輸入了開頭為0的數字,請重新輸入!')
+        this.$Message.warning(this.$t("serviceDriveAuth['輸入了開頭為0的數字,請重新輸入!']"))
         this.multiAssignValue = '-'
       }
     },
     msgNum: function(val) {
       //等後端回傳後Loading結束才傳給使用者訊息
       if (val == 1) {
-        this.$Message.success('回收成功')
+        this.$Message.success(this.$t("serviceDriveAuth['回收成功']"))
 
         this.setIsKeyInSpace(false)
       }
       if (val == 2) {
-        this.$Message.success('更新成功')
+        this.$Message.success(this.$t("serviceDriveAuth['更新成功']"))
 
         this.setIsKeyInSpace(false)
       }
-       if (val == 3) {
-        this.$Message.warning('超出該校使用空間')
+      if (val == 3) {
+        this.$Message.warning(this.$t("serviceDriveAuth['超出該校使用空間']"))
 
         this.setIsKeyInSpace(false)
       }
       if (val == 4) {
-        this.$Message.warning('有不存在老師的ID')
+        this.$Message.warning(this.$t("serviceDriveAuth['有不存在老師的ID']"))
 
         this.setIsKeyInSpace(false)
       }
@@ -248,18 +261,19 @@ export default {
       if (this.tempTeacherAssignedData.length != 0) {
         let sentParams = {
           schoolCode: this.schoolCode,
-          teachers: this.teacherSpaceData}
+          teachers: this.teacherSpaceData
+        }
 
         this.$store.dispatch('spaceAuth/setTeacherSpace', sentParams).then(
           res => {
             this.setIsLoading(true)
           },
           err => {
-            this.$Message.error('保存失敗')
+            this.$Message.error(this.$t("serviceDriveAuth['保存失敗']"))
           }
         )
       } else {
-        this.$Message.warning('您未進行任何個別變更或批次套用,無需保存')
+        this.$Message.warning(this.$t("serviceDriveAuth['您未進行任何個別變更或批次套用,無需保存']"))
       }
       this.tempTeacherAssignedData = [] //清空暫存
     },
@@ -267,7 +281,7 @@ export default {
       if (this.multiAssignValue != '-') {
         this.setIsKeyInSpace(true)
         if (this.multiAssignValue > this.maxFixedAssignedValue / this.teacherSpaceData.length) {
-          this.$Message.error('超出剩餘空間量,套用失敗')
+          this.$Message.error(this.$t("serviceDriveAuth['超出剩餘空間量,套用失敗']"))
           this.multiAssignValue = '-'
         } else {
           this.teacherSpaceData.forEach(element => {
@@ -278,13 +292,13 @@ export default {
           //前端先做圖表的改變,此時還沒有寫到後端
           this.setTeacherUsedSpaceNum(this.teacherSpaceData)
           this.updatePieNumData()
-          this.$Message.success('套用完成,記得按保存')
+          this.$Message.success(this.$t("serviceDriveAuth['套用完成,記得按保存']"))
           this.multiAssignValue = '-'
 
           this.$emit('reload')
         }
       } else {
-        this.$Message.warning('先輸入有效數字,再進行套用')
+        this.$Message.warning(this.$t("serviceDriveAuth['先輸入有效數字,再進行套用']"))
       }
     },
     setJobSpace() {
@@ -320,7 +334,7 @@ export default {
         }
 
         if (this.multiAssignValue * jobFitNum + unchangedUsingSpace > this.maxFixedAssignedValue) {
-          this.$Message.error('超出剩餘空間量,套用失敗')
+          this.$Message.error(this.$t("serviceDriveAuth['超出剩餘空間量,套用失敗']"))
 
           this.multiAssignValue = '-'
         } else {
@@ -336,11 +350,11 @@ export default {
           //前端先做圖表的改變,此時還沒有寫到後端
           this.setTeacherUsedSpaceNum(this.teacherSpaceData)
           this.updatePieNumData()
-          this.$Message.success('套用完成,記得按保存')
+          this.$Message.success(this.$t("serviceDriveAuth['套用完成,記得按保存']"))
           this.multiAssignValue = '-'
         }
       } else {
-        this.$Message.warning('先輸入有效數字,再進行套用')
+        this.$Message.warning(this.$t("serviceDriveAuth['先輸入有效數字,再進行套用']"))
       }
       jobFitNum = 0
       unchangedUsingSpace = 0
@@ -355,7 +369,7 @@ export default {
         })
         console.log(unchangedUsingSpace)
         if (unchangedUsingSpace + this.multiAssignValue * this.getCurrentSelectedTeacherId.length > this.maxFixedAssignedValue) {
-          this.$Message.error('超出剩餘空間量,套用失敗')
+          this.$Message.error(this.$t("serviceDriveAuth['超出剩餘空間量,套用失敗']"))
           this.multiAssignValue = '-'
         } else {
           this.teacherSpaceData.forEach(element => {
@@ -370,10 +384,10 @@ export default {
 
           this.multiAssignValue = '-'
           this.setCurrentSelectedTeacherId([])
-          this.$Message.success('套用完成')
+          this.$Message.success(this.$t("serviceDriveAuth['套用完成']"))
         }
       } else {
-        this.$Message.warning('先輸入有效數字,並進行勾選,再套用')
+        this.$Message.warning(this.$t("serviceDriveAuth['先輸入有效數字,並進行勾選,再套用']"))
         this.multiAssignValue = '-'
         this.setCurrentSelectedTeacherId([])
       }
@@ -408,7 +422,7 @@ export default {
         //console.log(previousNum, this.multiAssignValue * targetNum, this.maxFixedAssignedValue)
 
         if (previousNum + this.multiAssignValue * targetNum > this.maxFixedAssignedValue) {
-          this.$Message.error('超出剩餘空間量,套用失敗')
+          this.$Message.error(this.$t("serviceDriveAuth['超出剩餘空間量,套用失敗']"))
           this.multiAssignValue = '-'
         } else {
           //辨識可以發派時的情況
@@ -422,10 +436,10 @@ export default {
           this.setTeacherUsedSpaceNum(this.teacherSpaceData)
           this.updatePieNumData()
           this.multiAssignValue = '-'
-          this.$Message.success('套用完成')
+          this.$Message.success(this.$t("serviceDriveAuth['套用完成']"))
         }
       } else {
-        this.$Message.warning('先輸入有效數字,再套用')
+        this.$Message.warning(this.$t("serviceDriveAuth['先輸入有效數字,再進行套用']"))
         this.multiAssignValue = '-'
       }
     },
@@ -443,7 +457,7 @@ export default {
 
     handleScroll(e) {
       // Any code to be executed when the window is scrolled
-      console.log('目前區塊捲動高度:' + e.currentTarget.scrollTop)
+      //console.log('目前區塊捲動高度:' + e.currentTarget.scrollTop)
       this.areaScrollTop = e.currentTarget.scrollTop
     },
     numberWithCommas(x) {
@@ -478,7 +492,7 @@ export default {
           this.setIsLoading(true)
         },
         err => {
-          this.$Message.error('回收寫入失敗' + err)
+          this.$Message.error(err)
         }
       )
       this.isOpenRemove = false