Compare commits

...

20 Commits

Author SHA1 Message Date
air
55ded9c34d 【类 型】:docs
【原  因】:根据客户要求改变标题
【过  程】:送餐系统改为物流系统 字样
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-09-17 16:02:12 +08:00
air
5dff30dd9e 【类 型】:
【原  因】:
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-07-01 10:09:11 +08:00
air
0cfc7a984c 【类 型】:
【原  因】:
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-07-01 09:54:04 +08:00
5172beb985 fix 限飞区 禁飞区 menu缩进按钮 检测 半秒后再刷新地图组件 防止刷新太早 容器还没有展开 2025-06-28 16:23:55 +08:00
05361d6065 fix 集群控制 点飞 算出飞机目标位置 如果小于0 直接提示 返回 打断 不发送飞行命令 2025-06-28 15:52:19 +08:00
9cca19f31c fix 1打印日之前面加上飞机名字 2menu缩进按钮后加上延迟半秒更新地图组件大小 2025-06-28 15:17:22 +08:00
0d5d99fe39 test 2025-06-28 07:50:52 +08:00
1a695ffaaa factor 飞机管理 启用状态屏蔽 2025-06-27 22:03:01 +08:00
4ab76bfafe fix airlist异步获取慢 导致导航栏更不不及时
在切换tab时候 强制更新导航栏组件
2025-06-27 21:54:17 +08:00
95da221144 feat 面包屑有重复选项 隐藏 2025-06-27 21:38:27 +08:00
b908832ded feat 添加下载模块 2025-06-27 21:29:55 +08:00
493dade5b3 factor 更改地块管理模块 按照兰州学校的要求 删除多余字段用photo字段临时代替面积字段 2025-06-27 20:53:06 +08:00
9b59058724 fix 编辑角色 不显示权限设置项 2025-06-27 19:57:32 +08:00
3a239ba326 feat 头像选项 增加账号显示 2025-06-27 17:10:37 +08:00
d288442ad8 factor 隐藏送餐相关的所有 导航 选项 图标等 2025-06-27 16:29:35 +08:00
880bb25053 Merge branch '兰州学校' of http://111.229.174.37:3000/Food/food into 兰州学校 2025-06-27 15:34:06 +08:00
d7277a9223 fix 飞机详情里面 飞机类型的轴距单位mm 改为cm 2025-06-27 15:33:31 +08:00
air
6fce529247 【类 型】:
【原  因】:
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-06-27 15:27:41 +08:00
air
686f325825 【类 型】:fix
【原  因】:1地图组件 经纬度显示反了  2概况统计组件 由于now并不实时更新 改用setIterval来更新 总时长
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-06-25 19:51:14 +08:00
air
f7a52217a0 【类 型】:feat
【原  因】:根据学校要求 如站点改为地块管理 商铺改为单位
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-06-25 12:16:44 +08:00
47 changed files with 510 additions and 422 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -3,19 +3,52 @@
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{fill:#D0121B;}
.st1{fill:#B81C22;}
.st2{fill:#18234A;}
.st3{fill:#093561;}
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M0.77,43.3c0.72,1.49,2.15,1.88,5.2,1.01c5.3-1.5,17.65-9.74,21.01-14.31c3.35-4.58-8.3-25.03-10.38-26.72
c-1.77-1.45-4.4-1.5-3.78,1.97c0.61,3.47,5.33,15.1,2.62,20.23c-1.91,3.63-6.18,9.56-11.59,13.97C2.04,40.93,0.16,42.05,0.77,43.3z"
/>
<path class="st1" d="M17.03,3.71c2.79,9.79,5.23,22.18,2.79,26.05c-2.44,3.85-8.38,9.82-14.01,14.59c0.06-0.02,0.11-0.02,0.17-0.04
c5.3-1.5,17.65-9.74,21.01-14.31C30.15,25.66,19.89,7.12,17.03,3.71z"/>
<path class="st2" d="M63.39,13.48c-0.56-1.33-2.99-2.05-6.26-0.61c-5.67,2.5-22.34,11.19-25.44,17.08
c-3.1,5.88,12.69,29.4,15.22,31.14c2.17,1.49,5.32,1.09,4.17-2.95c-1.16-4.04-8.34-18.38-6.04-24.84
c1.63-4.57,9.78-12.51,15.45-16.19C62.83,15.58,64.02,14.96,63.39,13.48z"/>
<path class="st3" d="M38.26,33.46c2.83-6.3,13.8-15.53,21.58-21.35c-0.81,0.08-1.72,0.32-2.71,0.75
c-5.67,2.5-22.34,11.19-25.44,17.08c-2.1,3.99,4.5,16.12,9.75,24.03C38.55,45.71,36.55,37.26,38.26,33.46z"/>
<path class="st0" d="M13,62.2c-3.7,0-7.4,0-11,0c0-16,0-32,0-48C2,14.3,2,14.4,2,14.6c0.7,6.6,7.2,11.3,13.7,9.8
c0.4-0.1,0.8-0.2,1.3-0.4c-0.8-0.9-1.6-1.7-2.3-2.5c-0.1-0.1-0.3-0.1-0.4-0.1c-0.9,0-1.7,0.1-2.6-0.1c-5.3-1-8.1-6.6-5.8-11.5
C8.4,4.5,15.8,3.5,19.5,8c1.5,1.8,2.1,3.9,1.9,6.2c0,0.2,0,0.4,0.1,0.5c0.8,0.8,1.6,1.5,2.5,2.3c0.1-0.2,0.1-0.3,0.2-0.4
c0.5-1.7,0.6-3.4,0.4-5.2c-0.9-5.7-5.9-9.7-11.7-9.5C8.1,2.1,3.9,5.2,2.5,9.7c-0.3,0.8-0.4,1.7-0.6,2.6c0-3.5,0-7,0-10.5
c20,0,40.1,0,60.1,0c0,20.1,0,40.3,0,60.4c-15.8,0-31.5,0-47.3,0c0.1,0,0.3,0,0.4-0.1c1-0.3,2.1-0.4,3.1-0.8
c4.5-1.8,7.2-6.4,6.9-11.2c-0.1-1-0.3-1.9-0.5-2.9c-0.1,0-0.1,0-0.2,0c-0.7,0.6-1.4,1.2-2.1,1.8c-0.4,0.3-0.6,0.7-0.5,1.3
c0.4,4.8-3.6,8.9-8.5,8.7c-4.6-0.2-8-4-7.8-8.6c0.3-4.5,4.3-8.1,8.7-7.6c0.5,0.1,0.9-0.1,1.2-0.5c0.6-0.7,1.2-1.4,1.9-2.2
c-0.1-0.1-0.2-0.1-0.3-0.1c-1.8-0.6-3.6-0.7-5.5-0.3c-5.1,0.9-8.9,5.2-9.3,10.2C2.2,55.3,5.3,60,10.3,61.6
C11.2,61.9,12.1,62,13,62.2z M13.9,11.2c-1.7,0-2.7,1.1-2.6,2.5c0.1,0.9,0.5,1.6,1.1,2.2c1.9,1.9,3.8,3.7,5.6,5.6
c1.9,2.1,3.6,4.3,4.9,6.8c1,2,1.1,4,0.7,6.1c-0.3,1.5-1.1,2.8-2,4c-2.3,3.4-5.1,6.3-8,9.2c-0.6,0.6-1.2,1.1-1.7,1.7
c-0.9,1.2-0.7,2.8,0.4,3.6c0.9,0.7,2.5,0.5,3.4-0.4c1.5-1.5,2.9-3,4.4-4.5c2.3-2.2,4.7-4.2,7.4-5.8c2.1-1.2,4.4-1.7,6.8-1.2
c1.3,0.3,2.5,0.9,3.6,1.6c3.6,2.2,6.6,5.1,9.5,8.1c0.7,0.7,1.3,1.4,2,2c1.2,0.9,2.8,0.7,3.6-0.3c0.7-1,0.6-2.5-0.4-3.4
c-1.6-1.6-3.3-3.2-4.9-4.9c-2.1-2.3-4.1-4.7-5.6-7.4c-1.4-2.7-1.6-5.4-0.3-8.1c0.7-1.4,1.5-2.8,2.5-4c2.3-3.2,5.1-6,8-8.7
c0.4-0.4,0.8-0.9,1-1.4c0.7-1.5-0.1-3.1-1.7-3.3c-1.1-0.2-2,0.2-2.7,1c-1.5,1.5-2.9,3.1-4.5,4.5c-2.3,2.2-4.7,4.2-7.4,5.7
c-2.9,1.6-5.9,1.7-8.9,0.2c-2.5-1.3-4.8-3.1-6.8-5c-1.9-1.8-3.7-3.7-5.6-5.6C15.1,11.5,14.5,11.3,13.9,11.2z M46.9,39.7
c0.8,0.9,1.5,1.7,2.2,2.5c0.1,0.1,0.3,0.1,0.4,0.1c0.7,0,1.3-0.1,2,0c3.2,0.4,6,2.8,6.8,5.9c0.9,3.3-0.3,6.7-3,8.7
c-2.7,1.9-5.6,2.2-8.6,0.7c-2.9-1.5-4.4-4-4.4-7.3c0-0.9-0.2-1.5-0.9-2c-0.6-0.4-1.1-0.9-1.7-1.4C38.2,51.3,39.7,57,44.4,60
c4.7,3,10.7,2.2,14.5-1.8c3.7-3.9,4-10.1,0.8-14.4C56.4,39.3,50.8,38.3,46.9,39.7z M47.1,24.8c4,1.5,9.8,0.5,13.1-4.5
c3-4.5,2.3-11.1-2-14.8C53.7,1.7,47.4,1.7,43,5.7c-3.9,3.6-4.2,9-3,11.9c0.8-0.7,1.5-1.4,2.3-2c0.3-0.2,0.3-0.4,0.3-0.8
c-0.2-1.5,0.1-3,0.7-4.3c2.6-5.3,9.7-6.2,13.6-1.8c2.9,3.4,2.5,8.7-1,11.5c-1.8,1.5-3.9,2-6.2,1.8c-0.1,0-0.4,0-0.4,0.1
C48.5,23.1,47.8,23.9,47.1,24.8z"/>
<path d="M2,12.3c0.2-0.9,0.3-1.8,0.6-2.6c1.4-4.5,5.6-7.6,10.3-7.8c5.7-0.2,10.7,3.8,11.7,9.5c0.3,1.7,0.2,3.5-0.4,5.2
c0,0.1-0.1,0.2-0.2,0.4c-0.9-0.8-1.7-1.5-2.5-2.3c-0.1-0.1-0.1-0.4-0.1-0.5c0.2-2.3-0.4-4.4-1.9-6.2C15.8,3.5,8.4,4.5,6,9.8
c-2.2,4.9,0.6,10.4,5.8,11.5c0.8,0.2,1.7,0.1,2.6,0.1c0.1,0,0.3,0,0.4,0.1c0.8,0.8,1.5,1.6,2.3,2.5c-0.5,0.1-0.9,0.3-1.3,0.4
c-6.5,1.5-13-3.2-13.7-9.8C2,14.4,2,14.3,2,14.2C2,13.6,2,12.9,2,12.3z"/>
<path d="M13,62.2c-0.9-0.2-1.8-0.3-2.7-0.6c-5-1.6-8.1-6.4-7.8-11.7c0.4-5.1,4.2-9.3,9.3-10.2c1.8-0.3,3.7-0.2,5.5,0.3
c0.1,0,0.1,0,0.3,0.1c-0.7,0.7-1.3,1.4-1.9,2.2c-0.3,0.4-0.7,0.5-1.2,0.5c-4.4-0.5-8.5,3.1-8.7,7.6c-0.3,4.6,3.2,8.4,7.8,8.6
c4.8,0.2,8.8-3.8,8.5-8.7c0-0.6,0.1-0.9,0.5-1.3c0.7-0.6,1.4-1.2,2.1-1.8c0.1,0,0.1,0,0.2,0c0.2,1,0.4,1.9,0.5,2.9
c0.4,4.8-2.4,9.4-6.9,11.2c-1,0.4-2.1,0.6-3.1,0.8c-0.1,0-0.3,0.1-0.4,0.1C14.2,62.2,13.6,62.2,13,62.2z"/>
<path d="M13.9,11.2c0.6,0,1.2,0.3,1.8,0.9c1.9,1.9,3.7,3.8,5.6,5.6c2.1,1.9,4.3,3.7,6.8,5c3,1.5,5.9,1.4,8.9-0.2
c2.8-1.5,5.2-3.5,7.4-5.7c1.5-1.5,3-3,4.5-4.5c0.7-0.8,1.6-1.2,2.7-1c1.5,0.3,2.3,1.8,1.7,3.3c-0.2,0.5-0.6,1-1,1.4
c-2.9,2.7-5.7,5.5-8,8.7c-0.9,1.3-1.8,2.6-2.5,4c-1.3,2.7-1.1,5.5,0.3,8.1c1.5,2.8,3.5,5.2,5.6,7.4c1.6,1.7,3.3,3.3,4.9,4.9
c0.9,0.9,1.1,2.5,0.4,3.4c-0.8,1.1-2.4,1.3-3.6,0.3c-0.7-0.6-1.3-1.3-2-2c-2.9-3-5.9-5.9-9.5-8.1c-1.1-0.7-2.3-1.4-3.6-1.6
c-2.4-0.5-4.7,0-6.8,1.2c-2.7,1.6-5.2,3.6-7.4,5.8c-1.5,1.5-3,3-4.4,4.5c-0.9,0.9-2.5,1.1-3.4,0.4c-1.1-0.8-1.3-2.5-0.4-3.6
c0.5-0.6,1.1-1.1,1.7-1.7c2.9-2.8,5.7-5.8,8-9.2c0.8-1.3,1.6-2.6,2-4c0.4-2.1,0.3-4.1-0.7-6.1c-1.3-2.5-3-4.8-4.9-6.8
c-1.8-1.9-3.7-3.8-5.6-5.6c-0.6-0.6-1-1.3-1.1-2.2C11.2,12.3,12.2,11.2,13.9,11.2z M32.4,37.5c2.8,0,5.2-2.3,5.2-5.2
c0-2.8-2.3-5.1-5.1-5.2c-2.9,0-5.2,2.3-5.2,5.2C27.2,35.2,29.6,37.5,32.4,37.5z"/>
<path d="M46.9,39.7c3.9-1.4,9.5-0.5,12.8,4c3.2,4.4,2.9,10.5-0.8,14.4c-3.8,4-9.8,4.8-14.5,1.8c-4.7-3-6.2-8.7-4.6-13.2
c0.6,0.5,1.1,1,1.7,1.4c0.7,0.5,0.9,1.1,0.9,2c-0.1,3.3,1.4,5.8,4.4,7.3c2.9,1.5,5.9,1.3,8.6-0.7c2.7-2,3.9-5.3,3-8.7
c-0.8-3.1-3.6-5.5-6.8-5.9c-0.7-0.1-1.3,0-2,0c-0.1,0-0.3,0-0.4-0.1C48.4,41.5,47.7,40.6,46.9,39.7z"/>
<path d="M47.1,24.8c0.7-0.9,1.5-1.7,2.2-2.5c0.1-0.1,0.3-0.1,0.4-0.1c2.3,0.2,4.4-0.4,6.2-1.8c3.5-2.8,3.9-8.1,1-11.5
c-3.9-4.5-11-3.6-13.6,1.8c-0.7,1.4-0.9,2.8-0.7,4.3c0,0.3,0,0.5-0.3,0.8c-0.8,0.7-1.5,1.3-2.3,2c-1.3-3-1-8.4,3-11.9
c4.4-4,10.7-4,15.2-0.2c4.3,3.7,5,10.3,2,14.8C56.9,25.2,51.1,26.3,47.1,24.8z"/>
<path class="st0" d="M32.4,37.5c-2.8,0-5.1-2.3-5.1-5.1c0-2.9,2.3-5.2,5.2-5.2c2.8,0,5.1,2.3,5.1,5.2C37.5,35.2,35.2,37.5,32.4,37.5
z M29.1,32.3c0,1.8,1.5,3.3,3.3,3.3c1.9,0,3.3-1.4,3.3-3.3c0-1.8-1.5-3.3-3.3-3.3C30.6,29,29.1,30.5,29.1,32.3z"/>
<path d="M29.1,32.3c0-1.8,1.5-3.3,3.3-3.3c1.8,0,3.3,1.5,3.3,3.3c0,1.8-1.5,3.3-3.3,3.3C30.5,35.6,29.1,34.1,29.1,32.3z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,18 +1,18 @@
<template>
<el-breadcrumb separator-class="el-icon-caret-right" class="app-breadcrumb">
<el-breadcrumb-item>
<!-- <router-link to="/">飞机主控</router-link> -->
{{ $route.meta.tapName === "plane" ? "飞机主控" : "小程序后台" }}
</el-breadcrumb-item>
<el-breadcrumb-item v-for="(item, index) in breadcrumb" :key="index">
<!-- <router-link :to="item.path">{{ item.title }}</router-link> -->
<el-breadcrumb-item
v-for="(item, index) in filteredBreadcrumb"
:key="index"
>
{{ item.title }}
</el-breadcrumb-item>
</el-breadcrumb>
</template>
<script>
export default {
name: 'Breadcrumb',
data () {
@ -29,7 +29,9 @@ export default {
*/
routes () {
return this.$router.options.routes.filter(
item => item.meta.hidden !== true && item.meta.roles.indexOf(this.$store.state.user.power.trim()) >= 0
item =>
item.meta.hidden !== true &&
item.meta.roles.indexOf(this.$store.state.user.power.trim()) >= 0
)
},
/**
@ -37,6 +39,16 @@ export default {
*/
presentPath () {
return this.$route.path
},
/**
* @description: 过滤重复的面包屑
*/
filteredBreadcrumb () {
const list = this.breadcrumb
if (list.length <= 1) return list
const last = list[list.length - 1]
const isDuplicate = list.slice(0, -1).some(item => item.title === last.title)
return isDuplicate ? [last] : list
}
},
watch: {
@ -79,7 +91,6 @@ export default {
display: block !important;
}
/* 当屏幕宽度小于等于480px时 */
@media (max-width: 480px) {
.app-breadcrumb {
display: none !important;

View File

@ -121,85 +121,8 @@
<div class="flex column mr mac tabContainer p-l-10 p-r-10">
<!-- tab控件组 内容组 -->
<div class="tabContent" :class="{ 'active': activeIndex !== null }">
<!-- 订单任务 -->
<div v-if="activeIndex === 0" class="tabContentBox">
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-dingdanguanli f-s-22 m-r-5"></i>
<span>送餐任务</span>
</div>
<!-- 内容 -->
<el-form label-position="left" ref="questForm" :model="questForm" label-width="80px">
<el-form-item label="订单选择" v-if="!executeOrder">
<el-select v-model="questForm.id" :filterable="isMobile" placeholder="请选择,也可输入搜索"
:disabled="executeOrder">
<el-option v-for="item in questList" :key="item.id" :label="item.id" :value="item.id"
:class="isWaring(item) ? 'danger-color' : ''">
<span class="l">{{ item.id }}</span>
<span class="l m-l-5">{{ item.receiver }}</span>
<span class="l m-l-5">{{ item.receive_site_name }}</span>
</el-option>
</el-select>
</el-form-item>
<template v-else>
<el-form-item v-if="waringTags.length > 0" label="提示">
<el-tag v-for="(tag, index) in waringTags" :key="index" class="m-r-5" type="warning">{{ tag }}</el-tag>
</el-form-item>
<el-form-item label="订单ID">
{{ executeOrder.id }}
</el-form-item>
<el-form-item label="收货站点">
{{ executeOrder.receive_site_name }}
</el-form-item>
<el-form-item label="联系电话">
{{ executeOrder.tel }}
</el-form-item>
</template>
<el-form-item label="飞机操作">
<el-button-group>
<!-- <el-button size="mini" class="f-s-14" v-if="Number(plane.planeState.questState) === 1" type="primary"
icon="f-s-14 iconfont icon-chakanzhihangrizhi" @click="checkQuest">
<font class="m-l-5">上传航点</font>
</el-button> -->
<el-button size="mini" class="f-s-14"
v-if="Number(plane.planeState.questState) === 1 || Number(plane.planeState.questState) === 4"
type="warning" icon="f-s-14 iconfont icon-chakanzhihangrizhi" @click="checkQuest">
<font class="m-l-5">准备任务</font>
</el-button>
<el-button size="mini" class="f-s-14" v-else-if="Number(plane.planeState.questState) === 2"
key="wirteBut" type="info" :loading="true" disabled>
<font class="m-l-5">航点写入中···</font>
</el-button>
<el-button size="mini" class="f-s-14" v-else-if="Number(plane.planeState.questState) === 12" type="info"
:loading="true" disabled>
<font class="m-l-5">解锁中...</font>
</el-button>
<el-button size="mini" class="f-s-14" v-else-if="Number(plane.planeState.questState) === 20"
type="success" icon="f-s-14 iconfont icon-yangshi_icon_tongyong_departure"
@click="publishFun('{setQuestState:{bit:5,state:1}}'); speakText('执行送餐任务')">
<font class="m-l-5">执行任务</font>
</el-button>
<el-button size="mini" class="f-s-14" v-else-if="isShipped" type="info" :loading="true" disabled>
<font class="m-l-5">执行任务中...</font>
</el-button>
</el-button-group>
</el-form-item>
<el-form-item label="任务确认">
<el-button-group>
<el-button size="mini" class="f-s-14" type="danger" icon="iconfont icon-cuowu" key="celBUt"
@click="reQuest">
<font class="m-l-5">取消</font>
</el-button>
<el-button size="mini" class="f-s-14" type="success" icon="iconfont icon-qiandai" key="bingBut"
@click="overQuest">
<font class="m-l-5">已送达</font>
</el-button>
</el-button-group>
</el-form-item>
</el-form>
</div>
<!-- 飞机操作 -->
<div v-else-if="activeIndex === 1" class="tabContentBox">
<div v-if="activeIndex === 0" class="tabContentBox">
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-youxishoubing f-s-22 m-r-5"></i>
@ -226,94 +149,28 @@
<i class="iconfont icon-fengzheng1 f-s-24"></i>
<div class="m-t-5">悬停</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{autoMode:1}'); speakText('继续执行航线')">
@click="confirmation('确认执行自动航线?请确保飞行区域安全且航线已设置。', '自动航线', '{autoMode:1}'); speakText('执行自动航线')">
<i class="iconfont icon-duandianxufei f-s-24"></i>
<div class="m-t-5">复航</div>
<div class="m-t-5">自动</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{rtlMode:1}'); speakText('返航')">
@click="confirmation('确认返航?请确保返航路径无障碍。', '返航操作', '{rtlMode:1}'); speakText('返航')">
<i class="iconfont icon-yijianfanhang f-s-24"></i>
<div class="m-t-5">返航</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{landMode:1}'); speakText('降落')">
@click="confirmation('确认降落?请注意着陆区域安全。', '降落操作', '{landMode:1}'); speakText('降落')">
<i class="iconfont icon-yangshi_icon_tongyong_arriving f-s-24"></i>
<div class="m-t-5">降落</div>
</el-button>
</div>
</div>
<!-- 附加模组操作 -->
<div v-else-if="activeIndex === 2" class="tabContentBox">
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-mianxingdiaogou f-s-22 m-r-5"></i>
<span>挂载仓控制</span>
</div>
<div class="butIconBox m-b-15 gap10 flex">
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{hookConteroller:4}'); pesoIsZero(); speakText('重置重量传感器')">
<i class="iconfont icon-zhongliang f-s-24"></i>
<div class="m-t-5">归零</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{hookConteroller:0}'); speakText('收钩')">
<i class="iconfont icon-xiangshang f-s-24"></i>
<div class="m-t-5">收钩</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{hookConteroller:3}'); speakText('继续放钩')">
<i class="iconfont icon-qiyong f-s-24"></i>
<div class="m-t-5">继续</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{hookConteroller:2}'); speakText('暂停放钩')">
<i class="iconfont icon-xuanting-zanting f-s-24"></i>
<div class="m-t-5">暂停</div>
</el-button>
</div>
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-shipinjiankong f-s-22 m-r-5"></i>
<span>摄像头控制</span>
</div>
<div class="butIconBox m-b-15 gap10 flex">
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{cameraController:{item:0,val:0}}'); speakText('摄像头一键回中')">
<i class="iconfont icon-icon-rotation f-s-24"></i>
<div class="m-t-5">回中</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{cameraController:{item:2,val:0,yaw:0,pitch:-50}}'); speakText('摄像头一键俯瞰')">
<i class="iconfont icon-down f-s-24"></i>
<div class="m-t-5">俯瞰</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="dialogVisible = true; dialogTitle = '摄像头控制'; dialogItem = 'cameraBox'; speakText('手动调整摄像头')">
<i class="iconfont icon-chukong f-s-24"></i>
<div class="m-t-5">手动</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="dialogVisible = true; dialogTitle = '摄像头控制'; dialogItem = 'cameraBox'; speakText('调整镜头焦距')">
<i class="iconfont icon-fangda f-s-24"></i>
<div class="m-t-5">焦距</div>
</el-button>
</div>
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-tongzhi f-s-22 m-r-5"></i>
<span>喇叭控制</span>
</div>
<div class="butIconBox gap10 flex">
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="dialogVisible = true; dialogTitle = '喊话参数'; dialogItem = 'talkBox';">
<i class="iconfont icon-icon-test f-s-24"></i>
<div class="m-t-5">喊话</div>
</el-button>
</div>
</div>
<!-- 飞机调试 -->
<div v-else-if="activeIndex === 3" class="tabContentBox">
<div v-else-if="activeIndex === 1" class="tabContentBox">
<!-- 标题 -->
<div class="clearB m-b-15 fb f-s-16 contentTit">
<i class="iconfont icon-banshou_Line f-s-22 m-r-5"></i>
@ -367,9 +224,7 @@ export default {
scaleValue: 50, //
takeoffValue: 2, //
controlItems: [//
{ title: '任务', icon: 'icon-songcanfuwu', voice: '设置送餐任务' },
{ title: '控制', icon: 'icon-youxishoubing', voice: '控制飞机' },
{ title: '扩展', icon: 'icon-linghuokuozhan', voice: '控制扩展组件' },
{ title: '调试', icon: 'icon-banshou_Line', voice: '调试飞机' }
],
activeIndex: null, //
@ -447,7 +302,7 @@ export default {
return this.$store.state.routeList
},
/**
* @description: 获取站点列表
* @description: 获取地块列表
*/
siteList () {
return this.$store.state.siteList
@ -645,9 +500,9 @@ export default {
return
}
//
//
if (checkOrder.bind_route === null) {
this.$message.error('此站点,未绑定任务航点')
this.$message.error('此地块,未绑定任务航点')
return
}
@ -682,12 +537,12 @@ export default {
}
})
//
//
const runningCheck = weightCheck.then(() => {
return new Promise((resolve, reject) => {
if ((checkOrder.runing ?? '').split(',').some(item => item !== '')) {
//
this.$confirm('此订单的目标站点,已经有飞机正在执行任务。请注意安全!', '检测订单', {
//
this.$confirm('此订单的目标地块,已经有飞机正在执行任务。请注意安全!', '检测订单', {
confirmButtonText: '继续',
cancelButtonText: '放弃',
type: 'warning'
@ -758,7 +613,7 @@ export default {
}
},
/**
* @description: 选择订单的 执行订单任务 ps:改变订单状态 站点runing状态 上传航线
* @description: 选择订单的 执行订单任务 ps:改变订单状态 地块runing状态 上传航线
*/
async runQuest () {
/* 插入日志 */
@ -767,7 +622,7 @@ export default {
let routeData // 线
let newRuning // running
try {
/* 站点正在执行任务runing 注册 */
/* 地块正在执行任务runing 注册 */
const runing = (this.currentOrder.runing ?? '').split(',')
let foundEmpty = false
let matchingIndex // 使线
@ -785,7 +640,7 @@ export default {
if (!foundEmpty) {
this.$message({
type: 'warning',
message: '此站点所有航线均被占用,等航线空闲再试!'
message: '此地块所有航线均被占用,等航线空闲再试!'
})
return // 退
}
@ -806,7 +661,7 @@ export default {
this.$message.error('操作失败,航线异常')
return
}
//
//
const res = await lockSite({
site_id: this.currentOrder.receive_site_id,
shop_id: this.plane.shop_id,
@ -879,7 +734,7 @@ export default {
}
//
const newRuning = runingArray.join(',')
//
//
const res = await lockSite({
site_id: this.executeOrder.receive_site_id,
shop_id: this.plane.shop_id,
@ -925,7 +780,7 @@ export default {
//
const newRuning = runingArray.join(',')
//
//
const res = await lockSite({
site_id: this.executeOrder.receive_site_id,
shop_id: this.plane.shop_id,
@ -957,21 +812,21 @@ export default {
if (index !== -1) {
found = true
//
if (item.bind_route !== null) { //
if (item.bind_route !== null) { //
bindRoute = (item.bind_route ?? '').split(',')
this.$store.dispatch('fetchRouteList').then(res => { //
routeData = res.find(element => element.id === bindRoute[index]).route_data
this.$emit('makeRoute', JSON.parse(routeData))
})
} else {
this.$message.error('此站点,未绑定任务航点')
this.$message.error('此地块,未绑定任务航点')
}
return true // 退
}
return false //
})
if (!found) {
this.$message.error('未找到匹配的站点')
this.$message.error('未找到匹配的地块')
}
},
/**
@ -991,7 +846,7 @@ export default {
const aIndex = this.waringTags.indexOf('已申请退款')
const bIndex = this.waringTags.indexOf('已退款')
const cIndex = this.waringTags.indexOf('超出飞机载重')
const dIndex = this.waringTags.indexOf('站点多架执行')
const dIndex = this.waringTags.indexOf('地块多架执行')
// 退
if (order.refund_status === '申请中') {
if (aIndex === -1) {
@ -1019,11 +874,11 @@ export default {
this.waringTags.splice(cIndex, 1)
}
}
//
//
const splitArray = order.runing.split(',')// s
const nonEmptyArray = splitArray.filter(item => item.trim() !== '')//
if (nonEmptyArray.length > 1) { //
this.waringTags.push('站点多架执行')
this.waringTags.push('地块多架执行')
} else {
if (dIndex !== -1) {
this.waringTags.splice(dIndex, 1)

View File

@ -1043,8 +1043,8 @@ export default {
<p><strong>电压:</strong> ${stateObj.voltagBattery ?? '--'} V</p>
<p><strong>电流:</strong> ${stateObj.currentBattery ?? '--'} A</p>
<p><strong>高度:</strong> ${lastPos[2] ?? '--'} </p>
<p><strong>:</strong> ${lastPos[0] ?? '--'}°</p>
<p><strong>:</strong> ${lastPos[1] ?? '--'}°</p>
<p><strong>:</strong> ${lastPos[0] ?? '--'}°</p>
<p><strong>:</strong> ${lastPos[1] ?? '--'}°</p>
<p><strong>对地速度:</strong> ${stateObj.groundSpeed ?? '--'} /</p>
`

View File

@ -57,7 +57,7 @@
</div>
</div>
<!-- 飞机载重 钩子状态 -->
<div class="flex">
<!-- <div class="flex">
<div v-if="loadweight" class="plane-mode p-l-5 p-r-5 mc mac">
<font class="plane-mode-text" v-if="hookstatus || loadweight">
{{ hookstatus || '' }} {{ loadweight ? loadweight + '克' : '' }}
@ -65,7 +65,7 @@
</div>
<div class="tag flex mac mc iconfont icon-mianxingdiaogou">
</div>
</div>
</div> -->
</div>
</template>

View File

@ -47,7 +47,7 @@
<el-descriptions-item label="取餐号">{{ item.food_sn }}</el-descriptions-item>
<el-descriptions-item label="收货人">{{ item.receiver }}</el-descriptions-item>
<el-descriptions-item label="手机号">{{ item.tel }}</el-descriptions-item>
<el-descriptions-item label="收货站点">{{ item.receive_site_name }}</el-descriptions-item>
<el-descriptions-item label="收货地块">{{ item.receive_site_name }}</el-descriptions-item>
<el-descriptions-item label="总重量">{{ item.total_weight }}</el-descriptions-item>
<el-descriptions-item label="总价">{{ item.total_price }}</el-descriptions-item>
<el-descriptions-item label="货品总数">{{ item.total_num }}</el-descriptions-item>
@ -139,7 +139,7 @@ export default {
refundApply_price: null, // 退
refundPrice: null, // 退 ps: 退
refundOrder_sn: null, // 退
refundShop_id: null, // 退id
refundShop_id: null, // 退id
refundType: null // 退
}
},
@ -225,7 +225,7 @@ export default {
// this.btPrint(con, '31', '0')
// con = ''
// con += '' + this.list[index].order_sn + '\n'
// con += '' + this.list[index].receive_site_name + '\n'
// con += '' + this.list[index].receive_site_name + '\n'
// con += '' + this.parseTime(this.list[index].addtime) + '\n\n'
// if (this.list[index].remark !== '') {
// con += '------------------------\n'

View File

@ -26,7 +26,7 @@ export default {
name: 'SelectionPath',
props: {
value: String, // prop
allSel: { //
allSel: { //
type: Boolean,
default: false
},
@ -89,7 +89,7 @@ export default {
})
this.updatePath()
},
shop_id () { // selection selection"" ""
shop_id () { // selection selection"" ""
if (this.defaultPath !== '') {
this.form.path = this.defaultPath
}

View File

@ -1,9 +1,9 @@
<template>
<el-select v-model="form.shop_id" :filterable="isMobile" :placeholder="allSel === true ? '所有商铺' : '请选择,也可输入搜索'"
<el-select v-model="form.shop_id" :filterable="isMobile" :placeholder="allSel === true ? '所有单位' : '请选择,也可输入搜索'"
@input="updateShopId">
<el-option v-if="allSel === true && shopList.length > 1" label="所有商铺" value="">
<el-option v-if="allSel === true && shopList.length > 1" label="所有单位" value="">
<el-avatar class="vm f-s-12" shape="square" :size="25"> all </el-avatar>
<span class="rspan">所有商铺</span>
<span class="rspan">所有单位</span>
</el-option>
<el-option v-for="item in shopList" :key="item.id" :label="item.name" :value="item.shop_id">
<el-avatar v-if="item.logo != ''" class="vm" shape="square" :size="25" :src="item.logo[0]">
@ -19,7 +19,7 @@ export default {
name: 'SelectionShopId',
props: {
value: String, // prop
allSel: { //
allSel: { //
type: Boolean,
default: false
}
@ -32,7 +32,7 @@ export default {
}
},
computed: {
//
//
shopList () {
return this.$store.state.shopList
},

View File

@ -39,7 +39,7 @@ export default {
value (val) {
this.updateValue(val)
},
// "" sku穿
// "" sku穿
shop_id () {
this.value = []
}

View File

@ -44,6 +44,8 @@ export default {
name: 'Statistics',
data () {
return {
now: Math.floor(Date.now() / 1000), //
timer: null
}
},
props: {
@ -52,8 +54,6 @@ export default {
deep: true
}
},
components: {
},
computed: {
totalCount () {
return Object.keys(this.planes || {}).length
@ -62,13 +62,12 @@ export default {
return Object.values(this.planes || {}).filter(p => p.planeState?.online).length
},
totalWorkingDuration () {
// - startTime
const now = Math.floor(Date.now() / 1000)
// 使 this.now
return Object.values(this.planes || {}).reduce((total, p) => {
const s = p.planeState?.flyDataSave?.startTime
const isUnlock = p.planeState?.isUnlock
if (isUnlock && s) {
return total + (now - s)
return total + (this.now - s)
}
return total
}, 0)
@ -101,19 +100,18 @@ export default {
const s = (sec % 60).toString().padStart(2, '0')
return `${h}:${m}:${s}`
}
},
watch: {
},
methods: {
},
created () {
// now computed
this.timer = setInterval(() => {
this.now = Math.floor(Date.now() / 1000)
}, 1000)
},
destroyed () {
beforeDestroy () {
clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
@ -154,7 +152,8 @@ export default {
.plane-mode-text {
display: inline-block;
white-space: nowrap; /* 防止内容换行 */
white-space: nowrap;
/* 防止内容换行 */
}
.item {

View File

@ -50,12 +50,12 @@
<div class="m-t-5">悬停</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{rtlMode:1}'); speakText('返航')">
@click="confirmation('确认返航全部飞机?请确保返航路径无障碍。', '返航操作', '{rtlMode:1}'); speakText('返航')">
<i class="iconfont icon-yijianfanhang f-s-24"></i>
<div class="m-t-5">返航</div>
</el-button>
<el-button size="medium" type="primary" class="flex1 butIcon"
@click="publishFun('{landMode:1}'); speakText('降落')">
@click="confirmation('确认降落全部飞机?请确保降落区域安全。', '降落操作', '{landMode:1}'); speakText('降落')">
<i class="iconfont icon-yangshi_icon_tongyong_arriving f-s-24"></i>
<div class="m-t-5">降落</div>
</el-button>

View File

@ -74,7 +74,7 @@ const routes = [
path: '/model/index',
component: () => import('@/views/layout/components/main/model/index'),
meta: {
title: '机型列表',
title: '机型管理',
icon: 'el-icon-tickets',
roles: ['master', 'admin'],
tapName: 'plane'
@ -119,7 +119,7 @@ const routes = [
path: '/register/index',
component: () => import('@/views/layout/components/main/register/index'),
meta: {
title: '飞机列表',
title: '飞机管理',
icon: 'el-icon-tickets',
roles: ['master', 'admin'],
tapName: 'plane'
@ -212,7 +212,8 @@ const routes = [
title: '航线管理',
icon: 'iconfont icon-feihangluxian',
roles: ['master', 'admin'],
tapName: 'plane'
tapName: 'plane',
hidden: true
},
children: [
{
@ -222,7 +223,8 @@ const routes = [
title: '航线列表',
icon: 'iconfont icon-a-05-1-1jihuazhihanggenzong',
roles: ['master', 'admin'],
tapName: 'plane'
tapName: 'plane',
hidden: true
}
},
{
@ -232,7 +234,8 @@ const routes = [
title: '航线设计',
icon: 'iconfont icon-huizhi',
roles: ['master', 'admin'],
tapName: 'plane'
tapName: 'plane',
hidden: true
}
},
{
@ -253,7 +256,7 @@ const routes = [
component: Layout,
redirect: '/site/index',
meta: {
title: '站点管理',
title: '地块管理',
icon: 'iconfont icon-zhandianguanli',
roles: ['master', 'admin'],
tapName: 'plane'
@ -263,7 +266,7 @@ const routes = [
path: '/site/index',
component: () => import('@/views/layout/components/main/site/index'),
meta: {
title: '站点列表',
title: '地块管理',
icon: 'el-icon-tickets',
roles: ['master', 'admin'],
tapName: 'plane'
@ -273,7 +276,7 @@ const routes = [
path: '/site/add',
component: () => import('@/views/layout/components/main/site/add'),
meta: {
title: '站点添加',
title: '地块添加',
icon: 'el-icon-plus',
roles: ['master', 'admin'],
tapName: 'plane',
@ -284,7 +287,7 @@ const routes = [
path: '/site/edit/:id',
component: () => import('@/views/layout/components/main/site/add'),
meta: {
title: '站点更新',
title: '地块更新',
icon: 'el-icon-edit',
roles: ['master', 'admin'],
tapName: 'plane',
@ -298,7 +301,7 @@ const routes = [
component: Layout,
redirect: '/planes/index',
meta: {
title: '无人机',
title: '作业管理',
icon: 'iconfont icon-wurenji',
roles: ['master', 'admin'],
tapName: 'plane'
@ -331,9 +334,9 @@ const routes = [
component: Layout,
redirect: '/shop/edit',
meta: {
title: '商铺管理',
title: '单位管理',
icon: 'iconfont icon-a-shanghu_choose2x1',
roles: ['master', 'admin'],
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
},
children: [
@ -341,9 +344,9 @@ const routes = [
path: '/shop/edit',
component: () => import('@/views/layout/components/main/shop/add'),
meta: {
title: '商铺设置',
title: '单位设置',
icon: 'iconfont icon-dianpuguanli',
roles: ['master', 'admin'],
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
}
},
@ -351,7 +354,7 @@ const routes = [
path: '/shop/add',
component: () => import('@/views/layout/components/main/shop/add'),
meta: {
title: '商铺添加',
title: '单位添加',
icon: 'iconfont icon-check',
roles: ['master'],
tapName: 'admin'
@ -374,7 +377,7 @@ const routes = [
path: '/admin/index',
component: () => import('@/views/layout/components/main/admin/index'),
meta: {
title: '账户列表',
title: '账户管理',
icon: 'iconfont icon-yonghuguanli',
roles: ['master', 'admin'],
tapName: 'admin'
@ -397,7 +400,7 @@ const routes = [
meta: {
title: '账户编辑',
icon: 'iconfont icon-huizhi',
roles: ['master', 'admin'],
roles: ['master', 'admin', 'editor'],
tapName: 'admin',
hidden: true
}
@ -445,7 +448,8 @@ const routes = [
title: '分类管理',
icon: 'iconfont icon-a-ziliaocaozuoxianshifenleishu',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
},
children: [
{
@ -455,7 +459,8 @@ const routes = [
title: '分类管理',
icon: 'iconfont icon-a-ziliaocaozuoxianshifenleishu',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
}
]
@ -468,7 +473,8 @@ const routes = [
title: '商品管理',
icon: 'iconfont icon-chanpin',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
},
children: [
{
@ -478,7 +484,8 @@ const routes = [
title: 'SPU列表',
icon: 'iconfont icon-chanpinliebiao-02',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
},
{
@ -510,7 +517,8 @@ const routes = [
title: 'SKU列表',
icon: 'iconfont icon-sku',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
},
{
@ -545,7 +553,8 @@ const routes = [
title: '广告管理',
icon: 'iconfont icon-guanggao',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
},
children: [
{
@ -555,7 +564,8 @@ const routes = [
title: 'banner设置',
icon: 'iconfont icon-banner',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
},
{
@ -565,7 +575,8 @@ const routes = [
title: '滚动通知设置',
icon: 'iconfont icon-m-gundongwenzi',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
}
]
@ -578,7 +589,8 @@ const routes = [
title: '订单与统计',
icon: 'iconfont icon-dingdantongji',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
},
children: [
{
@ -588,7 +600,8 @@ const routes = [
title: '订单管理',
icon: 'iconfont icon-a-SalesOrderManagement',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
tapName: 'admin',
hidden: true
}
},
{
@ -609,6 +622,30 @@ const routes = [
title: '销售统计',
icon: 'iconfont icon-data-view',
roles: ['master', 'admin', 'editor'],
tapName: 'admin',
hidden: true
}
}
]
},
{
path: '/download',
component: Layout,
redirect: '/download/index',
meta: {
title: '软件下载',
icon: 'el-icon-download',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
},
children: [
{
path: '/download/index',
component: () => import('@/views/layout/components/main/download/index'),
meta: {
title: '软件下载',
icon: 'el-icon-download',
roles: ['master', 'admin', 'editor'],
tapName: 'admin'
}
}

View File

@ -3,7 +3,7 @@ const baseURL = host + '/flycube.php'
const listPath = host + '/Data/UploadFiles/category/'// 分类列表图标
const spuPath = host + '/Data/UploadFiles/spu/'// spu图
const skuPath = host + '/Data/UploadFiles/sku/' // sku图
const logoPath = host + '/Data/UploadFiles/logo/' // 商铺图标
const logoPath = host + '/Data/UploadFiles/logo/' // 单位图标
const photoPath = host + '/Data/UploadFiles/photo/'// 管理员图标
const qrPath = host + '/Data/UploadFiles/qr/' // 菊花码 路径
const tempPath = host + '/Data/UploadFiles/temp/' // 临时图片路径
@ -12,7 +12,7 @@ export default {
/**
* @description: 全局title
*/
title: '送餐系统',
title: '物流系统',
/**
* @description: api服务器
@ -21,7 +21,7 @@ export default {
* 分类图标 路径
* spu图 路径
* sku图 路径
* 商铺图标 路径
* 单位图标 路径
* 管理员头像 路径
* 菊花码图片 路径
* 临时图片 路径

View File

@ -13,11 +13,11 @@ Vue.use(Vuex)
const store = new Vuex.Store({
state: {
shopList: [], // 商铺列表
shopList: [], // 单位列表
adminList: [], // 管理员列表
airList: [], // 所有飞机列表
planeClassList: [], // 机型列表
siteList: [], // 站点列表
siteList: [], // 地块列表
routeList: [], // 航线列表
noflyData: [[], [], []], // [0]禁飞区数据 [1]限制飞区 [2]限飞区高度
categoryList: [], // 分类列表(小程序)
@ -46,7 +46,7 @@ const store = new Vuex.Store({
}
},
/**
* @description: 设置商铺列表
* @description: 设置单位列表
*/
setShopList (state, list) {
state.shopList = list
@ -73,7 +73,7 @@ const store = new Vuex.Store({
}
},
/**
* @description: 设置站点列表
* @description: 设置地块列表
*/
setSiteList (state, list) {
state.siteList = list
@ -179,7 +179,7 @@ const store = new Vuex.Store({
},
actions: {
/**
* @description: 获取商铺列表
* @description: 获取单位列表
*/
async fetchShopList ({ commit }) {
const res = await api.get('getShopList', 'Admin')
@ -199,8 +199,8 @@ const store = new Vuex.Store({
}
},
/**
* @description: 添加商铺
* @param {*} 商铺信息表单
* @description: 添加单位
* @param {*} 单位信息表单
* @return {*} 服务器返回值
*/
async fetchAddShop ({ dispatch }, form) {
@ -222,7 +222,7 @@ const store = new Vuex.Store({
params.append('closeing_time', form.closeing_time)
const res = await api.post('addShop', params, 'Admin')
if (res.data.status === 1) {
await dispatch('fetchShopList')// 刷新商铺列表
await dispatch('fetchShopList')// 刷新单位列表
Message.success(res.data.msg)
} else {
Message.error(res.data.msg)
@ -230,8 +230,8 @@ const store = new Vuex.Store({
return res
},
/**
* @description: 更新管商铺信息
* @param {*} 商铺信息表单
* @description: 更新管单位信息
* @param {*} 单位信息表单
* @return {*} 服务器返回值
*/
async fetchSaveShop ({ dispatch }, form) {
@ -255,7 +255,7 @@ const store = new Vuex.Store({
params.append('closeing_time', form.closeing_time)
const res = await api.post('saveShop', params, 'Admin')
if (res.data.status === 1) {
await dispatch('fetchShopList')// 刷新商铺列表
await dispatch('fetchShopList')// 刷新单位列表
Message.success(res.data.msg)
} else {
Message.error(res.data.msg)
@ -529,6 +529,7 @@ const store = new Vuex.Store({
params.append('class_name', form.class_name)
params.append('wheelbase', form.wheelbase)
params.append('category', form.category)
params.append('weight_max', form.weight_max)
params.append('describe', form.describe)
const res = await api.post('savePlaneClass', params)
if (res.data.status === 1) {
@ -569,7 +570,7 @@ const store = new Vuex.Store({
}
},
/**
* @description: 获取站点列表
* @description: 获取地块列表
*/
async fetchSiteList ({ commit }) {
const res = await api.get('getSiteList')
@ -584,13 +585,14 @@ const store = new Vuex.Store({
}
},
/**
* @description: 创建新站点
* @param {*} form 表单.站点信息
* @description: 创建新地块
* @param {*} form 表单.地块信息
* @return {*} 服务器返回信息
*/
async fetchAddSite ({ dispatch }, form) {
const params = new URLSearchParams()
params.append('shop_id', form.shop_id)
params.append('photo', form.photo)
params.append('sitename', form.sitename)
params.append('desc', form.desc)
params.append('upFile', form.upFile)
@ -598,7 +600,7 @@ const store = new Vuex.Store({
params.append('bindroute', form.bindroute)
const res = await api.post('addSite', params)
if (res.data.status === 1) {
await dispatch('fetchSiteList')// 刷新站点列表
await dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchPaidOrderList')// 刷订单点列表
Message.success(res.data.msg)
@ -608,13 +610,14 @@ const store = new Vuex.Store({
return res
},
/**
* @description: 创建新站点
* @param {*} form 表单.站点信息
* @description: 创建新地块
* @param {*} form 表单.地块信息
* @return {*} 服务器返回信息
*/
async fetchSaveSite ({ dispatch }, form) {
const params = new URLSearchParams()
params.append('id', form.id)
params.append('photo', form.photo)
params.append('shop_id', form.shop_id)
params.append('sitename', form.sitename)
params.append('desc', form.desc)
@ -623,7 +626,7 @@ const store = new Vuex.Store({
params.append('bindroute', form.bindroute)
const res = await api.post('saveSite', params)
if (res.data.status === 1) {
await dispatch('fetchSiteList')// 刷新站点列表
await dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchPaidOrderList')// 刷订单点列表
Message.success(res.data.msg)
@ -633,8 +636,8 @@ const store = new Vuex.Store({
return res
},
/**
* @description: 删除指定序号站点
* @param {*} idArray 站点序号数组
* @description: 删除指定序号地块
* @param {*} idArray 地块序号数组
*/
fetchDelSite ({ dispatch }, idArr) {
if (idArr.length === 0) {
@ -650,7 +653,7 @@ const store = new Vuex.Store({
api.post('deleteSite', params).then(res => {
if (res.data.status === 1) {
Message.success(res.data.msg)
dispatch('fetchSiteList')// 刷新站点列表
dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchPaidOrderList')// 刷订单点列表
} else {
@ -689,7 +692,7 @@ const store = new Vuex.Store({
const res = await api.post('addRoute', params)
if (res.data.status === 1) {
await dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchSiteList')// 刷新站点列表
dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchPaidOrderList')// 刷订单点列表
Message.success(res.data.msg)
} else {
@ -712,7 +715,7 @@ const store = new Vuex.Store({
const res = await api.post('saveRoute', params)
if (res.data.status === 1) {
await dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchSiteList')// 刷新站点列表
dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchPaidOrderList')// 刷订单点列表
Message.success(res.data.msg)
} else {
@ -739,7 +742,7 @@ const store = new Vuex.Store({
if (res.data.status === 1) {
Message.success(res.data.msg)
dispatch('fetchRouteList')// 刷新航线列表
dispatch('fetchSiteList')// 刷新站点列表
dispatch('fetchSiteList')// 刷新地块列表
dispatch('fetchPaidOrderList')// 刷订单点列表
} else {
Message.error(res.data.msg)
@ -752,7 +755,7 @@ const store = new Vuex.Store({
},
/**
* @description: 获取禁飞区数据
* @param {str} shopId 需要传shopId总管理员调用其他商铺禁飞区
* @param {str} shopId 需要传shopId总管理员调用其他单位禁飞区
*/
async fetchNoflyData ({ commit }, shopId) {
const params = new FormData()
@ -804,7 +807,7 @@ const store = new Vuex.Store({
params.append('upFile', form.upFile)
const res = await api.post('addCategory', params, 'Admin')
if (res.data.status === 1) {
await dispatch('fetchCategoryList')// 刷新商铺列表
await dispatch('fetchCategoryList')// 刷新单位列表
Message.success(res.data.msg)
} else {
Message.error(res.data.msg)
@ -828,7 +831,7 @@ const store = new Vuex.Store({
params.append('oldFile', form.oldFile)
const res = await api.post('saveCategory', params, 'Admin')
if (res.data.status === 1) {
await dispatch('fetchCategoryList')// 刷新商铺列表
await dispatch('fetchCategoryList')// 刷新单位列表
Message.success(res.data.msg)
} else {
Message.error(res.data.msg)

View File

@ -13,7 +13,8 @@ const defaultModuleVisibilityMap = {
category: true,
broadcast: true,
order: true,
nofly: true
nofly: true,
download: true
}
// 从 localStorage 读取已有配置,合并覆盖默认配置
@ -120,7 +121,7 @@ const getters = {
// 获取订单页面搜索条件
getOrderSerch (state) {
const defaultValues = {
shop_id: localStorage.getItem('shop_id'), // 搜索条件 商铺id
shop_id: localStorage.getItem('shop_id'), // 搜索条件 单位id
start_time: Math.floor(new Date(new Date().setHours(0, 0, 0, 0)).getTime() / 1000), // 搜索条件 起始时间 默认为今天凌晨0点
end_time: Math.floor(new Date(new Date().setHours(23, 59, 59, 999)).getTime() / 1000), // 搜索条件 结束时间 默认为今天23点59分59秒
main_status: [], // 搜索条件 主状态

View File

@ -6,6 +6,7 @@ export default {
namespaced: true,
state: {
token: null,
id: null,
name: null,
uname: null,
photo: null,
@ -19,6 +20,7 @@ export default {
if (state.token == null) {
if (localStorage.getItem('token') != null) {
state.token = localStorage.getItem('token')
state.id = localStorage.getItem('id')
state.name = localStorage.getItem('name')
state.uname = localStorage.getItem('uname')
state.photo = localStorage.getItem('photo')
@ -31,6 +33,7 @@ export default {
// 清除用户信息
destroyUser (state) {
state.token = null
state.id = null
state.name = null
state.uname = null
state.photo = null
@ -57,6 +60,7 @@ export default {
res => {
if (res.data.status === 1) {
localStorage.setItem('token', res.data.token)
localStorage.setItem('id', res.data.adminInfo.id)
localStorage.setItem('name', res.data.adminInfo.name)
localStorage.setItem('uname', res.data.adminInfo.uname)
localStorage.setItem('photo', res.data.adminInfo.photo)

View File

@ -20,8 +20,8 @@ export async function apiCrosFrequency (params) {
return res
}
/**
* @description: 锁定站点 相关操作 同步操作订单表 和站点表接口
* @param {*} form 表单.站点信息
* @description: 锁定地块 相关操作 同步操作订单表 和地块表接口
* @param {*} form 表单.地块信息
* @return {*} 服务器返回信息
*/
export async function lockSite (form) {
@ -34,7 +34,7 @@ export async function lockSite (form) {
params.append('by_plane_id', form.by_plane_id)
const res = await api.post('lockSite', params)
if (res.data.status === 1) {
await store.dispatch('fetchSiteList')// 刷新站点列表
await store.dispatch('fetchSiteList')// 刷新地块列表
store.dispatch('fetchRouteList')// 刷新航线列表
store.dispatch('fetchPaidOrderList')// 刷订单点列表
Message.success(res.data.msg)
@ -109,7 +109,7 @@ export async function getOrderDetails (id) {
/**
* @description: 退款函数
* @param {*} orderSn 订单号
* @param {*} shopId 商铺id
* @param {*} shopId 单位id
* @param {*} refundPrice 退款金额 单位元
* @param {*} refundType 退款类型 'buyer'买家申请 'seller'卖家主动
*/
@ -146,7 +146,7 @@ export async function addLog (log) {
/**
* @description: 向管理员用户发布公告
* @param {*} shop_id 商铺 ID
* @param {*} shop_id 单位 ID
* @param {*} tit 公告标题
* @param {*} message 公告内容
* @param {*} idArr 接收公告的管理员ID数组
@ -234,7 +234,7 @@ export async function saveFlyData (data) {
/**
* @description: 保存禁飞区数据
* @param {string|number} shop_id 商铺ID
* @param {string|number} shop_id 单位ID
* @param {Array} nofly_data 禁飞区数据数组
* @param {Array} restrictfly_data 限制飞区数据数组
* @returns {Object|null} 返回接口响应数据 null 表示失败
@ -261,7 +261,7 @@ export async function setNoflyData (shopId, noflyData) {
/**
* @description: 保存限飞区数据
* @param {string|number} shop_id 商铺ID
* @param {string|number} shop_id 单位ID
* @param {Array} restrictfly_data 限制飞区数据数组
* @param {Array} restrictfly_height 限制飞区数据高度组
* @returns {Object|null} 返回接口响应数据 null 表示失败

View File

@ -9,12 +9,6 @@
</div>
<div class="bullshit">
<div class="bullshit__oops">页面走丢了!</div>
<div class="bullshit__info">All rights reserved
<a style="color:#20a0ff" href="https://flicube.com" target="_blank">飞行魔方官网</a>
</div>
<div class="bullshit__headline">{{ message }}</div>
<div class="bullshit__info">Please check that the URL you entered is correct, or click the button below
to return to the homepage.</div>
<a href="/" class="bullshit__return-home">回首页</a>
</div>
</div>

View File

@ -20,6 +20,11 @@
</div>
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<!-- 账号id显示 -->
<el-dropdown-item command="go-adminEdit">
<i class="el-icon-user-solid m-r-10"></i>
<font class="brandFontColor">{{ $store.state.user.name }}</font>
</el-dropdown-item>
<!-- 自定义语言设置为右侧弹出 -->
<el-dropdown-item>
<el-popover placement="right-start" width="150" trigger="hover" v-model="languagePopoverVisible">
@ -28,12 +33,15 @@
<!-- 其他语言可继续添加 -->
<!-- <el-radio label="en" class="m-t-10">English</el-radio> -->
</el-radio-group>
<span slot="reference" class="mainFontColor f-s-16"><i class="iconfont icon-zhongyingwen m-r-10"></i>语言设置</span>
<span slot="reference" class="mainFontColor f-s-16"><i
class="iconfont icon-zhongyingwen m-r-10"></i>语言设置</span>
</el-popover>
</el-dropdown-item>
<el-dropdown-item class="mainFontColor f-s-16" command="go-setting"><i class="iconfont icon-shezhi m-r-10"></i>设置</el-dropdown-item>
<el-dropdown-item class="mainFontColor f-s-16" divided command="logout"><i class="iconfont icon-logout m-r-10"></i>退出登录</el-dropdown-item>
<el-dropdown-item class="mainFontColor f-s-16" command="go-setting"><i
class="iconfont icon-shezhi m-r-10"></i>设置</el-dropdown-item>
<el-dropdown-item class="mainFontColor f-s-16" divided command="logout"><i
class="iconfont icon-logout m-r-10"></i>退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
@ -43,7 +51,7 @@
<el-button size="small" icon="iconfont icon-shuaxin" @click="refreshPage" circle></el-button>
</div>
<!-- 订单信息按钮 -->
<el-badge :hidden="pendingCount + processingCount + shippedCount + requestedCount == 0
<el-badge v-if="false" :hidden="pendingCount + processingCount + shippedCount + requestedCount == 0
? true
: false
" :value="pendingCount + processingCount + shippedCount + requestedCount" class="navbarBadge l-h-50 p-r-15 r">
@ -52,7 +60,7 @@
: ''
" @click="drawer = true" size="small" :icon="orderIcon" circle></el-button>
</el-badge>
<el-drawer :custom-class="$store.state.app.isWideScreen ? 'el-drawer-small' : 'el-drawer-large'"
<el-drawer v-if="false" :custom-class="$store.state.app.isWideScreen ? 'el-drawer-small' : 'el-drawer-large'"
:visible.sync="drawer" :size="$store.state.app.isWideScreen ? '90%' : '60%'" :append-to-body="true"
:modal-append-to-body="false" :direction="$store.state.app.isWideScreen ? 'btt' : 'rtl'">
<template slot="title">
@ -123,7 +131,7 @@ export default {
name: 'Headbar',
data () {
return {
shop_id: this.$store.state.user.shop_id, // id()
shop_id: this.$store.state.user.shop_id, // id()
drawer: false,
getQuestInterval: null, //
animationTrumpet: true, //
@ -264,22 +272,22 @@ export default {
* @description: 刷新当前页面
*/
refreshPage () {
/* init 数据接口 */
/* init 数据接口 */
this.$store.commit('app/setIsMobile') //
this.$store.dispatch('fetchPlaneClassList')//
this.$store.dispatch('fetchAirList') //
this.$store.dispatch('fetchShopList') //
this.$store.dispatch('fetchShopList') //
this.$store.dispatch('fetchAdminList') //
this.$store.dispatch('fetchSiteList') //
this.$store.dispatch('fetchSiteList') //
this.$store.dispatch('fetchRouteList') // 线
this.$store.dispatch('fetchNoflyData', this.$store.state.user.shop_id)// shopid
this.$store.dispatch('fetchNoflyData', this.$store.state.user.shop_id)// shopid
this.$store.dispatch('fetchCategoryList') //
this.$store.dispatch('fetchPaidOrderList') //
this.$store.dispatch('fetchMessageList')//
},
/**
* @description: 登出
*/
* @description: 登出
*/
logout () {
this.$store
.dispatch('user/destroyUserAsync')
@ -290,6 +298,8 @@ export default {
this.$router.push('/home/set')
} else if (command === 'logout') {
this.logout()
} else if (command === 'go-adminEdit') {
this.$router.push(`/admin/edit/${this.$store.state.user.id}`)
}
},
changeLang (lang) {
@ -304,12 +314,12 @@ export default {
watch: {
paidOrderList: {
handler (newVal, oldVal) {
//
//
if (this.getQuestInterval !== null) {
clearInterval(this.getQuestInterval)
}
if (newVal.length > 0) {
// 0
// 0
this.getQuestInterval = setInterval(() => {
this.animationTrumpet = !this.animationTrumpet //
}, 500)
@ -323,7 +333,7 @@ export default {
},
requestedCount: {
handler (newVal, oldVal) {
// 退
// 退
if (newVal.length > oldVal.length) {
this.speakText('有订单申请退款')
}

View File

@ -13,7 +13,7 @@
<el-main class="border p-20 m-b-20">
<el-form ref="form" :model="form" label-width="120px"
:label-position="$store.state.app.isWideScreen ? 'top' : 'right'">
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="账号">
@ -34,7 +34,7 @@
</template>
</el-upload>
</el-form-item>
<el-form-item label="权限设置">
<el-form-item v-if="$store.state.user.power !== 'editor'" label="权限设置">
<el-radio-group v-model="form.role">
<el-radio label="admin">管理员</el-radio>
<el-radio label="editor">编辑</el-radio>
@ -77,7 +77,7 @@ export default {
upFile: '',
oldFile: '',
pwd: '',
role: 'admin'
role: ''
},
adminId: this.$route.params.id, // get id
pageState: 'add', //
@ -121,6 +121,7 @@ export default {
this.form.name = data.name
this.form.uname = data.uname
this.form.oldFile = data.oldFile
this.form.role = data.role
if (Object.keys(data).length === 0) {
this.$message.warning('清空表单')
}
@ -136,7 +137,7 @@ export default {
const data = {
name: this.admin.name,
uname: this.admin.uname,
role: this.admin.role === 5 ? 'admin' : 'editor',
role: (Number(this.admin.role) === 5 || Number(this.admin.role) === 4) ? 'admin' : 'editor',
oldFile: this.admin.photo,
shop_id: this.admin.shop_id
}

View File

@ -0,0 +1,61 @@
<template>
<div class="app-container">
<el-row class="m-t-0">
<el-col :span="24">
<el-container>
<el-header height="42px" class="l-h-42 p-l-10 p-r-10 border border-b-n">
<div class="l">
<i class="iconfont icon-xiazai f-s-20"></i>
<font class="m-l-10 f-s-18 fb">软件下载</font>
</div>
</el-header>
<el-main class="border p-20">
<!-- 安卓端下载 -->
<el-card class="box-card" shadow="hover">
<div slot="header" class="clearfix">
<span class="f-s-16 fb">安卓端</span>
</div>
<div class="m-b-10">
<p><b>软件名称</b>鲲鹏堂 / KPT-SP 运载无机监管平台</p>
<p><b>版本号</b>v1.01</p>
<p><b>系统要求</b>安卓 14 及以上</p>
<p><b>建议分辨率</b>3200 × 2136</p>
<p><b>建议设备</b>小米 Pad 7</p>
</div>
<el-button type="primary" icon="el-icon-download" @click="downloadApk">
下载 APK
</el-button>
</el-card>
</el-main>
</el-container>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: 'SoftwareDownload',
methods: {
downloadApk () {
const link = document.createElement('a')
link.href = 'https://szdot.top/lz-app-release.apk'
link.target = '_blank'
link.download = 'KPT-SP_v1.01.apk'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
}
}
</script>
<style scoped>
.box-card {
margin-bottom: 20px;
}
</style>

View File

@ -130,10 +130,19 @@ export default {
deep: true
},
/**
* @description: 侧边栏显隐
* @description: 侧边栏缩进有变化时 地图重新自适应
*/
isCollapse () {
return this.$store.state.app.isCollapse
isCollapse: {
handler (val) {
if (val) {
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
},
deep: true
}
},
destroyed () {

View File

@ -48,19 +48,15 @@ export default {
currentLang: this.$store.state.settings.language || 'zh-CN',
moduleOptions: [
{ value: 'home', label: '概况' },
{ value: 'model', label: '机型列表' },
{ value: 'register', label: '飞机列表' },
{ value: 'model', label: '机型管理' },
{ value: 'register', label: '飞机管理' },
{ value: 'nofly', label: '飞行限制' },
{ value: 'route', label: '航线管理' },
{ value: 'site', label: '站点管理' },
{ value: 'planes', label: '无人机' },
{ value: 'shop', label: '商铺管理' },
{ value: 'admin', label: '账户列表' },
{ value: 'site', label: '地块管理' },
{ value: 'planes', label: '作业管理' },
{ value: 'shop', label: '单位管理' },
{ value: 'admin', label: '账户管理' },
{ value: 'message', label: '公告管理' },
{ value: 'category', label: '分类管理' },
{ value: 'product', label: '商品管理' },
{ value: 'broadcast', label: '广告管理' },
{ value: 'order', label: '订单与统计' }
{ value: 'download', label: '软件下载' }
],
selectedModules: []
}

View File

@ -11,7 +11,7 @@
</el-header>
<el-main class="border p-20">
<el-form label-width="120px">
<el-form-item label="所属商铺">
<el-form-item label="所属单位">
<SelectionShopId v-model="form.shop_id" :allSel="true" />
</el-form-item>
@ -101,7 +101,7 @@ export default {
},
async submitMessage () {
if (!this.form.shop_id) {
this.$message.warning('请选择所属商铺')
this.$message.warning('请选择所属单位')
return
}
if (!this.form.idArr || this.form.idArr.length === 0) {

View File

@ -13,8 +13,8 @@
<el-main class="border p-20 m-b-20">
<el-form ref="form" :model="form" label-width="120px" :label-position="$store.state.app.isWideScreen ? 'top' : 'right'">
<!-- 商铺选择 -->
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<!-- 单位选择 -->
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>

View File

@ -11,7 +11,7 @@
<el-button-group class="m-l-20">
<SelectionShopId v-model="form.shop_id" :allSel="true" />
</el-button-group>
<!-- 站点表格 -->
<!-- 地块表格 -->
<el-table class="m-t-20 w-100" ref="myTable"
:data="classListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark">
<el-table-column align="center" type="selection" width="40">
@ -67,8 +67,8 @@ export default {
return this.$store.state.planeClassList || []
},
/**
* @description: 过滤掉 不对应客户的 站点列表
* @return: 站点列表
* @description: 过滤掉 不对应客户的 地块列表
* @return: 地块列表
*/
classListArr () {
if (this.form.shop_id !== '') {

View File

@ -43,10 +43,20 @@ export default {
})
}
},
isCollapse (val) {
if (val) {
this.$refs.mapbox.handleResize()
}
/**
* @description: 侧边栏缩进有变化时 地图重新自适应
*/
isCollapse: {
handler (val) {
if (val) {
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
},
deep: true
}
}
}

View File

@ -43,10 +43,20 @@ export default {
})
}
},
isCollapse (val) {
if (val) {
this.$refs.mapbox.handleResize()
}
/**
* @description: 侧边栏缩进有变化时 地图重新自适应
*/
isCollapse: {
handler (val) {
if (val) {
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
},
deep: true
}
}
}

View File

@ -73,7 +73,7 @@ export default {
return {
pageSize: 50, //
currentPage: 1, //
shop_id: this.$store.state.user.shop_id, // id
shop_id: this.$store.state.user.shop_id, // id
orderList: [], //
loading: true//
}

View File

@ -126,7 +126,7 @@
<el-descriptions-item>
<template slot="label">
<i class="iconfont icon-jingqu"></i>
收获站点
收获地块
</template>
{{ orderDetails.receive_site_name }}
</el-descriptions-item>

View File

@ -137,7 +137,7 @@ export default {
name: 'Stat',
data () {
return {
shop_id: '', // id
shop_id: '', // id
dayOrderList: [], //
monthOrderList: [], //
yearOrderList: [], //
@ -271,7 +271,7 @@ export default {
//
dayOrderSerch () {
return {
shop_id: this.shop_id, // id
shop_id: this.shop_id, // id
start_time: Math.floor(this.dayTimestamps.start), //
end_time: Math.floor(this.dayTimestamps.end), //
main_status: ['已付款', '已退款', '已完成'], //
@ -316,7 +316,7 @@ export default {
//
monthOrderSerch () {
return {
shop_id: this.shop_id, // id
shop_id: this.shop_id, // id
start_time: Math.floor(this.monthTimestamps.start), //
end_time: Math.floor(this.monthTimestamps.end), //
main_status: ['已付款', '已退款', '已完成'], //
@ -362,7 +362,7 @@ export default {
//
yearOrderSerch () {
return {
shop_id: this.shop_id, // id
shop_id: this.shop_id, // id
start_time: Math.floor(this.yearTimestamps.start), //
end_time: Math.floor(this.yearTimestamps.end), //
main_status: ['已付款', '已退款', '已完成'], //

View File

@ -290,11 +290,14 @@ export default {
isCollapse: {
handler (val) {
if (val) {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
}
},
deep: true
}
}
}

View File

@ -202,6 +202,7 @@ export default {
return
}
let minTargetAlt = Infinity //
//
const commands = this.planeList.map(p => {
const pos = p?.planeState?.position
@ -216,12 +217,22 @@ export default {
const newLat = targetLat + offsetLat
const newAlt = targetAlt + offsetAlt
if (newAlt < minTargetAlt) {
minTargetAlt = newAlt
}
return {
macadd: p.macadd,
cmd: `{guidedMode:{lon:${newLon.toFixed(7)},lat:${newLat.toFixed(7)},alt:${newAlt.toFixed(1)}}}`
}
}).filter(Boolean)
//
if (minTargetAlt < 0) {
this.$message.warning(`指令已取消:最矮飞机将飞到地面以下(最低高度 ${minTargetAlt.toFixed(1)} 米)`)
return
}
//
commands.forEach(({ macadd, cmd }) => {
mqtt.publishFun(`cmd/${macadd}`, cmd)
@ -307,10 +318,19 @@ export default {
deep: true
},
/**
* @description: 侧边栏显隐
* @description: 侧边栏缩进有变化时 地图重新自适应
*/
isCollapse () {
return this.$store.state.app.isCollapse
isCollapse: {
handler (val) {
if (val) {
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
},
deep: true
}
}
}

View File

@ -12,7 +12,7 @@
</el-header>
<el-main class="border p-20 m-b-20">
<el-form ref="form" :model="form" label-width="120px" :label-position="$store.state.app.isWideScreen?'top':'right'">
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="单品名称">

View File

@ -12,7 +12,7 @@
</el-header>
<el-main class="border p-20 m-b-20">
<el-form ref="form" :model="form" label-width="120px" :label-position="$store.state.app.isWideScreen?'top':'right'">
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="所属分类">
@ -275,7 +275,7 @@ export default {
if (oldval === '') { // shop_id
this.initPage()//
} else { // shop_id selection path"none"
this.form.path = 'none'// selection none
this.form.path = 'none'// selection none
}
}
},

View File

@ -100,9 +100,9 @@ export default {
* @return: 商品列表
*/
spuListArr () {
//
//
let pList = this.spuList
if (this.form.shop_id !== '') { // "" shop_id
if (this.form.shop_id !== '') { // "" shop_id
pList = pList.filter((item) => item.shop_id === this.form.shop_id)
}
//

View File

@ -18,8 +18,8 @@
<el-form ref="form" :model="form" label-width="120px"
:label-position="$store.state.app.isWideScreen ? 'top' : 'right'">
<!-- 只有添加模式下显示选择商铺组件 -->
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<!-- 只有添加模式下显示选择单位组件 -->
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
@ -37,7 +37,7 @@
</el-form-item>
<!-- 启用/停用开关 -->
<el-form-item :label="form.onoff ? '启用' : '停用'">
<el-form-item v-show="false" :label="form.onoff ? '启用' : '停用'">
<el-switch v-model="form.onoff" />
</el-form-item>
@ -57,10 +57,10 @@
<el-form-item label="">
<el-descriptions v-if="selectedPlaneClass" title="机型信息" :column="3" border>
<el-descriptions-item label="最大载重">
{{ selectedPlaneClass.weight_max }} kg
{{ selectedPlaneClass.weight_max / 1000 }} KG
</el-descriptions-item>
<el-descriptions-item label="轴距">
{{ selectedPlaneClass.wheelbase }} mm
{{ selectedPlaneClass.wheelbase }} cm
</el-descriptions-item>
<el-descriptions-item label="类别">
{{ selectedPlaneClass.category }}

View File

@ -17,7 +17,7 @@
</el-tag>
</el-form-item>
<el-form-item label="商铺分配">
<el-form-item label="单位分配">
<span>{{ getShopName(shop_id) }}</span>
</el-form-item>
@ -72,11 +72,11 @@ export default {
},
methods: {
/**
* 获取商铺名称
* 获取单位名称
*/
getShopName (id) {
const shop = this.shopList.find(item => item.shop_id === id)
return shop ? shop.name : '未知商铺'
return shop ? shop.name : '未知单位'
},
/**
* 获取飞机名称和 mac 地址

View File

@ -32,14 +32,7 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">
<el-tag :type="scope.row.onoff === '1' ? 'success' : 'danger'">
<i style="" class="iconfont m-r-5 f-s-16 l-h-32"
:class="scope.row.onoff === '1' ? 'icon-qiyong' : 'icon-ic_tingyong'"></i>
<font>{{ scope.row.onoff === '1' ? '启用' : '停用' }}</font>
</el-tag>
</template>
<el-table-column prop="describe" label="描述" min-width="80" show-overflow-tooltip>
</el-table-column>
<el-table-column label="注册时间" width="100" min-width="80">
<template slot-scope="scope">
@ -55,7 +48,7 @@
<el-button type="warning" icon="el-icon-edit"
@click="$router.replace(`/register/edit/${scope.row.id}`)">编辑</el-button>
<el-button type="danger" icon="el-icon-delete" @click="deleteAir([scope.row.id])">删除</el-button>
<el-button type="success" icon="el-icon-link" @click="crosFrequencyToPage(form.shop_id,scope.row.id)">对频</el-button>
<!-- <el-button type="success" icon="el-icon-link" @click="crosFrequencyToPage(form.shop_id,scope.row.id)">对频</el-button> -->
</el-button-group>
</template>
</el-table-column>

View File

@ -14,7 +14,7 @@
</el-header>
<el-main class="border p-20 mainBox bg-white">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="航线标题">
@ -80,6 +80,12 @@ export default {
*/
routeList () {
return this.$store.state.routeList
},
/**
* @description: 侧边栏显隐
*/
isCollapse () {
return this.$store.state.app.isCollapse
}
},
methods: {
@ -147,7 +153,7 @@ export default {
}
},
/**
* @description: 创建新站点
* @description: 创建新地块
*/
async addRoute () {
const res = await this.$store.dispatch('fetchAddRoute', this.form)
@ -156,7 +162,7 @@ export default {
}
},
/**
* @description: 更新站点
* @description: 更新地块
*/
async saveRoute () {
this.form.id = this.routeId
@ -169,6 +175,21 @@ export default {
watch: {
routeList () {
this.initPage()//
},
/**
* @description: 侧边栏缩进有变化时 地图重新自适应
*/
isCollapse: {
handler (val) {
if (val) {
setTimeout(() => {
this.$nextTick(() => {
this.$refs.mapbox.handleResize()
})
}, 500)
}
},
deep: true
}
},
created () {

View File

@ -14,10 +14,10 @@
<el-form ref="form" :model="form" label-width="120px"
:label-position="$store.state.app.isWideScreen ? 'top' : 'right'">
<!-- 用户select选项 -->
<el-form-item v-if="pageState === 'edit'" label="商铺选择">
<el-form-item v-if="pageState === 'edit'" label="单位选择">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="店铺名称">
<el-form-item label="单位名称">
<el-input v-model="form.name" placeholder="推荐使用景区名称" />
</el-form-item>
<el-form-item label="负责人">
@ -83,7 +83,7 @@
end-placeholder="结束时间" placeholder="选择时间范围">
</el-time-picker>
</el-form-item>
<el-form-item label="商铺LOGO">
<el-form-item label="单位LOGO">
<el-upload class="avatar-uploader" drag name="file" :action="action" :headers="myheader"
:show-file-list="false" :on-success="handleUpSuccess" :on-error="handleUpErr"
:before-upload="beforeAvatarUpload">
@ -96,7 +96,7 @@
</el-upload>
</el-form-item>
<el-form-item label="描述">
<el-input v-model="form.desc" type="textarea" placeholder="商铺小程序介绍说明或景区的描述等,会显示在小程序的介绍里面" />
<el-input v-model="form.desc" type="textarea" placeholder="单位小程序介绍说明或景区的描述等,会显示在小程序的介绍里面" />
</el-form-item>
<el-form-item v-if="pageState == 'add' ? true : false">
<el-button type="primary" icon="el-icon-plus" @click="addShop">创建</el-button>
@ -155,7 +155,7 @@ export default {
},
computed: {
/**
* @description: 获取商铺列表
* @description: 获取单位列表
*/
shopList () {
return this.$store.state.shopList
@ -286,7 +286,7 @@ export default {
}
},
/**
* @description: 创建新商铺
* @description: 创建新单位
*/
async addShop () {
this.form.opening_time = this.formatDateToString(this.form.intervalTime[0])
@ -297,7 +297,7 @@ export default {
}
},
/**
* @description: 更新商铺
* @description: 更新单位
*/
async saveShop () {
this.form.opening_time = this.formatDateToString(this.form.intervalTime[0])

View File

@ -11,17 +11,21 @@
</div>
</el-header>
<el-main class="border p-20 m-b-20">
<el-form ref="form" :model="form" label-width="120px" :label-position="$store.state.app.isWideScreen?'top':'right'">
<el-form-item v-if="pageState === 'add'" label="所属商铺">
<el-form ref="form" :model="form" label-width="120px"
:label-position="$store.state.app.isWideScreen ? 'top' : 'right'">
<el-form-item v-if="pageState === 'add'" label="所属单位">
<SelectionShopId v-model="form.shop_id" />
</el-form-item>
<el-form-item label="站点名称">
<el-input v-model="form.sitename" placeholder="取餐站点的名字" />
<el-form-item label="地块名称">
<el-input v-model="form.sitename" placeholder="取餐地块的名字" />
</el-form-item>
<el-form-item label="二维码尺寸">
<el-form-item label="地块面积">
<el-input v-model="form.photo" placeholder="地块的面积单位平方米" ><template #append>平方米</template></el-input>
</el-form-item>
<el-form-item v-show="false" label="二维码尺寸">
<el-slider v-model="form.size" :format-tooltip="formatTooltip"></el-slider>
</el-form-item>
<el-form-item label="中心LOGO替换">
<el-form-item v-show="false" label="中心LOGO替换">
<el-upload class="avatar-uploader" drag name="file" :action="action" :headers="myheader"
:show-file-list="false" :on-success="handleUpSuccess" :on-error="handleUpErr"
:before-upload="beforeAvatarUpload">
@ -33,10 +37,10 @@
</template>
</el-upload>
</el-form-item>
<el-form-item label="绑定航线">
<el-form-item v-show="false" label="绑定航线">
<el-transfer v-model="form.bindroute" :data="routeData" :titles="['可绑定航线', '已绑定航线']"></el-transfer>
</el-form-item>
<el-form-item label="站点描述">
<el-form-item label="地块描述">
<el-input v-model="form.desc" type="textarea" placeholder="非必填" />
</el-form-item>
<el-form-item v-if="pageState == 'add' ? true : false">
@ -63,6 +67,7 @@ export default {
action: this.$store.state.settings.baseURL + this.$store.state.settings.apiPlanePath + 'upImgFile',
myheader: { token: this.$store.state.user.token },
form: {
photo: '',
shop_id: '',
sitename: '',
desc: '',
@ -87,7 +92,7 @@ export default {
return this.$store.state.adminList
},
/**
* @description: 获取站点列表
* @description: 获取地块列表
*/
siteList () {
return this.$store.state.siteList
@ -161,6 +166,7 @@ export default {
if (data.desc == null) {
data.desc = ''
}
this.form.photo = data.photo
this.form.shop_id = data.shop_id
this.form.sitename = data.sitename
this.form.desc = data.desc
@ -179,6 +185,7 @@ export default {
this.site = this.siteList.find((item) => item.id === this.siteId)
if (this.site) {
const data = {
photo: this.site.photo,
shop_id: this.site.shop_id,
sitename: this.site.sitename,
desc: this.site.describe,
@ -190,7 +197,7 @@ export default {
}
},
/**
* @description: 创建新站点
* @description: 创建新地块
*/
async addSite () {
const res = await this.$store.dispatch('fetchAddSite', this.form)
@ -199,7 +206,7 @@ export default {
}
},
/**
* @description: 更新站点
* @description: 更新地块
*/
async saveSite () {
this.form.id = this.siteId

View File

@ -11,24 +11,26 @@
<el-button-group class="m-l-20">
<SelectionShopId v-model="form.shop_id" :allSel="true" />
</el-button-group>
<!-- 站点表格 -->
<!-- 地块表格 -->
<el-table class="m-t-20 w-100" ref="myTable"
:data="siteListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark">
<el-table-column align="center" type="selection" width="40">
</el-table-column>
<el-table-column align="center" prop="id" label="id" width="50">
</el-table-column>
<el-table-column prop="sitename" label="站点名称" width="120" min-width="100">
<el-table-column prop="sitename" label="地块名称" width="120" min-width="100">
</el-table-column>
<el-table-column label="菊花码缩率图" width="120" min-width="150">
<el-table-column prop="photo" label="地块面积(平方米)" width="220" min-width="200">
</el-table-column>
<!-- <el-table-column label="菊花码缩率图" width="120" min-width="150">
<template slot-scope="scope">
<el-image :src="scope.row.qr" :preview-src-list="[scope.row.qr]">
</el-image>
</template>
</el-table-column> -->
<el-table-column prop="describe" label="地块描述" min-width="80" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="describe" label="站点描述" min-width="80" show-overflow-tooltip>
</el-table-column>
<el-table-column align="center" label="已绑航线" width="200">
<!-- <el-table-column align="center" label="已绑航线" width="200">
<template slot-scope="scope">
<el-tag class="iconfont"
:class="scope.row.bind_route === null || scope.row.bind_route === '' ? 'icon-ic_tingyong' : 'icon-feihangluxian'"
@ -37,7 +39,7 @@
scope.row.bind_route }}</font>
</el-tag>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="controler" label="操作" width="140" min-width="140">
<template slot-scope="scope">
<el-button-group>
@ -73,14 +75,14 @@ export default {
},
computed: {
/**
* @description: 获取站点列表
* @description: 获取地块列表
*/
siteList () {
return this.$store.state.siteList
},
/**
* @description: 过滤掉 不对应客户的 站点列表
* @return: 站点列表
* @description: 过滤掉 不对应客户的 地块列表
* @return: 地块列表
*/
siteListArr () {
if (this.form.shop_id !== '') {
@ -109,7 +111,7 @@ export default {
}
},
/**
* @description: 删除站点
* @description: 删除地块
*/
deleteSite (idArr) {
this.$store.dispatch('fetchDelSite', idArr)

View File

@ -53,7 +53,7 @@ export default {
name: 'Menubar',
data () {
return {
title: '无人机控制终端',
title: 'KPT-SP',
isTap: true, //
show: true//
}
@ -161,17 +161,25 @@ export default {
/**
* @description: 监听飞机列表 有刷新导航栏
*/
airList (val) {
this.loadRoute(val)
this.$forceUpdate()//
airList: {
handler (val) {
this.loadRoute(val)
this.$forceUpdate()//
},
immediate: true, //
deep: true //
},
isTap (val) {
if (val) {
this.title = '无人机控制终端'
this.title = 'KPT-SP'
} else {
this.title = '小程序后台管理'
this.title = '后台管理'
}
//
/* 切换tab强制更新组件 */
this.loadRoute(this.airList)
this.$forceUpdate()//
/* 给导航栏切换加个 动画过渡 */
this.show = false
setTimeout(() => {
this.show = true

View File

@ -134,6 +134,7 @@ export default {
* @param {*} res 飞机列表
*/
airList (res) {
console.log(res)
/* mqtt */
mqtt.mqttConf()// mqtt
//
@ -220,7 +221,7 @@ export default {
plane.planeState[key] = homePosition
} else if (key === 'statusText') {
/* 飞控信息 插入日志 */
this.$store.dispatch('fetchLog', { content: jsonData[key], color: '#f57c00' })
this.$store.dispatch('fetchLog', { content: `${plane.name}--${jsonData[key]}`, color: '#f57c00' })
} else {
plane.planeState[key] = jsonData[key] //
}
@ -251,7 +252,7 @@ export default {
//
mqtt.doSubscribe(`refreshQuestList/${this.shop_id}`, (res) => {
if (res.topic.indexOf(`refreshQuestList/${this.shop_id}`) > -1) {
this.$store.dispatch('fetchSiteList')//
this.$store.dispatch('fetchSiteList')//
this.$store.dispatch('fetchPaidOrderList')// ps: 退
}
})

View File

@ -1,12 +1,11 @@
<template>
<div class="login-container flex column mc">
<div class="title-container fb l-h-32 flex mac">
<img src="@/assets/logo.png" class="m-r-15">
<font class="f1 f-s-22">飞行魔方</font>
<font class="f1 f-s-22">鲲鹏堂 / KPT-SP</font>
<font class="f2 f-s-10 m-l-5" style="vertical-align :top">v.1.0.1</font>
</div>
<el-form ref="loginForm" :model="loginForm" class="login-form" auto-complete="on" label-position="left">
<h3 class="f-s-30 m-b-15 fc">Authorize</h3>
<h3 class="f-s-30 m-b-15 fc">运载无人机监管平台</h3>
<el-form-item prop="username">
<span class="svg-container"><i class="iconfont icon-yonghuziliao f-s-24"></i></span>
<el-input ref="username" class="usernameBox" v-model="loginForm.username" placeholder="用户" name="username"