diff --git a/admin/src/api/subscription/token_server.js b/admin/src/api/subscription/token_server.js index 3990e52..af5784c 100644 --- a/admin/src/api/subscription/token_server.js +++ b/admin/src/api/subscription/token_server.js @@ -11,6 +11,10 @@ class TokenServer { return window.framework.http.post("/biz_token/revoke", row); } + async regenerate(row) { + return window.framework.http.post("/biz_token/regenerate", row); + } + async exportRows(row) { return window.framework.http.post("/biz_token/export", row); } diff --git a/admin/src/views/subscription/tokens.vue b/admin/src/views/subscription/tokens.vue index 550df83..4385274 100644 --- a/admin/src/views/subscription/tokens.vue +++ b/admin/src/views/subscription/tokens.vue @@ -64,7 +64,7 @@ - + 仅此一次展示,关闭后无法再次查看明文。
@@ -92,6 +92,7 @@ export default { }, createModal: false, plainModal: false, + plainModalTitle: '请立即保存 Token 明文', plainToken: '', saving: false, createForm: {}, @@ -110,18 +111,34 @@ export default { { title: '操作', key: 'a', - width: 100, - render: (h, p) => - h( - 'Button', - { - props: { type: 'error', size: 'small' }, - on: { - click: () => this.doRevoke(p.row), + width: 178, + render: (h, p) => { + const btns = [] + if (p.row.status === 'active') { + btns.push( + h( + 'Button', + { + props: { type: 'warning', size: 'small' }, + on: { click: () => this.doRegenerate(p.row) }, + }, + '重新生成' + ) + ) + } + btns.push( + h( + 'Button', + { + props: { type: 'error', size: 'small' }, + class: { ml8: btns.length > 0 }, + on: { click: () => this.doRevoke(p.row) }, }, - }, - '吊销' - ), + '吊销' + ) + ) + return h('div', btns) + }, }, ] }, @@ -183,6 +200,7 @@ export default { if (res && res.code === 0) { if (res.data.warn) this.$Message.warning(res.data.warn) this.createModal = false + this.plainModalTitle = '请立即保存 Token 明文' this.plainToken = res.data.plain_token this.plainModal = true this.load(1) @@ -193,6 +211,24 @@ export default { this.saving = false } }, + doRegenerate(row) { + this.$Modal.confirm({ + title: '重新生成 Token', + content: '旧密钥将立即失效,确定继续?', + onOk: async () => { + const res = await tokenServer.regenerate({ id: row.id }) + if (res && res.code === 0) { + if (res.data.warn) this.$Message.warning(res.data.warn) + this.plainModalTitle = '请保存重新生成后的 Token 明文' + this.plainToken = res.data.plain_token + this.plainModal = true + this.load(1) + } else { + this.$Message.error((res && res.message) || '失败') + } + }, + }) + }, doRevoke(row) { this.$Modal.confirm({ title: '吊销 Token', @@ -245,4 +281,8 @@ export default { margin-top: 12px; text-align: right; } + +.ml8 { + margin-left: 8px; +} diff --git a/admin/src/views/subscription/users.vue b/admin/src/views/subscription/users.vue index e798ae3..962b9ae 100644 --- a/admin/src/views/subscription/users.vue +++ b/admin/src/views/subscription/users.vue @@ -56,10 +56,51 @@ + + 保存时自动创建默认 Token(明文仅展示一次) + + + + + + 关闭后无法再次查看明文,请复制到安全位置。 + +
+ +
+
+ + +

+ 用户:{{ create_token_target_user.name || ('#' + create_token_target_user.id) }} + · ID {{ create_token_target_user.id }} +

+
+ +
+
+ ID {{ detail.user.id }} + {{ detail.user.name || '—' }} + {{ detail.user.mobile || '—' }} + {{ detail.user.status }} + +

Token 数量:{{ detail.tokenCount }}

API Token

-

点击表格某一行查看该 Token 详情(明文不可查,需重新创建)

+
+ + 点击行查看单条详情;明文仅在创建/重新生成时展示一次 +

暂无 Token

@@ -92,6 +141,7 @@