This commit is contained in:
xuziqiang
2024-05-15 17:29:42 +08:00
commit d0155dbe3c
7296 changed files with 1832517 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
# port
VITE_PORT = 3377
#mode
VITE_GLOB_APP_RUN_TYPE = saas
# spa-title
VITE_GLOB_APP_TITLE = Party Construction
# spa shortname
VITE_GLOB_APP_SHORT_NAME = party-construction

View File

@@ -0,0 +1,22 @@
# Whether to open mock
VITE_USE_MOCK = true
# public path
VITE_PUBLIC_PATH = /nervui-party-construction/
# Cross-domain proxy, you can configure multiple
# Please note that no line breaks http://100.73.70.51
#VITE_PROXY = {"/community":{ "target":"http://100.73.70.51","changeOrigin": true,"prependPath":false},"/parking":{ "target":"http://100.73.70.246:8080","changeOrigin": true,"iprependPath":false}}
# VITE_PROXY=[["/api","http://100.73.70.51"],["/parking","http://100.73.70.246:8080"]]
# Delete console
VITE_DROP_CONSOLE = false
# Basic interface address SPA
VITE_GLOB_API_URL=/basic-api
# File upload address optional
VITE_GLOB_UPLOAD_URL=/upload
# Interface prefix
VITE_GLOB_API_URL_PREFIX=

View File

@@ -0,0 +1,35 @@
# Whether to open mock
VITE_USE_MOCK = true
# public path
VITE_PUBLIC_PATH = /nervui-party-construction/
# Delete console
VITE_DROP_CONSOLE = true
# Whether to enable gzip or brotli compression
# Optional: gzip | brotli | none
# If you need multiple forms, you can use `,` to separate
VITE_BUILD_COMPRESS = 'none'
# Whether to delete origin files when using compress, default false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# Basic interface address SPA
VITE_GLOB_API_URL=/basic-api
# File upload address optional
# It can be forwarded by nginx or write the actual address directly
VITE_GLOB_UPLOAD_URL=/upload
# Interface prefix
VITE_GLOB_API_URL_PREFIX=
# Whether to enable image compression
VITE_USE_IMAGEMIN= true
# use pwa
VITE_USE_PWA = false
# Is it compatible with older browsers
VITE_LEGACY = false

View File

@@ -0,0 +1 @@
1.0.12

View File

