@ -0,0 +1,10 @@ |
|||
# port |
|||
VITE_PORT = 3301 |
|||
#mode |
|||
VITE_GLOB_APP_RUN_TYPE = saas |
|||
|
|||
# spa-title |
|||
VITE_GLOB_APP_TITLE = hx-ai-intelligent Depositor |
|||
|
|||
# spa shortname |
|||
VITE_GLOB_APP_SHORT_NAME = hx-ai-intelligent-depositor |
@ -0,0 +1,22 @@ |
|||
# Whether to open mock |
|||
VITE_USE_MOCK = true |
|||
|
|||
# public path |
|||
VITE_PUBLIC_PATH = /hx-op/ |
|||
|
|||
# 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 = /hx-op/ |
|||
|
|||
# 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 @@ |
|||
0.0.1 |
@ -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> |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 55 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,215 @@ |
|||
<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'; |
|||
export default defineComponent({ |
|||
name: 'App', |
|||
|
|||
setup() { |
|||
const router = useRouter(); |
|||
|
|||
const cachedViews = ['Status']; |
|||
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,9 @@ |
|||
const BASE_URL = '/carbon-smart'; |
|||
|
|||
export enum enterPrise { |
|||
list = `${BASE_URL}/admin/org/queryByPage`, |
|||
del = `${BASE_URL}/admin/org/del`, |
|||
edit = `${BASE_URL}/admin/org/edit`, |
|||
save = `${BASE_URL}/admin/org/save`, |
|||
link = `${BASE_URL}/admin/org/link`, |
|||
} |
@ -0,0 +1,17 @@ |
|||
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) => 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]` 父级区域唯一标识 |
|||
*/ |
@ -0,0 +1,108 @@ |
|||
/** @format */ |
|||
|
|||
import { http } from '/nerv-lib/saas'; |
|||
import { ref } from 'vue'; |
|||
|
|||
const value = ref('1'); |
|||
const transform = (data, map) => { |
|||
return Object.keys(map).reduce((pre, cur) => { |
|||
pre[cur] = data[map[cur]]; |
|||
return pre; |
|||
}, {}); |
|||
}; |
|||
export const appConfig = { |
|||
projectType: 'web', |
|||
baseApi: '/api', |
|||
enablePermissions: false, |
|||
// themeColor: '#eee',
|
|||
siderPosition: 'left', |
|||
baseHeader: '/parkingManage', |
|||
baseRouter: '/parkingManage/parkingLotManage', |
|||
themeConfig: { |
|||
bgImageUrl: `${import.meta.env.VITE_PUBLIC_PATH}/asset/image/login/background.png`, |
|||
}, |
|||
// userCustomRouterGuard: (to, from, next, whiteNameList, authorizationStore, appConfig) => {
|
|||
// console.log({ to, from, next, whiteNameList, authorizationStore, appConfig }, 'routeConfig');
|
|||
// next();
|
|||
// },
|
|||
|
|||
// customUpdatePwd: () => import('/@/view/updatePassword/updatePassword.vue'),
|
|||
|
|||
// userInfoApi: () => {
|
|||
// return {
|
|||
// code: 200,
|
|||
// success: true,
|
|||
// data: {
|
|||
// accountCode: '1305107806187376793',
|
|||
// accountName: 'adm*n',
|
|||
// accountType: 'admin',
|
|||
// accountStatus: 1,
|
|||
// accountRealName: 'admin',
|
|||
// organizationCode: 'dingcloud',
|
|||
// authConfigList: [],
|
|||
// organizeResCode: [],
|
|||
// leadDepartmentUuidList: [],
|
|||
// },
|
|||
// };
|
|||
// },
|
|||
|
|||
// headerSlotConfig: {
|
|||
// component: 'NsSelect',
|
|||
// componentProps: {
|
|||
// style: { width: '200px' },
|
|||
// placeholder: '请选择',
|
|||
// value,
|
|||
// onChange: (cur) => {
|
|||
// value.value = cur;
|
|||
// },
|
|||
// options: [
|
|||
// { label: '济阳', value: '1' },
|
|||
// { label: '临沂', value: '2' },
|
|||
// ],
|
|||
// },
|
|||
// },
|
|||
timeout: 60 * 1000, |
|||
userLoginApi: '/carbon-smart/user/login', |
|||
userResourceApi: () => { |
|||
return { data: [] }; |
|||
}, |
|||
userInfoApi: () => { |
|||
return http.post('/carbon-smart/user/login/logInInfo').then((res) => { |
|||
const info = res.data; |
|||
const trD = transform(info, { |
|||
accountCode: 'userId', |
|||
accountName: 'realName', |
|||
accountRealName: 'realName', |
|||
orgId: 'orgId', |
|||
orgName: 'orgName', |
|||
projectId: 'projectId', |
|||
}); |
|||
return { data: { ...trD } }; |
|||
}); |
|||
}, |
|||
|
|||
useHistoryTag: false, |
|||
// 修改密码配置
|
|||
updatePassWordInfo: { |
|||
title: '修改密码', |
|||
subtitle: 'huaxing平台', |
|||
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: permission.add,
|
|||
}, |
|||
}; |
@ -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: 503 B |
After Width: | Height: | Size: 686 B |
@ -0,0 +1,18 @@ |
|||
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'; |
|||
// import ElementPlus from 'element-plus'
|
|||
// import 'element-plus/dist/index.css'
|
|||
const app = createApp(App); |
|||
app.component('LeftOutlined', LeftOutlined); |
|||
saasInit({ |
|||
app, |
|||
apiModule, |
|||
appConfig, |
|||
}); |
|||
// app.use(ElementPlus)
|
|||
app.mount('#app'); |
@ -0,0 +1,29 @@ |
|||
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: [],
|
|||
}, |
|||
}, |
|||
], |
|||
}, |
|||
], |
|||
}; |
|||
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,29 @@ |
|||
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue'); |
|||
const organizationManage = { |
|||
path: '/organizationManage', |
|||
name: 'organizationManage', |
|||
meta: { title: '企业管理', icon: 'dicizhishou', index: 99, hideChildren: true }, |
|||
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: [],
|
|||
}, |
|||
}, |
|||
], |
|||
}, |
|||
], |
|||
}; |
|||
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,74 @@ |
|||
<template> |
|||
<a-modal title="企业信息" :width="600" v-model:visible="visible" @ok="handleOk"> |
|||
<ns-form ref="formRef" :schemas="formSchema" :model="formData" formLayout="vertical" /> |
|||
</a-modal> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { defineComponent, reactive, ref } from 'vue'; |
|||
export default defineComponent({ |
|||
name: 'AddBorderVisible', |
|||
setup() { |
|||
let formData = ref({}); |
|||
const formRef = ref(); |
|||
const visible = ref(false); |
|||
const toggle = () => { |
|||
visible.value = !visible.value; |
|||
}; |
|||
const formSchema = reactive([ |
|||
{ |
|||
field: 'name', |
|||
label: '企业名称', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入企业名称', |
|||
maxLength: 20, |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入企业名称', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
field: 'Isshare', |
|||
label: '点位数据', |
|||
component: 'NsRadioGroup', |
|||
componentProps: { |
|||
radioType: 'radio', |
|||
options: [ |
|||
{ label: '分享', value: 1 }, |
|||
{ label: '不分享', value: 2 }, |
|||
], |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请选择是否分享', |
|||
type: 'number', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
]); |
|||
const handleOk = () => { |
|||
formRef.value?.triggerSubmit().then(() => { |
|||
toggle(); |
|||
}); |
|||
}; |
|||
return { handleOk, formData, formSchema, visible, toggle, formRef }; |
|||
}, |
|||
}); |
|||
</script> |
|||
|
|||
<style lang="less" scoped> |
|||
// :deep(.ns-child-form) { |
|||
// width: 1100px !important; |
|||
// justify-content: flex-start !important; |
|||
// } |
|||
// :deep(.ant-input-group-addon) { |
|||
// border: 0px solid #dcdfe2 !important; |
|||
// } |
|||
</style> |
@ -0,0 +1,335 @@ |
|||
import { mockData } from './mock'; |
|||
import { cloneDeep } from 'lodash-es'; |
|||
import { Modal } from 'ant-design-vue'; |
|||
import { createVNode, ref } from 'vue'; |
|||
import { NsMessage } from '/nerv-lib/component'; |
|||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; |
|||
import { enterPrise } from '/@/api/origanizemanage'; |
|||
|
|||
export const formConfig = [ |
|||
{ |
|||
field: 'zuzhi', |
|||
label: '组织ID', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入组织ID', |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入组织编号', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
field: 'jituanname', |
|||
label: '企业名称', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入企业名称', |
|||
maxLength: 20, |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入企业名称', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
field: 'jituanname', |
|||
label: '集团名称', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入集团名称', |
|||
maxLength: 20, |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'cityName', |
|||
label: '省市区', |
|||
component: 'NsInputCity', |
|||
defaultValue: '', |
|||
fieldMap: ['provinceName', 'cityName', 'areaName', 'province', 'city', 'area'], |
|||
componentProps: { |
|||
placeholder: '请选择', |
|||
api: '/api/parking_merchant/objs/BaseArea', |
|||
isSeparate: true, |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请选择区域', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
field: 'address', |
|||
label: '地址', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入地址', |
|||
maxLength: 50, |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'person', |
|||
label: '联系人', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入联系人', |
|||
maxLength: 10, |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入联系人', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
field: 'phone', |
|||
label: '联系电话', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
placeholder: '请输入联系电话', |
|||
maxLength: 11, |
|||
}, |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '请输入联系电话', |
|||
trigger: 'blur', |
|||
}, |
|||
], |
|||
}, |
|||
]; |
|||
|
|||
export const tableConfig = (visible) => { |
|||
return { |
|||
// title: '企业管理',
|
|||
api: enterPrise.list, |
|||
headerActions: [ |
|||
{ |
|||
label: '新增', |
|||
name: 'RoleTypeAdd', |
|||
type: 'primary', |
|||
handle: () => { |
|||
opMap.type = 'add'; |
|||
opMap.fuc = (formData: any) => { |
|||
console.log(formData, 'formData'); |
|||
mockData.value.push({ |
|||
id: Math.random().toString().slice(2, 6), |
|||
...cloneDeep(formData), |
|||
}); |
|||
}; |
|||
visible.value = true; |
|||
}, |
|||
}, |
|||
], |
|||
|
|||
rowSelection: null, |
|||
columns: [ |
|||
{ |
|||
title: '序号', |
|||
dataIndex: 'address', |
|||
width: 80, |
|||
customRender: (text: any) => { |
|||
return text.index + 1; |
|||
}, |
|||
}, |
|||
{ |
|||
title: '组织ID', |
|||
dataIndex: 'orgCode', |
|||
}, |
|||
{ |
|||
title: '集团名称', |
|||
dataIndex: 'intro', |
|||
}, |
|||
{ |
|||
title: '组织名称', |
|||
dataIndex: 'orgName', |
|||
}, |
|||
{ |
|||
title: '状态', |
|||
dataIndex: 'status', |
|||
}, |
|||
{ |
|||
title: '省市区', |
|||
dataIndex: 'area', |
|||
customRender: ({ record }) => { |
|||
const { province = '', city = '', county = '' } = record; |
|||
return `${province}/${city}/${county}`; |
|||
}, |
|||
}, |
|||
{ |
|||
title: '地址', |
|||
dataIndex: 'address', |
|||
}, |
|||
{ |
|||
title: '联系人', |
|||
dataIndex: 'person', |
|||
}, |
|||
{ |
|||
title: '联系电话', |
|||
dataIndex: 'phone', |
|||
}, |
|||
], |
|||
columnActions: { |
|||
title: '操作', |
|||
actions: [ |
|||
{ |
|||
label: '编辑', |
|||
name: 'RoleTypeEdit', |
|||
handle: (record: any) => { |
|||
console.log(record, 'record'); |
|||
formData.value = record; |
|||
opMap.type = 'edit'; |
|||
opMap.fuc = (formData: any) => { |
|||
Object.assign(mockData.value.filter((item) => item.id === record.id)[0], formData); |
|||
}; |
|||
visible.value = true; |
|||
}, |
|||
}, |
|||
{ |
|||
label: '组织边界', |
|||
handle: (record: any) => { |
|||
console.log(record, 'record'); |
|||
borderVisible.value = true; |
|||
}, |
|||
}, |
|||
{ |
|||
label: '服务', |
|||
handle: (record: any) => { |
|||
console.log(record, 'record'); |
|||
serviceVisible.value = true; |
|||
}, |
|||
}, |
|||
{ |
|||
label: '冻结', |
|||
name: 'RoleTypeEdit', |
|||
handle: (record: any) => { |
|||
console.log(record, 'record'); |
|||
Modal.confirm({ |
|||
title: '是否冻结该账户', |
|||
icon: createVNode(ExclamationCircleOutlined), |
|||
content: createVNode('div', { style: 'color:red;' }, ''), |
|||
onOk() { |
|||
NsMessage.success('冻结成功'); |
|||
}, |
|||
class: 'test', |
|||
}); |
|||
}, |
|||
}, |
|||
{ |
|||
label: '重置密码', |
|||
name: 'RoleTypeEdit', |
|||
handle: (record: any) => { |
|||
console.log(record, 'record'); |
|||
Modal.confirm({ |
|||
title: '重置密码', |
|||
icon: createVNode(ExclamationCircleOutlined), |
|||
okText: '重置', |
|||
content: h('div', {}, [ |
|||
h('p', `企业名称: ${record.jituanname}`), |
|||
h('p', '管理员账号: hxdtadmin'), |
|||
]), |
|||
onOk() { |
|||
Modal.confirm({ |
|||
icon: createVNode(ExclamationCircleOutlined), |
|||
content: '是否确认重置该企业管理员密码', |
|||
onOk() { |
|||
Modal.success({ |
|||
okText: '确认', |
|||
content: h('div', {}, [ |
|||
h('p', '重置成功'), |
|||
h('p', '点击【确认】后自动复制密码并离开'), |
|||
]), |
|||
}); |
|||
}, |
|||
}); |
|||
}, |
|||
|
|||
onCancel() { |
|||
console.log('Cancel'); |
|||
}, |
|||
class: 'test', |
|||
}); |
|||
}, |
|||
}, |
|||
{ |
|||
label: '删除', |
|||
name: 'RoleTypeEdit', |
|||
dynamicParams: 'orgId', |
|||
confirm: true, |
|||
isReload: true, |
|||
api: enterPrise.del, |
|||
}, |
|||
], |
|||
}, |
|||
|
|||
formConfig: { |
|||
schemas: [ |
|||
{ |
|||
field: 'zuzhibianhao', |
|||
label: '组织ID', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
maxLength: 20, |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'jituanname', |
|||
label: '集团名称', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
maxLength: 20, |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'zuzhiname', |
|||
label: '组织名称', |
|||
component: 'NsInput', |
|||
componentProps: { |
|||
maxLength: 20, |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'status', |
|||
label: '状态', |
|||
component: 'NsSelect', |
|||
componentProps: { |
|||
options: [ |
|||
{ |
|||
label: '正常', |
|||
value: 1, |
|||
}, |
|||
{ |
|||
label: '冻结', |
|||
value: 2, |
|||
}, |
|||
], |
|||
}, |
|||
}, |
|||
{ |
|||
field: 'cityName', |
|||
label: '城市地区', |
|||
component: 'NsInputCity', |
|||
defaultValue: '', |
|||
fieldMap: ['provinceName', 'cityName', 'areaName', 'province', 'city', 'area'], |
|||
componentProps: { |
|||
api: '/api/parking_merchant/objs/BaseArea', |
|||
isSeparate: true, |
|||
}, |
|||
}, |
|||
], |
|||
params: {}, |
|||
}, |
|||
// pagination: { defaultPageSize: 10 },
|
|||
rowKey: 'id', |
|||
}; |
|||
}; |
@ -0,0 +1,175 @@ |
|||
<!-- @format --> |
|||
|
|||
<template> |
|||
<ns-view-list-table v-bind="tableConfig" :model="data" ref="mainRef" rowKey="uuid" /> |
|||
<a-drawer |
|||
:width="600" |
|||
:visible="visible" |
|||
:body-style="{ paddingBottom: '80px' }" |
|||
:footer-style="{ textAlign: 'right' }" |
|||
destroyOnClose |
|||
@close="onClose"> |
|||
<ns-form ref="formRef" :schemas="formSchema" :model="formData" formLayout="vertical" /> |
|||
<template #footer> |
|||
<a-button style="margin-right: 8px" @click="onClose">取消</a-button> |
|||
<a-button type="primary" @click="onEdit">确定</a-button> |
|||
</template> |
|||
</a-drawer> |
|||
<a-drawer |
|||
:width="600" |
|||
:visible="borderVisible" |
|||
:body-style="{ paddingBottom: '80px' }" |
|||
:footer-style="{ textAlign: 'right' }" |
|||
destroyOnClose |
|||
@close="onClose"> |
|||
<a-button type="primary" @click="borderAdd">新增</a-button> |
|||
<a-button type="primary" style="margin-left: 10px; margin-bottom: 10px" @click="borderAddSon" |
|||
>新增子集</a-button |
|||
> |
|||
<a-directory-tree @select="handleSelect" multiple :tree-data="treeData"> |
|||
<template #title="{ title, key }"> |
|||
{{ title }} |
|||
<a-button type="link" @click="editTree(title, key)">编辑</a-button> |
|||
<a-button type="link" danger @click="deleteTree(title, key)">删除</a-button> |
|||
</template> |
|||
</a-directory-tree> |
|||
</a-drawer> |
|||
|
|||
<a-drawer |
|||
:width="600" |
|||
:visible="serviceVisible" |
|||
:body-style="{ paddingBottom: '80px' }" |
|||
:footer-style="{ textAlign: 'right' }" |
|||
destroyOnClose |
|||
@close="onClose"> |
|||
<a-input-search |
|||
placeholder="请选择开通模块" |
|||
v-model:value="searchValue" |
|||
style="margin-bottom: 8px" |
|||
@search="onSearch" /> |
|||
<a-tree |
|||
:tree-data="treeData" |
|||
v-model:checkedKeys="checkedKeys" |
|||
checkable |
|||
@select="ServiceSelect"> |
|||
<template #title="{ title }"> |
|||
{{ title }} |
|||
</template> |
|||
</a-tree> |
|||
<ns-button style="margin: 20px" type="primary" @click="onClose">取消</ns-button> |
|||
<ns-button type="primary" @click="Sure">确定</ns-button> |
|||
</a-drawer> |
|||
|
|||
<TreeAdd ref="treeAdd" /> |
|||
</template> |
|||
<script lang="ts" setup> |
|||
import { Modal } from 'ant-design-vue'; |
|||
import { computed, createVNode, defineComponent, reactive, ref, watch } from 'vue'; |
|||
import { http } from '/nerv-lib/util/http'; |
|||
import { cloneDeep } from 'lodash-es'; |
|||
import TreeAdd from './TreeAdd.vue'; |
|||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; |
|||
import { h } from 'vue'; |
|||
import { formConfig } from './config'; |
|||
import { NsMessage } from '/nerv-lib/component'; |
|||
import { mockData, treeData } from './mock'; |
|||
import { enterPrise } from '/@/api/origanizemanage'; |
|||
import { tableConfig as insertConfig } from './config'; |
|||
defineOptions({ |
|||
name: 'EnterpriseManageIndex', |
|||
}); |
|||
|
|||
const data = reactive({}); |
|||
const treeAdd = ref(); |
|||
const mainRef = ref(); |
|||
let formData = ref({}); |
|||
const formRef = ref(); |
|||
const searchValue = ref<string>(''); |
|||
const checkedKeys = ref<string[]>([]); |
|||
const visible = ref(false); |
|||
const borderVisible = ref(false); |
|||
const serviceVisible = ref(false); |
|||
const treeAddVisible = ref(false); |
|||
const formSchema = formConfig; |
|||
const tableConfig = computed(() => { |
|||
return insertConfig(visible); |
|||
}); |
|||
const opMap: any = { |
|||
type: 'add', |
|||
fuc: () => {}, |
|||
record: {}, |
|||
}; |
|||
|
|||
watch(checkedKeys, () => { |
|||
console.log('checkedKeys', checkedKeys.value); |
|||
}); |
|||
|
|||
const handleSelect = (selectedKeys: any, info: any) => { |
|||
console.log(selectedKeys, 'selectedKeys'); |
|||
console.log(info, 'info'); |
|||
}; |
|||
|
|||
const ServiceSelect = (selectedKeys: any, info: any) => { |
|||
console.log(selectedKeys, 'selectedKeys'); |
|||
console.log(info, 'info'); |
|||
}; |
|||
|
|||
const onClose = () => { |
|||
visible.value = false; |
|||
borderVisible.value = false; |
|||
serviceVisible.value = false; |
|||
}; |
|||
|
|||
const borderAdd = () => { |
|||
treeAddVisible.value = true; |
|||
treeAdd.value?.toggle(); |
|||
}; |
|||
|
|||
const borderAddSon = () => { |
|||
treeAddVisible.value = true; |
|||
}; |
|||
|
|||
const onEdit = () => { |
|||
formRef.value?.triggerSubmit().then(() => { |
|||
console.log(formData.value, 'formData.value'); |
|||
opMap.fuc && opMap.fuc(formData.value); |
|||
visible.value = false; |
|||
}); |
|||
}; |
|||
|
|||
const Sure = () => { |
|||
serviceVisible.value = false; |
|||
}; |
|||
|
|||
const editTree = (title: any, key: any) => { |
|||
console.log(title, 'title'); |
|||
console.log(key, 'key'); |
|||
}; |
|||
|
|||
const deleteTree = (title: any, key: any) => { |
|||
console.log(title, 'title'); |
|||
console.log(key, 'key'); |
|||
Modal.confirm({ |
|||
title: '是否确定删除', |
|||
icon: createVNode(ExclamationCircleOutlined), |
|||
content: createVNode('div', { style: 'color:red;' }, ''), |
|||
onOk() { |
|||
// http |
|||
// .post('/api/parking_merchant/objs/gateInfo/delete', { |
|||
// uuid: record.uuid, |
|||
// }) |
|||
// .then((res) => { |
|||
// mainRef.value.nsTableRef.reload(); |
|||
// }); |
|||
}, |
|||
onCancel() { |
|||
console.log('Cancel'); |
|||
}, |
|||
class: 'test', |
|||
}); |
|||
}; |
|||
|
|||
const onSearch = () => { |
|||
console.log(searchValue.value); |
|||
}; |
|||
</script> |
@ -0,0 +1,43 @@ |
|||
import { ref } from 'vue'; |
|||
|
|||
export const mockData = ref([ |
|||
{ |
|||
id: 3, |
|||
zuzhi: '22', |
|||
jituanname: 'axb', |
|||
zuzhiname: '张三', |
|||
status: '男', |
|||
area: '123456789', |
|||
address: '1234567889', |
|||
person: '1', |
|||
phone: '1', |
|||
}, |
|||
]); |
|||
|
|||
export const mockData2 = ref([ |
|||
{ |
|||
information: '铁路局1/产品部1/产品总监1', |
|||
}, |
|||
]); |
|||
|
|||
export const treeData = ref([ |
|||
{ |
|||
title: '铁路总局', |
|||
key: '0-0', |
|||
children: [ |
|||
{ title: '济阳站', key: '0-0-0' }, |
|||
{ title: '临沂站', key: '0-0-1' }, |
|||
], |
|||
}, |
|||
]); |
|||
|
|||
export const treeData2 = [ |
|||
{ |
|||
title: '全部', |
|||
key: '0-0', |
|||
children: [ |
|||
{ title: '产品部', key: '0-0-0' }, |
|||
{ title: '运维部', key: '0-0-1' }, |
|||
], |
|||
}, |
|||
]; |
@ -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,20 @@ |
|||
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, |
|||
}, |
|||
'/carbon-smart': { |
|||
target: 'http://192.168.112.144:8224', |
|||
changeOrigin: true, |
|||
rewrite: (path) => path.replace(/^\/carbon-smart/, ''), |
|||
}, |
|||
}; |
|||
export default configFun({ dirname, proxy, serviceMode: 'saas', baseDir: '../' }); |