mirror of
https://github.com/jumpserver/lina.git
synced 2025-12-03 12:42:15 +00:00
Compare commits
4 Commits
v4.10.13-l
...
pr@dev@fea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fe583935f | ||
|
|
c9c27be78d | ||
|
|
a755b2ffa0 | ||
|
|
d391592778 |
@@ -1,4 +1,4 @@
|
|||||||
FROM jumpserver/lina-base:20251105_092554 AS stage-build
|
FROM jumpserver/lina-base:20251201_095403 AS stage-build
|
||||||
|
|
||||||
ARG VERSION
|
ARG VERSION
|
||||||
ENV VERSION=$VERSION
|
ENV VERSION=$VERSION
|
||||||
|
|||||||
@@ -140,5 +140,6 @@
|
|||||||
"src/**/*.{js,vue}": [
|
"src/**/*.{js,vue}": [
|
||||||
"eslint --fix"
|
"eslint --fix"
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||||
}
|
}
|
||||||
|
|||||||
1
src/icons/svg/access-token.svg
Normal file
1
src/icons/svg/access-token.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free v5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.999 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z"/></svg>
|
||||||
|
After Width: | Height: | Size: 691 B |
@@ -123,6 +123,16 @@ export default {
|
|||||||
permissions: ['authentication.view_connectiontoken']
|
permissions: ['authentication.view_connectiontoken']
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/profile/access-token',
|
||||||
|
component: () => import('@/views/profile/AccessToken'),
|
||||||
|
name: 'AccessToken',
|
||||||
|
meta: {
|
||||||
|
title: i18n.t('AccessToken'),
|
||||||
|
icon: 'access-token',
|
||||||
|
permissions: ['oauth2_provider.view_accesstoken']
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/profile/preferences',
|
path: '/profile/preferences',
|
||||||
name: 'Preferences',
|
name: 'Preferences',
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ export default {
|
|||||||
[this.$tc('Platform'), 'platform'],
|
[this.$tc('Platform'), 'platform'],
|
||||||
[this.$tc('Node'), 'node'],
|
[this.$tc('Node'), 'node'],
|
||||||
[this.$tc('Protocol'), 'protocols'],
|
[this.$tc('Protocol'), 'protocols'],
|
||||||
[this.$tc('Region'), 'region_id']
|
[this.$tc('Region'), 'region_name']
|
||||||
],
|
],
|
||||||
data: []
|
data: []
|
||||||
},
|
},
|
||||||
@@ -124,7 +124,7 @@ export default {
|
|||||||
this.ws.onmessage = e => {
|
this.ws.onmessage = e => {
|
||||||
const data = JSON.parse(e.data)
|
const data = JSON.parse(e.data)
|
||||||
if (data.action === 'sync_region') {
|
if (data.action === 'sync_region') {
|
||||||
this.addRegion(data.region_id)
|
this.addRegion(data.id, data.name)
|
||||||
} else if (data.action === 'import') {
|
} else if (data.action === 'import') {
|
||||||
data['@status'] = 'pending'
|
data['@status'] = 'pending'
|
||||||
this.$refs.importTable.addTableItem(data)
|
this.$refs.importTable.addTableItem(data)
|
||||||
@@ -140,10 +140,10 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
addRegion(region) {
|
addRegion(regionId, regionName) {
|
||||||
if (!this.alreadySync.includes(region)) {
|
if (!this.alreadySync.includes(regionId)) {
|
||||||
this.alreadySync.push(region)
|
this.alreadySync.push(regionId)
|
||||||
this.tip = `${this.$t('SyncRegion')}: ${this.alreadySync.at(-1)}`
|
this.tip = `${this.$t('SyncRegion')}: ${regionName}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showResult() {
|
showResult() {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ export const ucloud = 'ucloud'
|
|||||||
|
|
||||||
export const volcengine = 'volcengine'
|
export const volcengine = 'volcengine'
|
||||||
|
|
||||||
|
export const ctyun = 'ctyun'
|
||||||
|
|
||||||
export const qingcloud_private = 'qingcloud_private'
|
export const qingcloud_private = 'qingcloud_private'
|
||||||
export const huaweicloud_private = 'huaweicloud_private'
|
export const huaweicloud_private = 'huaweicloud_private'
|
||||||
export const ctyun_private = 'ctyun_private'
|
export const ctyun_private = 'ctyun_private'
|
||||||
@@ -46,7 +48,8 @@ export const publicHostProviders = [
|
|||||||
gcp,
|
gcp,
|
||||||
ucloud,
|
ucloud,
|
||||||
volcengine,
|
volcengine,
|
||||||
smartx
|
smartx,
|
||||||
|
ctyun
|
||||||
]
|
]
|
||||||
|
|
||||||
export const publicDBProviders = [aliyun]
|
export const publicDBProviders = [aliyun]
|
||||||
@@ -141,6 +144,12 @@ export const ACCOUNT_PROVIDER_ATTRS_MAP = {
|
|||||||
attrs: ['access_key_id', 'access_key_secret'],
|
attrs: ['access_key_id', 'access_key_secret'],
|
||||||
image: require('@/assets/img/cloud/volcengine.svg')
|
image: require('@/assets/img/cloud/volcengine.svg')
|
||||||
},
|
},
|
||||||
|
[ctyun]: {
|
||||||
|
name: ctyun,
|
||||||
|
title: i18n.t('CTYun'),
|
||||||
|
attrs: ['access_key_id', 'access_key_secret', 'project_id'],
|
||||||
|
image: require('@/assets/img/cloud/state.svg')
|
||||||
|
},
|
||||||
[vmware]: {
|
[vmware]: {
|
||||||
name: vmware,
|
name: vmware,
|
||||||
title: 'VMware',
|
title: 'VMware',
|
||||||
|
|||||||
77
src/views/profile/AccessToken.vue
Normal file
77
src/views/profile/AccessToken.vue
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<template>
|
||||||
|
<GenericListPage
|
||||||
|
ref="GenericListTable"
|
||||||
|
:header-actions="headerActions"
|
||||||
|
:help-tip="helpMessage"
|
||||||
|
:table-config="tableConfig"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { GenericListPage } from '@/layout/components'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
GenericListPage
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
const ajaxUrl = '/api/v1/authentication/access-tokens/'
|
||||||
|
return {
|
||||||
|
helpMessage: this.$t('AccessTokenTip'),
|
||||||
|
tableConfig: {
|
||||||
|
hasSelection: false,
|
||||||
|
url: ajaxUrl,
|
||||||
|
columns: [
|
||||||
|
'token_preview', 'scope', 'is_valid', 'expires', 'updated', 'created', 'actions'
|
||||||
|
],
|
||||||
|
columnsMeta: {
|
||||||
|
actions: {
|
||||||
|
prop: '',
|
||||||
|
formatterArgs: {
|
||||||
|
hasUpdate: false,
|
||||||
|
hasClone: false,
|
||||||
|
hasDelete: false,
|
||||||
|
extraActions: [
|
||||||
|
{
|
||||||
|
name: 'Revoke',
|
||||||
|
title: this.$t('Revoke'),
|
||||||
|
can: ({ row }) => this.$hasPerm('oauth2_provider.delete_accesstoken'),
|
||||||
|
type: 'info',
|
||||||
|
callback: function({ row }) {
|
||||||
|
this.$axios.delete(`${ajaxUrl}${row.id}/revoke/`,
|
||||||
|
).then(res => {
|
||||||
|
this.reloadTable()
|
||||||
|
this.$message.success(this.$tc('UpdateSuccessMsg'))
|
||||||
|
}).catch(error => {
|
||||||
|
this.$message.error(this.$tc('UpdateErrorMsg' + ' ' + error))
|
||||||
|
})
|
||||||
|
}.bind(this)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headerActions: {
|
||||||
|
hasLeftActions: false,
|
||||||
|
hasSearch: false,
|
||||||
|
hasRightActions: true,
|
||||||
|
hasRefresh: true,
|
||||||
|
hasExport: false,
|
||||||
|
hasImport: false,
|
||||||
|
hasBulkDelete: false,
|
||||||
|
hasCreate: false,
|
||||||
|
extraActions: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
reloadTable() {
|
||||||
|
this.$refs.GenericListTable.reloadTable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user