🎉 新增vue3版本架构

This commit is contained in:
smallchill 2024-07-14 23:59:11 +08:00
parent f62f6777c5
commit df87608e5d
222 changed files with 15554 additions and 18193 deletions

View File

@ -1,3 +0,0 @@
> 1%
last 2 versions
not ie <= 8

View File

@ -1,16 +0,0 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab

9
.env.development Normal file
View File

@ -0,0 +1,9 @@
# 开发环境配置
VITE_APP_ENV = 'development'
#接口地址
VITE_APP_API=/api
#页面基础路径
VITE_APP_BASE=/

11
.env.production Normal file
View File

@ -0,0 +1,11 @@
# 生产环境配置
VITE_APP_ENV = 'production'
#接口地址
VITE_APP_API=
#页面基础路径
VITE_APP_BASE=/
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip

View File

@ -1,17 +0,0 @@
module.exports = {
root: true,
env: {
node: true
},
'extends': [
'plugin:vue/essential',
'eslint:recommended'
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
},
parserOptions: {
parser: 'babel-eslint'
}
}

4
.gitignore vendored Normal file → Executable file
View File

@ -9,12 +9,12 @@ node_modules
.env.local .env.local
.env.*.local .env.*.local
# Log files # log files
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
# Editor directories and files # editor directories and files
.idea .idea
.vscode .vscode
*.suo *.suo

View File

@ -1,5 +0,0 @@
module.exports = {
plugins: {
autoprefixer: {}
}
}

9
.prettierrc.json Normal file
View File

@ -0,0 +1,9 @@
{
"printWidth": 100,
"tabWidth": 2,
"semi": true,
"singleAttributePerLine": false,
"bracketSpacing": true,
"singleQuote": true,
"arrowParens": "avoid"
}

View File

@ -1,11 +0,0 @@
FROM nginx:stable-alpine-perl
RUN rm -f /etc/nginx/nginx.conf \
&& rm -f /etc/nginx/conf.d/default.conf
COPY docker/nginx.k8s.conf /etc/nginx/nginx.conf
EXPOSE 80
COPY ./dist /usr/share/nginx/html
ENTRYPOINT ["nginx", "-g", "daemon off;"]

204
LICENSE
View File

