Quellcode durchsuchen

完成大云账号管理功能

liqk vor 4 Jahren
Ursprung
Commit
d96b2f3a7c

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

@@ -8,4 +8,12 @@ export default {
     getIdProfile: function (host,data) {
         return post(`${host}/oauth2/profile`, data)
     },
+    /* 发送短信验证码 */
+    sandMsgCode: function (host,data) {
+        return post(`${host}/service/sandsms/pin`, data)
+    },
+    /* 发送邮件验证码 */
+    sandMailCode: function (host,data) {
+        return post(`${host}/service/sandmail/pin`, data)
+    },
 }

+ 3 - 2
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -20,7 +20,7 @@
                     <DropdownItem class="user-info-wrap" @click.native="toUserCenter()">
                         <p>{{userInfo.username}}</p>
                         <p class="user-id">{{`ID: ${user.id}`}}</p>
-                        <Icon class="user-info-arrow" type="ios-arrow-forward" color="#1cc0f3" />
+                        <Icon class="user-info-arrow" type="ios-arrow-forward" color="#fff" />
                     </DropdownItem>
                     <DropdownItem class="drop-item" style="margin-top:8px" @click.native="onRoleSelect('student')">
                         <Icon type="md-swap" class="drop-item-icon" />
@@ -226,7 +226,8 @@ export default {
     margin-top: -25px;
 }
 .user-info-wrap {
-    /* background: #608f94; */
+    background: #608f94;
+    color: white;
     padding: 12px 16px;
     box-shadow: 0px 2px 5px #eee;
 }

+ 961 - 0
TEAMModelOS/ClientApp/src/static/countryCodeData.js