@@ -0,0 +1,74 @@
#!/bin/bash
SOURCE="$0"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [ -z $WORKSPACE ];then
echo "WORKSPACE not exists"
else
set DIR=$WORKSPACE
fi
echo "current dir"
echo "$DIR"
cd "$DIR"
projectname=$(basename `pwd`)
npm run party-construction-build
if [ -d "$DIR/dist" ];then
cd "$DIR/dist"
# copy module.json
cp ../module.json ./
# package
VERSION=$(cat ../.version)
lastdir=../release/
if [ -d ${lastdir} ];then
echo "删除旧release文件夹"
rm -rf ${lastdir}
else
echo "文件夹不存在!"
fi
mkdir -p ${lastdir}
dir=../release/nerv/$projectname/$VERSION
mkdir -p ${dir}
tar -zcvf "${dir}/$projectname-$VERSION.tgz" ./*
templatedir=../release/resources/templates/nerv/$projectname/$VERSION/$projectname
mkdir -p ${templatedir}
cp -r ../resources/templates/* ${templatedir}
cd ../
releasefile=nerv-$projectname-$VERSION.tgz
if [ -f ${releasefile} ];then
echo "删除旧包!"
rm -rf ${releasefile}
fi
tar -zcvf ${releasefile} ./release/* release.yaml
mkdir -p ./release/nervui
cp -r ./release/nerv/* ./release/nervui
if [ -f ${releasefile} ];then
echo "编译成功!"
mv ${releasefile} ./release
else
echo "编译失败!!!"
exit 1
fi
else
echo "编译失败!!!"
exit 1
fi

View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="referrer" content="never" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- <script src="https://s.url.cn/qqun/qun/qqweb/m/qun/confession/js/vconsole.min.js "></script> -->
<title>党建知识答题平台</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="./src/main.ts"></script>
<script>
let bodyWidth = window.innerWidth;
let scaleX = bodyWidth / 1920;
document.body.style.zoom = scaleX;
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,12 @@
# 上传release目录信息到nerv-file仓库
release:
- {src: release, dest: /upload/pkg, include: [".*(.tgz)$"]}
- {src: release/resources/templates, dest: /upload/templates}
register:
name: nervui-party-construction
version: 1.0.12
components:
- type: nervui-party-construction
resources:
- {type: template, relativePath: /nervui-party-construction/deploy.json}

View File

@@ -0,0 +1,35 @@
echo "=====================================================create====================================================="
#!/usr/bin/env bash
function create() {
if [ -d "$nervui_app_home" ];then
echo "$nervui_app_home exists!"
else
echo "start mkdir $nervui_app_home"
mkdir -p "$nervui_app_home"
fi
pkg_file_name=${pkg_url##*/}
pkg_file_path="$nervui_app_home$pkg_file_name"
echo "start download $pkg_url"
curl -L -o $pkg_file_path $pkg_url
echo "start install $pkg_file_path"
tar -xf $pkg_file_path -C $nervui_app_home
}
if [ "$pkg_url" == "" ]; then
echo {\"error\":\"pkg_url is empty\"}
exit 1
elif [ "$nervui_app_home" == "" ]; then
echo {\"error\":\"nervui_app_home is empty\"}
exit 1
else
create
fi

View File

@@ -0,0 +1 @@
echo "=====================================================delete====================================================="

View File

@@ -0,0 +1 @@
echo "=====================================================setup====================================================="

View File

@@ -0,0 +1 @@
echo "=====================================================start====================================================="

View File

@@ -0,0 +1 @@
echo "=====================================================stop====================================================="

View File

@@ -0,0 +1,30 @@
{
"name": "/nervui/nervui-party-construction",
"operations": [
{
"name": "Create",
"type": "shell",
"implementor": "create.sh"
},
{
"name": "Delete",
"type": "shell",
"implementor": "delete.sh"
},
{
"name": "Setup",
"type": "shell",
"implementor": "setup.sh"
},
{
"name": "Start",
"type": "shell",
"implementor": "start.sh"
},
{
"name": "Stop",
"type": "shell",
"implementor": "stop.sh"
}
]
}

View File

@@ -0,0 +1,64 @@
{
"name": "/nervui/nervui-party-construction",
"version": 1,
"inputs": [
{
"name": "server_ip",
"type": "string",
"required": true,
"description": "应用安装IP地址",
"inputType": "ipSelectType"
},
{
"name": "version",
"type": "string",
"required": true,
"description": "软件版本",
"inputType": "versionSelectType"
},
{
"name": "install_dir",
"type": "string",
"required": true,
"defaultValue": "/data",
"inputType": "textInputType",
"description": "安装目录"
}
],
"nodes": [
{
"name": "nervui-party-construction",
"type": "/nerv/nerv-orchestrator/cluster/Nervui",
"parameters": [
{
"name": "file_repository",
"value": "${nerv_file_repository}"
},
{
"name": "install_dir",
"value": "${install_dir}"
},
{
"name": "pkg_url",
"value": "/api/pkg/nerv/nervui-party-construction/${version}/nervui-party-construction-${version}.tgz"
}
],
"dependencies": [
{
"type": "contained",
"target": "host"
}
]
},
{
"name": "host",
"type": "/nerv/nerv-orchestrator/compute/Host",
"parameters": [
{
"name": "address",
"value": "${server_ip}"
}
]
}
]
}

View File

@@ -0,0 +1,58 @@
<template>
<a-config-provider :locale="locale">
<router-view />
</a-config-provider>
</template>
<script lang="ts">
import { defineComponent, watch, ref } from 'vue';
import zhCN from 'ant-design-vue/es/locale/zh_CN';
import { useRouter } from 'vue-router';
import Cookies from 'js-cookie';
import { message } from 'ant-design-vue';
export default defineComponent({
name: 'App',
setup() {
const router = useRouter();
// router.beforeEach((to, from) => {
// if (Cookies.get('nervsid') === undefined && to.fullPath !== '/login') {
// if (from.name !== undefined) {
// message.warn('登陆信息已过期,请重新登录!', 1);
// }
// router.push('/login');
// }
// });
const cachedViews = ['Status'];
// watch(
// () => router.currentRoute.value,
// (e) => {
// // if (Cookies.get('nervsid') === undefined && e.fullPath !== '/login') {
// // message.warn('登陆信息已过期,请重新登录!', 1);
// // router.push('/login');
// // }
// // } else {
// // if (Cookies.get('nervsid') !== undefined && e === '/login') {
// // let url = window.sessionStorage.getItem('url');
// // url === null ? window.sessionStorage.setItem('url', '/doorway/visitor/audit') : '';
// // router.push(url === null ? '/doorway' : url);
// // }
// // }
// }
// );
return {
cachedViews,
locale: zhCN,
};
},
});
</script>
<style>
#app {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,6 @@
/***
*配置接口 格式 module:Array<resource>
*/
export const apiModule = {
parking: ['User', 'CurrentUser', 'Organizational'],
};

View File

@@ -0,0 +1,20 @@
import { http } from '/nerv-lib/util/http';
enum Api {
// USER_LOGIN = '/api/community/objs/Login', //用户登录
// USER_INFO = '/api/community/community/objs/CurrentUser', //获取用户信息
USER_LOGIN = '/api/exam_op/objs/Login', //用户登录
USER_INFO = '/api/exam_op/objs/CurrentUser', //获取用户信息
USER_RESOURCE = '/api/community/objs/User/Resource', //获取用户资源
}
export const userLogin = (data: RoomListModel) => http.post(Api.USER_LOGIN, data);
export const userInfo = () => http.get(Api.USER_INFO);
export const userResource = () => http.get(Api.USER_RESOURCE);
/**
* @description 用户登录
* @property `[fatherRegionUuid]` 父级区域唯一标识
*/
interface RoomListModel {
data: string;
}

View File

@@ -0,0 +1,99 @@
/** @format */
import Cookies from 'js-cookie';
import { NsMessage } from '/nerv-lib/component/message';
import { dateUtil } from '/nerv-lib/util/date-util';
import user from '/@/menus/user.json';
export const appConfig = {
projectType: 'web',
baseApi: '/api',
enablePermissions: true,
siderPosition: 'left',
customLogin: () => import('/@/view/login/login.vue'),
customUpdatePwd: () => import('/@/view/updatePassword/updatePassword.vue'),
baseHeader: '/operationsManage',
baseRouter: '/operationsManage/operationsManage/index',
timeout: 30 * 1000,
userLoginApi: '/api/exam_op/objs/Login',
userInfoApi: '/api/exam_op/objs/CurrentUser',
userResourceApi: '/api/exam_op/objs/User/Resource',
// 修改密码配置
updatePassWordInfo: {
title: '修改密码',
subtitle: '党建知识答题平台',
api: '/api/exam_op/objs/User/changePassword',
},
useHistoryTag: false,
// headerBellInfo: {
// isShow: true,
// api: '',
// toRouterName: 'NoticeManageIndex',
// },
resourceInfo: {
application: {
version: '1.0.0',
label: '党建知识答题平台',
dataScope: {
scopeMode: 0,
scopeType: '',
dataTips: '',
},
},
api: '/api/exam_op/qa/Operation/Resources/Op/init',
token: `${dateUtil().format('YYYYMMDD')}pensionwebui`,
},
userCustomRouterGuard: async (to, from, next, whiteNameList, authorizationStore, appConfig) => {
next();
whiteNameList.push('register');
if (
!Cookies.get('nervsid') &&
to.fullPath !== '/login' &&
to.name &&
!whiteNameList.includes(to.name as string)
) {
NsMessage.error('登陆信息已过期,请重新登录!', 1);
next({ name: 'login' });
} else {
// 存储用户信息
if (to.fullPath !== '/login') {
const initUserInfo = window.sessionStorage['userInfo'];
if (Cookies.get('nervsid')) {
try {
const info = await appConfig.userInfo();
info.success
? window.sessionStorage.setItem('userInfo', JSON.stringify(info.data))
: '';
} catch (err) {
Cookies.remove('nervsid');
}
} else {
if (initUserInfo) {
const userInfo = JSON.parse(initUserInfo);
authorizationStore.setEnterpriseName(
!userInfo.organizationalName ? '' : userInfo.organizationalName,
);
}
}
}
if (to.name && !whiteNameList.includes(to.name as string)) {
if (appConfig.enablePermissions !== undefined && appConfig.enablePermissions) {
const res = await appConfig.userResource();
if (Array.isArray(user)) {
if (!res.data) res.data = [];
res.data = [...res.data, ...user];
authorizationStore.updateUserResource(res.data);
} else {
res.data.push(user);
authorizationStore.updateUserResource(res.data);
}
} else {
next();
}
} else {
next();
}
}
},
};

View File

@@ -0,0 +1,2 @@
import { appConfig } from '/@/config/app.config';
export { appConfig };

View File

@@ -0,0 +1,22 @@
export enum ResultEnum {
SUCCESS = 0,
ERROR = 1,
TIMEOUT = 401,
TOKEN_INVALID = 403,
}
export enum RequestEnum {
GET = 'GET',
POST = 'POST',
PUT = 'PUT',
DELETE = 'DELETE',
}
export enum ContentTypeEnum {
// json
JSON = 'application/json;charset=UTF-8',
// form-data qs
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
// form-data upload
FORM_DATA = 'multipart/form-data;charset=UTF-8',
}

View File

@@ -0,0 +1,3 @@
<svg width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.75 5.05097H2.7V18.251C2.7 19.7973 3.95364 21.051 5.5 21.051H14.5C16.0464 21.051 17.3 19.7973 17.3 18.251V7.25097C17.3 7.0388 17.2157 6.83532 17.0657 6.68529C16.9157 6.53526 16.7122 6.45097 16.5 6.45097C16.2878 6.45097 16.0843 6.53526 15.9343 6.68529C15.7843 6.83532 15.7 7.0388 15.7 7.25097V18.251C15.7 18.4086 15.669 18.5646 15.6087 18.7102C15.5483 18.8558 15.46 18.9881 15.3485 19.0995C15.2371 19.2109 15.1048 19.2993 14.9592 19.3596C14.8136 19.4199 14.6576 19.451 14.5 19.451H5.5C5.34241 19.451 5.18637 19.4199 5.04078 19.3596C4.89519 19.2993 4.7629 19.2109 4.65147 19.0995C4.54004 18.9881 4.45165 18.8558 4.39134 18.7102C4.33104 18.5646 4.3 18.4086 4.3 18.251V5.05097H18.25C18.4622 5.05097 18.6657 4.96669 18.8157 4.81666C18.9657 4.66663 19.05 4.46315 19.05 4.25097C19.05 4.0388 18.9657 3.83532 18.8157 3.68529C18.6657 3.53526 18.4622 3.45097 18.25 3.45097H1.75C1.53783 3.45097 1.33434 3.53526 1.18431 3.68529C1.03429 3.83532 0.95 4.0388 0.95 4.25097C0.95 4.46315 1.03429 4.66663 1.18431 4.81666C1.33434 4.96669 1.53783 5.05097 1.75 5.05097ZM7.43431 2.31666C7.58434 2.46669 7.78783 2.55098 8 2.55098H12C12.2122 2.55098 12.4157 2.46669 12.5657 2.31666C12.7157 2.16663 12.8 1.96315 12.8 1.75098C12.8 1.5388 12.7157 1.33532 12.5657 1.18529C12.4157 1.03526 12.2122 0.950977 12 0.950977H8C7.78783 0.950977 7.58434 1.03526 7.43431 1.18529C7.28429 1.33532 7.2 1.5388 7.2 1.75098C7.2 1.96315 7.28429 2.16663 7.43431 2.31666ZM7.43431 8.68529C7.28429 8.83531 7.2 9.0388 7.2 9.25097V15.251C7.2 15.4631 7.28429 15.6666 7.43431 15.8167C7.58434 15.9667 7.78783 16.051 8 16.051C8.21217 16.051 8.41566 15.9667 8.56569 15.8167C8.71571 15.6666 8.8 15.4631 8.8 15.251V9.25097C8.8 9.0388 8.71571 8.83531 8.56569 8.68529C8.41566 8.53526 8.21217 8.45097 8 8.45097C7.78783 8.45097 7.58434 8.53526 7.43431 8.68529ZM11.4343 8.68529C11.2843 8.83531 11.2 9.0388 11.2 9.25097V15.251C11.2 15.4631 11.2843 15.6666 11.4343 15.8167C11.5843 15.9667 11.7878 16.051 12 16.051C12.2122 16.051 12.4157 15.9667 12.5657 15.8167C12.7157 15.6666 12.8 15.4631 12.8 15.251V9.25097C12.8 9.0388 12.7157 8.83531 12.5657 8.68529C12.4157 8.53526 12.2122 8.45097 12 8.45097C11.7878 8.45097 11.5843 8.53526 11.4343 8.68529Z" fill="white" stroke="white" stroke-width="0.1"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.875 14.0289H3.11243L11.2619 5.87944L10.0245 4.64199L1.875 12.7915V14.0289ZM15.875 15.7789H0.125V12.0667L11.8806 0.310973C12.2224 -0.0307409 12.7764 -0.0307409 13.118 0.310973L15.593 2.78584C15.9347 3.12755 15.9347 3.68157 15.593 4.02328L5.58731 14.0289H15.875V15.7789ZM11.2619 3.40456L12.4993 4.64199L13.7368 3.40456L12.4993 2.16713L11.2619 3.40456Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 481 B

View File

@@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.699 1.30809L16.627 1.23609C15.8305 0.444379 14.7531 0 13.63 0C12.507 0 11.4295 0.444379 10.633 1.23609L6.81211 5.05536C6.02029 5.85216 5.57587 6.92986 5.57587 8.05318C5.57587 9.1765 6.02029 10.2542 6.81211 11.051L6.88247 11.1214C7.01993 11.2572 7.1672 11.3815 7.31611 11.4977L8.71356 10.0986C8.54992 10.0037 8.39611 9.88591 8.25702 9.74682L8.18665 9.67809C7.75647 9.24706 7.51487 8.66297 7.51487 8.054C7.51487 7.44503 7.75647 6.86094 8.18665 6.42991L12.0092 2.609C12.4397 2.17902 13.0232 1.93751 13.6317 1.93751C14.2401 1.93751 14.8236 2.17902 15.2541 2.609L15.3245 2.67936C15.7545 3.11012 15.9961 3.69394 15.9961 4.30264C15.9961 4.91134 15.7545 5.49516 15.3245 5.92591L13.5981 7.65718C13.8976 8.40009 14.0399 9.18882 14.0252 9.97591L16.699 7.30373C17.4911 6.50742 17.9358 5.42991 17.9358 4.30673C17.9358 3.18354 17.4911 2.10604 16.699 1.30973V1.30809ZM11.0536 6.81282C10.9173 6.67755 10.7718 6.5518 10.6183 6.43645L9.22083 7.83391C9.38447 7.93209 9.53992 8.04664 9.67902 8.18736L9.75101 8.25773C10.1811 8.68848 10.4227 9.2723 10.4227 9.881C10.4227 10.4897 10.1811 11.0735 9.75101 11.5043L5.93011 15.3252C5.49886 15.755 4.91485 15.9963 4.30602 15.9963C3.69718 15.9963 3.11317 15.755 2.68193 15.3252L2.61156 15.2532C2.18148 14.8224 1.93993 14.2386 1.93993 13.6299C1.93993 13.0212 2.18148 12.4374 2.61156 12.0066L4.33956 10.2803C4.04271 9.54391 3.89691 8.75538 3.91084 7.96155L1.23702 10.6305C0.444705 11.4273 -3.05176e-05 12.5054 -3.05176e-05 13.6291C-3.05176e-05 14.7528 0.444705 15.8309 1.23702 16.6277L1.30738 16.6997C2.10439 17.4911 3.18201 17.9353 4.3052 17.9353C5.42839 17.9353 6.50601 17.4911 7.30302 16.6997L11.1239 12.8772C11.9153 12.0802 12.3595 11.0026 12.3595 9.87936C12.3595 8.75617 11.9153 7.67855 11.1239 6.88155L11.0536 6.81118V6.81282Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,3 @@
<svg width="23" height="15" viewBox="0 0 23 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.5001 0.791992C14.078 0.791992 16.5639 1.96116 18.8888 3.88741C19.6852 4.54866 20.4068 5.25399 21.0431 5.96124L21.3105 6.26407L21.6306 6.64549L21.851 6.92724C21.9745 7.09278 22.0412 7.29379 22.0412 7.50033C22.0412 7.70686 21.9745 7.90787 21.851 8.07341L21.6306 8.35516L21.3105 8.73657L21.0422 9.03941C20.3753 9.78203 19.6553 10.4751 18.8878 11.1132C16.5639 13.0395 14.078 14.2087 11.5001 14.2087C8.92214 14.2087 6.43622 13.0395 4.1113 11.1132C3.34383 10.4751 2.62382 9.78203 1.95697 9.03941L1.6896 8.73657L1.36951 8.35516L1.1491 8.07341C1.02559 7.90787 0.958862 7.70686 0.958862 7.50033C0.958862 7.29379 1.02559 7.09278 1.1491 6.92724L1.36951 6.64549L1.6896 6.26407L1.95793 5.96124C2.62447 5.21865 3.34416 4.52554 4.1113 3.88741C6.43622 1.96116 8.92214 0.791992 11.5001 0.791992ZM11.5001 2.70866C9.44634 2.70866 7.34664 3.69574 5.33509 5.36324C4.63977 5.94126 3.98734 6.56902 3.38297 7.24158L3.15393 7.50033L3.38201 7.75812C3.98665 8.43103 4.6394 9.05912 5.33509 9.63741C7.34759 11.3049 9.44634 12.292 11.5001 12.292C13.5538 12.292 15.6535 11.3049 17.665 9.63741C18.3607 9.05912 19.0135 8.43103 19.6181 7.75812L19.8452 7.49937L19.6181 7.24253C19.0135 6.56962 18.3607 5.94153 17.665 5.36324C15.6525 3.69574 13.5538 2.70866 11.5001 2.70866ZM11.5001 4.14616C12.3896 4.14616 13.2428 4.49954 13.8718 5.12857C14.5008 5.7576 14.8542 6.61074 14.8542 7.50033C14.8542 8.38991 14.5008 9.24305 13.8718 9.87208C13.2428 10.5011 12.3896 10.8545 11.5001 10.8545C10.6105 10.8545 9.75733 10.5011 9.1283 9.87208C8.49927 9.24305 8.14589 8.38991 8.14589 7.50033C8.14589 6.61074 8.49927 5.7576 9.1283 5.12857C9.75733 4.49954 10.6105 4.14616 11.5001 4.14616ZM11.5001 6.06283C11.1188 6.06283 10.7532 6.21428 10.4836 6.48386C10.214 6.75344 10.0626 7.11908 10.0626 7.50033C10.0626 7.88157 10.214 8.24721 10.4836 8.51679C10.7532 8.78637 11.1188 8.93783 11.5001 8.93783C11.8813 8.93783 12.2469 8.78637 12.5165 8.51679C12.7861 8.24721 12.9376 7.88157 12.9376 7.50033C12.9376 7.11908 12.7861 6.75344 12.5165 6.48386C12.2469 6.21428 11.8813 6.06283 11.5001 6.06283Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,3 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M1.47344 11.7922V0.6875H0V13.2797H14.0031V11.7937H1.47344V11.7922ZM5.71719 8.50469L10.5188 8.78125L13.2031 2.6375L11.8547 2.03906L9.58125 7.23906L5.00313 6.975L2.35313 10.6094L3.54063 11.4891L5.71719 8.50469Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 352 B

View File

@@ -0,0 +1,3 @@
<svg width="12" height="7" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.544 6.03906H8.97597C8.72397 6.03906 8.51996 5.83506 8.51996 5.58306C8.51996 5.33106 8.72397 5.12706 8.97597 5.12706H10.41L7.84197 2.55906L5.05196 5.36706C4.94996 5.46906 4.81196 5.51706 4.67396 5.51106C4.54196 5.51706 4.40996 5.46906 4.30796 5.36706L0.167964 1.22706C-0.0240361 1.03506 -0.0240361 0.717063 0.167964 0.525064C0.359964 0.333064 0.677964 0.333064 0.869964 0.525064L4.67996 4.32906L7.49996 1.50906C7.69196 1.31706 8.00996 1.31706 8.20196 1.50906C8.21996 1.52706 8.23796 1.54506 8.24996 1.56906L11.088 4.40706V3.02106C11.088 2.76906 11.292 2.56506 11.544 2.56506C11.796 2.56506 12 2.76906 12 3.02106V5.58306C12 5.83506 11.796 6.03906 11.544 6.03906Z" fill="#27AE60"/>
</svg>

After

Width:  |  Height:  |  Size: 793 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,468 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="471px" height="128px" viewBox="0 0 471 128" enable-background="new 0 0 471 128" xml:space="preserve"> <image id="image0" width="471" height="128" x="0" y="0"
href="data:image/png;base64,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
rkJggg==" />
</svg>

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="27px" height="27px" viewBox="0 0 27 27" enable-background="new 0 0 27 27" xml:space="preserve"> <image id="image0" width="27" height="27" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABFFBMVEUAAAAAv78AyLYAya4A
yLEAv6oAzLMAw7QAxqoA//8AxLEAyLYAxa8Ax68A/6oAv58AwbAAw60Ay7QAyrUA//8Au6oAv60A
xsYHxrEGzbQAxqoFxq8Bx7EBx7EBx7IBx7IDxrEAxa0A/4AFzLMBx7EBx7ECybICx7MByLEDx7EA
0bkCybEBxrEEyLEGzrYBx7ABx7IHya4AxLEAxa4ByLECxrEDxrIEyrEDyrEByLIBx7ECyLACx7AB
yLECyLIA27YFx7AByLIDyLQByLECyLMCyLIByLEByLIAyKQDx7ABx7EDx7EByLIBxrADyLADxrAB
x7ICxrEGx64DxrAByLIBx7IBx7ICybEFyLIFw64Bx7H///9/bN2AAAAAWnRSTlMABA4TFxgUEQkB
DRwjIAMIHSIiGAIPHAkkKRI2tvP70FUfAjLo8puN2l8LpPdFKtLfJhoW5aZmSFvtsYGR7pgHN/5i
/ZBw3roOZLNbvblhXuF9KVrrzLJsOC/GUEoAAAAAAWJLR0RbdLyVNAAAAAd0SU1FB+YIEQs0EQnT
FeAAAAEMSURBVCjPfZLpVgIxDIUjIssQVHBUUBhFUQQUBQWVRUDFfQHFhXn/B7HlJJ0inN4fbXO/
k542CQBrzjfvXwgEQ2H4p7AVQVI0sDiBlpZRUyyo5VpxnNSKzWgVp7RGmes4Q/4xsqPKSCQ9aEm2
wdFmKu1sbXOUEbfuxCjYze7t5w6cPEMfQIHPxcMjxNLxSZniCsAps7OqXGvuORs2cD0uLusNoWbr
qkROG+iVna7LyhErAB2uhXlz27sT2z1ZD5z3KMwnxGexvai8iMdeEd801uZ3Sua+Y19jNv9vzAYf
jscqqi6fkg2/5Pqt6kL1TGb5C90fVU/uQ/mXNNL6YOqfse/GeTHOmXE+Z8/1H7m9PuesaZKhAAAA
JXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA4LTE3VDA5OjUyOjE3KzAyOjAwAAEBzQAAACV0RVh0ZGF0
ZTptb2RpZnkAMjAyMi0wOC0xN1QwOTo1MjoxNyswMjowMHFcuXEAAAAASUVORK5CYII=" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M99.988 102.053C124.324 102.053 144.128 82.3216 144.128 58.0383C144.128 33.7572 124.326 14 99.988 14C75.6524 14 55.8475 33.7309 55.8475 58.0143C55.8475 82.2954 75.6501 102.053 99.988 102.053ZM99.988 28.7785C116.167 28.7785 129.323 41.907 129.323 58.0143C129.323 74.1216 116.167 87.2501 99.988 87.2501C83.8086 87.2501 70.653 74.1216 70.653 58.0143C70.653 41.907 83.8086 28.7785 99.988 28.7785ZM139.3 104.831H60.7C38.2651 104.831 20 123.027 20 145.416C20 167.804 38.2651 186 60.7 186H139.3C161.735 186 180 167.804 180 145.416C180 123.026 161.71 104.831 139.3 104.831ZM83.2598 119.634H116.716L99.988 136.31L83.2598 119.634ZM139.3 171.198H60.7C46.4213 171.198 34.8296 159.628 34.8296 145.416C34.8296 131.203 46.4213 119.634 60.7 119.634H62.299L94.7663 152.001C96.215 153.446 98.1163 154.172 100.012 154.172C101.908 154.172 103.809 153.446 105.258 152.001L137.725 119.634H139.324C153.603 119.634 165.194 131.203 165.194 145.416C165.194 159.623 153.56 171.198 139.3 171.198Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,4 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M100 12.5391C51.7773 12.5391 12.5391 51.7773 12.5391 100C12.5391 148.223 51.7773 187.461 100 187.461C148.223 187.461 187.461 148.223 187.461 100C187.461 51.7773 148.223 12.5391 100 12.5391ZM100 172.832C59.8437 172.832 27.168 140.156 27.168 100C27.168 59.8437 59.8437 27.168 100 27.168C140.156 27.168 172.832 59.8437 172.832 100C172.832 140.156 140.156 172.832 100 172.832Z" fill="black"/>
<path d="M143.34 83.2617L117.93 79.5703L106.562 56.543C105.332 54.043 102.793 52.4609 100 52.4609C97.207 52.4609 94.6679 54.043 93.4375 56.543L82.0703 79.5703L56.6601 83.2617C53.9062 83.6523 51.621 85.5859 50.7617 88.2422C49.9023 90.8984 50.625 93.7891 52.6171 95.7422L71.0156 113.672L66.6796 138.984C66.2109 141.719 67.3437 144.492 69.5898 146.133C71.8554 147.773 74.8242 147.988 77.2851 146.68L100 134.746L122.734 146.699C123.809 147.266 124.98 147.539 126.133 147.539C127.656 147.539 129.16 147.07 130.43 146.152C132.676 144.512 133.809 141.738 133.34 139.004L129.004 113.672L147.402 95.7422C149.394 93.8086 150.117 90.8984 149.258 88.2422C148.398 85.6055 146.094 83.6719 143.34 83.2617ZM116.035 105.879C114.316 107.559 113.535 109.98 113.926 112.344L116.406 126.836L103.379 120C102.324 119.434 101.152 119.16 99.9804 119.16C98.8085 119.16 97.6367 119.434 96.582 120L83.5546 126.836L86.0351 112.344C86.4453 109.98 85.6445 107.559 83.9257 105.879L73.3789 95.6055L87.9296 93.4961C90.3125 93.1445 92.3632 91.6602 93.4375 89.4922L99.9414 76.3086L106.445 89.4922C107.5 91.6602 109.57 93.1445 111.953 93.4961L126.504 95.6055L116.035 105.879Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.01498 15.0148C4.16196 15.0233 1.01518 11.8936 1.00752 8.0453C0.999847 4.19163 4.12841 1.04646 7.97776 1.0381C11.8147 1.02977 14.9755 4.15661 14.985 7.97007C14.9947 11.8589 11.8807 15.0062 8.01498 15.0148ZM2.18562 8.07934C2.19246 11.304 4.78774 13.8927 8.01354 13.8924C11.2266 13.8921 13.8444 11.2804 13.8475 8.07183C13.8506 4.84877 11.22 2.2299 7.987 2.23763C4.77031 2.24528 2.17879 4.85486 2.18562 8.07934Z" fill="black" fill-opacity="0.4"/>
<path d="M8.33914 9.53222C7.89456 9.53222 7.51787 9.53222 7.11054 9.53222C6.98279 8.75294 7.15506 8.08389 7.74295 7.5369C7.9558 7.33886 8.17259 7.14072 8.3558 6.91662C8.48067 6.76386 8.57688 6.57477 8.63924 6.38647C8.77059 5.98985 8.58673 5.5435 8.25097 5.37165C7.90122 5.19264 7.45954 5.28405 7.18848 5.61523C7.07849 5.7496 6.99865 5.91328 6.92776 6.07365C6.86204 6.22232 6.82653 6.38434 6.76331 6.58652C6.29538 6.47295 5.83533 6.3613 5.3526 6.24413C5.51211 5.33145 5.83926 4.54483 6.72302 4.17165C7.66841 3.77243 8.6385 3.76004 9.5235 4.33939C10.3371 4.87204 10.565 6.1698 10.0103 7.03053C9.8019 7.35397 9.5152 7.64152 9.21776 7.8898C8.7066 8.31647 8.22163 8.73583 8.33914 9.53222Z" fill="black" fill-opacity="0.4"/>
<path d="M8.48498 11.8147C7.96316 11.8147 7.47571 11.8147 6.96222 11.8147C6.96222 11.29 6.96222 10.7819 6.96222 10.2505C7.47223 10.2505 7.96775 10.2505 8.48498 10.2505C8.48498 10.7734 8.48498 11.2718 8.48498 11.8147Z" fill="black" fill-opacity="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,4 @@
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<path d="M178.125 34.3752H142.477C135.972 34.3576 129.529 35.6301 123.52 38.119C117.511 40.6079 112.056 44.2638 107.469 48.8752C104.601 51.7387 102.092 54.9414 100 58.4123C97.9075 54.9414 95.3994 51.7387 92.5313 48.8752C87.9444 44.2638 82.4886 40.6079 76.4796 38.119C70.4705 35.6301 64.0275 34.3576 57.5234 34.3752H21.875C20.0102 34.3752 18.2218 35.116 16.9032 36.4346C15.5845 37.7532 14.8438 39.5416 14.8438 41.4064V158.594C14.8438 159.709 15.1088 160.807 15.6171 161.8C16.1253 162.792 16.8621 163.649 17.7668 164.3C18.6715 164.951 19.718 165.378 20.8201 165.545C21.9222 165.713 23.0483 165.616 24.1055 165.262C45.6187 158.039 68.793 157.373 90.6855 163.348L98.1543 165.379C98.4437 165.457 98.738 165.517 99.0352 165.557C99.0645 165.557 99.0937 165.557 99.125 165.569C99.2363 165.582 99.3496 165.594 99.4629 165.604H99.5742C99.7109 165.604 99.8496 165.617 99.9883 165.617H100.012C100.15 165.617 100.289 165.617 100.426 165.604H100.537C100.65 165.604 100.764 165.582 100.875 165.569C100.906 165.569 100.936 165.569 100.965 165.557C101.262 165.517 101.556 165.457 101.846 165.379L109.314 163.348C131.207 157.374 154.381 158.04 175.895 165.262C176.952 165.616 178.078 165.713 179.18 165.545C180.282 165.378 181.329 164.951 182.233 164.3C183.138 163.649 183.875 162.792 184.383 161.8C184.891 160.807 185.156 159.709 185.156 158.594V41.4064C185.156 39.5416 184.415 37.7532 183.097 36.4346C181.778 35.116 179.99 34.3752 178.125 34.3752ZM171.094 149.203C150.065 143.861 128.025 143.933 107.031 149.414V109.647C107.031 107.782 106.29 105.993 104.972 104.675C103.653 103.356 101.865 102.615 100 102.615C98.1352 102.615 96.3468 103.356 95.0282 104.675C93.7095 105.993 92.9688 107.782 92.9688 109.647V149.414C71.9751 143.933 49.9345 143.862 28.9062 149.209V48.4377H57.5234C77.0684 48.4377 92.9688 64.3381 92.9688 83.883C92.9688 85.7478 93.7095 87.5362 95.0282 88.8548C96.3468 90.1735 98.1352 90.9142 100 90.9142C101.865 90.9142 103.653 90.1735 104.972 88.8548C106.29 87.5362 107.031 85.7478 107.031 83.883C107.031 64.3381 122.932 48.4377 142.477 48.4377H171.094V149.203Z" />
<path d="M65.3789 81.8359H48.4121C46.5473 81.8359 44.7589 82.5767 43.4403 83.8953C42.1217 85.214 41.3809 87.0024 41.3809 88.8672C41.3809 90.732 42.1217 92.5204 43.4403 93.839C44.7589 95.1576 46.5473 95.8984 48.4121 95.8984H65.3789C67.2437 95.8984 69.0321 95.1576 70.3507 93.839C71.6694 92.5204 72.4102 90.732 72.4102 88.8672C72.4102 87.0024 71.6694 85.214 70.3507 83.8953C69.0321 82.5767 67.2437 81.8359 65.3789 81.8359ZM127.59 88.8672C127.59 90.732 128.331 92.5204 129.649 93.839C130.968 95.1576 132.756 95.8984 134.621 95.8984H151.588C153.453 95.8984 155.241 95.1576 156.56 93.839C157.878 92.5204 158.619 90.732 158.619 88.8672C158.619 87.0024 157.878 85.214 156.56 83.8953C155.241 82.5767 153.453 81.8359 151.588 81.8359H134.621C132.756 81.8359 130.968 82.5767 129.649 83.8953C128.331 85.214 127.59 87.0024 127.59 88.8672Z" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,3 @@
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.4678 0.625H10.4718C10.1778 0.625 9.93983 0.863 9.93983 1.157C9.93983 1.451 10.1778 1.689 10.4718 1.689H12.1448L9.14883 4.685L5.89383 1.409C5.77483 1.29 5.61383 1.234 5.45283 1.241C5.29883 1.234 5.14483 1.29 5.02583 1.409L0.195832 6.239C-0.028168 6.463 -0.028168 6.834 0.195832 7.058C0.419832 7.282 0.790832 7.282 1.01483 7.058L5.45983 2.62L8.74983 5.91C8.97383 6.134 9.34483 6.134 9.56883 5.91C9.58983 5.889 9.61083 5.868 9.62483 5.84L12.9358 2.529V4.146C12.9358 4.44 13.1738 4.678 13.4678 4.678C13.7618 4.678 13.9998 4.44 13.9998 4.146V1.157C13.9998 0.863 13.7618 0.625 13.4678 0.625Z" fill="#EB5757"/>
</svg>

After

Width:  |  Height:  |  Size: 718 B

View File

@@ -0,0 +1,3 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M161.04 77.2214C158.082 85.9438 152.419 93.4967 144.875 98.7834C155.342 103.561 164.216 111.243 170.442 120.915C176.669 130.587 179.986 141.843 180 153.344V166.672C179.994 170.205 178.588 173.592 176.089 176.09C173.589 178.589 170.201 179.994 166.667 180H73.3333C69.7988 179.994 66.4106 178.589 63.9113 176.09C61.412 173.592 60.0055 170.205 60 166.672V153.344C60.0136 141.843 63.3309 130.587 69.5575 120.915C75.7842 111.243 84.6583 103.561 95.125 98.7834C87.5806 93.4967 81.9184 85.9438 78.9605 77.2214C76.0025 68.4991 75.9029 59.0614 78.6759 50.2786C81.449 41.4958 86.9505 33.8252 94.3815 28.3803C101.813 22.9355 110.786 20 120 20C129.214 20 138.187 22.9355 145.618 28.3803C153.05 33.8252 158.551 41.4958 161.324 50.2786C164.097 59.0614 163.997 68.4991 161.04 77.2214ZM95.0559 46.7211C91.7595 51.6526 90 57.4504 90 63.3814C90.011 71.3312 93.1753 78.9523 98.799 84.5737C104.423 90.195 112.047 93.358 120 93.369C125.933 93.369 131.734 91.6103 136.667 88.3152C141.601 85.0201 145.446 80.3367 147.716 74.8571C149.987 69.3776 150.581 63.3481 149.424 57.5311C148.266 51.714 145.409 46.3707 141.213 42.1769C137.018 37.983 131.672 35.127 125.853 33.9699C120.033 32.8128 114.001 33.4067 108.52 35.6764C103.038 37.9461 98.3524 41.7897 95.0559 46.7211ZM73.3333 166.672H166.667V153.344C166.667 140.973 161.75 129.108 152.998 120.36C144.247 111.611 132.377 106.697 120 106.697C107.623 106.697 95.7534 111.611 87.0017 120.36C78.25 129.108 73.3333 140.973 73.3333 153.344V166.672ZM37.2447 162.762C39.744 165.261 43.1321 166.667 46.6667 166.672C48.4348 166.672 50.1305 167.374 51.3807 168.624C52.631 169.874 53.3333 171.569 53.3333 173.336C53.3333 175.103 52.631 176.798 51.3807 178.048C50.1305 179.298 48.4348 180 46.6667 180C39.5959 179.994 32.8164 177.184 27.8166 172.187C22.8168 167.189 20.0055 160.412 20 153.344V60.0494C20.0055 52.9816 22.8168 46.2048 27.8166 41.2071C32.8164 36.2094 39.5959 33.3992 46.6667 33.3937H66.6667C68.4348 33.3937 70.1305 34.0958 71.3807 35.3455C72.631 36.5953 73.3333 38.2903 73.3333 40.0576C73.3333 41.825 72.631 43.52 71.3807 44.7697C70.1305 46.0195 68.4348 46.7216 66.6667 46.7216H46.6667C43.1321 46.7271 39.744 48.133 37.2447 50.6313C34.7454 53.1295 33.3388 56.5163 33.3333 60.0494V153.344C33.3388 156.877 34.7454 160.264 37.2447 162.762ZM54.7643 82.562H46.8861C44.7966 82.562 42.7928 81.9035 41.3153 80.7314C39.8379 79.5593 39.0078 77.9696 39.0078 76.312C39.0078 74.6544 39.8379 73.0647 41.3153 71.8926C42.7928 70.7205 44.7966 70.062 46.8861 70.062H54.7643C56.8537 70.062 58.8576 70.7205 60.3351 71.8926C61.8125 73.0647 62.6426 74.6544 62.6426 76.312C62.6426 77.9696 61.8125 79.5593 60.3351 80.7314C58.8576 81.9035 56.8537 82.562 54.7643 82.562ZM68.2133 105.731C66.7358 106.904 64.732 107.562 62.6426 107.562H46.8861C44.7966 107.562 42.7928 106.904 41.3153 105.731C39.8379 104.559 39.0078 102.97 39.0078 101.312C39.0078 99.6544 39.8379 98.0647 41.3153 96.8926C42.7928 95.7205 44.7966 95.062 46.8861 95.062H62.6426C64.732 95.062 66.7358 95.7205 68.2133 96.8926C69.6908 98.0647 70.5208 99.6544 70.5208 101.312C70.5208 102.97 69.6908 104.559 68.2133 105.731Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,4 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M71.0715 61.7861H125.357V76.0718H71.0715V61.7861ZM71.4287 96.429H125.714V110.715H71.4287V96.429Z" fill="black"/>
<path d="M168.214 20H45.3572C41.4287 20 38.2144 23.2143 38.2144 27.1429V132.857H15.7144C11.7858 132.857 8.57153 136.071 8.57153 140V156.786C8.57153 169.643 18.9287 180 31.4287 180H137.143C149.643 180 160 169.643 160 157.143V67.1429H183.929C187.857 67.1429 191.072 63.9286 191.072 60V43.2143C191.429 30.3571 181.072 20 168.214 20ZM31.7858 165.714C26.7858 165.714 23.2144 161.786 23.2144 156.786V147.143H113.214V156.071C113.214 159.286 113.929 162.5 115 165.357H31.7858V165.714ZM146.072 157.143C146.072 161.786 142.143 165.714 137.5 165.714H136.429C131.072 165.714 127.143 161.429 127.143 156.429V140.357C127.143 136.429 123.929 133.214 120 133.214H52.5001V34.2857H145.714V157.143H146.072ZM177.143 52.8571H160.357V34.2857H168.572C173.572 34.2857 177.143 38.2143 177.143 43.2143V52.8571Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="27px" height="27px" viewBox="0 0 27 27" enable-background="new 0 0 27 27" xml:space="preserve"> <image id="image0" width="27" height="27" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABIFBMVEUAAAAA//8A0bkAzLsA
ya4AzLMAw7QAxLEAzMwAxsYAwq0Ay7QAxa8AyrAAgIAAzLgAx68AzLMAybIAwrYA//8Av6oA27YA
w7QAv7MAxa0AuaIAv68CyLIBx7IBx7EByLIEx68AxKoAwbICx7MBx7EGxrAGxrMCyLAAzrYGzrYC
yLMAyK0ByLIDx7EDybIByLEByLEHxrEDxbAByLEBxrACx68HxLEAyKQDyLQCyLECyLICyLIAwbAC
yLIFzLMAv58AyLEEyLMByLICyLAAqqoBx7EAxqoFybMBx7ECx7ADyLQBxrECx7IEyrEDxbIDx7EF
w7QAzKoAzK0AxqoAxLMAz68AxrMA/6oAv68Av6oA1aoAxbkAxLEAyrUBx7H///+f7y28AAAAXnRS
TlMAAgsPExQRDQUJGSIjHQIZIAohFQEMByIUHwsQgeDwukAeIY3lLSh4FSqQHOJlY/3BJFSruYAn
DliKj3QdmDIIFzz+lAOxGy/ye2LvqUhPTjMPGRIeEBsDIBgGFhoYBqEzEAAAAAFiS0dEX3PRUS0A
AAAHdElNRQfmCBELNBEJ0xXgAAABH0lEQVQoz3WSZ1/CMBDGr2BbxFirlmEV3Av3wi2odQ9QFHe+
/8cwNHdpSvV59Tz3/zV3TQ6AZKTSPaZlZyCh3mwfk+q3nBjJDDBNrq2hwSEW17BHKMcSyiLMF5KM
FUPkjbC/5HfYqIpjpfL4BIVJcao3RWmaC83MUhTD+uTnyh3G59U4AAvkF0PEK5QLDiypdsshW1E5
D67yq2sCrW9ok2pjb25t71SjuBt9t7dfETo4VIOm4AjdMUeVTrBSg7o0p2fE+DmyAGw8USF+ISuX
AIF0V9eK3chKWtxnUdrbO0T38i9cQ7AAH7b68CjUaGK3p/+elrFnfNxWEr0YtBSv3aj9Fi2T/x5D
pqcvoWNFd/7x2b28Xq319d3+MXOqE/wCMOFBJy+4pMgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjIt
MDgtMTdUMDk6NTI6MTcrMDI6MDAAAQHNAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA4LTE3VDA5
OjUyOjE3KzAyOjAwcVy5cQAAAABJRU5ErkJggg==" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,15 @@
import { createApp } from 'vue';
import App from '/@/App.vue';
import { saasInit } from '/nerv-lib/saas';
import { apiModule } from '/@/api';
import { appConfig } from '/@/config';
import defaultResource from '/@/menus/admin.json';
const app = createApp(App);
saasInit({
app,
apiModule,
appConfig,
defaultResource,
});
app.mount('#app');

View File

@@ -0,0 +1,251 @@
[
{
"code":"triviaManage",
"sort":2,
"label":"知识问答",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":"",
"menus":[
{
"code":"menuManage",
"sort":999,
"label":"栏目管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"triviaManage",
"menus":[
]
},
{
"code":"User",
"sort":999,
"label":"学员管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"UserReset",
"name":"",
"label":"重置密码",
"backApi":[
{
"method":"POST",
"url":"/api/objs/person/reset"
}
],
"parentCode":"User"
},
{
"sort":999,
"type":"op",
"code":"UserRemove",
"name":"",
"label":"删除",
"backApi":[
{
"method":"POST",
"url":"/api/objs/ArrearsOrder/scrap"
}
],
"parentCode":"User"
},
{
"code":"UserAdd",
"sort":999,
"label":"新增",
"type":"op",
"name":"UserAdd",
"backApi":[
],
"parentCode":"User"
},
{
"code":"UserEdit",
"sort":999,
"label":"编辑",
"type":"op",
"name":"UserEdit",
"backApi":[
],
"parentCode":"User"
},
{
"code":"UserDetail",
"sort":999,
"label":"详情",
"type":"op",
"name":"UserDetail",
"backApi":[
],
"parentCode":"User"
}
]
},
{
"code":"TestPaperManage",
"sort":999,
"label":"试卷管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnaireForm/pageList"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"TestPaperManageDelete",
"name":"",
"label":"删除",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageUpload",
"name":"",
"label":"上传试题",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageRelease",
"name":"",
"label":"发布",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageStop",
"name":"",
"label":"暂停发布",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageAdd",
"name":"",
"label":"新增试卷",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageEdit",
"name":"",
"label":"编辑",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"code":"TestPaperManageDetail",
"sort":999,
"label":"查看",
"type":"op",
"name":"TestPaperManageDetail",
"backApi":[
],
"parentCode":"TestPaperManage"
}
]
},
{
"code":"PointsManage",
"sort":999,
"label":"积分管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/getRank"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"PointsManageExp",
"name":"",
"label":"批量导出",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/export"
}
],
"parentCode":"PointsManage"
},
{
"code":"PointsManageDetail",
"sort":999,
"label":"查看",
"type":"op",
"name":"PointsManageDetail",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/getPointLog"
}
],
"parentCode":"PointsManage"
}
]
}
]
},
{
"code":"register",
"sort":3,
"label":"用户注册",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":""
}
]

