This commit is contained in:
863620989 2025-04-27 18:26:34 +08:00
commit 8ca8f2b2a0
11 changed files with 749 additions and 386 deletions

View File

@ -1,5 +1,6 @@
const config = { const config = {
apiUrl: "http://192.168.2.156:10010/", //apiUrl: "http://192.168.2.156:10010/",
apiUrl: "https://attiya.fun/ebike/",
cdnPath: "/", cdnPath: "/",
ERR_OK: 200, ERR_OK: 200,
sm2PublicKey: "04f5084ee12767d932f293508e30e3b0100185042ec0f061dedaf92b793b93f79fd6179d5e47e25b7aec98e00cf90dd56df1f8191012537187e7bbfd2d1de299fc", //f8209a2ebe6691e41e1f2b667bfe71f0b511716cc0f7c4452502fc12ec3957e4 sm2PublicKey: "04f5084ee12767d932f293508e30e3b0100185042ec0f061dedaf92b793b93f79fd6179d5e47e25b7aec98e00cf90dd56df1f8191012537187e7bbfd2d1de299fc", //f8209a2ebe6691e41e1f2b667bfe71f0b511716cc0f7c4452502fc12ec3957e4

View File

@ -4,10 +4,10 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/src/assets/logo.png" type="image/png"> <link rel="icon" href="/src/assets/logo.png" type="image/png">
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>克能单车</title> <title>景上出行</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app" style="background-color: rgb(0,21,41);"></div>
<script type="module" src="/src/main.js"></script> <script type="module" src="/src/main.js"></script>
</body> </body>
</html> </html>

View File

@ -1,26 +1,29 @@
export function getCache(name) { export function getCache(name) {
if (name == undefined || name == "") { if (name == undefined || name == "") {
return ""; return "";
}
let result = sessionStorage.getItem(name);
if (result != null) {
if ((result.startsWith("{") && result.endsWith("}")) || (result.startsWith("[") && result.endsWith("]"))) {
result = JSON.parse(result);
} }
//let result = localStorage.getItem(name);
let result = sessionStorage.getItem(name);
if (result!= null) {
if ((result.startsWith("{") && result.endsWith("}")) || (result.startsWith("[") && result.endsWith("]"))) {
result = JSON.parse(result);
}
}
return result;
} }
return result;
} export function setCache(name, value) {
if (name == undefined || name == "") {
export function setCache(name, value) { return false;
if (name == undefined || name == "") { }
return false; if(typeof value === 'object') {
} value = JSON.stringify(value);
if (typeof value === 'object') { }
value = JSON.stringify(value); //let result = localStorage.setItem(name, value);
} let result = sessionStorage.setItem(name, value);
let result = sessionStorage.setItem(name, value); return result;
return result; }
} export function clearStorage() {
export function clearStorage() { sessionStorage.clear();
sessionStorage.clear(); //localStorage.clear();
} }

View File

@ -19,7 +19,7 @@
animation: fade 1s; animation: fade 1s;
" "
v-if="!collapsed" v-if="!collapsed"
>克能单车</span> >景上出行</span>
</div> </div>
<a-menu <a-menu
v-model:openKeys="openKeys" v-model:openKeys="openKeys"
@ -51,10 +51,17 @@
</a-button> --> </a-button> -->
<!-- 登录 --> <!-- 登录 -->
<div class="topAvatar"> <div class="topAvatar">
<template v-if="userdfrname != ''"> <template v-if="userdfrname != '' && username != 'admin'">
<a> <a-dropdown>
当前区域{{ userdfrname }} <DownOutlined /> <a class="ant-dropdown-link" @click.prevent>
</a> 当前区域{{ userdfrname }} <DownOutlined />
</a>
<template #overlay>
<a-menu @click="onOperationClick">
<a-menu-item v-for="(item) in useroperation" :key="item.regionId" :data="item">{{ item.regionName }}</a-menu-item>
</a-menu>
</template>
</a-dropdown>
<a-divider type="vertical" /> <a-divider type="vertical" />
<UserOutlined style="margin: 0px 5px;" /> <UserOutlined style="margin: 0px 5px;" />
</template> </template>
@ -109,7 +116,7 @@ import { useRouter, useRoute } from 'vue-router'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
import { getMenus } from '../../pages'; import { getMenus } from '../../pages';
import { getLogoutAPI } from '@/apis/login.js' import { getLogoutAPI } from '@/apis/login.js'
import { getCache, clearStorage } from '@/utils/authority'; import { getCache, setCache, clearStorage } from '@/utils/authority';
const selectedKeys = ref(['1']) const selectedKeys = ref(['1'])
const openKeys = ref(['1']) const openKeys = ref(['1'])
const collapsed = ref(false) const collapsed = ref(false)
@ -122,6 +129,7 @@ const router = useRouter()
// //
const isLogin = ref(false) const isLogin = ref(false)
const username = ref('') const username = ref('')
const useroperation = ref([])
const userdfrname = ref('') const userdfrname = ref('')
onMounted(() => { onMounted(() => {
@ -137,10 +145,16 @@ onMounted(() => {
console.log('userinfo', userinfo) console.log('userinfo', userinfo)
username.value = userinfo.username ? userinfo.username : 'X' username.value = userinfo.username ? userinfo.username : 'X'
//
const cuseroperation = getCache('ebike-useroperation');
if(cuseroperation){
useroperation.value = cuseroperation;
}
// //
const userdefultoperation = getCache('ebike-userdefultoperation'); const cuserdefultoperation = getCache('ebike-userdefultoperation');
if(userdefultoperation){ if(cuserdefultoperation){
userdfrname.value = userdefultoperation.regionName ? userdefultoperation.regionName : ''; userdfrname.value = cuserdefultoperation.regionName ? cuserdefultoperation.regionName : '';
} }
const menus = getMenus() const menus = getMenus()
@ -191,12 +205,16 @@ const confirm = async (e) => {
} }
const cancel = (e) => { const cancel = (e) => {
console.log(e) console.log(e)
message.error('退出登录取消!!!')
return return
} }
const goBack = () => { const onOperationClick = (e) => {
router.back() if(e.item && e.item.data){
const regionName = e.item.data.regionName;
userdfrname.value = regionName;
//
setCache('ebike-userdefultoperation', e.item.data);
}
} }
</script> </script>

View File

@ -18,7 +18,7 @@
@finish="onFinish" @finish="onFinish"
@finishFailed="onFinishFailed" @finishFailed="onFinishFailed"
> >
<a-divider>克能单车</a-divider> <a-divider>景上出行</a-divider>
<a-form-item <a-form-item
label="" label=""
name="username" name="username"

View File

@ -213,7 +213,7 @@ import { message } from 'ant-design-vue'
import config from '@/utils/config.js' import config from '@/utils/config.js'
import RegionFeeCofFrom from '@/views/form/operateregion/RegionFeeCofFrom.vue' import RegionFeeCofFrom from '@/views/form/operateregion/RegionFeeCofFrom.vue'
import OperateConfForm from '@/views/form/operateregion/OperateConfForm.vue' import OperateConfForm from '@/views/form/operateregion/OperateConfForm.vue'
import operateRegionMap from './operateRegionMap.vue' import operateRegionMap from '../OperateRegionMap/index.vue'
import { import {
SettingOutlined SettingOutlined
} from '@ant-design/icons-vue' } from '@ant-design/icons-vue'

View File

@ -1,341 +0,0 @@
<template>
<div>
<a-modal
v-model:open="open"
:title="openTitle"
width="100%"
wrap-class-name="full-modal"
:footer="null"
:afterClose="handleClose"
>
<div class="button-panel">
<a-button type="primary" @click="onEditorClear">{{ buttonName }}</a-button>
<a-button type="primary" @click="onEditorComplete">完成</a-button>
</div>
<div class="map-container" style="width: auto; height: auto;">
<tlbs-map
ref="mapRef"
:api-key="config.map.apiKey"
:center="center"
zoom="16"
:control="control"
:options="options"
@map_inited="onMapInited"
>
<tlbs-geometry-editor
ref="editorRef"
action-mode="draw"
selectable
@draw_complete="onDrowComplet"
@draw_error="onDrawError"
@adjust_complete="onAdjustComplete"
@adjust_error="onAdjustError"
@delete_complete="onDeleteComplete"
/>
</tlbs-map>
</div>
</a-modal>
</div>
</template>
<script setup>
import { ref, reactive, defineProps } from 'vue'
import { callOperate } from '@/apis/call.js'
import { message } from 'ant-design-vue'
import { isNullOrEmpty } from '@/utils/tools.js'
import config from '@/utils/config.js'
const props = defineProps({
onCallBack: {
type: Function,
required: true
},
openTitle: {
type: String,
default: '' // Default value in case no openTitle is provided
}
});
const open = ref(false);
const showModal = (data) => {
if (data) {
loadMap(data);
}
open.value = true;
};
const handleClose = () => {
open.value = false;
ClearEditor();
if (props.onCallBack) {
props.onCallBack(formData.value);
}
};
defineExpose({ showModal });
const formData = ref({
"regionId": "",
"regionName": "",
"simpleName": "",
"zoneId": "",
"points": [],
"shapeType": 2, // 1: 2:
"radius": 0, //
});
let timer = null;
const loadMap = (dataRegion) => {
if (editorRef.value) {
clearTimeout(timer);
if (dataRegion) {
const { regionId } = dataRegion;
callOperate("/ebikeRegion/getRegionInfo/" + regionId, {}, "get").then((res) => {
if (res.code != 200) {
message.error(res.message)
return
}
const { regionName, simpleName, zoneId, points, shapeType, radius } = res.data;
formData.value = {
"regionId": regionId,
"regionName": regionName,
"simpleName": simpleName,
"zoneId": zoneId,
"points": points,
"shapeType": shapeType, // 1: 2:
"radius": radius, //
}
loadGeometry();
});
}
}
else
{
timer = setTimeout(() => {
loadMap(dataRegion);
}, 1000)
}
};
let shapeId = null;
const loadGeometry = () => {
const { points, shapeType, regionId, radius } = formData.value;
shapeId = 'polygon' + regionId;
if (shapeType == 1) {
shapeId = 'circle' + regionId;
}
if (points) {
if(shapeType == 1){
const circleGeometries = [];//editorRef.value.circle.getGeometries();
if (circleGeometries.length > 0) {
circleGeometries.forEach((geometry) => {
editorRef.value.circle.remove(geometry); //
});
}
circleGeometries.push({
id: shapeId, //
styleId: 'circle', // id
radius: radius, //
center: new TMap.LatLng(points[0].latitude, points[0].longitude),
properties: {
//
title: 'circle',
},
});
editorRef.value.circle.setGeometries(circleGeometries);
//
const mycircle = editorRef.value.circle.getGeometryById(shapeId);
const boundary = TMap.geometry.computeBoundingRectangle(mycircle.paths);
mapRef.value.map.fitBounds(boundary,{
padding: 100, //
});
}
else if(shapeType == 2){
const paths = [];
points.forEach((point) => {
paths.push(new TMap.LatLng(point.latitude, point.longitude));
});
const polygonGeometries = [];//editorRef.value.polygon.getGeometries();
polygonGeometries.push({
id: shapeId, //
styleId: 'polygon', // id
paths, //
properties: {
//
title: 'polygon',
},
});
editorRef.value.polygon.setGeometries(polygonGeometries);
// var position = TMap.geometry.computeCentroid(paths);
// mapRef.value.map.setCenter(position);
//
const mypolygon = editorRef.value.polygon.getGeometryById(shapeId);
const boundary = TMap.geometry.computeBoundingRectangle(mypolygon.paths);
mapRef.value.map.fitBounds(boundary,{
padding: 100, //
});
}
buttonName.value = '重置';
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
}
const mapRef = ref(null);
const center = ref( config.map.center );
const control = ref({ scale: {}, zoom: { position: 'topRight',},});
const options = ref({ renderOptions: { renderOptions: true, }});
const editorRef = ref(null);
const onMapInited = () => {
if (mapRef.value) {
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const calculatedWidth = windowWidth - 60;
const calculatedHeight = windowHeight - 100;
// resize
const map = mapRef.value.map;
if (map) {
map.resize(calculatedWidth, calculatedHeight);
}
}
};
const buttonName = ref('清除');
const onDrowComplet = (geomeytry) => {
//console.log("onDrowComplet",geomeytry);
if(geomeytry.id){
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([geomeytry.id]);
}
};
const onDrawError = (e) => {
ClearEditor();
editorRef.value.editor.stop();
};
const onAdjustComplete = (geomeytry) => {
//console.log("onAdjustComplete",geomeytry);
};
const onAdjustError = (e) => {
ClearEditor();
loadGeometry();
};
const onEditorClear = () => {
if(!isNullOrEmpty(shapeId)){
loadGeometry();
}
else
{
ClearEditor();
}
}
const ClearEditor = () => {
editorRef.value.editor.select([]);
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW);
editorRef.value.circle.setGeometries([]);
editorRef.value.polygon.setGeometries([]);
}
const onEditorComplete = () => {
if(editorRef.value.editor.getSelectedList().length > 0){
const selectedList = editorRef.value.editor.getSelectedList();
const geometry = selectedList[0];
console.log("onEditorComplete",geometry);
if(geometry.id){
if(geometry.radius && geometry.center){
formData.value.radius = geometry.radius;
formData.value.points = [
{
"latitude": geometry.center.lat,
"longitude": geometry.center.lng,
}
];
formData.value.shapeType = 1;
}
else if(geometry.paths){
formData.value.radius = 0;
formData.value.points = geometry.paths.map((point) => {
return {
"latitude": point.lat,
"longitude": point.lng,
};
});
formData.value.points.push({
"latitude": geometry.paths[0].lat,
"longitude": geometry.paths[0].lng,
});
formData.value.shapeType = 2;
}
if(!isNullOrEmpty(formData.value.regionId)){
callOperate("/ebikeRegion/updateOperation", formData.value, "post").then((res) => {
if (res.code == 200) {
message.success(res.message, 3, handleClose);
} else {
message.error(res.message, 10);
}
});
}
else
{
handleClose();
}
}
}
else
{
message.error("请先绘制区域!")
}
}
const onDeleteComplete = (geomeytry) => {
if(editorRef.value.polygon.getGeometries().length > 0){
const shapeId = editorRef.value.polygon.getGeometries()[0].id;
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
else if(editorRef.value.circle.getGeometries().length > 0){
const shapeId = editorRef.value.circle.getGeometries()[0].id;
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
else
{
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW);
// editorRef.value.circle.setGeometries([]);
// editorRef.value.polygon.setGeometries([]);
}
};
</script>
<style>
.full-modal .ant-modal {
max-width: 100%;
top: 0;
padding-bottom: 0;
margin: 0;
}
.full-modal .ant-modal-content {
display: flex;
flex-direction: column;
height: calc(100vh);
border-radius:0 !important;
}
.full-modal .ant-modal-body {
flex: 1;
}
.button-panel{
position: absolute;
bottom: 55px;
right: 35px;
z-index: 2000;
width: 300px;
height: 105px;
background-color: rgb(255, 255, 255, 0.8);
padding: 15px;
}
.button-panel button{
width: 100%;
border-radius: 0px !important;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,342 @@
<template>
<div>
<a-modal
v-model:open="open"
:title="openTitle"
width="100%"
wrap-class-name="full-modal"
:footer="null"
:afterClose="handleClose"
>
<div class="button-panel">
<a-button type="primary" @click="onEditorClear">{{ buttonName }}</a-button>
<a-button type="primary" @click="onEditorComplete">完成</a-button>
</div>
<div class="map-container" style="width: auto; height: auto;">
<tlbs-map
ref="mapRef"
:api-key="config.map.apiKey"
:center="center"
zoom="16"
:control="control"
:options="options"
@map_inited="onMapInited"
>
<tlbs-geometry-editor
ref="editorRef"
action-mode="draw"
selectable
@draw_complete="onDrowComplet"
@draw_error="onDrawError"
@adjust_complete="onAdjustComplete"
@adjust_error="onAdjustError"
@delete_complete="onDeleteComplete"
/>
</tlbs-map>
</div>
</a-modal>
</div>
</template>
<script setup>
import { ref, reactive, defineProps } from 'vue'
import { callOperate } from '@/apis/call.js'
import { message } from 'ant-design-vue'
import { isNullOrEmpty } from '@/utils/tools.js'
import config from '@/utils/config.js'
const props = defineProps({
onCallBack: {
type: Function,
required: true
},
openTitle: {
type: String,
default: '' // Default value in case no openTitle is provided
}
});
const open = ref(false);
const showModal = (data) => {
if (data) {
loadMap(data);
}
open.value = true;
};
const handleClose = () => {
open.value = false;
ClearEditor();
if (props.onCallBack) {
props.onCallBack(formData.value);
}
};
defineExpose({ showModal });
const formData = ref({
"regionId": "",
"regionName": "",
"simpleName": "",
"zoneId": "",
"points": [],
"shapeType": 2, // 1: 2:
"radius": 0, //
});
let timer = null;
const loadMap = (dataRegion) => {
if (editorRef.value) {
clearTimeout(timer);
if (dataRegion) {
const { regionId } = dataRegion;
callOperate("/ebikeRegion/getRegionInfo/" + regionId, {}, "get").then((res) => {
if (res.code != 200) {
message.error(res.message)
return
}
const { regionName, simpleName, zoneId, points, shapeType, radius } = res.data;
formData.value = {
"regionId": regionId,
"regionName": regionName,
"simpleName": simpleName,
"zoneId": zoneId,
"points": points,
"shapeType": shapeType, // 1: 2:
"radius": radius, //
}
loadGeometry();
});
}
}
else
{
timer = setTimeout(() => {
loadMap(dataRegion);
}, 1000)
}
};
let shapeId = null;
const loadGeometry = () => {
const { points, shapeType, regionId, radius } = formData.value;
shapeId = 'polygon' + regionId;
if (shapeType == 1) {
shapeId = 'circle' + regionId;
}
if (points) {
if(shapeType == 1){
const circleGeometries = [];//editorRef.value.circle.getGeometries();
if (circleGeometries.length > 0) {
circleGeometries.forEach((geometry) => {
editorRef.value.circle.remove(geometry); //
});
}
circleGeometries.push({
id: shapeId, //
styleId: 'circle', // id
radius: radius, //
center: new TMap.LatLng(points[0].latitude, points[0].longitude),
properties: {
//
title: 'circle',
},
});
editorRef.value.circle.setGeometries(circleGeometries);
//
const mycircle = editorRef.value.circle.getGeometryById(shapeId);
const boundary = TMap.geometry.computeBoundingRectangle(mycircle.paths);
mapRef.value.map.fitBounds(boundary,{
padding: 100, //
});
}
else if(shapeType == 2){
const paths = [];
points.forEach((point) => {
paths.push(new TMap.LatLng(point.latitude, point.longitude));
});
const polygonGeometries = [];//editorRef.value.polygon.getGeometries();
polygonGeometries.push({
id: shapeId, //
styleId: 'polygon', // id
paths, //
properties: {
//
title: 'polygon',
},
});
editorRef.value.polygon.setGeometries(polygonGeometries);
// var position = TMap.geometry.computeCentroid(paths);
// mapRef.value.map.setCenter(position);
//
const mypolygon = editorRef.value.polygon.getGeometryById(shapeId);
const boundary = TMap.geometry.computeBoundingRectangle(mypolygon.paths);
mapRef.value.map.fitBounds(boundary,{
padding: 100, //
});
}
buttonName.value = '重置';
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
}
const mapRef = ref(null);
const center = ref( config.map.center );
const control = ref({ scale: {}, zoom: { position: 'topRight',},});
const options = ref({ renderOptions: { renderOptions: true, }});
const editorRef = ref(null);
const onMapInited = () => {
if (mapRef.value) {
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const calculatedWidth = windowWidth - 60;
const calculatedHeight = windowHeight - 100;
// resize
const map = mapRef.value.map;
if (map) {
map.resize(calculatedWidth, calculatedHeight);
}
}
};
const buttonName = ref('清除');
const onDrowComplet = (geomeytry) => {
//console.log("onDrowComplet",geomeytry);
if(geomeytry.id){
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([geomeytry.id]);
}
};
const onDrawError = (e) => {
ClearEditor();
editorRef.value.editor.stop();
};
const onAdjustComplete = (geomeytry) => {
//console.log("onAdjustComplete",geomeytry);
};
const onAdjustError = (e) => {
ClearEditor();
loadGeometry();
};
const onEditorClear = () => {
if(!isNullOrEmpty(shapeId)){
loadGeometry();
}
else
{
ClearEditor();
}
}
const ClearEditor = () => {
editorRef.value.editor.select([]);
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW);
editorRef.value.circle.setGeometries([]);
editorRef.value.polygon.setGeometries([]);
}
const onEditorComplete = () => {
if(editorRef.value.editor.getSelectedList().length > 0){
const selectedList = editorRef.value.editor.getSelectedList();
const geometry = selectedList[0];
console.log("onEditorComplete",geometry);
if(geometry.id){
if(geometry.radius && geometry.center){
formData.value.radius = geometry.radius;
formData.value.points = [
{
"latitude": geometry.center.lat,
"longitude": geometry.center.lng,
}
];
formData.value.shapeType = 1;
}
else if(geometry.paths){
formData.value.radius = 0;
formData.value.points = geometry.paths.map((point) => {
return {
"latitude": point.lat,
"longitude": point.lng,
};
});
formData.value.points.push({
"latitude": geometry.paths[0].lat,
"longitude": geometry.paths[0].lng,
});
formData.value.shapeType = 2;
}
if(!isNullOrEmpty(formData.value.regionId)){
callOperate("/ebikeRegion/updateOperation", formData.value, "post").then((res) => {
if (res.code == 200) {
message.success(res.message, 3, handleClose);
} else {
message.error(res.message, 10);
}
});
}
else
{
handleClose();
}
}
}
else
{
message.error("请先绘制区域!")
}
}
const onDeleteComplete = (geomeytry) => {
if(editorRef.value.polygon.getGeometries().length > 0){
const shapeId = editorRef.value.polygon.getGeometries()[0].id;
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
else if(editorRef.value.circle.getGeometries().length > 0){
const shapeId = editorRef.value.circle.getGeometries()[0].id;
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT);
editorRef.value.editor.select([shapeId]);
}
else
{
editorRef.value.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW);
// editorRef.value.circle.setGeometries([]);
// editorRef.value.polygon.setGeometries([]);
}
};
</script>
<style>
.full-modal .ant-modal {
max-width: 100%;
top: 0;
padding-bottom: 0;
margin: 0;
}
.full-modal .ant-modal-content {
display: flex;
flex-direction: column;
height: calc(100vh);
border-radius:0 !important;
}
.full-modal .ant-modal-body {
flex: 1;
}
.button-panel{
position: absolute;
bottom: 55px;
right: 35px;
z-index: 2000;
width: 300px;
height: 105px;
background-color: rgb(255, 255, 255, 0.8);
padding: 15px;
}
.button-panel button{
width: 100%;
border-radius: 0px !important;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,338 @@
<template>
<div>
<a-card :bordered="false">
<a-form
:label-col="{ xl: 7, lg: 5, md: 7, sm: 4 }"
:wrapper-col="{ xl: 17, lg: 19, md: 17, sm: 20 }"
>
<a-row :gutter="8">
<a-col
:xl="6"
:lg="12"
:md="12"
:sm="24"
:xs="24"
>
<a-form-item label="站点类型">
<a-select
v-model:value="queryform.type"
placeholder="请选择站点类型"
allow-clear
>
<a-select-option value="2">停车站点</a-select-option>
<a-select-option value="5">禁停区</a-select-option>
<a-select-option value="6">禁行区</a-select-option>
<a-select-option value="7">扣车区</a-select-option>
<a-select-option value="8">接客站点</a-select-option>
<a-select-option value="3">仓管区</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col
:xl="6"
:lg="12"
:md="12"
:sm="24"
:xs="24"
>
<a-form-item label="站点级别">
<a-select
v-model:value="queryform.level"
placeholder="请选择站点级别"
allow-clear
>
<a-select-option value="1">1</a-select-option>
<a-select-option value="2">2</a-select-option>
<a-select-option value="3">3</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col
:xl="6"
:lg="12"
:md="12"
:sm="24"
:xs="24"
>
<a-form-item label="站点名称">
<a-input
v-model:value.trim="queryform.name"
placeholder="请输入站点名称"
allow-clear
></a-input>
</a-form-item>
</a-col>
<a-col
:xl="6"
:lg="12"
:md="12"
:sm="24"
:xs="24"
>
<a-form-item
class="ele-text-right"
:wrapper-col="{ span: 24 }"
>
<a-space>
<a-button
type="primary"
style="background-color: #5cc750"
@click="search"
>查询</a-button>
<!-- <a-button>重置</a-button> -->
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-form>
<!-- 数据操作 -->
<a-space style="margin-bottom: 10px">
<a-button
style="background-color: #5cc750"
type="primary"
class="ele-btn-icon"
@click="handleAdd"
>
<template #icon>
<plus-outlined />
</template>
<span>新增</span>
</a-button>
</a-space>
<!-- 表格 -->
<a-table
:pagination="pagination"
@change="handleTableChange"
bordered
:columns="columns"
:dataSource="dataSource"
:scroll="{ x: 'max-content' }"
>
<template #headerCell="{ column }">
<template v-if="column.key === 'action'">
<SettingOutlined style="margin-right: 5px" />{{ column.title }}
</template>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<a-space>
<a>详情</a>
<a-divider type="vertical" />
<a>编辑</a>
<a-divider type="vertical" />
<a>申请删除</a>
</a-space>
</template>
</template>
</a-table>
</a-card>
<!-- 地图 -->
<operateRegionMap
ref="editORMapModel"
:onCallBack="onORMapCallBack"
:openTitle="openORMapTitle"
></operateRegionMap>
</div>
</template>
<script setup>
import { ref, onMounted, reactive, nextTick } from 'vue'
import { callOperate } from '@/apis/call.js'
import { message } from 'ant-design-vue'
import config from '@/utils/config.js'
import operateRegionMap from '../OperateRegionMap/index.vue'
import {
SettingOutlined
} from '@ant-design/icons-vue'
import { useRouter, useRoute } from 'vue-router'
//
const dataSource = ref([])
const data = ref([])
const router = useRouter()
const editORMapModel = ref(null);
const openORMapTitle = ref('地图');
//
const queryform = ref({
type: '',
level: '',
name: '',
pageParam: {
pageNum: config.pageParam.pageNum,
pageSize: config.pageParam.pageSize
}
})
//
let pagination = reactive({
total: dataSource.value.length,
current: queryform.value.pageParam.pageNum,
pageSize: queryform.value.pageParam.pageSize,
showSizeChanger: true,
pageSizeOptions: config.pageParam.pageSizeOptions,
showQuickJumper: true
})
//
const columns = ref([
{
title: '序号',
key: 'index',
width: 80,
align: 'center',
dataIndex: 'index'
},
{
key: 'typeName',
title: '站点类型',
width: 200,
align: 'center',
dataIndex: 'typeName'
},
{
key: 'regionName',
title: '运营区域',
width: 150,
align: 'center',
dataIndex: 'regionName'
},
{
key: 'simpleName',
title: '区域简称',
width: 150,
align: 'center',
dataIndex: 'simpleName'
},
{
key: 'inOperation',
title: '运营状态',
width: 150,
align: 'center',
dataIndex: 'inOperation'
},
{
key: 'regionRank',
title: '区域级别',
width: 150,
align: 'center',
dataIndex: 'regionRank'
},
{
key: 'regionCode',
title: '区域编码',
width: 150,
align: 'center',
dataIndex: 'regionCode'
},
{
key: 'siteCount',
title: '站点数量',
width: 150,
align: 'center',
dataIndex: 'siteCount'
},
{
key: 'freeDuration',
title: '免费时长',
width: 150,
align: 'center',
dataIndex: 'freeDuration'
},
{
key: 'billingStandard',
title: '计费标准',
width: 200,
align: 'center',
dataIndex: 'billingStandard'
},
{
key: 'dispatchFee',
title: '运调度费(元)',
width: 250,
align: 'center',
dataIndex: 'dispatchFee'
},
{
key: 'cappedAmount',
title: '封顶金额(元)',
width: 150,
align: 'center',
dataIndex: 'cappedAmount'
},
{
key: 'createdAt',
title: '创建时间',
width: 150,
align: 'center',
dataIndex: 'createdAt'
},
{
title: '操作',
key: 'action',
width: 300,
align: 'center',
fixed: 'right',
}
])
//
onMounted(async () => {
getData();
})
const getData = async () => {
let url = "/ebikeRegion/pageOperation?pageNum=" + queryform.value.pageParam.pageNum + "&pageSize=" + queryform.value.pageParam.pageSize
if (queryform.value.regionName) {
url += "&regionName=" + queryform.value.regionName
}
if (queryform.value.simpleName) {
url += "&simpleName=" + queryform.value.simpleName
}
if (queryform.value.inOperation) {
url += "&inOperation=" + queryform.value.inOperation
}
const res = await callOperate(url, {}, "get");
if (res.code != 200) {
message.error(res.message)
return
}
data.value = res.data.records
data.value = data.value.map((item, index) => {
index++
return { ...item, index }
})
dataSource.value = data.value
pagination.total = res.data.totalRow
}
//
let handleTableChange = (pagina) => {
pagination.current = pagina.current
pagination.pageSize = pagina.pageSize
queryform.value.pageParam.pageNum = pagina.current
queryform.value.pageParam.pageSize = pagina.pageSize
getData()
}
const search = () => {
getData()
}
const handleEditORMap = (record) => {
openORMapTitle.value = '绘制地图(' + record['regionName'] + '';
const data = {
regionId: record['regionId']
}
editORMapModel.value.showModal(data);
}
const onORMapCallBack = () => {
}
const handleAdd = () => {
router.push('/Urban/OperateRegionAdd');
}
</script>

View File

@ -111,7 +111,7 @@
<script setup> <script setup>
import { ref, defineProps, onMounted } from 'vue' import { ref, defineProps, onMounted } from 'vue'
import operateRegionMap from '../../Urban/OperateRegion/operateRegionMap.vue' import operateRegionMap from '../../Urban/OperateRegionMap/index.vue'
import { callOperate } from '@/apis/call.js' import { callOperate } from '@/apis/call.js'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
import { getCache } from '@/utils/authority'; import { getCache } from '@/utils/authority';

View File

@ -5,6 +5,8 @@ import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'; import Components from 'unplugin-vue-components/vite';
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'; import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
let targetUrl = 'http://192.168.2.156:10010/'
targetUrl = 'https://attiya.fun/ebike/'
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
@ -29,7 +31,7 @@ export default defineConfig({
proxy: { proxy: {
'^/operate/*': { '^/operate/*': {
changeOrigin: true, changeOrigin: true,
target: 'http://192.168.2.156:10010/', target: targetUrl,
rewrite: (path) => { rewrite: (path) => {
return path.replace(/^\/operate/, 'operate') return path.replace(/^\/operate/, 'operate')
} }
@ -43,7 +45,7 @@ export default defineConfig({
}, },
'^/maintenance/*': { '^/maintenance/*': {
changeOrigin: true, changeOrigin: true,
target: 'http://192.168.2.156:10010/', target: targetUrl,
rewrite: (path) => { rewrite: (path) => {
return path.replace(/^\/maintenance/, 'maintenance') return path.replace(/^\/maintenance/, 'maintenance')
} }
@ -57,7 +59,7 @@ export default defineConfig({
}, },
'^/user/*': { '^/user/*': {
changeOrigin: true, changeOrigin: true,
target: 'http://192.168.2.156:10010/', target: targetUrl,
rewrite: (path) => { rewrite: (path) => {
return path.replace(/^\/user/, 'user') return path.replace(/^\/user/, 'user')
} }
@ -71,7 +73,7 @@ export default defineConfig({
}, },
'^/order/*': { '^/order/*': {
changeOrigin: true, changeOrigin: true,
target: 'http://192.168.2.156:10010/', target: targetUrl,
rewrite: (path) => { rewrite: (path) => {
return path.replace(/^\/order/, 'order') return path.replace(/^\/order/, 'order')
} }