Tao Chen 1 год назад
Родитель
Сommit
9706a6d7d1

+ 1 - 0
src/store/user.js

@@ -10,6 +10,7 @@ export const useUserStore = defineStore({
10
   state: () => ({
10
   state: () => ({
11
     nickname: '',
11
     nickname: '',
12
     username: '',
12
     username: '',
13
+    email: '',
13
     token: '',
14
     token: '',
14
     role: '',
15
     role: '',
15
     avatar: '',
16
     avatar: '',

+ 3 - 0
src/utils/i18n/zh_CN.json

@@ -457,5 +457,8 @@
457
   },
457
   },
458
   "UserToken": {
458
   "UserToken": {
459
     "One": "用户Token"
459
     "One": "用户Token"
460
+  },
461
+  "Email": {
462
+    "One": "邮箱"
460
   }
463
   }
461
 }
464
 }

+ 4 - 4
src/views/login/login.vue

@@ -93,10 +93,10 @@ import webauthImage from '@/assets/webauth.png';
93
 import defaultImage from '@/assets/oidc.png';
93
 import defaultImage from '@/assets/oidc.png';
94
 
94
 
95
 const providerImageMap = {
95
 const providerImageMap = {
96
-  google: googleImage,
97
-  github: githubImage,
98
-  oidc: oidcImage,
99
-  webauth: webauthImage,
96
+  Google: googleImage,
97
+  GitHub: githubImage,
98
+  OIDC: oidcImage,
99
+  WebAuth: webauthImage,
100
   default: defaultImage,
100
   default: defaultImage,
101
 };
101
 };
102
 
102
 

+ 6 - 3
src/views/my/info.vue

@@ -5,12 +5,15 @@
5
         <el-form-item :label="T('Username')">
5
         <el-form-item :label="T('Username')">
6
           <div>{{ userStore.username }}</div>
6
           <div>{{ userStore.username }}</div>
7
         </el-form-item>
7
         </el-form-item>
8
+        <el-form-item :label="T('Email')">
9
+          <div>{{ userStore.email }}</div>
10
+        </el-form-item>
8
         <el-form-item :label="T('Password')" prop="password">
11
         <el-form-item :label="T('Password')" prop="password">
9
           <el-button type="danger" @click="showChangePwd">{{ T('ChangePassword') }}</el-button>
12
           <el-button type="danger" @click="showChangePwd">{{ T('ChangePassword') }}</el-button>
10
         </el-form-item>
13
         </el-form-item>
11
         <el-form-item label="OIDC">
14
         <el-form-item label="OIDC">
12
           <el-table :data="oidcData" border fit>
15
           <el-table :data="oidcData" border fit>
13
-            <el-table-column :label="T('Platform')" prop="third_type" align="center"></el-table-column>
16
+            <el-table-column :label="T('IdP')" prop="op" align="center"></el-table-column>
14
             <el-table-column :label="T('Status')" prop="status" align="center">
17
             <el-table-column :label="T('Status')" prop="status" align="center">
15
               <template #default="{ row }">
18
               <template #default="{ row }">
16
                 <el-tag v-if="row.status === 1" type="success">{{ T('HasBind') }}</el-tag>
19
                 <el-tag v-if="row.status === 1" type="success">{{ T('HasBind') }}</el-tag>
@@ -55,7 +58,7 @@
55
   }
58
   }
56
   getMyOauth()
59
   getMyOauth()