View File

@@ -0,0 +1,347 @@
[
{
"code":"welcome",
"sort":1,
"label":"个人中心",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":""
},
{
"code":"triviaManage",
"sort":2,
"label":"知识问答",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":"",
"menus":[
{
"code":"menuManage",
"sort":999,
"label":"栏目管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"triviaManage",
"menus":[
]
},
{
"code":"User",
"sort":999,
"label":"学员管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"UserReset",
"name":"",
"label":"重置密码",
"backApi":[
{
"method":"POST",
"url":"/api/objs/person/reset"
}
],
"parentCode":"User"
},
{
"sort":999,
"type":"op",
"code":"UserRemove",
"name":"",
"label":"删除",
"backApi":[
{
"method":"POST",
"url":"/api/objs/ArrearsOrder/scrap"
}
],
"parentCode":"User"
},
{
"code":"UserAdd",
"sort":999,
"label":"新增",
"type":"op",
"name":"UserAdd",
"backApi":[
],
"parentCode":"User"
},
{
"code":"UserEdit",
"sort":999,
"label":"编辑",
"type":"op",
"name":"UserEdit",
"backApi":[
],
"parentCode":"User"
},
{
"code":"UserDetail",
"sort":999,
"label":"详情",
"type":"op",
"name":"UserDetail",
"backApi":[
],
"parentCode":"User"
}
]
},
{
"code":"TestPaperManage",
"sort":999,
"label":"试卷管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnaireForm/pageList"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"TestPaperManageDelete",
"name":"",
"label":"删除",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageUpload",
"name":"",
"label":"上传试题",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageRelease",
"name":"",
"label":"发布",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageStop",
"name":"",
"label":"暂停发布",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageAdd",
"name":"",
"label":"新增试卷",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"sort":999,
"type":"op",
"code":"TestPaperManageEdit",
"name":"",
"label":"编辑",
"backApi":[
],
"parentCode":"TestPaperManage"
},
{
"code":"TestPaperManageDetail",
"sort":999,
"label":"查看",
"type":"op",
"name":"TestPaperManageDetail",
"backApi":[
],
"parentCode":"TestPaperManage"
}
]
},
{
"code":"PointsManage",
"sort":999,
"label":"积分管理",
"type":"noChildrenMenu",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/getRank"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"PointsManageExp",
"name":"",
"label":"批量导出",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/export"
}
],
"parentCode":"PointsManage"
},
{
"code":"PointsManageDetail",
"sort":999,
"label":"查看",
"type":"op",
"name":"PointsManageDetail",
"backApi":[
{
"method":"GET",
"url":"/api/objs/admin/questionnairePoint/getPointLog"
}
],
"parentCode":"PointsManage"
}
]
},
{
"code":"QuestionAnswering",
"sort":999,
"label":"知识问答",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"PointsManageRemove",
"name":"",
"label":"删除",
"backApi":[
{
"method":"POST",
"url":"/api/objs/ArrearsOrder/scrap"
}
],
"parentCode":"QuestionAnswering"
},
{
"code":"Answer",
"sort":999,
"label":"答题",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"QuestionAnswering"
},
{
"code":"AnswerDetail",
"sort":999,
"label":"查看",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"QuestionAnswering"
}
]
}
]
},
{
"code":"register",
"sort":3,
"label":"用户注册",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":""
},
{
"code":"userCenter",
"sort":4,
"label":"个人中心",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":"",
"menus":[
{
"code":"Center",
"sort":999,
"label":"个人中心",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"userCenter",
"menus":[
]
}
]
}
]

