Compare commits
57 Commits
revert-519
...
v3.10.20-l
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81b3c79ac1 | ||
|
|
710fa9c109 | ||
|
|
b3a3ca13a7 | ||
|
|
e04abd8b79 | ||
|
|
e3a207f7b6 | ||
|
|
40379ac761 | ||
|
|
33862c716e | ||
|
|
4162bdb74d | ||
|
|
d231bd503c | ||
|
|
b42c5f9170 | ||
|
|
f823257515 | ||
|
|
d3f4b2b2e8 | ||
|
|
5eba19946c | ||
|
|
b4e889316e | ||
|
|
4a72e5aa2b | ||
|
|
6ea86c7efe | ||
|
|
dc0a0ae868 | ||
|
|
5b3b8f72cd | ||
|
|
df26679166 | ||
|
|
9efccb8ada | ||
|
|
d784530539 | ||
|
|
afcc60f29c | ||
|
|
f8d581e455 | ||
|
|
dba1540953 | ||
|
|
456227abcf | ||
|
|
66532f4d4b | ||
|
|
42f27eb30f | ||
|
|
57920bf771 | ||
|
|
290772f44e | ||
|
|
f140f2f59e | ||
|
|
7b1883e012 | ||
|
|
352ac7e828 | ||
|
|
1cbd58664c | ||
|
|
e48da6be9b | ||
|
|
fa31b36550 | ||
|
|
6b93a6563d | ||
|
|
d561701049 | ||
|
|
edbf477c1e | ||
|
|
6a2578b339 | ||
|
|
2cb7569cb0 | ||
|
|
9e0c623b9a | ||
|
|
40bf040501 | ||
|
|
efee7c7bbf | ||
|
|
5daecb84ae | ||
|
|
3be325214d | ||
|
|
581509f42f | ||
|
|
654b36b064 | ||
|
|
dcec73ae67 | ||
|
|
00bafa8164 | ||
|
|
da09af79a7 | ||
|
|
b596815ea5 | ||
|
|
cb37273e80 | ||
|
|
c5bf7d0ad2 | ||
|
|
c31195a67a | ||
|
|
1eb59b379a | ||
|
|
b7cee17156 | ||
|
|
f1c8874010 |
@@ -22,6 +22,5 @@ VUE_APP_LOGOUT_PATH = '/core/auth/logout/'
|
|||||||
# Dev server for core proxy
|
# Dev server for core proxy
|
||||||
VUE_APP_CORE_HOST = 'http://localhost:8080'
|
VUE_APP_CORE_HOST = 'http://localhost:8080'
|
||||||
VUE_APP_CORE_WS = 'ws://localhost:8080'
|
VUE_APP_CORE_WS = 'ws://localhost:8080'
|
||||||
VUE_APP_KOKO_HOST = 'http://localhost:5000'
|
VUE_APP_KAEL_HOST = 'http://localhost:8083'
|
||||||
VUE_APP_KOKO_WS = 'ws://localhost:5000'
|
|
||||||
VUE_APP_ENV = 'development'
|
VUE_APP_ENV = 'development'
|
||||||
|
|||||||
272
.eslintrc.js
@@ -14,97 +14,64 @@ module.exports = {
|
|||||||
window: true,
|
window: true,
|
||||||
_: true
|
_: true
|
||||||
},
|
},
|
||||||
plugins: ['vue', 'spellcheck'],
|
|
||||||
// add your custom rules here
|
// add your custom rules here
|
||||||
// it is base on https://github.com/vuejs/eslint-config-vue
|
// it is base on https://github.com/vuejs/eslint-config-vue
|
||||||
rules: {
|
rules: {
|
||||||
'vue/max-attributes-per-line': [
|
'vue/max-attributes-per-line': [2, {
|
||||||
2,
|
'singleline': 10,
|
||||||
{
|
'multiline': {
|
||||||
singleline: 10,
|
'max': 1,
|
||||||
multiline: {
|
'allowFirstLine': false
|
||||||
max: 1,
|
|
||||||
allowFirstLine: false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
}],
|
||||||
'vue/singleline-html-element-content-newline': 'off',
|
'vue/singleline-html-element-content-newline': 'off',
|
||||||
'vue/multiline-html-element-content-newline': 'off',
|
'vue/multiline-html-element-content-newline': 'off',
|
||||||
'vue/name-property-casing': ['error', 'PascalCase'],
|
'vue/name-property-casing': ['error', 'PascalCase'],
|
||||||
'vue/no-v-html': 'off',
|
'vue/no-v-html': 'off',
|
||||||
'accessor-pairs': 2,
|
'accessor-pairs': 2,
|
||||||
'arrow-spacing': [
|
'arrow-spacing': [2, {
|
||||||
2,
|
'before': true,
|
||||||
{
|
'after': true
|
||||||
before: true,
|
}],
|
||||||
after: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'block-spacing': [2, 'always'],
|
'block-spacing': [2, 'always'],
|
||||||
'brace-style': [
|
'brace-style': [2, '1tbs', {
|
||||||
2,
|
'allowSingleLine': true
|
||||||
'1tbs',
|
}],
|
||||||
{
|
'camelcase': [0, {
|
||||||
allowSingleLine: true
|
'properties': 'always'
|
||||||
}
|
}],
|
||||||
],
|
|
||||||
camelcase: [
|
|
||||||
0,
|
|
||||||
{
|
|
||||||
properties: 'always'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'comma-dangle': [2, 'never'],
|
'comma-dangle': [2, 'never'],
|
||||||
'comma-spacing': [
|
'comma-spacing': [2, {
|
||||||
2,
|
'before': false,
|
||||||
{
|
'after': true
|
||||||
before: false,
|
}],
|
||||||
after: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'comma-style': [2, 'last'],
|
'comma-style': [2, 'last'],
|
||||||
'constructor-super': 2,
|
'constructor-super': 2,
|
||||||
curly: [2, 'multi-line'],
|
'curly': [2, 'multi-line'],
|
||||||
'dot-location': [2, 'property'],
|
'dot-location': [2, 'property'],
|
||||||
'eol-last': 2,
|
'eol-last': 2,
|
||||||
eqeqeq: ['error', 'always', { null: 'ignore' }],
|
'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
|
||||||
'generator-star-spacing': [
|
'generator-star-spacing': [2, {
|
||||||
2,
|
'before': true,
|
||||||
{
|
'after': true
|
||||||
before: true,
|
}],
|
||||||
after: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'handle-callback-err': [2, '^(err|error)$'],
|
'handle-callback-err': [2, '^(err|error)$'],
|
||||||
indent: [
|
'indent': [2, 2, {
|
||||||
2,
|
'SwitchCase': 1
|
||||||
2,
|
}],
|
||||||
{
|
|
||||||
SwitchCase: 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'jsx-quotes': [2, 'prefer-single'],
|
'jsx-quotes': [2, 'prefer-single'],
|
||||||
'key-spacing': [
|
'key-spacing': [2, {
|
||||||
2,
|
'beforeColon': false,
|
||||||
{
|
'afterColon': true
|
||||||
beforeColon: false,
|
}],
|
||||||
afterColon: true
|
'keyword-spacing': [2, {
|
||||||
}
|
'before': true,
|
||||||
],
|
'after': true
|
||||||
'keyword-spacing': [
|
}],
|
||||||
2,
|
'new-cap': [2, {
|
||||||
{
|
'newIsCap': true,
|
||||||
before: true,
|
'capIsNew': false
|
||||||
after: true
|
}],
|
||||||
}
|
|
||||||
],
|
|
||||||
'new-cap': [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
newIsCap: true,
|
|
||||||
capIsNew: false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'new-parens': 2,
|
'new-parens': 2,
|
||||||
'no-array-constructor': 2,
|
'no-array-constructor': 2,
|
||||||
'no-caller': 2,
|
'no-caller': 2,
|
||||||
@@ -135,23 +102,17 @@ module.exports = {
|
|||||||
'no-irregular-whitespace': 2,
|
'no-irregular-whitespace': 2,
|
||||||
'no-iterator': 2,
|
'no-iterator': 2,
|
||||||
'no-label-var': 2,
|
'no-label-var': 2,
|
||||||
'no-labels': [
|
'no-labels': [2, {
|
||||||
2,
|
'allowLoop': false,
|
||||||
{
|
'allowSwitch': false
|
||||||
allowLoop: false,
|
}],
|
||||||
allowSwitch: false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'no-lone-blocks': 2,
|
'no-lone-blocks': 2,
|
||||||
'no-mixed-spaces-and-tabs': 2,
|
'no-mixed-spaces-and-tabs': 2,
|
||||||
'no-multi-spaces': 2,
|
'no-multi-spaces': 2,
|
||||||
'no-multi-str': 2,
|
'no-multi-str': 2,
|
||||||
'no-multiple-empty-lines': [
|
'no-multiple-empty-lines': [2, {
|
||||||
2,
|
'max': 1
|
||||||
{
|
}],
|
||||||
max: 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'no-native-reassign': 2,
|
'no-native-reassign': 2,
|
||||||
'no-negated-in-lhs': 2,
|
'no-negated-in-lhs': 2,
|
||||||
'no-new-object': 2,
|
'no-new-object': 2,
|
||||||
@@ -179,125 +140,62 @@ module.exports = {
|
|||||||
'no-undef-init': 2,
|
'no-undef-init': 2,
|
||||||
'no-unexpected-multiline': 2,
|
'no-unexpected-multiline': 2,
|
||||||
'no-unmodified-loop-condition': 2,
|
'no-unmodified-loop-condition': 2,
|
||||||
'no-unneeded-ternary': [
|
'no-unneeded-ternary': [2, {
|
||||||
2,
|
'defaultAssignment': false
|
||||||
{
|
}],
|
||||||
defaultAssignment: false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'no-unreachable': 2,
|
'no-unreachable': 2,
|
||||||
'no-unsafe-finally': 2,
|
'no-unsafe-finally': 2,
|
||||||
'no-unused-vars': [
|
'no-unused-vars': [2, {
|
||||||
2,
|
'vars': 'all',
|
||||||
{
|
'args': 'none'
|
||||||
vars: 'all',
|
}],
|
||||||
args: 'none'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'no-useless-call': 2,
|
'no-useless-call': 2,
|
||||||
'no-useless-computed-key': 2,
|
'no-useless-computed-key': 2,
|
||||||
'no-useless-constructor': 2,
|
'no-useless-constructor': 2,
|
||||||
'no-useless-escape': 0,
|
'no-useless-escape': 0,
|
||||||
'no-whitespace-before-property': 2,
|
'no-whitespace-before-property': 2,
|
||||||
'no-with': 2,
|
'no-with': 2,
|
||||||
'one-var': [
|
'one-var': [2, {
|
||||||
2,
|
'initialized': 'never'
|
||||||
{
|
}],
|
||||||
initialized: 'never'
|
'operator-linebreak': [2, 'after', {
|
||||||
|
'overrides': {
|
||||||
|
'?': 'before',
|
||||||
|
':': 'before'
|
||||||
}
|
}
|
||||||
],
|
}],
|
||||||
'operator-linebreak': [
|
|
||||||
2,
|
|
||||||
'after',
|
|
||||||
{
|
|
||||||
overrides: {
|
|
||||||
'?': 'before',
|
|
||||||
':': 'before'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'padded-blocks': [2, 'never'],
|
'padded-blocks': [2, 'never'],
|
||||||
quotes: [
|
'quotes': [2, 'single', {
|
||||||
2,
|
'avoidEscape': true,
|
||||||
'single',
|
'allowTemplateLiterals': true
|
||||||
{
|
}],
|
||||||
avoidEscape: true,
|
'semi': [2, 'never'],
|
||||||
allowTemplateLiterals: true
|
'semi-spacing': [2, {
|
||||||
}
|
'before': false,
|
||||||
],
|
'after': true
|
||||||
semi: [2, 'never'],
|
}],
|
||||||
'semi-spacing': [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
before: false,
|
|
||||||
after: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'space-before-blocks': [2, 'always'],
|
'space-before-blocks': [2, 'always'],
|
||||||
'space-before-function-paren': [
|
'space-before-function-paren': [2, 'never'],
|
||||||
2,
|
|
||||||
{ anonymous: 'never', named: 'never', asyncArrow: 'always' }
|
|
||||||
],
|
|
||||||
'space-in-parens': [2, 'never'],
|
'space-in-parens': [2, 'never'],
|
||||||
'space-infix-ops': 2,
|
'space-infix-ops': 2,
|
||||||
'space-unary-ops': [
|
'space-unary-ops': [2, {
|
||||||
2,
|
'words': true,
|
||||||
{
|
'nonwords': false
|
||||||
words: true,
|
}],
|
||||||
nonwords: false
|
'spaced-comment': [2, 'always', {
|
||||||
}
|
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
|
||||||
],
|
}],
|
||||||
'object-curly-spacing': [2, 'always'],
|
|
||||||
'spaced-comment': [
|
|
||||||
2,
|
|
||||||
'always',
|
|
||||||
{
|
|
||||||
markers: ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'template-curly-spacing': [2, 'never'],
|
'template-curly-spacing': [2, 'never'],
|
||||||
'use-isnan': 2,
|
'use-isnan': 2,
|
||||||
'valid-typeof': 2,
|
'valid-typeof': 2,
|
||||||
'wrap-iife': [2, 'any'],
|
'wrap-iife': [2, 'any'],
|
||||||
'yield-star-spacing': [2, 'both'],
|
'yield-star-spacing': [2, 'both'],
|
||||||
yoda: [2, 'never'],
|
'yoda': [2, 'never'],
|
||||||
'prefer-const': 2,
|
'prefer-const': 2,
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
||||||
'array-bracket-spacing': [2, 'never'],
|
'object-curly-spacing': [2, 'always', {
|
||||||
'spellcheck/spell-checker': [
|
objectsInObjects: false
|
||||||
'warn',
|
}],
|
||||||
{
|
'array-bracket-spacing': [2, 'never']
|
||||||
comments: true,
|
|
||||||
strings: false,
|
|
||||||
identifiers: false,
|
|
||||||
lang: 'en_US',
|
|
||||||
skipWords: [
|
|
||||||
'echarts',
|
|
||||||
'resize',
|
|
||||||
'vue',
|
|
||||||
'eslint',
|
|
||||||
'babel',
|
|
||||||
'jsx',
|
|
||||||
'scss',
|
|
||||||
'v-deep',
|
|
||||||
'calc',
|
|
||||||
'vw',
|
|
||||||
'vh',
|
|
||||||
'px',
|
|
||||||
'rgba',
|
|
||||||
'rgb',
|
|
||||||
'var',
|
|
||||||
'lang',
|
|
||||||
'scoped',
|
|
||||||
'pdf',
|
|
||||||
'rbac'
|
|
||||||
],
|
|
||||||
skipIfMatch: [
|
|
||||||
'http://[^s]*',
|
|
||||||
'^[-\\w]+/[-\\w\\.]+$' // For import paths
|
|
||||||
],
|
|
||||||
minLength: 3
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
name: LLM Code Review
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, reopened, synchronize]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
llm-code-review:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: fit2cloud/LLM-CodeReview-Action@main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.FIT2CLOUDRD_LLM_CODE_REVIEW_TOKEN }}
|
|
||||||
OPENAI_API_KEY: ${{ secrets.ALIYUN_LLM_API_KEY }}
|
|
||||||
LANGUAGE: English
|
|
||||||
OPENAI_API_ENDPOINT: https://dashscope.aliyuncs.com/compatible-mode/v1
|
|
||||||
MODEL: qwen2-1.5b-instruct
|
|
||||||
PROMPT: "Please check the following code differences for any irregularities, potential issues, or optimization suggestions, and provide your answers in English."
|
|
||||||
top_p: 1
|
|
||||||
temperature: 1
|
|
||||||
# max_tokens: 10000
|
|
||||||
MAX_PATCH_LENGTH: 10000
|
|
||||||
IGNORE_PATTERNS: "/node_modules,*.md,/dist,/.github"
|
|
||||||
FILE_PATTERNS: "*.java,*.go,*.py,*.vue,*.ts,*.js,*.css,*.scss,*.html"
|
|
||||||
72
.github/workflows/build-base-image.yml
vendored
@@ -1,72 +0,0 @@
|
|||||||
name: Build and Push Base Image
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'pr*'
|
|
||||||
paths:
|
|
||||||
- 'package.json'
|
|
||||||
- 'package-lock.json'
|
|
||||||
- 'yarn.lock'
|
|
||||||
- 'Dockerfile-base'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Lock Pull Request
|
|
||||||
run: |
|
|
||||||
curl -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
|
||||||
-d '{"state":"pending", "description":"Action running, merge disabled", "context":"Lock PR"}' \
|
|
||||||
"https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.sha }}"
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Extract date
|
|
||||||
id: vars
|
|
||||||
run: echo "IMAGE_TAG=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Extract repository name
|
|
||||||
id: repo
|
|
||||||
run: echo "REPO=$(basename ${{ github.repository }})" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Build and push multi-arch image
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
|
||||||
file: Dockerfile-base
|
|
||||||
tags: jumpserver/${{ env.REPO }}-base:${{ env.IMAGE_TAG }}
|
|
||||||
|
|
||||||
- name: Update Dockerfile
|
|
||||||
run: |
|
|
||||||
sed -i 's|-base:.* AS stage-build|-base:${{ env.IMAGE_TAG }} AS stage-build|' Dockerfile
|
|
||||||
|
|
||||||
- name: Commit changes
|
|
||||||
run: |
|
|
||||||
git config --global user.name 'github-actions[bot]'
|
|
||||||
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
|
|
||||||
git add Dockerfile
|
|
||||||
git commit -m "perf: Update Dockerfile with new base image tag"
|
|
||||||
git push
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Unlock Pull Request
|
|
||||||
run: |
|
|
||||||
curl -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
|
||||||
-d '{"state":"success", "description":"Action running, merge disabled", "context":"Lock PR"}' \
|
|
||||||
"https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.sha }}"
|
|
||||||
32
.github/workflows/jms-build-test.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: "Run Build Test"
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- pr@*
|
||||||
|
- repr@*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
- uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: false
|
||||||
|
tags: jumpserver/lina:test
|
||||||
|
file: Dockerfile
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
- uses: LouisBrunner/checks-action@v1.5.0
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
name: Check Build
|
||||||
|
conclusion: ${{ job.status }}
|
||||||
46
.github/workflows/jms-build-test.yml.disabled
vendored
@@ -1,46 +0,0 @@
|
|||||||
name: "Run Build Test"
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'Dockerfile'
|
|
||||||
- 'Dockerfile*'
|
|
||||||
- 'package.json'
|
|
||||||
- 'yarn.lock'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
component: [ lina ]
|
|
||||||
version: [ v4 ]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Prepare Build
|
|
||||||
run: |
|
|
||||||
sed -i 's@registry.npmmirror.com@registry.yarnpkg.com@g' yarn.lock
|
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: ${{ github.repository_owner }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build Image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
push: true
|
|
||||||
file: Dockerfile
|
|
||||||
tags: ghcr.io/jumpserver/${{ matrix.component }}:${{ matrix.version }}
|
|
||||||
platforms: linux/amd64
|
|
||||||
build-args: |
|
|
||||||
VERSION=${{ matrix.version }}
|
|
||||||
APT_MIRROR=http://deb.debian.org
|
|
||||||
NPM_REGISTRY=https://registry.yarnpkg.com
|
|
||||||
outputs: type=image,oci-mediatypes=true,compression=zstd,compression-level=3,force-compression=true
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
28
.github/workflows/llm-code-review.yml
vendored
@@ -1,28 +0,0 @@
|
|||||||
name: LLM Code Review
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, reopened, synchronize]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
llm-code-review:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: fit2cloud/LLM-CodeReview-Action@main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.FIT2CLOUDRD_LLM_CODE_REVIEW_TOKEN }}
|
|
||||||
OPENAI_API_KEY: ${{ secrets.ALIYUN_LLM_API_KEY }}
|
|
||||||
LANGUAGE: English
|
|
||||||
OPENAI_API_ENDPOINT: https://dashscope.aliyuncs.com/compatible-mode/v1
|
|
||||||
MODEL: qwen2-1.5b-instruct
|
|
||||||
PROMPT: "Please check the following code differences for any irregularities, potential issues, or optimization suggestions, and provide your answers in English."
|
|
||||||
top_p: 1
|
|
||||||
temperature: 1
|
|
||||||
# max_tokens: 10000
|
|
||||||
MAX_PATCH_LENGTH: 10000
|
|
||||||
IGNORE_PATTERNS: "/node_modules,*.md,/dist,/.github"
|
|
||||||
FILE_PATTERNS: "*.java,*.go,*.py,*.vue,*.ts,*.js,*.css,*.scss,*.html"
|
|
||||||
2
.github/workflows/release-drafter.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
tag: ${{ steps.get_version.outputs.TAG }}
|
tag: ${{ steps.get_version.outputs.TAG }}
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: '20.15'
|
node-version: '16.20'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
- name: Build web
|
- name: Build web
|
||||||
|
|||||||
2
.gitignore
vendored
@@ -17,5 +17,3 @@ tests/**/coverage/
|
|||||||
*.sln
|
*.sln
|
||||||
.env.development
|
.env.development
|
||||||
.python-version
|
.python-version
|
||||||
|
|
||||||
helper.json
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# Dependencies
|
|
||||||
node_modules/
|
|
||||||
dist/
|
|
||||||
build/
|
|
||||||
lina/
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
*.log
|
|
||||||
logs/
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids/
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage/
|
|
||||||
|
|
||||||
# Generated files
|
|
||||||
*.min.js
|
|
||||||
*.min.css
|
|
||||||
|
|
||||||
# Package files
|
|
||||||
*.tgz
|
|
||||||
*.tar.gz
|
|
||||||
|
|
||||||
# Lock files
|
|
||||||
package-lock.json
|
|
||||||
yarn.lock
|
|
||||||
|
|
||||||
# Build outputs
|
|
||||||
*.map
|
|
||||||
|
|
||||||
# Config files that shouldn't be formatted
|
|
||||||
.eslintrc.js
|
|
||||||
babel.config.js
|
|
||||||
jest.config.js
|
|
||||||
vue.config.js
|
|
||||||
postcss.config.js
|
|
||||||
|
|
||||||
# Theme files
|
|
||||||
src/styles/fonts/
|
|
||||||
public/fonts/
|
|
||||||
lina/fonts/
|
|
||||||
|
|
||||||
# Assets
|
|
||||||
src/assets/
|
|
||||||
public/
|
|
||||||
|
|
||||||
# Mock data
|
|
||||||
mock/
|
|
||||||
|
|
||||||
# Test files
|
|
||||||
tests/
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
*.md
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
singleQuote: true,
|
|
||||||
semi: false,
|
|
||||||
trailingComma: 'none',
|
|
||||||
printWidth: 100,
|
|
||||||
tabWidth: 2,
|
|
||||||
useTabs: false,
|
|
||||||
bracketSpacing: true,
|
|
||||||
arrowParens: 'avoid',
|
|
||||||
endOfLine: 'auto'
|
|
||||||
}
|
|
||||||
33
Dockerfile
@@ -1,11 +1,36 @@
|
|||||||
FROM jumpserver/lina-base:20250910_084112 AS stage-build
|
FROM node:16.20-bullseye-slim as stage-build
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
ARG DEPENDENCIES=" \
|
||||||
|
g++ \
|
||||||
|
make \
|
||||||
|
python3"
|
||||||
|
|
||||||
|
ARG APT_MIRROR=http://mirrors.ustc.edu.cn
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=lina \
|
||||||
|
sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
|
||||||
|
&& rm -f /etc/apt/apt.conf.d/docker-clean \
|
||||||
|
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends ${DEPENDENCIES} \
|
||||||
|
&& echo "no" | dpkg-reconfigure dash \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
ARG NPM_REGISTRY="https://registry.npmmirror.com"
|
||||||
|
RUN set -ex \
|
||||||
|
&& npm config set registry ${NPM_REGISTRY} \
|
||||||
|
&& yarn config set registry ${NPM_REGISTRY}
|
||||||
|
|
||||||
|
WORKDIR /data
|
||||||
|
|
||||||
|
ADD package.json yarn.lock /data
|
||||||
|
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=lina \
|
||||||
|
yarn install
|
||||||
|
|
||||||
ARG VERSION
|
ARG VERSION
|
||||||
ENV VERSION=$VERSION
|
ENV VERSION=$VERSION
|
||||||
|
|
||||||
ADD . /data
|
ADD . /data
|
||||||
|
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=lina \
|
||||||
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked \
|
|
||||||
sed -i "s@version-dev@${VERSION}@g" src/layout/components/NavHeader/About.vue \
|
sed -i "s@version-dev@${VERSION}@g" src/layout/components/NavHeader/About.vue \
|
||||||
&& yarn build
|
&& yarn build
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
FROM node:20.15-bullseye-slim
|
|
||||||
|
|
||||||
ARG DEPENDENCIES=" \
|
|
||||||
g++ \
|
|
||||||
make \
|
|
||||||
python3"
|
|
||||||
|
|
||||||
RUN set -ex \
|
|
||||||
&& rm -f /etc/apt/apt.conf.d/docker-clean \
|
|
||||||
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
|
|
||||||
&& apt-get update \
|
|
||||||
&& apt-get -y install --no-install-recommends ${DEPENDENCIES} \
|
|
||||||
&& echo "no" | dpkg-reconfigure dash
|
|
||||||
|
|
||||||
WORKDIR /data
|
|
||||||
|
|
||||||
COPY package.json yarn.lock ./
|
|
||||||
|
|
||||||
ARG NPM_MIRROR="https://registry.npmjs.org"
|
|
||||||
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=yarn-cache \
|
|
||||||
sed -i "s|https://registry.npmmirror.com|${NPM_MIRROR}|g" yarn.lock \
|
|
||||||
&& yarn install
|
|
||||||
76
PRETTIER.md
@@ -1,76 +0,0 @@
|
|||||||
# Prettier 配置说明
|
|
||||||
|
|
||||||
本项目已配置 Prettier 代码格式化工具,**仅在保存时自动格式化**,不进行批量格式化,以保持现有代码风格。
|
|
||||||
|
|
||||||
## 配置文件
|
|
||||||
|
|
||||||
- `.prettierrc` - Prettier 配置文件
|
|
||||||
- `.prettierignore` - 忽略格式化的文件列表
|
|
||||||
- `.vscode/settings.json` - VSCode 编辑器配置(保存时自动格式化)
|
|
||||||
- `.vscode/extensions.json` - 推荐的 VSCode 扩展
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
|
|
||||||
### 1. 安装依赖
|
|
||||||
项目已安装以下依赖:
|
|
||||||
- `prettier@^2.8.8` - Prettier 核心
|
|
||||||
- `eslint-plugin-prettier@^3.1.4` - ESLint 与 Prettier 集成
|
|
||||||
- `eslint-config-prettier@^6.15.0` - 禁用与 Prettier 冲突的 ESLint 规则
|
|
||||||
|
|
||||||
### 2. 命令行使用
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# ESLint 检查和修复
|
|
||||||
npm run fix
|
|
||||||
```
|
|
||||||
|
|
||||||
**注意**:本项目配置为仅在保存时自动格式化,不提供批量格式化命令。
|
|
||||||
|
|
||||||
### 3. VSCode 编辑器配置
|
|
||||||
|
|
||||||
确保安装了推荐的扩展:
|
|
||||||
- Prettier - Code formatter (esbenp.prettier-vscode)
|
|
||||||
- ESLint (dbaeumer.vscode-eslint)
|
|
||||||
- Vetur (octref.vetur)
|
|
||||||
|
|
||||||
配置已设置为保存时自动格式化。
|
|
||||||
|
|
||||||
### 4. Git 提交钩子
|
|
||||||
|
|
||||||
项目使用 `husky` 和 `lint-staged` 在提交时进行代码检查:
|
|
||||||
- 提交时运行 ESLint 检查和修复
|
|
||||||
- 不进行批量格式化,保持原有代码风格
|
|
||||||
|
|
||||||
## Prettier 配置说明
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"semi": false, // 不使用分号
|
|
||||||
"singleQuote": true, // 使用单引号
|
|
||||||
"tabWidth": 0, // 不使用缩进
|
|
||||||
"useTabs": false, // 使用空格而不是制表符
|
|
||||||
"trailingComma": "none", // 不使用尾随逗号
|
|
||||||
"printWidth": 100, // 行宽 100 字符
|
|
||||||
"bracketSpacing": true, // 对象括号内有空格
|
|
||||||
"arrowParens": "avoid", // 箭头函数单参数时不使用括号
|
|
||||||
"endOfLine": "lf", // 使用 LF 换行符
|
|
||||||
"vueIndentScriptAndStyle": false // Vue 文件中 script 和 style 标签不缩进
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 常见问题
|
|
||||||
|
|
||||||
### Q: 如何临时禁用格式化?
|
|
||||||
A: 使用注释:
|
|
||||||
```javascript
|
|
||||||
// prettier-ignore
|
|
||||||
const uglyCode = {
|
|
||||||
a:1,b:2
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Q: 如何添加文件到忽略列表?
|
|
||||||
A: 编辑 `.prettierignore` 文件,添加文件或目录路径。
|
|
||||||
|
|
||||||
### Q: VSCode 保存时没有自动格式化?
|
|
||||||
A: 检查是否安装了 Prettier 扩展,并确认 `.vscode/settings.json` 配置正确。
|
|
||||||
@@ -5,6 +5,5 @@
|
|||||||
"@/*": ["src/*"]
|
"@/*": ["src/*"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
"exclude": ["node_modules", "dist"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,13 @@
|
|||||||
import Mock from 'mockjs'
|
import Mock from 'mockjs'
|
||||||
|
import { param2Obj } from '../src/utils'
|
||||||
|
|
||||||
import user from './user'
|
import user from './user'
|
||||||
import table from './table'
|
import table from './table'
|
||||||
|
|
||||||
export function param2Obj(url) {
|
const mocks = [
|
||||||
const search = url.split('?')[1]
|
...user,
|
||||||
if (!search) {
|
...table
|
||||||
return {}
|
]
|
||||||
}
|
|
||||||
return JSON.parse(
|
|
||||||
'{"' +
|
|
||||||
decodeURIComponent(search)
|
|
||||||
.replace(/"/g, '\\"')
|
|
||||||
.replace(/&/g, '","')
|
|
||||||
.replace(/=/g, '":"')
|
|
||||||
.replace(/\+/g, ' ') +
|
|
||||||
'"}'
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const mocks = [...user, ...table]
|
|
||||||
|
|
||||||
// for front mock
|
// for front mock
|
||||||
// please use it cautiously, it will redefine XMLHttpRequest,
|
// please use it cautiously, it will redefine XMLHttpRequest,
|
||||||
|
|||||||
42
package.json
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "lina",
|
"name": "vue-admin-template",
|
||||||
"version": "v4.0.0",
|
"version": "4.2.1",
|
||||||
"description": "JumpServer Web UI",
|
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
|
||||||
"author": "JumpServer Team <support@lxware.hk>",
|
"author": "Pan <panfree23@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
|
"dev": "vue-cli-service serve",
|
||||||
"serve": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
|
"serve": "vue-cli-service serve",
|
||||||
"build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
|
"build": "vue-cli-service build",
|
||||||
"build:prod": "vue-cli-service build",
|
"build:prod": "vue-cli-service build",
|
||||||
"build:stage": "vue-cli-service build --mode staging",
|
"build:stage": "vue-cli-service build --mode staging",
|
||||||
"preview": "node build/index.js --preview",
|
"preview": "node build/index.js --preview",
|
||||||
@@ -25,15 +25,10 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.13.12",
|
"@babel/plugin-proposal-optional-chaining": "^7.13.12",
|
||||||
"@fontsource/open-sans": "^5.0.24",
|
|
||||||
"@kangc/v-md-editor": "^1.7.12",
|
|
||||||
"@traptitech/markdown-it-katex": "^3.6.0",
|
"@traptitech/markdown-it-katex": "^3.6.0",
|
||||||
"@ztree/ztree_v3": "3.5.44",
|
"@ztree/ztree_v3": "3.5.44",
|
||||||
"axios": "0.28.0",
|
"axios": "0.28.0",
|
||||||
"axios-retry": "^3.1.9",
|
"axios-retry": "^3.1.9",
|
||||||
"babel-loader": "^10.0.0",
|
|
||||||
"cache-loader": "^4.1.0",
|
|
||||||
"caniuse-lite": "^1.0.30001642",
|
|
||||||
"cron-parser": "^4.0.0",
|
"cron-parser": "^4.0.0",
|
||||||
"crypto-js": "^4.1.1",
|
"crypto-js": "^4.1.1",
|
||||||
"css-color-function": "^1.3.3",
|
"css-color-function": "^1.3.3",
|
||||||
@@ -41,8 +36,7 @@
|
|||||||
"deepmerge": "^4.2.2",
|
"deepmerge": "^4.2.2",
|
||||||
"dompurify": "^3.1.6",
|
"dompurify": "^3.1.6",
|
||||||
"echarts": "4.7.0",
|
"echarts": "4.7.0",
|
||||||
"element-ui": "^2.15.14",
|
"element-ui": "2.13.2",
|
||||||
"elementui-lts": "^2.16.0",
|
|
||||||
"eslint-plugin-html": "^6.0.0",
|
"eslint-plugin-html": "^6.0.0",
|
||||||
"highlight.js": "^11.9.0",
|
"highlight.js": "^11.9.0",
|
||||||
"install": "^0.13.0",
|
"install": "^0.13.0",
|
||||||
@@ -70,9 +64,7 @@
|
|||||||
"normalize.css": "7.0.0",
|
"normalize.css": "7.0.0",
|
||||||
"npm": "^7.8.0",
|
"npm": "^7.8.0",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"path-to-regexp": "3.3.0",
|
"path-to-regexp": "2.4.0",
|
||||||
"sortablejs": "^1.15.6",
|
|
||||||
"v-sanitize": "^0.0.13",
|
|
||||||
"vue": "2.6.10",
|
"vue": "2.6.10",
|
||||||
"vue-codemirror": "4.0.6",
|
"vue-codemirror": "4.0.6",
|
||||||
"vue-cookie": "^1.1.4",
|
"vue-cookie": "^1.1.4",
|
||||||
@@ -85,7 +77,6 @@
|
|||||||
"vue-select": "^3.9.5",
|
"vue-select": "^3.9.5",
|
||||||
"vuejs-logger": "^1.5.4",
|
"vuejs-logger": "^1.5.4",
|
||||||
"vuex": "3.1.0",
|
"vuex": "3.1.0",
|
||||||
"watermark-js-plus": "^1.5.8",
|
|
||||||
"xss": "^1.0.14",
|
"xss": "^1.0.14",
|
||||||
"xterm": "^4.5.0",
|
"xterm": "^4.5.0",
|
||||||
"xterm-addon-fit": "^0.3.0",
|
"xterm-addon-fit": "^0.3.0",
|
||||||
@@ -100,17 +91,15 @@
|
|||||||
"@vue/cli-service": "3.6.0",
|
"@vue/cli-service": "3.6.0",
|
||||||
"@vue/test-utils": "1.0.0-beta.29",
|
"@vue/test-utils": "1.0.0-beta.29",
|
||||||
"autoprefixer": "^9.5.1",
|
"autoprefixer": "^9.5.1",
|
||||||
"babel-core": "6.26.3",
|
"babel-core": "7.0.0-bridge.0",
|
||||||
"babel-eslint": "10.0.1",
|
"babel-eslint": "10.0.1",
|
||||||
"babel-jest": "23.6.0",
|
"babel-jest": "23.6.0",
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
"compression-webpack-plugin": "^6.1.1",
|
"compression-webpack-plugin": "^6.1.1",
|
||||||
"connect": "3.6.6",
|
"connect": "3.6.6",
|
||||||
"deasync": "^0.1.29",
|
"deasync": "^0.1.29",
|
||||||
|
"element-theme-chalk": "^2.13.1",
|
||||||
"eslint": "^5.15.3",
|
"eslint": "^5.15.3",
|
||||||
"eslint-config-prettier": "^6.15.0",
|
|
||||||
"eslint-plugin-prettier": "^3.4.1",
|
|
||||||
"eslint-plugin-spellcheck": "^0.0.20",
|
|
||||||
"eslint-plugin-vue": "5.2.2",
|
"eslint-plugin-vue": "5.2.2",
|
||||||
"eslint-plugin-vue-i18n": "^0.3.0",
|
"eslint-plugin-vue-i18n": "^0.3.0",
|
||||||
"github-markdown-css": "^5.1.0",
|
"github-markdown-css": "^5.1.0",
|
||||||
@@ -119,20 +108,17 @@
|
|||||||
"less-loader": "^5.0.0",
|
"less-loader": "^5.0.0",
|
||||||
"lint-staged": "^10.1.2",
|
"lint-staged": "^10.1.2",
|
||||||
"mockjs": "1.0.1-beta3",
|
"mockjs": "1.0.1-beta3",
|
||||||
"prettier": "^3.6.2",
|
|
||||||
"pretty-bytes": "^5.6.0",
|
|
||||||
"runjs": "^4.3.2",
|
"runjs": "^4.3.2",
|
||||||
"sass": "~1.32.6",
|
"sass": "~1.32.6",
|
||||||
"sass-loader": "^7.1.0",
|
"sass-loader": "^7.1.0",
|
||||||
"script-ext-html-webpack-plugin": "2.1.3",
|
"script-ext-html-webpack-plugin": "2.1.3",
|
||||||
"script-loader": "0.7.2",
|
"script-loader": "0.7.2",
|
||||||
"serve-static": "^1.16.0",
|
"serve-static": "^1.13.2",
|
||||||
"strip-ansi": "^7.1.0",
|
"strip-ansi": "^7.1.0",
|
||||||
"svg-sprite-loader": "4.1.3",
|
"svg-sprite-loader": "4.1.3",
|
||||||
"svgo": "1.2.2",
|
"svgo": "1.2.2",
|
||||||
"vue-i18n-extract": "^1.1.1",
|
"vue-i18n-extract": "^1.1.1",
|
||||||
"vue-template-compiler": "2.6.10",
|
"vue-template-compiler": "2.6.10"
|
||||||
"webpack": "^4.28.4"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.9",
|
"node": ">=8.9",
|
||||||
|
|||||||
@@ -1,90 +1,38 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
<meta content="0" http-equiv="Expires">
|
<meta http-equiv="Expires" content="0">
|
||||||
<meta content="no-cache" http-equiv="Pragma">
|
<meta http-equiv="Pragma" content="no-cache">
|
||||||
<meta content="no-cache" http-equiv="Cache-control">
|
<meta http-equiv="Cache-control" content="no-cache">
|
||||||
<meta content="no-cache" http-equiv="Cache">
|
<meta http-equiv="Cache" content="no-cache">
|
||||||
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
<title><%= webpackConfig.name %></title>
|
<title><%= webpackConfig.name %></title>
|
||||||
<link href="<%= BASE_URL %>theme/element-ui.css" rel="stylesheet">
|
<link rel="stylesheet" href="<%= BASE_URL %>theme/element-ui.css">
|
||||||
<style>
|
</head>
|
||||||
#loading {
|
<body>
|
||||||
position: fixed;
|
<noscript>
|
||||||
top: 0;
|
<strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||||
left: 0;
|
</noscript>
|
||||||
width: 100vw;
|
<script>
|
||||||
height: 100vh;
|
window.onload = function() {
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background-color: rgba(255, 255, 255, 0.98);
|
|
||||||
z-index: 9999;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
border: 3px solid transparent;
|
|
||||||
border-top-color: var(--color-primary);
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: -3px;
|
|
||||||
left: -3px;
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
border: 3px solid transparent;
|
|
||||||
border-top-color: rgba(64, 158, 255, 0.2);
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 2s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>
|
|
||||||
We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled.
|
|
||||||
Please enable it to continue.
|
|
||||||
</strong>
|
|
||||||
</noscript>
|
|
||||||
<script>
|
|
||||||
window.onload = function () {
|
|
||||||
if (location.pathname === '/') {
|
if (location.pathname === '/') {
|
||||||
location.pathname = '/ui/'
|
location.pathname = '/ui/'
|
||||||
}
|
}
|
||||||
const pathname = window.location.pathname
|
const pathname = window.location.pathname
|
||||||
if (pathname.startsWith('/core')) {
|
if (pathname.startsWith('/core')) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (pathname.indexOf('/ui') === -1) {
|
if(pathname.indexOf('/ui') === -1) {
|
||||||
window.location.href = window.location.origin + '/ui/#' + pathname
|
window.location.href = window.location.origin + '/ui/#' + pathname
|
||||||
}
|
}
|
||||||
if (pathname.startsWith('/ui/#/chat')) {
|
if (pathname.startsWith('/ui/#/chat')) {
|
||||||
window.location.href = window.location.origin + pathname
|
window.location.href = window.location.origin + pathname
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<div id="app">
|
<div id="app"></div>
|
||||||
</div>
|
<!-- built files will be auto injected -->
|
||||||
<div id="loading">
|
</body>
|
||||||
<div class="spinner"></div>
|
|
||||||
</div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -21,39 +21,32 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.el-alert--info.is-light {
|
.el-alert--info.is-light {
|
||||||
background-color: rgba(255, 255, 255, 0.5);
|
background-color: light-9;
|
||||||
color: info;
|
color: light-2;
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-alert--info .el-alert__description {
|
.el-alert--info .el-alert__description {
|
||||||
color: info;
|
color: light-2;
|
||||||
}
|
|
||||||
|
|
||||||
.el-pagination.is-background {
|
|
||||||
.el-pagination__total,
|
|
||||||
.el-pagination__sizes,
|
|
||||||
.el-pager {
|
|
||||||
color: var(--color-icon-primary);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-pagination.is-background .el-pager li:not(.disabled):hover {
|
.el-pagination.is-background .el-pager li:not(.disabled):hover {
|
||||||
color: #fff;
|
color: white;
|
||||||
background-color: primary;
|
background-color: primary;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-pagination.is-background .btn-next,
|
.el-pagination.is-background .btn-next,
|
||||||
.el-pagination.is-background .btn-prev,
|
.el-pagination.is-background .btn-prev,
|
||||||
.el-pagination.is-background .el-pager li {
|
.el-pagination.is-background .el-pager li {
|
||||||
margin: 0 5px;
|
margin: 0 5px;
|
||||||
background-color: #fff;
|
background-color: white;
|
||||||
color: var(--color-icon-primary);
|
color: #606266;
|
||||||
min-width: 28px;
|
min-width: 28px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid #DCDFE6;
|
border: 1px solid #DCDFE6;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 400;
|
line-height: 26px;
|
||||||
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-breadcrumb__inner,
|
.el-breadcrumb__inner,
|
||||||
@@ -92,12 +85,8 @@
|
|||||||
|
|
||||||
|
|
||||||
td .el-button.el-button--mini {
|
td .el-button.el-button--mini {
|
||||||
padding: 1px 6px;
|
padding: 1px 5px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
|
|
||||||
.el-icon--right {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-tabs__item.is-active, .el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active {
|
.el-tabs__item.is-active, .el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active {
|
||||||
@@ -202,7 +191,7 @@ td .el-button.el-button--mini {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.el-input--small .el-input__icon {
|
.el-input--small .el-input__icon {
|
||||||
line-height: 30px;
|
line-height: 34px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.option-group .el-select-dropdown__item.hover, .option-group .el-select-dropdown__item.selected {
|
.option-group .el-select-dropdown__item.hover, .option-group .el-select-dropdown__item.selected {
|
||||||
@@ -235,10 +224,8 @@ td .el-button.el-button--mini {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.el-tag.el-tag--info .el-tag__close {
|
.el-tag.el-tag--info .el-tag__close {
|
||||||
display: inline-block;
|
color: #333333!important;
|
||||||
margin-top: 3px;
|
background-color: inherit;
|
||||||
color: var(--color-text-primary);
|
|
||||||
background-color: inherit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-tag.el-tag--info.is-hit {
|
.el-tag.el-tag--info.is-hit {
|
||||||
@@ -293,7 +280,7 @@ td .el-button.el-button--mini {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.el-textarea__inner {
|
.el-textarea__inner {
|
||||||
color: var(--color-text-primary);
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-pagination.is-background .number {
|
.el-pagination.is-background .number {
|
||||||
@@ -326,11 +313,11 @@ td .el-button.el-button--mini {
|
|||||||
|
|
||||||
.el-tooltip__popper.is-light {
|
.el-tooltip__popper.is-light {
|
||||||
background: #FFF;
|
background: #FFF;
|
||||||
max-width: 500px;
|
|
||||||
border: 1px solid #e7eaec;
|
border: 1px solid #e7eaec;
|
||||||
box-shadow: 0 1.6px 3.6px 0 rgba(0, 0, 0, .132), 0 .3px .9px 0 rgba(0, 0, 0, .108);
|
}
|
||||||
line-height: 1.5;
|
|
||||||
padding: 10px;
|
.el-tooltip__popper.is-light .popper__arrow {
|
||||||
|
border-bottom-color: #e7eaec !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-dialog__headerbtn .el-dialog__close {
|
.el-dialog__headerbtn .el-dialog__close {
|
||||||
@@ -339,7 +326,7 @@ td .el-button.el-button--mini {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.el-table__header thead tr th {
|
.el-table__header thead tr th {
|
||||||
/*border-bottom: 1px solid #e7e7e7 !important;*/
|
border-bottom: 1px solid #e7e7e7 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-table .cell,
|
.el-table .cell,
|
||||||
@@ -436,34 +423,14 @@ td .el-button.el-button--mini {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-dialog .el-dialog__header .el-dialog__title {
|
|
||||||
color: var(--color-text-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog .el-dialog__body {
|
.el-dialog .el-dialog__body {
|
||||||
max-height: 80vh;
|
max-height: 80vh;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-dialog .el-dialog__body .el-transfer-panel .el-transfer-panel__body .el-input__inner,
|
|
||||||
.el-dialog .el-dialog__body .el-transfer-panel .el-transfer-panel__header .el-checkbox__label,
|
|
||||||
.el-dialog .el-dialog__body .el-transfer-panel .el-transfer-panel__body .el-checkbox-group .el-checkbox.el-transfer-panel__item {
|
|
||||||
color: var(--color-text-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog .el-dialog__body .opera .el-button.is-disabled,
|
|
||||||
.el-dialog .el-dialog__body .el-transfer-panel .vip-footer .el-button.is-disabled {
|
|
||||||
color: var(--color-input-border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog .el-dialog__body .opera .el-button.is-disabled.el-button--primary {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog .el-dialog__body form {
|
.el-dialog .el-dialog__body form {
|
||||||
padding-right: 20px;
|
padding-right: 20px;
|
||||||
margin-right: 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-dialog .el-dialog__footer {
|
.el-dialog .el-dialog__footer {
|
||||||
|
|||||||
81
src/App.vue
@@ -5,90 +5,17 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapGetters } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
import { Watermark } from 'watermark-js-plus'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
watermark: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
...mapState({
|
||||||
isRouterAlive: state => state.common.isRouterAlive
|
isRouterAlive: state => state.common.isRouterAlive
|
||||||
}),
|
|
||||||
...mapGetters({
|
|
||||||
currentUser: 'currentUser',
|
|
||||||
publicSettings: 'publicSettings'
|
|
||||||
})
|
})
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
currentUser: {
|
|
||||||
handler(newVal) {
|
|
||||||
this.createWatermark()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'publicSettings.SECURITY_WATERMARK_ENABLED': {
|
|
||||||
handler(newVal) {
|
|
||||||
if (!newVal) {
|
|
||||||
return setTimeout(() => {
|
|
||||||
this.watermark?.destroy()
|
|
||||||
this.watermark = null
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
this.createWatermark()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getWaterMarkFields() {
|
|
||||||
const user = this.currentUser
|
|
||||||
const userId = user?.id || ''
|
|
||||||
const name = user?.name || ''
|
|
||||||
const userName = user?.username || ''
|
|
||||||
const currentTime = this.$moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
|
|
||||||
return { userId, name, userName, currentTime }
|
|
||||||
},
|
|
||||||
getWaterMarkContent() {
|
|
||||||
const fields = this.getWaterMarkFields()
|
|
||||||
const template = this.publicSettings.SECURITY_WATERMARK_CONSOLE_CONTENT || ''
|
|
||||||
|
|
||||||
// 找出模板中所有的变量占位符 ${xxx}
|
|
||||||
const placeholders = template.match(/\${([^}]+)}/g) || []
|
|
||||||
const allVariables = {}
|
|
||||||
|
|
||||||
// 为模板中的每个变量准备值
|
|
||||||
placeholders.forEach(placeholder => {
|
|
||||||
const varName = placeholder.slice(2, -1) // 提取变量名,去掉 ${ 和 }
|
|
||||||
allVariables[varName] = fields[varName] !== undefined ? fields[varName] : 'N/A'
|
|
||||||
})
|
|
||||||
|
|
||||||
// 合并用户现有的字段和模板中可能缺失的字段
|
|
||||||
const safeFields = { ...fields, ...allVariables }
|
|
||||||
|
|
||||||
// 安全解析模板
|
|
||||||
return new Function(...Object.keys(safeFields), `return \`${template}\`;`)(...Object.values(safeFields))
|
|
||||||
},
|
|
||||||
|
|
||||||
createWatermark() {
|
|
||||||
if (this.currentUser?.username && this.publicSettings?.SECURITY_WATERMARK_ENABLED) {
|
|
||||||
this.watermark = new Watermark({
|
|
||||||
content: this.getWaterMarkContent(),
|
|
||||||
width: this.publicSettings?.SECURITY_WATERMARK_WIDTH,
|
|
||||||
height: this.publicSettings?.SECURITY_WATERMARK_HEIGHT,
|
|
||||||
rotate: this.publicSettings?.SECURITY_WATERMARK_ROTATE,
|
|
||||||
fontWeight: 'normal',
|
|
||||||
fontSize: this.publicSettings?.SECURITY_WATERMARK_FONT_SIZE + 'px',
|
|
||||||
fontColor: this.publicSettings?.SECURITY_WATERMARK_COLOR,
|
|
||||||
contentType: 'multi-line-text',
|
|
||||||
lineHeight: this.publicSettings?.SECURITY_WATERMARK_FONT_SIZE
|
|
||||||
})
|
|
||||||
this.watermark.create()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ export function getSystemUserList(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getZoneList(data) {
|
export function getDomainList(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/assets/zones/',
|
url: '/api/v1/assets/domains/',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: data
|
params: data
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
import request from '@/utils/request'
|
|
||||||
|
|
||||||
export function getLokiLog(data) {
|
|
||||||
return request({
|
|
||||||
url: `/api/v1/terminal/loki/logs/`,
|
|
||||||
method: 'get',
|
|
||||||
params: data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -53,7 +53,7 @@ export function createJob(form) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function stopJob(form) {
|
export function StopJob(form) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/ops/job-executions/stop/',
|
url: '/api/v1/ops/job-executions/stop/',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
@@ -71,10 +71,3 @@ export function JobUploadFile(form) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function auditUpdateJob(id, form) {
|
|
||||||
return request({
|
|
||||||
url: `/api/v1/audits/jobs/${id}/`,
|
|
||||||
method: 'patch',
|
|
||||||
data: form
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ export function testEmailSetting(data) {
|
|||||||
data: data
|
data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function importLicense(formData) {
|
export function importLicense(formData) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/xpack/license/import',
|
url: '/api/v1/xpack/license/import',
|
||||||
@@ -26,7 +25,6 @@ export function importLicense(formData) {
|
|||||||
data: formData
|
data: formData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function testLdapSetting(data, refresh = true) {
|
export function testLdapSetting(data, refresh = true) {
|
||||||
let url = '/api/v1/settings/ldap/testing/config/'
|
let url = '/api/v1/settings/ldap/testing/config/'
|
||||||
if (refresh) {
|
if (refresh) {
|
||||||
@@ -98,17 +96,9 @@ export function getPublicSettings(isOpen) {
|
|||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLogo() {
|
export function getLogo() {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/xpack/interface/setting/',
|
url: '/api/v1/xpack/interface/setting/',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getPreference() {
|
|
||||||
return request({
|
|
||||||
url: '/api/v1/users/preference/?category=luna',
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,20 +8,11 @@ export function login(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getProfile(token) {
|
export function getProfile(token) {
|
||||||
let profile = await request({
|
return request({
|
||||||
url: '/api/v1/users/profile/',
|
url: '/api/v1/users/profile/',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
const perms = await request({
|
|
||||||
url: '/api/v1/users/profile/permissions/',
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
profile = {
|
|
||||||
...profile,
|
|
||||||
...perms
|
|
||||||
}
|
|
||||||
return profile
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getUserList(data) {
|
export function getUserList(data) {
|
||||||
@@ -31,7 +22,6 @@ export function getUserList(data) {
|
|||||||
params: data
|
params: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getUserGroupList(params) {
|
export function getUserGroupList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/users/groups/',
|
url: '/api/v1/users/groups/',
|
||||||
@@ -39,7 +29,6 @@ export function getUserGroupList(params) {
|
|||||||
params: params
|
params: params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getUserGroupDetail(id) {
|
export function getUserGroupDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/api/v1/users/groups/${id}/`,
|
url: `/api/v1/users/groups/${id}/`,
|
||||||
@@ -61,7 +50,6 @@ export function editUserGroup(data) {
|
|||||||
data: data
|
data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updateUserGroup(id, data) {
|
export function updateUserGroup(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/v1/users/groups/' + id + '/',
|
url: '/api/v1/users/groups/' + id + '/',
|
||||||
@@ -77,6 +65,10 @@ export function logout() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function refreshSessionIdAge() {
|
||||||
|
return getProfile()
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getProfile,
|
getProfile,
|
||||||
getUserList
|
getUserList
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 584 KiB |
|
Before Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717741737122" class="icon" viewBox="0 0 1653 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5514" width="200" height="200"><path d="M344.8620198 721.82988526a57.857089 57.857089 0 0 1-46.13274501-56.07295017v-308.4012244a59.89610558 59.89610558 0 0 1 46.13274501-56.07295017l286.35436058-62.06256065 30.07549089-122.72329718H328.80476645A210.78331632 210.78331632 0 0 0 116.61962599 327.28021902v364.47417458a213.71440233 213.71440233 0 0 0 212.18514046 212.31257895h332.48710482l-30.07549089-122.21354321zM1178.05508073 116.49690269H843.01920461l30.58524561 122.72329718 286.35436059 62.06256065a57.98452749 57.98452749 0 0 1 46.132745 56.07295017v308.4012244a60.15098257 60.15098257 0 0 1-46.13274502 56.07295017l-286.35436057 62.06256066-30.58524561 122.72329716H1178.05508073a212.44001744 212.44001744 0 0 0 212.94977139-212.82233291V327.28021902A213.33208686 213.33208686 0 0 0 1178.05508073 116.49690269z" fill="#F76E05" p-id="5515"></path><path d="M631.21638038 495.49906876h244.29964793v30.07549166H631.21638038z" fill="#F76E05" p-id="5516"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743450082" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39383" width="200" height="200"><path d="M18.753 17.145h468.424l-0.02 468.426H18.774V17.145h-0.02z m0 0" fill="#F25022" p-id="39384"></path><path d="M534.999 17.145h468.422c0 156.141 0.022 312.283-0.02 468.426H535.038c-0.06-156.162-0.039-312.285-0.039-468.426z m0 0" fill="#80BA01" p-id="39385"></path><path d="M18.753 533.352c156.141 0.058 312.282-0.019 468.424 0.058v468.386H18.753V533.352z m0 0" fill="#02A4EF" p-id="39386"></path><path d="M535.018 533.41c156.124-0.058 312.243-0.019 468.383-0.019v468.422H534.999c0.019-156.163-0.02-312.28 0.019-468.403z m0 0" fill="#FFB902" p-id="39387"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 721 B |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743450082" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39383" width="200" height="200"><path d="M18.753 17.145h468.424l-0.02 468.426H18.774V17.145h-0.02z m0 0" fill="#F25022" p-id="39384"></path><path d="M534.999 17.145h468.422c0 156.141 0.022 312.283-0.02 468.426H535.038c-0.06-156.162-0.039-312.285-0.039-468.426z m0 0" fill="#80BA01" p-id="39385"></path><path d="M18.753 533.352c156.141 0.058 312.282-0.019 468.424 0.058v468.386H18.753V533.352z m0 0" fill="#02A4EF" p-id="39386"></path><path d="M535.018 533.41c156.124-0.058 312.243-0.019 468.383-0.019v468.422H534.999c0.019-156.163-0.02-312.28 0.019-468.403z m0 0" fill="#FFB902" p-id="39387"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 721 B |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743183519" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="34140" width="200" height="200"><path d="M521.30666655 248.79999969c4.93333313 0 9.14666625 0.73333312 12.66666657 2.17333406l181.97333343 106.71999938a34.00000031 34.00000031 0 0 0 26.83999969-0.61333313l168.72-94.69333312L520.06666624 36.26666656 128.02666624 262.38666687l171.20000063 95.93333344c3.69333375 1.63999969 7.8 2.46666656 12.33333281 2.46666656 4.93333313 0 9.04000031-0.82666687 12.33333375-2.46666656l184.45333312-107.04c4.32-1.63999969 8.64-2.46666656 12.96-2.46666656" fill="#5BCA87" p-id="34141"></path><path d="M763.02666687 421.28a34.39999969 34.39999969 0 0 0-9.52000032 23.28l3 200.17333312a28.74666656 28.74666656 0 0 1-9.86666625 22.04000063l-4.54666687 4.38666656-167.49333375 103.39999969a34.89333375 34.89333375 0 0 0-10.39999969 7.56c-5.86666687 5.83999969-8.93333344 13.39999969-9.19999969 22.65333375l2.79999938 186.6 384-230.04-6.61333313-441.36-161.47999968 93.43999969a40.89333375 40.89333375 0 0 0-10.68 7.86666656" fill="#EC5D3E" p-id="34142"></path><path d="M292.4400003 667.69333344a30.40000031 30.40000031 0 0 1-9.86666718-21.58666688V444.68c0-8.44000031-3.29333344-16.13333344-9.87999938-23.13333375a55.63999969 55.63999969 0 0 0-10.8-7.71999938l-162.85333406-90.66666656V765.46666625l387.42666656 222.40000031V801.25333344c-0.21333375-9.25333312-3.40000031-16.75999969-9.57333281-22.51999969a31.81333312 31.81333312 0 0 0-10.8-7.40000063l-168.72-99.31999968-4.93333313-4.32z" fill="#2464F5" p-id="34143"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743357432" class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="37305" width="200" height="200"><path d="M779.7248 289.8944h37.4784l106.8032-106.8032 5.2736-45.3632A480.1024 480.1024 0 0 0 148.224 371.968c11.8784-4.864 25.088-5.632 37.4784-2.2528l213.6064-35.2256s10.9056-17.9712 16.4864-16.896a266.496 266.496 0 0 1 364.6976-27.6992h-0.768z" fill="#EA4335" p-id="37306"></path><path d="M1076.224 371.9168a481.28 481.28 0 0 0-145.1008-233.8304l-149.9136 149.9136a266.496 266.496 0 0 1 97.792 211.3536v26.624a133.4272 133.4272 0 1 1 0 266.8544h-266.752l-26.624 26.9824v160l26.624 26.624h266.752A347.0336 347.0336 0 0 0 1076.224 371.9168" fill="#4285F4" p-id="37307"></path><path d="M344.9856 1004.9536h266.8544v-213.6064H344.9856a132.608 132.608 0 0 1-55.0912-12.032l-37.4784 11.6224-107.5712 106.8032-9.3696 37.4784a345.1904 345.1904 0 0 0 209.5104 69.7344" fill="#34A853" p-id="37308"></path><path d="M344.9856 311.9616a347.0336 347.0336 0 0 0-209.5104 622.1312l154.7776-154.7776a133.4272 133.4272 0 1 1 176.5376-176.4864L621.568 448a346.6752 346.6752 0 0 0-276.5824-136.0384" fill="#FBBC05" p-id="37309"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743147068" class="icon" viewBox="0 0 1027 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="32927" width="200" height="200"><path d="M402.3125 208.25c16.875-5.62500027 33.75-8.4375 50.625-11.24999973 19.68749973 25.3125 25.3125 59.0625 33.75 89.99999946 5.62500027 33.75 11.24999973 67.5 11.24999973 101.25 5.62500027 22.50000027 2.81249973 47.81250027 2.81250054 70.31250054s-2.81249973 42.1875 0 64.68749946c0 30.93750027-2.81249973 59.0625-2.81250054 90.00000027-5.62500027 19.68749973 0 39.37500027-5.62499946 59.0625-8.4375-2.81249973-11.24999973-11.24999973-14.06250027-16.875-33.75-50.625-64.68750027-101.25-92.8125-154.68749973-28.12499973-56.25000027-56.25000027-112.49999973-59.0625-177.1875-5.62500027-50.625 28.12499973-98.43750027 75.9375-115.31250027z m174.37500027-8.4375c5.62500027-2.81249973 8.4375 0 14.06249946 0 22.50000027 5.62500027 47.81250027 8.4375 67.5 22.50000027s36.56249973 33.75 42.1875 56.24999946c8.4375 28.12499973 5.62500027 59.0625 0 87.18750054-8.4375 36.56249973-25.3125 70.31249973-42.1875 104.06249973-5.62500027 11.24999973-11.24999973 19.68749973-16.875 30.93750027-8.4375 19.68749973-22.50000027 39.37500027-33.75 59.0625-19.68749973 33.75-39.37500027 61.87499973-59.0625 95.62499973-2.81249973 2.81249973-5.62500027 11.24999973-11.24999973 5.62500027-2.81249973-33.75-5.62500027-67.5-8.4375-104.06250054-5.62500027-44.99999973-2.81249973-87.18749973-2.81249973-132.18749946 2.81249973-28.12499973 2.81249973-59.0625 5.62499946-87.18750054 5.62500027-33.75 11.24999973-70.31249973 22.50000027-104.06249973 11.24999973-8.4375 11.24999973-25.3125 22.50000027-33.75zM222.31250027 309.5c2.81249973 0 5.62500027 5.62500027 8.4375 8.4375 81.56250027 106.87500027 154.68749973 219.375 213.74999973 340.31249973 5.62500027 8.4375 11.24999973 19.68749973 11.24999973 30.93750027-11.24999973-2.81249973-19.68749973-8.4375-28.12499973-14.06250027-53.43749973-28.12499973-106.87500027-59.0625-160.3125-89.99999946-19.68749973-14.06250027-39.37500027-28.12499973-56.25000027-42.1875-33.75-22.50000027-56.25000027-64.68750027-53.43749973-106.87500027 2.81249973-50.625 30.93750027-92.8125 64.68750027-126.5625z m582.1875 0h5.62499946c14.06250027 19.68749973 33.75 39.37500027 45.00000054 61.87499973 11.24999973 19.68749973 16.875 44.99999973 19.68749973 67.5 0 25.3125-8.4375 53.43749973-28.12499973 73.12500027-11.24999973 11.24999973-19.68749973 22.50000027-33.75 30.93750027-64.68750027 50.625-135 90.00000027-208.12500027 126.5625-11.24999973 5.62500027-19.68749973 14.06250027-33.75 14.06249946 2.81249973-14.06250027 11.24999973-28.12499973 16.875-39.37499946 47.81250027-98.43750027 106.87500027-191.25000027 171.56249973-281.25000054 14.06250027-14.06250027 30.93750027-33.75 45.00000054-53.43749973z m-705.93750027 225.00000027c2.81249973-2.81249973 0-8.4375 5.62500027-11.25000054 8.4375 2.81249973 16.875 8.4375 22.49999946 11.25000054 101.25 56.25000027 202.5 112.49999973 300.93750027 174.37499946 2.81249973 2.81249973 5.62500027 5.62500027 5.62500027 8.4375H239.18750027c-39.37500027 0-75.9375-16.875-104.06250054-44.99999973-22.50000027-25.3125-42.1875-59.0625-44.99999973-92.8125 5.62500027-14.06250027 2.81249973-28.12499973 8.4375-44.99999973z m810-2.81250054c5.62500027-2.81249973 14.06250027-8.4375 19.68749973-5.62499946 0 14.06250027 5.62500027 30.93750027 5.62500027 44.99999973-2.81249973 19.68749973-2.81249973 36.56249973-11.24999973 53.43749973-5.62500027 14.06250027-14.06250027 30.93750027-25.3125 42.1875-14.06250027 11.24999973-22.50000027 25.3125-39.37500027 33.75-16.875 14.06250027-42.1875 16.875-61.87499973 19.68750054h-202.5c2.81249973-2.81249973 2.81249973-5.62500027 5.62499946-8.4375 101.25-64.68750027 205.31249973-123.75000027 309.37500027-180.00000054zM242 748.25c36.56249973-2.81249973 73.12500027 0 109.6875-5.62500027 25.3125 0 53.43749973-2.81249973 78.74999973 0-5.62500027 11.24999973-19.68749973 16.875-28.12499973 22.50000027-28.12499973 19.68749973-56.25000027 36.56249973-87.18749973 50.625s-67.5 8.4375-92.8125-11.24999973c-19.68749973-14.06250027-36.56249973-36.56249973-47.81250027-56.25000027h67.5z m357.18749973-5.62500027c25.3125-2.81249973 50.625 0 78.75000054 0 33.75 2.81249973 70.31249973 0 106.87499946 5.62500027 25.3125 2.81249973 50.625 0 73.12500027 2.81249973-8.4375 16.875-22.50000027 33.75-36.56249973 47.81250027-22.50000027 22.50000027-56.25000027 33.75-87.18750054 28.12499973-28.12499973-8.4375-50.625-25.3125-75.9375-39.37499946-14.06250027-8.4375-25.3125-16.875-39.37499946-25.3125-8.4375-8.4375-14.06250027-11.24999973-19.68750054-19.68750054z" fill="#C71F1E" p-id="32928"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743099498" class="icon" viewBox="0 0 2030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="30911" width="200" height="200"><path d="M1669.09384945 432.48813594c15.51186469 21.69491531 27.11864437 51.1457625 25.81694906 112.86779625-17.46440719 193.78983094-181.96610156 316.14915281-345.76271156 316.14915281-177.24745781 0-302.04745781-127.56610125-377.111865-270.10169531C954.30062883 557.72203344 941.44639195 520.13559312 929.35147664 487.59322063c-23.701695 32.21694937-73.6542375 84.77288156-99.09152531 109.23389812A629.15254219 629.15254219 0 0 0 890.24639133 720.81355906c20.01355969 31.18644094 70.508475 101.74915219 142.69830562 157.61355938 65.62711875 50.60338969 128.59661062 81.68135625 199.81016906 99.41694937a487.81016906 487.81016906 0 0 0 354.65762719-50.00677968c128.81355937-73.81694906 219.60678-209.78983031 236.04067781-350.96949188-31.72881375-52.61016937-100.501695-114.76610156-154.35932156-144.37966031zM585.37859508 381.12542375a238.96949156 238.96949156 0 0 1 126.96949125 36.39322031c30.53559281-32.5423725 57.54576281-66.16949156 85.58644125-100.06779656A370.54915219 370.54915219 0 0 0 214.66673039 621.01694937a373.09830469 373.09830469 0 0 0 4.39322062 57.00339c10.3593225 12.79999969 114.71186438 4.12203375 130.98305063-10.52203406a242.49491531 242.49491531 0 0 1-4.55593219-46.48135594 239.89152563 239.89152563 0 0 1 239.89152563-239.89152562zM585.37859508 992a370.6576275 370.6576275 0 0 1-320.97627094-185.38305094c4.98983062-6.61694906 121.60000031-19.57966125 149.42372812-18.00678a239.07796594 239.07796594 0 0 0 171.55254282 72.29830594s147.52542375 11.33559281 285.39661031-97.62711937c0 0 51.85084781 73.87118625 91.66101656 101.64067781 0 0-130.00677938 127.07796656-377.05762687 127.07796656z" fill="#E1251B" p-id="30912"></path><path d="M1545.05317101 74.305085C1369.9209682 0.70508469 1199.0735107 22.18305125 1030.23283195 146.27796594 881.35147664 255.67457656 822.1243582 365.88474594 726.88367976 460.47457625c-113.89830469 113.13898313-199.32203344 151.21355906-267.06440718 176.81355938-69.96610125 26.46779625-167.59322062 44.52881344-240.75932157 40.51525406a371.41694906 371.41694906 0 0 0 45.34237313 128.59661062c186.79322063-3.19999969 318.48135562-74.68474594 403.41694875-126.48135656 74.2508475-45.28813594 185.97966094-159.34915219 244.61016937-233.22033844 94.21016906-118.56271219 216.94915219-231.97288125 329.16610219-267.55254281 156.7457625-49.62711844 309.1525425 19.79661 383.02372875 117.85762688 6.61694906 8.62372875 145.13898281 58.3593225 188.691525 95.78305125C1797.31079883 324.88135625 1721.8124932 148.61016969 1545.05317101 74.305085z" fill="#E1251B" p-id="30913" class="custom-cursor-on-hover"></path><path d="M1809.24300164 377.81694875A497.35593188 497.35593188 0 0 0 1526.39554383 286.91525469c-122.63050875 0-245.42372906 47.78305125-331.82372813 132.88135594-62.86101656 61.83050812-93.4508475 112.00000031-163.14576281 195.57966093a570.35932219 570.35932219 0 0 0 92.63728781 108.47457563c9.00339-13.12542375 59.66101688-84.82711875 97.62711844-135.21355875 48.81355969-64.10847469 98.38644094-115.36271156 173.5593225-145.03050844a350.04745781 350.04745781 0 0 1 427.498305 139.3355925A486.02033906 486.02033906 0 0 0 1809.24300164 377.81694875z" fill="#E1251B" p-id="30914" class="custom-cursor-on-hover"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743116713" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="31939" width="200" height="200"><path d="M718.5408 453.8368c-4.1984 0-8.3968-0.7168-12.5952-0.7168a103.8336 103.8336 0 0 0-67.8912 25.088 139.6736 139.6736 0 0 0 13.6192-60.3136 133.12 133.12 0 0 0-2.4576-25.7024 139.5712 139.5712 0 0 0-274.432 0 133.12 133.12 0 0 0-2.4576 25.7024 139.6736 139.6736 0 0 0 13.6192 60.3136 103.8336 103.8336 0 0 0-67.8912-25.088c-4.1984 0-8.3968 0-12.5952 0.7168a104.5504 104.5504 0 1 0 101.0688 159.4368 116.736 116.736 0 0 0 6.144-11.0592 105.1648 105.1648 0 0 0 4.9152-76.6976 62.6688 62.6688 0 0 1 27.3408 20.48l2.6624 3.8912a83.2512 83.2512 0 0 1 133.9392-3.3792l4.7104 6.8608 51.2 73.9328a84.0704 84.0704 0 0 0 62.464 34.6112h5.5296a104.5504 104.5504 0 0 0 12.5952-208.384z" fill="#E6002D" p-id="31940"></path><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m200.8064 732.3648h-6.8608a152.4736 152.4736 0 0 1-120.5248-58.9824S509.2352 564.6336 508.0064 563.2a42.1888 42.1888 0 0 0-32.4608-15.2576 40.96 40.96 0 0 0-24.064 7.5776l122.88 175.4112a62.5664 62.5664 0 0 0 77.0048 20.48A97.5872 97.5872 0 0 1 593.92 783.5648a97.0752 97.0752 0 0 1-95.5392-39.1168l-49.4592-70.656a174.8992 174.8992 0 1 1-143.36-290.5088 209.7152 209.7152 0 0 1 413.9008 0 174.7968 174.7968 0 0 1-6.144 349.0816z" fill="#E6002D" p-id="31941"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717746661932" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="60936" width="200" height="200"><path d="M29.696 541.696A30.72 30.72 0 0 0 59.52 512 452.16 452.16 0 0 1 512 59.456a439.68 439.68 0 0 1 225.664 61.44l16.704 10.432 7.04 4.608-3.84 7.488c-1.216 2.496-1.536 6.592-1.536 16.64 0 44.352 37.504 81.856 81.856 81.856s81.856-37.504 81.856-81.856a83.008 83.008 0 0 0-108.544-77.824l-8.96 3.136-4.48 1.792-4.096-2.624A520.768 520.768 0 0 0 512 0C230.4 0 0 230.4 0 512c0 15.68 14.08 29.696 29.696 29.696z m588.16-186.24c-13.056-93.568-37.12-164.224-62.336-203.584a383.808 383.808 0 0 0-43.776-2.752c-14.784 0-29.568 1.088-43.776 2.752-25.216 39.36-49.28 109.44-62.4 203.584z m221.696 0a365.504 365.504 0 0 0-203.52-184.96c21.312 51.392 36.608 115.456 45.888 184.96z m-497.472 0c9.28-69.504 24.576-133.568 45.952-184.96a365.504 365.504 0 0 0-203.584 184.96z m520.512 250.688a358.4 358.4 0 0 0 0-188.288H688c2.688 31.232 3.84 62.4 3.84 94.144 0 31.744-1.664 62.912-3.84 94.144z m-237.568 0c2.176-29.568 3.84-61.312 3.84-94.144 0-33.408-1.664-64.64-3.84-94.144H398.976c-2.752 29.568-3.84 61.312-3.84 94.144 0 33.408 1.664 64.64 3.84 94.144z m-289.024 0A1073.92 1073.92 0 0 1 332.16 512c0-31.744 1.152-62.912 3.84-94.144H161.408a358.4 358.4 0 0 0 0 188.288zM512 1024c281.6 0 512-230.4 512-512a30.72 30.72 0 0 0-29.696-29.696 30.72 30.72 0 0 0-29.76 29.696A452.16 452.16 0 0 1 512 964.544a439.68 439.68 0 0 1-225.664-61.44l-16.704-10.432-7.04-4.608 3.84-7.488c1.216-2.496 1.536-6.592 1.536-16.64 0-44.352-37.504-81.856-81.856-81.856s-81.856 37.504-81.856 81.856a83.008 83.008 0 0 0 108.544 77.824l8.96-3.136 4.48-1.792 4.096 2.624A520.768 520.768 0 0 0 512 1024z m-0.256-149.12c14.72 0 29.568-1.088 43.776-2.752 25.152-39.36 49.28-109.44 62.4-203.584H405.568c13.12 93.568 37.184 164.224 62.4 203.584 14.208 1.664 28.992 2.752 43.776 2.752z m124.224-21.312a365.504 365.504 0 0 0 203.584-185.024h-157.632c-9.28 69.504-24.576 133.568-45.952 184.96z m-247.936 0c-21.376-51.456-36.672-115.52-45.952-185.024H184.448a365.504 365.504 0 0 0 203.52 184.96z" fill="#448CF7" p-id="60937"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717747391666" class="icon" viewBox="0 0 1333 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4694" width="200" height="200"><path d="M1018.488284 0.541672L1314.82427 0a18.458499 18.458499 0 0 1 13.083451 31.500282L894.070504 465.337499a18.458499 18.458499 0 0 1-26.104401 0L720.079363 317.450758a18.458499 18.458499 0 0 1 0-26.093983L1005.477751 5.937553a18.458499 18.458499 0 0 1 13.02095-5.406298zM1018.488284 1023.446662l296.335986 0.552088a18.458499 18.458499 0 0 0 13.083451-31.500282L894.070504 558.650834a18.458499 18.458499 0 0 0-26.104401 0L720.079363 706.547992a18.458499 18.458499 0 0 0 0 26.1044l285.398388 285.398388a18.458499 18.458499 0 0 0 13.02095 5.406298z" fill="#054496" p-id="4695"></path><path d="M821.319852 500.275312L327.34668 5.416715A18.437665 18.437665 0 0 0 314.29448 0H18.510582A18.479332 18.479332 0 0 0 5.437549 31.531532l466.566676 467.400018a18.500166 18.500166 0 0 1 0 26.146067L5.458382 992.425551a18.489749 18.489749 0 0 0 13.083451 31.562782h295.74223a18.437665 18.437665 0 0 0 13.052201-5.416715l493.973172-494.858596a16.593899 16.593899 0 0 0 0-23.448127z" fill="#87BB4C" p-id="4696"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717746166860" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="51952" width="200" height="200"><path d="M928.856 10.912H95.142C42.814 10.912 0 53.726 0 106.054v224.202h231.25v-36.64c0-28.418 23.046-51.454 51.464-51.454h458.58c28.42 0 51.456 23.036 51.456 51.456v36.64H1024V106.052c0-52.328-42.816-95.142-95.144-95.142zM792.75 730.38c0 28.42-23.036 51.466-51.456 51.466h-458.58c-28.418 0-51.464-23.046-51.464-51.466v-36.63H0v224.194c0 52.336 42.816 95.142 95.144 95.142h833.714c52.328 0 95.142-42.806 95.142-95.142V693.752H792.75v36.63zM0.006 627.628h231.25V396.38H0.006v231.25z m792.74 0h231.25V396.38H792.748v231.25z" fill="#E72F52" p-id="51953"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 713 B |
@@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1752631175762" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4421" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M93.866667 234.666667c-34.133333 12.8-51.2 25.6-51.2 34.133333 0 4.266667 51.2 64 115.2 136.533333 64 68.266667 115.2 128 115.2 128s-51.2 59.733333-115.2 128C93.866667 729.6 42.666667 793.6 42.666667 797.866667c4.266667 17.066667 59.733333 42.666667 98.133333 42.666666 64 0 81.066667-12.8 217.6-162.133333 68.266667-76.8 128-140.8 128-140.8 0-4.266667-55.466667-64-123.733333-140.8-85.333333-102.4-132.266667-145.066667-153.6-157.866667-29.866667-12.8-81.066667-17.066667-115.2-4.266666z m725.333333 4.266666c-21.333333 8.533333-68.266667 59.733333-153.6 153.6-68.266667 76.8-123.733333 140.8-123.733333 140.8 0 4.266667 55.466667 68.266667 128 140.8 136.533333 153.6 153.6 162.133333 217.6 162.133334 42.666667 0 98.133333-21.333333 98.133333-42.666667 0-4.266667-51.2-68.266667-115.2-136.533333-64-68.266667-115.2-128-115.2-128s51.2-59.733333 115.2-128c64-68.266667 115.2-128 115.2-136.533334-4.266667-17.066667-55.466667-38.4-98.133333-38.4-34.133333 0-46.933333 4.266667-68.266667 12.8z" fill="#E57000" p-id="4422"></path><path d="M238.933333 136.533333c-42.666667 21.333333-42.666667 25.6-4.266666 68.266667 221.866667 243.2 273.066667 302.933333 277.333333 302.933333 4.266667 0 311.466667-332.8 315.733333-341.333333 0-4.266667-8.533333-12.8-21.333333-21.333333-17.066667-12.8-34.133333-17.066667-68.266667-17.066667-64-4.266667-85.333333 8.533333-162.133333 93.866667-34.133333 38.4-64 72.533333-64 72.533333s-29.866667-29.866667-64-68.266667c-34.133333-38.4-72.533333-76.8-89.6-85.333333-25.6-17.066667-89.6-21.333333-119.466667-4.266667zM354.133333 725.333333c-85.333333 93.866667-153.6 170.666667-153.6 174.933334 0 4.266667 8.533333 12.8 21.333334 21.333333 17.066667 12.8 34.133333 17.066667 68.266666 17.066667 59.733333 4.266667 85.333333-8.533333 162.133334-98.133334 34.133333-38.4 64-68.266667 64-68.266666s29.866667 29.866667 64 68.266666c81.066667 89.6 98.133333 102.4 162.133333 98.133334 34.133333 0 51.2-4.266667 68.266667-17.066667 12.8-8.533333 21.333333-17.066667 21.333333-21.333333-4.266667-8.533333-311.466667-345.6-315.733333-341.333334-8.533333 0-76.8 76.8-162.133334 166.4z" p-id="4423"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743207396" class="icon" viewBox="0 0 1402 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="35171" width="200" height="200"><path d="M1216.84017881 832.26669714c-22.01770438 22.42169837-66.05311315 55.95324845-143.01407896 55.95324845H600.84945441c143.01407897-139.88312044 264.01045355-257.44554135 275.01930505-268.65639054a860.50843905 860.50843905 0 0 1 65.9521143-61.60917245c55.04426026-50.29732444 98.9786702-55.8522496 137.45915242-55.85224962 55.04426026 0 98.9786702 22.32069952 137.56015263 55.95324846 76.96096581 72.71902281 76.96096581 201.4922929 0 274.2113157z m93.42374503-363.79711171a304.81390494 304.81390494 0 0 0-225.42897111-100.79664655c-77.06196465 0-143.01407897 27.97662354-203.51226695 72.71902278-22.01770438 22.52269721-54.94326142 44.84339811-82.51589098 78.47594568-21.91670555 22.32069952-494.89335097 492.5703818-494.89335097 492.57038317 27.47163072 5.55492517 60.59918544 5.55492517 87.96981869 5.55492517h599.42694635c44.03540877 0 76.96096581 0 110.08852053-5.55492517a335.11349765 335.11349765 0 0 0 203.41126672-89.58579738c126.45030092-123.21834493 126.45030092-330.265563 5.45392772-453.3829077z" fill="#00A3FF" p-id="35172"></path><path d="M528.73642327 435.44302817c-60.80118311-45.14639325-121.70336508-67.66909045-193.51339969-67.66909045a306.02588827 306.02588827 0 0 0-226.74195328 101.60463453 333.80051551 333.80051551 0 0 0 5.55492517 462.97777956c55.24625795 50.80231726 110.59351474 78.98093847 176.94962165 84.63686387l127.1572928-124.22833194h-71.91103484c-71.91103347-5.65592402-116.14843991-28.27962006-143.72106809-56.45824128a206.03723244 206.03723244 0 0 1-5.55492656-282.29120635c38.68247989-39.49046924 82.91988635-56.45824127 138.26714315-56.45824267 33.12755473 0 82.91988635 5.65592402 132.71221657 56.55924012 22.11870323 22.52269721 82.91988635 67.66909045 105.03858956 90.29278788h5.55492518l82.91988496-84.73786132v-5.65592401c-38.68247989-39.49046924-99.58466186-90.29278651-132.71221658-118.57240794" fill="#00C8DC" p-id="35173"></path><path d="M1114.32655611 290.00498256A436.81913102 436.81913102 0 0 0 705.58504746 7.00678432c-218.3590661 0-391.87473546 160.8908378-425.507283 360.66615456 16.76577435 0 33.63254755-5.45392634 55.95324845-5.45392634 22.42169837 0 50.49932212 5.45392634 72.82002164 5.45392634 27.97662354-138.67113711 151.19496845-238.55879549 296.73401291-238.55879412a310.06583359 310.06583359 0 0 1 279.96823856 177.55561331s5.55492517 5.55492517 5.55492517 0c39.18747409-5.55492517 84.03087084-16.66477551 123.21834492-16.66477551 0 5.55492517 0 5.55492517 0 0" fill="#006EFF" p-id="35174"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743207396" class="icon" viewBox="0 0 1402 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="35171" width="200" height="200"><path d="M1216.84017881 832.26669714c-22.01770438 22.42169837-66.05311315 55.95324845-143.01407896 55.95324845H600.84945441c143.01407897-139.88312044 264.01045355-257.44554135 275.01930505-268.65639054a860.50843905 860.50843905 0 0 1 65.9521143-61.60917245c55.04426026-50.29732444 98.9786702-55.8522496 137.45915242-55.85224962 55.04426026 0 98.9786702 22.32069952 137.56015263 55.95324846 76.96096581 72.71902281 76.96096581 201.4922929 0 274.2113157z m93.42374503-363.79711171a304.81390494 304.81390494 0 0 0-225.42897111-100.79664655c-77.06196465 0-143.01407897 27.97662354-203.51226695 72.71902278-22.01770438 22.52269721-54.94326142 44.84339811-82.51589098 78.47594568-21.91670555 22.32069952-494.89335097 492.5703818-494.89335097 492.57038317 27.47163072 5.55492517 60.59918544 5.55492517 87.96981869 5.55492517h599.42694635c44.03540877 0 76.96096581 0 110.08852053-5.55492517a335.11349765 335.11349765 0 0 0 203.41126672-89.58579738c126.45030092-123.21834493 126.45030092-330.265563 5.45392772-453.3829077z" fill="#00A3FF" p-id="35172"></path><path d="M528.73642327 435.44302817c-60.80118311-45.14639325-121.70336508-67.66909045-193.51339969-67.66909045a306.02588827 306.02588827 0 0 0-226.74195328 101.60463453 333.80051551 333.80051551 0 0 0 5.55492517 462.97777956c55.24625795 50.80231726 110.59351474 78.98093847 176.94962165 84.63686387l127.1572928-124.22833194h-71.91103484c-71.91103347-5.65592402-116.14843991-28.27962006-143.72106809-56.45824128a206.03723244 206.03723244 0 0 1-5.55492656-282.29120635c38.68247989-39.49046924 82.91988635-56.45824127 138.26714315-56.45824267 33.12755473 0 82.91988635 5.65592402 132.71221657 56.55924012 22.11870323 22.52269721 82.91988635 67.66909045 105.03858956 90.29278788h5.55492518l82.91988496-84.73786132v-5.65592401c-38.68247989-39.49046924-99.58466186-90.29278651-132.71221658-118.57240794" fill="#00C8DC" p-id="35173"></path><path d="M1114.32655611 290.00498256A436.81913102 436.81913102 0 0 0 705.58504746 7.00678432c-218.3590661 0-391.87473546 160.8908378-425.507283 360.66615456 16.76577435 0 33.63254755-5.45392634 55.95324845-5.45392634 22.42169837 0 50.49932212 5.45392634 72.82002164 5.45392634 27.97662354-138.67113711 151.19496845-238.55879549 296.73401291-238.55879412a310.06583359 310.06583359 0 0 1 279.96823856 177.55561331s5.55492517 5.55492517 5.55492517 0c39.18747409-5.55492517 84.03087084-16.66477551 123.21834492-16.66477551 0 5.55492517 0 5.55492517 0 0" fill="#006EFF" p-id="35174"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717745876738" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="50950" width="200" height="200"><path d="M494.272 0L347.968 89.088l146.304 86.4V0z m43.904 175.552l146.304-87.488L538.176 0v175.552z m0 731.392l146.304-87.872-146.304-87.68v175.552z m-43.904 0V731.52l-146.304 88.128 146.304 87.36m409.6-205.696L757.568 614.4v175.552l146.304-88.704M289.472 614.4l-146.304 87.68 146.304 87.872V614.4z m468.096-73.152l146.304-88.128-146.304-87.424v175.552z m-468.096 0V365.696L143.168 453.632l146.304 87.68m614.4-336.768L757.568 117.12V292.48l146.304-88m-614.4-87.488l-146.304 88.32 146.304 87.168V117.12z m629.056 307.2V248.704l-146.304 88.256 146.304 87.296m-789.952 0l146.304-88.064-146.304-87.488v175.552z m146.304 146.432L128.576 482.752v175.552l146.304-87.616m497.344 0.192l146.304 87.424V482.752L772.224 570.88m-438.848 43.52v175.552l146.304-88L333.376 614.4m380.352 175.552V614.4l-146.304 87.68 146.304 87.872M333.376 307.2l146.304-88.128-146.304-87.424V307.2z m380.352 541.248l-146.304 88.768L713.728 1024v-175.552z m0-555.904V131.648L567.424 212.672l146.304 79.872" fill="#57B382" p-id="50951"></path><path d="M494.272 0v175.552L347.968 89.088 494.272 0m43.904 175.552V0l146.304 88.064-146.304 87.488m0 731.392V731.52l146.304 87.68-146.304 87.808m-43.904 0l-146.304-87.36 146.304-88.128v175.488z m409.6-205.696l-146.304 88.704V614.4l146.304 86.848M289.472 614.4v175.552L143.168 702.08 289.472 614.4m468.096-73.152V365.696l146.304 87.424-146.304 88.128m-468.096 0L143.168 453.632l146.304-87.936v175.552z m614.4-336.64L757.568 292.48V117.12l146.304 87.488m-614.4-87.488V292.48L143.168 205.44l146.304-88.384m629.056 307.2l-146.304-87.296 146.304-88.32V424.32z m-789.952 0V248.704l146.304 87.488-146.304 88.064m146.304 146.432l-146.304 87.616V482.752l146.304 87.936m497.344 0.192l146.304-88.128v175.552L772.224 570.88m-438.848 43.52l146.304 87.552-146.304 88V614.4z m380.352 175.552l-146.304-87.936L713.728 614.4v175.552zM333.376 307.2V131.648l146.304 87.424L333.376 307.2m380.352 541.248V1024l-146.304-86.784 146.304-88.768m0-555.904L567.424 212.672l146.304-81.024v160.896z" fill="#57B382" p-id="50952" class="custom-cursor-on-hover"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717746510567" class="icon" viewBox="0 0 1351 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="55261" width="200" height="200"><path d="M416.92885 824.173591c-56.901379 30.927289-130.232881 35.397249-203.685192-3.745101a159.190971 159.190971 0 0 1-65.35806-64.754011c-79.130368-147.025432 15.826074-294.775723 150.770533-309.635319 7.369393-0.845668 14.738786-1.328907 22.228989-1.328907 59.317574 0 112.353042 25.732471 149.320817 66.324538a249.50832 249.50832 0 0 1-26.457329-111.628184c0-16.188503 1.691336-31.893767 4.590769-47.236601a320.508194 320.508194 0 0 0-127.575067-26.45733c-6.161296 0-12.201782 0.604049-18.242268 0.966478C83.252396 339.122556-77.424535 571.198033 39.036038 806.897801c25.370042 51.344132 66.686967 93.748345 117.668669 119.601625 115.614904 58.713525 230.50495 50.377654 319.420907 0.966478 31.531338-17.51741 38.659111-59.921622 15.946883-88.070288-0.241619-0.362429-0.483239-0.604049-0.724858-0.966477-18.000649-22.349799-49.290367-27.907046-74.418789-14.255548z" fill="#62B0DB" p-id="55262"></path><path d="M443.869418 399.527417c0-16.188503 1.691336-31.893767 4.590769-47.236602 23.557896-123.709156 137.602274-215.403735 270.855398-203.081143 24.041135 2.174575 46.994982 8.094251 68.740732 16.792551 50.377654-17.879839 104.3796-28.148665 160.91855-28.148665 16.550932 0 32.981054 0.845668 49.169557 2.537004C928.558024 59.448048 827.561096 5.929341 715.328864 0.492904c-204.65167-10.027207-377.167953 134.098792-412.565202 326.18625-4.34915 23.678706-6.886154 47.96146-6.886154 72.848263 0 15.826074 1.208097 31.289718 2.899433 46.511743 7.369393-0.845668 14.738786-1.328907 22.228989-1.328907 59.317574 0 112.473852 25.732471 149.320817 66.324538-16.792551-33.464293-26.457329-71.277736-26.457329-111.507374z" fill="#8FC361" p-id="55263"></path><path d="M1114.725806 778.386706S880.717374 806.172943 749.034777 723.176663c-66.928586-42.162593-43.73312-127.937496 50.015225-152.461869 63.666724-16.671742 302.024306-14.376357 457.989657 13.04745 156.086161 27.423807 124.675634 166.717417-142.313853 194.624462zM1316.961282 782.615047s-67.170206 87.22462-241.981874 113.561139c-72.727453 10.993685-135.06527 13.289069-224.102035 0 0 0-70.311258-18.967126-82.392231 35.638868-14.376357 65.23725 157.656688 128.420735 327.998396 62.458627 172.274664-66.566157 220.477743-211.658634 220.477744-211.658634z" fill="#ADD079" p-id="55264"></path><path d="M1341.244036 531.089205s-44.457978-76.955793-241.136206-131.924217c-195.228511-54.605995-295.86301 15.463644-346.240665-30.202431-24.886803-22.470608-5.194818-77.318222 23.557896-101.480167 46.994982-39.504779 176.744624-83.600328 323.407627-20.416843 214.558067 92.540247 240.411348 284.023657 240.411348 284.023658z" fill="#A2CB70" p-id="55265"></path><path d="M783.948786 456.791225s234.008432-27.786236 365.69103 55.210044c66.928586 42.162593 43.73312 127.937496-50.015225 152.461869-63.666724 16.671742-302.024306 14.376357-457.989658-13.04745-156.086161-27.302997-124.675634-166.717417 142.313853-194.624463z m11.839353 535.42869c146.663003 63.183485 276.412645 19.208746 323.407627-20.416843 28.631904-24.161944 48.444699-78.888749 23.557896-101.480167-50.377654-45.666075-151.012153 24.403564-346.240665-30.20243-196.678228-54.968424-241.136206-131.924217-241.136206-131.924217s25.97409 191.60422 240.411348 284.023657zM579.780355 456.791225s67.170206-87.22462 241.981874-113.561139c72.727453-10.993685 135.06527-13.289069 224.102036 0 0 0 70.311258 18.967126 82.39223-35.638868 14.376357-65.23725-157.656688-128.420735-327.998396-62.458626-172.274664 66.566157-220.477743 211.658634-220.477744 211.658633z" fill="#4885BE" p-id="55266"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1748326203303" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2853" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M10.24 605.184l839.168-481.28L1013.76 220.672v191.488L174.592 895.488 10.24 804.352z" fill="#0096FF" p-id="2854"></path><path d="M10.24 416.768V220.672l168.96-96.768 308.736 178.688-331.776 193.536zM541.184 717.312l331.264-195.072 141.312 88.064v194.048l-165.376 95.744z" fill="#25C764" p-id="2855"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 645 B |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717747284124" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2464" width="200" height="200"><path d="M838.4 416c-6.4-70.4-64-115.2-134.4-115.2-19.2 0-38.4 6.4-51.2 6.4-44.8-51.2-115.2-83.2-185.6-83.2-89.6 0-172.8 51.2-211.2 128h-12.8C115.2 352 19.2 448 12.8 576s96 224 224 230.4h294.4c25.6 0 44.8-19.2 44.8-44.8s-19.2-44.8-44.8-44.8H249.6c-70.4 0-134.4-57.6-134.4-128s51.2-128 121.6-134.4c12.8 0 25.6 0 38.4 6.4h6.4l25.6 6.4C320 390.4 390.4 320 473.6 320c57.6 0 108.8 32 140.8 83.2 6.4 6.4 6.4 12.8 6.4 19.2l6.4-6.4c19.2-19.2 51.2-19.2 70.4-19.2 44.8 0 70.4 38.4 70.4 76.8 0 12.8-6.4 25.6-6.4 38.4 12.8 6.4 19.2 19.2 38.4 19.2 6.4-6.4 19.2-12.8 19.2-19.2 64 6.4 115.2 57.6 108.8 128-6.4 57.6-57.6 108.8-121.6 108.8-51.2 0-96-32-115.2-83.2h51.2c6.4 0 12.8-6.4 12.8-12.8s0-6.4-6.4-6.4l-96-128c-6.4-6.4-12.8-12.8-19.2-6.4h-6.4l-96 128c-6.4 6.4-6.4 19.2 6.4 19.2 6.4 0 6.4 6.4 6.4 6.4h57.6c19.2 115.2 128 192 243.2 172.8 115.2-19.2 192-128 172.8-243.2-25.6-96-89.6-160-179.2-179.2z" fill="#F3A22F" p-id="2465"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743387740" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="38378" width="200" height="200"><path d="M912.192 0C973.952 0 1024 50.048 1024 111.808v800.384c0 61.76-50.048 111.808-111.808 111.808H111.808A111.808 111.808 0 0 1 0 912.192V111.808C0 50.048 50.048 0 111.808 0h800.384zM672 185.152c-23.936-1.088-30.912 6.144-30.656 30.4 1.28 116.864 0.832 233.728 0.384 350.592-0.128 37.76 2.368 75.52-3.392 113.216-6.912 45.184-33.92 71.68-76.16 82.88-52.672 13.952-107.136-1.728-131.2-36.736-17.6-25.728-19.84-55.552-19.904-85.632-0.192-120.32-0.448-240.64 0.192-360.96 0.128-18.432-4.032-26.24-24.448-26.24-20.416 0.128-27.136 8-24.128 26.432 4.608 28.16-8.256 37.12-34.24 33.152-23.168-3.456-35.2 5.248-30.912 29.952 5.312 30.4-6.912 42.304-37.248 37.248-20.416-3.392-30.72 2.304-30.144 26.88 1.6 79.04-0.512 158.08 1.024 237.184 2.24 113.088 79.104 204.8 189.632 230.912a462.08 462.08 0 0 0 187.136 5.632c133.12-23.04 214.08-117.824 214.4-252.416V435.2c0-74.496-0.896-148.992 0.448-223.424 0.448-21.76-6.4-27.264-27.2-26.56-41.152 1.536-82.432 1.92-123.52 0z m-422.784 133.76c-16.832-3.84-18.752 7.04-19.2 21.568-0.384 15.296 3.968 22.208 20.736 22.464 18.496 0.32 22.528-7.36 22.528-24.128 0-16.96-7.296-22.144-24.064-19.84z m73.6-65.92l-4.992 0.448c-17.792-2.816-20.928 7.04-20.8 22.272 0 15.104 6.592 19.456 20.864 19.648 15.68 0.256 22.72-4.224 22.656-21.248 0-17.024-6.72-23.04-22.72-20.672z m-134.464 3.904c-10.88 0.384-12.288 7.36-12.608 16-0.448 11.008 2.88 17.664 15.168 16 12.672 1.216 15.168-6.144 14.912-16.768-0.32-11.84-6.656-15.552-17.472-15.232z m68.032-3.648c-11.776 0.32-19.904 1.664-19.52 16.512 0.32 11.776 1.472 19.968 16.448 19.328 11.52-0.448 21.12-0.896 18.944-16.192 1.28-11.904-0.96-20.096-15.872-19.648z m126.592-68.032c-17.088-0.32-20.8 6.848-20.928 22.336-0.128 16.96 6.848 22.656 22.592 20.352 17.664 2.88 20.288-7.04 20.736-21.952 0.512-17.28-7.232-20.48-22.4-20.736z m-58.816 7.104l-4.736 0.32c-12.48-0.96-22.272-0.064-22.336 16.96 0 15.872 7.552 19.072 21.056 18.752 12.352-0.256 22.08-0.64 22.208-17.6 0.128-16.128-7.616-19.648-20.928-18.112z m-137.6 6.016c-9.088-0.128-10.816 5.632-10.432 13.056 0.384 9.088 6.464 10.304 13.632 9.792 7.872-0.64 11.776-4.928 11.008-12.992-0.832-8.832-7.232-9.792-14.208-9.856z m65.728-5.632h-3.584c-11.328 0.32-11.392 7.936-11.456 16.128 0 10.88 6.976 12.544 15.616 12.096 10.368 0.512 12.928-5.248 13.184-14.528 0.32-13.056-7.552-13.952-17.28-13.696z m66.816-55.68c-7.808 0.256-16.832-0.96-17.472 10.56-0.704 11.712 6.592 15.616 17.024 15.744 9.152 0.128 15.424-2.944 15.36-13.312 0.832-11.008-5.952-13.312-14.912-12.992z m-63.68 0.448c-7.936-0.128-12.352 3.072-12.288 11.456 0.128 7.424 2.752 12.8 11.008 13.376 8.32 0.512 11.712-4.288 12.032-12.032 0.64-7.808-2.176-12.608-10.752-12.8z" fill="#3860F4" p-id="38379" class="custom-cursor-on-hover"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717747341803" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3484" width="200" height="200"><path d="M813.6 65H451.9c-81.8 0-144.7 62.7-144.7 144.1v100.4h-97.5C127.9 309.5 65 372.3 65 453.7v360.5c0 81.4 62.8 144.2 144.7 144.2h358.6c81.8 0 144.7-62.7 144.7-144.2V710.7h100.6c81.8 0 144.7-62.7 144.7-144.2V206c3.2-75.3-62.9-141-144.7-141z m37.8 504.6c-0.4 20.6-17.1 37.3-37.7 37.5H609.2V814c-0.3 20.7-17 37.3-37.7 37.6H209.8c-20.7-0.2-37.4-16.9-37.8-37.6V453.6c0.3-20.7 17.1-37.4 37.8-37.6h204.4V209.1c0-21.9 18.9-37.5 37.8-37.5h361.7c20.6 0.3 37.3 16.9 37.7 37.5v360.5z m0 0" fill="#8FBE48" p-id="3485"></path><path d="M514.8 268.7v235H272.7V745h242.2V510H757V268.7H514.8z m0 0" fill="#F2B624" p-id="3486"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 773 B |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717743222537" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="36225" width="200" height="200"><path d="M830.537143 476.525714L706.413714 961.828571a8.484571 8.484571 0 0 0 0 4.022858 9.069714 9.069714 0 0 0 8.996572 6.948571h248.100571a9.069714 9.069714 0 0 0 9.069714-10.971429l-124.708571-485.302857a9.142857 9.142857 0 0 0-17.334857 0M147.602286 586.386286L51.492571 961.828571a8.996571 8.996571 0 0 0 9.069715 10.971429h191.488a9.142857 9.142857 0 0 0 7.241143-3.291429 8.777143 8.777143 0 0 0 1.755428-3.657142 8.484571 8.484571 0 0 0 0-4.022858L164.864 586.459429a8.777143 8.777143 0 0 0-3.291429-4.534858 9.216 9.216 0 0 0-10.752 0 8.777143 8.777143 0 0 0-3.218285 4.534858" fill="#00E5E5" p-id="36226"></path><path d="M317.074286 275.748571l-175.104 686.08a8.777143 8.777143 0 0 0 1.682285 7.460572c1.682286 2.194286 4.242286 3.437714 6.948572 3.437714h350.354286a9.069714 9.069714 0 0 0 9.069714-10.898286L334.409143 275.748571a8.777143 8.777143 0 0 0-3.291429-4.608 9.216 9.216 0 0 0-10.752 0 8.777143 8.777143 0 0 0-3.291428 4.608" fill="#006EFF" p-id="36227"></path><path d="M619.227429 57.490286A8.777143 8.777143 0 0 0 615.862857 52.955429a9.216 9.216 0 0 0-10.752 0 8.777143 8.777143 0 0 0-3.291428 4.534857L362.569143 961.828571a8.996571 8.996571 0 0 0 8.996571 10.898286h478.354286a9.216 9.216 0 0 0 9.142857-6.875428 8.996571 8.996571 0 0 0 0-4.022858L619.154286 57.490286z" fill="#006EFF" p-id="36228"></path><path d="M443.318857 375.442286L291.474286 961.828571a9.069714 9.069714 0 0 0 9.069714 10.971429l302.957714 0.073143a9.216 9.216 0 0 0 7.314286-3.364572 9.142857 9.142857 0 0 0 1.828571-7.68L460.653714 375.442286a9.216 9.216 0 0 0-8.704-6.290286 9.216 9.216 0 0 0-8.630857 6.290286" fill="#00E5E5" p-id="36229"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg t="1717746226986" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="52962" width="200" height="200"><path d="M527.36 102.4H450.048L350.0032 266.8544h68.9152L25.6 921.6h263.68l96.256-164.7616H317.1328l299.7248-489.984L527.36 102.4z m124.4672 211.7632l-233.1136 387.584h257.6896l32.512 55.0912H455.168L364.4928 921.6H998.4l-183.7056-327.168H681.472l27.3408-58.0608h69.12l-126.1568-222.208z" fill="#2558E6" p-id="52963"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 478 B |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 940 B |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
@@ -3,8 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import DataActions from '@/components/Common/DataActions/index.vue'
|
import DataActions from '@/components/DataActions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ActionsGroup',
|
name: 'ActionsGroup',
|
||||||
components: {
|
components: {
|
||||||
@@ -25,7 +24,9 @@ export default {
|
|||||||
},
|
},
|
||||||
moreActionsTitle: {
|
moreActionsTitle: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default() {
|
||||||
|
return this.$t('common.MoreActions')
|
||||||
|
}
|
||||||
},
|
},
|
||||||
moreActionsPlacement: {
|
moreActionsPlacement: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -44,9 +45,8 @@ export default {
|
|||||||
iMoreAction() {
|
iMoreAction() {
|
||||||
const defaultBtn = {
|
const defaultBtn = {
|
||||||
name: 'moreActions',
|
name: 'moreActions',
|
||||||
title: '',
|
title: this.$t('common.MoreActions'),
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
icon: 'el-icon-more',
|
|
||||||
plain: true
|
plain: true
|
||||||
}
|
}
|
||||||
const btn = {
|
const btn = {
|
||||||
@@ -62,3 +62,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -6,19 +6,11 @@ import AutomationParamsForm from '@/views/assets/Platform/AutomationParamsSettin
|
|||||||
|
|
||||||
export const accountFieldsMeta = (vm) => {
|
export const accountFieldsMeta = (vm) => {
|
||||||
const defaultPrivilegedAccounts = ['root', 'administrator']
|
const defaultPrivilegedAccounts = ['root', 'administrator']
|
||||||
|
|
||||||
function onPrivilegedUser(value, updateForm) {
|
|
||||||
const maybePrivileged = defaultPrivilegedAccounts.includes(value)
|
|
||||||
if (maybePrivileged) {
|
|
||||||
updateForm({ privileged: true, secret_reset: false, push_now: false })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
assets: {
|
assets: {
|
||||||
component: AssetSelect,
|
|
||||||
label: vm.$t('Asset'),
|
|
||||||
rules: [Required],
|
rules: [Required],
|
||||||
|
component: AssetSelect,
|
||||||
|
label: vm.$t('assets.Asset'),
|
||||||
el: {
|
el: {
|
||||||
multiple: false
|
multiple: false
|
||||||
},
|
},
|
||||||
@@ -30,9 +22,6 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
component: Select2,
|
component: Select2,
|
||||||
rules: [Required],
|
rules: [Required],
|
||||||
el: {
|
el: {
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
},
|
|
||||||
multiple: false,
|
multiple: false,
|
||||||
ajax: {
|
ajax: {
|
||||||
url: '/api/v1/accounts/account-templates/',
|
url: '/api/v1/accounts/account-templates/',
|
||||||
@@ -47,33 +36,26 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
},
|
},
|
||||||
on_invalid: {
|
on_invalid: {
|
||||||
rules: [Required],
|
rules: [Required],
|
||||||
label: vm.$t('AccountPolicy'),
|
label: vm.$t('accounts.AccountPolicy'),
|
||||||
helpTip: vm.$t('AccountPolicyHelpText'),
|
helpText: vm.$t('accounts.BulkCreateStrategy'),
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: () => {
|
hidden: () => {
|
||||||
return vm.platform || vm.asset
|
return vm.platform || vm.asset
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
name: {
|
name: {
|
||||||
label: vm.$t('Name'),
|
label: vm.$t('common.Name'),
|
||||||
rules: [RequiredChange],
|
rules: [RequiredChange],
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
on: {
|
on: {
|
||||||
input: ([value], updateForm) => {
|
input: ([value], updateForm) => {
|
||||||
if (!vm.usernameChanged) {
|
if (!vm.usernameChanged) {
|
||||||
if (!vm.account?.name) {
|
if (!vm.account?.name) {
|
||||||
updateForm({ username: value })
|
updateForm({ username: value })
|
||||||
}
|
}
|
||||||
|
const maybePrivileged = defaultPrivilegedAccounts.includes(value)
|
||||||
|
if (maybePrivileged) {
|
||||||
|
updateForm({ privileged: true })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
onPrivilegedUser(value, updateForm)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
hidden: () => {
|
hidden: () => {
|
||||||
@@ -82,16 +64,17 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
},
|
},
|
||||||
username: {
|
username: {
|
||||||
el: {
|
el: {
|
||||||
get disabled() {
|
disabled: !!vm.account?.name
|
||||||
return !!vm.account?.name || vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
on: {
|
on: {
|
||||||
input: ([value], updateForm) => {
|
input: ([value], updateForm) => {
|
||||||
vm.usernameChanged = true
|
vm.usernameChanged = true
|
||||||
},
|
},
|
||||||
change: ([value], updateForm) => {
|
change: ([value], updateForm) => {
|
||||||
onPrivilegedUser(value, updateForm)
|
const maybePrivileged = defaultPrivilegedAccounts.includes(value)
|
||||||
|
if (maybePrivileged) {
|
||||||
|
updateForm({ privileged: true })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
hidden: () => {
|
hidden: () => {
|
||||||
@@ -99,12 +82,7 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
privileged: {
|
privileged: {
|
||||||
label: vm.$t('Privileged'),
|
label: vm.$t('assets.Privileged'),
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: () => {
|
hidden: () => {
|
||||||
return vm.addTemplate
|
return vm.addTemplate
|
||||||
}
|
}
|
||||||
@@ -126,113 +104,69 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
su_from_username: {
|
su_from_username: {
|
||||||
label: vm.$t('UserSwitchFrom'),
|
label: vm.$t('assets.UserSwitchFrom'),
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => {
|
hidden: (formValue) => {
|
||||||
return vm.platform || vm.asset || vm.addTemplate
|
return vm.platform || vm.asset || vm.addTemplate
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
label: vm.$t('Password'),
|
label: vm.$t('assets.Password'),
|
||||||
component: UpdateToken,
|
component: UpdateToken,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => {
|
hidden: (formValue) => {
|
||||||
return formValue.secret_type !== 'password' || vm.addTemplate
|
return formValue.secret_type !== 'password' || vm.addTemplate
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ssh_key: {
|
ssh_key: {
|
||||||
label: vm.$t('PrivateKey'),
|
label: vm.$t('assets.PrivateKey'),
|
||||||
component: UploadSecret,
|
component: UploadSecret,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate
|
hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate
|
||||||
},
|
},
|
||||||
passphrase: {
|
passphrase: {
|
||||||
label: vm.$t('Passphrase'),
|
label: vm.$t('assets.Passphrase'),
|
||||||
component: UpdateToken,
|
component: UpdateToken,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate
|
hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate
|
||||||
},
|
},
|
||||||
token: {
|
token: {
|
||||||
label: vm.$t('Token'),
|
label: vm.$t('assets.Token'),
|
||||||
component: UploadSecret,
|
component: UploadSecret,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => formValue.secret_type !== 'token' || vm.addTemplate
|
hidden: (formValue) => formValue.secret_type !== 'token' || vm.addTemplate
|
||||||
},
|
},
|
||||||
access_key: {
|
access_key: {
|
||||||
id: 'access_key',
|
id: 'access_key',
|
||||||
label: vm.$t('AccessKey'),
|
label: vm.$t('assets.AccessKey'),
|
||||||
component: UploadSecret,
|
component: UploadSecret,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => formValue.secret_type !== 'access_key' || vm.addTemplate
|
hidden: (formValue) => formValue.secret_type !== 'access_key' || vm.addTemplate
|
||||||
},
|
},
|
||||||
api_key: {
|
api_key: {
|
||||||
id: 'api_key',
|
id: 'api_key',
|
||||||
label: vm.$t('ApiKey'),
|
label: vm.$t('assets.ApiKey'),
|
||||||
component: UploadSecret,
|
component: UploadSecret,
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: (formValue) => formValue.secret_type !== 'api_key' || vm.addTemplate
|
hidden: (formValue) => formValue.secret_type !== 'api_key' || vm.addTemplate
|
||||||
},
|
},
|
||||||
secret_type: {
|
secret_type: {
|
||||||
type: 'radio-group',
|
type: 'radio-group',
|
||||||
options: [],
|
options: [],
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hidden: () => {
|
hidden: () => {
|
||||||
return vm.addTemplate
|
return vm.addTemplate
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
push_now: {
|
push_now: {
|
||||||
helpTip: vm.$t('WindowsPushHelpText'),
|
helpText: vm.$t('accounts.AccountPush.WindowsPushHelpText'),
|
||||||
hidden: (formValue) => {
|
hidden: (formValue) => {
|
||||||
const automation = vm.iPlatform.automation || {}
|
const automation = vm.iPlatform.automation || {}
|
||||||
return !automation.push_account_enabled ||
|
return !automation.push_account_enabled ||
|
||||||
!automation.ansible_enabled ||
|
!automation.ansible_enabled ||
|
||||||
!vm.$hasPerm('accounts.push_account') ||
|
!vm.$hasPerm('accounts.push_account') ||
|
||||||
(formValue.secret_type === 'ssh_key' && vm.iPlatform.type.value === 'windows') ||
|
(formValue.secret_type === 'ssh_key' && vm.iPlatform.type.value === 'windows') ||
|
||||||
vm.addTemplate ||
|
vm.addTemplate
|
||||||
!formValue.secret_reset
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
params: {
|
params: {
|
||||||
label: vm.$t('PushParams'),
|
label: vm.$t('assets.PushParams'),
|
||||||
component: AutomationParamsForm,
|
component: AutomationParamsForm,
|
||||||
el: {},
|
el: {},
|
||||||
hidden: (formValue) => {
|
hidden: (formValue) => {
|
||||||
const automation = vm.iPlatform.automation || {}
|
const automation = vm.iPlatform.automation || {}
|
||||||
if (!vm.iPlatform.automation) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
vm.fieldsMeta.params.el.method = vm.iPlatform.automation.push_account_method
|
vm.fieldsMeta.params.el.method = vm.iPlatform.automation.push_account_method
|
||||||
vm.fieldsMeta.params.el.pushAccountParams = vm.iPlatform.automation.push_account_params
|
vm.fieldsMeta.params.el.pushAccountParams = vm.iPlatform.automation.push_account_params
|
||||||
return !formValue.push_now ||
|
return !formValue.push_now ||
|
||||||
@@ -245,27 +179,12 @@ export const accountFieldsMeta = (vm) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
is_active: {
|
is_active: {
|
||||||
label: vm.$t('IsActive'),
|
label: vm.$t('common.IsActive')
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
comment: {
|
comment: {
|
||||||
label: vm.$t('Comment'),
|
label: vm.$t('common.Comment'),
|
||||||
el: {
|
hidden: () => {
|
||||||
get disabled() {
|
return vm.addTemplate
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
secret_reset: {
|
|
||||||
label: vm.$t('SecretReset'),
|
|
||||||
el: {
|
|
||||||
get disabled() {
|
|
||||||
return vm.isDisabled
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
<AutoDataForm
|
<AutoDataForm
|
||||||
v-if="!loading"
|
v-if="!loading"
|
||||||
ref="AutoDataForm"
|
ref="AutoDataForm"
|
||||||
:class="addTemplate? '': 'account-add'"
|
|
||||||
:submit-btn-text="submitBtnText"
|
|
||||||
v-bind="$data"
|
v-bind="$data"
|
||||||
@submit="confirm"
|
@submit="confirm"
|
||||||
/>
|
/>
|
||||||
@@ -11,7 +9,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import AutoDataForm from '@/components/Form/AutoDataForm/index.vue'
|
import AutoDataForm from '@/components/Form/AutoDataForm/index.vue'
|
||||||
import { encryptPassword } from '@/utils/secure'
|
import { encryptPassword } from '@/utils/crypto'
|
||||||
import { accountFieldsMeta } from '@/components/Apps/AccountCreateUpdateForm/const'
|
import { accountFieldsMeta } from '@/components/Apps/AccountCreateUpdateForm/const'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -45,9 +43,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: true,
|
loading: true,
|
||||||
isDisabled: false,
|
|
||||||
usernameChanged: false,
|
usernameChanged: false,
|
||||||
submitBtnText: this.$t('Confirm'),
|
|
||||||
iPlatform: {
|
iPlatform: {
|
||||||
automation: {},
|
automation: {},
|
||||||
su_enabled: false,
|
su_enabled: false,
|
||||||
@@ -62,29 +58,19 @@ export default {
|
|||||||
form: Object.assign({ 'on_invalid': 'error' }, this.account || {}),
|
form: Object.assign({ 'on_invalid': 'error' }, this.account || {}),
|
||||||
encryptedFields: ['secret'],
|
encryptedFields: ['secret'],
|
||||||
fields: [
|
fields: [
|
||||||
[this.$t('Basic'), ['name', 'username', 'privileged', 'su_from', 'su_from_username', 'template']],
|
[this.$t('assets.Asset'), ['assets']],
|
||||||
[this.$t('Asset'), ['assets']],
|
[this.$t('accounts.AccountTemplate'), ['template']],
|
||||||
[this.$t('Secret'), [
|
[this.$t('common.Basic'), ['name', 'username', 'privileged', 'su_from', 'su_from_username']],
|
||||||
|
[this.$t('assets.Secret'), [
|
||||||
'secret_type', 'password', 'ssh_key', 'token',
|
'secret_type', 'password', 'ssh_key', 'token',
|
||||||
'access_key', 'passphrase', 'api_key',
|
'access_key', 'passphrase', 'api_key'
|
||||||
'secret_reset'
|
|
||||||
]],
|
]],
|
||||||
[this.$t('Other'), ['push_now', 'params', 'on_invalid', 'is_active', 'comment']]
|
[this.$t('common.Other'), ['push_now', 'params', 'on_invalid', 'is_active', 'comment']]
|
||||||
],
|
],
|
||||||
fieldsMeta: accountFieldsMeta(this),
|
fieldsMeta: accountFieldsMeta(this),
|
||||||
hasSaveContinue: false
|
hasSaveContinue: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
'$route.query': {
|
|
||||||
handler(nv, ov) {
|
|
||||||
if (nv && (nv.flag === 'move' || nv.flag === 'copy')) {
|
|
||||||
this.isDisabled = true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async mounted() {
|
async mounted() {
|
||||||
try {
|
try {
|
||||||
await this.getPlatform()
|
await this.getPlatform()
|
||||||
@@ -114,23 +100,23 @@ export default {
|
|||||||
setSecretTypeOptions() {
|
setSecretTypeOptions() {
|
||||||
const choices = [
|
const choices = [
|
||||||
{
|
{
|
||||||
label: this.$t('Password'),
|
label: this.$t('assets.Password'),
|
||||||
value: 'password'
|
value: 'password'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: this.$t('SSHKey'),
|
label: this.$t('assets.SSHKey'),
|
||||||
value: 'ssh_key'
|
value: 'ssh_key'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: this.$t('Token'),
|
label: this.$t('assets.Token'),
|
||||||
value: 'token'
|
value: 'token'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: this.$t('AccessKey'),
|
label: this.$t('assets.AccessKey'),
|
||||||
value: 'access_key'
|
value: 'access_key'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: this.$t('ApiKey'),
|
label: this.$t('assets.ApiKey'),
|
||||||
value: 'api_key'
|
value: 'api_key'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -157,11 +143,7 @@ export default {
|
|||||||
delete form['secret']
|
delete form['secret']
|
||||||
}
|
}
|
||||||
if (this.account?.name) {
|
if (this.account?.name) {
|
||||||
if (this.account.payload && this.account.payload === 'pam_account_clone') {
|
this.$emit('edit', form)
|
||||||
this.$emit('add', form)
|
|
||||||
} else {
|
|
||||||
this.$emit('edit', form)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.$emit('add', form)
|
this.$emit('add', form)
|
||||||
}
|
}
|
||||||
@@ -169,25 +151,3 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang='scss' scoped>
|
|
||||||
.account-add {
|
|
||||||
::v-deep .el-form-item {
|
|
||||||
//margin-bottom: 5px;
|
|
||||||
|
|
||||||
.help-block {
|
|
||||||
//margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .form-group-header {
|
|
||||||
.hr-line-dashed {
|
|
||||||
//margin: 5px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { GenericUpdateFormDialog } from '@/layout/components'
|
import { GenericUpdateFormDialog } from '@/layout/components'
|
||||||
import { accountFieldsMeta } from '@/components/Apps/AccountCreateUpdateForm/const'
|
import { accountFieldsMeta } from '@/components/Apps/AccountCreateUpdateForm/const'
|
||||||
import { encryptPassword } from '@/utils/secure'
|
import { encryptPassword } from '@/utils/crypto'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AccountBulkUpdateDialog',
|
name: 'AccountBulkUpdateDialog',
|
||||||
|
|||||||
@@ -1,38 +1,35 @@
|
|||||||
<template v-if="iVisible">
|
<template>
|
||||||
<Drawer
|
<Dialog
|
||||||
|
v-if="iVisible"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:destroy-on-close="true"
|
||||||
|
:show-cancel="false"
|
||||||
|
:show-confirm="false"
|
||||||
:title="title"
|
:title="title"
|
||||||
:visible="iVisible"
|
:visible.sync="iVisible"
|
||||||
class="drawer"
|
v-bind="$attrs"
|
||||||
@close-drawer="handleCloseDrawer"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
<Page :title="'null'">
|
<AccountCreateUpdateForm
|
||||||
<IBox class="content">
|
v-if="!loading"
|
||||||
<AccountCreateUpdateForm
|
ref="form"
|
||||||
v-if="!loading"
|
:account="account"
|
||||||
ref="form"
|
:add-template="addTemplate"
|
||||||
:account="account"
|
:asset="asset"
|
||||||
:add-template="addTemplate"
|
@add="addAccount"
|
||||||
:asset="asset"
|
@edit="editAccount"
|
||||||
@add="addAccount"
|
/>
|
||||||
@edit="editAccount"
|
</Dialog>
|
||||||
/>
|
|
||||||
</IBox>
|
|
||||||
</Page>
|
|
||||||
</Drawer>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Drawer from '@/components/Drawer/index.vue'
|
import Dialog from '@/components/Dialog/index.vue'
|
||||||
import AccountCreateUpdateForm from '@/components/Apps/AccountCreateUpdateForm/index.vue'
|
import AccountCreateUpdateForm from '@/components/Apps/AccountCreateUpdateForm/index.vue'
|
||||||
import IBox from '@/components/Common/IBox/index.vue'
|
|
||||||
import Page from '@/layout/components/Page/index.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CreateAccountDialog',
|
name: 'CreateAccountDialog',
|
||||||
components: {
|
components: {
|
||||||
IBox,
|
Dialog,
|
||||||
Drawer,
|
|
||||||
Page,
|
|
||||||
AccountCreateUpdateForm
|
AccountCreateUpdateForm
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@@ -55,7 +52,7 @@ export default {
|
|||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: function() {
|
default: function() {
|
||||||
return this.$t('AddAccount')
|
return this.$t('assets.AddAccount')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -94,7 +91,7 @@ export default {
|
|||||||
data = formValue
|
data = formValue
|
||||||
url = `/api/v1/accounts/accounts/bulk/`
|
url = `/api/v1/accounts/accounts/bulk/`
|
||||||
if (data.assets.length === 0) {
|
if (data.assets.length === 0) {
|
||||||
this.$message.error(this.$tc('PleaseSelectAsset'))
|
this.$message.error(this.$tc('assets.PleaseSelectAsset'))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,22 +110,11 @@ export default {
|
|||||||
},
|
},
|
||||||
editAccount(form) {
|
editAccount(form) {
|
||||||
const data = { ...form }
|
const data = { ...form }
|
||||||
const flag = this.$route.query.flag
|
this.$axios.patch(`/api/v1/accounts/accounts/${this.account.id}/`, data).then(() => {
|
||||||
|
this.iVisible = false
|
||||||
switch (flag) {
|
this.$emit('add', true)
|
||||||
case 'copy':
|
this.$message.success(this.$tc('common.updateSuccessMsg'))
|
||||||
this.handleAccountOperation(this.account.id, 'copy-to-assets', data)
|
}).catch(error => this.setFieldError(error))
|
||||||
break
|
|
||||||
case 'move':
|
|
||||||
this.handleAccountOperation(this.account.id, 'move-to-assets', data)
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
this.$axios.patch(`/api/v1/accounts/accounts/${this.account.id}/`, data).then(() => {
|
|
||||||
this.iVisible = false
|
|
||||||
this.$emit('add', true)
|
|
||||||
this.$message.success(this.$tc('UpdateSuccessMsg'))
|
|
||||||
}).catch(error => this.setFieldError(error))
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
handleResult(resp, error) {
|
handleResult(resp, error) {
|
||||||
let bulkCreate = !this.asset
|
let bulkCreate = !this.asset
|
||||||
@@ -140,7 +126,7 @@ export default {
|
|||||||
}
|
}
|
||||||
if (!bulkCreate) {
|
if (!bulkCreate) {
|
||||||
if (!error) {
|
if (!error) {
|
||||||
this.$message.success(this.$tc('CreateSuccessMsg'))
|
this.$message.success(this.$tc('common.createSuccessMsg'))
|
||||||
} else {
|
} else {
|
||||||
this.setFieldError(error)
|
this.setFieldError(error)
|
||||||
}
|
}
|
||||||
@@ -181,29 +167,11 @@ export default {
|
|||||||
refsAutoDataForm.setFieldError(current, err)
|
refsAutoDataForm.setFieldError(current, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
handleCloseDrawer() {
|
|
||||||
this.iVisible = false
|
|
||||||
// Reflect.deleteProperty(this.$route.query, 'flag')
|
|
||||||
},
|
|
||||||
handleAccountOperation(id, path, data) {
|
|
||||||
this.$axios.post(`/api/v1/accounts/accounts/${id}/${path}/`, data).then((res) => {
|
|
||||||
this.iVisible = false
|
|
||||||
this.$emit('add', true)
|
|
||||||
this.handleResult(res, null)
|
|
||||||
}).catch(error => this.handleResult(null, error))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style scoped>
|
||||||
.drawer {
|
|
||||||
::v-deep .el-drawer__body {
|
|
||||||
|
|
||||||
.el-form {
|
|
||||||
margin-right: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<DrawerListTable
|
<ListTable ref="ListTable" :header-actions="headerActions" :table-config="tableConfig" />
|
||||||
ref="ListTable"
|
|
||||||
:detail-drawer="detailDrawer"
|
|
||||||
:header-actions="headerActions"
|
|
||||||
:quick-filters="quickFilters"
|
|
||||||
:table-config="tableConfig"
|
|
||||||
/>
|
|
||||||
<ViewSecret
|
<ViewSecret
|
||||||
v-if="showViewSecretDialog"
|
v-if="showViewSecretDialog"
|
||||||
:account="account"
|
:account="account"
|
||||||
@@ -22,18 +16,26 @@
|
|||||||
<AccountCreateUpdate
|
<AccountCreateUpdate
|
||||||
v-if="showAddDialog"
|
v-if="showAddDialog"
|
||||||
:account="account"
|
:account="account"
|
||||||
:add-template="addTemplate"
|
|
||||||
:asset="iAsset"
|
:asset="iAsset"
|
||||||
:title="accountCreateUpdateTitle"
|
:title="accountCreateUpdateTitle"
|
||||||
:visible.sync="showAddDialog"
|
:visible.sync="showAddDialog"
|
||||||
@add="addAccountSuccess"
|
@add="addAccountSuccess"
|
||||||
@bulk-create-done="showBulkCreateResult($event)"
|
@bulk-create-done="showBulkCreateResult($event)"
|
||||||
/>
|
/>
|
||||||
|
<AccountCreateUpdate
|
||||||
|
v-if="showAddTemplateDialog"
|
||||||
|
:account="account"
|
||||||
|
:add-template="true"
|
||||||
|
:asset="iAsset"
|
||||||
|
:title="accountCreateUpdateTitle"
|
||||||
|
:visible.sync="showAddTemplateDialog"
|
||||||
|
@add="addAccountSuccess"
|
||||||
|
@bulk-create-done="showBulkCreateResult($event)"
|
||||||
|
/>
|
||||||
<ResultDialog
|
<ResultDialog
|
||||||
v-if="showResultDialog"
|
v-if="showResultDialog"
|
||||||
:result="createAccountResults"
|
:result="createAccountResults"
|
||||||
:visible.sync="showResultDialog"
|
:visible.sync="showResultDialog"
|
||||||
@close-all="closeAll"
|
|
||||||
/>
|
/>
|
||||||
<AccountBulkUpdateDialog
|
<AccountBulkUpdateDialog
|
||||||
v-if="updateSelectedDialogSetting.visible"
|
v-if="updateSelectedDialogSetting.visible"
|
||||||
@@ -41,42 +43,29 @@
|
|||||||
v-bind="updateSelectedDialogSetting"
|
v-bind="updateSelectedDialogSetting"
|
||||||
@update="handleAccountBulkUpdate"
|
@update="handleAccountBulkUpdate"
|
||||||
/>
|
/>
|
||||||
<PasswordHistoryDialog
|
|
||||||
v-if="showPasswordHistoryDialog"
|
|
||||||
:account="currentAccountColumn"
|
|
||||||
:visible.sync="showPasswordHistoryDialog"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex'
|
import ListTable from '@/components/Table/ListTable/index.vue'
|
||||||
import { accountOtherActions, accountQuickFilters, connectivityMeta, isDirectoryServiceAccount } from './const'
|
import { ActionsFormatter } from '@/components/Table/TableFormatters'
|
||||||
import { openTaskPage } from '@/utils/jms/index'
|
|
||||||
import {
|
|
||||||
AccountConnectFormatter,
|
|
||||||
ActionsFormatter,
|
|
||||||
PlatformFormatter,
|
|
||||||
SecretViewerFormatter
|
|
||||||
} from '@/components/Table/TableFormatters'
|
|
||||||
import ViewSecret from './ViewSecret.vue'
|
import ViewSecret from './ViewSecret.vue'
|
||||||
import UpdateSecretInfo from './UpdateSecretInfo.vue'
|
import UpdateSecretInfo from './UpdateSecretInfo.vue'
|
||||||
import ResultDialog from './BulkCreateResultDialog.vue'
|
|
||||||
import AccountCreateUpdate from './AccountCreateUpdate.vue'
|
import AccountCreateUpdate from './AccountCreateUpdate.vue'
|
||||||
import PasswordHistoryDialog from './PasswordHistoryDialog.vue'
|
import { connectivityMeta } from './const'
|
||||||
import DrawerListTable from '@/components/Table/DrawerListTable/index.vue'
|
import { openTaskPage } from '@/utils/jms'
|
||||||
|
import ResultDialog from './BulkCreateResultDialog.vue'
|
||||||
import AccountBulkUpdateDialog from '@/components/Apps/AccountListTable/AccountBulkUpdateDialog.vue'
|
import AccountBulkUpdateDialog from '@/components/Apps/AccountListTable/AccountBulkUpdateDialog.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AccountListTable',
|
name: 'AccountListTable',
|
||||||
components: {
|
components: {
|
||||||
ViewSecret,
|
AccountBulkUpdateDialog,
|
||||||
ResultDialog,
|
ResultDialog,
|
||||||
DrawerListTable,
|
ListTable,
|
||||||
UpdateSecretInfo,
|
UpdateSecretInfo,
|
||||||
AccountCreateUpdate,
|
ViewSecret,
|
||||||
PasswordHistoryDialog,
|
AccountCreateUpdate
|
||||||
AccountBulkUpdateDialog
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
url: {
|
url: {
|
||||||
@@ -99,7 +88,7 @@ export default {
|
|||||||
},
|
},
|
||||||
hasClone: {
|
hasClone: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: false
|
||||||
},
|
},
|
||||||
asset: {
|
asset: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@@ -129,7 +118,8 @@ export default {
|
|||||||
columnsDefault: {
|
columnsDefault: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => ([
|
default: () => ([
|
||||||
'name', 'username', 'secret', 'asset', 'platform', 'connect'
|
'name', 'username', 'asset', 'privileged',
|
||||||
|
'secret_type', 'is_active', 'date_updated'
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
headerExtraActions: {
|
headerExtraActions: {
|
||||||
@@ -139,34 +129,21 @@ export default {
|
|||||||
extraQuery: {
|
extraQuery: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({})
|
default: () => ({})
|
||||||
},
|
|
||||||
showQuickFilters: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
showActions: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const vm = this
|
const vm = this
|
||||||
return {
|
return {
|
||||||
addTemplate: false,
|
|
||||||
isUpdateAccount: false,
|
|
||||||
currentAccountColumn: {},
|
|
||||||
showPasswordHistoryDialog: false,
|
|
||||||
showViewSecretDialog: false,
|
showViewSecretDialog: false,
|
||||||
showUpdateSecretDialog: false,
|
showUpdateSecretDialog: false,
|
||||||
showResultDialog: false,
|
showResultDialog: false,
|
||||||
showAddDialog: false,
|
showAddDialog: false,
|
||||||
showAddTemplateDialog: false,
|
showAddTemplateDialog: false,
|
||||||
detailDrawer: () => import('@/views/accounts/Account/AccountDetail/index.vue'),
|
|
||||||
createAccountResults: [],
|
createAccountResults: [],
|
||||||
|
accountCreateUpdateTitle: this.$t('assets.AddAccount'),
|
||||||
iAsset: this.asset,
|
iAsset: this.asset,
|
||||||
account: {},
|
account: {},
|
||||||
secretUrl: '',
|
secretUrl: '',
|
||||||
quickFilters: this.showQuickFilters ? accountQuickFilters(this) : [],
|
|
||||||
tableConfig: {
|
tableConfig: {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
permissions: {
|
permissions: {
|
||||||
@@ -175,88 +152,40 @@ export default {
|
|||||||
},
|
},
|
||||||
extraQuery: this.extraQuery,
|
extraQuery: this.extraQuery,
|
||||||
columnsExclude: ['spec_info'],
|
columnsExclude: ['spec_info'],
|
||||||
columnsAdd: ['secret', 'platform', 'connect'],
|
|
||||||
columnsShow: {
|
columnsShow: {
|
||||||
min: ['name', 'username', 'actions'],
|
min: ['name', 'username', 'actions'],
|
||||||
default: this.columnsDefault
|
default: this.columnsDefault
|
||||||
},
|
},
|
||||||
columnsMeta: {
|
columnsMeta: {
|
||||||
name: {
|
name: {
|
||||||
minWidth: '60px',
|
formatter: function(row) {
|
||||||
formatterArgs: {
|
const to = {
|
||||||
can: () => vm.$hasPerm('accounts.view_account'),
|
name: 'AssetAccountDetail',
|
||||||
getRoute: ({ row }) => ({
|
|
||||||
name: 'AccountDetail',
|
|
||||||
params: { id: row.id }
|
params: { id: row.id }
|
||||||
}),
|
|
||||||
getTitle: ({ row }) => {
|
|
||||||
let title = row.name
|
|
||||||
if (row.ds && this.asset && this.asset.id !== row.asset.id) {
|
|
||||||
const dsID = row.ds.id.split('-')[0]
|
|
||||||
title = `${row.name}@${dsID}`
|
|
||||||
}
|
|
||||||
return title
|
|
||||||
},
|
|
||||||
getDrawerTitle({ row }) {
|
|
||||||
return `${row.username}@${row.asset.name}`
|
|
||||||
}
|
}
|
||||||
}
|
if (vm.$hasPerm('accounts.view_account')) {
|
||||||
},
|
return <router-link to={to}>{row.name}</router-link>
|
||||||
secret: {
|
|
||||||
formatter: SecretViewerFormatter,
|
|
||||||
width: '130px',
|
|
||||||
formatterArgs: {
|
|
||||||
secretFrom: 'api',
|
|
||||||
hasDownload: false,
|
|
||||||
actionLeft: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
connect: {
|
|
||||||
label: this.$t('Connect'),
|
|
||||||
width: '80px',
|
|
||||||
formatter: AccountConnectFormatter,
|
|
||||||
formatterArgs: {
|
|
||||||
asset: this.asset,
|
|
||||||
can: ({ row }) => {
|
|
||||||
return this.currentUserIsSuperAdmin
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ds: {
|
|
||||||
width: '100px',
|
|
||||||
formatter: (row) => {
|
|
||||||
if (row.ds && row.ds['domain_name']) {
|
|
||||||
return row.ds['domain_name']
|
|
||||||
} else {
|
} else {
|
||||||
return ''
|
return <span>{row.name}</span>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
platform: {
|
|
||||||
label: this.$t('Platform'),
|
|
||||||
width: '150px',
|
|
||||||
formatter: PlatformFormatter,
|
|
||||||
formatterArgs: {
|
|
||||||
platformAttr: 'asset.platform'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
asset: {
|
asset: {
|
||||||
minWidth: '100px',
|
label: this.$t('assets.Asset'),
|
||||||
formatter: function(row) {
|
formatter: function(row) {
|
||||||
return row.asset.name
|
const to = {
|
||||||
}
|
name: 'AssetDetail',
|
||||||
},
|
params: { id: row.asset.id }
|
||||||
username: {
|
}
|
||||||
minWidth: '60px',
|
if (vm.$hasPerm('assets.view_asset')) {
|
||||||
formatter: function(row) {
|
return <router-link to={to}>{row.asset.name}</router-link>
|
||||||
if (row.ds && row.ds['domain_name']) {
|
|
||||||
return `${row.username}@${row.ds['domain_name']}`
|
|
||||||
} else {
|
} else {
|
||||||
return row.username
|
return <span>{row.asset.name}</span>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
secret_type: {
|
secret_type: {
|
||||||
|
width: '100px',
|
||||||
formatter: function(row) {
|
formatter: function(row) {
|
||||||
return row.secret_type.label
|
return row.secret_type.label
|
||||||
}
|
}
|
||||||
@@ -267,34 +196,93 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
has_secret: {
|
has_secret: {
|
||||||
width: '120px',
|
width: '100px',
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
showFalse: false
|
showFalse: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
privileged: {
|
privileged: {
|
||||||
|
label: this.$t('assets.Privileged'),
|
||||||
width: '120px',
|
width: '120px',
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
showText: false,
|
showText: false,
|
||||||
showFalse: true
|
showFalse: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
connectivity: connectivityMeta,
|
connectivity: connectivityMeta,
|
||||||
actions: {
|
actions: {
|
||||||
formatter: ActionsFormatter,
|
formatter: ActionsFormatter,
|
||||||
has: this.showActions,
|
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
performDelete: ({ row }) => {
|
|
||||||
const id = row.id
|
|
||||||
const url = `/api/v1/accounts/accounts/${id}/`
|
|
||||||
return this.$axios.delete(url)
|
|
||||||
},
|
|
||||||
hasUpdate: false, // can set function(row, value)
|
hasUpdate: false, // can set function(row, value)
|
||||||
hasDelete: true, // can set function(row, value)
|
hasDelete: false, // can set function(row, value)
|
||||||
hasClone: false,
|
hasClone: this.hasClone,
|
||||||
canDelete: ({ row }) => vm.$hasPerm('accounts.delete_account') && !isDirectoryServiceAccount(row, this),
|
moreActionsTitle: this.$t('common.More'),
|
||||||
moreActionsTitle: this.$t('More'),
|
extraActions: [
|
||||||
extraActions: accountOtherActions(this)
|
{
|
||||||
|
name: 'View',
|
||||||
|
title: this.$t('common.View'),
|
||||||
|
can: this.$hasPerm('accounts.view_accountsecret'),
|
||||||
|
type: 'primary',
|
||||||
|
callback: ({ row }) => {
|
||||||
|
// debugger
|
||||||
|
vm.secretUrl = `/api/v1/accounts/account-secrets/${row.id}/`
|
||||||
|
vm.account = row
|
||||||
|
vm.showViewSecretDialog = false
|
||||||
|
setTimeout(() => {
|
||||||
|
vm.showViewSecretDialog = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'ClearSecret',
|
||||||
|
title: this.$t('common.ClearSecret'),
|
||||||
|
can: this.$hasPerm('accounts.change_account'),
|
||||||
|
type: 'primary',
|
||||||
|
callback: ({ row }) => {
|
||||||
|
this.$axios.patch(
|
||||||
|
`/api/v1/accounts/accounts/clear-secret/`,
|
||||||
|
{ account_ids: [row.id] }
|
||||||
|
).then(() => {
|
||||||
|
this.$message.success(this.$tc('common.ClearSuccessMsg'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Test',
|
||||||
|
title: this.$t('accounts.Test'),
|
||||||
|
can: ({ row }) =>
|
||||||
|
!this.$store.getters.currentOrgIsRoot &&
|
||||||
|
this.$hasPerm('accounts.change_account') &&
|
||||||
|
row.asset['auto_config'].ansible_enabled &&
|
||||||
|
row.asset['auto_config'].ping_enabled,
|
||||||
|
callback: ({ row }) => {
|
||||||
|
this.$axios.post(
|
||||||
|
`/api/v1/accounts/accounts/tasks/`,
|
||||||
|
{ action: 'verify', accounts: [row.id] }
|
||||||
|
).then(res => {
|
||||||
|
openTaskPage(res['task'])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Update',
|
||||||
|
title: this.$t('common.Update'),
|
||||||
|
can: this.$hasPerm('accounts.change_account') && !this.$store.getters.currentOrgIsRoot,
|
||||||
|
callback: ({ row }) => {
|
||||||
|
const data = {
|
||||||
|
...this.asset,
|
||||||
|
...row.asset
|
||||||
|
}
|
||||||
|
vm.account = row
|
||||||
|
vm.iAsset = data
|
||||||
|
vm.showAddDialog = false
|
||||||
|
vm.accountCreateUpdateTitle = this.$t('assets.UpdateAccount')
|
||||||
|
setTimeout(() => {
|
||||||
|
vm.showAddDialog = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
...this.columnsMeta
|
...this.columnsMeta
|
||||||
@@ -307,10 +295,17 @@ export default {
|
|||||||
hasCreate: false,
|
hasCreate: false,
|
||||||
hasImport: this.hasImport,
|
hasImport: this.hasImport,
|
||||||
hasExport: this.hasExport && this.$hasPerm('accounts.view_accountsecret'),
|
hasExport: this.hasExport && this.$hasPerm('accounts.view_accountsecret'),
|
||||||
|
handleImportClick: ({ selectedRows }) => {
|
||||||
|
this.$eventBus.$emit('showImportDialog', {
|
||||||
|
selectedRows,
|
||||||
|
url: '/api/v1/accounts/accounts/',
|
||||||
|
name: this?.name
|
||||||
|
})
|
||||||
|
},
|
||||||
exportOptions: {
|
exportOptions: {
|
||||||
url: this.exportUrl,
|
url: this.exportUrl,
|
||||||
mfaVerifyRequired: true,
|
mfaVerifyRequired: true,
|
||||||
tips: this.$t('AccountExportTips')
|
tips: this.$t('accounts.AccountExportTips')
|
||||||
},
|
},
|
||||||
importOptions: {
|
importOptions: {
|
||||||
canImportCreate: this.$hasPerm('accounts.add_account'),
|
canImportCreate: this.$hasPerm('accounts.add_account'),
|
||||||
@@ -319,35 +314,35 @@ export default {
|
|||||||
extraActions: [
|
extraActions: [
|
||||||
{
|
{
|
||||||
name: 'add',
|
name: 'add',
|
||||||
title: this.$t('Create'),
|
title: this.$t('common.Add'),
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
icon: 'plus',
|
|
||||||
can: () => {
|
can: () => {
|
||||||
return vm.$hasPerm('accounts.add_account') && !vm.$store.getters.currentOrgIsRoot
|
return vm.$hasPerm('accounts.add_account') && !this.$store.getters.currentOrgIsRoot
|
||||||
},
|
},
|
||||||
callback: () => {
|
callback: async() => {
|
||||||
setTimeout(() => {
|
|
||||||
vm.iAsset = this.asset
|
|
||||||
vm.account = {}
|
|
||||||
this.addTemplate = false
|
|
||||||
this.showAddDialog = true
|
|
||||||
}, 200)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'add-template',
|
|
||||||
title: this.$t('TemplateAdd'),
|
|
||||||
has: !(this.platform || this.asset),
|
|
||||||
can: () => {
|
|
||||||
return vm.$hasPerm('accounts.add_account') && !vm.$store.getters.currentOrgIsRoot
|
|
||||||
},
|
|
||||||
callback: async () => {
|
|
||||||
await this.getAssetDetail()
|
await this.getAssetDetail()
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
vm.iAsset = this.asset
|
vm.iAsset = this.asset
|
||||||
vm.account = {}
|
vm.account = {}
|
||||||
|
vm.accountCreateUpdateTitle = this.$t('assets.AddAccount')
|
||||||
vm.showAddDialog = true
|
vm.showAddDialog = true
|
||||||
vm.addTemplate = true
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'add-template',
|
||||||
|
title: this.$t('common.TemplateAdd'),
|
||||||
|
has: !(this.platform || this.asset),
|
||||||
|
can: () => {
|
||||||
|
return vm.$hasPerm('accounts.add_account') && !this.$store.getters.currentOrgIsRoot
|
||||||
|
},
|
||||||
|
callback: async() => {
|
||||||
|
await this.getAssetDetail()
|
||||||
|
setTimeout(() => {
|
||||||
|
vm.iAsset = this.asset
|
||||||
|
vm.account = {}
|
||||||
|
vm.accountCreateUpdateTitle = this.$t('assets.AddAccount')
|
||||||
|
vm.showAddTemplateDialog = true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -355,14 +350,14 @@ export default {
|
|||||||
],
|
],
|
||||||
extraMoreActions: [
|
extraMoreActions: [
|
||||||
{
|
{
|
||||||
name: 'TestSelected',
|
name: 'BulkVerify',
|
||||||
title: this.$t('TestSelected'),
|
title: this.$t('accounts.BulkVerify'),
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
icon: 'verify',
|
fa: 'fa-link',
|
||||||
can: ({ selectedRows }) => {
|
can: ({ selectedRows }) => {
|
||||||
return selectedRows.length > 0 &&
|
return selectedRows.length > 0 &&
|
||||||
['clickhouse', 'redis', 'website', 'chatgpt'].indexOf(selectedRows[0].asset.type.value) === -1 &&
|
['clickhouse', 'redis', 'website', 'chatgpt'].indexOf(selectedRows[0].asset.type.value) === -1 &&
|
||||||
!this.$store.getters.currentOrgIsRoot && vm.$hasPerm('accounts.verify_account')
|
!this.$store.getters.currentOrgIsRoot
|
||||||
},
|
},
|
||||||
callback: function({ selectedRows }) {
|
callback: function({ selectedRows }) {
|
||||||
const ids = selectedRows.map(v => {
|
const ids = selectedRows.map(v => {
|
||||||
@@ -373,15 +368,15 @@ export default {
|
|||||||
{ action: 'verify', accounts: ids }).then(res => {
|
{ action: 'verify', accounts: ids }).then(res => {
|
||||||
openTaskPage(res['task'])
|
openTaskPage(res['task'])
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
this.$message.error(this.$tc('BulkVerifyErrorMsg' + ' ' + err))
|
this.$message.error(this.$tc('common.bulkVerifyErrorMsg' + ' ' + err))
|
||||||
})
|
})
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'BatchClearSecret',
|
name: 'ClearSecrets',
|
||||||
title: this.$t('ClearSecret'),
|
title: this.$t('common.ClearSecret'),
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
icon: 'clean',
|
fa: 'clean',
|
||||||
can: ({ selectedRows }) => {
|
can: ({ selectedRows }) => {
|
||||||
return selectedRows.length > 0 && vm.$hasPerm('accounts.change_account')
|
return selectedRows.length > 0 && vm.$hasPerm('accounts.change_account')
|
||||||
},
|
},
|
||||||
@@ -392,16 +387,16 @@ export default {
|
|||||||
this.$axios.patch(
|
this.$axios.patch(
|
||||||
'/api/v1/accounts/accounts/clear-secret/',
|
'/api/v1/accounts/accounts/clear-secret/',
|
||||||
{ account_ids: ids }).then(() => {
|
{ account_ids: ids }).then(() => {
|
||||||
this.$message.success(this.$tc('ClearSuccessMsg'))
|
this.$message.success(this.$tc('common.ClearSuccessMsg'))
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
this.$message.error(this.$tc('ClearErrorMsg' + ' ' + err))
|
this.$message.error(this.$tc('common.bulkClearErrorMsg' + ' ' + err))
|
||||||
})
|
})
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'UpdateSelected',
|
name: 'actionUpdateSelected',
|
||||||
title: this.$t('UpdateSelected'),
|
title: this.$t('accounts.AccountBatchUpdate'),
|
||||||
icon: 'batch-update',
|
fa: 'batch-update',
|
||||||
can: ({ selectedRows }) => {
|
can: ({ selectedRows }) => {
|
||||||
return selectedRows.length > 0 &&
|
return selectedRows.length > 0 &&
|
||||||
!this.$store.getters.currentOrgIsRoot &&
|
!this.$store.getters.currentOrgIsRoot &&
|
||||||
@@ -427,18 +422,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
...mapGetters(['currentUserIsSuperAdmin']),
|
|
||||||
accountCreateUpdateTitle() {
|
|
||||||
if (this.addTemplate) {
|
|
||||||
return this.$t('AddAccountByTemplate')
|
|
||||||
} else if (this.isUpdateAccount) {
|
|
||||||
return this.$t('UpdateAccount')
|
|
||||||
} else {
|
|
||||||
return this.$t('AddAccount')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
watch: {
|
||||||
url(iNew) {
|
url(iNew) {
|
||||||
this.$set(this.tableConfig, 'url', iNew)
|
this.$set(this.tableConfig, 'url', iNew)
|
||||||
@@ -446,39 +429,50 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setActions()
|
if (this.columns.length > 0) {
|
||||||
},
|
this.tableConfig.columns = this.columns
|
||||||
activated() {
|
}
|
||||||
// 由于组件嵌套较深,有可能导致 Error in activated hook: "TypeError: Cannot read properties of undefined (reading 'getList')" 的问题
|
if (this.otherActions) {
|
||||||
if (this.tabDeactivated) {
|
const actionColumn = this.tableConfig.columns[this.tableConfig.columns.length - 1]
|
||||||
setTimeout(() => this.refresh(), 300)
|
for (const item of this.otherActions) {
|
||||||
|
actionColumn.formatterArgs.extraActions.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.hasDeleteAction) {
|
||||||
|
this.tableConfig.columnsMeta.actions.formatterArgs.extraActions.push(
|
||||||
|
{
|
||||||
|
name: 'Delete',
|
||||||
|
title: this.$t('common.Delete'),
|
||||||
|
can: this.$hasPerm('accounts.delete_account'),
|
||||||
|
type: 'primary',
|
||||||
|
callback: ({ row }) => {
|
||||||
|
const msg = this.$t('accounts.AccountDeleteConfirmMsg')
|
||||||
|
this.$confirm(msg, this.$tc('common.Info'), {
|
||||||
|
type: 'warning',
|
||||||
|
confirmButtonClass: 'el-button--danger',
|
||||||
|
beforeClose: async(action, instance, done) => {
|
||||||
|
if (action !== 'confirm') return done()
|
||||||
|
this.$axios.delete(`/api/v1/accounts/accounts/${row.id}/`).then(() => {
|
||||||
|
done()
|
||||||
|
this.$refs.ListTable.reloadTable()
|
||||||
|
this.$message.success(this.$tc('common.deleteSuccessMsg'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deactivated() {
|
|
||||||
this.tabDeactivated = true
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
setActions() {
|
|
||||||
if (this.columns.length > 0) {
|
|
||||||
this.tableConfig.columns = this.columns
|
|
||||||
}
|
|
||||||
if (this.otherActions) {
|
|
||||||
const actionColumn = this.tableConfig.columns[this.tableConfig.columns.length - 1]
|
|
||||||
for (const item of this.otherActions) {
|
|
||||||
actionColumn.formatterArgs.extraActions.push(item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onUpdateAuthDone(account) {
|
onUpdateAuthDone(account) {
|
||||||
Object.assign(this.account, account)
|
Object.assign(this.account, account)
|
||||||
},
|
},
|
||||||
addAccountSuccess() {
|
addAccountSuccess() {
|
||||||
// Reflect.deleteProperty(this.$route.query, 'flag')
|
|
||||||
this.isUpdateAccount = false
|
|
||||||
this.$refs.ListTable.reloadTable()
|
this.$refs.ListTable.reloadTable()
|
||||||
},
|
},
|
||||||
async getAssetDetail() {
|
async getAssetDetail() {
|
||||||
const { query: { asset } } = this.$route
|
const { query: { asset }} = this.$route
|
||||||
if (asset) {
|
if (asset) {
|
||||||
this.iAsset = await this.$axios.get(`/api/v1/assets/assets/${asset}/`)
|
this.iAsset = await this.$axios.get(`/api/v1/assets/assets/${asset}/`)
|
||||||
}
|
}
|
||||||
@@ -487,33 +481,21 @@ export default {
|
|||||||
this.$refs.ListTable.reloadTable()
|
this.$refs.ListTable.reloadTable()
|
||||||
},
|
},
|
||||||
showBulkCreateResult(results) {
|
showBulkCreateResult(results) {
|
||||||
|
this.showResultDialog = false
|
||||||
|
this.createAccountResults = results
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.showResultDialog = true
|
this.showResultDialog = true
|
||||||
this.createAccountResults = results
|
}, 100)
|
||||||
}, 350)
|
|
||||||
},
|
},
|
||||||
handleAccountBulkUpdate() {
|
handleAccountBulkUpdate() {
|
||||||
this.updateSelectedDialogSetting.visible = false
|
this.updateSelectedDialogSetting.visible = false
|
||||||
this.$refs.ListTable.reloadTable()
|
this.$refs.ListTable.reloadTable()
|
||||||
},
|
|
||||||
closeAll() {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.showResultDialog = false
|
|
||||||
}, 350)
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.showAddDialog = false
|
|
||||||
}, 800)
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.refresh()
|
|
||||||
}, 1000)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang='scss' scoped>
|
||||||
.cell a {
|
.cell a {
|
||||||
color: var(--color-info);
|
color: var(--color-info);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,11 +30,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const errorProp = this.$t('Error')
|
const errorProp = this.$t('common.Error')
|
||||||
const stateMap = {
|
const stateMap = {
|
||||||
'created': this.$tc('Created'),
|
'created': this.$tc('common.Created'),
|
||||||
'updated': this.$tc('Updated'),
|
'updated': this.$tc('common.Updated'),
|
||||||
'skipped': this.$tc('Skipped')
|
'skipped': this.$tc('common.Skipped')
|
||||||
}
|
}
|
||||||
const stateClsMap = {
|
const stateClsMap = {
|
||||||
'created': 'color-primary',
|
'created': 'color-primary',
|
||||||
@@ -42,16 +42,16 @@ export default {
|
|||||||
'skipped': 'color-default'
|
'skipped': 'color-default'
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
title: this.$t('AddAccountResult'),
|
title: this.$t('accounts.AddAccountResult'),
|
||||||
config: {
|
config: {
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
prop: 'asset',
|
prop: 'asset',
|
||||||
label: this.$t('Asset')
|
label: this.$t('assets.Asset')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'state',
|
prop: 'state',
|
||||||
label: this.$t('Status'),
|
label: this.$t('common.Status'),
|
||||||
width: '200px',
|
width: '200px',
|
||||||
formatter: (row) => {
|
formatter: (row) => {
|
||||||
if (row.error) {
|
if (row.error) {
|
||||||
@@ -71,11 +71,11 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
summary() {
|
summary() {
|
||||||
const labels = {
|
const labels = {
|
||||||
total: this.$tc('Total'),
|
total: this.$tc('common.Total'),
|
||||||
created: this.$tc('Created'),
|
created: this.$tc('common.Created'),
|
||||||
updated: this.$tc('Updated'),
|
updated: this.$tc('common.Updated'),
|
||||||
skipped: this.$tc('Skipped'),
|
skipped: this.$tc('common.Skipped'),
|
||||||
error: this.$tc('Error')
|
error: this.$tc('common.Error')
|
||||||
}
|
}
|
||||||
const grouped = _.groupBy(this.result, 'state')
|
const grouped = _.groupBy(this.result, 'state')
|
||||||
const groupedLength = _.mapValues(grouped, 'length')
|
const groupedLength = _.mapValues(grouped, 'length')
|
||||||
@@ -91,7 +91,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
closeDialog() {
|
closeDialog() {
|
||||||
this.$emit('close-all')
|
this.$emit('update:visible', false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { GenericListTableDialog } from '@/layout/components'
|
import { GenericListTableDialog } from '@/layout/components'
|
||||||
import { SecretViewerFormatter } from '@/components/Table/TableFormatters'
|
import { ShowKeyCopyFormatter } from '@/components/Table/TableFormatters'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -23,7 +23,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
config: {
|
config: {
|
||||||
title: this.$t('HistoryPassword'),
|
title: this.$t('accounts.HistoryPassword'),
|
||||||
visible: false,
|
visible: false,
|
||||||
width: '60%',
|
width: '60%',
|
||||||
tableConfig: {
|
tableConfig: {
|
||||||
@@ -32,15 +32,15 @@ export default {
|
|||||||
columns: ['secret', 'version', 'history_date'],
|
columns: ['secret', 'version', 'history_date'],
|
||||||
columnsMeta: {
|
columnsMeta: {
|
||||||
secret: {
|
secret: {
|
||||||
label: this.$t('Password'),
|
label: this.$t('assets.Password'),
|
||||||
formatter: SecretViewerFormatter,
|
formatter: ShowKeyCopyFormatter,
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
hasDownload: false,
|
hasDownload: false,
|
||||||
name: this.account.name
|
name: this.account.name
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
history_date: {
|
history_date: {
|
||||||
label: this.$t('HistoryDate')
|
label: this.$t('accounts.HistoryDate')
|
||||||
},
|
},
|
||||||
secret_type: {
|
secret_type: {
|
||||||
width: '200px'
|
width: '200px'
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Dialog from '@/components/Dialog/index.vue'
|
import Dialog from '@/components/Dialog/index.vue'
|
||||||
import { openTaskPage } from '@/utils/jms/index'
|
import { openTaskPage } from '@/utils/jms'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'RemoveAccount',
|
name: 'RemoveAccount',
|
||||||
@@ -65,7 +65,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.item-textarea ::v-deep .el-textarea__inner {
|
.item-textarea > > > .el-textarea__inner {
|
||||||
height: 110px;
|
height: 110px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,12 +78,12 @@ export default {
|
|||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-form-item__label {
|
> > > .el-form-item__label {
|
||||||
padding-right: 20px;
|
padding-right: 20px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-form-item__content {
|
> > > .el-form-item__content {
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
|
|||||||
@@ -1,36 +1,44 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog
|
<Dialog
|
||||||
:destroy-on-close="true"
|
:destroy-on-close="true"
|
||||||
:show-buttons="false"
|
:title="$tc('assets.UpdateAssetUserToken')"
|
||||||
:title="$tc('UpdateAssetUserToken')"
|
:visible.sync="visible"
|
||||||
:visible.sync="iVisible"
|
width="50"
|
||||||
width="800px"
|
@cancel="handleCancel()"
|
||||||
|
@confirm="handleConfirm()"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
<AutoDataForm
|
<el-form label-position="right" label-width="90px">
|
||||||
:fields="fields"
|
<el-form-item :label="$tc('assets.Name')">
|
||||||
:fields-meta="fieldsMeta"
|
<el-input v-model="account['asset_name']" readonly />
|
||||||
:form="init"
|
</el-form-item>
|
||||||
:has-reset="false"
|
<el-form-item :label="$tc('assets.Username')">
|
||||||
:has-save-continue="false"
|
<el-input v-model="account['username']" readonly />
|
||||||
:url="''"
|
</el-form-item>
|
||||||
method="patch"
|
<el-form-item :label="$tc('assets.Password')">
|
||||||
@submit="handleConfirm"
|
<UpdateToken v-model="authInfo.password" />
|
||||||
/>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$tc('assets.SSHSecretKey')">
|
||||||
|
<UploadKey @input="getFile" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$tc('assets.Passphrase')">
|
||||||
|
<UpdateToken v-model="authInfo.passphrase" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Dialog from '@/components/Dialog/index.vue'
|
import Dialog from '@/components/Dialog/index.vue'
|
||||||
import { accountFieldsMeta } from '@/components/Apps/AccountCreateUpdateForm/const'
|
import { UpdateToken, UploadKey } from '@/components/Form/FormFields'
|
||||||
import { encryptPassword } from '@/utils/secure'
|
import { encryptPassword } from '@/utils/crypto'
|
||||||
import AutoDataForm from '@/components/Form/AutoDataForm/index.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'UpdateSecretInfo',
|
name: 'UpdateSecretInfo',
|
||||||
components: {
|
components: {
|
||||||
AutoDataForm,
|
Dialog,
|
||||||
Dialog
|
UploadKey,
|
||||||
|
UpdateToken
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
account: {
|
account: {
|
||||||
@@ -43,59 +51,49 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const accountMeta = accountFieldsMeta(this)
|
|
||||||
return {
|
return {
|
||||||
fields: [
|
secretInfo: {
|
||||||
'name', 'secret_type', 'password', 'ssh_key', 'token',
|
password: '',
|
||||||
'access_key', 'passphrase', 'api_key'
|
private_key: '',
|
||||||
],
|
passphrase: ''
|
||||||
fieldsMeta: {
|
|
||||||
...accountMeta,
|
|
||||||
name: {
|
|
||||||
...accountMeta.name,
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
secret_type: {
|
|
||||||
hidden: () => true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
init: {
|
|
||||||
...this.account
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
iVisible: {
|
|
||||||
get() {
|
|
||||||
return this.visible
|
|
||||||
},
|
|
||||||
set(val) {
|
|
||||||
this.$emit('update:visible', val)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleConfirm(form) {
|
handleConfirm() {
|
||||||
const secretType = this.account.secret_type.value
|
const data = {}
|
||||||
const data = {
|
if (this.secretInfo.password !== '') {
|
||||||
secret: encryptPassword(form[secretType])
|
data.password = encryptPassword(this.secretInfo.password)
|
||||||
|
}
|
||||||
|
if (this.secretInfo.private_key !== '') {
|
||||||
|
data.private_key = encryptPassword(this.secretInfo.private_key)
|
||||||
|
if (this.secretInfo.passphrase) data.passphrase = this.secretInfo.passphrase
|
||||||
}
|
}
|
||||||
this.$axios.patch(
|
this.$axios.patch(
|
||||||
`/api/v1/accounts/accounts/${this.account.id}/`,
|
`/api/v1/accounts/accounts/${this.account.id}/`,
|
||||||
data,
|
data,
|
||||||
{ disableFlashErrorMsg: true }
|
{ disableFlashErrorMsg: true }
|
||||||
).then(res => {
|
).then(res => {
|
||||||
this.$message.success(this.$tc('UpdateSuccessMsg'))
|
this.authInfo = { password: '', private_key: '' }
|
||||||
this.iVisible = false
|
this.$message.success(this.$tc('common.updateSuccessMsg'))
|
||||||
|
this.$emit('updateAuthDone', res)
|
||||||
|
this.$emit('update:visible', false)
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
const errMsg = Object.values(err.response.data).join(', ')
|
const errMsg = Object.values(err.response.data).join(', ')
|
||||||
this.$message.error(this.$tc('UpdateErrorMsg') + ' ' + errMsg)
|
this.$message.error(this.$tc('common.updateErrorMsg') + ' ' + errMsg)
|
||||||
this.iVisible = false
|
this.$emit('update:visible', true)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
handleCancel() {
|
handleCancel() {
|
||||||
this.$emit('update:visible', false)
|
this.$emit('update:visible', false)
|
||||||
|
},
|
||||||
|
getFile(file) {
|
||||||
|
this.secretInfo.private_key = file
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -10,15 +10,15 @@
|
|||||||
@confirm="accountConfirmHandle"
|
@confirm="accountConfirmHandle"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
<el-form :model="secretInfo" class="password-form" label-position="right" label-width="130px">
|
<el-form :model="secretInfo" class="password-form" label-position="right" label-width="100px">
|
||||||
<el-form-item :label="$tc('Name')">
|
<el-form-item :label="$tc('assets.Name')">
|
||||||
<span>{{ account['name'] }}</span>
|
<span>{{ account['name'] }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$tc('Username')">
|
<el-form-item :label="$tc('assets.Username')">
|
||||||
<span>{{ account['username'] }}</span>
|
<span>{{ account['username'] }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="secretTypeLabel">
|
<el-form-item :label="secretTypeLabel">
|
||||||
<SecretViewerFormatter
|
<ShowKeyCopyFormatter
|
||||||
:cell-value="secretInfo.secret"
|
:cell-value="secretInfo.secret"
|
||||||
:col="{ formatterArgs: {
|
:col="{ formatterArgs: {
|
||||||
name: account['name'],
|
name: account['name'],
|
||||||
@@ -27,16 +27,16 @@
|
|||||||
@input="onShowKeyCopyFormatterChange"
|
@input="onShowKeyCopyFormatterChange"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="secretType === 'ssh_key'" :label="$tc('SshKeyFingerprint')">
|
<el-form-item v-if="secretType === 'ssh_key'" :label="$tc('assets.sshKeyFingerprint')">
|
||||||
<span>{{ sshKeyFingerprint }}</span>
|
<span>{{ sshKeyFingerprint }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$tc('DateCreated')">
|
<el-form-item :label="$tc('common.DateCreated')">
|
||||||
<span>{{ account['date_created'] | date }}</span>
|
<span>{{ account['date_created'] | date }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$tc('DateUpdated')">
|
<el-form-item :label="$tc('common.DateUpdated')">
|
||||||
<span>{{ account['date_updated'] | date }}</span>
|
<span>{{ account['date_updated'] | date }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="showPasswordRecord" v-perms="'accounts.view_accountsecret'" :label="$tc('PasswordRecord')">
|
<el-form-item v-if="showPasswordRecord" v-perms="'accounts.view_accountsecret'" :label="$tc('accounts.PasswordRecord')">
|
||||||
<el-link
|
<el-link
|
||||||
:underline="false"
|
:underline="false"
|
||||||
type="success"
|
type="success"
|
||||||
@@ -60,15 +60,15 @@
|
|||||||
<script>
|
<script>
|
||||||
import Dialog from '@/components/Dialog/index.vue'
|
import Dialog from '@/components/Dialog/index.vue'
|
||||||
import PasswordHistoryDialog from './PasswordHistoryDialog.vue'
|
import PasswordHistoryDialog from './PasswordHistoryDialog.vue'
|
||||||
import { SecretViewerFormatter } from '@/components/Table/TableFormatters'
|
import { ShowKeyCopyFormatter } from '@/components/Table/TableFormatters'
|
||||||
import { encryptPassword } from '@/utils/secure'
|
import { encryptPassword } from '@/utils/crypto'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ShowSecretInfo',
|
name: 'ShowSecretInfo',
|
||||||
components: {
|
components: {
|
||||||
Dialog,
|
Dialog,
|
||||||
PasswordHistoryDialog,
|
PasswordHistoryDialog,
|
||||||
SecretViewerFormatter
|
ShowKeyCopyFormatter
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
account: {
|
account: {
|
||||||
@@ -90,7 +90,7 @@ export default {
|
|||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: function() {
|
default: function() {
|
||||||
return this.$tc('Detail')
|
return this.$tc('assets.AccountDetail')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showPasswordRecord: {
|
showPasswordRecord: {
|
||||||
@@ -142,7 +142,7 @@ export default {
|
|||||||
}
|
}
|
||||||
const url = this.type === 'account' ? `/api/v1/accounts/accounts` : `/api/v1/accounts/account-templates`
|
const url = this.type === 'account' ? `/api/v1/accounts/accounts` : `/api/v1/accounts/account-templates`
|
||||||
this.$axios.patch(`${url}/${this.account.id}/`, params).then(() => {
|
this.$axios.patch(`${url}/${this.account.id}/`, params).then(() => {
|
||||||
this.$message.success(this.$tc('UpdateSuccessMsg'))
|
this.$message.success(this.$tc('common.updateSuccessMsg'))
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
showSecretDialog() {
|
showSecretDialog() {
|
||||||
@@ -167,7 +167,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.item-textarea ::v-deep .el-textarea__inner {
|
.item-textarea >>> .el-textarea__inner {
|
||||||
height: 110px;
|
height: 110px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,18 +180,12 @@ export default {
|
|||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-form-item__label {
|
>>> .el-form-item__label {
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
padding-right: 20px;
|
padding-right: 20px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
word-break: keep-all;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
white-space: normal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-form-item__content {
|
>>> .el-form-item__content {
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
|
|||||||