57
   const toBind = async (row) => {
60
   const toBind = async (row) => {
58
-    const res = await bind({ op: row.third_type }).catch(_ => false)
61
+    const res = await bind({ op: row.op}).catch(_ => false)
59
     if (res) {
62
     if (res) {
60
       const { code, url } = res.data
63
       const { code, url } = res.data
61
       window.open(url)
64
       window.open(url)
@@ -70,7 +73,7 @@
70
     if (!cf) {
73
     if (!cf) {
71
       return false
74
       return false
72
     }
75
     }
73
-    const res = await unbind({ op: row.third_type }).catch(_ => false)
76
+    const res = await unbind({ op: row.op }).catch(_ => false)
74
     if (res) {
77
     if (res) {
75
       getMyOauth()
78
       getMyOauth()
76
     }
79
     }

+ 16 - 9
src/views/oauth/index.vue

@@ -11,7 +11,8 @@
11
     <el-card class="list-body" shadow="hover">
11
     <el-card class="list-body" shadow="hover">
12
       <el-table :data="listRes.list" v-loading="listRes.loading" border>
12
       <el-table :data="listRes.list" v-loading="listRes.loading" border>
13
         <el-table-column prop="id" label="ID" align="center"/>
13
         <el-table-column prop="id" label="ID" align="center"/>
14
-        <el-table-column prop="op" :label="T('Platform')" align="center"/>
14
+        <el-table-column prop="op" :label="T('IdP')" align="center"/>
15
+        <el-table-column prop="oauth_type" :label="T('Type')" align="center"/>
15
         <el-table-column prop="auto_register" :label="T('AutoRegister')" align="center"/>
16
         <el-table-column prop="auto_register" :label="T('AutoRegister')" align="center"/>
16
         <el-table-column prop="created_at" :label="T('CreatedAt')" align="center"/>
17
         <el-table-column prop="created_at" :label="T('CreatedAt')" align="center"/>
17
         <el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center"/>
18
         <el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center"/>
@@ -34,17 +35,20 @@
34
     </el-card>
35
     </el-card>
35
     <el-dialog v-model="formVisible" :title="!formData.id?T('Create') :T('Update')" width="800">
36
     <el-dialog v-model="formVisible" :title="!formData.id?T('Create') :T('Update')" width="800">
36
       <el-form class="dialog-form" ref="form" :model="formData" :rules="rules" label-width="120px">
37
       <el-form class="dialog-form" ref="form" :model="formData" :rules="rules" label-width="120px">
37
-        <el-form-item label="Type" prop="op">
38
-          <el-radio-group v-model="formData.op" :disabled="!!formData.id">
39
-            <el-radio v-for="item in ops" :key="item.value" :value="item.value" style="display: block">
38
+        <el-form-item label="Type" prop="">
39
+          <el-radio-group v-model="formData.oauth_type" :disabled="!!formData.id">
40
+            <el-radio v-for="item in types" :key="item.value" :value="item.value" style="display: block">
40
               {{ item.label }}
41
               {{ item.label }}
41
             </el-radio>
42
             </el-radio>
42
           </el-radio-group>
43
           </el-radio-group>
43
         </el-form-item>
44
         </el-form-item>
44
-        <el-form-item v-if="formData.op === 'oidc'" label="Issuer" prop="issuer">
45
+        <el-form-item v-if="formData.oauth_type === 'oidc'" label="IdP" prop="op">
46
+          <el-input v-model="formData.op" :placeholder="T('Your IdP Name')"></el-input>
47
+        </el-form-item>
48
+        <el-form-item v-if="formData.oauth_type === 'oidc'" label="Issuer" prop="issuer">
45
           <el-input v-model="formData.issuer" :placeholder="`${T('Check your IdP docs, without')} '/.well-known/openid-configuration'`"></el-input>
49
           <el-input v-model="formData.issuer" :placeholder="`${T('Check your IdP docs, without')} '/.well-known/openid-configuration'`"></el-input>
46
         </el-form-item>
50
         </el-form-item>
47
-        <el-form-item v-show="formData.op === 'oidc'" label="Scopes" prop="scopes">
51
+        <el-form-item v-show="formData.oauth_type === 'oidc'" label="Scopes" prop="scopes">
48
           <el-input v-model="formData.scopes" :placeholder="`${T('Optional, default is')} 'openid,profile,email'`" ></el-input>
52
           <el-input v-model="formData.scopes" :placeholder="`${T('Optional, default is')} 'openid,profile,email'`" ></el-input>
49
         </el-form-item>
53
         </el-form-item>
50
         <el-form-item label="ClientId" prop="client_id">
54
         <el-form-item label="ClientId" prop="client_id">
@@ -85,8 +89,8 @@
85
     page: 1,
89
     page: 1,
86
     page_size: 10,
90
     page_size: 10,
87
   })
91
   })
88
-  const ops = [
89
-    { value: 'github', label: 'Github' },
92
+  const types = [
93
+    { value: 'github', label: 'GitHub' },
90
     { value: 'google', label: 'Google' },
94
     { value: 'google', label: 'Google' },
91
     { value: 'oidc',   label: 'OIDC'   }
95
     { value: 'oidc',   label: 'OIDC'   }
92
   ]
96
   ]