View File

@@ -0,0 +1,109 @@
[
{
"code":"welcome",
"sort":1,
"label":"个人中心",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":""
},
{
"code":"register",
"sort":3,
"label":"用户注册",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":""
},
{
"code":"userCenter",
"sort":4,
"label":"个人中心",
"type":"menus",
"name":"",
"backApi":[
],
"parentCode":"",
"menus":[
{
"code":"QuestionAnswering",
"sort":999,
"label":"知识问答",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"triviaManage",
"menus":[
{
"sort":999,
"type":"op",
"code":"PointsManageRemove",
"name":"",
"label":"删除",
"backApi":[
{
"method":"POST",
"url":"/api/objs/ArrearsOrder/scrap"
}
],
"parentCode":"QuestionAnswering"
},
{
"code":"Answer",
"sort":999,
"label":"答题",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"QuestionAnswering"
},
{
"code":"AnswerDetail",
"sort":999,
"label":"查看",
"type":"menus",
"name":"",
"backApi":[
{
"method":"GET",
"url":"/api/objs/Role"
}
],
"parentCode":"QuestionAnswering"
}
]
},
{
"code":"Center",
"sort":999,
"label":"个人中心",
"type":"noChildrenMenu",
"name":"",
"backApi":[
],
"parentCode":"userCenter",
"menus":[
]
}
]
}
]

