@ -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: '../' }); |