@@ -134,6 +138,7 @@
134
   const formData = reactive({
138
   const formData = reactive({
135
     id: 0,
139
     id: 0,
136
     op: '',
140
     op: '',
141
+    oauth_type: '',
137
     issuer: '',
142
     issuer: '',
138
     client_id: '',
143
     client_id: '',
139
     client_secret: '',
144
     client_secret: '',
@@ -145,13 +150,14 @@
145
     client_id: [{ required: true, message: T('ParamRequired', { param: 'client_id' }), trigger: 'blur' }],
150
     client_id: [{ required: true, message: T('ParamRequired', { param: 'client_id' }), trigger: 'blur' }],
146
     client_secret: [{ required: true, message: T('ParamRequired', { param: 'client_secret' }), trigger: 'blur' }],
151
     client_secret: [{ required: true, message: T('ParamRequired', { param: 'client_secret' }), trigger: 'blur' }],
147
     redirect_url: [{ required: true, message: T('ParamRequired', { param: 'redirect_url' }), trigger: 'blur' }],
152
     redirect_url: [{ required: true, message: T('ParamRequired', { param: 'redirect_url' }), trigger: 'blur' }],
148
-    op: [{ required: true, message: T('ParamRequired', { param: 'op' }), trigger: 'blur' }],
153
+    oauth_type: [{ required: true, message: T('ParamRequired', { param: 'oauth_type' }), trigger: 'blur' }],
149
     issuer: [{ required: true, message: T('ParamRequired', { param: 'issuer' }), trigger: 'blur' }],
154
     issuer: [{ required: true, message: T('ParamRequired', { param: 'issuer' }), trigger: 'blur' }],
150
   }
155
   }
151
   const toEdit = (row) => {
156
   const toEdit = (row) => {
152
     formVisible.value = true
157
     formVisible.value = true
153
     formData.id = row.id
158
     formData.id = row.id
154
     formData.op = row.op
159
     formData.op = row.op
160
+    formData.oauth_type = row.oauth_type
155
     formData.issuer = row.issuer
161
     formData.issuer = row.issuer
156
     formData.client_id = row.client_id
162
     formData.client_id = row.client_id
157
     formData.client_secret = row.client_secret
163
     formData.client_secret = row.client_secret
@@ -164,6 +170,7 @@
164
     formVisible.value = true
170
     formVisible.value = true
165
     formData.id = 0
171
     formData.id = 0
166
     formData.op = ''
172
     formData.op = ''
173
+    formData.oauth_type = ''
167
     formData.issuer = ''
174
     formData.issuer = ''
168
     formData.client_id = ''
175
     formData.client_id = ''
169
     formData.client_secret = ''
176
     formData.client_secret = ''

+ 1 - 0
src/views/user/composables/edit.js

@@ -38,6 +38,7 @@ export function useSubmit (form, id) {
38
   const router = useRouter()
38
   const router = useRouter()
39
   const rules = reactive({
39
   const rules = reactive({
40
     username: [{ required: true, message: T('ParamRequired', { param: T('Username') }) }],
40
     username: [{ required: true, message: T('ParamRequired', { param: T('Username') }) }],
41
+    email: [{ required: true, message: T('ParamRequired', { param: T('Email') }) }],
41
     group_id: [{ required: true, message: T('ParamRequired', { param: T('Group') }) }],
42
     group_id: [{ required: true, message: T('ParamRequired', { param: T('Group') }) }],
42
     // nickname: [{ required: true, message: '昵称是必须的' }],
43
     // nickname: [{ required: true, message: '昵称是必须的' }],
43
     status: [{ required: true, message: T('ParamRequired', { param: T('Status') }) }],
44
     status: [{ required: true, message: T('ParamRequired', { param: T('Status') }) }],

+ 3 - 0
src/views/user/edit.vue

@@ -4,6 +4,9 @@
4
       <el-form-item :label="T('Username')" prop="username">
4
       <el-form-item :label="T('Username')" prop="username">
5
         <el-input v-model="form.username"></el-input>
5
         <el-input v-model="form.username"></el-input>
6
       </el-form-item>
6
       </el-form-item>
7
+      <el-form-item :label="T('Email')" prop="email">
8
+        <el-input v-model="form.email"></el-input>
9
+      </el-form-item>
7
       <el-form-item :label="T('Nickname')" prop="nickname">
10
       <el-form-item :label="T('Nickname')" prop="nickname">
8
         <el-input v-model="form.nickname"></el-input>
11
         <el-input v-model="form.nickname"></el-input>
9
       </el-form-item>
12
       </el-form-item>

+ 1 - 0
src/views/user/index.vue

@@ -15,6 +15,7 @@
15
       <el-table :data="listRes.list" v-loading="listRes.loading" border>
15
       <el-table :data="listRes.list" v-loading="listRes.loading" border>
16
         <el-table-column prop="id" label="ID" align="center"></el-table-column>
16
         <el-table-column prop="id" label="ID" align="center"></el-table-column>
17
         <el-table-column prop="username" :label="T('Username')" align="center"/>
17
         <el-table-column prop="username" :label="T('Username')" align="center"/>
18
+        <el-table-column prop="email" :label="T('Email')" align="center"/>
18
         <el-table-column prop="nickname" :label="T('Nickname')" align="center"/>
19
         <el-table-column prop="nickname" :label="T('Nickname')" align="center"/>
19
         <el-table-column :label="T('Group')" align="center">
20
         <el-table-column :label="T('Group')" align="center">
20
           <template #default="{row}">
21
           <template #default="{row}">