From 083eea49b123f59cf67cfe802053db5efb57163d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?=
<14103883+leaf-phos@user.noreply.gitee.com>
Date: Mon, 28 Apr 2025 16:34:03 +0800
Subject: [PATCH] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=AF=BC=E8=A7=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1 +
src/api/system/user.js | 9 ++
src/components/Avatar/index.vue | 5 +-
src/store/getters.js | 1 +
src/store/modules/user.js | 36 ++---
src/utils/guide.js | 161 +++++++++++++++++++
src/views/bst/area/index.vue | 6 +-
src/views/bst/area/view/view.vue | 10 +-
src/views/bst/areaSub/components/AreaMap.vue | 4 +-
src/views/bst/areaSub/index.vue | 5 +
src/views/bst/customerService/index.vue | 2 +-
src/views/bst/index/MchIndex.vue | 12 +-
src/views/bst/order/index.vue | 25 ++-
src/views/bst/order/view/view.vue | 157 +++++++++++++-----
src/views/monitor/operlog/index.vue | 16 +-
src/views/system/user/UserLink.vue | 35 ----
src/views/system/user/index.vue | 17 +-
src/views/system/user/view/view.vue | 13 +-
18 files changed, 381 insertions(+), 134 deletions(-)
create mode 100644 src/utils/guide.js
delete mode 100644 src/views/system/user/UserLink.vue
diff --git a/package.json b/package.json
index 1832293..46f88af 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,7 @@
"clipboard": "2.0.8",
"core-js": "3.37.1",
"decimal.js": "^10.4.3",
+ "driver.js": "^1.3.5",
"echarts": "5.4.0",
"element-ui": "2.15.14",
"file-saver": "2.0.5",
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 3ce258b..bab6628 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -152,3 +152,12 @@ export function deptTreeSelect() {
method: 'get'
})
}
+
+// 已读导览
+export function readGuide(key) {
+ return request({
+ url: '/system/user/guide',
+ method: 'put',
+ params: { key }
+ })
+}
diff --git a/src/components/Avatar/index.vue b/src/components/Avatar/index.vue
index 21c6031..4067106 100644
--- a/src/components/Avatar/index.vue
+++ b/src/components/Avatar/index.vue
@@ -72,13 +72,16 @@ export default {
align-items: center;
justify-content: center;
border-radius: 50%;
+ overflow: hidden;
+ vertical-align: middle;
::v-deep .el-avatar {
- display: flex;
+ display: inline-flex;
align-items: center;
justify-content: center;
background-color: inherit;
font-size: 16px;
+ vertical-align: middle;
}
}
\ No newline at end of file
diff --git a/src/store/getters.js b/src/store/getters.js
index 74490a9..44b63b0 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -10,6 +10,7 @@ const getters = {
userId: state => state.user.id,
name: state => state.user.name,
nickName: state => state.user.nickName,
+ guides: state => state.user.guides,
introduction: state => state.user.introduction,
roles: state => state.user.roles,
permissions: state => state.user.permissions,
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 270b02b..90f6f4f 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,4 +1,5 @@
import { getInfo, login, logout } from '@/api/login';
+import { readGuide } from '@/api/system/user';
import { getToken, removeToken, setToken } from '@/utils/auth';
// import { Watermark } from '@pansy/watermark';
@@ -15,6 +16,7 @@ const user = {
permissions: [],
deptId: null,
userType: null,
+ guides: [],
},
mutations: {
@@ -41,31 +43,12 @@ const user = {
},
SET_NICK_NAME: (state, nickName) => {
state.nickName = nickName;
-
- // if (watermark) {
- // watermark.destroy();
- // }
- // // 创建水印
- // watermark = new Watermark({
- // // 水印文案,支持多行
- // text: nickName,
- // // 水印文案样式
- // font: {
- // fontSize: 16,
- // color: 'rgba(0, 0, 0)',
- // fontFamily: 'sans-serif'
- // },
- // // 水印之间的间距
- // gap: [300, 300],
- // // 旋转角度
- // rotate: -20,
- // // 设置水印层级
- // zIndex: 9999,
- // opacity: 0.1,
- // })
},
SET_USER_TYPE: (state, userType) => {
state.userType = userType;
+ },
+ SET_GUIDES: (state, guides) => {
+ state.guides = guides;
}
},
@@ -105,6 +88,7 @@ const user = {
commit('SET_AVATAR', avatar)
commit('SET_DEPT_ID', user.deptId)
commit('SET_USER_TYPE', user.userType)
+ commit('SET_GUIDES', user.guides)
resolve(res)
}).catch(error => {
reject(error)
@@ -134,6 +118,14 @@ const user = {
removeToken()
resolve()
})
+ },
+ // 添加导览
+ ADD_GUIDES({commit, state}, key) {
+ return new Promise((resolve, reject) => {
+ readGuide(key).then(() => {
+ commit('SET_GUIDES', [...state.guides, key])
+ });
+ });
}
}
}
diff --git a/src/utils/guide.js b/src/utils/guide.js
new file mode 100644
index 0000000..c5c9574
--- /dev/null
+++ b/src/utils/guide.js
@@ -0,0 +1,161 @@
+/**
+ * 用户引导
+ */
+
+import store from "@/store";
+import { driver } from "driver.js";
+import "driver.js/dist/driver.css";
+export function startGuide(guideKey) {
+ let guides = store.getters.guides;
+ if (guides == null || !guides.includes(guideKey)) {
+ let guide = guideSet[guideKey];
+ if (guide) {
+ guide.start();
+ }
+ }
+}
+
+const guideSet = {
+ MchIndex: {
+ start() {
+ const driverObj = driver({
+ showProgress: true,
+ animate: true,
+ nextBtnText: '下一步',
+ prevBtnText: '上一步',
+ doneBtnText: '完成',
+ closeBtnText: '关闭',
+ allowClose: false,
+ onDestroyed: () => {
+ // 导览完成后调用接口
+ store.dispatch("ADD_GUIDES", "MchIndex");
+ },
+ steps: [
+ {
+ popover: {
+ title: '欢迎使用小鹿骑行管理系统',
+ description: '接下来我们将带您了解系统的主要功能区域',
+ side: "center",
+ align: 'center'
+ }
+ },
+ {
+ element: '#mch-stat',
+ popover: {
+ title: '运营统计',
+ description: '这里显示您的运营数据统计信息,包括订单数量、金额等关键指标。',
+ side: "bottom",
+ align: 'start'
+ }
+ },
+ {
+ element: '#device-stat',
+ popover: {
+ title: '车辆统计',
+ description: '这里展示设备相关的统计信息,包括设备总数、在线状态等。',
+ side: "bottom",
+ align: 'start'
+ }
+ },
+ {
+ element: '#order-daily-stat',
+ popover: {
+ title: '每日流水统计',
+ description: '这里展示每日的订单流水统计图表,帮助您了解业务趋势。',
+ side: "left",
+ align: 'start'
+ }
+ },
+ {
+ element: '#balance-panel',
+ popover: {
+ title: '账户信息',
+ description: '这里显示您的账户余额、待分润金额等信息,方便您随时查看收益情况。',
+ side: "right",
+ align: 'start'
+ }
+ },
+ {
+ popover: {
+ title: '小程序管理',
+ description: `
+
+
您还可以通过小鹿骑行小程序随时随地管理您的业务,扫码即可体验。
+

+
+ `,
+ side: "center",
+ align: 'center'
+ }
+ }
+ ]
+ });
+
+ driverObj.drive();
+ }
+ },
+ AreaSub: {
+ start() {
+ const driverObj = driver({
+ showProgress: true,
+ animate: true,
+ nextBtnText: '下一步',
+ prevBtnText: '上一步',
+ doneBtnText: '完成',
+ closeBtnText: '关闭',
+ allowClose: false,
+ onDestroyed: () => {
+ store.dispatch("ADD_GUIDES", "AreaSub");
+ },
+ steps: [
+ {
+ popover: {
+ title: '子区域管理',
+ description: '欢迎使用子区域管理功能,这里您可以管理运营区下的子区域和电子围栏。',
+ side: "center",
+ align: 'center'
+ }
+ },
+ {
+ element: '.sub-area-list',
+ popover: {
+ title: '子区域列表',
+ description: '左侧显示当前运营区下的所有子区域列表,您可以在这里查看和管理子区域。',
+ side: "right",
+ align: 'start'
+ }
+ },
+ {
+ element: '.map-container',
+ popover: {
+ title: '地图操作区',
+ description: '右侧地图区域是您的主要操作区域,您可以在这里进行以下操作:\n1. 点击地图空白处添加新的子区域\n2. 点击已有区域进行编辑\n3. 拖动边界点调整区域范围\n4. 查看电子围栏分布',
+ side: "left",
+ align: 'start'
+ }
+ },
+ {
+ element: '#add-sub',
+ popover: {
+ title: '新增子区域',
+ description: '点击按钮,即可开始在地图上绘制区域(停车区、禁行区、禁停区)',
+ side: "left",
+ align: 'start'
+ }
+ },
+ {
+ element: '#area-edit',
+ popover: {
+ title: '电子围栏操作',
+ description: '点击此处可以编辑电子围栏',
+ side: "left",
+ align: 'start'
+ }
+ }
+ ]
+ });
+
+ driverObj.drive();
+ }
+ }
+}
diff --git a/src/views/bst/area/index.vue b/src/views/bst/area/index.vue
index 83275f9..a18e895 100644
--- a/src/views/bst/area/index.vue
+++ b/src/views/bst/area/index.vue
@@ -104,7 +104,7 @@
{{d.row[column.key]}}
- {{d.row.name}}
+
@@ -194,6 +194,7 @@ import { listArea, delArea } from "@/api/bst/area";
import { $showColumns } from '@/utils/mixins';
import AreaCustomerServiceDialog from "@/views/bst/area/components/AreaCustomerServiceDialog.vue";
import UserLink from '@/components/Business/User/UserLink.vue';
+import AreaLink from '@/components/Business/Area/AreaLink.vue';
// 默认排序字段
const defaultSort = {
prop: "createTime",
@@ -206,7 +207,8 @@ export default {
dicts: ['area_status'],
components: {
AreaCustomerServiceDialog,
- UserLink
+ UserLink,
+ AreaLink
},
props: {
query: {
diff --git a/src/views/bst/area/view/view.vue b/src/views/bst/area/view/view.vue
index 50714d3..8a5e59c 100644
--- a/src/views/bst/area/view/view.vue
+++ b/src/views/bst/area/view/view.vue
@@ -43,6 +43,9 @@
+
+
+
@@ -55,9 +58,10 @@ import AreaSub from '@/views/bst/areaSub/index.vue';
import Device from '@/views/bst/device/index.vue';
import Order from '@/views/bst/order/index.vue';
import AreaJoin from '@/views/bst/areaJoin/index.vue';
-import { AreaJoinType } from '@/utils/enums';
+import { AreaJoinType, LogBizType } from '@/utils/enums';
import CustomerService from '@/views/bst/customerService/index.vue';
import Agreement from '@/views/bst/agreement/index.vue';
+import OperLog from '@/views/monitor/operlog/index.vue';
export default {
name: 'AreaView',
@@ -69,11 +73,13 @@ export default {
Order,
AreaJoin,
CustomerService,
- Agreement
+ Agreement,
+ OperLog
},
data() {
return {
AreaJoinType,
+ LogBizType,
detail: {},
loading: false,
id: null,
diff --git a/src/views/bst/areaSub/components/AreaMap.vue b/src/views/bst/areaSub/components/AreaMap.vue
index e01e167..5b1817f 100644
--- a/src/views/bst/areaSub/components/AreaMap.vue
+++ b/src/views/bst/areaSub/components/AreaMap.vue
@@ -9,8 +9,8 @@
- 子区域
- 电子围栏
+ 子区域
+ 电子围栏
全局查看
切换样式
{{ showLabels ? '隐藏' : '显示' }}标签
diff --git a/src/views/bst/areaSub/index.vue b/src/views/bst/areaSub/index.vue
index e826da2..51daaad 100644
--- a/src/views/bst/areaSub/index.vue
+++ b/src/views/bst/areaSub/index.vue
@@ -186,6 +186,7 @@ import { getArea, updateArea } from '@/api/bst/area';
import { AreaSubStatus, AreaSubType } from '@/utils/enums';
import AreaMap from '@/views/bst/areaSub/components/AreaMap.vue';
import AreaSubEditDialog from '@/views/bst/areaSub/components/AreaSubEditDialog.vue';
+import {startGuide} from "@/utils/guide"
// 默认排序字段
const defaultSort = {
@@ -284,6 +285,10 @@ export default {
}
this.getArea();
this.getList();
+
+ this.$nextTick(()=> {
+ startGuide("AreaSub");
+ });
},
methods: {
handleRowClick(row) {
diff --git a/src/views/bst/customerService/index.vue b/src/views/bst/customerService/index.vue
index 0ecdfe4..dea0d07 100644
--- a/src/views/bst/customerService/index.vue
+++ b/src/views/bst/customerService/index.vue
@@ -182,7 +182,7 @@ export default {
span: 24,
// 字段列表
columns: [
- {key: 'id', visible: true, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
+ {key: 'id', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'areaName', visible: true, label: '运营区', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'name', visible: true, label: '姓名', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'contact', visible: true, label: '联系方式', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
diff --git a/src/views/bst/index/MchIndex.vue b/src/views/bst/index/MchIndex.vue
index bf6f8be..f1f1c17 100644
--- a/src/views/bst/index/MchIndex.vue
+++ b/src/views/bst/index/MchIndex.vue
@@ -18,14 +18,14 @@
-
+
-
+
-
+
@@ -39,7 +39,7 @@
我的
-
+
@@ -64,6 +64,7 @@ import { listSimpleArea } from '@/api/bst/area'
import BalancePanel from '@/views/bst/index/components/BalancePanel'
import OrderStat from '@/views/bst/index/components/OrderStat'
import { mapGetters } from 'vuex'
+import {startGuide} from '@/utils/guide'
export default {
name: 'Index',
@@ -99,6 +100,9 @@ export default {
created() {
this.getUserInfo();
this.getAreaList();
+ this.$nextTick(()=> {
+ startGuide("MchIndex");
+ });
},
methods: {
getAreaList() {
diff --git a/src/views/bst/order/index.vue b/src/views/bst/order/index.vue
index 5bea195..1e3d05e 100644
--- a/src/views/bst/order/index.vue
+++ b/src/views/bst/order/index.vue
@@ -148,7 +148,7 @@
{{d.row.suitName | dv}}
-
+
@@ -162,13 +162,24 @@
- 实收:{{d.row.payedAmount - d.row.payRefunded - d.row.payRefunding | fix2 | dv}} 元
- 预存:{{d.row.depositFee | fix2 | dv}} 元
- 结算:{{d.row.totalFee | fix2 | dv}} 元
骑行:{{d.row.ridingFee | fix2 | dv}} 元
- 调度:{{d.row.dispatchFee | fix2 | dv}} 元
- 管理:{{d.row.manageFee | fix2 | dv}} 元
- 车损:{{d.row.deductionFee | fix2 | dv}} 元
+ 预存:{{d.row.depositFee | fix2 | dv}} 元
+
+
+
+
骑行费:{{d.row.ridingFee | fix2 | dv}} 元
+
调度费:{{d.row.dispatchFee | fix2 | dv}} 元
+
管理费:{{d.row.manageFee | fix2 | dv}} 元
+
车损费:{{d.row.deductionFee | fix2 | dv}} 元
+
+ 结算:{{d.row.totalFee | fix2 | dv}} 元
+
+
+ 实收:{{d.row.payedAmount - d.row.payRefunded - d.row.payRefunding | fix2 | dv}} 元
退款:{{d.row.payRefunded | fix2 | dv}} 元
(退款中:{{d.row.payRefunding | fix2 | dv}} 元)
diff --git a/src/views/bst/order/view/view.vue b/src/views/bst/order/view/view.vue
index 05299e4..6e38999 100644
--- a/src/views/bst/order/view/view.vue
+++ b/src/views/bst/order/view/view.vue
@@ -2,6 +2,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
骑行费:{{detail.ridingFee | fix2 | dv}} 元
+
调度费:{{detail.dispatchFee | fix2 | dv}} 元
+
管理费:{{detail.manageFee | fix2 | dv}} 元
+
车损费:{{detail.deductionFee | fix2 | dv}} 元
+
+
+
+
+
+
+ 结算金额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (退款中:{{ detail.payRefunding | fix2 | dv }} 元)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- {{ detail.no | dv}}
+
+ {{ detail.no | dv}}
+
+
- {{ detail.areaName | dv}}
+
+
+
{{ detail.createTime | dv}}
{{ detail.startTime | dv}}
{{ detail.endTime | dv}}
- {{ detail.maxTime | dv}}
{{ orderDuration | dv}}
{{ detail.distance / 1000 | fix2 | dv}} 公里
{{ detail.endReason | dv }}
@@ -50,27 +143,10 @@
-
-
- {{ detail.depositFee | fix2 | dv }} 元
- {{ detail.totalFee | fix2 | dv }} 元
- {{ detail.ridingFee | fix2 | dv }} 元
- {{ detail.dispatchFee | fix2 | dv }} 元
- {{ detail.manageFee | fix2 | dv }} 元
- {{ detail.deductionFee | fix2 | dv }} 元
-
- {{ detail.payRefunded | fix2 | dv }} 元
-
- (退款中:{{ detail.payRefunding | fix2 | dv }} 元)
-
-
- {{ detail.payedAmount - detail.payRefunded - detail.payRefunding | fix2 | dv }} 元
-
-
-
+
{{ detail.suitName }}
@@ -102,21 +178,6 @@
-
-
@@ -160,7 +221,7 @@
-
+
@@ -207,6 +268,7 @@ import CommandLog from '@/views/bst/commandLog/index.vue'
import DeviceLink from '@/components/Business/Device/DeviceLink.vue'
import UserLink from '@/components/Business/User/UserLink.vue'
import {getOrderDuration} from '@/views/bst/order/util'
+import AreaLink from '@/components/Business/Area/AreaLink.vue'
export default {
name: 'OrderView',
@@ -223,7 +285,8 @@ export default {
Operlog,
CommandLog,
DeviceLink,
- UserLink
+ UserLink,
+ AreaLink
},
data() {
return {
@@ -249,6 +312,9 @@ export default {
this.getDetail()
},
methods: {
+ handleCopySuccess() {
+ this.$message.success("复制成功");
+ },
toDescriptionFromSecond,
getDetail() {
this.loading = true
@@ -284,4 +350,15 @@ export default {
},
}
}
-
\ No newline at end of file
+
+
+
+
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
index 8c2e7e8..26e7a03 100644
--- a/src/views/monitor/operlog/index.vue
+++ b/src/views/monitor/operlog/index.vue
@@ -116,7 +116,11 @@
-
+
+
+
+
+
@@ -194,10 +198,14 @@
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index c390b8a..2b0adfa 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -119,12 +119,6 @@
{{d.row.dept == null ? '' : d.row.dept.deptName}}
-
-
-
-
-
-
{{ d.row.point | fix2 | dv }} %
@@ -147,7 +141,10 @@
-
+
+
+
+
@@ -303,14 +300,14 @@ export default {
// 列信息
columns: [
{key: 'userId', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
- {key: 'nickName', visible: true, label: '姓名', minWidth: null, sortable: true, overflow: false, align: 'left', width: "150"},
+ {key: 'nickName', visible: true, label: '姓名', minWidth: null, sortable: true, overflow: false, align: 'left', width: "250"},
{key: 'roles', visible: true, label: '角色', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'point', visible: true, label: '分成比例', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'withdrawServiceValue', visible: true, label: '提现服务费', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'bonusDelay', visible: true, label: '到账延迟', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'balance', visible: true, label: '余额', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
- {key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
- {key: 'isReal', visible: true, label: '实名状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+ // {key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+ // {key: 'isReal', visible: true, label: '实名状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'agentName', visible: true, label: '所属代理', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'deptName', visible: true, label: '归属部门', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'email', visible: false, label: '邮箱', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
diff --git a/src/views/system/user/view/view.vue b/src/views/system/user/view/view.vue
index ba66805..d0661d4 100644
--- a/src/views/system/user/view/view.vue
+++ b/src/views/system/user/view/view.vue
@@ -93,6 +93,12 @@
+
+
+
+
+
+
@@ -107,7 +113,7 @@ import UserStatistics from '@/views/system/user/view/components/UserStatistics'
import CollapsePanel from '@/components/CollapsePanel'
import BooleanTag from '@/components/BooleanTag'
import Bonus from '@/views/bst/bonus/index.vue'
-import { BonusArrivalType, AreaJoinType } from '@/utils/enums'
+import { BonusArrivalType, AreaJoinType, LogBizType } from '@/utils/enums'
import OrderDailyStat from '@/views/bst/index/components/OrderDailyStat.vue'
import Device from '@/views/bst/device/index.vue'
import AreaIndex from '@/views/bst/area/index.vue'
@@ -121,6 +127,7 @@ import OrderDevice from '@/views/bst/orderDevice/index.vue'
import Withdraw from '@/views/bst/withdraw/index.vue'
import RealName from '@/views/bst/realName/index.vue'
import AreaJoin from '@/views/bst/areaJoin/index.vue'
+import OperLog from '@/views/monitor/operlog/index.vue'
export default {
name: 'UserView',
@@ -143,12 +150,14 @@ export default {
OrderDevice,
Withdraw,
RealName,
- AreaJoin
+ AreaJoin,
+ OperLog
},
data() {
return {
BonusArrivalType,
AreaJoinType,
+ LogBizType,
detail: {
roles: []
},