@ -1,191 +1,21 @@
Apache License MIT License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION Copyright (c) 2020 smallwei
1. Definitions. Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
"License" shall mean the terms and conditions for use, reproduction, and The above copyright notice and this permission notice shall be included in all
distribution as defined by Sections 1 through 9 of this document. copies or substantial portions of the Software.
"Licensor" shall mean the copyright owner or entity authorized by the copyright THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
owner that is granting the License. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
"Legal Entity" shall mean the union of the acting entity and all other entities AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
that control, are controlled by, or are under common control with that entity. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
For the purposes of this definition, "control" means (i) the power, direct or OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
indirect, to cause the direction or management of such entity, whether by SOFTWARE.
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
"Object" form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
2. Grant of Copyright License.
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
3. Grant of Patent License.
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
4. Redistribution.
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
You must give any other recipients of the Work or Derivative Works a copy of
this License; and
You must cause any modified files to carry prominent notices stating that You
changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
5. Submission of Contributions.
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
6. Trademarks.
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
7. Disclaimer of Warranty.
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
8. Limitation of Liability.
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability.
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "{}" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.
Copyright 2023 BladeX (https://bladex.cn)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,5 +0,0 @@
module.exports = {
presets: [
'@vue/app'
]
}

View File

@ -1,7 +0,0 @@
#!/bin/bash
echo "打包文件"
yarn build
echo "传输文件"
scp -r ./dist/** pig@139.224.200.249:/data/avue/sword
echo "部署成功"

View File

@ -1,58 +0,0 @@
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream gateway {
server blade-gateway;
}
server {
listen 80;
server_name web;
root /usr/share/nginx/html;
location / {
}
location ^~/api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://gateway;
}
}
}

34
index.html Executable file
View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_567566_82imxaft0by.css" />
<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_1066523_6bvkeuqao36.css">
<link rel="stylesheet" href="/css/loading.css">
</head>
<body>
<div id="app">
<div class="loading">
<div class="loading-wrap">
<div class="loading-dots">
<span class="dot dot-spin">
<i></i>
<i></i>
<i></i>
<i></i>
</span>
</div>
<div class="loading-title">
系统加载中
</div>
</div>
</div>
</div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

14
jsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
]
}
},
"exclude": [
"node_modules",
"dist"
]
}

3213
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

69
package.json Normal file → Executable file
View File

@ -1,52 +1,41 @@
{ {
"name": "saber-admin", "name": "saber-admin",
"version": "4.1.0", "version": "4.1.0",
"private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "dev": "vite --host",
"build": "vue-cli-service build", "prod": "vite --mode production",
"lint": "vue-cli-service lint", "build": "vite build",
"analyz": "npm_config_report=true npm run build", "build:prod": "vite build --mode production",
"test:unit": "vue-cli-service test:unit", "serve": "vite preview --host"
"test:e2e": "vue-cli-service test:e2e"
}, },
"dependencies": { "dependencies": {
"axios": "^0.18.0", "@element-plus/icons-vue": "^2.3.1",
"babel-polyfill": "^6.26.0", "@smallwei/avue": "^3.4.4",
"classlist-polyfill": "^1.2.0", "animate.css": "^4.1.1",
"element-ui": "^2.15.6", "avue-plugin-ueditor": "^1.0.3",
"js-base64": "^2.5.1", "axios": "^0.21.1",
"js-cookie": "^2.2.0", "crypto-js": "^4.1.1",
"crypto-js": "^4.0.0",
"sm-crypto": "^0.3.13", "sm-crypto": "^0.3.13",
"mockjs": "^1.0.1-beta3", "dayjs": "^1.10.6",
"node-gyp": "^5.0.6", "element-plus": "^2.7.3",
"js-base64": "^3.7.4",
"js-cookie": "^3.0.0",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"script-loader": "^0.7.2", "vite-plugin-mock": "^2.9.4",
"vue": "^2.6.10", "vue": "^3.4.27",
"vue-axios": "^2.1.2", "vue-i18n": "^9.1.9",
"vue-i18n": "^8.7.0", "vue-router": "^4.3.2",
"vue-router": "^3.0.1", "vuex": "^4.1.0"
"vuex": "^3.1.1"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^3.1.1", "@vitejs/plugin-vue": "^5.0.4",
"@vue/cli-plugin-eslint": "^3.1.5", "@vue/compiler-sfc": "^3.4.27",
"@vue/cli-service": "^3.1.4", "prettier": "^2.8.7",
"chai": "^4.1.2", "sass": "^1.77.2",
"sass": "^1.77.6", "unplugin-auto-import": "^0.11.2",
"sass-loader": "^10.0.5", "vite": "^5.2.12",
"vue-template-compiler": "^2.5.17", "vite-plugin-compression": "^0.5.1",
"webpack-bundle-analyzer": "^3.0.3" "vite-plugin-vue-setup-extend": "^0.4.0"
},
"lint-staged": {
"*.js": [
"vue-cli-service lint",
"git add"
],
"*.vue": [
"vue-cli-service lint",
"git add"
]
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

116
public/css/loading.css Normal file
View File

@ -0,0 +1,116 @@
.loading {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
flex-direction: column;
background-color: #f4f7f9
}
.loading .loading-wrap {
position: absolute;
top: 50%;
left: 50%;
display: flex;
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
justify-content: center;
align-items: center;
flex-direction: column
}
.loading .dots {
display: flex;
padding: 98px;
justify-content: center;
align-items: center
}
.loading .loading-title {
display: flex;
font-weight: bold;
margin-top: 30px;
font-size: 36px;
color: rgba(0, 0, 0, .85);
justify-content: center;
align-items: center
}
.dot {
position: relative;
display: inline-block;
width: 48px;
height: 48px;
margin-top: 30px;
font-size: 32px;
transform: rotate(45deg);
box-sizing: border-box;
animation: antRotate 1.2s infinite linear
}
.dot i {
position: absolute;
display: block;
width: 20px;
height: 20px;
background-color: #0065cc;
border-radius: 100%;
opacity: .3;
transform: scale(.75);
animation: antSpinMove 1s infinite linear alternate;
transform-origin: 50% 50%
}
.dot i:nth-child(1) {
top: 0;
left: 0
}
.dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: .4s;
animation-delay: .4s
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: .8s;
animation-delay: .8s
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@keyframes antSpinMove {
to {
opacity: 1
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1
}
}

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View File

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

BIN
public/img/bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
public/img/bg1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

BIN
public/img/bg2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

BIN
public/img/bg3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
public/img/bg4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

1
public/img/login-bg.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="6395" height="1079"><defs><linearGradient id="b" x1=".747" y1=".222" x2=".973" y2=".807" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#409eff"/><stop offset="1" stop-color="#1b4fab"/></linearGradient><clipPath id="a"><path transform="translate(-5391)" fill="#fff" d="M0 0h6395v1079H0z"/></clipPath></defs><g data-name="Mask Group 1" transform="translate(5391)" clip-path="url(#a)"><g data-name="Group 118"><path data-name="Path 142" d="M976.018-7.302S753.54 180.507 920.669 575.952c44.957 106.375 81.514 205.964 84.521 277 8.164 192.764-156.046 268.564-156.046 268.564l-653.53-26.8L179.349-22.751z" fill="#f1f5f8"/><path data-name="Union 6" d="M-2631.1 1081.8v-1.6h-5599.8V.022h5599.8V0h759.7s-187.845 197.448-91.626 488.844c49.167 148.9 96.309 256.289 104.683 362.118 7.979 100.852-57.98 201.711-168.644 254.286-65.858 31.29-144.552 42.382-223.028 42.383-191.185.001-381.085-65.831-381.085-65.831z" transform="translate(2840.191 -.323)" fill="url(#b)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

View File

Before

Width:  |  Height:  |  Size: 359 KiB

After

Width:  |  Height:  |  Size: 359 KiB

View File

@ -1,109 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
<link rel="stylesheet" href="<%= BASE_URL %>cdn/element-ui/2.15.6/theme-chalk/index.css">
<link rel="stylesheet" href="<%= BASE_URL %>cdn/animate/3.5.2/animate.css">
<link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/index.css">
<link rel="stylesheet" href="<%= BASE_URL %>cdn/avue/2.10.16/index.css">
<link rel="icon" href="<%= BASE_URL %>favicon.png">
<title>Saber企业级开发平台</title>
<style>
html,
body,
#app {
height: 100%;
margin: 0;
padding: 0;
}
.avue-home {
background-color: #303133;
height: 100%;
display: flex;
flex-direction: column;
}
.avue-home__main {
user-select: none;
width: 100%;
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.avue-home__footer {
width: 100%;
flex-grow: 0;
text-align: center;
padding: 1em 0;
}
.avue-home__footer > a {
font-size: 12px;
color: #ABABAB;
text-decoration: none;
}
.avue-home__loading {
height: 32px;
width: 32px;
margin-bottom: 20px;
}
.avue-home__title {
color: #FFF;
font-size: 14px;
margin-bottom: 10px;
}
.avue-home__sub-title {
color: #ABABAB;
font-size: 12px;
}
</style>
</head>
<body>
<noscript>
<strong>
很抱歉,如果没有 JavaScript 支持Saber 将不能正常工作。请启用浏览器的 JavaScript 然后继续。
</strong>
</noscript>
<div id="app">
<div class="avue-home">
<div class="avue-home__main">
<img class="avue-home__loading" src="<%= BASE_URL %>svg/loading-spin.svg" alt="loading">
<div class="avue-home__title">
正在加载资源
</div>
<div class="avue-home__sub-title d">
初次加载资源可能需要较多时间 请耐心等待
</div>
</div>
<div class="avue-home__footer">
<a href="https://bladex.cn" target="_blank">
https://bladex.cn </a>
</div>
</div>
</div>
<!-- built files will be auto injected -->
<script src="<%= BASE_URL %>util/aes.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vue/2.6.10/vue.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vuex/3.1.1/vuex.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vue-router/3.0.1/vue-router.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/axios/1.0.0/axios.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/element-ui/2.15.6/index.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/avue/2.10.16/avue.min.js" charset="utf-8"></script>
</body>
</html>

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="white">
<path opacity=".25" d="M16 0 A16 16 0 0 0 16 32 A16 16 0 0 0 16 0 M16 4 A12 12 0 0 1 16 28 A12 12 0 0 1 16 4"/>
<path d="M16 0 A16 16 0 0 1 32 16 L28 16 A12 12 0 0 0 16 4z">
<animateTransform attributeName="transform" type="rotate" from="0 16 16" to="360 16 16" dur="0.8s" repeatCount="indefinite" />
</path>
</svg>

Before

Width:  |  Height:  |  Size: 422 B

View File

@ -1,105 +0,0 @@
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS = CryptoJS || function (u, p) {
var d = {}, l = d.lib = {}, s = function () { }, t = l.Base = { extend: function (a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } },
r = l.WordArray = t.extend({
init: function (a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function (a) { return (a || v).stringify(this) }, concat: function (a) { var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++)c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4)c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function () {
var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<
32 - 8 * (c % 4); a.length = u.ceil(c / 4)
}, clone: function () { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], e = 0; e < a; e += 4)c.push(4294967296 * u.random() | 0); return new r.init(c, a) }
}), w = d.enc = {}, v = w.Hex = {
stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function (a) {
for (var c = a.length, e = [], j = 0; j < c; j += 2)e[j >>> 3] |= parseInt(a.substr(j,
2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2)
}
}, b = w.Latin1 = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++)e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function (a) { for (var c = a.length, e = [], j = 0; j < c; j++)e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e, c) } }, x = w.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } },
q = l.BufferedBlockAlgorithm = t.extend({
reset: function () { this._data = new r.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, e = c.words, j = c.sigBytes, k = this.blockSize, b = j / (4 * k), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k)this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q, j) }, clone: function () {
var a = t.clone.call(this);
a._data = this._data.clone(); return a
}, _minBufferSize: 0
}); l.Hasher = q.extend({
cfg: t.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function (a) {
return function (b, e) {
return (new n.HMAC.init(a,
e)).finalize(b)
}
}
}); var n = d.algo = {}; return d
}(Math);
(function () {
var u = CryptoJS, p = u.lib.WordArray; u.enc.Base64 = {
stringify: function (d) { var l = d.words, p = d.sigBytes, t = this._map; d.clamp(); d = []; for (var r = 0; r < p; r += 3)for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++)d.push(t.charAt(w >>> 6 * (3 - v) & 63)); if (l = t.charAt(64)) for (; d.length % 4;)d.push(l); return d.join("") }, parse: function (d) {
var l = d.length, s = this._map, t = s.charAt(64); t && (t = d.indexOf(t), -1 != t && (l = t)); for (var t = [], r = 0, w = 0; w <
l; w++)if (w % 4) { var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4), b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4); r++ } return p.create(t, r)
}, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
}
})();
(function (u) {
function p(b, n, a, c, e, j, k) { b = b + (n & a | ~n & c) + e + k; return (b << j | b >>> 32 - j) + n } function d(b, n, a, c, e, j, k) { b = b + (n & c | a & ~c) + e + k; return (b << j | b >>> 32 - j) + n } function l(b, n, a, c, e, j, k) { b = b + (n ^ a ^ c) + e + k; return (b << j | b >>> 32 - j) + n } function s(b, n, a, c, e, j, k) { b = b + (a ^ (n | ~c)) + e + k; return (b << j | b >>> 32 - j) + n } for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++)b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; r = r.MD5 = v.extend({
_doReset: function () { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) },
_doProcessBlock: function (q, n) {
for (var a = 0; 16 > a; a++) { var c = n + a, e = q[c]; q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360 } var a = this._hash.words, c = q[n + 0], e = q[n + 1], j = q[n + 2], k = q[n + 3], z = q[n + 4], r = q[n + 5], t = q[n + 6], w = q[n + 7], v = q[n + 8], A = q[n + 9], B = q[n + 10], C = q[n + 11], u = q[n + 12], D = q[n + 13], E = q[n + 14], x = q[n + 15], f = a[0], m = a[1], g = a[2], h = a[3], f = p(f, m, g, h, c, 7, b[0]), h = p(h, f, m, g, e, 12, b[1]), g = p(g, h, f, m, j, 17, b[2]), m = p(m, g, h, f, k, 22, b[3]), f = p(f, m, g, h, z, 7, b[4]), h = p(h, f, m, g, r, 12, b[5]), g = p(g, h, f, m, t, 17, b[6]), m = p(m, g, h, f, w, 22, b[7]),
f = p(f, m, g, h, v, 7, b[8]), h = p(h, f, m, g, A, 12, b[9]), g = p(g, h, f, m, B, 17, b[10]), m = p(m, g, h, f, C, 22, b[11]), f = p(f, m, g, h, u, 7, b[12]), h = p(h, f, m, g, D, 12, b[13]), g = p(g, h, f, m, E, 17, b[14]), m = p(m, g, h, f, x, 22, b[15]), f = d(f, m, g, h, e, 5, b[16]), h = d(h, f, m, g, t, 9, b[17]), g = d(g, h, f, m, C, 14, b[18]), m = d(m, g, h, f, c, 20, b[19]), f = d(f, m, g, h, r, 5, b[20]), h = d(h, f, m, g, B, 9, b[21]), g = d(g, h, f, m, x, 14, b[22]), m = d(m, g, h, f, z, 20, b[23]), f = d(f, m, g, h, A, 5, b[24]), h = d(h, f, m, g, E, 9, b[25]), g = d(g, h, f, m, k, 14, b[26]), m = d(m, g, h, f, v, 20, b[27]), f = d(f, m, g, h, D, 5, b[28]), h = d(h, f,
m, g, j, 9, b[29]), g = d(g, h, f, m, w, 14, b[30]), m = d(m, g, h, f, u, 20, b[31]), f = l(f, m, g, h, r, 4, b[32]), h = l(h, f, m, g, v, 11, b[33]), g = l(g, h, f, m, C, 16, b[34]), m = l(m, g, h, f, E, 23, b[35]), f = l(f, m, g, h, e, 4, b[36]), h = l(h, f, m, g, z, 11, b[37]), g = l(g, h, f, m, w, 16, b[38]), m = l(m, g, h, f, B, 23, b[39]), f = l(f, m, g, h, D, 4, b[40]), h = l(h, f, m, g, c, 11, b[41]), g = l(g, h, f, m, k, 16, b[42]), m = l(m, g, h, f, t, 23, b[43]), f = l(f, m, g, h, A, 4, b[44]), h = l(h, f, m, g, u, 11, b[45]), g = l(g, h, f, m, x, 16, b[46]), m = l(m, g, h, f, j, 23, b[47]), f = s(f, m, g, h, c, 6, b[48]), h = s(h, f, m, g, w, 10, b[49]), g = s(g, h, f, m,
E, 15, b[50]), m = s(m, g, h, f, r, 21, b[51]), f = s(f, m, g, h, u, 6, b[52]), h = s(h, f, m, g, k, 10, b[53]), g = s(g, h, f, m, B, 15, b[54]), m = s(m, g, h, f, e, 21, b[55]), f = s(f, m, g, h, v, 6, b[56]), h = s(h, f, m, g, x, 10, b[57]), g = s(g, h, f, m, t, 15, b[58]), m = s(m, g, h, f, D, 21, b[59]), f = s(f, m, g, h, z, 6, b[60]), h = s(h, f, m, g, C, 10, b[61]), g = s(g, h, f, m, j, 15, b[62]), m = s(m, g, h, f, A, 21, b[63]); a[0] = a[0] + f | 0; a[1] = a[1] + m | 0; a[2] = a[2] + g | 0; a[3] = a[3] + h | 0
}, _doFinalize: function () {
var b = this._data, n = b.words, a = 8 * this._nDataBytes, c = 8 * b.sigBytes; n[c >>> 5] |= 128 << 24 - c % 32; var e = u.floor(a /
4294967296); n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360; n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (n.length + 1); this._process(); b = this._hash; n = b.words; for (a = 0; 4 > a; a++)c = n[a], n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b
}, clone: function () { var b = v.clone.call(this); b._hash = this._hash.clone(); return b }
}); t.MD5 = v._createHelper(r); t.HmacMD5 = v._createHmacHelper(r)
})(Math);
(function () {
var u = CryptoJS, p = u.lib, d = p.Base, l = p.WordArray, p = u.algo, s = p.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: p.MD5, iterations: 1 }), init: function (d) { this.cfg = this.cfg.extend(d) }, compute: function (d, r) { for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;) { n && s.update(n); var n = s.update(d).finalize(r); s.reset(); for (var a = 1; a < p; a++)n = s.finalize(n), s.reset(); b.concat(n) } b.sigBytes = 4 * q; return b } }); u.EvpKDF = function (d, l, p) {
return s.create(p).compute(d,
l)
}
})();
CryptoJS.lib.Cipher || function (u) {
var p = CryptoJS, d = p.lib, l = d.Base, s = d.WordArray, t = d.BufferedBlockAlgorithm, r = p.enc.Base64, w = p.algo.EvpKDF, v = d.Cipher = t.extend({
cfg: l.extend(), createEncryptor: function (e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function (e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function (e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function () { t.reset.call(this); this._doReset() }, process: function (e) { this._append(e); return this._process() },
finalize: function (e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (e) { return { encrypt: function (b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function (b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } }
}); d.StreamCipher = v.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {}, x = function (e, a, b) {
var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++)e[a + d] ^=
c[d]
}, q = (d.BlockCipherMode = l.extend({ createEncryptor: function (e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function (e, a) { return this.Decryptor.create(e, a) }, init: function (e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function (e, a) { var b = this._cipher, c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({
processBlock: function (e, a) {
var b = this._cipher, c = b.blockSize, d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this,
e, a, c); this._prevBlock = d
}
}); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function (a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4)l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({
cfg: v.cfg.extend({ mode: b, padding: q }), reset: function () {
v.reset.call(this); var a = this.cfg, b = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a,
this, b && b.words)
}, _doProcessBlock: function (a, b) { this._mode.processBlock(a, b) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4
}); var n = d.CipherParams = l.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }), b = (p.format = {}).OpenSSL = {
stringify: function (a) {
var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684,
1701076831]).concat(a).concat(b) : b).toString(r)
}, parse: function (a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) }
}, a = d.SerializableCipher = l.extend({
cfg: l.extend({ format: b }), encrypt: function (a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) },
decrypt: function (a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function (a, b) { return "string" == typeof a ? b.parse(a, this) : a }
}), p = (p.kdf = {}).OpenSSL = { execute: function (a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({
cfg: a.cfg.extend({ kdf: p }), encrypt: function (b, c, d, l) {
l = this.cfg.extend(l); d = l.kdf.execute(d,
b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b
}, decrypt: function (b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) }
})
}();
(function () {
for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++)a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4, k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e], F = a[z], G = a[F], y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8,
16, 32, 64, 128, 27, 54], d = d.AES = p.extend({
_doReset: function () {
for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++)j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>>
8 & 255]] ^ n[l[k & 255]]
}, encryptBlock: function (a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function (a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function (a, b, c, d, e, j, l, f) {
for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++)var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++], s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++], t =
d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++], n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++], g = q, h = s, k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a[b] = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n
}, keySize: 8
}); u.AES = p._createHelper(d)
})();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 KiB

View File

@ -1,32 +0,0 @@
.el-tip {
position: fixed;
left: 50%;
top: 50%;
width: 500px;
padding: 8px 16px;
margin: 0;
margin-left: -250px;
margin-top: -60px;
box-sizing: border-box;
border-radius: 4px;
position: relative;
background-color: #fff;
overflow: hidden;
opacity: 1;
display: flex;
align-items: center;
transition: opacity .2s;
}
.el-tip--warning {
background-color: #fdf6ec;
color: #e6a23c;
}
.el-tip__title {
line-height: 18px;
}
.el-tip_img img{
width: 80px;
height: 80px;
}

View File

@ -1,47 +0,0 @@
function util() {
this.flag = true;
var body = document.body;
var safe = this;
var validVersion = function() {
var browser = navigator.appName
var b_version = navigator.appVersion
var version = b_version.split(";");
var trim_Version = version[1].replace(/[ ]/g, "");
if (trim_Version == 'WOW64') {
safe.flag = false
} else if (browser == "Microsoft Internet Explorer" && trim_Version == "MSIE6.0") {
safe.flag = false
} else if (browser == "Microsoft Internet Explorer" && trim_Version == "MSIE7.0") {
safe.flag = false
} else if (browser == "Microsoft Internet Explorer" && trim_Version == "MSIE8.0") {
safe.flag = false
} else if (browser == "Microsoft Internet Explorer" && trim_Version == "MSIE9.0") {
safe.flag = false
}
}
this.setBody = function() {
var str = '<div class="el-tip el-tip--warning" id="tip">' +
'<div class="el-tip_content">' +
'<span class="el-tip__title">' +
'您乘坐的浏览器版本太低了,你可以把浏览器从兼容模式调到极速模式' +
'<br /> 实在不行就换浏览器吧;' +
'</span>' +
'<div class="el-tip_img">' +
'<img src="/util/screen/huohu.png" alt="">' +
'<img src="/util/screen/guge.png" alt="">' +
'</div>' +
'</div>' +
'</div>';
body.innerHTML = str + body.innerHTML
}
this.init = function() {
validVersion(); //检测浏览器的版本
return this;
}
}
var creen = new util().init();
var flag = creen.flag;
if (!flag) {
creen.setBody();
}

23
src/App.vue Normal file → Executable file
View File

@ -1,29 +1,18 @@
<template> <template>
<div id="app">
<router-view /> <router-view />
</div>
</template> </template>
<script> <script>
export default { export default {
name: "app", }
data() {
return {};
},
watch: {},
created() {
},
methods: {},
computed: {}
};
</script> </script>
<style lang="scss">
<style>
html,
body,
#app { #app {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: hidden;
}
.avue--detail .el-col{
margin-bottom: 0;
} }
</style> </style>

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/region/list', url: '/blade-system/region/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getList = (current, size, params) => {
export const getLazyTree = (parentCode, params) => { export const getLazyTree = (parentCode, params) => {
return request({ return request({
url: '/api/blade-system/region/lazy-tree', url: '/blade-system/region/lazy-tree',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -25,7 +25,7 @@ export const getLazyTree = (parentCode, params) => {
export const getDetail = (code) => { export const getDetail = (code) => {
return request({ return request({
url: '/api/blade-system/region/detail', url: '/blade-system/region/detail',
method: 'get', method: 'get',
params: { params: {
code code
@ -35,7 +35,7 @@ export const getDetail = (code) => {
export const remove = (id) => { export const remove = (id) => {
return request({ return request({
url: '/api/blade-system/region/remove', url: '/blade-system/region/remove',
method: 'post', method: 'post',
params: { params: {
id, id,
@ -45,7 +45,7 @@ export const remove = (id) => {
export const submit = (row) => { export const submit = (row) => {
return request({ return request({
url: '/api/blade-system/region/submit', url: '/blade-system/region/submit',
method: 'post', method: 'post',
data: row data: row
}) })

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-desk/notice/list', url: '/blade-desk/notice/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -15,7 +15,7 @@ export const getList = (current, size, params) => {
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-desk/notice/remove', url: '/blade-desk/notice/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -26,7 +26,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-desk/notice/submit', url: '/blade-desk/notice/submit',
method: 'post', method: 'post',
data: row, data: row,
cryptoToken: false, cryptoToken: false,
@ -35,7 +35,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-desk/notice/submit', url: '/blade-desk/notice/submit',
method: 'post', method: 'post',
data: row, data: row,
cryptoToken: false, cryptoToken: false,
@ -44,7 +44,7 @@ export const update = (row) => {
export const getNotice = (id) => { export const getNotice = (id) => {
return request({ return request({
url: '/api/blade-desk/notice/detail', url: '/blade-desk/notice/detail',
method: 'get', method: 'get',
params: { params: {
id id

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getUsualList = (current, size) => { export const getUsualList = (current, size) => {
return request({ return request({
url: '/api/blade-log/usual/list', url: '/blade-log/usual/list',
method: 'get', method: 'get',
params: { params: {
current, current,
@ -13,7 +13,7 @@ export const getUsualList = (current, size) => {
export const getApiList = (current, size) => { export const getApiList = (current, size) => {
return request({ return request({
url: '/api/blade-log/api/list', url: '/blade-log/api/list',
method: 'get', method: 'get',
params: { params: {
current, current,
@ -24,7 +24,7 @@ export const getApiList = (current, size) => {
export const getErrorList = (current, size) => { export const getErrorList = (current, size) => {
return request({ return request({
url: '/api/blade-log/error/list', url: '/blade-log/error/list',
method: 'get', method: 'get',
params: { params: {
current, current,
@ -36,7 +36,7 @@ export const getErrorList = (current, size) => {
export const getUsualLogs = (id) => { export const getUsualLogs = (id) => {
return request({ return request({
url: '/api/blade-log/usual/detail', url: '/blade-log/usual/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -45,7 +45,7 @@ export const getUsualLogs = (id) => {
} }
export const getApiLogs = (id) => { export const getApiLogs = (id) => {
return request({ return request({
url: '/api/blade-log/api/detail', url: '/blade-log/api/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -54,7 +54,7 @@ export const getApiLogs = (id) => {
} }
export const getErrorLogs = (id) => { export const getErrorLogs = (id) => {
return request({ return request({
url: '/api/blade-log/error/detail', url: '/blade-log/error/detail',
method: 'get', method: 'get',
params: { params: {
id, id,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-report/report/rest/list', url: '/blade-report/report/rest/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-report/report/rest/remove', url: '/blade-report/report/rest/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/client/list', url: '/blade-system/client/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getList = (current, size, params) => {
export const getDetail = (id) => { export const getDetail = (id) => {
return request({ return request({
url: '/api/blade-system/client/detail', url: '/blade-system/client/detail',
method: 'get', method: 'get',
params: { params: {
id id
@ -24,7 +24,7 @@ export const getDetail = (id) => {
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/client/remove', url: '/blade-system/client/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -34,7 +34,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/client/submit', url: '/blade-system/client/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -42,7 +42,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/client/submit', url: '/blade-system/client/submit',
method: 'post', method: 'post',
data: row data: row
}) })

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/dept/list', url: '/blade-system/dept/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/dept/remove', url: '/blade-system/dept/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/dept/submit', url: '/blade-system/dept/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/dept/submit', url: '/blade-system/dept/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -39,7 +39,7 @@ export const update = (row) => {
export const getDept = (id) => { export const getDept = (id) => {
return request({ return request({
url: '/api/blade-system/dept/detail', url: '/blade-system/dept/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -48,7 +48,7 @@ export const getDept = (id) => {
} }
export const getDeptTree = (tenantId) => { export const getDeptTree = (tenantId) => {
return request({ return request({
url: '/api/blade-system/dept/tree', url: '/blade-system/dept/tree',
method: 'get', method: 'get',
params: { params: {
tenantId, tenantId,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/dict/list', url: '/blade-system/dict/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/dict/remove', url: '/blade-system/dict/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/dict/submit', url: '/blade-system/dict/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/dict/submit', url: '/blade-system/dict/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -40,7 +40,7 @@ export const update = (row) => {
export const getDict = (id) => { export const getDict = (id) => {
return request({ return request({
url: '/api/blade-system/dict/detail', url: '/blade-system/dict/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -49,7 +49,7 @@ export const getDict = (id) => {
} }
export const getDictTree = () => { export const getDictTree = () => {
return request({ return request({
url: '/api/blade-system/dict/tree?code=DICT', url: '/blade-system/dict/tree?code=DICT',
method: 'get' method: 'get'
}) })
} }

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/menu/list', url: '/blade-system/menu/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/menu/remove', url: '/blade-system/menu/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/menu/submit', url: '/blade-system/menu/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/menu/submit', url: '/blade-system/menu/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -39,7 +39,7 @@ export const update = (row) => {
export const getMenu = (id) => { export const getMenu = (id) => {
return request({ return request({
url: '/api/blade-system/menu/detail', url: '/blade-system/menu/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -49,7 +49,7 @@ export const getMenu = (id) => {
export const getLazyMenuList = (parentId, params) => { export const getLazyMenuList = (parentId, params) => {
return request({ return request({
url: '/api/blade-system/menu/lazy-menu-list', url: '/blade-system/menu/lazy-menu-list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/param/list', url: '/blade-system/param/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/param/remove', url: '/blade-system/param/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/param/submit', url: '/blade-system/param/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/param/submit', url: '/blade-system/param/submit',
method: 'post', method: 'post',
data: row data: row
}) })

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/post/list', url: '/blade-system/post/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getList = (current, size, params) => {
export const getPostList = (tenantId) => { export const getPostList = (tenantId) => {
return request({ return request({
url: '/api/blade-system/post/select', url: '/blade-system/post/select',
method: 'get', method: 'get',
params: { params: {
tenantId tenantId
@ -24,7 +24,7 @@ export const getPostList = (tenantId) => {
export const getDetail = (id) => { export const getDetail = (id) => {
return request({ return request({
url: '/api/blade-system/post/detail', url: '/blade-system/post/detail',
method: 'get', method: 'get',
params: { params: {
id id
@ -34,7 +34,7 @@ export const getDetail = (id) => {
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/post/remove', url: '/blade-system/post/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -44,7 +44,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/post/submit', url: '/blade-system/post/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -52,7 +52,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/post/submit', url: '/blade-system/post/submit',
method: 'post', method: 'post',
data: row data: row
}) })

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/role/list', url: '/blade-system/role/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,14 +13,14 @@ export const getList = (current, size, params) => {
} }
export const grantTree = () => { export const grantTree = () => {
return request({ return request({
url: '/api/blade-system/menu/grant-tree', url: '/blade-system/menu/grant-tree',
method: 'get', method: 'get',
}) })
} }
export const grant = (roleIds, menuIds, dataScopeIds) => { export const grant = (roleIds, menuIds, dataScopeIds) => {
return request({ return request({
url: '/api/blade-system/role/grant', url: '/blade-system/role/grant',
method: 'post', method: 'post',
data: { data: {
roleIds, roleIds,
@ -32,7 +32,7 @@ export const grant = (roleIds, menuIds, dataScopeIds) => {
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/role/remove', url: '/blade-system/role/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -42,7 +42,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/role/submit', url: '/blade-system/role/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -50,7 +50,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/role/submit', url: '/blade-system/role/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -59,7 +59,7 @@ export const update = (row) => {
export const getRole = (roleIds) => { export const getRole = (roleIds) => {
return request({ return request({
url: '/api/blade-system/menu/role-tree-keys', url: '/blade-system/menu/role-tree-keys',
method: 'get', method: 'get',
params: { params: {
roleIds, roleIds,
@ -69,7 +69,7 @@ export const getRole = (roleIds) => {
export const getRoleTree = (tenantId) => { export const getRoleTree = (tenantId) => {
return request({ return request({
url: '/api/blade-system/role/tree', url: '/blade-system/role/tree',
method: 'get', method: 'get',
params: { params: {
tenantId, tenantId,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getListDataScope = (current, size, params) => { export const getListDataScope = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/data-scope/list', url: '/blade-system/data-scope/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getListDataScope = (current, size, params) => {
export const removeDataScope = (ids) => { export const removeDataScope = (ids) => {
return request({ return request({
url: '/api/blade-system/data-scope/remove', url: '/blade-system/data-scope/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -24,7 +24,7 @@ export const removeDataScope = (ids) => {
export const addDataScope = (row) => { export const addDataScope = (row) => {
return request({ return request({
url: '/api/blade-system/data-scope/submit', url: '/blade-system/data-scope/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -32,7 +32,7 @@ export const addDataScope = (row) => {
export const updateDataScope = (row) => { export const updateDataScope = (row) => {
return request({ return request({
url: '/api/blade-system/data-scope/submit', url: '/blade-system/data-scope/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -40,7 +40,7 @@ export const updateDataScope = (row) => {
export const getMenuDataScope = (id) => { export const getMenuDataScope = (id) => {
return request({ return request({
url: '/api/blade-system/data-scope/detail', url: '/blade-system/data-scope/detail',
method: 'get', method: 'get',
params: { params: {
id, id,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-system/tenant/list', url: '/blade-system/tenant/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-system/tenant/remove', url: '/blade-system/tenant/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-system/tenant/submit', url: '/blade-system/tenant/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-system/tenant/submit', url: '/blade-system/tenant/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -39,7 +39,7 @@ export const update = (row) => {
export const info = (domain) => { export const info = (domain) => {
return request({ return request({
url: '/api/blade-system/tenant/info', url: '/blade-system/tenant/info',
method: 'get', method: 'get',
params: { params: {
domain domain

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-user/list', url: '/blade-user/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -13,7 +13,7 @@ export const getList = (current, size, params) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-user/remove', url: '/blade-user/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -23,7 +23,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-user/submit', url: '/blade-user/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -31,7 +31,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-user/update', url: '/blade-user/update',
method: 'post', method: 'post',
data: row data: row
}) })
@ -39,7 +39,7 @@ export const update = (row) => {
export const grant = (userIds, roleIds) => { export const grant = (userIds, roleIds) => {
return request({ return request({
url: '/api/blade-user/grant', url: '/blade-user/grant',
method: 'post', method: 'post',
params: { params: {
userIds, userIds,
@ -50,7 +50,7 @@ export const grant = (userIds, roleIds) => {
export const getUser = (id) => { export const getUser = (id) => {
return request({ return request({
url: '/api/blade-user/detail', url: '/blade-user/detail',
method: 'get', method: 'get',
params: { params: {
id, id,
@ -60,14 +60,14 @@ export const getUser = (id) => {
export const getUserInfo = () => { export const getUserInfo = () => {
return request({ return request({
url: '/api/blade-user/info', url: '/blade-user/info',
method: 'get', method: 'get',
}) })
} }
export const resetPassword = (userIds) => { export const resetPassword = (userIds) => {
return request({ return request({
url: '/api/blade-user/reset-password', url: '/blade-user/reset-password',
method: 'post', method: 'post',
params: { params: {
userIds, userIds,
@ -77,7 +77,7 @@ export const resetPassword = (userIds) => {
export const updatePassword = (oldPassword, newPassword, newPassword1) => { export const updatePassword = (oldPassword, newPassword, newPassword1) => {
return request({ return request({
url: '/api/blade-user/update-password', url: '/blade-user/update-password',
method: 'post', method: 'post',
params: { params: {
oldPassword, oldPassword,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-develop/code/list', url: '/blade-develop/code/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getList = (current, size, params) => {
export const build = (ids) => { export const build = (ids) => {
return request({ return request({
url: '/api/blade-develop/code/gen-code', url: '/blade-develop/code/gen-code',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -24,7 +24,7 @@ export const build = (ids) => {
} }
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-develop/code/remove', url: '/blade-develop/code/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -34,7 +34,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-develop/code/submit', url: '/blade-develop/code/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -42,7 +42,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-develop/code/submit', url: '/blade-develop/code/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -50,7 +50,7 @@ export const update = (row) => {
export const copy = (id) => { export const copy = (id) => {
return request({ return request({
url: '/api/blade-develop/code/copy', url: '/blade-develop/code/copy',
method: 'post', method: 'post',
params: { params: {
id, id,
@ -60,7 +60,7 @@ export const copy = (id) => {
export const getCode = (id) => { export const getCode = (id) => {
return request({ return request({
url: '/api/blade-develop/code/detail', url: '/blade-develop/code/detail',
method: 'get', method: 'get',
params: { params: {
id, id,

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = (current, size, params) => {
return request({ return request({
url: '/api/blade-develop/datasource/list', url: '/blade-develop/datasource/list',
method: 'get', method: 'get',
params: { params: {
...params, ...params,
@ -14,7 +14,7 @@ export const getList = (current, size, params) => {
export const getDetail = (id) => { export const getDetail = (id) => {
return request({ return request({
url: '/api/blade-develop/datasource/detail', url: '/blade-develop/datasource/detail',
method: 'get', method: 'get',
params: { params: {
id id
@ -24,7 +24,7 @@ export const getDetail = (id) => {
export const remove = (ids) => { export const remove = (ids) => {
return request({ return request({
url: '/api/blade-develop/datasource/remove', url: '/blade-develop/datasource/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
@ -34,7 +34,7 @@ export const remove = (ids) => {
export const add = (row) => { export const add = (row) => {
return request({ return request({
url: '/api/blade-develop/datasource/submit', url: '/blade-develop/datasource/submit',
method: 'post', method: 'post',
data: row data: row
}) })
@ -42,7 +42,7 @@ export const add = (row) => {
export const update = (row) => { export const update = (row) => {
return request({ return request({
url: '/api/blade-develop/datasource/submit', url: '/blade-develop/datasource/submit',
method: 'post', method: 'post',
data: row data: row
}) })

View File

@ -1,8 +1,8 @@
import request from '@/router/axios'; import request from '@/axios';
import website from "@/config/website"; import website from "@/config/website";
export const loginByUsername = (tenantId, account, password, type, key, code) => request({ export const loginByUsername = (tenantId, account, password, type, key, code) => request({
url: '/api/blade-auth/token', url: '/blade-auth/token',
method: 'post', method: 'post',
headers: { headers: {
'Captcha-Key': key, 'Captcha-Key': key,
@ -18,7 +18,7 @@ export const loginByUsername = (tenantId, account, password, type, key, code) =>
}); });
export const loginBySocial = (tenantId, source, code, state) => request({ export const loginBySocial = (tenantId, source, code, state) => request({
url: '/api/blade-auth/token', url: '/blade-auth/token',
method: 'post', method: 'post',
headers: { headers: {
'Tenant-Id': tenantId 'Tenant-Id': tenantId
@ -34,7 +34,7 @@ export const loginBySocial = (tenantId, source, code, state) => request({
}); });
export const getButtons = () => request({ export const getButtons = () => request({
url: '/api/blade-system/menu/buttons', url: '/blade-system/menu/buttons',
method: 'get' method: 'get'
}); });
@ -44,7 +44,7 @@ export const getUserInfo = () => request({
}); });
export const refreshToken = (refreshToken) => request({ export const refreshToken = (refreshToken) => request({
url: '/api/blade-auth/token', url: '/blade-auth/token',
method: 'post', method: 'post',
params: { params: {
refreshToken, refreshToken,
@ -54,7 +54,7 @@ export const refreshToken = (refreshToken) => request({
}) })
export const registerGuest = (form, oauthId) => request({ export const registerGuest = (form, oauthId) => request({
url: '/api/blade-user/register-guest', url: '/blade-user/register-guest',
method: 'post', method: 'post',
params: { params: {
tenantId: form.tenantId, tenantId: form.tenantId,
@ -66,12 +66,12 @@ export const registerGuest = (form, oauthId) => request({
}); });
export const getMenu = () => request({ export const getMenu = () => request({
url: '/api/blade-system/menu/routes', url: '/blade-system/menu/routes',
method: 'get' method: 'get'
}); });
export const getCaptcha = () => request({ export const getCaptcha = () => request({
url: '/api/blade-auth/captcha', url: '/blade-auth/captcha',
method: 'get' method: 'get'
}); });

26
src/router/axios.js → src/axios.js Normal file → Executable file
View File

@ -7,15 +7,17 @@
*/ */
import axios from 'axios' import axios from 'axios'
import store from '@/store/'; import store from '@/store/';
import router from '@/router/router' import router from '@/router/'
import {serialize} from '@/util/util' import { serialize } from 'utils/util'
import {getToken} from '@/util/auth' import { getToken } from 'utils/auth'
import {Message} from 'element-ui' import { ElMessage } from 'element-plus'
import website from '@/config/website'; import website from '@/config/website';
import NProgress from 'nprogress' // progress bar import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style import 'nprogress/nprogress.css' // progress bar style
import {Base64} from 'js-base64'; import { Base64 } from 'js-base64';
import crypto from "@/util/crypto"; import { isURL } from 'utils/validate';
import { baseUrl } from '@/config/env';
import crypto from '@/utils/crypto';
axios.defaults.timeout = 10000; axios.defaults.timeout = 10000;
//返回其他状态吗 //返回其他状态吗
@ -31,14 +33,18 @@ NProgress.configure({
//HTTPrequest拦截 //HTTPrequest拦截
axios.interceptors.request.use(config => { axios.interceptors.request.use(config => {
NProgress.start() // start progress bar NProgress.start() // start progress bar
//地址为已经配置状态则不添加前缀
if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
config.url = baseUrl + config.url;
}
const meta = (config.meta || {}); const meta = (config.meta || {});
const isToken = meta.isToken === false;
config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`; config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
//headers传递token是否加密 //headers传递token是否加密
const isToken = meta.isToken === false;
const cryptoToken = config.cryptoToken === true; const cryptoToken = config.cryptoToken === true;
const token = getToken(); const token = getToken();
if (token && !isToken) { if (token && !isToken) {
config.headers['Blade-Auth'] = cryptoToken config.headers[website.Authorization] = cryptoToken
? 'crypto ' + crypto.encrypt(token) ? 'crypto ' + crypto.encrypt(token)
: 'bearer ' + token; : 'bearer ' + token;
} }
@ -59,10 +65,10 @@ axios.interceptors.response.use(res => {
//如果在白名单里则自行catch逻辑处理 //如果在白名单里则自行catch逻辑处理
if (statusWhiteList.includes(status)) return Promise.reject(res); if (statusWhiteList.includes(status)) return Promise.reject(res);
//如果是401则跳转到登录页面 //如果是401则跳转到登录页面
if (status === 401) store.dispatch('FedLogOut').then(() => router.push({path: '/login'})); if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
// 如果请求为非200否者默认统一处理 // 如果请求为非200否者默认统一处理
if (status !== 200) { if (status !== 200) {
Message({ ElMessage({
message: message, message: message,
type: 'error' type: 'error'
}) })

View File

@ -0,0 +1,126 @@
<template>
<div class="basic-block"
:style="styleName">
<div class="box"
:style="boxStyleName">
<router-link :to="to">
<span v-text="text"></span>
<p v-text="dept"></p>
<i :class="icon"></i>
</router-link>
</div>
</div>
</template>
<script>
export default {
name: 'basicBlock',
props: {
icon: {
type: String,
},
background: {
type: String,
},
to: {
type: Object,
default: () => {
return {}
}
},
text: {
type: String,
},
dept: {
type: String,
},
time: {
type: [Number, String]
},
gutter: {
type: [Number, String],
default: 5,
},
color: {
type: String,
},
width: {
type: [Number, String]
},
height: {
type: [Number, String]
}
},
computed: {
styleName () {
return {
animationDelay: `${this.time / 25}s`,
width: `${this.width}px`,
height: `${this.height}px`,
margin: `${this.gutter}px`,
}
},
boxStyleName () {
return {
backgroundColor: this.color,
backgroundImage: `url('${this.background}')`,
}
}
}
}
</script>
<style lang="scss">
.basic-block {
opacity: 0;
box-sizing: border-box;
color: #fff;
animation: mymove 1s;
animation-fill-mode: forwards;
.box {
position: relative;
box-sizing: border-box;
padding: 15px;
width: 100%;
height: 100%;
transition: all 1s;
background-size: cover;
&:hover {
transform: rotateY(360deg);
}
}
a {
color: #fff;
}
span {
display: block;
font-size: 16px;
}
p {
width: 80%;
font-size: 10px;
color: #eee;
line-height: 22px;
}
i {
position: absolute;
bottom: 15px;
right: 15px;
font-size: 50px !important ;
}
@keyframes mymove {
from {
opacity: 0;
transform: scale(0);
}
to {
opacity: 1;
transform: scale(1);
}
}
}
</style>

38
src/components/basic-container/main.vue Normal file → Executable file
View File

@ -1,6 +1,8 @@
<template> <template>
<div class="basic-container"> <div class="basic-container"
<el-card> :style="styleName"
:class="{'basic-container--block':block}">
<el-card class="basic-container__card">
<slot></slot> <slot></slot>
</el-card> </el-card>
</div> </div>
@ -8,16 +10,42 @@
<script> <script>
export default { export default {
name: "basicContainer" name: "basicContainer",
props: {
radius: {
type: [String, Number],
default: 10
},
background: {
type: String
},
block: {
type: Boolean,
default: false
}
},
computed: {
styleName () {
return {
borderRadius: `${this.radius}px`,
background: this.background,
}
}
}
}; };
</script> </script>
<style lang="scss"> <style lang="scss">
.basic-container { .basic-container {
padding: 10px 6px; padding: 10px 6px;
border-radius: 10px;
box-sizing: border-box; box-sizing: border-box;
.el-card { &--block {
height: 100%;
.basic-container__card {
height: 100%;
}
}
&__card {
width: 100%; width: 100%;
} }
&:first-child { &:first-child {

View File

@ -0,0 +1,139 @@
<template>
<div :style="styleName"
class="basic-video">
<div class="basic-video__border">
<span :style="borderStyleName"></span>
<span :style="borderStyleName"></span>
<span :style="borderStyleName"></span>
<span :style="borderStyleName"></span>
</div>
<img :style="imgStyleName"
class="basic-video__img"
:src="background" />
<video class="basic-video__main"
ref="main"
autoplay
muted></video>
</div>
</template>
<script>
import RecordVideo from './plugin'
export default {
name: 'basic-video',
props: {
background: {
type: String
},
width: {
type: [String, Number],
default: 500
}
},
computed: {
styleName () {
return {
width: `${this.width}px`
}
},
imgStyleName () {
return {
width: `${this.width / 2}px`
}
},
borderStyleName () {
return {
width: `${this.width / 15}px`,
height: `${this.width / 15}px`,
borderWidth: `${5}px`
}
},
},
data () {
return {
videoObj: null
}
},
mounted () {
this.init();
},
methods: {
init () {
this.videoObj = new RecordVideo(this.$refs.main);
const videoPromise = this.videoObj.init();
videoPromise
.then(() => {
this.videoObj.mediaRecorder.addEventListener('stop', this.getData, false);
})
},
startRecord () {
this.videoObj.startRecord()
},
stopRecord () {
this.videoObj.stopRecord();
},
getData () {
const blob = new Blob(this.videoObj.chunks, {
type: 'video/mp4'
});
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.addEventListener('loadend', () => {
var video_base64 = reader.result;
this.$emit('data-change', video_base64)
});
}
}
}
</script>
<style lang="scss" scoped>
.basic-video {
margin: 0 auto;
position: relative;
overflow: hidden;
&__border {
span {
position: absolute;
width: 30px;
height: 30px;
border-width: 4px;
color: #0073eb;
border-style: solid;
&:nth-child(1) {
left: 15px;
top: 15px;
border-right: 0;
border-bottom: 0;
}
&:nth-child(2) {
right: 15px;
top: 15px;
border-left: 0;
border-bottom: 0;
}
&:nth-child(3) {
bottom: 15px;
left: 15px;
border-right: 0;
border-top: 0;
}
&:nth-child(4) {
bottom: 15px;
right: 15px;
border-left: 0;
border-top: 0;
}
}
}
&__img {
width: 100px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
&__main {
width: 100%;
}
}
</style>

View File

@ -0,0 +1,90 @@
export default class RecordVideo {
/**
* 构造函数
*
* @param {Object} videoObj 视频对象
*/
constructor(videoObj) {
this.video = videoObj;
this.mediaRecorder = null;
this.chunks = [];
}
/**
* 初始化
*
* @return {Object} promise
*/
init () {
// 返回Promise对象
// resolve 正常处理
// reject 处理异常情况
return new Promise((resovle, reject) => {
navigator
.mediaDevices
.getUserMedia({
audio: true,
video: true
// video: {
// width: this.videoWidth,
// height: this.videoHeight
// }
})
// 返回一个媒体内容的流
.then(stream => {
// 检测是否支持 srcObject该属性在新的浏览器支持
if ('srcObject' in this.video) {
this.video.srcObject = stream;
} else {
// 兼容旧的浏览器
this.video.src = window.URL.createObjectURL(stream);
}
// 当视频的元数据已经加载时触发
this.video.addEventListener('loadmetadata', () => {
this.video.play();
});
this.mediaRecorder = new MediaRecorder(stream);
this.mediaRecorder.addEventListener('dataavailable', e => {
this.chunks.push(e.data);
});
resovle();
})
// 异常抓取,包括用于禁用麦克风、摄像头
.catch(error => {
reject(error);
});
});
}
/**
* 视频开始录制
*/
startRecord () {
if (this.mediaRecorder.state === 'inactive') {
this.mediaRecorder.start();
}
}
/**
* 视频结束录制
*/
stopRecord () {
if (this.mediaRecorder.state === 'recording') {
this.mediaRecorder.stop();
}
}
/**
* 检测当前浏览器对否支持
*
* @return {boolean} 当前浏览器是否支持
*/
isSupport () {
const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia;
if (flag) {
return true;
}
}
}

2
src/components/error-page/403.vue Normal file → Executable file
View File

@ -1,7 +1,7 @@
<template> <template>
<div class="error-page"> <div class="error-page">
<div class="img" <div class="img"
style=" background-image: url('/img/bg/403.svg');"></div> style=" background-image: url('/img/403.svg');"></div>
<div class="content"> <div class="content">
<h1>403</h1> <h1>403</h1>
<div class="desc">抱歉你无权访问该页面</div> <div class="desc">抱歉你无权访问该页面</div>

2
src/components/error-page/404.vue Normal file → Executable file
View File

@ -1,7 +1,7 @@
<template> <template>
<div class="error-page"> <div class="error-page">
<div class="img" <div class="img"
style=" background-image: url('/img/bg/404.svg');"></div> style=" background-image: url('/img/404.svg');"></div>
<div class="content"> <div class="content">
<h1>404</h1> <h1>404</h1>
<div class="desc">抱歉你访问的页面不存在</div> <div class="desc">抱歉你访问的页面不存在</div>

2
src/components/error-page/500.vue Normal file → Executable file
View File

@ -1,7 +1,7 @@
<template> <template>
<div class="error-page"> <div class="error-page">
<div class="img" <div class="img"
style=" background-image: url('/img/bg/500.svg');"></div> style=" background-image: url('/img/500.svg');"></div>
<div class="content"> <div class="content">
<h1>500</h1> <h1>500</h1>
<div class="desc">抱歉服务器出错了</div> <div class="desc">抱歉服务器出错了</div>

0
src/components/error-page/style.scss Normal file → Executable file
View File

71
src/components/iframe/main.vue Normal file → Executable file
View File

@ -2,84 +2,46 @@
<basic-container> <basic-container>
<iframe :src="src" <iframe :src="src"
class="iframe" class="iframe"
ref="iframe"></iframe> ref="iframe" />
</basic-container> </basic-container>
</template> </template>
<script> <script>
import { mapGetters } from "vuex";
import NProgress from "nprogress"; // progress bar import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style import "nprogress/nprogress.css"; // progress bar style
export default { export default {
name: "AvueIframe", name: "AvueIframe",
data() { data () {
return { return {};
urlPath: this.getUrlPath() //iframe src
};
}, },
created() { created () {
NProgress.configure({ showSpinner: false }); NProgress.configure({ showSpinner: false });
}, },
mounted() { mounted () {
this.load(); this.load();
this.resize();
}, },
props: ["routerPath"],
watch: { watch: {
$route: function() { $route: function () {
this.load(); this.load();
},
routerPath: function() {
// routerPathsrc
this.urlPath = this.getUrlPath();
} }
}, },
computed: { computed: {
...mapGetters(["screen"]), src () {
src() { return this.$route.query.url.replace(/#/g, "&")
return this.$route.query.src
? this.$route.query.src.replace("$", "#")
: this.urlPath;
} }
}, },
methods: { methods: {
// //
show() { show () {
NProgress.start(); NProgress.start();
}, },
// //
hide() { hide () {
NProgress.done(); NProgress.done();
}, },
//
resize() {
window.onresize = () => {
this.iframeInit();
};
},
// //
load() { load () {
this.show(); this.show();
var flag = true; //URL
if (this.$route.query.src.indexOf("?") == -1) {
flag = false;
}
var list = [];
for (var key in this.$route.query) {
if (key != "src" && key != "name" && key != "i18n") {
list.push(`${key}= this.$route.query[key]`);
}
}
list = list.join("&").toString();
if (flag) {
this.$route.query.src = `${this.$route.query.src}${
list.length > 0 ? `&list` : ""
}`;
} else {
this.$route.query.src = `${this.$route.query.src}${
list.length > 0 ? `?list` : ""
}`;
}
//3s //3s
let time = 3; let time = 3;
const timeFunc = setInterval(() => { const timeFunc = setInterval(() => {
@ -92,10 +54,9 @@ export default {
this.iframeInit(); this.iframeInit();
}, },
//iframe //iframe
iframeInit() { iframeInit () {
const iframe = this.$refs.iframe; const iframe = this.$refs.iframe;
const clientHeight = const clientHeight = document.documentElement.clientHeight - 150;
document.documentElement.clientHeight - (screen > 1 ? 200 : 130);
if (!iframe) return; if (!iframe) return;
iframe.style.height = `${clientHeight}px`; iframe.style.height = `${clientHeight}px`;
if (iframe.attachEvent) { if (iframe.attachEvent) {
@ -107,12 +68,6 @@ export default {
this.hide(); this.hide();
}; };
} }
},
getUrlPath: function() {
// iframe src
let url = window.location.href;
url = url.replace("/myiframe", "");
return url;
} }
} }
}; };

View File

@ -1,42 +1,53 @@
<template> <template>
<el-dialog title="账号注册" <el-dialog title="账号注册"
append-to-body append-to-body
:visible.sync="accountBox" v-model="accountBox"
:close-on-click-modal="false" :close-on-click-modal="false"
:close-on-press-escape="false" :close-on-press-escape="false"
:show-close="false" :show-close="false"
width="20%"> width="20%">
<el-form :model="form" ref="form" label-width="80px"> <el-form :model="form"
ref="form"
label-width="80px">
<el-form-item label="租户编号"> <el-form-item label="租户编号">
<el-input v-model="form.tenantId" placeholder="请输入租户编号"></el-input> <el-input v-model="form.tenantId"
placeholder="请输入租户编号"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="用户姓名"> <el-form-item label="用户姓名">
<el-input v-model="form.name" placeholder="请输入用户姓名"></el-input> <el-input v-model="form.name"
placeholder="请输入用户姓名"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="账号名称"> <el-form-item label="账号名称">
<el-input v-model="form.account" placeholder="请输入账号名称"></el-input> <el-input v-model="form.account"
placeholder="请输入账号名称"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="账号密码"> <el-form-item label="账号密码">
<el-input v-model="form.password" placeholder="请输入账号密码"></el-input> <el-input v-model="form.password"
placeholder="请输入账号密码"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="确认密码"> <el-form-item label="确认密码">
<el-input v-model="form.password2" placeholder="请输入确认密码"></el-input> <el-input v-model="form.password2"
placeholder="请输入确认密码"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <template #footer>
<el-button type="primary" :loading="loading" @click="handleRegister"> </el-button> <span class="dialog-footer">
<el-button type="primary"
:loading="loading"
@click="handleRegister"> </el-button>
</span> </span>
</template>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import {mapGetters} from "vuex"; import { mapGetters } from "vuex";
import {validatenull} from "@/util/validate"; import { validatenull } from "@/utils/validate";
import {registerGuest} from "@/api/user"; import { registerGuest } from "@/api/user";
export default { export default {
name: "thirdRegister", name: "thirdRegister",
data() { data () {
return { return {
form: { form: {
tenantId: '', tenantId: '',
@ -52,10 +63,10 @@
computed: { computed: {
...mapGetters(["userInfo"]), ...mapGetters(["userInfo"]),
}, },
created() { created () {
}, },
mounted() { mounted () {
console.log(this.userInfo) console.log(this.userInfo)
// //
if (validatenull(this.userInfo.userId) || this.userInfo.userId < 0) { if (validatenull(this.userInfo.userId) || this.userInfo.userId < 0) {
@ -65,7 +76,7 @@
} }
}, },
methods: { methods: {
handleRegister() { handleRegister () {
if (this.form.tenantId === '') { if (this.form.tenantId === '') {
this.$message.warning("请先输入租户编号"); this.$message.warning("请先输入租户编号");
return; return;
@ -90,7 +101,7 @@
this.accountBox = false; this.accountBox = false;
this.$alert("注册申请已提交,请耐心等待管理员通过!", '注册提示').then(() => { this.$alert("注册申请已提交,请耐心等待管理员通过!", '注册提示').then(() => {
this.$store.dispatch("LogOut").then(() => { this.$store.dispatch("LogOut").then(() => {
this.$router.push({path: "/login"}); this.$router.push({ path: "/login" });
}); });
}) })
} else { } else {
@ -102,5 +113,5 @@
}); });
}, },
}, },
}; };
</script> </script>

23
src/config/env.js Normal file → Executable file
View File

@ -1,21 +1,2 @@
// 配置编译环境和线上环境之间的切换 let baseUrl = import.meta.env.VITE_APP_API
export { baseUrl }
let baseUrl = '';
let iconfontVersion = ['567566_pwc3oottzol', '1066523_6bvkeuqao36'];
let iconfontUrl = `//at.alicdn.com/t/font_$key.css`;
let codeUrl = `${baseUrl}/code`
const env = process.env
if (env.NODE_ENV == 'development') {
baseUrl = ``; // 开发环境地址
} else if (env.NODE_ENV == 'production') {
baseUrl = ``; //生产环境地址
} else if (env.NODE_ENV == 'test') {
baseUrl = ``; //测试环境地址
}
export {
baseUrl,
iconfontUrl,
iconfontVersion,
codeUrl,
env
}

41
src/config/website.js Normal file → Executable file
View File

@ -3,39 +3,44 @@
*/ */
export default { export default {
title: "saber", title: "saber",
logo: "A",
key: 'saber',//配置主键,目前用于存储
indexTitle: 'Saber Admin', indexTitle: 'Saber Admin',
clientId: 'saber', // 客户端id clientId: 'saber', // 客户端id
clientSecret: 'saber_secret', // 客户端密钥 clientSecret: 'saber_secret', // 客户端密钥
tenantMode: true, // 是否开启租户模式 tenantMode: true, // 是否开启租户模式
captchaMode: true, // 是否开启验证码模式 captchaMode: true, // 是否开启验证码模式
logo: "S", tokenTime: 3000,//token过期时间
key: 'saber',//配置主键,目前用于存储 Authorization: 'Blade-Auth',
lockPage: '/lock',
tokenTime: 100,
//http的status默认放行不才用统一处理的, //http的status默认放行不才用统一处理的,
statusWhiteList: [], statusWhiteList: [],
//配置首页不可关闭 //配置首页不可关闭
isFirstPage: false, setting: {
fistPage: { sidebar: 'vertical',
label: "首页", tag: true,
value: "/wel/index", debug: true,
params: {}, collapse: true,
query: {}, search: true,
meta: { lock: true,
i18n: 'dashboard' screenshot: true,
fullscren: true,
theme: true,
menu: true
}, },
group: [], fistPage: {
close: false name: "首页",
path: "/wel/index"
}, },
//配置菜单的属性 //配置菜单的属性
menu: { menu: {
iconDefault: 'iconfont icon-caidan', iconDefault: 'icon-caidan',
props: {
label: 'name', label: 'name',
path: 'path', path: 'path',
icon: 'source', icon: 'source',
children: 'children' children: 'children',
} query: 'query',
href: 'path',
meta: 'meta'
}, },
//auth配置 //auth配置
auth: { auth: {

0
src/docker/Dockerfile Normal file → Executable file
View File

10
src/error.js Normal file → Executable file
View File

@ -1,8 +1,7 @@
import Vue from 'vue';
import store from './store' import store from './store'
Vue.config.errorHandler = function(err, vm, info) { export default {
install: (app) => {
Vue.nextTick(() => { app.config.errorHandler = (err, vm, info) => {
store.commit('ADD_LOGS', { store.commit('ADD_LOGS', {
type: 'error', type: 'error',
message: err.message, message: err.message,
@ -20,5 +19,6 @@ Vue.config.errorHandler = function(err, vm, info) {
console.log(err) console.log(err)
console.groupEnd(); console.groupEnd();
} }
}) }
}
} }

142
src/lang/en.js Normal file → Executable file
View File

@ -1,106 +1,101 @@
export default { export default {
title: 'Saber Admin', title: 'Avue is a framework',
tip: 'tip',
logoutTip: 'Exit the system, do you want to continue?', logoutTip: 'Exit the system, do you want to continue?',
submitText: 'submit', submitText: 'submit',
cancelText: 'cancel', cancelText: 'cancel',
search: 'Please input search content', search: 'Please input search content',
menuTip: 'none menu list', menuTip: 'none menu list',
common: { feedback: 'feedback',
condition: 'condition', submit: 'submit',
display: 'display', wel: {
hide: 'hide' info: 'Good morning, Smallwei, Avue is a framework',
dept: 'a certain technology department',
team: 'Team ranking',
project: 'Project access',
count: 'Item number',
data: {
subtitle: 'real time',
column1: 'Classified statistics',
column2: 'Annex statistics',
column3: 'Article statistics',
key1: 'C',
key2: 'A',
key3: 'A',
text1: 'Total Record Number of Classifications',
text2: 'Number of attachments Uploaded',
text3: 'Comment frequency'
}, },
tip: { data2: {
select: 'Please select', column1: 'Registration today',
input: 'Please input' column2: 'Login today',
column3: 'Subscription today',
column4: 'Todays review'
}, },
upload: { data3: {
upload: 'upload', column1: 'Conversion rateDay 28%',
tip: 'Drag files here/' column2: 'Attendance rateDay 11%',
column3: 'Attendance rateDay 33%'
}, },
date: { data4: {
start: 'Start date', column1: 'Error log',
end: 'End date', column2: 'Data display',
t: 'today', column3: 'Privilege management',
y: 'yesterday', column4: 'user management'
n: 'nearly 7',
a: 'whole'
}, },
form: { table: {
printBtn: 'print', rw: 'Work Tasks',
mockBtn: 'mock', nr: 'Work content',
submitBtn: 'submit', sj: 'Working hours',
emptyBtn: 'empty' }
}, },
crud: { route: {
filter: { setting: 'setting',
addBtn: 'add', detail: 'detail',
clearBtn: 'clear', info: 'info',
resetBtn: 'reset', website: 'website',
cancelBtn: 'cancel', dashboard: 'dashboard',
submitBtn: 'submit' more: 'more',
}, tags: 'tags',
column: { store: 'store',
name: 'name', permission: 'permission',
hide: 'hide', api: 'api',
fixed: 'fixed', logs: 'logs',
filters: 'filters', table: 'table',
sortable: 'sortable', crud: 'crud',
index: 'index', params: 'params',
width: 'width' form: 'form',
}, top: 'backtop',
tipStartTitle: 'Currently selected', affix: 'affix',
tipEndTitle: 'items', data: 'data',
editTitle: 'edit', cache: 'cache',
copyTitle: 'copy', error: 'error',
addTitle: 'add', test: 'test',
viewTitle: 'view', out: 'out',
filterTitle: 'filter', about: 'about'
showTitle: 'showTitle',
menu: 'menu',
addBtn: 'add',
show: 'show',
hide: 'hide',
open: 'open',
shrink: 'shrink',
printBtn: 'print',
excelBtn: 'excel',
updateBtn: 'update',
cancelBtn: 'cancel',
searchBtn: 'search',
emptyBtn: 'empty',
menuBtn: 'menu',
saveBtn: 'save',
viewBtn: 'view',
editBtn: 'edit',
copyBtn: 'copy',
delBtn: 'delete'
}, },
login: { login: {
title: 'Login ', title: 'Login ',
info: 'BladeX Development Platform', info: 'Rapid Development Framework of General Management System',
tenantId: 'Please input tenantId',
username: 'Please input username', username: 'Please input username',
password: 'Please input a password', password: 'Please input a password',
wechat: 'Wechat', wechat: 'Wechat',
qq: 'QQ', qq: 'QQ',
github: 'github',
gitee: 'gitee',
phone: 'Please input a phone', phone: 'Please input a phone',
code: 'Please input a code', code: 'Please input a code',
submit: 'Login', submit: 'Login',
userLogin: 'userLogin', userLogin: 'userLogin',
phoneLogin: 'phoneLogin', phoneLogin: 'phoneLogin',
thirdLogin: 'thirdLogin', thirdLogin: 'thirdLogin',
ssoLogin: 'ssoLogin', faceLogin: 'faceLogin',
msgText: 'send code', msgText: 'send code',
msgSuccess: 'reissued code', msgSuccess: 'reissued code',
}, },
navbar: { navbar: {
setting: 'setting',
info: 'info', info: 'info',
logOut: 'logout', logOut: 'logout',
userinfo: 'userinfo', userinfo: 'userinfo',
switchDept : 'switch dept',
dashboard: 'dashboard', dashboard: 'dashboard',
lock: 'lock', lock: 'lock',
bug: 'none bug', bug: 'none bug',
@ -115,8 +110,7 @@ export default {
tagsView: { tagsView: {
search: 'Search', search: 'Search',
menu: 'menu', menu: 'menu',
clearCache: 'Clear Cache',
closeOthers: 'Close Others', closeOthers: 'Close Others',
closeAll: 'Close All' closeAll: 'Close All'
} }
}; }

41
src/lang/index.js Normal file → Executable file
View File

@ -1,28 +1,31 @@
import Vue from 'vue' import { createI18n } from 'vue-i18n'
import VueI18n from 'vue-i18n' import Store from '@/store'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang import elementEnLocale from 'element-plus/es/locale/lang/en'
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang import elementZhLocale from 'element-plus/es/locale/lang/zh-cn'
import elementJaLocale from 'element-plus/es/locale/lang/ja'
import enLocale from './en' import enLocale from './en'
import zhLocale from './zh' import zhLocale from './zh'
import { getStore } from '@/util/store' import jaLocale from './ja'
Vue.use(VueI18n) import AvueEnLocale from '@smallwei/avue/lib/locale/lang/en'
const Avue = window.AVUE; import AvueZhLocale from '@smallwei/avue/lib/locale/lang/zh'
const messages = { export const messages = {
en: { en: {
...enLocale, ...enLocale,
...elementEnLocale, ...AvueEnLocale,
...Avue.locale.en, ...elementEnLocale
}, },
zh: { 'zh-cn': {
...zhLocale, ...zhLocale,
...AvueZhLocale,
...elementZhLocale, ...elementZhLocale,
...Avue.locale.zh, },
ja: {
...jaLocale,
...elementJaLocale
} }
} }
export const language = Store.getters.language
const i18n = new VueI18n({ export default createI18n({
locale: getStore({ name: 'language' }) || 'zh', locale: language,
messages messages,
}) });
export default i18n

113
src/lang/ja.js Executable file
View File

@ -0,0 +1,113 @@
export default {
tip: 'ヒント',
title: 'Avue汎用管理システムの快速開発フレームワーク',
logoutTip: 'システムを終了します。続けますか?',
submitText: 'を選択します',
cancelText: 'キャンセル',
search: '検索内容を入力してください。',
menuTip: 'メニューが見つかりませんでした',
feedback: '意見のフィードバック',
submit: '送信',
wel: {
info: 'おはようございます。Smallweiさん、Avueさんの想像を超えるフレームワークです。',
dept: '私はavueチームの下の部門です。ハーピ部門です。',
team: 'チーム内ランキング',
project: 'プロジェクトアクセス',
count: '項目数',
data: {
subtitle: 'リアルタイム',
column1: '分類統計',
column2: '添付統計',
column3: '文章統計',
key1: '分',
key2: '附',
key3: 'コメントは、',
text1: '現在分類総記録数',
text2: '現在アップロードされている添付ファイルの数',
text3: 'コメント回数'
},
data2: {
column1: '今日登録します。',
column2: '今日ログイン',
column3: '今日は購読します。',
column4: '今日のコメント'
},
data3: {
column1: '転化率(日同28%)',
column2: '署名率(日同11%)',
column3: 'ビザ率(日同11%)'
},
data4: {
column1: 'エラーログ',
column2: 'データ展示',
column3: '権限管理',
column4: 'ユーザー管理'
},
table: {
rw: '作業任務',
nr: '仕事内容',
sj: '勤務時間'
}
},
route: {
setting: '個人設定',
detail: '詳細ページ',
info: '個人情報',
website: '公式サイト',
dashboard: 'トップページ',
メモリ: 'より多く',
tags: 'ラベル',
store: 'ローカルストア',
api: 'グローバル関数',
logs: 'ログ',
table: 'テーブル',
crud: 'テンプレート',
params: 'パラメータ',
more: '詳細',
data: 'データ展示',
permission: '権限',
top: 'はトップに戻る',
affix: '画鋲',
cache: 'ページバッファ',
error: '異常ページ',
test: 'テストページ'
},
login: {
title: 'ログイン ',
info: '汎用管理システムの高速開発フレーム',
username: 'アカウントを入力してください',
password: 'アウンを入れてくださいませんか?',
wechat: 'WeChat',
qq: 'QQ',
phone: '携帯の番号を入力してください',
code: '認証コードを入力してください',
submit: 'ログイン',
faceLogin: 'ログーン',
userLogin: 'アカウントのパスワード',
phoneLogin: '携帯番号の登録',
thirdLogin: '第三者登録',
msgText: '認証コードを送信',
msgSuccess: '秒後に再送信',
},
navbar: {
setting: '個人設定',
logOut: 'ログアウト',
userinfo: '個人情報',
dashboard: '最初のページ',
lock: 'スクリーンをロックする',
bug: 'エラーログがありません',
bugs: 'バーのエラーログ',
screenfullF: 'フルスクリーンを終了',
screenfull: 'フルスクリーン',
language: '英語で話します',
notice: 'メッセージ',
theme: 'メッセージング',
color: '色を変える'
},
tagsView: {
search: '検索',
menu: 'より多く',
closeOthers: 'は他の',
closeAll: 'すべてを閉じる。'
}
}

131
src/lang/zh.js Normal file → Executable file
View File

@ -1,84 +1,70 @@
export default { export default {
title: 'Saber企业管理平台', tip: '提示',
title: 'Saber企业级开发平台',
logoutTip: '退出系统, 是否继续?', logoutTip: '退出系统, 是否继续?',
submitText: '确定', submitText: '确定',
cancelText: '取消', cancelText: '取消',
search: '请输入搜索内容', search: '请输入搜索内容',
menuTip: '没有发现菜单', menuTip: '没有发现菜单',
common: { wel: {
condition: '条件', info: '早安SmallweiAvuex一款超乎你想象的框架',
display: '显示', dept: '我是avue团队下的一个部门-哈皮部门-哈皮职位',
hide: '隐藏' team: '团队内排名',
project: '项目访问',
count: '项目数',
data: {
subtitle: '实时',
column1: '分类统计',
column2: '附件统计',
column3: '文章统计',
key1: '分',
key2: '附',
key3: '评',
text1: '当前分类总记录数',
text2: '当前上传的附件数',
text3: '评论次数'
}, },
tip: { data2: {
select: '请选择', column1: '今日注册',
input: '请输入' column2: '今日登录',
column3: '今日订阅',
column4: '今日评论'
}, },
upload: { data3: {
upload: '点击上传', column1: '转化率(日同比 28%',
tip: '将文件拖到此处,或' column2: '签到率(日同比 11%',
column3: '签到率(日同比 11%'
}, },
date: { data4: {
start: '开始日期', column1: '错误日志',
end: '结束日期', column2: '数据展示',
t: '今日', column3: '权限管理',
y: '昨日', column4: '用户管理'
n: '近7天',
a: '全部'
}, },
form: { table: {
printBtn: '打 印', rw: '工作任务',
mockBtn: '模 拟', nr: '工作内容',
submitBtn: '提 交', sj: '工作时间'
emptyBtn: '清 空' }
}, },
crud: { route: {
filter: { info: '个人信息',
addBtn: '新增条件', website: 'bladex官网',
clearBtn: '清空数据', dashboard: '首页',
resetBtn: '清空条件', tags: '标签',
cancelBtn: '取 消', store: '本地存储',
submitBtn: '确 定' api: '全局函数',
}, logs: '日志监控',
column: { table: '表格',
name: '列名', form: '表单',
hide: '隐藏', data: '数据展示',
fixed: '冻结', permission: '权限',
filters: '过滤', error: '异常页面',
sortable: '排序', test: '测试页面'
index: '顺序',
width: '宽度'
},
tipStartTitle: '当前表格已选择',
tipEndTitle: '项',
editTitle: '编 辑',
copyTitle: '复 制',
addTitle: '新 增',
viewTitle: '查 看',
filterTitle: '过滤条件',
showTitle: '列显隐',
menu: '操作',
addBtn: '新 增',
show: '显 示',
hide: '隐 藏',
open: '展 开',
shrink: '收 缩',
printBtn: '打 印',
excelBtn: '导 出',
updateBtn: '修 改',
cancelBtn: '取 消',
searchBtn: '搜 索',
emptyBtn: '清 空',
menuBtn: '功 能',
saveBtn: '保 存',
viewBtn: '查 看',
editBtn: '编 辑',
copyBtn: '复 制',
delBtn: '删 除'
}, },
login: { login: {
title: '登录 ', title: '登录 ',
info: 'BladeX 企业级开发平台', info: '企业级开发平台',
tenantId: '请输入租户ID', tenantId: '请输入租户ID',
username: '请输入账号', username: '请输入账号',
password: '请输入密码', password: '请输入密码',
@ -89,17 +75,16 @@ export default {
phone: '请输入手机号', phone: '请输入手机号',
code: '请输入验证码', code: '请输入验证码',
submit: '登录', submit: '登录',
userLogin: '账号密码登录', userLogin: '账号密码',
phoneLogin: '手机号登录', phoneLogin: '手机号登录',
thirdLogin: '第三方系统登录', thirdLogin: '第三方登录',
ssoLogin: '单点系统登录', faceLogin: '刷脸登录',
msgText: '发送验证码', msgText: '发送验证码',
msgSuccess: '秒后重发', msgSuccess: '秒后重发',
}, },
navbar: { navbar: {
logOut: '退出登录', logOut: '退出登录',
userinfo: '个人信息', userinfo: '个人信息',
switchDept : '部门切换',
dashboard: '首页', dashboard: '首页',
lock: '锁屏', lock: '锁屏',
bug: '没有错误日志', bug: '没有错误日志',
@ -107,15 +92,13 @@ export default {
screenfullF: '退出全屏', screenfullF: '退出全屏',
screenfull: '全屏', screenfull: '全屏',
language: '中英文', language: '中英文',
notice: '消息通知',
theme: '主题', theme: '主题',
color: '换色' color: '换色'
}, },
tagsView: { tagsView: {
search: '搜索', search: '搜索',
menu: '更多', menu: '更多',
clearCache: '清除缓存',
closeOthers: '关闭其它', closeOthers: '关闭其它',
closeAll: '关闭所有' closeAll: '关闭所有'
} }
}; }

Some files were not shown because too many files have changed in this diff Show More