View File

@@ -0,0 +1,11 @@
/** @format */
const RootRoute = {
path: '/',
name: 'root',
redirect: { name: 'login' },
meta: {
title: 'Root',
},
};
export default RootRoute;

View File

@@ -0,0 +1,11 @@
/** @format */
// const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const register = {
path: '/register',
name: 'register',
meta: { title: '用户注册', icon: 'doorway', index: 3 },
component: () => import('/@/view/login/register.vue'),
// redirect: { name: 'WelcomeIndex' },
};
export default register;

View File

@@ -0,0 +1,252 @@
/** @format */
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const triviaManage = {
path: '/triviaManage',
name: 'triviaManage',
meta: { title: '知识问答', icon: 'questringAnswer', index: 2 },
redirect: { name: 'TestPaperManage' },
children: [
{
path: 'menuManage',
name: 'menuManage',
// hideResource: true,
meta: { title: '栏目管理', icon: 'parkingCarPark', hideChildren: true },
component: Base,
redirect: { name: 'menuManageIndex' },
children: [
{
path: 'index',
name: 'menuManageIndex',
component: () => import('/nerv-lib/saas/view/menuManage/index.vue'),
meta: { title: '栏目管理', keepAlive: true },
},
],
},
{
path: 'testPaperManage',
name: 'TestPaperManage',
meta: { title: '试卷管理', icon: 'triviaManage', hideChildren: true },
redirect: { name: 'TestPaperManageIndex' },
component: Base,
children: [
{
path: 'index',
name: 'TestPaperManageIndex',
component: () => import('/@/view/triviaManage/testPaperManage/index.vue'),
meta: {
title: '试卷管理',
keepAlive: true,
operates: [
{
title: '删除',
code: 'TestPaperManageDelete',
backApi: [],
},
{
title: '上传试题',
code: 'TestPaperManageUpload',
backApi: [],
},
{
title: '发布',
code: 'TestPaperManageRelease',
backApi: [],
},
{
title: '暂停发布',
code: 'TestPaperManageStop',
backApi: [],
},
{
title: '新增试卷',
code: 'TestPaperManageAdd',
backApi: [],
},
{
title: '编辑',
code: 'TestPaperManageEdit',
backApi: [],
},
],
backApi: [
{
method: 'GET',
url: '/api/objs/admin/questionnaireForm/pageList',
},
{
method: 'GET',
url: '/api/objs/admin/questionnaireForm/detail',
},
{
method: 'POST',
url: '/api/objs/admin/questionnaireForm/delete',
},
{
method: 'POST',
url: '/api/objs/admin/questionnaireForm/questionImport',
},
{
method: 'POST',
url: '/api/objs/admin/questionnaireForm/updateStatus',
},
{
method: 'POST',
url: '/api/objs/admin/questionnaireForm/update',
},
{
method: 'POST',
url: '/api/objs/admin/questionnaireForm/add',
},
],
},
},
{
path: 'detail',
name: 'TestPaperManageDetail',
component: () => import('/@/view/triviaManage/testPaperManage/detail.vue'),
meta: {
title: '查看',
type: 'op',
backApi: [
{
method: 'GET',
url: '/api/objs/admin/questionnaireForm/detail',
},
{
method: 'GET',
url: '/api/objs/admin/questionnaireForm/statisticsOption',
},
{
method: 'GET',
url: '/api/objs/admin/questionnaireForm/statisticsUser',
},
],
},
},
],
},
{
path: 'pointsManage',
name: 'PointsManage',
meta: { title: '积分管理', icon: 'studengManger', hideChildren: true },
redirect: { name: 'PointsManageIndex' },
component: Base,
children: [
{
path: 'index',
name: 'PointsManageIndex',
component: () => import('/@/view/triviaManage/pointsManage/index.vue'),
meta: {
title: '积分管理',
keepAlive: true,
operates: [
{
title: '批量导出',
code: 'PointsManageExp',
backApi: [
{
method: 'GET',
url: '/api/objs/admin/questionnairePoint/export',
},
],
},
],
backApi: [
{
method: 'GET',
url: '/api/objs/admin/questionnairePoint/getRank',
},
],
},
},
{
path: 'detail',
name: 'PointsManageDetail',
component: () => import('/@/view/triviaManage/pointsManage/detail.vue'),
meta: {
title: '查看',
type: 'op',
backApi: [
{
method: 'GET',
url: '/api/objs/admin/questionnairePoint/getPointLog',
},
],
},
},
],
},
{
path: 'user',
name: 'User',
meta: { title: '学员管理', hideChildren: true },
redirect: { name: 'UserIndex' },
component: Base,
children: [
{
path: 'index',
name: 'UserIndex',
component: () => import('/@/view/userManage/userList/index.vue'),
meta: {
title: '学员管理',
keepAlive: true,
operates: [
{
title: '重置密码',
code: 'UserReset',
backApi: [
{
method: 'POST',
url: '/api/objs/admin/WorkUser/reset',
},
],
},
{
title: '新增',
code: 'UserAdd',
backApi: [
{
method: 'POST',
url: '/api/objs/admin/WorkUser',
},
],
},
{
title: '编辑',
code: 'UserEdit',
backApi: [
{
method: 'POST',
url: '/api/objs/admin/WorkUser/update',
},
],
},
{
title: '删除',
code: 'UserRemove',
backApi: [
{
method: 'POST',
url: '/api/objs/admin/WorkUser/delete',
},
],
},
],
backApi: [
{
method: 'GET',
url: '/api/objs/admin/WorkUser',
},
{
method: 'POST',
url: '/api/objs/admin/WorkUser/operation',
},
],
},
},
],
},
],
};
export default triviaManage;

