locales/zh_CN.json
@@ -125,8 +125,8 @@ }, "route": { "appRoot": "首页", "dashboard": "仪表盘", "workbench": "工作台", "dashboard": "首页", "workbench": "首页", "transaction": "交易管理", "order": "订单管理", "evaluationRecord": "评价记录", package.json
@@ -19,6 +19,7 @@ "dependencies": { "@vueuse/core": "^13.6.0", "alova": "^3.3.4", "ant-design-vue": "~4.2.6", "colord": "^2.9.3", "echarts": "^5.6.0", "md-editor-v3": "^5.6.1", src/AppMain.vue
@@ -5,6 +5,8 @@ import { naiveI18nOptions } from '@/utils' import { darkTheme } from 'naive-ui' import { useAppStore } from './store' import Antd from 'ant-design-vue'; // import 'ant-design-vue/dist/reset.css'; // 创建异步初始化 Promise - 这会让组件变成异步组件 const initializationPromise = (async () => { @@ -20,6 +22,8 @@ // 注册模块 Vue-router await installRouter(app) app.use(Antd) // 注册模块 指令/静态资源 const modules = import.meta.glob<{ install: (app: App) => void }>('./modules/*.ts', { eager: true, src/layouts/components/common/Logo.vue
@@ -22,7 +22,7 @@ class="h-60px text-xl flex-center cursor-pointer gap-2 p-x-2" @click="router.push('/')" > <svg-icons-logo class="text-1.5em" /> <!-- <svg-icons-logo class="text-1.5em" /> --> <span v-show="!hidenLogoText" class="text-ellipsis overflow-hidden whitespace-nowrap" src/layouts/index.vue
@@ -65,6 +65,7 @@ :footer-height="40" :sidebar-width="sidebarWidth" :sidebar-collapsed-width="sidebarCollapsedWidth" class="robotaxi-content" > <template #logo> <Logo /> @@ -122,11 +123,11 @@ <n-menu v-bind="layout.verticalMenuProps" :collapsed-width="sidebarCollapsedWidth" /> </template> <template #sidebar-extra> <!-- <template #sidebar-extra> <n-scrollbar class="flex-[1_0_0]"> <n-menu v-bind="layout.verticalExtraMenuProps" :collapsed-width="sidebarCollapsedWidth" /> </n-scrollbar> </template> </template> --> <template #tabbar> <TabBar /> @@ -147,3 +148,9 @@ </MobileDrawer> </ProLayout> </template> <style scoped> .robotaxi-content { /* --pro-layout-color: #3D4C63 !important; */ } </style> src/router/routes.static.ts
@@ -1,26 +1,26 @@ export const staticRoutes: AppRoute.RowRoute[] = [ { name: 'dashboard', path: '/dashboard', title: '仪表盘', requiresAuth: true, icon: 'icon-park-outline:analysis', menuType: 'dir', componentPath: null, id: 1, pid: null, }, // { // name: 'dashboard', // path: '/dashboard', // title: '首页', // requiresAuth: true, // icon: 'icon-park-outline:analysis', // menuType: 'dir', // componentPath: null, // id: 1, // pid: null, // }, { name: 'workbench', path: '/dashboard/workbench', title: '工作台', requiresAuth: true, icon: 'icon-park-outline:alarm', icon: 'icon-park-outline:home', pinTab: true, menuType: 'page', componentPath: '/dashboard/workbench/index.vue', id: 101, pid: 1, id: 1, pid: null, }, { name: 'transaction', src/store/app/index.ts
@@ -60,7 +60,8 @@ // 重置所有设置 resetAlltheme() { this.theme = themeConfig this.primaryColor = '#18a058' // this.primaryColor = '#18a058' this.primaryColor = '#0068FF' this.collapsed = false this.grayMode = false this.colorWeak = false src/store/app/theme copy.json
New file @@ -0,0 +1,24 @@ { "common": { "primaryColor": "#18a058", "primaryColorHover": "#36ad6a", "primaryColorPressed": "#0c7a43", "primaryColorSuppl": "#36ad6a", "infoColor": "#2080f0", "infoColorHover": "#4098fc", "infoColorPressed": "#1060c9", "infoColorSuppl": "#4098fc", "successColor": "#18a058", "successColorHover": "#36ad6a", "successColorPressed": "#0c7a43", "successColorSuppl": "#36ad6a", "warningColor": "#f0a020", "warningColorHover": "#fcb040", "warningColorPressed": "#c97c10", "warningColorSuppl": "#fcb040", "errorColor": "#d03050", "errorColorHover": "#de576d", "errorColorPressed": "#ab1f3f", "errorColorSuppl": "#de576d" } } src/store/app/theme.json
@@ -1,24 +1,24 @@ { "common": { "primaryColor": "#18a058", "primaryColorHover": "#36ad6a", "primaryColorPressed": "#0c7a43", "primaryColorSuppl": "#36ad6a", "primaryColor": "#0068FF", "primaryColorHover": "#2986ff", "primaryColorPressed": "#004fd9", "primaryColorSuppl": "#E6F4FF", "infoColor": "#2080f0", "infoColorHover": "#4098fc", "infoColorPressed": "#1060c9", "infoColorSuppl": "#4098fc", "successColor": "#18a058", "successColorHover": "#36ad6a", "successColorPressed": "#0c7a43", "successColorSuppl": "#36ad6a", "warningColor": "#f0a020", "warningColorHover": "#fcb040", "warningColorPressed": "#c97c10", "warningColorSuppl": "#fcb040", "errorColor": "#d03050", "errorColorHover": "#de576d", "errorColorPressed": "#ab1f3f", "errorColorSuppl": "#de576d" "successColor": "#19B144", "successColorHover": "#28BD52", "successColorPressed": "#06A424", "successColorSuppl": "#DCF5DD", "warningColor": "#FFAA2A", "warningColorHover": "#FFBF5D", "warningColorPressed": "#EF960E", "warningColorSuppl": "#FFF6EA", "errorColor": "#E02716", "errorColorHover": "#F14637", "errorColorPressed": "#D02213", "errorColorSuppl": "#FFF3F1" } } src/views/activityAndPricing/pricingManagement/detail.vue
@@ -78,19 +78,19 @@ <!-- </n-card> --> <!-- 一口价 --> <!-- 基础定价 --> <NSpace vertical v-if="category === '1'"> <NSpace vertical v-if="category === '1'" :size="16"> <div class="text-base font-bold">基础定价</div> <div class="pl-4"> <n-form-item label="起步价设置" path="condition_1" required> 起步价为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元,起步价包含 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 公里, <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 分钟 </n-form-item> </div> @@ -98,7 +98,7 @@ <n-form-item label="里程费设置" path="condition_1" required> 超过起步里程后每公里 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元 </n-form-item> </div> @@ -106,34 +106,34 @@ <n-form-item label="时长费设置" path="condition_1" required> 超过起步时长后每分钟 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元 </n-form-item> </div> </NSpace> <NSpace vertical v-else> <NSpace vertical v-else :size="16"> <div class="text-base font-bold">基础定价</div> <NButton type='primary' text @click="addTimePeriod"> 添加时段 </NButton> <div class="pl-4" v-for="item in model.condition_3"> <NSpace vertical> <NSpace vertical :size="16"> <n-form-item label="时段" path="condition_1" required label-width="92px"> <n-time-picker v-model:value="model.condition_1" clearable />至 <n-time-picker v-model:value="model.condition_1" clearable /> <n-time-picker v-model:value="model.condition_1" clearable class="mr-3" />至 <n-time-picker v-model:value="model.condition_1" clearable class="mx-3" /> <icon-park-outline-delete @click="removeTimePeriod(item)" /> </n-form-item> <div class="pl-20"> <n-form-item label="起步价设置" path="condition_1" required> 起步价为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元,起步价包含 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 公里, <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 分钟 </n-form-item> </div> @@ -141,7 +141,7 @@ <n-form-item label="里程费设置" path="condition_1" required> 超过起步里程后每公里 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元 </n-form-item> </div> @@ -149,7 +149,7 @@ <n-form-item label="时长费设置" path="condition_1" required> 超过起步时长后每分钟 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元 </n-form-item> </div> @@ -159,47 +159,47 @@ <n-form-item label="等待费设置" path="condition_1" required> 司机到达预约地点 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 分钟后开始收取等待费,为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mx-3" /> 元/分,不足一分钟按一分钟计算 </n-form-item> </div> <div class="pl-4"> <n-form-item label="远途费设置" path="condition_1" required> <NSpace vertical> <NSpace vertical :size="16"> <NSpace align="center"> 总里程超过 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 公里,不足 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 公里,超出部分每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 超过 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 不足 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 公里时,超出部分每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 超过 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 公里以后,超出部分每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> </NSpace> @@ -207,31 +207,31 @@ </div> <div class="pl-4"> <n-form-item label="夜间行驶费用设置" path="condition_1" required> <NSpace vertical> <NSpace vertical :size="16"> <NSpace align="center"> <n-time-picker v-model:value="model.condition_1" clearable /> 点为夜间行车时间,起步价变为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 里程费为每公里 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元,时长费为每 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> </NSpace> @@ -239,33 +239,33 @@ </div> <div class="pl-4"> <n-form-item label="高峰期费用设置" path="condition_1" required> <NSpace vertical> <NSpace vertical :size="16"> <NSpace align="center"> <n-time-picker v-model:value="model.condition_1" clearable /> 和 <n-time-picker v-model:value="model.condition_1" clearable /> 为高峰期行车时间,起步价变为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 里程费为每公里 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元,时长费为每 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> </NSpace> @@ -273,30 +273,30 @@ </div> <div class="pl-4"> <n-form-item label="节假日额外收费" path="condition_1" required> <NSpace vertical> <NSpace vertical :size="16"> <NSpace align="center"> 节假日起步价变为 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元 </NSpace> <NSpace align="center"> 里程费为每公里 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3" /> 元,时长费为每 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3"/> 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3"/> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3"/> <n-input-number v-model:value="model.condition_1" min="0" max="999" :precision="0" :show-button="false" placeholder="最多3位数" /> :show-button="false" placeholder="最多3位数" class="mr-3"/> 元 </NSpace> </NSpace> @@ -304,7 +304,7 @@ </div> </NSpace> <!-- 动态定价 --> <NSpace vertical> <NSpace vertical :size="16"> <div class="text-base font-bold">动态定价</div> <div class="pl-4"> <n-form-item label="是否开启动态调价" path="condition_2" required> @@ -327,30 +327,30 @@ <div class="pl-20"> <n-grid :cols="3" :x-gap="18"> <n-form-item-grid-item label="供需计算周期:" path="condition_1"> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" />分钟 <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mr-3"/>分钟 </n-form-item-grid-item> <n-form-item-grid-item label="订单需求阈值:" path="condition_1"> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" />单以上开始上浮 :show-button="false" class="mr-3"/>单以上开始上浮 </n-form-item-grid-item> <n-form-item-grid-item label="车辆供给阈值:" path="condition_1"> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" />辆以下开始触发上浮 :show-button="false" class="mr-3"/>辆以下开始触发上浮 </n-form-item-grid-item> </n-grid> </div> <div class="pl-20"> <n-form-item label="供需价格系数:" path="condition_1"> 每增加 <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" /> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/> 单,价格上浮 <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" />% <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/>% </n-form-item> </div> <div class="pl-20"> <n-form-item label="供需冷却时间:" path="condition_1"> 调价后 <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" /> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/> 分钟内不再重复调整 </n-form-item> </div> @@ -361,15 +361,15 @@ <div class="pl-20"> <n-form-item label="拥堵判断阈值:" path="condition_1"> 道路速度 < <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" /> < <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/> km/h视为拥堵,拥堵价格上浮比例: <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" />% <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/>% </n-form-item> </div> <div class="pl-20"> <n-form-item label="拥堵影响半径:" path="condition_1"> 以订单起点为中心 <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" /> <n-input-number v-model:value="model.condition_1" min="0" :precision="0" :show-button="false" class="mx-3"/> m范围内 </n-form-item> </div> @@ -456,21 +456,21 @@ </NSpace> </div> <div class="pl-4"> <n-form-item label="等待费设置" path="condition_1" > 司机到达预约地点 3 分钟开始收取等待费,为 2 元/分,不足一分钟按一分钟计算 <n-form-item label="等待费设置" path="condition_1"> 司机到达预约地点 3 分钟开始收取等待费,为 2 元/分,不足一分钟按一分钟计算 </n-form-item> </div> <div class="pl-4"> <n-form-item label="远途费设置" path="condition_1" > <n-form-item label="远途费设置" path="condition_1"> <NSpace vertical> <NSpace align="center"> 总里程超过 50 公里不足 150 公里,超出部分每公里加收 1 元 总里程超过 50 公里不足 150 公里,超出部分每公里加收 1 元 </NSpace> <NSpace align="center"> 超过 150 公里不足 250 公里,超出部分每公里加收 1.2 元 超过 150 公里不足 250 公里,超出部分每公里加收 1.2 元 </NSpace> <NSpace align="center"> 超过 150 公里以后,超出部分每公里加收 1.3 元 超过 150 公里以后,超出部分每公里加收 1.3 元 </NSpace> </NSpace> </n-form-item> @@ -479,13 +479,13 @@ <n-form-item label="夜间行驶费用设置" path="condition_1" required> <NSpace vertical> <NSpace align="center"> 20:00 点为夜间行车时间,起步价变为 5 元 20:00 点为夜间行车时间,起步价变为 5 元 </NSpace> <NSpace align="center"> 里程费为每公里 3 元, 时长费为每分钟 1 元 里程费为每公里 3 元, 时长费为每分钟 1 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 0.2、0.5、0.7 元 远途费为每公里加收 0.2、0.5、0.7 元 </NSpace> </NSpace> </n-form-item> @@ -494,13 +494,13 @@ <n-form-item label="高峰期费用设置" path="condition_1" required> <NSpace vertical> <NSpace align="center"> 08:30-09:3 和 018:00 -20:00 为高峰期行车时间,起步价变为 5 元 08:30-09:3 和 018:00 -20:00 为高峰期行车时间,起步价变为 5 元 </NSpace> <NSpace align="center"> 里程费为每公里 3 元, 时长费为每分钟 1 元 里程费为每公里 3 元, 时长费为每分钟 1 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 0.2、0.5、0.7 元 远途费为每公里加收 0.2、0.5、0.7 元 </NSpace> </NSpace> </n-form-item> @@ -509,13 +509,13 @@ <n-form-item label="节假日额外收费" path="condition_1" required> <NSpace vertical> <NSpace align="center"> 08:30-09:3 和 018:00 -20:00 为高峰期行车时间,起步价变为 5 元 08:30-09:3 和 018:00 -20:00 为高峰期行车时间,起步价变为 5 元 </NSpace> <NSpace align="center"> 里程费为每公里 3 元, 时长费为每分钟 1 元 里程费为每公里 3 元, 时长费为每分钟 1 元 </NSpace> <NSpace align="center"> 远途费为每公里加收 0.2、0.5、0.7 元 远途费为每公里加收 0.2、0.5、0.7 元 </NSpace> </NSpace> </n-form-item> src/views/activityAndPricing/pricingManagement/index.vue
@@ -88,14 +88,14 @@ <NButton text type='primary' onClick={() => router.push({name: 'pricingDetail', query: {id: row.id, type: 'add', category: 1 }})} onClick={() => router.push({name: 'pricingDetail', query: {id: row.id, type: 'add', category: row.pricingRules }})} > 设置价格 </NButton> <NButton text type='primary' onClick={() => router.push({name: 'pricingDetail', query: {id: row.id, type: 'view', category: 1}})} onClick={() => router.push({name: 'pricingDetail', query: {id: row.id, type: 'view', category: row.pricingRules }})} > 查看 </NButton> @@ -162,7 +162,7 @@ }) count.value = 1 endLoading() }, 1000) }, 500) } onMounted(() => { getList() src/views/build-in/login/components/Login/index.vue
@@ -83,29 +83,29 @@ </n-input> </n-form-item> <n-space vertical :size="20"> <div class="flex-y-center justify-between"> <!-- <div class="flex-y-center justify-between"> <n-checkbox v-model:checked="isRemember"> {{ $t('login.rememberMe') }} </n-checkbox> <n-button type="primary" text @click="toOtherForm('resetPwd')"> {{ $t('login.forgotPassword') }} </n-button> </div> </div> --> <n-button block type="primary" size="large" :loading="isLoading" :disabled="isLoading" @click="handleLogin"> {{ $t('login.signIn') }} </n-button> <n-flex> <!-- <n-flex> <n-text>{{ $t('login.noAccountText') }}</n-text> <n-button type="primary" text @click="toOtherForm('register')"> {{ $t('login.signUp') }} </n-button> </n-flex> </n-flex> --> </n-space> </n-form> <n-divider> <!-- <n-divider> <span op-80>{{ $t('login.or') }}</span> </n-divider> <n-space justify="center"> </n-divider> --> <!-- <n-space justify="center"> <n-button circle> <template #icon> <n-icon><icon-park-outline-wechat /></n-icon> @@ -121,7 +121,7 @@ <n-icon><icon-park-outline-github-one /></n-icon> </template> </n-button> </n-space> </n-space> --> </div> </template> src/views/build-in/login/index.vue
@@ -23,7 +23,7 @@ style="background: var(--card-color);box-shadow: var(--box-shadow-1);" > <div class="w-full flex flex-col items-center"> <SvgIconsLogo class="text-6em" /> <!-- <SvgIconsLogo class="text-6em" /> --> <n-h3>{{ appName }} </n-h3> <transition name="fade-slide" src/views/dashboard/workbench/index.vue
@@ -1,314 +1,10 @@ <script setup lang="ts"> import { useAuthStore } from '@/store' import Chart from './components/chart.vue' const { userInfo } = useAuthStore() </script> <template> <n-grid :x-gap="16" :y-gap="16" :cols="3" item-responsive responsive="screen" > <!-- 左侧主要内容区 - 移动端全宽,桌面端2/3宽 --> <n-gi span="3 m:2"> <n-space vertical :size="16" > <!-- 图表区域 --> <n-card style="--n-padding-left: 0;"> <Chart /> </n-card> <!-- 统计卡片区域 --> <n-grid :x-gap="16" :y-gap="16" :cols="4" item-responsive responsive="screen" > <n-gi span="2 l:1"> <n-card> <n-thing> <template #avatar> <n-el> <n-icon-wrapper :size="46" color="var(--success-color)" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:user" /> </n-icon-wrapper> </n-el> </template> <template #header> <n-statistic label="活跃用户"> <n-number-animation show-separator :from="0" :to="12039" /> </n-statistic> </template> </n-thing> </n-card> </n-gi> <n-gi span="2 l:1"> <n-card> <n-thing> <template #avatar> <n-el> <n-icon-wrapper :size="46" color="var(--success-color)" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:every-user" /> </n-icon-wrapper> </n-el> </template> <template #header> <n-statistic label="用户"> <n-number-animation show-separator :from="0" :to="44039" /> </n-statistic> </template> </n-thing> </n-card> </n-gi> <n-gi span="2 l:1"> <n-card> <n-thing> <template #avatar> <n-el> <n-icon-wrapper :size="46" color="var(--success-color)" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:preview-open" /> </n-icon-wrapper> </n-el> </template> <template #header> <n-statistic label="浏览量"> <n-number-animation show-separator :from="0" :to="551039" /> </n-statistic> </template> </n-thing> </n-card> </n-gi> <n-gi span="2 l:1"> <n-card> <n-thing> <template #avatar> <n-el> <n-icon-wrapper :size="46" color="var(--success-color)" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:star" /> </n-icon-wrapper> </n-el> </template> <template #header> <n-statistic label="收藏数"> <n-number-animation show-separator :from="0" :to="7739" /> </n-statistic> </template> </n-thing> </n-card> </n-gi> </n-grid> <n-card title="动态"> <template #header-extra> <n-button type="primary" quaternary > 更多 </n-button> </template> <n-list hoverable> <n-list-item> <template #prefix> <n-avatar round :size="48" :src="userInfo?.avatar" /> </template> <n-thing title="客怎车" title-extra="09/29/2022" description="是“我的客厅怎么会有车”的缩写,指那些在车道间肆意穿梭,把马路当客厅的人,多有嘲讽意味,主要用于车祸视频中。" /> </n-list-item> <n-list-item> <template #prefix> <n-avatar round :size="48" :src="userInfo?.avatar" /> </template> <n-thing title="街健五大神技" title-extra="09/29/2022" description="街头健身五大神技,包括1.单手引体向上。2.慢速双力臂。3.人旗。4.前水平。5.俄式挺身。" /> </n-list-item> <n-list-item> <template #prefix> <n-avatar round :size="48" :src="userInfo?.avatar" /> </template> <n-thing title="天下岂有七十年太子乎" title-extra="09/29/2022" description="★含义:用来调侃由于英国女王超长的在位时间,导致其长子查理斯王子成为史上等待王位时间最久的王储 " /> </n-list-item> <n-list-item> <template #prefix> <n-avatar round :size="48" :src="userInfo?.avatar" /> </template> <n-thing title="你干嘛~哈哈~哎哟~" title-extra="09/29/2022" description="出自著名偶像练习生、练习时长两年半、背带异常梳中分的蔡徐坤在2018年的一档综艺节目偶像练习生中出现的一幕" /> </n-list-item> </n-list> </n-card> </n-space> </n-gi> <!-- 右侧边栏 - 移动端全宽,桌面端1/3宽 --> <n-gi span="3 m:1"> <n-space vertical :size="16" > <n-card title="公告"> <template #header-extra> <n-button type="primary" quaternary > 更多 </n-button> </template> <n-list> <n-list-item> <template #prefix> <n-tag :bordered="false" type="info" size="small" > 通知 </n-tag> </template> <n-button text> 漂洋过海上大专 </n-button> </n-list-item> <n-list-item> <template #prefix> <n-tag :bordered="false" type="success" size="small" > 消息 </n-tag> </template> <n-button text> 你在玩很新的东西 </n-button> </n-list-item> <n-list-item> <template #prefix> <n-tag :bordered="false" type="warning" size="small" > 活动 </n-tag> </template> <n-button text> 上岸第一剑,先斩意中人 </n-button> </n-list-item> </n-list> </n-card> <!-- 订单和待办统计 --> <n-grid :x-gap="16" :y-gap="16" :cols="2" > <!-- 移动端和桌面端都是每行2个 --> <n-gi :span="1"> <n-card> <n-flex vertical align="center"> <n-text depth="3"> 订单数 </n-text> <n-icon-wrapper :size="46" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:all-application" /> </n-icon-wrapper> <n-text strong class="text-2xl"> 1,234,123 </n-text> </n-flex> </n-card> </n-gi> <n-gi :span="1"> <n-card> <n-flex vertical align="center"> <n-text depth="3"> 待办 </n-text> <n-el> <n-icon-wrapper :size="46" color="var(--warning-color)" :border-radius="999"> <nova-icon :size="26" icon="icon-park-outline:list-bottom" /> </n-icon-wrapper> </n-el> <n-text strong class="text-2xl"> 78 </n-text> </n-flex> </n-card> </n-gi> </n-grid> <n-card title="任务进度"> <n-timeline> <n-timeline-item content="啊" /> <n-timeline-item type="success" title="成功" content="哪里成功" time="2018-04-03 20:46" /> <n-timeline-item type="error" content="哪里错误" time="2018-04-03 20:46" /> <n-timeline-item type="warning" title="警告" content="哪里警告" time="2018-04-03 20:46" /> <n-timeline-item type="info" title="信息" content="是的" time="2018-04-03 20:46" line-type="dashed" /> <n-timeline-item content="啊" /> </n-timeline> </n-card> </n-space> </n-gi> </n-grid> <n-card class="w-full h-full"> <div class="text-base font-bold">首页开发中...</div> </n-card> </template> <style scoped></style> src/views/operationsManagement/geofenceManagement/detail.vue
@@ -26,6 +26,7 @@ timeList: [], edit: false, customTime: [], id: 1 } ]) @@ -95,6 +96,29 @@ type: 1, timeList: [], edit: false, customTime: [], id: groupList.value.length + 1 }) } const addTimeRange = (item: any) => { console.log(item) groupList.value.forEach((group) => { if (group.id === item.id) { group.timeList.push({ startTime: 0, endTime: 0, id: group.timeList.length + 1 }) } }) } const removeTimePeriod = (item: any) => { groupList.value.forEach((group) => { if (group.id === item.id) { group.timeList = group.timeList.filter((sub: any) => sub.id !== item.id) } }) } @@ -111,6 +135,7 @@ map.value = new AMap.Map(domRef.value, { zoom: 10, center: [113.264499, 23.130061], mapStyle: 'amap://styles/yuanshandai' }) console.log('地图初始化成功:', map.value) @@ -126,12 +151,13 @@ </script> <template> <!-- 地图区域 --> <div class="w-full h-full" id="mapBox"> <div id="map" ref="domRef" class="w-full h-full" style="position: relative;" /> </div> <div class="w-full h-full"> <!-- 地图区域 --> <div class="w-full h-[60%]" id="mapBox"> <div id="map" ref="domRef" class="w-full h-full" style="position: relative;" /> </div> <!-- <div class="flex-1 info"> <div class="flex-1 info"> <div class="text-[16px] font-bold my-4">新建围栏</div> <n-card :segmented="{ content: true, @@ -152,83 +178,91 @@ </div> </div> </template> <n-form ref="formRef" :rules="rules" :model="formModel" require-mark-placement="left"> <n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;"> <n-tab-pane name="基本信息"> <n-grid :cols="2" :x-gap="18"> <n-form-item-grid-item :span="1" label="围栏名称" path="name"> <n-input v-model:value="formModel.name" /> </n-form-item-grid-item> <n-form-item-grid-item :span="1" label="围栏描述" path="remark"> <n-input v-model:value="formModel.remark" type="textarea" /> </n-form-item-grid-item> <n-form-item-grid-item :span="2" label="区域类型" path="regionType"> 运营区 </n-form-item-grid-item> <n-form-item-grid-item :span="2" label="区域状态" path="regionStatus"> <NTag type="default" round>草稿</NTag> </n-form-item-grid-item> </n-grid> </n-tab-pane> <n-tab-pane name="生命周期"> <n-grid :cols="2" :x-gap="18"> <n-form-item-grid-item :span="1" label="生效时间" path="effectiveTime" required> <n-space vertical> <n-radio-group v-model:value="formModel.effectiveTime" name="effectiveTime" class="pl-8"> <n-space vertical> <n-radio :value="1">立即生效</n-radio> <n-radio :value="2">定时生效</n-radio> </n-space> </n-radio-group> <n-date-picker v-model:value="formModel.effectiveTimeTimestamp" type="datetime" clearable v-if="formModel.effectiveTime === 2" class="pl-8" /> </n-space> </n-form-item-grid-item> <n-form-item-grid-item :span="1" label="失效时间" path="expireTime" required> <n-space vertical> <n-radio-group v-model:value="formModel.expireTime" name="expireTime" class="pl-8"> <n-space vertical> <n-radio :value="1">永不失效</n-radio> <n-radio :value="2">定时失效</n-radio> </n-space> </n-radio-group> <n-date-picker v-model:value="formModel.expireTimeTimestamp" type="datetime" clearable v-if="formModel.expireTime === 2" class="pl-8" /> </n-space> </n-form-item-grid-item> </n-grid> </n-tab-pane> <n-tab-pane name="运营策略"> <n-flex> <div v-for="item in groupList" :key="item.name" class="w-[32%]"> <NSpace vertical> <div> <div v-if="!item.edit">{{ item.name }}</div> <n-input v-model:value="item.name" v-else /> </div> <div> <div class="text-[12px] text-gray-500 mb-2">日期选择</div> <n-radio-group v-model:value="item.type" name="radiobuttongroup1"> <n-radio-button v-for="item in dateOptions" :key="item.value" :value="item.value" :label="item.label" /> </n-radio-group> <n-select class="mt-2" v-model:value="item.customTime" multiple :options="weekOptions" v-if="item.type === 4" /> </div> <div> <div class="text-[12px] text-gray-500 mb-2">时段配置</div> <NButton type="primary" text @click="addStrategyGroup">添加时段</NButton> </div> </NSpace> </div> <div class="w-[32%]"> <NButton type="primary" @click="addStrategyGroup">添加运营策略组</NButton> </div> </n-flex> </n-tab-pane> </n-tabs> </n-form> </n-card> </div> --> <n-form ref="formRef" :rules="rules" :model="formModel" require-mark-placement="left"> <n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;"> <n-tab-pane name="基本信息"> <n-grid :cols="2" :x-gap="18"> <n-form-item-grid-item :span="1" label="围栏名称" path="name"> <n-input v-model:value="formModel.name" /> </n-form-item-grid-item> <n-form-item-grid-item :span="1" label="围栏描述" path="remark"> <n-input v-model:value="formModel.remark" type="textarea" /> </n-form-item-grid-item> <n-form-item-grid-item :span="2" label="区域类型" path="regionType"> 运营区 </n-form-item-grid-item> <n-form-item-grid-item :span="2" label="区域状态" path="regionStatus"> <NTag type="default" round>草稿</NTag> </n-form-item-grid-item> </n-grid> </n-tab-pane> <n-tab-pane name="生命周期"> <n-grid :cols="2" :x-gap="18"> <n-form-item-grid-item :span="1" label="生效时间" path="effectiveTime" required> <n-space vertical> <n-radio-group v-model:value="formModel.effectiveTime" name="effectiveTime" class="pl-8"> <n-space vertical> <n-radio :value="1">立即生效</n-radio> <n-radio :value="2">定时生效</n-radio> </n-space> </n-radio-group> <n-date-picker v-model:value="formModel.effectiveTimeTimestamp" type="datetime" clearable v-if="formModel.effectiveTime === 2" class="pl-8" /> </n-space> </n-form-item-grid-item> <n-form-item-grid-item :span="1" label="失效时间" path="expireTime" required> <n-space vertical> <n-radio-group v-model:value="formModel.expireTime" name="expireTime" class="pl-8"> <n-space vertical> <n-radio :value="1">永不失效</n-radio> <n-radio :value="2">定时失效</n-radio> </n-space> </n-radio-group> <n-date-picker v-model:value="formModel.expireTimeTimestamp" type="datetime" clearable v-if="formModel.expireTime === 2" class="pl-8" /> </n-space> </n-form-item-grid-item> </n-grid> </n-tab-pane> <n-tab-pane name="运营策略"> <n-flex> <div v-for="item in groupList" :key="item.name" class="w-[32%] border border-gray-300 rounded p-4"> <NSpace vertical> <div> <div v-if="!item.edit">{{ item.name }}</div> <n-input v-model:value="item.name" v-else /> </div> <div> <div class="text-[12px] text-gray-500 mb-2">日期选择</div> <n-radio-group v-model:value="item.type" name="radiobuttongroup1"> <n-radio-button v-for="item in dateOptions" :key="item.value" :value="item.value" :label="item.label" /> </n-radio-group> <n-select class="mt-2 w-[240px]" v-model:value="item.customTime" multiple :options="weekOptions" v-if="item.type === 4" /> </div> <div> <div class="text-[12px] text-gray-500 mb-2">时段配置</div> <n-flex align="center" v-for="sub in item.timeList" :key="sub.id"> <n-time-picker v-model:value="sub.startTime" class="w-[100px]" /> 至 <n-time-picker v-model:value="sub.endTime" class="w-[100px]" /> <icon-park-outline-delete @click="removeTimePeriod(sub)" class="cursor-pointer" /> </n-flex> <NButton type="primary" text @click="addTimeRange(item)" class="mt-2">添加时段</NButton> </div> </NSpace> </div> <div class="w-[32%] border border-dashed border-gray-300 rounded p-4 flex items-center justify-center"> <NButton type="primary" @click="addStrategyGroup">添加运营策略组</NButton> </div> </n-flex> </n-tab-pane> </n-tabs> </n-form> </n-card> </div> </div> </template> <style lang="scss"> src/views/operationsManagement/pointManagement/index.vue
@@ -1,198 +1,50 @@ <script setup lang="tsx"> import type { DataTableColumns, FormInst } from 'naive-ui' import { useBoolean } from '@/hooks' import { fetchUserPage } from '@/service' import { NButton, NPopconfirm, NSpace } from 'naive-ui' import SearchPanel from '@/components/custom/SearchPanel.vue' import TableModal from './components/TableModal.vue' import { ref, onMounted } from 'vue' import { useScriptTag } from '@vueuse/core' const { bool: loading, setTrue: startLoading, setFalse: endLoading } = useBoolean(false) const { t } = useI18n() // 添加更好的错误处理和调试 const { load } = useScriptTag('https://webapi.amap.com/maps?v=2.0&key=85e62187c6f8e51c797c87b1f36f787a') const initialModel = { condition_1: '', condition_2: '', condition_3: null, } const model = ref({ ...initialModel }) function handleResetSearch() { model.value = { ...initialModel } } const domRef = ref<HTMLDivElement>() const map = ref(null) const mapError = ref('') const formRef = ref<FormInst | null>() const modalRef = ref() function delteteUser(id: number) { window.$message.success(`删除用户id:${id}`) } const columns = computed<DataTableColumns<any>>(() => [ { title: '序号', align: 'center', key: 'serialNumber', ellipsis: true }, { title: '添加时间', align: 'center', key: 'createTime', ellipsis: true }, { title: '开通城市', align: 'center', key: 'city', ellipsis: true }, { title: '状态', align: 'center', key: 'status', ellipsis: true, render: (row) => { return row.status === 1 ? '启用' : '禁用' }, }, { title: '操作', align: 'center', key: 'actions', width: 260, fixed: 'right', render: (row) => { return ( <NSpace justify="center"> <NButton text type="primary" onClick={() => modalRef.value.openModal('edit', row)} > 编辑 </NButton> <NButton text type="primary" > 启用 </NButton> <NPopconfirm onPositiveClick={() => delteteUser(row.id!)}> {{ default: () => '确认删除', trigger: () => <NButton text type="error">删除</NButton>, }} </NPopconfirm> </NSpace> ) }, }, ]) const options = [ { label: '启用', value: 1, }, { label: '禁用', value: 2, }, ] const filterItems = computed(() => [ { label: '城市', path: 'condition_1', render: () => <n-input v-model:value={model.value.condition_1} />, }, { label: '状态', path: 'condition_3', render: () => <n-select v-model:value={model.value.condition_3} options={options} />, }, ]) const count = ref(0) const listData = ref<any>([]) async function getList() { startLoading() setTimeout(() => { listData.value = [ { id: 1, city: '四川省成都市', status: 1, createTime: '2023-01-01 10:00:00', updateTime: '2023-01-01 10:00:00', }, { id: 2, city: '四川省成都市', status: 2, createTime: '2023-01-01 10:00:00', updateTime: '2023-01-01 10:00:00', }, ] listData.value.forEach((item: any, index: number) => { item.serialNumber = index + 1 async function initMap() { try { if (!domRef.value) { return } await load() if (typeof AMap === 'undefined') { console.error('AMap未定义') return } map.value = new AMap.Map(domRef.value, { zoom: 10, center: [113.264499, 23.130061], }) count.value = 1 endLoading() }, 1000) console.log('地图初始化成功:', map.value) } catch (err) { mapError.value = '地图初始化失败: ' + (err as Error).message console.error('地图初始化错误:', err) } } onMounted(() => { getList() initMap() }) function changePage(page: number, size: number) { window.$message.success(`分页器:${page},${size}`) } </script> <template> <n-flex> <NSpace vertical class="flex-1"> <n-card> <n-form ref="formRef" :model="model" label-placement="left" inline :show-feedback="false"> <SearchPanel> <n-gi v-for="item in filterItems" :key="item.path"> <n-form-item :label="item.label" :path="item.path"> <component :is="item.render" /> </n-form-item> </n-gi> <template #action> <NButton strong secondary @click="handleResetSearch"> <template #icon> <icon-park-outline-redo /> </template> {{ $t('common.reset') }} </NButton> <NButton type="primary" @click="getList"> <template #icon> <icon-park-outline-search /> </template> {{ $t('common.search') }} </NButton> </template> </SearchPanel> </n-form> </n-card> <n-card class="flex-1"> <template #header> <NButton type="primary" @click="modalRef.openModal('add')"> 新增城市 </NButton> </template> <NSpace vertical> <n-data-table :columns="columns" :data="listData" :loading="loading" /> <Pagination :count="count" @change="changePage" /> </NSpace> <TableModal ref="modalRef" modal-name="开通城市" /> </n-card> </NSpace> </n-flex> <!-- 地图区域 --> <div class="w-full h-full" id="mapBox"> <div id="map" ref="domRef" class="w-full h-full" style="position: relative;" /> </div> </template> <style lang="scss"> .robotaxi-content { padding: 0 !important; } </style>