@@ -0,0 +1,961 @@
+export default {
+	'Bangladesh': {
+		'Culture': 'BD',
+		'CountryEn': 'Bangladesh',
+		'CountryCn': '孟加拉',
+		'CountryTw': '孟加拉',
+		'Code': 880
+	},
+	'Brunei': {
+		'Culture': 'ms-BN',
+		'CountryEn': 'Brunei',
+		'CountryCn': '汶莱',
+		'CountryTw': '汶萊',
+		'Code': 673
+	},
+	'Cambodia': {
+		'Culture': 'KH',
+		'CountryEn': 'Cambodia',
+		'CountryCn': '柬埔寨',
+		'CountryTw': '柬埔寨',
+		'Code': 855
+	},
+	'Cameroon': {
+		'Culture': '',
+		'CountryEn': 'Cameroon',
+		'CountryCn': '喀麦隆',
+		'CountryTw': '喀麥隆',
+		'Code': 237
+	},
+	'China': {
+		'Culture': 'zh-CN',
+		'CountryEn': 'China',
+		'CountryCn': '中国',
+		'CountryTw': '中國',
+		'Code': 86
+	},
+	'Russia': {
+		'Culture': 'ru-RU',
+		'CountryEn': 'Russia',
+		'CountryCn': '俄罗斯',
+		'CountryTw': '俄羅斯',
+		'Code': 7
+	},
+	'Hong Kong': {
+		'Culture': 'zh-HK',
+		'CountryEn': 'Hong Kong',
+		'CountryCn': '中国香港',
+		'CountryTw': '香港',
+		'Code': 852
+	},
+	'India': {
+		'Culture': '',
+		'CountryEn': 'India',
+		'CountryCn': '印度',
+		'CountryTw': '印度',
+		'Code': 91
+	},
+	'Indonesia': {
+		'Culture': 'id-ID',
+		'CountryEn': 'Indonesia',
+		'CountryCn': '印尼',
+		'CountryTw': '印尼',
+		'Code': 62
+	},
+	'Irag': {
+		'Culture': 'ar-IQ',
+		'CountryEn': 'Irag',
+		'CountryCn': '伊拉克',
+		'CountryTw': '伊拉克',
+		'Code': 964
+	},
+	'Iran': {
+		'Culture': 'fa-IR',
+		'CountryEn': 'Iran',
+		'CountryCn': '伊朗',
+		'CountryTw': '伊朗',
+		'Code': 98
+	},
+	'Israel': {
+		'Culture': 'he-IL',
+		'CountryEn': 'Israel',
+		'CountryCn': '以色列',
+		'CountryTw': '以色列',
+		'Code': 972
+	},
+	'Japan': {
+		'Culture': 'ja-JP',
+		'CountryEn': 'Japan',
+		'CountryCn': '日本',
+		'CountryTw': '日本',
+		'Code': 81
+	},
+	'SriLanka': {
+		'Culture': '',
+		'CountryEn': 'Sri Lanka',
+		'CountryCn': '斯里兰卡',
+		'CountryTw': '斯里蘭卡',
+		'Code': 94
+	},
+	'Sudan': {
+		'Culture': '',
+		'CountryEn': 'Sudan',
+		'CountryCn': '苏丹',
+		'CountryTw': '蘇丹',
+		'Code': 249
+	},
+	'UnitedArabEmirates': {
+		'Culture': '',
+		'CountryEn': 'United Arab Emirates',
+		'CountryCn': '阿拉伯联合大公国',
+		'CountryTw': '阿拉伯聯合大公國',
+		'Code': 971
+	},
+	'Zimbabwe': {
+		'Culture': '',
+		'CountryEn': 'Zimbabwe',
+		'CountryCn': '辛巴威',
+		'CountryTw': '辛巴威',
+		'Code': 263
+	},
+	'SaudiArabia': {
+		'Culture': '',
+		'CountryEn': 'Saudi Arabia',
+		'CountryCn': '沙乌地阿拉伯',
+		'CountryTw': '沙烏地阿拉伯',
+		'Code': 966
+	},
+	'Maldives': {
+		'Culture': 'div-MV',
+		'CountryEn': 'Maldives',
+		'CountryCn': '马尔地夫',
+		'CountryTw': '馬爾地夫',
+		'Code': 960
+	},
+	'Jamaica': {
+		'Culture': 'en-JM',
+		'CountryEn': 'Jamaica',
+		'CountryCn': '牙买加',
+		'CountryTw': '牙買加',
+		'Code': 1876
+	},
+	'Kuwait': {
+		'Culture': 'ar-KW',
+		'CountryEn': 'Kuwait',
+		'CountryCn': '科威特',
+		'CountryTw': '科威特',
+		'Code': 965
+	},
+	'KoreaNorth': {
+		'Culture': '',
+		'CountryEn': 'Korea North',
+		'CountryCn': '北韩',
+		'CountryTw': '北韓',
+		'Code': 850
+	},
+	'KoreaSouth': {
+		'Culture': '',
+		'CountryEn': 'Korea South',
+		'CountryCn': '南韩',
+		'CountryTw': '南韓',
+		'Code': 82
+	},
+	'Laos': {
+		'Culture': '',
+		'CountryEn': 'Laos',
+		'CountryCn': '寮国',
+		'CountryTw': '寮國',
+		'Code': 856
+	},
+	'Lebanon': {
+		'Culture': 'ar-LB',
+		'CountryEn': 'Lebanon',
+		'CountryCn': '黎巴嫩',
+		'CountryTw': '黎巴嫩',
+		'Code': 961
+	},
+	'Libya': {
+		'Culture': 'ar-LY',
+		'CountryEn': 'Libya',
+		'CountryCn': '利比亚',
+		'CountryTw': '利比亞',
+		'Code': 218
+	},
+	'Macao': {
+		'Culture': 'zh-MO',
+		'CountryEn': 'Macao',
+		'CountryCn': '中国澳门',
+		'CountryTw': '澳門',
+		'Code': 853
+	},
+	'Madagascar': {
+		'Culture': '',
+		'CountryEn': 'Madagascar',
+		'CountryCn': '马达加斯加',
+		'CountryTw': '馬達加斯加',
+		'Code': 261
+	},
+	'Malawi': {
+		'Culture': '',
+		'CountryEn': 'Malawi',
+		'CountryCn': '马拉威',
+		'CountryTw': '馬拉威',
+		'Code': 265
+	},
+	'Malaysia': {
+		'Culture': 'ms-MY',
+		'CountryEn': 'Malaysia',
+		'CountryCn': '马来西亚',
+		'CountryTw': '馬來西亞',
+		'Code': 60
+	},
+	'Mongolia': {
+		'Culture': 'mn-MN',
+		'CountryEn': 'Mongolia',
+		'CountryCn': '外蒙古',
+		'CountryTw': '外蒙古',
+		'Code': 976
+	},
+	'Myanmar': {
+		'Culture': '',
+		'CountryEn': 'Myanmar',
+		'CountryCn': '缅甸',
+		'CountryTw': '緬甸',
+		'Code': 95
+	},
+	'Nepal': {
+		'Culture': '',
+		'CountryEn': 'Nepal',
+		'CountryCn': '尼泊尔',
+		'CountryTw': '尼泊爾',
+		'Code': 977
+	},
+	'Oman': {
+		'Culture': 'ar-OM',
+		'CountryEn': 'Oman',
+		'CountryCn': '阿曼',
+		'CountryTw': '阿曼',
+		'Code': 968
+	},
+	'Pakistan': {
+		'Culture': 'ur-PK',
+		'CountryEn': 'Pakistan',
+		'CountryCn': '巴基斯坦',
+		'CountryTw': '巴基斯坦',
+		'Code': 92
+	},
+	'Philippines': {
+		'Culture': 'en-PH',
+		'CountryEn': 'Philippines',
+		'CountryCn': '菲律宾',
+		'CountryTw': '菲律賓',
+		'Code': 63
+	},
+	'Senegal': {
+		'Culture': '',
+		'CountryEn': 'Senegal',
+		'CountryCn': '赛内加尔',
+		'CountryTw': '賽內加爾',
+		'Code': 221
+	},
+	'Singapore': {
+		'Culture': 'zh-SG',
+		'CountryEn': 'Singapore',
+		'CountryCn': '新加坡',
+		'CountryTw': '新加坡',
+		'Code': 65
+	},
+	'Slovak': {
+		'Culture': 'sk-SK',
+		'CountryEn': 'Slovak',
+		'CountryCn': '斯洛伐克',
+		'CountryTw': '斯洛伐克',
+		'Code': 421
+	},
+	'Syria': {
+		'Culture': 'syr-SY',
+		'CountryEn': 'Syria',
+		'CountryCn': '叙利亚',
+		'CountryTw': '敘利亞',
+		'Code': 963
+	},
+	'Taiwan': {
+		'Culture': 'zh-TW',
+		'CountryEn': 'Taiwan',
+		'CountryCn': '中国台湾',
+		'CountryTw': '臺灣',
+		'Code': 886
+	},
+	'Tanzania': {
+		'Culture': '',
+		'CountryEn': 'Tanzania',
+		'CountryCn': '坦尚尼亚',
+		'CountryTw': '坦尚尼亞',
+		'Code': 255
+	},
+	'Thailand': {
+		'Culture': 'th-TH',
+		'CountryEn': 'Thailand',
+		'CountryCn': '泰国',
+		'CountryTw': '泰國',
+		'Code': 66
+	},
+	'Trinidad & Tobago': {
+		'Culture': 'en-TT',
+		'CountryEn': 'Trinidad & Tobago',
+		'CountryCn': '千里达及托巴哥',
+		'CountryTw': '千里達及托巴哥',
+		'Code': 1868
+	},
+	'Tunisia': {
+		'Culture': 'ar-TN',
+		'CountryEn': 'Tunisia',
+		'CountryCn': '突尼西亚',
+		'CountryTw': '突尼西亞',
+		'Code': 216
+	},
+	'Turkey': {
+		'Culture': 'tr-TR',
+		'CountryEn': 'Turkey',
+		'CountryCn': '土耳其',
+		'CountryTw': '土耳其',
+		'Code': 90
+	},
+	'Vietnam': {
+		'Culture': 'vi-VN',
+		'CountryEn': 'Vietnam',
+		'CountryCn': '越南',
+		'CountryTw': '越南',
+		'Code': 84
+	},
+	'Yemen Rep': {
+		'Culture': 'ar-YE',
+		'CountryEn': 'Yemen Rep',
+		'CountryCn': '叶门共和国',
+		'CountryTw': '葉門共和國',
+		'Code': 967
+	},
+	'America': {
+		'Culture': 'en-US',
+		'CountryEn': 'America',
+		'CountryCn': '美国',
+		'CountryTw': '美國',
+		'Code': 1
+	},
+	'Andorra': {
+		'Culture': '',
+		'CountryEn': 'Andorra',
+		'CountryCn': '安道尔',
+		'CountryTw': '安道爾',
+		'Code': 376
+	},
+	'Argentina': {
+		'Culture': 'es-AR',
+		'CountryEn': 'Argentina',
+		'CountryCn': '阿根廷',
+		'CountryTw': '阿根廷',
+		'Code': 54
+	},
+	'Bahamas': {
+		'Culture': '',
+		'CountryEn': 'Bahamas',
+		'CountryCn': '巴哈马',
+		'CountryTw': '巴哈馬',
+		'Code': 1242
+	},
+	'Bahrain': {
+		'Culture': 'ar-BH',
+		'CountryEn': 'Bahrain',
+		'CountryCn': '巴林',
+		'CountryTw': '巴林',
+		'Code': 973
+	},
+	'Belize': {
+		'Culture': 'en-BZ',
+		'CountryEn': 'Belize',
+		'CountryCn': '贝里斯',
+		'CountryTw': '貝里斯',
+		'Code': 501
+	},
+	'Brazil': {
+		'Culture': 'pt-BR',
+		'CountryEn': 'Brazil',
+		'CountryCn': '巴西',
+		'CountryTw': '巴西',
+		'Code': 55
+	},
+	'Bolivia': {
+		'Culture': 'es-BO',
+		'CountryEn': 'Bolivia',
+		'CountryCn': '玻利维亚',
+		'CountryTw': '玻利維亞',
+		'Code': 591
+	},
+	'Canada': {
+		'Culture': 'en-CA',
+		'CountryEn': 'Canada',
+		'CountryCn': '加拿大',
+		'CountryTw': '加拿大',
+		'Code': 1
+	},
+	'Casta Rica': {
+		'Culture': '',
+		'CountryEn': 'Casta Rica',
+		'CountryCn': '哥斯大黎加',
+		'CountryTw': '哥斯大黎加',
+		'Code': 506
+	},
+	'Chile': {
+		'Culture': 'es-CL',
+		'CountryEn': 'Chile',
+		'CountryCn': '智利',
+		'CountryTw': '智利',
+		'Code': 56
+	},
+	'Colombia': {
+		'Culture': 'es-CO',
+		'CountryEn': 'Colombia',
+		'CountryCn': '哥伦比亚',
+		'CountryTw': '哥倫比亞',
+		'Code': 57
+	},
+	'Cuba': {
+		'Culture': '',
+		'CountryEn': 'Cuba',
+		'CountryCn': '古巴',
+		'CountryTw': '古巴',
+		'Code': 53
+	},
+	'Cyprus': {
+		'Culture': '',
+		'CountryEn': 'Cyprus',
+		'CountryCn': '赛普勒斯',
+		'CountryTw': '賽普勒斯',
+		'Code': 357
+	},
+	'Dominican Rep.': {
+		'Culture': 'es-DO',
+		'CountryEn': 'Dominican Rep.',
+		'CountryCn': '多明尼加',
+		'CountryTw': '多明尼加',
+		'Code': 1
+	},
+	'Ecuador': {
+		'Culture': 'es-EC',
+		'CountryEn': 'Ecuador',
+		'CountryCn': '厄瓜多',
+		'CountryTw': '厄瓜多',
+		'Code': 593
+	},
+	'Guatemala': {
+		'Culture': 'es-GT',
+		'CountryEn': 'Guatemala',
+		'CountryCn': '瓜地马拉',
+		'CountryTw': '瓜地馬拉',
+		'Code': 502
+	},
+	'Honduras': {
+		'Culture': 'es-HN',
+		'CountryEn': 'Honduras',
+		'CountryCn': '宏都拉斯',
+		'CountryTw': '宏都拉斯',
+		'Code': 504
+	},
+	'Mauritius': {
+		'Culture': '',
+		'CountryEn': 'Mauritius',
+		'CountryCn': '摩里西斯',
+		'CountryTw': '摩里西斯',
+		'Code': 230
+	},
+	'Mexico': {
+		'Culture': 'es-MX',
+		'CountryEn': 'Mexico',
+		'CountryCn': '墨西哥',
+		'CountryTw': '墨西哥',
+		'Code': 52
+	},
+	'Venezuela': {
+		'Culture': 'es-VE',
+		'CountryEn': 'Venezuela',
+		'CountryCn': '委内瑞拉',
+		'CountryTw': '委內瑞拉',
+		'Code': 58
+	},
+	'PuertoRico': {
+		'Culture': 'es-PR',
+		'CountryEn': 'Puerto Rico',
+		'CountryCn': '波多黎各',
+		'CountryTw': '波多黎各',
+		'Code': 1
+	},
+	'Nicaragua': {
+		'Culture': 'es-NI',
+		'CountryEn': 'Nicaragua',
+		'CountryCn': '尼加拉瓜',
+		'CountryTw': '尼加拉瓜',
+		'Code': 505
+	},
+	'Panama': {
+		'Culture': 'es-PA',
+		'CountryEn': 'Panama',
+		'CountryCn': '巴拿马',
+		'CountryTw': '巴拿馬',
+		'Code': 507
+	},
+	'PapuaNewGuinea': {
+		'Culture': '',
+		'CountryEn': 'Papua New Guinea',
+		'CountryCn': '巴布亚纽几内亚',
+		'CountryTw': '巴布亞紐幾內亞',
+		'Code': 675
+	},
+	'Paraguay': {
+		'Culture': 'es-PY',
+		'CountryEn': 'Paraguay',
+		'CountryCn': '巴拉圭',
+		'CountryTw': '巴拉圭',
+		'Code': 595
+	},
+	'Peru': {
+		'Culture': 'es-PE',
+		'CountryEn': 'Peru',
+		'CountryCn': '秘鲁',
+		'CountryTw': '秘魯',
+		'Code': 51
+	},
+	'Austria': {
+		'Culture': 'de-AT',
+		'CountryEn': 'Austria',
+		'CountryCn': '奥地利',
+		'CountryTw': '奧地利',
+		'Code': 43
+	},
+	'Belgium': {
+		'Culture': '',
+		'CountryEn': 'Belgium',
+		'CountryCn': '比利时',
+		'CountryTw': '比利時',
+		'Code': 32
+	},
+	'Bulgaria': {
+		'Culture': 'bg-BG',
+		'CountryEn': 'Bulgaria',
+		'CountryCn': '保加利亚',
+		'CountryTw': '保加利亞',
+		'Code': 359
+	},
+	'Czech Rep.': {
+		'Culture': 'cs-CZ',
+		'CountryEn': 'Czech Rep.',
+		'CountryCn': '捷克',
+		'CountryTw': '捷克',
+		'Code': 420
+	},
+	'Denmark': {
+		'Culture': 'da-DK',
+		'CountryEn': 'Denmark',
+		'CountryCn': '丹麦',
+		'CountryTw': '丹麥',
+		'Code': 45
+	},
+	'Finland': {
+		'Culture': 'fi-FI',
+		'CountryEn': 'Finland',
+		'CountryCn': '芬兰',
+		'CountryTw': '芬蘭',
+		'Code': 358
+	},
+	'France': {
+		'Culture': 'fr-FR',
+		'CountryEn': 'France',
+		'CountryCn': '法国',
+		'CountryTw': '法國',
+		'Code': 33
+	},
+	'Germany': {
+		'Culture': 'de-DE',
+		'CountryEn': 'Germany',
+		'CountryCn': '德国',
+		'CountryTw': '德國',
+		'Code': 49
+	},
+	'Gibraltar': {
+		'Culture': '',
+		'CountryEn': 'Gibraltar',
+		'CountryCn': '直布罗陀',
+		'CountryTw': '直布羅陀',
+		'Code': 350
+	},
+	'Grenada': {
+		'Culture': '',
+		'CountryEn': 'Grenada',
+		'CountryCn': '格瑞那达',
+		'CountryTw': '格瑞那達',
+		'Code': 1473
+	},
+	'Greek': {
+		'Culture': 'el-GR',
+		'CountryEn': 'Greek',
+		'CountryCn': '希腊',
+		'CountryTw': '希臘',
+		'Code': 30
+	},
+	'Hungary': {
+		'Culture': 'hu-HU',
+		'CountryEn': 'Hungary',
+		'CountryCn': '匈牙利',
+		'CountryTw': '匈牙利',
+		'Code': 36
+	},
+	'Haiti': {
+		'Culture': '',
+		'CountryEn': 'Haiti',
+		'CountryCn': '海地',
+		'CountryTw': '海地',
+		'Code': 509
+	},
+	'Iceland': {
+		'Culture': 'is-IS',
+		'CountryEn': 'Iceland',
+		'CountryCn': '冰岛',
+		'CountryTw': '冰島',
+		'Code': 354
+	},
+	'Ireland': {
+		'Culture': 'en-IE',
+		'CountryEn': 'Ireland',
+		'CountryCn': '爱尔兰',
+		'CountryTw': '愛爾蘭',
+		'Code': 353
+	},
+	'Italy': {
+		'Culture': 'it-IT',
+		'CountryEn': 'Italy',
+		'CountryCn': '义大利',
+		'CountryTw': '義大利',
+		'Code': 39
+	},
+	'IvoryCoastRep': {
+		'Culture': '',
+		'CountryEn': 'Ivory Coast Rep.',
+		'CountryCn': '象牙海岸',
+		'CountryTw': '象牙海岸',
+		'Code': 225
+	},
+	'Luxembourg': {
+		'Culture': '',
+		'CountryEn': 'Luxembourg',
+		'CountryCn': '卢森堡',
+		'CountryTw': '盧森堡',
+		'Code': 352
+	},
+	'Monaco': {
+		'Culture': 'fr-MC',
+		'CountryEn': 'Monaco',
+		'CountryCn': '摩纳哥',
+		'CountryTw': '摩納哥',
+		'Code': 377
+	},
+	'Netherlands': {
+		'Culture': 'nl-NL',
+		'CountryEn': 'Netherlands',
+		'CountryCn': '荷兰',
+		'CountryTw': '荷蘭',
+		'Code': 31
+	},
+	'Norway': {
+		'Culture': '',
+		'CountryEn': 'Norway',
+		'CountryCn': '挪威',
+		'CountryTw': '挪威',
+		'Code': 47
+	},
+	'Poland': {
+		'Culture': 'pl-PL',
+		'CountryEn': 'Poland',
+		'CountryCn': '波兰',
+		'CountryTw': '波蘭',
+		'Code': 48
+	},
+	'Portugal': {
+		'Culture': 'pt-PT',
+		'CountryEn': 'Portugal',
+		'CountryCn': '葡萄牙',
+		'CountryTw': '葡萄牙',
+		'Code': 351
+	},
+	'Qatar': {
+		'Culture': 'ar-QA',
+		'CountryEn': 'Qatar',
+		'CountryCn': '卡达',
+		'CountryTw': '卡達',
+		'Code': 974
+	},
+	'Romania': {
+		'Culture': 'ro-RO',
+		'CountryEn': 'Romania',
+		'CountryCn': '罗马尼亚',
+		'CountryTw': '羅馬尼亞',
+		'Code': 40
+	},
+	'Spain': {
+		'Culture': 'es-ES',
+		'CountryEn': 'Spain',
+		'CountryCn': '西班牙',
+		'CountryTw': '西班牙',
+		'Code': 34
+	},
+	'Sweden': {
+		'Culture': 'sv-SE',
+		'CountryEn': 'Sweden',
+		'CountryCn': '瑞典',
+		'CountryTw': '瑞典',
+		'Code': 46
+	},
+	'Switzerland': {
+		'Culture': '',
+		'CountryEn': 'Switzerland',
+		'CountryCn': '瑞士',
+		'CountryTw': '瑞士',
+		'Code': 41
+	},
+	'UnitedKingdom': {
+		'Culture': 'en-GB',
+		'CountryEn': 'United Kingdom',
+		'CountryCn': '英国',
+		'CountryTw': '英國',
+		'Code': 44
+	},
+	'Ukraine': {
+		'Culture': 'uk-UA',
+		'CountryEn': 'Ukraine',
+		'CountryCn': '乌克兰',
+		'CountryTw': '烏克蘭',
+		'Code': 380
+	},
+	'Uruguay': {
+		'Culture': 'es-UY',
+		'CountryEn': 'Uruguay',
+		'CountryCn': '乌拉圭',
+		'CountryTw': '烏拉圭',
+		'Code': 598
+	},
+	'Vatican': {
+		'Culture': '',
+		'CountryEn': 'Vatican',
+		'CountryCn': '梵谛冈',
+		'CountryTw': '梵諦岡',
+		'Code': 379
+	},
+	'Yugoslavia': {
+		'Culture': '',
+		'CountryEn': 'Yugoslavia',
+		'CountryCn': '南斯拉夫',
+		'CountryTw': '南斯拉夫',
+		'Code': 381
+	},
+	'Australia': {
+		'Culture': 'en-AU',
+		'CountryEn': 'Australia',
+		'CountryCn': '澳大利亚',
+		'CountryTw': '澳大利亞',
+		'Code': 61
+	},
+	'Fiji': {
+		'Culture': '',
+		'CountryEn': 'Fiji',
+		'CountryCn': '斐济',
+		'CountryTw': '斐濟',
+		'Code': 679
+	},
+	'Guam': {
+		'Culture': '',
+		'CountryEn': 'Guam',
+		'CountryCn': '关岛',
+		'CountryTw': '關島',
+		'Code': 1
+	},
+	'Malta': {
+		'Culture': 'mt-MT',
+		'CountryEn': 'Malta',
+		'CountryCn': '马尔他',
+		'CountryTw': '馬爾他',
+		'Code': 356
+	},
+	'NewCaledonia': {
+		'Culture': '',
+		'CountryEn': 'New Caledonia',
+		'CountryCn': '新喀里多尼亚',
+		'CountryTw': '新喀里多尼亞',
+		'Code': 687
+	},
+	'NewZealand': {
+		'Culture': 'en-NZ',
+		'CountryEn': 'New Zealand',
+		'CountryCn': '纽西兰',
+		'CountryTw': '紐西蘭',
+		'Code': 64
+	},
+	'Palau': {
+		'Culture': '',
+		'CountryEn': 'Palau',
+		'CountryCn': '帛琉',
+		'CountryTw': '帛琉',
+		'Code': 680
+	},
+	'Saipan': {
+		'Culture': '',
+		'CountryEn': 'Saipan',
+		'CountryCn': '塞班岛',
+		'CountryTw': '塞班島',
+		'Code': 670
+	},
+	'Solomon IS.': {
+		'Culture': '',
+		'CountryEn': 'Solomon IS.',
+		'CountryCn': '所罗门群岛',
+		'CountryTw': '所羅門群島',
+		'Code': 677
+	},
+	'Central African': {
+		'Culture': '',
+		'CountryEn': 'Central African',
+		'CountryCn': '中非共和国',
+		'CountryTw': '中非共和國',
+		'Code': 236
+	},
+	'Congo': {
+		'Culture': '',
+		'CountryEn': 'Congo',
+		'CountryCn': '刚果',
+		'CountryTw': '剛果',
+		'Code': 243
+	},
+	'Egypt': {
+		'Culture': 'ar-EG',
+		'CountryEn': 'Egypt',
+		'CountryCn': '埃及',
+		'CountryTw': '埃及',
+		'Code': 671
+	},
+	'ElSalvador': {
+		'Culture': 'es-SV',
+		'CountryEn': 'El Salvador',
+		'CountryCn': '萨尔瓦多',
+		'CountryTw': '薩爾瓦多',
+		'Code': 503
+	},
+	'Estonia': {
+		'Culture': 'et-EE',
+		'CountryEn': 'Estonia',
+		'CountryCn': '爱沙尼亚',
+		'CountryTw': '愛沙尼亞',
+		'Code': 372
+	},
+	'Ethiopia': {
+		'Culture': '',
+		'CountryEn': 'Ethiopia',
+		'CountryCn': '衣索匹亚',
+		'CountryTw': '衣索匹亞',
+		'Code': 251
+	},
+	'Gabonese Rep.': {
+		'Culture': '',
+		'CountryEn': 'Gabonese Rep.',
+		'CountryCn': '加彭共和国',
+		'CountryTw': '加彭共和國',
+		'Code': 241
+	},
+	'Jordan': {
+		'Culture': 'ar-JO',
+		'CountryEn': 'Jordan',
+		'CountryCn': '约旦',
+		'CountryTw': '約旦',
+		'Code': 962
+	},
+	'Kenya': {
+		'Culture': 'sw-KE',
+		'CountryEn': 'Kenya',
+		'CountryCn': '肯亚',
+		'CountryTw': '肯亞',
+		'Code': 254
+	},
+	'Lesotho': {
+		'Culture': '',
+		'CountryEn': 'Lesotho',
+		'CountryCn': '赖索托',
+		'CountryTw': '賴索托',
+		'Code': 266
+	},
+	'Liberia': {
+		'Culture': '',
+		'CountryEn': 'Liberia',
+		'CountryCn': '赖比瑞亚',
+		'CountryTw': '賴比瑞亞',
+		'Code': 231
+	},
+	'Morocco': {
+		'Culture': 'ar-MA',
+		'CountryEn': 'Morocco',
+		'CountryCn': '摩洛哥',
+		'CountryTw': '摩洛哥',
+		'Code': 212
+	},
+	'Mozambique': {
+		'Culture': '',
+		'CountryEn': 'Mozambique',
+		'CountryCn': '莫三比克',
+		'CountryTw': '莫三比克',
+		'Code': 258
+	},
+	'Niger': {
+		'Culture': '',
+		'CountryEn': 'Niger',
+		'CountryCn': '尼日共和国',
+		'CountryTw': '尼日共和國',
+		'Code': 227
+	},
+	'Nigeria': {
+		'Culture': '',
+		'CountryEn': 'Nigeria',
+		'CountryCn': '奈及利亚',
+		'CountryTw': '奈及利亞',
+		'Code': 234
+	},
+	'South Africa Rep.': {
+		'Culture': '',
+		'CountryEn': 'South Africa Rep.',
+		'CountryCn': '南非',
+		'CountryTw': '南非',
+		'Code': 27
+	},
+	'Swaziland': {
+		'Culture': '',
+		'CountryEn': 'Swaziland',
+		'CountryCn': '史瓦济兰',
+		'CountryTw': '史瓦濟蘭',
+		'Code': 268
+	},
+	'Uganda': {
+		'Culture': '',
+		'CountryEn': 'Uganda',
+		'CountryCn': '乌干达',
+		'CountryTw': '烏干達',
+		'Code': 256
+	},
+	'Algeria': {
+		'Culture': 'ar-DZ',
+		'CountryEn': 'Algeria',
+		'CountryCn': '阿尔及利亚',
+		'CountryTw': '阿爾及利亞',
+		'Code': 213
+	},
+	'Algeria': {
+		'Culture': 'be-BY',
+		'CountryEn': 'Belarus',
+		'CountryCn': '白俄罗斯',
+		'CountryTw': '白俄羅斯',
+		'Code': 375
+	}
+}