View File

@@ -0,0 +1,92 @@
/** @format */
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const userCenter = {
path: '/userCenter',
name: 'userCenter',
meta: { title: '个人中心', icon: 'person', index: 4 },
redirect: { name: 'Center' },
children: [
{
path: 'center',
name: 'Center',
// hideResource: true,
meta: { title: '个人中心', icon: 'person', hideChildren: true },
component: Base,
redirect: { name: 'CenterIndex' },
children: [
{
path: 'index',
name: 'CenterIndex',
component: () => import('/@/view/welcome/center.vue'),
meta: { title: '个人中心' },
},
],
},
{
path: 'questionAnswering',
name: 'QuestionAnswering',
meta: { title: '知识问答', hideChildren: true },
redirect: { name: 'QuestionAnsweringIndex' },
component: Base,
children: [
{
path: 'index',
name: 'QuestionAnsweringIndex',
component: () => import('/@/view/triviaManage/questionAnswering/index.vue'),
meta: {
title: '知识问答',
keepAlive: true,
operates: [
{
title: '删除',
code: 'PointsManageRemove',
backApi: [
{
method: 'POST',
url: '/api/objs/ArrearsOrder/scrap',
},
],
},
],
backApi: [
{
method: 'GET',
url: '/api/objs/Role',
},
],
},
},
{
path: 'answer',
name: 'Answer',
component: () => import('/@/view/triviaManage/questionAnswering/answer.vue'),
meta: {
title: '答题',
backApi: [
{
method: 'GET',
url: '/api/objs/Role',
},
],
},
},
{
path: 'detail',
name: 'AnswerDetail',
component: () => import('/@/view/triviaManage/questionAnswering/detail.vue'),
meta: {
title: '查看',
backApi: [
{
method: 'GET',
url: '/api/objs/Role',
},
],
},
},
],
},
],
};
export default userCenter;

View File

@@ -0,0 +1,11 @@
/** @format */
// const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const welcome = {
path: '/welcome',
name: 'welcome',
meta: { title: '学员欢迎', icon: 'doorway', index: 1 },
component: () => import('/@/view/welcome/index.vue'),
// redirect: { name: 'WelcomeIndex' },
};
export default welcome;

View File

@@ -0,0 +1,12 @@
import { defineStore } from 'pinia';
export const items = defineStore({
id: 'items',
state() {
return { list: [], count: 10 };
},
getters: {
double: (state: any) => state.count * 2,
},
actions: {},
});

View File

@@ -0,0 +1,73 @@
@font-face {
font-family: 'QuartzMS';
src: url('/asset/font/QuartzMS.TTF') format('truetype');
}
@font-face {
font-family: 'FZDeSHJW_511M';
src: url('/asset/font/FZDeSHJW_511M.TTF') format('truetype');
}
//侧边导航
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
background: rgba(184, 46, 45, 0.1) !important;
}
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected::before{
background-color: rgba(0,0,0,0)!important;
}
.ant-menu.ant-menu-dark .ant-menu-item-selected {
color: #fff;
background: #CB2026 !important;
}
.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover {
background-color: #CB2026 !important;
}
.ant-menu-inline .ant-menu-item,
.ant-menu-inline .ant-menu-submenu-title {
width: 100% !important;
}
.ns-basic-table .ant-btn:hover {
border-color: transparent !important;
}
.ns-basic-table .ant-btn-link:hover {
background: none !important;
}
// .ns-detail {
// padding: 0px 24px 10px 24px !important;
// }
.ant-tabs-nav-wrap {
padding: 0 24px; // 列表tab边距
}
.ant-tabs-nav {
margin: 0 !important; // 列表tab下边距
}
.ns-richText-ZIndex {
z-index: 1;
}
.ant-input-number {
width: 100%; //inputNumber组件宽度
}
// header菜单字体样式
.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,
.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu {
color: #fff;
}
.ant-menu-dark .ant-menu-item,
.ant-menu-dark .ant-menu-item-group-title,
.ant-menu-dark .ant-menu-item>a,
.ant-menu-dark .ant-menu-item>span>a {
color: #fff;
}

View File

@@ -0,0 +1,2 @@
@import "variable";
@import "global";

View File

@@ -0,0 +1,4 @@
@primary-color: #CB2026; // 全局主色
@layout-header-hover: #CB2026; //hover
@layout-header-background: #CB2026; // 头部背景色

View File

@@ -0,0 +1,65 @@
// $primary-color: #37ABC4; // 全局主色
// $link-color: #37ABC4; // 链接色
// $success-color: #17BE6B; // 成功色
// $warning-color: #FF9901; // 警告色
// $error-color: #FF1744; // 错误色
// $font-size-base: 14px; // 主字号
// $font-size-lg:14px;
// $font-size-lg:14px;
// $heading-font-size-lg:16px;//标题字号
// $heading-font-weight:600;//标题加粗
// $font-line-height:22px;//文字行高
// $heading-font-line-height:24px;//标题文字行高
// $heading-color: rgba(0, 0, 0, 0.85); // 标题色
// $text-color: #323232; // 主文本色
// $text-color-secondary: rgba(0, 0, 0, 0.45); // 次文本色
// $disabled-color: #BFBFBF; // 失效色
// $border-radius-base: 2px; // 组件/浮层圆角
// $border-color-base: #dcdfe2; // 边框色
// $box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15); // 浮层阴影
// $layout-body-background: #f0f2f5; //框架背景色
// $layout-header-background:#37ABC4; // 头部背景色
// $layout-sider-width:208px; //侧边导航宽度
// $layout-sider-arrow-color:#808d96;//侧边导航箭头颜色
// $border-style-base:solid;
// $layout-header-height:48px;//头部高度
// $line-height-base:22px;
// //btn
// $btn-height-base:30px;
// $btn-height-lg: 30px;
// $btn-disable-color: #9b9b9b;//禁用按钮color
// $btn-disable-bg: #dfe3e9;//禁用按钮background
// $btn-disable-border: 1px solid #ced0da;
// $btn-border-radius-base: $border-radius-base;//圆角边框
// $btn-border-width: 1px;
// $btn-border-style: $border-style-base;
// $btn-link-hover-bg: #37ABC4;
// $btn-text-hover-bg: #46ebdb;
// $btn-font-size-lg: $font-size-lg;
// //input
// $input-height-base: 30px;
// $input-hover-focus-border-color:#a5a5b5;
// // @input-hover-border-color: rgba(0,0,0,.85);//鼠标滑过input边框
// //form
// $label-color:#52616f;
// $form-vertical-label-padding: 0;
// $form-vertical-label-margin: 0,0,16,0px;
// $form-item-label-height:$input-height-base;
// $form-item-margin-bottom: 16px;
// //menu
// $menu-item-height: 48px;
// $menu-item-active-bg: none;
// $menu-item-boundary-margin: 0px;
// //spin
// $spin-dot-size-sm: 14px;
// $spin-dot-size: 20px;
// $spin-dot-size-lg: 32px;
// $border-width-base: 1px;
// $border-style-base: solid;

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,302 @@
<!-- @format -->
<template>
<div style="height: 100%">
<a-layout style="height: 100%">
<a-layout-content class="center-content">
<div class="lg_card">
<h1 class="lg_title">党建知识答题平台</h1>
<h1 class="lg_card_title">账号登录</h1>
<p v-show="errorShow" class="lg_card_error">{{ errorMsg }}</p>
<a-input
placeholder="登录账号"
v-model:value="userName"
style="height: 52px; margin-bottom: 24px; border-radius: 4px">
<template #prefix>
<img src="/asset/image/login/icon_name.png" style="margin-right: 5px" />
</template>
</a-input>
<a-input-password
placeholder="登录密码"
v-model:value="password"
style="height: 52px; margin-bottom: 24px; border-radius: 4px">
<template #prefix>
<img src="/asset/image/login/icon_password.png" style="margin-right: 5px" />
</template>
</a-input-password>
<a-button
@click="submit"
:loading="loading"
type="primary"
style="width: 100%; height: 52px; border-radius: 4px; margin-bottom: 25px"
>登录</a-button
>
<div style="width: 100%; text-align: right; color: rgba(0, 0, 0, 0.65)">
没有账号 <a @click="$router.push({ name: 'register' })">注册</a>
</div>
</div>
<div class="footer">Copyright 2021 鼎云科技 All Rights Reserved</div>
</a-layout-content>
</a-layout>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { useRouter } from 'vue-router';
import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config';
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
import { NsMessage } from '/nerv-lib/component/message';
import { base64encode, base64decode } from './service';
import user from '/@/menus/user.json';
export default defineComponent({
name: 'UserLogin',
setup() {
const url = ref('/asset/image/login/background1.png');
const userName = ref<string>('');
const password = ref<string>('');
const logUrl = ref<string>('');
const bgUrl = ref<string>('');
const errorMsg = ref<string>('');
const errorShow = ref<boolean>(false);
const router = useRouter();
const title = ref<string>('');
const initUrl = ref('');
title.value = '账号登录';
// title.value = appConfig.title ? appConfig.title : '账号登录';
const loading = ref<boolean>(false);
const configStore = appConfigStore();
const useAuthorization = authorizationService();
let rememberPwdOp = ref(false);
if (localStorage.getItem('rememberPwdOp')) {
rememberPwdOp.value = JSON.parse(localStorage.getItem('rememberPwdOp'));
}
if (localStorage.getItem('loginOpData')) {
let data = JSON.parse(localStorage.getItem('loginOpData'));
userName.value = data.userName;
password.value = data['isEncrypted'] ? base64decode(data.password) : data.password;
}
const submit = (): void => {
if (password.value === '') {
errorMsg.value = '请输入密码';
errorShow.value = true;
}
if (userName.value === '') {
errorMsg.value = '请输入账号';
errorShow.value = true;
}
if (userName.value !== '' && password.value !== '') {
errorShow.value = false;
let data = JSON.stringify({
userName: userName.value,
password: password.value,
isEncrypted: true, //兼容之前没有加密的账号
});
loading.value = true;
async function logins() {
try {
const res = await configStore.userLogin(JSON.parse(data));
console.log(res);
if (res.success) {
if (rememberPwdOp.value) {
const saveData = JSON.parse(data);
saveData['password'] = base64encode(saveData.password);
localStorage.setItem('loginOpData', JSON.stringify(saveData));
} else {
localStorage.removeItem('loginOpData');
}
const info = await configStore.userInfo();
info.success
? window.sessionStorage.setItem('userInfo', JSON.stringify(info.data))
: '';
loading.value = false;
if (configStore.enablePermissions) {
const res = await configStore.userResource();
initUrl.value = '';
const dealInitUrl = (item) => {
console.log(item);
if (item.type === 'menus' && item.menus && item.menus?.length !== 0) {
dealInitUrl(item.menus[0]);
} else {
// if (item.type === 'noChildrenMenu') {
initUrl.value = item.code;
// }
}
};
// let accountType = JSON.parse(sessionStorage.getItem('userInfo')).accountType;
if (Array.isArray(user)) {
if (!res.data) res.data = [];
res.data = [...res.data, ...user];
console.log(res.data);
} else {
res.data.push(user);
}
dealInitUrl(res.data[0]);
useAuthorization.updateUserResource(res.data);
const initRouterList = useAuthorization.getInitRouterList;
console.log(initRouterList);
console.log(initUrl.value);
router.push({
name: initRouterList.length === 0 ? 'error403' : initUrl.value,
});
} else {
router.replace({ name: 'root' });
}
}
} catch (err) {
console.log(err);
// NsMessage.error('该账号暂无权限');
loading.value = false;
}
}
logins();
}
};
const checkoutLogo = (): void => {
logUrl.value = '';
};
const checkoutBg = (): void => {
Math.random() > 0.5
? (url.value = 'src/assetimg/background.jpg')
: (url.value = 'src/assetimg/background.png');
};
const onChange = () => {
localStorage.setItem('rememberPwdOp', JSON.stringify(rememberPwdOp.value));
};
return {
title,
url,
loading,
userName,
password,
submit,
errorMsg,
bgUrl,
logUrl,
checkoutLogo,
checkoutBg,
errorShow,
rememberPwdOp,
onChange,
};
},
created() {
const _this = this;
console.log('执行了');
window.sessionStorage.clear();
document.onkeydown = function (e) {
const key = window.event === undefined ? e.keyCode : window.event.keyCode;
key === 13 ? _this.submit() : '';
};
},
beforeUnmount() {
document.onkeydown = function (e) {};
},
mounted() {
// if (Cookies.get('nervsid') !== undefined) {
// this.$router.push('/home');
// }
},
});
</script>
<style lang="less" scoped>
.home_header {
height: 64px !important;
display: flex;
align-items: center;
}
:deep(.center-content) {
background: url('./img/background.png') center center no-repeat;
background-size: cover;
// background-position-y: -120px;
margin: 0;
}
.icon {
color: @primary-color;
// background: #000;
// min-height: 25px;
// min-width: 25px;
// display: flex;
// justify-content: center;
// align-items: center;
// border-radius: 50%;
}
.ant-layout-header {
min-height: 64px;
background: #fff !important;
}
.ant-layout-content {
height: calc(100vh - 112px);
width: 100%;
min-height: 400px;
}
.ant-layout-footer {
max-height: 48px;
min-height: 48px;
font-size: 14px;
font-weight: 400;
color: #8f8f8f;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
}
.lg_card {
width: 420px;
height: 353px;
position: absolute;
left: 50%;
top: 28%;
transform: translateX(-50%);
}
.lg_card .lg_title {
font-family: 'Kaiti';
font-style: normal;
font-weight: 900;
font-size: 36px;
line-height: 50px;
width: 100%;
text-align: center;
color: #c50001;
margin-bottom: 62px;
}
.lg_card .lg_card_title {
font-family: 'PingFang';
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 22px;
margin-bottom: 24px;
text-align: left;
// font-family: 'Kaiti';
}
.lg_card_error {
text-align: left;
color: #e4393c;
font-size: 14px;
}
.footer {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 48px;
color: rgba(0, 0, 0, 0.4);
font-family: 'PingFang';
font-style: normal;
font-weight: 400;
font-size: 14px;
}
</style>

