@ -0,0 +1,10 @@ |
|||||
|
# port |
||||
|
VITE_PORT = 3301 |
||||
|
#mode |
||||
|
VITE_GLOB_APP_RUN_TYPE = saas |
||||
|
|
||||
|
# spa-title |
||||
|
VITE_GLOB_APP_TITLE = Smart Parking Depositor |
||||
|
|
||||
|
# spa shortname |
||||
|
VITE_GLOB_APP_SHORT_NAME = smart-parking-depositor |
@ -0,0 +1,22 @@ |
|||||
|
# Whether to open mock |
||||
|
VITE_USE_MOCK = true |
||||
|
|
||||
|
# public path |
||||
|
VITE_PUBLIC_PATH = / |
||||
|
|
||||
|
# 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= |
@ -0,0 +1,35 @@ |
|||||
|
# Whether to open mock |
||||
|
VITE_USE_MOCK = true |
||||
|
|
||||
|
# public path |
||||
|
VITE_PUBLIC_PATH = / |
||||
|
|
||||
|
# 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 |
@ -0,0 +1 @@ |
|||||
|
2.1.19 |
@ -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 parking-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 |
@ -0,0 +1,19 @@ |
|||||
|
<!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 type="text/javascript"> |
||||
|
window._AMapSecurityConfig = { |
||||
|
securityJsCode: '09e43004c09d39c0e61f8fd65d5e6a5a', |
||||
|
}; |
||||
|
</script> |
||||
|
<title>AI智能BAS系统</title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="app"></div> |
||||
|
<script type="module" src="./src/main.ts"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,95 @@ |
|||||
|
import type { MockConfig, MockMethod } from 'vite-plugin-mock'; |
||||
|
|
||||
|
import { getRequestToken, resultError, resultSuccess } from '/nerv-base/util/mock'; |
||||
|
|
||||
|
const fakeUserList = [ |
||||
|
{ |
||||
|
userId: '1', |
||||
|
username: 'vben', |
||||
|
realName: 'Vben Admin', |
||||
|
avatar: '', |
||||
|
desc: 'manager', |
||||
|
password: '123456', |
||||
|
accessToken: 'fakeAdminToken', |
||||
|
homePath: '/dashboard', |
||||
|
roles: [ |
||||
|
{ |
||||
|
roleName: 'Super Admin', |
||||
|
value: 'super', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
userId: '2', |
||||
|
username: 'test', |
||||
|
password: '123456', |
||||
|
realName: 'test user', |
||||
|
avatar: '', |
||||
|
desc: 'tester', |
||||
|
accessToken: 'fakeTestToken', |
||||
|
homePath: '/dashboard/workbench', |
||||
|
roles: [ |
||||
|
{ |
||||
|
roleName: 'Tester', |
||||
|
value: 'test', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
]; |
||||
|
|
||||
|
export default (_config: MockConfig): MockMethod[] => { |
||||
|
return [ |
||||
|
{ |
||||
|
url: '/req-api/login', |
||||
|
timeout: 200, |
||||
|
method: 'post', |
||||
|
response: ({ body }) => { |
||||
|
const { username, password } = body; |
||||
|
const checkUser = fakeUserList.find( |
||||
|
(item) => item.username === username && password === item.password, |
||||
|
); |
||||
|
if (!checkUser) { |
||||
|
return resultError('Incorrect account or password!'); |
||||
|
} |
||||
|
const { userId, username: _username, accessToken, realName, desc, roles } = checkUser; |
||||
|
return resultSuccess({ |
||||
|
roles, |
||||
|
userId, |
||||
|
username: _username, |
||||
|
accessToken, |
||||
|
realName, |
||||
|
desc, |
||||
|
}); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
url: '/req-api/getUserInfo', |
||||
|
method: 'get', |
||||
|
timeout: 100, |
||||
|
response: (request) => { |
||||
|
const token = getRequestToken(request) || 'fakeAdminToken'; |
||||
|
if (!token) return resultError('Invalid token'); |
||||
|
const checkUser = fakeUserList.find((item) => item.accessToken === token); |
||||
|
if (!checkUser) { |
||||
|
return resultError('The corresponding user information was not obtained!'); |
||||
|
} |
||||
|
const { accessToken: _token, password: _pwd, ...rest } = checkUser; |
||||
|
return resultSuccess(rest); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
url: '/req-api/logout', |
||||
|
timeout: 200, |
||||
|
method: 'get', |
||||
|
response: (request) => { |
||||
|
const token = getRequestToken(request); |
||||
|
if (!token) return resultError('Invalid token'); |
||||
|
const checkUser = fakeUserList.find((item) => item.accessToken === token); |
||||
|
if (!checkUser) { |
||||
|
return resultError('Invalid token!'); |
||||
|
} |
||||
|
return resultSuccess(undefined, { message: 'Token has been destroyed' }); |
||||
|
}, |
||||
|
}, |
||||
|
]; |
||||
|
}; |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 688 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 147 KiB |
After Width: | Height: | Size: 4.2 KiB |
@ -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-smart-parking |
||||
|
version: 2.1.19 |
||||
|
components: |
||||
|
- type: nervui-smart-parking |
||||
|
resources: |
||||
|
- {type: template, relativePath: /nervui-smart-parking/deploy.json} |
||||
|
|
@ -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 |
@ -0,0 +1 @@ |
|||||
|
echo "=====================================================delete=====================================================" |
@ -0,0 +1 @@ |
|||||
|
echo "=====================================================setup=====================================================" |
@ -0,0 +1 @@ |
|||||
|
echo "=====================================================start=====================================================" |
@ -0,0 +1 @@ |
|||||
|
echo "=====================================================stop=====================================================" |
@ -0,0 +1,30 @@ |
|||||
|
{ |
||||
|
"name": "/nervui/nervui-smart-parking-op", |
||||
|
"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" |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,64 @@ |
|||||
|
{ |
||||
|
"name": "/nervui/nervui-smart-parking", |
||||
|
"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-smart-parking", |
||||
|
"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-smart-parking/${version}/nervui-smart-parking-${version}.tgz" |
||||
|
} |
||||
|
], |
||||
|
"dependencies": [ |
||||
|
{ |
||||
|
"type": "contained", |
||||
|
"target": "host" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"name": "host", |
||||
|
"type": "/nerv/nerv-orchestrator/compute/Host", |
||||
|
"parameters": [ |
||||
|
{ |
||||
|
"name": "address", |
||||
|
"value": "${server_ip}" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,234 @@ |
|||||
|
<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(); |
||||
|
|
||||
|
const cachedViews = ['Status']; |
||||
|
window.localStorage.setItem('mapKey', JSON.stringify({ type: 'tmap', url: '' })); |
||||
|
// 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 lang="less" scoped> |
||||
|
:deep(.ns-content) { |
||||
|
padding-top: 80px !important; |
||||
|
} |
||||
|
#app { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
:deep(.ns-left-menu .firstMenuItem-selected .ant-menu-title-content) { |
||||
|
background: unset !important; |
||||
|
} |
||||
|
:deep(.ns-left-menu .ant-menu-item-selected .ant-menu-title-content) { |
||||
|
color: #fff !important; |
||||
|
background: @primary-color; |
||||
|
border-radius: 2px; |
||||
|
height: 40px; |
||||
|
line-height: 40px; |
||||
|
a { |
||||
|
color: #ffffff !important; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-menu-light.ant-menu-horizontal > .ant-menu-item:hover) { |
||||
|
background: @primary-color; |
||||
|
} |
||||
|
:deep(.ant-menu-inline .ant-menu-submenu-title) { |
||||
|
color: rgba(255, 255, 255, 0.9) !important; |
||||
|
} |
||||
|
:deep(.ns-left-menu .ant-layout-sider-children .ant-menu-sub.ant-menu-inline) { |
||||
|
position: relative; |
||||
|
&::before { |
||||
|
display: flex; |
||||
|
width: 2px; |
||||
|
height: calc(100% - 40px); |
||||
|
position: absolute; |
||||
|
top: 20px; |
||||
|
left: 20px; |
||||
|
content: ''; |
||||
|
background-color: rgba(255, 255, 255, 0.2); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//*************************含tab的 list列表样式 */ |
||||
|
:deep(.tabListTable) { |
||||
|
.ns-table-title { |
||||
|
text-align: left; |
||||
|
height: 46px; |
||||
|
line-height: 46px; |
||||
|
font-size: 18px; |
||||
|
font-weight: bold; |
||||
|
user-select: text; |
||||
|
padding-left: 16px; |
||||
|
background: #fff; |
||||
|
width: calc(100% + 32px); |
||||
|
margin-left: -16px; |
||||
|
} |
||||
|
.tabs-list { |
||||
|
overflow: visible !important; |
||||
|
} |
||||
|
.ant-tabs-nav { |
||||
|
width: calc(100% + 32px); |
||||
|
margin-left: -16px !important; |
||||
|
background: #fff; |
||||
|
} |
||||
|
.ant-tabs-nav-wrap { |
||||
|
padding: 0 16px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//*********************详情页返回修改 */ |
||||
|
:deep(.nsDetailView) { |
||||
|
min-height: 100%; |
||||
|
height: 100%; |
||||
|
.ns-detail-content { |
||||
|
padding: 0px 24px; |
||||
|
border-top: 16px solid #e5ebf0; |
||||
|
} |
||||
|
.ant-descriptions-item-label { |
||||
|
color: rgba(0, 0, 0, 0.5); |
||||
|
font-family: PingFang SC; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.ant-descriptions-item-content { |
||||
|
color: rgba(0, 0, 0, 0.95); |
||||
|
font-family: PingFang SC; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.ant-descriptions-title { |
||||
|
&::after { |
||||
|
content: ''; |
||||
|
width: 75px; |
||||
|
height: 7px; |
||||
|
display: block; |
||||
|
background: linear-gradient(90deg, #537fff 0%, #fff 82.67%); |
||||
|
margin-left: 2px; |
||||
|
margin-top: -2px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.ant-descriptions-row > th, |
||||
|
.ant-descriptions-row > td { |
||||
|
padding-bottom: 8px; |
||||
|
} |
||||
|
.ns-page-header { |
||||
|
margin-bottom: 0 !important; |
||||
|
padding-top: 7px !important; |
||||
|
padding-bottom: 7px !important; |
||||
|
width: calc(100% + 32px); |
||||
|
margin-left: -16px; |
||||
|
.title { |
||||
|
cursor: pointer; |
||||
|
font-size: 18px !important; |
||||
|
} |
||||
|
} |
||||
|
.ant-descriptions-header { |
||||
|
margin: 16px 0 16px 0 !important; |
||||
|
|
||||
|
.ant-descriptions-title { |
||||
|
line-height: 16px; |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ns-detail .ant-descriptions-header .descriptions-title) { |
||||
|
&:after { |
||||
|
content: ''; |
||||
|
width: 75px; |
||||
|
height: 7px; |
||||
|
display: block; |
||||
|
background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%); |
||||
|
margin-left: 2px; |
||||
|
margin-top: -2px; |
||||
|
} |
||||
|
} |
||||
|
:deep(.ant-descriptions-header .descriptions-title) { |
||||
|
&:after { |
||||
|
content: ''; |
||||
|
width: 75px; |
||||
|
height: 7px; |
||||
|
display: block; |
||||
|
background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%); |
||||
|
margin-left: 2px; |
||||
|
margin-top: -2px; |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
|
<style lang="less"> |
||||
|
// 列表弹框样式修改 |
||||
|
.listTableModal .ant-modal-title { |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
.listTableModal .ant-modal-body { |
||||
|
padding: 16px !important; |
||||
|
.ant-tabs-nav-wrap { |
||||
|
padding: 0px; |
||||
|
} |
||||
|
.ns-list-table { |
||||
|
border-left: 16px solid #e5ebf0; |
||||
|
border-right: 16px solid #e5ebf0; |
||||
|
border-bottom: 16px solid #e5ebf0; |
||||
|
} |
||||
|
} |
||||
|
:deep(.ant-menu-submenu-title) { |
||||
|
color: #ffffff !important; |
||||
|
} |
||||
|
</style> |
||||
|
<style lang="less"> |
||||
|
//************************修改顶部菜单弹框样式 |
||||
|
.ant-menu-submenu-placement-bottomLeft { |
||||
|
.ant-menu-submenu { |
||||
|
background: rgb(3 24 53) !important; |
||||
|
} |
||||
|
|
||||
|
.ant-menu-sub { |
||||
|
background: rgb(3 24 53) !important; |
||||
|
} |
||||
|
.ant-menu-title-content { |
||||
|
color: #fff !important; |
||||
|
.ns-icon { |
||||
|
margin-right: 7px; |
||||
|
transform: translateY(2px); |
||||
|
} |
||||
|
} |
||||
|
.ant-menu-submenu-arrow { |
||||
|
color: #fff !important; |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,6 @@ |
|||||
|
/*** |
||||
|
*配置接口 格式 module:Array<resource> |
||||
|
*/ |
||||
|
export const apiModule = { |
||||
|
parking: ['User', 'CurrentUser', 'Organizational'], |
||||
|
}; |
@ -0,0 +1,20 @@ |
|||||
|
import { http } from '/nerv-lib/saas'; |
||||
|
|
||||
|
enum Api { |
||||
|
// USER_LOGIN = '/api/community/objs/Login', //用户登录
|
||||
|
// USER_INFO = '/api/community/community/objs/CurrentUser', //获取用户信息
|
||||
|
|
||||
|
USER_LOGIN = 'api/web/objs/Login', //用户登录
|
||||
|
USER_INFO = 'api/web/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; |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
/** @format */ |
||||
|
import { dateUtil } from '/nerv-lib/util/date-util'; |
||||
|
import mockResource from './resource.json'; |
||||
|
|
||||
|
export const appConfig = { |
||||
|
projectType: 'web', |
||||
|
baseApi: '/api', |
||||
|
enablePermissions: false, |
||||
|
siderPosition: 'left', |
||||
|
baseHeader: '/parkingManage', |
||||
|
baseRouter: '/parkingManage/parkingLotManage', |
||||
|
// userCustomRouterGuard: (to, from, next, whiteNameList, authorizationStore, appConfig) => {
|
||||
|
// console.log({ to, from, next, whiteNameList, authorizationStore, appConfig }, 'routeConfig');
|
||||
|
// next();
|
||||
|
// },
|
||||
|
|
||||
|
// customUpdatePwd: () => import('/@/view/updatePassword/updatePassword.vue'),
|
||||
|
timeout: 60 * 1000, |
||||
|
userLoginApi: () => { |
||||
|
return { |
||||
|
code: 200, |
||||
|
success: true, |
||||
|
data: { userToken: 123123123 }, |
||||
|
}; |
||||
|
}, |
||||
|
userResourceApi: () => { |
||||
|
return { data: mockResource.menus }; |
||||
|
}, |
||||
|
userInfoApi: () => { |
||||
|
return { |
||||
|
code: 200, |
||||
|
success: true, |
||||
|
data: { |
||||
|
accountCode: '1305107806187376793', |
||||
|
accountName: 'adm*n', |
||||
|
accountType: 'admin', |
||||
|
accountStatus: 1, |
||||
|
accountRealName: 'admin', |
||||
|
organizationCode: 'dingcloud', |
||||
|
authConfigList: [], |
||||
|
organizeResCode: [], |
||||
|
leadDepartmentUuidList: [], |
||||
|
}, |
||||
|
}; |
||||
|
}, |
||||
|
useHistoryTag: false, |
||||
|
// 修改密码配置
|
||||
|
updatePassWordInfo: { |
||||
|
title: '修改密码', |
||||
|
subtitle: '芜优出行平台', |
||||
|
api: '/api/web/objs/User/changePassword', |
||||
|
}, |
||||
|
// headerBellInfo: {
|
||||
|
// isShow: true,
|
||||
|
// api: '/api/web/objs/bulletin/readCount',
|
||||
|
// toRouterName: 'NoticeManageIndex',
|
||||
|
// },
|
||||
|
resourceInfo: { |
||||
|
application: { |
||||
|
version: '1.1.74', |
||||
|
label: '停车业务平台', |
||||
|
dataScope: { |
||||
|
scopeMode: 0, |
||||
|
scopeType: '', |
||||
|
dataTips: '', |
||||
|
}, |
||||
|
}, |
||||
|
api: '/qa/Operation/Resources/Pc/init', |
||||
|
token: `${dateUtil().format('YYYYMMDD')}1a329ffasasozozxqq66cfab7`, |
||||
|
}, |
||||
|
}; |
@ -0,0 +1,2 @@ |
|||||
|
import { appConfig } from '/@/config/app.config'; |
||||
|
export { appConfig }; |
@ -0,0 +1,22 @@ |
|||||
|
export enum ResultEnum { |
||||
|
SUCCESS = 0, |
||||
|
ERROR = 1, |
||||
|
TIMEOUT = 401, |
||||
|
TOKEN_INVALID = 403, |
||||
|
} |
||||
|
|
||||
|
export enum RequestEnum { |
||||
|
GET = 'POST', |
||||
|
POST = 'POST', |
||||
|
PUT = 'POST', |
||||
|
DELETE = 'POST', |
||||
|
} |
||||
|
|
||||
|
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', |
||||
|
} |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 251 B |
After Width: | Height: | Size: 923 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 686 B |
@ -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 './theme/global.less'; |
||||
|
import { LeftOutlined } from '@ant-design/icons-vue'; |
||||
|
const app = createApp(App); |
||||
|
app.component('LeftOutlined', LeftOutlined); |
||||
|
saasInit({ |
||||
|
app, |
||||
|
apiModule, |
||||
|
appConfig, |
||||
|
}); |
||||
|
app.mount('#app'); |
@ -0,0 +1,34 @@ |
|||||
|
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue'); |
||||
|
const home = { |
||||
|
path: '/home', |
||||
|
name: 'home', |
||||
|
meta: { title: '首页', icon: 'dicizhishou', index: 0, hideChildren: true }, |
||||
|
redirect: { name: 'homeIndex' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'homeModule', |
||||
|
name: 'HomeModule', |
||||
|
meta: { title: '首页', hideChildren: true, icon: 'dicizhishou' }, |
||||
|
component: Base, |
||||
|
redirect: { name: 'homeIndex' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'index', |
||||
|
name: 'homeIndex', |
||||
|
component: () => import('/@/view/developing.vue'), |
||||
|
meta: { |
||||
|
title: '首页', |
||||
|
keepAlive: true, |
||||
|
backApi: [ |
||||
|
{ |
||||
|
method: 'GET', |
||||
|
url: '/api/objs/FeedbackWeb/feedBackList', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
|
export default home; |
@ -0,0 +1,11 @@ |
|||||
|
/** @format */ |
||||
|
|
||||
|
const RootRoute = { |
||||
|
path: '/', |
||||
|
name: 'root', |
||||
|
redirect: { name: 'home' }, |
||||
|
meta: { |
||||
|
title: 'Root', |
||||
|
}, |
||||
|
}; |
||||
|
export default RootRoute; |
@ -0,0 +1,82 @@ |
|||||
|
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue'); |
||||
|
const organizationManage = { |
||||
|
path: '/organizationManage', |
||||
|
name: 'organizationManage', |
||||
|
meta: { title: '组织管理', icon: 'dicizhishou', index: 99 }, |
||||
|
redirect: { name: 'EnterpriseManage' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'enterpriseManage', |
||||
|
name: 'EnterpriseManage', |
||||
|
meta: { title: '企业管理', hideChildren: true, icon: 'dicizhishou' }, |
||||
|
component: Base, |
||||
|
redirect: { name: 'enterpriseManageIndex' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'index', |
||||
|
name: 'enterpriseManageIndex', |
||||
|
component: () => import('/@/view/organizationManage/enterpriseManage/index.vue'), |
||||
|
meta: { |
||||
|
title: '企业管理', |
||||
|
keepAlive: true, |
||||
|
backApi: [ |
||||
|
{ |
||||
|
method: 'GET', |
||||
|
url: '/api/objs/FeedbackWeb/feedBackList', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
path: 'userManage', |
||||
|
name: 'UserManage', |
||||
|
meta: { title: '用户管理', hideChildren: true, icon: 'dicizhishou' }, |
||||
|
component: Base, |
||||
|
redirect: { name: 'userManageIndex' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'index', |
||||
|
name: 'userManageIndex', |
||||
|
component: () => import('/@/view/developing.vue'), |
||||
|
meta: { |
||||
|
title: '用户管理', |
||||
|
keepAlive: true, |
||||
|
backApi: [ |
||||
|
{ |
||||
|
method: 'GET', |
||||
|
url: '/api/objs/FeedbackWeb/feedBackList', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
path: 'authorityManage', |
||||
|
name: 'AuthorityManage', |
||||
|
meta: { title: '部门/权限', hideChildren: true, icon: 'dicizhishou' }, |
||||
|
component: Base, |
||||
|
redirect: { name: 'authorityManageIndex' }, |
||||
|
children: [ |
||||
|
{ |
||||
|
path: 'index', |
||||
|
name: 'authorityManageIndex', |
||||
|
component: () => import('/@/view/developing.vue'), |
||||
|
meta: { |
||||
|
title: '部门/权限', |
||||
|
keepAlive: true, |
||||
|
backApi: [ |
||||
|
{ |
||||
|
method: 'GET', |
||||
|
url: '/api/objs/FeedbackWeb/feedBackList', |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
|
export default organizationManage; |
@ -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: {}, |
||||
|
}); |
@ -0,0 +1,151 @@ |
|||||
|
.ns-view { |
||||
|
min-height: 100%; |
||||
|
height: 100%; |
||||
|
background: #e5ebf0; |
||||
|
} |
||||
|
.ns-detail-content { |
||||
|
border-top: 16px solid #e5ebf0; |
||||
|
padding: 16px 21px; |
||||
|
background: #fff; |
||||
|
height: calc(100% - 50px); |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-skeleton-paragraph) { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-skeleton-paragraph li:nth-child(n)) { |
||||
|
display: block; |
||||
|
margin-right: 4%; |
||||
|
margin-top: 16px; |
||||
|
margin-bottom: 4px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-skeleton-paragraph li:nth-child(3n + 3)) { |
||||
|
margin-right: 0; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-skeleton-content) { |
||||
|
padding: 0 8px 10px 10px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-descriptions-item-label) { |
||||
|
color: rgba(0, 0, 0, 0.5); |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-descriptions-item-label), |
||||
|
:deep(.ant-descriptions-item-content) { |
||||
|
line-height: 22px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-descriptions-view) { |
||||
|
padding-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-descriptions-item) { |
||||
|
padding-right: 20px; |
||||
|
|
||||
|
&:nth-child(2n) { |
||||
|
padding-left: 20px; |
||||
|
} |
||||
|
|
||||
|
&:nth-child(3n) { |
||||
|
padding-left: 20px; |
||||
|
padding-right: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.descriptions-title { |
||||
|
&:after { |
||||
|
content: ''; |
||||
|
width: 75px; |
||||
|
height: 7px; |
||||
|
display: block; |
||||
|
background: linear-gradient(90deg, #537fff 0%, #fff 82.67%); |
||||
|
margin-left: 2px; |
||||
|
margin-top: -2px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.ns-page-header { |
||||
|
margin-bottom: 0 !important; |
||||
|
padding-top: 7px !important; |
||||
|
padding-bottom: 7px !important; |
||||
|
width: calc(100% + 32px); |
||||
|
margin-left: -16px; |
||||
|
.title { |
||||
|
cursor: pointer; |
||||
|
font-size: 18px !important; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.ns-detail { |
||||
|
border-bottom: 1px solid #ecedef; |
||||
|
|
||||
|
&:last-child { |
||||
|
border-bottom-width: 0; |
||||
|
} |
||||
|
&:first-child { |
||||
|
:deep(.ant-descriptions-header) { |
||||
|
margin-top: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-descriptions-header) { |
||||
|
margin-top: 12px; |
||||
|
margin-bottom: 12px; |
||||
|
|
||||
|
.ant-descriptions-title { |
||||
|
line-height: 16px; |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-image) { |
||||
|
width: 64px; |
||||
|
height: 64px; |
||||
|
img { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
object-fit: contain; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.ns-detail-html { |
||||
|
:deep(table) { |
||||
|
border-top: 1px solid #ffffff; |
||||
|
border-left: 1px solid #ffffff; |
||||
|
|
||||
|
:deep(p) { |
||||
|
font-size: 12px; |
||||
|
color: #898e91; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(th) { |
||||
|
border-right: 1px solid #ffffff; |
||||
|
font-size: 13px; |
||||
|
padding-top: 5px; |
||||
|
padding-bottom: 5px; |
||||
|
font-weight: normal; |
||||
|
background: #eff0f2; |
||||
|
} |
||||
|
|
||||
|
:deep(td) { |
||||
|
border-top: 1px solid #ffffff; |
||||
|
border-right: 1px solid #ffffff; |
||||
|
padding-top: 5px; |
||||
|
padding-bottom: 5px; |
||||
|
font-size: 12px; |
||||
|
color: #606060; |
||||
|
text-align: center; |
||||
|
|
||||
|
:deep(text) { |
||||
|
border-bottom: 1px solid #ffffff; |
||||
|
} |
||||
|
|
||||
|
background: rgba(240, 242, 245, 0.5); |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
.ns-view { |
||||
|
min-height: 100%; |
||||
|
height: 100%; |
||||
|
background: #e5ebf0; |
||||
|
} |
||||
|
|
||||
|
.ns-page-header { |
||||
|
margin-bottom: 0 !important; |
||||
|
padding: 7px 16px !important; |
||||
|
width: calc(100% + 32px); |
||||
|
margin-left: -16px; |
||||
|
|
||||
|
.title { |
||||
|
cursor: pointer; |
||||
|
font-size: 18px !important; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
|
||||
|
.text { |
||||
|
margin-left: 6px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-spin-nested-loading) { |
||||
|
min-height: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-spin-container) { |
||||
|
min-height: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-divider) { |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
.ns-add-form { |
||||
|
border-top: 16px solid #e5ebf0; |
||||
|
padding: 16px 21px; |
||||
|
background: #fff; |
||||
|
height: calc(100% - 47px) !important; |
||||
|
|
||||
|
.ns-form { |
||||
|
|
||||
|
// 第一个子表单Title距离顶部为0 |
||||
|
:deep(.ns-form-item .ns-form-body .ns-child-form-title) { |
||||
|
padding-top: 0; |
||||
|
} |
||||
|
|
||||
|
&:after { |
||||
|
display: none !important; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ns-child-form-title) { |
||||
|
&:after { |
||||
|
content: ''; |
||||
|
width: 75px; |
||||
|
height: 7px; |
||||
|
display: block; |
||||
|
background: linear-gradient(90deg, #537fff 0%, #fff 82.67%); |
||||
|
margin-left: 2px; |
||||
|
margin-top: -7px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ns-form.ns-vertical-form) { |
||||
|
padding-top: 16px !important; |
||||
|
} |
@ -0,0 +1,183 @@ |
|||||
|
//侧边导航 |
||||
|
// .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { |
||||
|
// background: rgb(229, 247, 249) !important; |
||||
|
// } |
||||
|
|
||||
|
// .ant-menu.ant-menu-dark .ant-menu-item-selected { |
||||
|
// color: #fff; |
||||
|
// background: #43BB79 !important; |
||||
|
// } |
||||
|
|
||||
|
// .ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover { |
||||
|
// background-color: #43BB79 !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; |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
/*给字体命名*/ |
||||
|
font-family: 'YouSheBiaoTiHei'; |
||||
|
/*引入字体文件*/ |
||||
|
src: url('/font/YouSheBiaoTiHei.ttf'); |
||||
|
font-weight: normal; |
||||
|
font-style: normal; |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
/*给字体命名*/ |
||||
|
font-family: 'DIN Alternate'; |
||||
|
/*引入字体文件*/ |
||||
|
src: url('/font/DIN Alternate Bold.ttf'); |
||||
|
font-weight: normal; |
||||
|
font-style: normal; |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
/*给字体命名*/ |
||||
|
font-family: 'PingFang Regular'; |
||||
|
/*引入字体文件*/ |
||||
|
src: url('/font/PingFang Regular.ttf'); |
||||
|
font-weight: normal; |
||||
|
font-style: normal; |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
/*给字体命名*/ |
||||
|
font-family: 'HYYakuHei'; |
||||
|
/*引入字体文件*/ |
||||
|
src: url('/font/HYYakuHei-85W.ttf'); |
||||
|
font-weight: normal; |
||||
|
font-style: normal; |
||||
|
} |
||||
|
// .ant-popover-message { |
||||
|
// width: 250px !important; |
||||
|
// height: 198px !important; |
||||
|
// overflow: auto !important; |
||||
|
// position: relative; |
||||
|
|
||||
|
// padding: 0; |
||||
|
// color: rgba(0, 0, 0, 0.85); |
||||
|
// font-size: 14px; |
||||
|
// } |
||||
|
// .ant-popover-inner-content { |
||||
|
// /* padding: 12px 16px; */ |
||||
|
// padding: 0; |
||||
|
// color: rgba(0, 0, 0, 0.85); |
||||
|
// } |
||||
|
|
||||
|
.ant-menu-title-content { |
||||
|
svg { |
||||
|
color: #A1ABC2; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.ant-menu-item-selected { |
||||
|
svg { |
||||
|
color: #D0DBF5; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//状态颜色 |
||||
|
.commonStatus { |
||||
|
&::before{ |
||||
|
content: ''; |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
display: inline-block; |
||||
|
border-radius: 50%; |
||||
|
vertical-align: middle; |
||||
|
margin-right: 4px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusWarn { |
||||
|
&::before{ |
||||
|
background-color: #fa8214; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusSuccess { |
||||
|
&::before{ |
||||
|
background-color: #0D9E3E; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusRunning { |
||||
|
&::before{ |
||||
|
background-color: #1C4DDC; |
||||
|
} |
||||
|
} |
||||
|
.statusError { |
||||
|
&::before{ |
||||
|
background-color: #D4321C; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusEmpty { |
||||
|
&::before{ |
||||
|
width:0; |
||||
|
} |
||||
|
width:0; |
||||
|
} |
||||
|
|
||||
|
.statusNotStart { |
||||
|
&::before{ |
||||
|
background-color: #8B98AB; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusDone{ |
||||
|
&::before{ |
||||
|
background-color: #697383; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.statusInvalid{ |
||||
|
&::before{ |
||||
|
background-color: #AEAEAE; |
||||
|
} |
||||
|
} |
@ -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'); |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
font-family: 'Fzltth_SC'; |
||||
|
src: url('/asset/font/Fzltth_SC.otf') format('truetype'); |
||||
|
} |
||||
|
|
||||
|
//侧边导航 |
||||
|
// .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { |
||||
|
// background: rgb(229, 247, 249) !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; |
||||
|
} |
||||
|
.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-active::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-active::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-open::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-open::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item-selected::after, .ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected::after { |
||||
|
border-bottom: unset !important; |
||||
|
} |
||||
|
.ant-menu-horizontal{ |
||||
|
border-bottom: unset !important; |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
@import "variable"; |
||||
|
@import "global"; |
@ -0,0 +1,36 @@ |
|||||
|
// @import "./global-antd.less"; |
||||
|
@primary-color: #ff7602; // 全局主色 |
||||
|
@layout-header-hover: #924908; //hover |
||||
|
@layout-header-background: #111519; // 头部背景色 |
||||
|
// @layout-header-background:url(/asset/image/header_background.png) no-repeat; |
||||
|
// @ant-layout-sider-collapsed-background:url(/asset/image/sider_collapsed_background.png) no-repeat; |
||||
|
|
||||
|
|
||||
|
//btn |
||||
|
// @btn-height-base: 30px; |
||||
|
// @btn-height-lg: 30px; |
||||
|
// @btn-disable-bg: #dfe3e9; //禁用按钮background |
||||
|
// @btn-disable-border: 1px solid #ced0da; |
||||
|
|
||||
|
// @btn-link-hover-bg: #37ABC4; |
||||
|
// @btn-text-hover-bg: #46ebdb; |
||||
|
|
||||
|
|
||||
|
// //input |
||||
|
// @input-height-base: 30px; |
||||
|
|
||||
|
|
||||
|
// //form |
||||
|
// @label-color: #52616f; //form-lable颜色 |
||||
|
|
||||
|
|
||||
|
// @form-item-margin-bottom: 16px; |
||||
|
|
||||
|
// //menu |
||||
|
|
||||
|
|
||||
|
//spin |
||||
|
|
||||
|
|
||||
|
// @border-width-base: 1px; |
||||
|
// @border-style-base: solid; |
@ -0,0 +1 @@ |
|||||
|
declare module '*.vue'; |
@ -0,0 +1,21 @@ |
|||||
|
export function debounce(_this: any, fn: (arg0: any) => void) { |
||||
|
// 用rAF去做防抖
|
||||
|
return function (...args: any) { |
||||
|
if (_this.lock) return; |
||||
|
const run = function () { |
||||
|
// requestIdleCallback-任务调度
|
||||
|
window.requestIdleCallback(function (deadline) { |
||||
|
_this.lock = true; |
||||
|
// 判断空闲时间
|
||||
|
// 显示器刷新频率HZ 16.7ms内不会重复执行
|
||||
|
if (deadline.timeRemaining() > 1000 / 60) { |
||||
|
fn(...args); |
||||
|
_this.lock = false; |
||||
|
} else { |
||||
|
run(); |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
run(); |
||||
|
}; |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
<template> |
||||
|
<div class="content">{{ content }}</div> |
||||
|
</template> |
||||
|
<script lang="ts" setup> |
||||
|
import { useRouter } from 'vue-router'; |
||||
|
console.log(useRouter().currentRoute.value.meta); |
||||
|
|
||||
|
const content = useRouter().currentRoute.value.meta.title + 'developing'; |
||||
|
</script> |
||||
|
<style scoped lang="less"> |
||||
|
.content { |
||||
|
font-size: 30px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,101 @@ |
|||||
|
import { dateUtil } from '/nerv-lib/util/date-util'; |
||||
|
|
||||
|
export const tableConfig = { |
||||
|
title: '企业管理', |
||||
|
api: '/carbon_emission/device/getDeviceList', |
||||
|
|
||||
|
params: { |
||||
|
page: 0, |
||||
|
pageSize: 10, |
||||
|
}, |
||||
|
rowSelection: null, |
||||
|
columns: [ |
||||
|
{ |
||||
|
title: '设备id', |
||||
|
dataIndex: 'id', |
||||
|
}, |
||||
|
{ |
||||
|
title: '设备编号', |
||||
|
dataIndex: 'deviceCode', |
||||
|
}, |
||||
|
{ |
||||
|
title: '设备名称', |
||||
|
dataIndex: 'deviceName', |
||||
|
textNumber: 8, |
||||
|
textEllipsis: true, |
||||
|
}, |
||||
|
{ |
||||
|
title: '设备类别', |
||||
|
dataIndex: 'position', |
||||
|
}, |
||||
|
], |
||||
|
columnActions: { |
||||
|
title: '操作', |
||||
|
actions: [ |
||||
|
{ |
||||
|
label: '删除', |
||||
|
name: 'AppointMessageRefund', |
||||
|
confirm: true, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
|
||||
|
formConfig: { |
||||
|
schemas: [ |
||||
|
{ |
||||
|
field: 'createTime', |
||||
|
label: '支付时间', |
||||
|
component: 'NsRangePicker', |
||||
|
fieldMap: ['queryStartDate', 'queryEndDate'], |
||||
|
componentProps: { |
||||
|
valueFormat: 'YYYY-MM-DD', |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
field: 'payWay', |
||||
|
label: '支付方式', |
||||
|
component: 'NsSelect', |
||||
|
componentProps: { |
||||
|
placeholder: '请选择', |
||||
|
options: [ |
||||
|
{ |
||||
|
label: '全部', |
||||
|
value: '', |
||||
|
}, |
||||
|
{ |
||||
|
label: '现金', |
||||
|
value: 1, |
||||
|
}, |
||||
|
{ |
||||
|
label: '支付宝', |
||||
|
value: 2, |
||||
|
}, |
||||
|
{ |
||||
|
label: '微信', |
||||
|
value: 3, |
||||
|
}, |
||||
|
// {
|
||||
|
// label: '丰收互联',
|
||||
|
// value: 4,
|
||||
|
// },
|
||||
|
// {
|
||||
|
// label: '银联云闪付',
|
||||
|
// value: 5,
|
||||
|
// },
|
||||
|
// {
|
||||
|
// label: '余额',
|
||||
|
// value: 6,
|
||||
|
// },
|
||||
|
{ |
||||
|
label: '优惠支付', |
||||
|
value: 7, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
params: {}, |
||||
|
}, |
||||
|
// pagination: { pageSizeOptions: false },
|
||||
|
rowKey: 'uuid', |
||||
|
}; |
@ -0,0 +1,7 @@ |
|||||
|
<template> |
||||
|
<ns-view-list-table v-bind="tableConfig" /> |
||||
|
</template> |
||||
|
<script lang="ts" setup> |
||||
|
import { tableConfig } from '/@/view/organizationManage/enterpriseManage/config'; |
||||
|
</script> |
||||
|
<style lang="less" scoped></style> |
@ -0,0 +1,51 @@ |
|||||
|
{ |
||||
|
"compilerOptions": { |
||||
|
"allowJs": true, |
||||
|
"baseUrl": "./", |
||||
|
"esModuleInterop": true, |
||||
|
"forceConsistentCasingInFileNames": true, |
||||
|
"jsx": "preserve", |
||||
|
"lib": ["esnext", "dom"], |
||||
|
"module": "esnext", |
||||
|
"moduleResolution": "node", |
||||
|
"noUnusedLocals": true, |
||||
|
"noUnusedParameters": true, |
||||
|
"paths": { |
||||
|
"/@/*": [ |
||||
|
"src/*" |
||||
|
], |
||||
|
"/nerv-lib/*": [ |
||||
|
"../lib/*" |
||||
|
], |
||||
|
"/nerv-base/*": [ |
||||
|
"../lib/saas/*" |
||||
|
], |
||||
|
"/type/*": [ |
||||
|
"../type/*" |
||||
|
] |
||||
|
}, |
||||
|
"resolveJsonModule": true, |
||||
|
"skipLibCheck": true, |
||||
|
"sourceMap": true, |
||||
|
"strict": true, |
||||
|
"strictFunctionTypes": false, |
||||
|
"target": "esnext", |
||||
|
"typeRoots": [ |
||||
|
"../node_modules/@types", |
||||
|
"../node_modules/@vue", |
||||
|
"../type" |
||||
|
], |
||||
|
"types": ["vite/client"] |
||||
|
}, |
||||
|
"include": [ |
||||
|
"src/**/*", |
||||
|
"type/**/*", |
||||
|
"mock/**/*", |
||||
|
"vite.config.ts" |
||||
|
], |
||||
|
"exclude": [ |
||||
|
"node_modules", |
||||
|
"dist", |
||||
|
"**/*.js" |
||||
|
] |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
import configFun from '../build/vite-default.config'; |
||||
|
const dirname = __dirname; |
||||
|
const proxy = { |
||||
|
'/qa': { |
||||
|
target: 'http://100.86.13.179:8080/qa', |
||||
|
// target: 'http://100.86.13.206:8081/qa',
|
||||
|
changeOrigin: true, |
||||
|
rewrite: (path) => path.replace(/^\/qa/, ''), |
||||
|
}, |
||||
|
'/carbon_emission': { |
||||
|
target: 'http://140.210.143.1:14492', |
||||
|
changeOrigin: true, |
||||
|
}, |
||||
|
}; |
||||
|
export default configFun({ dirname, proxy, serviceMode: 'saas', baseDir: '../' }); |