+ 1 - 2
TEAMModelOS/ClientApp/src/view/homepage/HomePage.vue

@@ -10,7 +10,7 @@
             <div v-show="srvAdr == 'China'" class="verify-status-box" v-if="!hasVerify">
                 <Icon custom="iconfont icon-phone-unverify" class="tips-icon" />
                 <b class="verify-title">{{$t('home.verifyPh')}}</b>
-                <router-link to="/regist" class="to-verify">{{$t('home.toPhone')}}</router-link>
+                <router-link to="/home/userCenter" class="to-verify">{{$t('home.toPhone')}}</router-link>
             </div>
             <div v-show="srvAdr == 'China'" class="verify-status-box" v-else>
                 <Icon type="md-checkmark-circle-outline" class="tips-icon" color="#19be6b" />
@@ -404,7 +404,6 @@ export default {
                     console.log(err)
                 }
             )
-
         }
     },
     created() {

+ 639 - 5
TEAMModelOS/ClientApp/src/view/user/UserCenter.vue

@@ -1,20 +1,654 @@
 <template>
     <div class="user-center-container">
-        <h1 style="color:white;text-align:center;margin-top:120px;color:#AAA">账号信息</h1>
+        <div v-show="editAttr == 'none'" class="user-info-box">
+            <!-- 头像设置 -->
+            <div class="avatar-wrap">
+                <div class="badge-wrap">
+                    <img class="user-badge" :src="userInfo.picture || defBadge">
+                    <div class="upd-mask">
+                        <Upload action="/blob/public-upload" class="upd-badge" :before-upload="customUpload" :on-success="success" :show-upload-list="false">
+                            <Icon type="md-create" :title="$t('schoolBaseInfo.updBadge')" color="white" />
+                        </Upload>
+                    </div>
+                </div>
+                <p class="id-info">{{`ID:${userInfo.id}`}}</p>
+            </div>
+            <!-- 基础信息区域 -->
+            <div class="base-info-item">
+                <Icon type="ios-person" class="info-label-icon" />
+                <div class="base-value-wrap">
+                    <p class="info-label">姓名:</p>
+                    <p class="info-value" :style="{color:userInfo.name ? 'white' : '#ed4014'}">
+                        {{userInfo.name || '未设置'}}
+                    </p>
+                </div>
+                <span :class="['edit-btn', userInfo.name ? '' : 'set-btn']" @click="editInfo('name')">
+                    {{userInfo.name ? '编辑' : '设置'}}
+                </span>
+            </div>
+            <div class="base-info-item">
+                <Icon type="md-key" class="info-label-icon" />
+                <div class="base-value-wrap">
+                    <p class="info-label">密码:</p>
+                    <p class="info-value" :style="{color:userInfo.is_set_pw ? 'white' : '#ed4014'}">
+                        {{userInfo.is_set_pw ? '********' : '未设置'}}
+                    </p>
+                </div>
+                <span :class="['edit-btn', userInfo.is_set_pw ? '' : 'set-btn']" @click="editInfo('password')">
+                    {{userInfo.is_set_pw ? '编辑' : '设置'}}
+                </span>
+            </div>
+            <div class="base-info-item">
+                <Icon type="md-phone-portrait" class="info-label-icon" />
+                <div class="base-value-wrap">
+                    <p class="info-label">手机号码:</p>
+                    <p class="info-value" :style="{color:userInfo.mobile ? 'white' : '#ed4014'}">
+                        {{userInfo.mobile || '未绑定'}}
+                    </p>
+                </div>
+                <span :class="['edit-btn', userInfo.mobile ? '' : 'set-btn']" @click="editInfo('mobile')">
+                    {{userInfo.mobile ? '编辑' : '设置'}}
+                </span>
+            </div>
+            <div class="base-info-item">
+                <Icon type="ios-mail" class="info-label-icon" />
+                <div class="base-value-wrap">
+                    <p class="info-label">电子邮箱:</p>
+                    <p class="info-value" :style="{color:userInfo.mail ? 'white' : '#ed4014'}">
+                        {{userInfo.mail || '未绑定'}}
+                    </p>
+                </div>
+                <span :class="['edit-btn', userInfo.mail ? '' : 'set-btn']" @click="editInfo('mail')">
+                    {{userInfo.mail ? '编辑' : '设置'}}
+                </span>
+            </div>
+            <div class="base-info-item">
+                <Icon type="md-link" class="info-label-icon" />
+                <div class="base-value-wrap">
+                    <p class="info-label">账号绑定:</p>
+                    <p class="info-value">
+                        - -
+                    </p>
+                </div>
+                <span class="edit-btn">编辑</span>
+            </div>
+        </div>
+        <div v-show="editAttr !== 'none'" class="user-info-box dark-iview-input">
+            <Icon type="md-close" class="close-edit-info" @click="editAttr = 'none'" />
+            <!-- 编辑名称 -->
+            <div v-show="editAttr == 'name'" style="margin:auto;width:fit-content" :class="nameErr ? 'error-input' : ''">
+                <span>姓名:</span>
+                <Input v-model="eName" :placeholder="userInfo.name" style="width: 270px" />
+                <p v-show="nameErr" class="error-tips">
+                    姓名不能为空
+                </p>
+            </div>
+            <!-- 修改密码 -->
+            <div v-show="editAttr == 'password'" style="margin:auto;width:fit-content">
+                <Form ref="password" :model="pw" :rules="pwValidate" :label-width="80" label-position="left">
+                    <FormItem prop="original">
+                        <span slot="label" class="form-label">原密码</span>
+                        <Input v-model="pw.original" placeholder="" class="edit-pw-input" type="password" password />
+                    </FormItem>
+                    <FormItem prop="newPw">
+                        <span slot="label" class="form-label">新密码</span>
+                        <Input v-model="pw.newPw" placeholder="" class="edit-pw-input" type="password" password />
+                    </FormItem>
+                    <FormItem prop="confirm">
+                        <span slot="label" class="form-label">确认密码</span>
+                        <Input v-model="pw.confirm" placeholder="" class="edit-pw-input" type="password" password />
+                    </FormItem>
+                </Form>
+            </div>
+            <!-- 修改手机号 -->
+            <div v-show="editAttr == 'mobile'" style="margin:auto;width:fit-content">
+                <Form ref="mobile" :model="mobile" :rules="mobileValidate" :label-width="80" label-position="left">
+                    <FormItem prop="number" class="custom-radirs">
+                        <span slot="label" class="form-label">手机号码</span>
+                        <Select v-model="mobile.area" style="width:130px">
+                            <Option v-for="item in areaList" :value="item.code" :key="item.area">
+                                {{ `+${item.code}(${item.name})` }}
+                            </Option>
+                        </Select>
+                        <Input v-model="mobile.number" placeholder="" class="edit-pw-input" style="width:160px" />
+                    </FormItem>
+                    <FormItem prop="code" class="custom-radirs">
+                        <span slot="label" class="form-label">验证码</span>
+                        <Button :disabled="!mobile.number || hasSend" @click="sendMsgCode" style="width:130px">
+                            发送验证码
+                            {{hasSend ? `(${countdown})` : ''}}
+                        </Button>
+                        <Input v-model="mobile.code" placeholder="" class="edit-pw-input" style="width:160px" />
+                    </FormItem>
+                </Form>
+            </div>
+            <!-- 编辑邮箱 -->
+            <div v-show="editAttr == 'mail'" style="margin:auto;width:fit-content">
+                <Form ref="mail" :model="mail" :rules="mailValidate" :label-width="80" label-position="left">
+                    <FormItem prop="mail">
+                        <span slot="label" class="form-label">电子邮箱</span>
+                        <Input v-model="mail.mail" placeholder="" class="edit-pw-input" />
+                    </FormItem>
+                    <FormItem prop="code" class="custom-radirs">
+                        <span slot="label" class="form-label">验证码</span>
+                        <Button :disabled="!mail.mail || hasSend" @click="sendMailCode" style="width:130px">
+                            发送验证信
+                            {{hasSend ? `(${countdown})` : ''}}
+                        </Button>
+                        <Input v-model="mail.code" placeholder="" class="edit-pw-input" style="width:100px" />
+                    </FormItem>
+                </Form>
+            </div>
+            <div class="submit-btn-wrap">
+                <Button type="primary" style="width:150px;margin-right:10px" @click="submit">确认</Button>
+                <Button style="width:150px" @click="editAttr = 'none'">取消</Button>
+            </div>
+        </div>
     </div>
 </template>
 <script>
+import jwtDecode from 'jwt-decode'
+import countryCode from '@/static/countryCodeData.js'
 export default {
-    data(){
-        return{
+    data() {
+        const confirm = (rule, value, callback) => {
+            if (value !== this.pw.newPw) {
+                callback(new Error('两次密码输入不一样'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            timer: undefined,
+            countdown: 60, //倒计时
+            userInfo: {},
+            defBadge: undefined,
+            editAttr: 'none',
+            eName: '',//修改名称
+            nameErr: false,
+            hasSend: false,
+            pw: {
+                original: '',
+                newPw: '',
+                confirm: ''
+            },
+            pwValidate: {
+                original: [
+                    { required: true, message: '请输入原密码', trigger: 'change' }
+                ],
+                newPw: [
+                    { required: true, message: '请输入新密码', trigger: 'change' }
+                ],
+                confirm: [
+                    { required: true, message: '请输入新密码', trigger: 'blur' },
+                    { validator: confirm, trigger: 'blur' }
+                ],
+            },
+            mobile: {
+                number: '',
+                code: '',
+                area: 86
+            },
+            mobileValidate: {
+                number: [
+                    { required: true, message: '请输入手机号码', trigger: 'change' }
+                ],
+                code: [
+                    { required: true, message: '请输入验证码', trigger: 'change' }
+                ],
+                area: [
+                    { required: true, message: '请选择区号', trigger: 'change' }
+                ]
+            },
+            mail: {
+                mail: '',
+                code: ''
+            },
+            mailValidate: {
+                mail: [
+                    { required: true, message: '请输入电子邮箱', trigger: 'change' }
+                ],
+                code: [
+                    { required: true, message: '请输入验证码', trigger: 'change' }
+                ]
+            },
+            areaList: []
+        }
+    },
+    created() {
+        //默认头像
+        this.defBadge = require('@/assets/icon/default_school.png')
+        this.getIdInfo()
+        //处世化地区数据
+        console.log(countryCode)
+        let curLocal = localStorage.getItem('local')
+        let attr = 'CountryEn'
+        if (curLocal.includes('cn') || curLocal.includes('CN')) {
+            attr = 'CountryCn'
+        } else if (curLocal.includes('tw') || curLocal.includes('TW')) {
+            attr = 'CountryTw'
+        }
+        for (const key in countryCode) {
+            this.areaList.push(
+                {
+                    code: countryCode[key].Code,
+                    area: key,
+                    name: countryCode[key][attr],
+                    local: countryCode[key].Culture
+                }
+            )
+        }
+        this.areaList.sort((a, b) => {
+            return a.code - b.code
+        })
+        console.log(this.areaList)
+    },
+    methods: {
+        //发送短信验证码
+        sendMsgCode() {
+            let srvAdr = this.$store.state.config.srvAdr
+            let host = srvAdr == 'Global' ? this.$store.state.config.Global.coreAPIUrl : this.$store.state.config.China.coreAPIUrl
+            let params = {
+                country: this.mobile.area + '',
+                to: this.mobile.number,
+                lang: localStorage.getItem('local'),
+                HasUser: false
+            }
+            this.$api.service.sandMsgCode(host, params).then(
+                res => {
+                    if (!res.error) {
+                        this.$Message.success('短信发送成功')
+                        this.hasSend = true
+                        this.timer = setInterval(() => {
+                            this.countdown--
+                        }, 1000)
+                    } else {
+                        if (res.error == 1) {
+                            this.$Message.error('手机号不存在')
+                        } else if (res.error == 2) {
+                            this.$Message.error('此手机号已注册')
+                        } else {
+                            this.$Message.error('短信发送失败')
+                        }
+                    }
+                },
+                err => {
+                    this.$Message.error('短信发送失败')
+                }
+            )
+        },
+        //发送邮件验证码
+        sendMailCode() {
+            let srvAdr = this.$store.state.config.srvAdr
+            let host = srvAdr == 'Global' ? this.$store.state.config.Global.coreAPIUrl : this.$store.state.config.China.coreAPIUrl
+            let params = {
+                to: this.mail.mail,
+                lang: localStorage.getItem('local'),
+                HasUser: false
+            }
+            this.$api.service.sandMailCode(host, params).then(
+                res => {
+                    if (!res.error) {
+                        this.$Message.success('邮件发送成功')
+                        this.hasSend = true
+                        this.timer = setInterval(() => {
+                            this.countdown--
+                        }, 1000)
+                    } else if (res.error == 2) {
+                        this.$Message.error('此邮件已注册')
+                    } else {
+                        this.$Message.error('邮件发送失败')
+                    }
+                },
+                err => {
+                    this.$Message.error('邮件发送失败')
+                }
+            )
+        },
+        //保存信息
+        submit() {
+            let srvAdr = this.$store.state.config.srvAdr
+            let host = srvAdr == 'Global' ? this.$store.state.config.Global.coreAPIUrl : this.$store.state.config.China.coreAPIUrl
+            let clientId = srvAdr == 'Global' ? this.$store.state.config.Gloabl.clientID : this.$store.state.config.China.clientID
+            let idToken = localStorage.getItem('id_token')
+            let tokenData = jwtDecode(idToken)
+            let nonce = tokenData ? tokenData.nonce : ''
+
+            let params = {
+                "nonce": nonce,
+                "client_id": clientId,
+                "id_token": idToken
+            }
+            switch (this.editAttr) {
+                case 'name':
+                    if (this.eName) {
+                        params.grant_type = 'name'
+                        params.name = this.eName
+                        this.nameErr = false
+                    } else {
+                        this.nameErr = true
+                    }
+                    break
+                case 'password':
+                    this.$refs['password'].validate((valid) => {
+                        if (valid) {
+                            params.grant_type = 'password'
+                            params.old_pw = this.pw.original
+                            params.new_pw = this.pw.newPw
+                        } else {
+                            this.$Message.error('请检查信息是否正确')
+                        }
+                    })
+                    break
+                case 'mobile':
+                    this.$refs['mobile'].validate((valid) => {
+                        if (valid && this.mobile.area) {
+                            params.grant_type = 'mobileOrMail'
+                            params.mobile_mail = `+${this.mobile.area}-${this.mobile.number}`
+                            params.pin_code = this.mobile.code
+                        } else {
+                            this.$Message.error('请检查信息是否正确')
+                        }
+                    })
+                    break
+                case 'mail':
+                    this.$refs['mail'].validate((valid) => {
+                        if (valid) {
+                            params.grant_type = 'mobileOrMail'
+                            params.mobile_mail = this.mail.mail
+                            params.pin_code = this.mail.code
+                        } else {
+                            this.$Message.error('请检查信息是否正确')
+                        }
+                    })
+                    break
+                default:
+                    break
+            }
+            if (params.grant_type) {
+                this.updateUserInfo(host, params)
+            }
+        },
+        updateUserInfo(host, params) {
+            this.$api.service.getIdProfile(host, params).then(
+                res => {
+                    if (!res.error) {
+                        this.$Message.success('更新成功')
+                        switch (this.editAttr) {
+                            case 'name':
+                                this.userInfo.name = this.eName
+                                this.eName = ''
+                                break
+                            case 'mobile':
+                                this.userInfo.mobile = this.mobile.number
+                                this.mobile.number = ''
+                                this.mobile.code = ''
+                                this.mobile.area = 86
+                                break
+                            case 'mail':
+                                this.userInfo.mail = this.mail.mail
+                                this.mail.mail = ''
+                                this.mail.code = ''
+                                break
+                            case 'none':
+                                this.userInfo.picture = params.picture || this.userInfo.picture
+                                break
+                            default:
+                                break
+                        }
+                        this.editAttr = 'none'
+                    } else {
+                        if (res.error == 3) {
+                            this.$Message.error('验证码错误')
+                        } else {
+                            this.$Message.error('API Error')
+                        }
+                    }
+                },
+                err => {
+                    console.log(err)
+                }
+            )
+        },
+        editInfo(attr) {
+            this.editAttr = attr
+        },
+        //上传头像
+        customUpload(file) {
+            let format = ['png', 'jpg', 'jpeg'] //头像文件格式
+            let extension = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length)
+            extension = extension.toLowerCase()
+            if (format.length > 0 && format.indexOf(extension) == -1) {
+                this.$Message.error({
+                    content: this.$t('updModal.typeErr'),
+                    duration: 3
+                })
+                return false
+            }
+            let _this = this
+            let reader = new FileReader(); //实例化文件读取对象
+            reader.readAsDataURL(file); //将文件读取为 DataURL,也就是base64编码
+            reader.onload = function (ev) { //文件读取成功完成时触发
+                let dataURL = ev.target.result; //获得文件读取成功后的DataURL,也就是base64编码
+                console.log(dataURL);
+                //更新头像
+                let srvAdr = _this.$store.state.config.srvAdr
+                let host = srvAdr == 'Global' ? _this.$store.state.config.Global.coreAPIUrl : _this.$store.state.config.China.coreAPIUrl
+                let clientId = srvAdr == 'Global' ? _this.$store.state.config.Gloabl.clientID : _this.$store.state.config.China.clientID
+                let idToken = localStorage.getItem('id_token')
+                let tokenData = jwtDecode(idToken)
+                let nonce = tokenData ? tokenData.nonce : ''
+                let params = {
+                    "nonce": nonce,
+                    "client_id": clientId,
+                    "id_token": idToken,
+                    'grant_type': 'picture',
+                    'picture': dataURL
+                }
+                _this.updateUserInfo(host, params)
+            }
 
+            return false
+        },
+        // 上传成功
+        success(response, file, fileList) {
+            console.log(response)
+            let srvAdr = this.$store.state.config.srvAdr
+            let host = srvAdr == 'Global' ? this.$store.state.config.Global.coreAPIUrl : this.$store.state.config.China.coreAPIUrl
+            let clientId = srvAdr == 'Global' ? this.$store.state.config.Gloabl.clientID : this.$store.state.config.China.clientID
+            let idToken = localStorage.getItem('id_token')
+            let tokenData = jwtDecode(idToken)
+            let nonce = tokenData ? tokenData.nonce : ''
+
+            let params = {
+                "nonce": nonce,
+                "client_id": clientId,
+                "id_token": idToken,
+                'grant_type': 'picture',
+                'picture': ''
+            }
+
+            this.updateUserInfo(host, params)
+        },
+        // 获取账号详细信息
+        getIdInfo() {
+            let srvAdr = this.$store.state.config.srvAdr
+            let host = srvAdr == 'Global' ? this.$store.state.config.Global.coreAPIUrl : this.$store.state.config.China.coreAPIUrl
+            let clientId = srvAdr == 'Global' ? this.$store.state.config.Gloabl.clientID : this.$store.state.config.China.clientID
+            let idToken = localStorage.getItem('id_token')
+            let tokenData = jwtDecode(idToken)
+            let nonce = tokenData ? tokenData.nonce : ''
+            let params = {
+                "grant_type": "get",
+                "nonce": nonce,
+                "client_id": clientId,
+                "id_token": idToken
+            }
+            this.$api.service.getIdProfile(host, params).then(
+                res => {
+                    console.log(res)
+                    if (!res.error) {
+                        this.userInfo = res
+                    } else {
+                        this.$Message.error('API Error')
+                    }
+                },
+                err => {
+                    console.log(err)
+                }
+            )
+        }
+    },
+    watch: {
+        countdown(n, o) {
+            if (n <= 0) {
+                clearInterval(this.timer)
+                this.timer = undefined
+                this.hasSend = false
+                this.countdown = 60
+            }
         }
     }
 }
 </script>
 <style lang="less" scoped>
-
+.edit-pw-input {
+    display: inline-block;
+    width: 230px;
+}
+.form-label {
+    color: white;
+}
+.error-tips {
+    color: #ed4014;
+    text-align: left;
+    margin-left: 40px;
+    margin-top: 2px;
+}
+.submit-btn-wrap {
+    margin-top: 20px;
+    text-align: center;
+}
+.close-edit-info {
+    color: white;
+    position: absolute;
+    right: 10px;
+    top: 8px;
+    cursor: pointer;
+}
+.info-label {
+    color: #a5a5a5;
+}
+.info-value {
+    color: white;
+}
+.id-info {
+    color: white;
+    text-align: center;
+    margin-top: 10px;
+}
+.avatar-wrap {
+    margin-bottom: 25px;
+}
+.user-center-container {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    // align-items: center;
+}
+.user-info-box {
+    margin-top: 120px;
+    padding: 50px 50px;
+    height: fit-content;
+    background: #535353;
+    border: 1px solid #404040;
+    border-radius: 6px;
+    box-shadow: 0 0 10px 2px #000;
+    position: relative;
+    color: white;
+    width: 700px;
+}
+.base-info-item {
+    width: 600px;
+    margin: 0px auto;
+    padding: 15px 25px 15px 5px;
+    display: flex;
+    align-items: center;
+    border-bottom: 1px solid transparent;
+    &:hover {
+        border-color: #606060;
+        background: #606060;
+    }
+    .info-label-icon {
+        font-size: 24px;
+        color: white;
+        width: 60px;
+    }
+    .base-value-wrap {
+        flex: 1;
+    }
+    .edit-btn {
+        background: #f7f7f7;
+        padding: 2px 6px;
+        font-size: 12px;
+        border-radius: 4px;
+        color: #303030;
+        cursor: pointer;
+        user-select: none;
+    }
+    .set-btn {
+        background: #ed4014;
+        color: white;
+    }
+}
+.badge-wrap {
+    position: relative;
+    width: 70px;
+    margin: auto;
+    &:hover {
+        .upd-mask {
+            opacity: 1;
+        }
+    }
+    .upd-mask {
+        position: absolute;
+        left: 0px;
+        top: 0px;
+        bottom: 0px;
+        width: 70px;
+        border-radius: 50%;
+        display: flex;
+        background: rgba(68, 68, 68, 0.5);
+        justify-content: center;
+        align-items: center;
+        opacity: 0;
+        .upd-badge {
+            cursor: pointer;
+            text-align: center;
+            font-size: 20px;
+        }
+    }
+}
+.user-badge {
+    vertical-align: middle;
+    width: 70px;
+    border-radius: 50%;
+}
 </style>
 <style lang="less">
-
+.custom-radirs {
+    .ivu-select-selection,
+    .ivu-btn {
+        border-radius: 4px 0px 0px 4px;
+    }
+    .ivu-input {
+        border-radius: 0px 4px 4px 0px;
+    }
+}
+.error-input {
+    .ivu-input {
+        border-color: #ed4014;
+    }
+}
 </style>