View File

@@ -0,0 +1,284 @@
<!-- @format -->
<template>
<div style="height: 100%">
<a-layout style="height: 100%">
<a-layout-content class="center-content">
<div class="lg_card">
<a-page-header style="border: 1px solid rgb(235, 237, 240)" @back="$router.back()">
<template #backIcon>
<div class="back_icon"><left-outlined style="font-size: 20px" /><h1>返回</h1></div>
</template>
<template #title>
<h1 class="lg_card_title">注册党建知识答题平台</h1>
</template>
</a-page-header>
<ns-form
:labelWrap="true"
style="margin: 32px auto 0; width: 50%"
ref="mainRef"
formLayout="vertical"
:schemas="formSchema"
:model="data"
v-bind="$attrs" />
<a-button
@click="submit"
:loading="loading"
:disabled="!mainRef?.validateResult"
type="primary"
style="
width: 420px;
height: 52px;
border-radius: 4px;
position: absolute;
left: 50%;
transform: translateX(-50%);
"
>注册</a-button
>
<div class="login_link" @click="$router.push({ name: 'login' })">
登录已有账号<right-outlined style="font-size: 14px" />
</div>
</div>
<div class="footer">Copyright 2021 鼎云科技 All Rights Reserved</div>
</a-layout-content>
</a-layout>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from 'vue';
import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue';
import { useRouter } from 'vue-router';
import { NsMessage } from '/nerv-lib/component/message';
import { http } from '/nerv-lib/util/http';
import { router } from '/nerv-lib/saas/router';
export default defineComponent({
name: 'UserRegister',
components: {
LeftOutlined,
RightOutlined,
},
setup() {
const mainRef = ref();
let data = ref({});
let loading = ref(false);
watch(
() => data.value.password,
() => {
if (data.value.confirmPassword) mainRef.value.formElRef.validateFields('confirmPassword');
},
{ deep: true },
);
let formSchema = ref([
{
field: 'telNum',
},
{
label: '手机号码',
field: 'accountName',
component: 'NsInput',
componentProps: {
placeholder: '请输入手机号作为登录账号',
},
rules: [
{
required: true,
validator: async (rule, value) => {
data.value.telNum = value;
if (!value) return Promise.reject('请输入手机号码');
if (!/^[1][3456789][\d]{9}$/.test(value))
return Promise.reject('请输入正确的手机号码');
},
},
],
},
{
label: '学员姓名',
field: 'userName',
component: 'NsInput',
componentProps: {
placeholder: '请输入真实姓名',
},
rules: [
{
required: true,
validator: async (rule, value) => {
const _reg = /^[^\x00-\xff]$/;
if (!value) return Promise.reject('请输入真实姓名');
if (value.includes(' ')) return Promise.reject('不支持空格');
if (value) {
let strLength = 0;
let strArray = value.split('');
strArray.forEach((item) => {
if (_reg.test(item)) {
strLength += 2;
} else {
strLength += 1;
}
});
if (strLength > 32) {
return Promise.reject('不支持空格长度不得超过32个字符中文占两个字符');
}
}
},
},
],
},
{
label: '用户密码',
field: 'password',
component: 'NsInputPassword',
componentProps: {
placeholder: '请输入登录密码密码6~18位支持字母、数字、特殊字符!@#$%^&*',
},
rules: [
{
required: true,
validator: async (rule, value) => {
let reg = /^[0-9a-zA-Z!@#$%^&*]{6,18}$/;
if (!value) return Promise.reject('请输入登录密码');
if (!reg.test(value))
return Promise.reject('支持数字、字母、特殊字符!@#$%^&*6~18位字符');
},
},
],
},
{
label: '确认密码',
field: 'confirmPassword',
component: 'NsInputPassword',
componentProps: {
placeholder: '请再次输入密码',
},
rules: [
{
required: true,
validator: async (rule, value) => {
if (value !== data.value.password) return Promise.reject('两次密码输入不一致');
},
},
],
},
]);
const submit = () => {
loading.value = true;
mainRef.value
.triggerSubmit()
.then((data) => {
http
.post('/api/exam_op/objs/admin/WorkUser/register', data)
.then((res) => {
loading.value = false;
NsMessage.success('注册成功', 1, () => {
router.push({ path: '/login' });
});
})
.catch((err) => {
loading.value = false;
});
})
.catch((err) => {
loading.value = false;
});
};
return {
data,
formSchema,
mainRef,
submit,
loading,
};
},
});
</script>
<style lang="less" scoped>
:deep(.center-content) {
background: url('./img/background.png') center center no-repeat;
background-size: cover;
// background-position-y: -120px;
margin: 0;
}
.ant-layout-content {
height: calc(100vh - 112px);
width: 100%;
min-height: 400px;
}
.lg_card {
width: 1200px;
height: 560px;
position: absolute;
left: 50%;
top: 23%;
transform: translateX(-50%);
background: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.06);
}
.ant-page-header {
border: none !important;
border-bottom: 1px solid rgb(235, 237, 240) !important;
height: 84px;
}
.back_icon {
display: flex;
align-items: center;
h1 {
margin: 0;
font-weight: 400;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
}
}
.lg_card_title {
font-family: 'PingFang SC';
font-style: normal;
font-weight: 400;
font-size: 32px;
line-height: 36px;
text-align: center;
color: #172e3d;
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 8px;
}
:deep(.ant-page-header-heading) {
height: 100%;
align-items: center;
}
.login_link {
cursor: pointer;
display: flex;
align-items: center;
border-radius: 4px;
position: absolute;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
&:hover {
color: #c50001;
}
}
.footer {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 48px;
color: rgba(0, 0, 0, 0.4);
font-family: 'PingFang';
font-style: normal;
font-weight: 400;
font-size: 14px;
}
:deep(.ant-input-affix-wrapper) {
height: 52px;
}
:deep(.ant-form-item-label-wrap) {
line-height: 52px;
}
:deep(.ant-col-6) {
flex: 0 0 20%;
}
</style>

View File

@@ -0,0 +1,117 @@
/** @format */
const base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
const base64DecodeChars = [
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
-1, -1, -1, -1, -1,
];
//加密方法
export const base64encode = (input: string) => {
if (!input) {
return '';
}
let output = '';
let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
let i = 0;
input = _utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output =
output +
base64EncodeChars.charAt(enc1) +
base64EncodeChars.charAt(enc2) +
base64EncodeChars.charAt(enc3) +
base64EncodeChars.charAt(enc4);
}
return output;
};
//解密方法
export const base64decode = (input: string) => {
let output = '';
let chr1, chr2, chr3;
let enc1, enc2, enc3, enc4;
let i = 0;
if (!input) {
return '';
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
// input = input.replace(/[^A-F0-9]/g, "");
while (i < input.length) {
enc1 = base64EncodeChars.indexOf(input.charAt(i++));
enc2 = base64EncodeChars.indexOf(input.charAt(i++));
enc3 = base64EncodeChars.indexOf(input.charAt(i++));
enc4 = base64EncodeChars.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = _utf8_decode(output);
return output;
};
export const _utf8_encode = (string: string) => {
string = string.replace(/\r\n/g, '\n');
let utftext = '';
for (let n = 0; n < string.length; n++) {
const c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if (c > 127 && c < 2048) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
};
// private method for UTF-8 decoding
export const _utf8_decode = (utftext: string) => {
let string = '';
let i = 0;
let [c, c2, c3] = [0, 0, 0];
while (i < utftext.length) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
} else if (c > 191 && c < 224) {
c2 = utftext.charCodeAt(i + 1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = utftext.charCodeAt(i + 1);
c3 = utftext.charCodeAt(i + 2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
};

View File

@@ -0,0 +1,719 @@
<template>
<div>
<ns-view-add-form
:schemas="formSchema"
:model="data"
:title="collectionCode?'编辑角色':'添加角色'"
:api="collectionCode?'/api/exam_op/objs/ResCollResource/save':'/api/exam_op/objs/ResCollResource/save'"
/>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, ref, provide, watch } from 'vue';
import { useRouter } from 'vue-router';
import { http } from '/nerv-lib/util/http';
import { random } from 'lodash-es';
import RoleAuthority from './component/roleAuthority.vue';
export default defineComponent({
name: 'roleTypeAddOrEdit',
components: {
RoleAuthority
},
setup() {
provide('components', () => {
return {RoleAuthority}
});
const router = useRouter();
let data = ref({});
const collectionCode = router.currentRoute.value.query['collectionCode'];
const collectionName = router.currentRoute.value.query['collectionName'];
const describe = router.currentRoute.value.query['describe'];
const synOrganize = router.currentRoute.value.query['synOrganize'];
// 角色基本信息
data.value['collectionName'] = collectionName;
data.value['describe'] = describe;
data.value['collectionCode'] = collectionCode;
data.value['synOrganize'] = synOrganize?synOrganize:0;
let show= ref(false)
let originalForm= ref([
{
field: 'collectionCode',
show: false,
component: 'NsInput',
},
{
field: 'fields',
label: '',
displayFormItem: false,
class: 'ns-form-item-full',
component: 'NsChildForm',
componentProps: {
title: '基本信息',
schemas: [
{
field: 'collectionName',
label: '角色名称',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
disabled: collectionCode && true,
},
rules: [
{
required: true,
message: '不得为空',
trigger: 'blur',
},
// {
// pattern: /^[\u4E00-\u9FA5]{1,12}$/,
// message: '仅支持中文汉字长度范围最少2位',
// trigger: 'blur',
// },
],
},
{
field: 'describe',
label: '角色描述',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
// disabled: collectionCode && true,
},
rules: [
// {
// required: true,
// message: '不得为空',
// trigger: 'blur',
// },
{
pattern: /^.{0,150}$/,
message: '由18位阿拉伯数字或大写英文字母组成',
trigger: 'blur',
},
],
},
{
field: 'synOrganize',
component: 'NsSwitch',
label: '是否同步修改企业',
componentProps: {
checkInfo: {
checked: '是',
unChecked: '否',
},
checkedValue: 1,
unCheckedValue: 0
},
},
],
},
},
{
field: 'fields',
label: '',
displayFormItem: false,
class: 'ns-form-item-full',
component: 'NsChildForm',
componentProps: {
title: '角色权限设置',
schemas: [
{
field: 'resourceCodeMap',
label: '',
class: 'ns-form-item-full ns-form-item-padding',
component: 'RoleAuthority',
componentProps: {
placeholder: '请输入',
field: 'resourceCodeMap',
dataSource: data.value,
// disabled: collectionCode && true,
},
rules: [
// {
// required: true,
// message: '不得为空',
// trigger: 'blur',
// },
],
},
],
},
},
])
function load(): void {
if (!collectionCode) {
return;
}
const requestArr = [];
// 角色基本信息
// const request1 = http.get('/api/exam_op/objs/Role/detail', { collectionCode: collectionCode }).then()// 角色权限
const request2 = http.get('/api/exam_op/objs/ResCollResource', { collectionCode: collectionCode }).then()
const request3 = http.get('/api/exam_op/objs/Resources/AllList').then()// 获取当前应用所有权限资源
// requestArr.push(request1);
requestArr.push(request2);
requestArr.push(request3);
Promise.all(requestArr).then(res => {
if (res && res.length === 2) {
// const roleInfo = res[0] && res[0]['data'] ? res[0]['data'] : '';
const roleAuth = res[0] && res[0]['data']['data'] ? res[0]['data']['data'] : '';
const allResources = res[1] && res[1]['data'] ? res[1]['data'] : [];
// 赋予角色基本信息
// if (collectionName) {
// 角色基本信息
data.value['collectionName'] = collectionName;
data.value['describe'] = describe;
data.value['collectionCode'] = collectionCode;
// }
// 全局应用权限资源信息,数据权限处理, 过滤form中的全局数据权限项
handleDataAuth(allResources, originalForm.value);
show.value= true
// 本角色权限资源信息
if (roleAuth) {
if (typeof roleAuth == 'string') {
try {
JSON.parse(roleAuth);
} catch (e) {
console.log(e);
}
data.value['resourceCodeMap'] = JSON.parse(roleAuth);
} else if (roleAuth instanceof Array) {
data.value['resourceCodeMap'] = roleAuth;
}
}
}
}).catch(error => {
show.value= true
// this.messageService.error('错误', '获得模块信息失败, 错误原因: ' + error, error);
});
}
async function loadResource() {
/**
* 获得module.json中的配置数据
*/
await http
.get('/api/exam_op/objs/Resources/AllList')
.then((res) => {
if(res.data){
handleDataAuth(res.data, originalForm.value);
show.value= true
}else{
show.value= true
}
});
}
if(collectionCode){
load()
}else{
loadResource()
}
// handleDataAuth([
// {
// "appLabel": "养老应用a",
// "appId": "11100as",
// "menus": [
// {
// "extend": "扩展信息",
// "code": "index",
// "parentCode": "",
// "icon": "",
// "name": "index",
// "label": "首页",
// "sort": 0,
// "type": "other"
// },
// {
// "code": "business-center",
// "parentCode": "",
// "icon": "",
// "name": "business-center",
// "label": "业务中心",
// "menus": [
// {
// "code": "advice-service",
// "parentCode": "business-center",
// "icon": "",
// "name": "advice-service",
// "label": "咨询入住",
// "menus": [
// {
// "code": "advice-register",
// "parentCode": "advice-service",
// "name": "advice-register",
// "label": "咨询登记",
// "menus": [
// {
// "code": "advice-register/add",
// "parentCode": "advice-register",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "advice-register/remove",
// "parentCode": "advice-register",
// "name": "remove",
// "label": "删除",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "advice-register/edit",
// "parentCode": "advice-register",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "advice-register/export",
// "parentCode": "advice-register",
// "name": "export",
// "label": "导出",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "advice-register/checkIn",
// "parentCode": "advice-register",
// "name": "checkIn",
// "label": "入住",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "order-register",
// "parentCode": "advice-service",
// "name": "order-register",
// "label": "预约登记",
// "menus": [
// {
// "code": "order-register/detail",
// "parentCode": "order-register",
// "name": "detail",
// "label": "详情",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/add",
// "parentCode": "order-register",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/remove",
// "parentCode": "order-register",
// "name": "remove",
// "label": "删除",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/edit",
// "parentCode": "order-register",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/export",
// "parentCode": "order-register",
// "name": "export",
// "label": "导出",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/cancel",
// "parentCode": "order-register",
// "name": "cancel",
// "label": "取消",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "order-register/checkIn",
// "parentCode": "order-register",
// "name": "unsubscribe",
// "label": "入住",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "check-in",
// "parentCode": "advice-service",
// "name": "check-in",
// "label": "入住登记",
// "menus": [
// {
// "code": "check-in/add",
// "parentCode": "check-in",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "check-in/remove",
// "parentCode": "check-in",
// "name": "remove",
// "label": "删除",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "check-in/edit",
// "parentCode": "check-in",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "check-in/export",
// "parentCode": "check-in",
// "name": "export",
// "label": "导出数据",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "check-in/import",
// "parentCode": "check-in",
// "name": "import",
// "label": "批量导入",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "bed-search",
// "parentCode": "advice-service",
// "name": "bed-search",
// "label": "床位查询",
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "charging-standard",
// "parentCode": "advice-service",
// "name": "charging-standard",
// "label": "收费标准",
// "sort": 0,
// "type": "menus"
// }
// ],
// "sort": 0,
// "type": "menus"
// }
// ],
// "sort": 0,
// "type": "menus"
// }
// ],
// "dataScope": {
// "dataTips": "",
// "scopeType": "",
// "dataConfig": {},
// "scopeMode": 0
// },
// "version": "1.4.4.201"
// },
// {
// "appLabel": "养老应用app",
// "appId": "11100as2",
// "menus": [
// {
// "code": "homepage",
// "parentCode": "",
// "icon": "",
// "name": "homepage",
// "label": "主页",
// "menus": [
// {
// "code": "gaffer-information",
// "parentCode": "homepage",
// "name": "gaffer-information",
// "label": "老人信息",
// "menus": [
// {
// "code": "gaffer-list",
// "parentCode": "gaffer-information",
// "name": "gaffer-list",
// "label": "老人列表",
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "basic-information",
// "parentCode": "gaffer-information",
// "name": "basic-information",
// "label": "基本信息",
// "sort": 0,
// "type": "menus"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "service-transact",
// "parentCode": "homepage",
// "name": "service-transact",
// "label": "服务办理",
// "menus": [
// {
// "code": "bed-record",
// "parentCode": "service-transact",
// "name": "bed-record",
// "label": "换床记录",
// "menus": [
// {
// "code": "bed-record/detail",
// "parentCode": "bed-record",
// "name": "detail",
// "label": "查看",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "bed-record/add",
// "parentCode": "bed-record",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "bed-record/edit",
// "parentCode": "bed-record",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "bed-record/cancel",
// "parentCode": "bed-record",
// "name": "cancel",
// "label": "取消",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "nursing-level-change",
// "parentCode": "service-transact",
// "name": "nursing-level-change",
// "label": "护理等级更换",
// "menus": [
// {
// "code": "nursing-level-change/detail",
// "parentCode": "nursing-level-change",
// "name": "detail",
// "label": "查看",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-level-change/add",
// "parentCode": "nursing-level-change",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-level-change/edit",
// "parentCode": "nursing-level-change",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-level-change/cancel",
// "parentCode": "nursing-level-change",
// "name": "cancel",
// "label": "取消",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// },
// {
// "code": "nursing-group-change",
// "parentCode": "service-transact",
// "name": "nursing-group-change",
// "label": "护理组更换",
// "menus": [
// {
// "code": "nursing-group-change/detail",
// "parentCode": "nursing-group-change",
// "name": "detail",
// "label": "查看",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-group-change/add",
// "parentCode": "nursing-group-change",
// "name": "add",
// "label": "新增",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-group-change/edit",
// "parentCode": "nursing-group-change",
// "name": "edit",
// "label": "编辑",
// "sort": 0,
// "type": "op"
// },
// {
// "code": "nursing-group-change/cancel",
// "parentCode": "nursing-group-change",
// "name": "cancel",
// "label": "取消",
// "sort": 0,
// "type": "op"
// }
// ],
// "sort": 0,
// "type": "menus"
// }
// ],
// "sort": 0,
// "type": "menus"
// }
// ],
// "sort": 0,
// "type": "menus"
// }
// ],
// "version": "1.4.4.7"
// }
// ],originalForm.value)
async function handleDataAuth(allResources, form) {
// 1. 存储所有资源权限
data.value['allResources'] = allResources;
// 2. 确定数据权限模式
/** 目前考虑场景:
* dataScope['scopeMode']为 0:没有数据权限1. 有全局数据权限 2. 各自有数据权限
* 1. 全局数据权限各应用都没有数据权限即各资源无dataScope参数 或 dataScope下面参数 scopeMode 0
* 2. 局部数据权限:各应用有各自数据权限, 即 dataScope下面参数 scopeMode 2
* 3. todo 各个应用有的是全局数据权限,有的是独有的数据权限:暂未处理该场景*/
if (allResources && allResources instanceof Array) {
let modeArr = [];
await allResources.forEach(resource => {
if (resource['dataScope']) {
const dataScope = resource['dataScope'];
if (Object.keys(dataScope).length > 0) {
const scopeMode = dataScope['scopeMode'];
modeArr.push(scopeMode);
if (scopeMode == 1) {
data.value['commonDataScope'] = dataScope; // 存在全局数据权限,任取一个应用的数据权限定义
}
}
}
});
if (modeArr.length == 0) {
data.value['dataAuthMode'] = 0; // 无数据权限
} else if (modeArr.length > 0) {
let newArr = Array.from(new Set(modeArr));
if (newArr.includes(1)) { // 可能有全局数据权限
if (newArr.includes(2)) {
// this.messageService.confirm('提示', '权限资源注册有误'); // 有的有全局数据权限,有的有自己的数据权限
return;
} else {
data.value['dataAuthMode'] = 1; // 全局数据权限
}
} else { // 无数据权限或者有的含有自己的数据权限
if (newArr.includes(2)) { // 可能有各自的数据权限
data.value['dataAuthMode'] = 2; // 局部数据权限
} else {
data.value['dataAuthMode'] = 0; // 无数据权限
}
}
}
}
// 3.根据数据模式参数确定全局数据权限是否显示
// if (data.value['dataAuthMode'] != 1) {
// const tempForm = JSON.parse(JSON.stringify(form));
// if (tempForm) {
// tempForm = tempForm.filter(fd => {
// return fd['field'] != 'dataScope';
// });
// originalForm = tempForm;
// }
// } else {
// originalForm = form;
// }
}
// async function getData() {
// await http
// .get('/api/exam_op/objs/enterprise/detail', { collectionCode: collectionCode })
// .then((res) => {
// if(res.data){
// data.value= res.data
// }
// });
// }
// if(collectionCode){
// getData()
// }
let formSchema = ref([]);
watch(
() => show.value,
() => {
if (show.value) {
formSchema.value = originalForm.value
}
},
{
immediate: true,
}
);
return {
data,
formSchema,
collectionCode,
collectionName,
describe
};
},
});
</script>

File diff suppressed because it is too large Load Diff

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