电动车

This commit is contained in:
3321822538@qq.com 2025-05-16 17:52:35 +08:00
parent 15b3a7d7f0
commit 0ff5c2f639
16 changed files with 930 additions and 858 deletions

View File

@ -1,7 +1,7 @@
const install = (Vue, vm) => {
uni.setStorageSync('deptId', 100);
Vue.prototype.$u.http.setConfig({
// baseUrl: 'http://192.168.2.139:4101', //键辉本地
// baseUrl: 'http://192.168.2.14:4101', //键辉本地
// baseUrl: 'http://192.168.0.102:4101', //景森本地
baseUrl: 'https://ele.ccttiot.com/prod-api', //线上
loadingText: '努力加载中~',

View File

@ -0,0 +1,53 @@
<template>
<view class="network-status" v-if="!isConnected">
<view class="network-tip">
<text>当前无网络连接</text>
</view>
</view>
</template>
<script>
export default {
name: 'network-status',
data() {
return {
isConnected: true
}
},
created() {
//
uni.onNetworkStatusChange((res) => {
this.isConnected = res.isConnected
})
//
this.checkNetwork()
},
methods: {
checkNetwork() {
uni.getNetworkType({
success: (res) => {
this.isConnected = res.networkType !== 'none'
}
})
}
}
}
</script>
<style lang="scss" scoped>
.network-status {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 9999;
.network-tip {
background-color: #ff4d4f;
color: #fff;
text-align: center;
padding: 10rpx 0;
font-size: 28rpx;
}
}
</style>

View File

@ -1,641 +0,0 @@
《万神之主》
【故事大纲】
第一章:平凡少年
- 主角林玄,一个普通山村少年
- 意外获得上古神物"轮回珠"
- 觉醒特殊体质"混沌神体"
- 开始踏上修炼之路
第二章:初入江湖
- 进入青云宗修炼
- 结识红颜知己苏清月
- 获得第一件神器"天玄剑"
- 突破筑基期
第三章:秘境奇遇
- 进入上古秘境"神魔战场"
- 获得上古神兽"九尾天狐"认主
- 习得绝世功法"混沌神诀"
- 突破金丹期
第四章:宗门大比
- 在宗门大比中一鸣惊人
- 击败宗门天才
- 获得进入核心弟子资格
- 结识神秘老者
第五章:神魔之战
- 卷入神魔两界大战
- 获得神界传承
- 突破元婴期
- 建立自己的势力
第六章:万界争霸
- 统一下界
- 飞升上界
- 建立神国
- 突破化神期
第七章:轮回之谜
- 探索轮回奥秘
- 领悟时间法则
- 突破渡劫期
- 成就真神之位
第八章:隐居世俗
- 厌倦神界纷争
- 隐居人间
- 感悟人生百态
- 寻找新的突破
第九章:再造巅峰
- 领悟大道真谛
- 突破神王境
- 创造新的神话
- 成为万神之主
【开篇章节】
第一章:轮回珠现
"轰!"
一声巨响,打破了山村的宁静。
林玄从睡梦中惊醒,揉了揉惺忪的睡眼。窗外,一道金光划破夜空,坠落在村后的山林中。
"那是什么?"林玄心中一动,披上外衣,悄悄溜出家门。
月光如水,洒在山间小路上。林玄循着金光坠落的方向,来到一处幽深的山谷。
山谷中央,一颗散发着淡淡金光的珠子静静躺在那里。珠子通体晶莹,内部似有星辰流转,神秘莫测。
"这是..."林玄小心翼翼地捡起珠子。
就在他触碰到珠子的瞬间,一股浩瀚的信息涌入脑海。
"轮回珠,上古神物,可助人领悟轮回真谛..."
林玄只觉得体内一股暖流涌动,全身经脉仿佛被重新塑造,一股前所未有的力量在体内流转。
"这是...混沌神体?"林玄震惊地感受着身体的变化。
就在这时,远处传来一阵脚步声。
"有人来了!"林玄连忙将轮回珠藏入怀中,转身就要离开。
"站住!"一个阴冷的声音响起。
林玄回头,只见三个黑衣人站在不远处,目光阴鸷地盯着他。
"小子,把轮回珠交出来,饶你不死!"为首的黑衣人冷冷道。
林玄心中一紧,但很快镇定下来。他感受到体内新生的力量,嘴角露出一丝冷笑。
"想要轮回珠?那就看你们有没有这个本事了!"
话音未落,林玄身形一闪,主动向黑衣人冲去。
这一夜,注定是一个不平凡的夜晚。一个普通少年的命运,就此改变。
第二章:初入江湖
林玄与三个黑衣人的战斗,在山谷中掀起一阵狂风。
"这小子有古怪!"为首的黑衣人惊呼。
林玄只觉体内力量源源不断,每一拳都带着混沌之力。三个黑衣人虽然修为不弱,但在混沌神体的压制下,渐渐落入下风。
"撤!"黑衣人见势不妙,转身就要逃走。
"想走?"林玄冷笑一声,体内轮回珠微微震动,一道金光射出,直接将三个黑衣人定在原地。
"这是...轮回之力?"黑衣人惊恐万分。
林玄没有理会他们的求饶,直接了结了三人。他知道,从获得轮回珠的那一刻起,自己就已经卷入了一个巨大的漩涡。
回到家中,林玄开始研究轮回珠的奥秘。珠子中蕴含的信息告诉他,想要真正掌握轮回珠的力量,需要进入修炼宗门。
"青云宗..."林玄喃喃自语。
三日后,林玄告别父母,踏上了前往青云宗的路。
青云宗位于青云山脉之巅,是方圆千里内最大的修炼宗门。林玄跋山涉水,终于来到山门前。
"来者何人?"守门弟子拦住林玄。
"在下林玄,特来拜师学艺。"林玄恭敬道。
"就凭你?"守门弟子不屑地打量着他,"青云宗可不是什么人都能进的。"
林玄微微一笑,体内混沌之力微微释放。守门弟子顿时脸色大变,连忙去通报。
不多时,一位白发老者飘然而至。
"混沌神体?"老者眼中精光一闪,"有意思,随我来吧。"
老者是青云宗大长老,名为苏青云。他看出林玄的不凡,直接收为亲传弟子。
在青云宗的日子,林玄刻苦修炼。有轮回珠相助,他的修为一日千里。
这一日,林玄正在后山修炼,忽然听到一阵琴声。循声而去,只见一位白衣女子正在抚琴。
"好美的琴声。"林玄赞叹道。
女子抬头,露出一张倾国倾城的容颜。
"在下苏清月,不知公子如何称呼?"
"林玄。"
两人相谈甚欢,苏清月是青云宗宗主的女儿,琴棋书画样样精通,修为也不弱。
"林师弟,听说你获得了天玄剑的认可?"苏清月问道。
林玄点头。天玄剑是青云宗镇宗之宝,只有得到剑灵认可的人才能使用。
"那真是太好了,有了天玄剑,你的实力会更上一层楼。"
就在两人交谈时,远处传来一阵骚动。
"不好,是魔教的人!"苏清月脸色一变。
林玄握紧天玄剑,眼中战意盎然。
"清月师姐,我们一起上!"
这一战,林玄展现出惊人的实力。天玄剑在手,配合混沌神体,所向披靡。
战后,林玄成功突破筑基期,成为青云宗年轻一代的翘楚。
"林师弟,你的天赋真是惊人。"苏清月赞叹道。
林玄微微一笑,心中却明白,这只是开始。轮回珠的秘密,还有更多等待他去探索。
第三章:秘境奇遇
青云宗后山,一处隐秘的山洞中。
"林师弟,你真的要进入神魔战场?"苏清月担忧地看着林玄。
"嗯,轮回珠指引我,那里有我需要的东西。"林玄坚定地说。
神魔战场是上古时期神魔大战的遗迹,危险重重,但机缘也很多。林玄在轮回珠的指引下,发现了一处通往战场的入口。
"我陪你一起去。"苏清月说道。
林玄摇头:"太危险了,我一个人去就好。"
告别苏清月,林玄踏入山洞。洞内幽深,空气中弥漫着古老的气息。轮回珠在胸前微微发光,指引着方向。
不知走了多久,眼前豁然开朗。一片荒芜的战场出现在眼前,残破的兵器散落一地,空气中还残留着当年大战的余威。
"这就是神魔战场..."林玄感叹道。
突然,轮回珠剧烈震动,指向战场深处。林玄循着指引,来到一座残破的神殿前。
神殿中央,一尊九尾天狐的雕像栩栩如生。
"人类,你终于来了。"一个空灵的声音响起。
林玄一惊,只见雕像竟然活了过来,化作一只通体雪白的九尾天狐。
"我是上古神兽九尾天狐,等待有缘人已经千年。"天狐说道,"轮回珠选择了你,说明你就是我要等的人。"
"前辈..."林玄恭敬行礼。
"不必多礼,从今以后,你就是我的主人。"天狐说着,化作一道白光没入林玄体内。
林玄只觉体内多了一股强大的力量,与混沌神体完美融合。
"这是混沌神诀,上古最强功法。"天狐的声音在脑海中响起。
林玄盘膝而坐,开始修炼混沌神诀。功法运转,体内力量不断攀升。
不知过了多久,林玄睁开眼,眼中精光闪烁。
"金丹期!"他惊喜地发现,自己竟然直接突破到了金丹期。
就在这时,神殿深处传来一阵异动。
"不好,是魔气!"天狐提醒道。
林玄握紧天玄剑,警惕地看着前方。一个浑身笼罩在黑雾中的身影缓缓走出。
"桀桀,终于等到你了,轮回珠的持有者。"黑影阴笑道。
"你是谁?"林玄冷声问道。
"我是魔界使者,奉命来取轮回珠。"黑影说着,突然出手。
林玄早有准备,天玄剑一挥,混沌之力爆发。两人战在一起,打得天昏地暗。
"混沌神诀,第一式!"林玄大喝一声,体内力量爆发,直接将黑影击退。
"不可能!你怎么会混沌神诀?"黑影惊恐万分。
林玄没有给他喘息的机会,又是一剑斩出。黑影惨叫一声,化作黑雾消散。
"这只是开始,魔界不会善罢甘休的。"天狐提醒道。
林玄点头,他知道,更大的挑战还在后面。但有了九尾天狐和混沌神诀,他更有信心面对未来的挑战。
离开神魔战场,林玄回到青云宗。苏清月见到他平安归来,欣喜不已。
"林师弟,你突破了?"她惊讶地发现林玄的气息更加强大。
林玄点头,将秘境中的经历简单说了一遍。
"太好了,有了这些机缘,你在宗门大比中一定能大放异彩。"苏清月笑道。
林玄看着远方,眼中闪烁着坚定的光芒。他知道,自己的修炼之路才刚刚开始。
第四章:宗门大比
青云宗演武场,人声鼎沸。
三年一度的宗门大比如期而至,所有弟子都摩拳擦掌,准备一展身手。
"林师弟,这次大比,你可要小心。"苏清月叮嘱道,"听说这次有不少天才弟子参加。"
林玄点头:"放心,我不会大意的。"
大比开始,林玄一路过关斩将,轻松晋级。他的表现引起了宗门高层的注意。
"此子不简单啊。"宗主苏青云看着场中的林玄,眼中闪过一丝赞赏。
半决赛,林玄的对手是宗门第一天才,号称"青云剑"的赵无极。
"林玄,听说你获得了天玄剑的认可?"赵无极冷笑道,"可惜,在我面前,你什么都不是。"
林玄淡然一笑:"是吗?那就让我见识见识你的实力。"
两人交手,剑气纵横。赵无极的剑法确实了得,但林玄有混沌神体加持,丝毫不落下风。
"混沌神诀,第二式!"林玄突然变招,体内力量爆发。
赵无极大惊,连忙后退,但还是被剑气所伤。
"不可能!"他难以置信地看着林玄,"你怎么会这么强?"
林玄没有回答,又是一剑斩出。赵无极败退,林玄晋级决赛。
决赛对手是宗门大长老的亲传弟子,号称"青云第一人"的李天阳。
"林玄,你的表现让我很意外。"李天阳说道,"不过,到此为止了。"
林玄感受到对方强大的气息,知道这是一场硬仗。
两人交手,打得天昏地暗。李天阳的修为确实深厚,但林玄有九尾天狐相助,渐渐占据上风。
"混沌神诀,第三式!"林玄大喝一声,体内力量爆发到极致。
李天阳被这一击震退,脸色苍白。
"我认输。"他苦笑道,"林师弟,你赢了。"
全场哗然,谁也没想到,一个刚入门不久的弟子,竟然能夺得大比第一。
"林玄,你很不错。"宗主苏青云亲自为林玄颁奖,"从今天起,你就是核心弟子了。"
林玄恭敬行礼:"多谢宗主。"
就在这时,一位神秘老者突然出现在场中。
"好一个天才少年。"老者笑道,"老夫观你天赋异禀,可愿随我修行?"
林玄感受到老者深不可测的气息,知道这是一位高人。
"前辈是?"他问道。
"老夫乃天机老人,专门寻找有缘人。"老者说道,"你的轮回珠,与我有缘。"
林玄心中一动,看来这位老者知道轮回珠的秘密。
"弟子愿意。"他恭敬道。
"好,三日后,我在后山等你。"老者说完,飘然而去。
大比结束,林玄成为宗门最耀眼的新星。但他知道,更大的机缘在等着他。
"林师弟,恭喜你。"苏清月笑道。
林玄点头:"清月师姐,我要离开一段时间。"
"我知道,去吧,我等你回来。"苏清月眼中闪过一丝不舍。
林玄看着远方,心中充满期待。天机老人的出现,或许会给他带来新的机遇。
第五章:神魔之战
三日后,林玄如约来到后山。
天机老人早已等候多时,见到林玄,满意地点点头。
"很好,你来了。"老人说道,"随我来吧。"
两人来到一处隐秘的山洞,洞内别有洞天。
"这里是天机阁,我的修炼之地。"老人介绍道,"从今天起,你就在这里修炼。"
林玄点头,开始跟随天机老人学习。老人传授他许多上古秘术,让他的实力更上一层楼。
这一日,天机老人突然神色凝重。
"林玄,大事不好了。"老人说道,"魔界大军已经攻入神界,神魔之战即将爆发。"
林玄一惊:"前辈,我们该怎么办?"
"轮回珠是上古神物,与神界有莫大关联。"老人说道,"你必须前往神界,助神族一臂之力。"
林玄点头:"弟子明白。"
告别天机老人,林玄回到青云宗,向宗主说明情况。
"去吧,这是你的使命。"苏青云说道,"青云宗永远是你的后盾。"
林玄又找到苏清月,两人依依惜别。
"清月师姐,等我回来。"林玄说道。
"一定要平安回来。"苏清月眼中含泪。
林玄点头,转身离去。他来到一处古老的传送阵,这是通往神界的通道。
传送阵启动,林玄只觉眼前一花,已经来到神界。
神界一片混乱,到处都是战斗的痕迹。林玄循着轮回珠的指引,来到神界中心。
"来者何人?"一位神将拦住林玄。
"在下林玄,特来助神界一臂之力。"林玄说道。
神将感受到林玄体内强大的气息,知道他不是普通人。
"随我来。"神将说道。
林玄被带到神王面前。神王是一位威严的中年人,看到林玄,眼中闪过一丝惊讶。
"轮回珠的持有者?"神王问道。
林玄点头:"正是。"
"很好,有了轮回珠,我们就有希望了。"神王说道,"魔界大军即将攻来,你做好准备。"
林玄点头,开始准备战斗。他感受到体内轮回珠的力量,知道这是自己的使命。
不久,魔界大军果然攻来。林玄站在城墙上,看着黑压压的魔军,心中毫无畏惧。
"混沌神诀,第四式!"林玄大喝一声,体内力量爆发。
他冲入魔军之中,所向披靡。天玄剑在手,配合混沌神体,无人能挡。
"那是谁?"魔界统帅惊讶地看着林玄。
"是轮回珠的持有者!"有魔将惊呼。
林玄一路杀到魔界统帅面前,两人展开激战。
"混沌神诀,第五式!"林玄再次爆发,直接将魔界统帅击退。
魔界大军见统帅败退,士气大减。神界趁机反攻,终于击退了魔界大军。
战后,神王亲自接见林玄。
"林玄,你立下大功,我代表神界感谢你。"神王说道。
林玄摇头:"这是我应该做的。"
"从今以后,你就是神界的守护者。"神王说道,"这是神界传承,希望你能好好利用。"
林玄接过传承,感受到一股强大的力量涌入体内。
"元婴期!"他惊喜地发现,自己竟然突破到了元婴期。
神王满意地点头:"你的潜力无限,未来或许能成为神界之主。"
林玄心中一动,他知道,自己的使命才刚刚开始。
第六章:万界争霸
神界之战后,林玄的名声传遍万界。
"林玄,你现在的实力,已经可以统一下界了。"神王说道。
林玄点头,他知道这是自己的使命。他回到下界,开始统一之路。
青云宗成为他的第一个目标。宗主苏青云见到林玄归来,欣喜不已。
"林玄,你回来了。"苏青云说道。
林玄点头:"宗主,我这次回来,是要统一下界。"
苏青云一愣,随即笑道:"好,青云宗全力支持你。"
有了青云宗的支持,林玄开始征战四方。他凭借强大的实力,很快统一了下界各大宗门。
"林玄,你的实力已经达到化神期,可以飞升上界了。"九尾天狐提醒道。
林玄点头,开始准备飞升。他来到一处古老的祭坛,这是飞升的通道。
"清月师姐,我要飞升了。"林玄找到苏清月,说道。
苏清月眼中含泪:"去吧,我等你回来。"
林玄点头,转身踏上祭坛。祭坛启动,一道金光冲天而起。
林玄只觉眼前一花,已经来到上界。
上界比下界更加广阔,强者如云。林玄开始在上界建立自己的势力。
"混沌神国,从今天起,正式成立。"林玄站在新建的宫殿前,宣布道。
混沌神国很快成为上界最强大的势力之一。林玄的实力也在不断提升,终于突破到化神期。
"林玄,你的实力已经达到化神期巅峰,可以尝试突破到渡劫期了。"神王的声音在脑海中响起。
林玄点头,开始准备突破。他来到一处隐秘的山洞,开始闭关。
闭关期间,林玄不断参悟轮回珠的奥秘。他感受到,轮回珠中蕴含着更加强大的力量。
"混沌神诀,第六式!"林玄大喝一声,体内力量爆发到极致。
一股强大的力量从体内涌出,林玄成功突破到渡劫期。
"太好了!"九尾天狐欣喜道,"你现在已经是上界最强者之一了。"
林玄点头,但他知道,自己的目标不止于此。他要成为万界之主,创造新的神话。
"混沌神国,从今天起,正式向其他势力宣战。"林玄站在宫殿前,宣布道。
混沌神国的军队开始征战四方,所向披靡。林玄亲自出手,击败了一个又一个强大的对手。
"林玄,你的实力已经达到渡劫期巅峰,可以尝试突破到真神之位了。"神王的声音再次响起。
林玄点头,开始准备最后的突破。他知道,这将是他修炼之路上的最大挑战。
第七章:轮回之谜
林玄站在混沌神国的最高处,仰望星空。
"轮回珠,你到底隐藏着什么秘密?"他喃喃自语。
自从突破到渡劫期后,林玄就感受到轮回珠中有一股神秘的力量在召唤他。
"主人,我感受到轮回珠中有时间法则的气息。"九尾天狐说道。
林玄点头,开始参悟轮回珠中的奥秘。他盘膝而坐,心神沉入轮回珠中。
轮回珠中,仿佛有一个无尽的世界。林玄看到无数画面在眼前闪过,那是过去、现在、未来的片段。
"这就是轮回的奥秘吗?"林玄心中一动。
他开始尝试掌控这些画面,领悟时间法则。这是一个漫长的过程,需要极大的耐心和悟性。
不知过了多久,林玄终于有所领悟。
"时间法则,原来如此。"他睁开眼睛,眼中闪烁着智慧的光芒。
就在这时,轮回珠突然剧烈震动,一道金光冲天而起。
"这是...真神之位的召唤?"林玄惊讶道。
他感受到一股强大的力量在召唤他,那是真神之位的考验。
"主人,你要小心。"九尾天狐提醒道。
林玄点头,开始准备接受考验。他来到一处古老的祭坛,这是真神之位的考验之地。
祭坛上,一位神秘的老者出现。
"林玄,你终于来了。"老者说道。
"前辈是?"林玄问道。
"我是轮回之主,掌管轮回法则。"老者说道,"你的表现让我很满意,现在,接受最后的考验吧。"
林玄点头,开始接受考验。考验分为三关:过去、现在、未来。
第一关,林玄回到过去,重新经历自己的人生。他看到了自己的成长,也看到了自己的不足。
第二关,林玄面对现在的自己,需要战胜内心的恐惧和欲望。
第三关,林玄看到未来的自己,那是一个站在万界之巅的强者。
"很好,你通过了考验。"轮回之主满意地点头,"从今天起,你就是新的轮回之主。"
林玄感受到一股强大的力量涌入体内,那是真神之位的力量。
"真神之位!"他惊喜地发现,自己终于突破到了真神之位。
"林玄,你的使命才刚刚开始。"轮回之主说道,"轮回的奥秘,还有更多等待你去探索。"
林玄点头,他知道,自己的修炼之路还很长。但他有信心,能够走得更远。
第八章:隐居世俗
成就真神之位后,林玄站在万界之巅,俯瞰众生。
"主人,你现在已经是万界最强者了。"九尾天狐说道。
林玄点头,但他心中却有一丝疲惫。多年的征战,让他感到厌倦。
"我想休息一段时间。"林玄说道。
他决定隐居世俗,体验平凡的生活。他来到一个普通的小镇,化名"林先生",开了一家小茶馆。
"林先生,您的茶真好喝。"镇上的居民称赞道。
林玄微笑点头,享受着这种平静的生活。他开始观察普通人的生活,感受他们的喜怒哀乐。
"原来,平凡的生活也有它的美好。"林玄感叹道。
他结识了许多朋友,听他们讲述生活中的故事。这些故事让他对人生有了新的感悟。
"林先生,您看起来不像普通人。"一位老者说道。
林玄笑而不语,继续泡茶。他知道,自己的身份迟早会暴露,但他并不在意。
这一日,小镇上来了一群不速之客。
"听说这里有一位高人,我们特来拜访。"为首的人说道。
林玄抬头,看到对方身上散发着强大的气息,知道他们是修炼者。
"我就是你们要找的人。"林玄说道。
对方一愣,随即恭敬行礼:"前辈,我们是来请教修炼之道的。"
林玄点头,开始指点他们。他发现自己虽然隐居,但修炼之心从未改变。
"修炼之道,重在修心。"林玄说道,"只有心静,才能看清自己的路。"
对方若有所思,感激地离开。
林玄继续过着平静的生活,但他知道,自己的使命还未完成。他开始思考,如何将修炼之道与平凡生活结合。
"或许,这就是新的突破。"他喃喃自语。
第九章:再造巅峰
隐居的日子一天天过去,林玄的心境越来越平和。
"主人,你似乎找到了新的方向。"九尾天狐说道。
林玄点头:"是的,我明白了修炼的真谛。"
他开始尝试将修炼之道与平凡生活结合,创造出一种新的修炼方式。
"修炼不在高处,而在心中。"林玄说道。
这一日,他来到一处山顶,仰望星空。
"轮回珠,是时候了。"他喃喃自语。
轮回珠在胸前微微发光,似乎在回应他。林玄开始最后的突破。
"混沌神诀,第七式!"他大喝一声,体内力量爆发到极致。
一股强大的力量从体内涌出,林玄成功突破到神王境。
"神王境!"他惊喜地发现,自己终于达到了修炼的巅峰。
就在这时,天空中出现一道金光,一位神秘的老者出现。
"林玄,你终于领悟了大道真谛。"老者说道。
"前辈是?"林玄问道。
"我是大道之主,掌管万界法则。"老者说道,"你的表现让我很满意,现在,接受最后的考验吧。"
林玄点头,开始接受考验。考验很简单,只需要回答一个问题。
"什么是修炼的真谛?"老者问道。
林玄沉思片刻,说道:"修炼的真谛,在于修心。心静则明,心明则通。修炼不在高处,而在心中。"
老者满意地点头:"很好,你通过了考验。从今天起,你就是新的万神之主。"
林玄感受到一股强大的力量涌入体内,那是万神之主的力量。
"万神之主!"他惊喜地发现,自己终于成为了万界最强者。
"林玄,你的使命才刚刚开始。"大道之主说道,"万界的未来,就交给你了。"
林玄点头,他知道,自己的责任重大。但他有信心,能够带领万界走向更美好的未来。
回到小镇,林玄继续开着他的小茶馆。但他知道,自己已经不再是普通人。
"林先生,您的茶真好喝。"镇上的居民称赞道。
林玄微笑点头,享受着这种平静的生活。他知道,这就是他想要的。
"修炼之道,重在修心。"他说道,"只有心静,才能看清自己的路。"
从此,林玄成为了万界的传说。他的故事被传颂千古,激励着无数修炼者。
而他,依然在那座小镇上,开着他的小茶馆,过着平凡而充实的生活。
【全文完】

View File

@ -13,7 +13,7 @@
<image src="https://api.ccttiot.com/smartmeter/img/static/uX29DoZzt2iTzWzASa8v" mode=""></image>
</view>
<view class="shuru">
<input type="text" v-model="sn" placeholder="请输入二维码下方的车辆编号"/>
<input type="number" v-model="sn" placeholder="请输入二维码下方的车辆编号"/>
</view>
<view class="anniu" @click="btnkaisuo">
确认开锁

View File

@ -393,6 +393,8 @@
devicename: '',
devicesarr: [],
findDeviceTimer: null,
lat:'',
lon:''
}
},
onLoad(option) {
@ -536,11 +538,34 @@
},1500)
},
onShow() {
xBlufi.notifyConnectBle({
isStart: false,
deviceId: this.deviceId,
name: this.name
})
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
},
// onHide() {
// xBlufi.notifyConnectBle({
// isStart: false,
// deviceId: this.deviceId,
// name: this.name
// })
// xBlufi.notifyStartDiscoverBle({
// 'isStart': true
// })
// xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
// },
// onUnload() {
// xBlufi.notifyStartDiscoverBle({
// 'isStart': false
// })
// xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent)
// },
methods: {
// 线
findDevice() {
@ -575,6 +600,7 @@
console.log('断开');
this.ver_dataflag = 1
console.log(this.ver_dataflag,'断开断开');
this.findDevice()
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
@ -599,9 +625,9 @@
this.findDevice()
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
console.log("1收到设备发来的自定义数据结果", options.data)
break;
// case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
// console.log("1", options.data)
// break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
console.log('蓝牙未开启')
@ -665,6 +691,26 @@
title: '车辆连接中...',
mask: true
})
setTimeout(()=>{
if(this.ver_dataflag == 3){
uni.hideLoading()
}else{
uni.hideLoading()
let that = this
uni.showModal({
title: '提示',
content: '连接失败,是否重新连接?',
showCancel: true,
success: function(res) {
if (res.confirm) {
that.btnzhifu()
} else if (res.cancel) {
}
}
})
}
},10000)
}
}else{
if (this.bikeobj.areaAuthentication == true) { //
@ -941,6 +987,23 @@
},
//
getlyxd(){
uni.getLocation({
type: 'gcj02', //
isHighAccuracy: true,
accuracy:'best',
success: (res) => {
console.log('精确坐标:', res);
this.lat = res.latitude;
this.lon = res.longitude;
this.getfeiyong();
},
fail: (err) => {
console.error('获取位置失败:', err);
this.lat = null
this.lon = null
}
});
if(this.ver_dataflag == 3){
let data = {
deviceId: this.bikeobj.id,
suitId: this.suitId,
@ -966,9 +1029,17 @@
customData: "11open@"
})
console.log(respc, '支付成功')
// xBlufi.notifySendCustomData({
// customData: "11open@"
// })
let data = {
mac:this.mac,
reason:'还车',
command:'open',
longitude:this.lon,
latitude:this.lat,
result:'成功'
}
this.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
console.log(res,'蓝牙');
})
this.$u.put(`/app/pay/refreshPayResult?no=${resp.data.pay.no}`).then((
res) => {
setTimeout(() => {
@ -997,6 +1068,20 @@
}).catch(e => {
uni.hideLoading()
})
}else{
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
}
},
//
getzf() {
@ -2012,4 +2097,4 @@
}
}
}
</style></style>
</style>

View File

@ -751,26 +751,28 @@
}
})
})
// this.status9.forEach(item => {
// this.markers.push({
// id: parseFloat(item.sn),
// latitude: parseFloat(item.latitude),
// longitude: parseFloat(item.longitude),
// // title: item.deviceName,
// width: 40,
// height: 40,
// iconPath: 'https://lxnapi.ccttiot.com/bike/img/static/u4UKmB47AxOj3YKIaajM',
// callout: {
// content: '线', //
// color: '#ffffff', //
// fontSize: 14, //
// borderRadius: 10, //
// bgColor: '#000000', //
// padding: 6, //
// display: 'ALWAYS', //
// }
// })
// })
this.status9.forEach(item => {
this.markers.push({
id: parseFloat(item.sn),
latitude: parseFloat(item.latitude),
longitude: parseFloat(item.longitude),
// title: item.deviceName,
width: 30,
height: 34,
iconPath: item.onlineStatus == 0 ?
'https://api.ccttiot.com/smartmeter/img/static/uQPc1AJSqJ6ZbOWrrLrf' :
'https://api.ccttiot.com/smartmeter/img/static/u392YZI3qzhhi3pORotr',
callout: {
content:'' + parseInt(item.remainingPower) + '%', //
color: '#ffffff', //
fontSize: 10, //
borderRadius: 10, //
bgColor: '#000000', //
padding: 3, //
display: 'ALWAYS', //
}
})
})
},
getmarks() {
this.markers = []
@ -803,6 +805,8 @@
this.status6.push(item)
} else if (item.status == 8) {
this.status8.push(item)
}else if (item.status == 9) {
this.status9.push(item)
}
})
this.markstause()
@ -828,6 +832,8 @@
this.status6.push(item)
} else if (item.status == 8) {
this.status8.push(item)
}else if (item.status == 9) {
this.status9.push(item)
}
})
this.markstause()
@ -853,6 +859,8 @@
this.status6.push(item)
} else if (item.status == 8) {
this.status8.push(item)
}else if (item.status == 9) {
this.status9.push(item)
}
})
this.markstause()

View File

@ -28,7 +28,7 @@
<view class="iconfont icon-xiangxia1"></view>
</view>
</view>
<scroll-view @scrolltolower="handqixing" scroll-y style="height: 66vh;">
<scroll-view @scrolltolower="handqixing" scroll-y refresher-enabled @refresherrefresh="onRefresh" :refresher-triggered="isRefreshing" refresher-default-style="black" style="height: 66vh;">
<view class="info_card" style="margin-top: 20rpx;" v-for="(item, index) in filteredList" :key="index"
@click.stop="todetail(item)">
<view class="info_tit" style="margin-left: 36rpx;">
@ -150,6 +150,7 @@ export default {
showdsc: false,
sctit: '从高到低',
scidx: 'desc',
isRefreshing: false,
show: false,
showtype: false,
typeSort: 'remainingPower',
@ -220,7 +221,10 @@ export default {
filteredList: [],
areaId: 0,
pageNum:1,
total:''
total:'',
sousuoflag:true,
searchKeyword: '',
searchTimer: null,
}
},
onLoad() {
@ -273,38 +277,77 @@ export default {
},
},
methods: {
//
search() {
// if (this.searchKeyword != '') {
this.pageNum = 1
let data = {
isAsc: this.scidx,
status: this.typeidx,
areaId: this.areaId,
orderByColumn: this.typeSort,
refresh:true,
Keyword:this.searchKeyword
}
this.selectedItems = []
this.$u.get(`/bst/device/list?pageNum=${this.pageNum}&pageSize=999`, data).then((res) => {
if (res.code == 200) {
this.total = res.total
this.deviceList = res.rows
this.filteredList = res.rows
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
// } else {
// this.filteredList = this.deviceList;
// }
// console.log(this.filteredList)
//
onRefresh() {
this.isRefreshing = true
this.pageNum = 1
this.getDevice()
setTimeout(() => {
this.isRefreshing = false
}, 1000)
},
search() {
//
clearTimeout(this.searchTimer)
// 500ms
this.searchTimer = setTimeout(() => {
this.doSearch()
}, 500)
},
//
doSearch() {
this.pageNum = 1
let data = {
isAsc: this.scidx,
status: this.typeidx,
areaId: this.areaId,
orderByColumn: this.typeSort,
refresh: true,
Keyword: this.searchKeyword
}
this.selectedItems = []
this.$u.get(`/bst/device/list?pageNum=${this.pageNum}&pageSize=999`, data).then((res) => {
if (res.code == 200) {
this.total = res.total
this.deviceList = res.rows
this.filteredList = res.rows
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
// //
// search() {
// this.pageNum = 1
// let data = {
// isAsc: this.scidx,
// status: this.typeidx,
// areaId: this.areaId,
// orderByColumn: this.typeSort,
// refresh:true,
// Keyword:this.searchKeyword
// }
// this.selectedItems = []
// this.$u.get(`/bst/device/list?pageNum=${this.pageNum}&pageSize=999`, data).then((res) => {
// if (res.code == 200) {
// this.total = res.total
// this.deviceList = res.rows
// this.filteredList = res.rows
// } else {
// uni.showToast({
// title: res.msg,
// icon: 'none',
// duration: 2000
// })
// }
// })
// },
todetail(item) {
if (this.stepindex == 0) {
console.log(item.id,item);

View File

@ -45,7 +45,7 @@
:default-time='pickertime'></u-picker>
<u-picker mode="time" v-model="time2" :params="params" @confirm="confirm2"
:default-time='pickertime'></u-picker>
<scroll-view class="warp_box" @scrolltolower="handqixing" scroll-y>
<scroll-view class="warp_box" @scrolltolower="handqixing" scroll-y refresher-enabled @refresherrefresh="onRefresh" :refresher-triggered="isRefreshing" refresher-default-style="black">
<view class="swiper-item ">
<view class="card" v-for="(item,index) in allList" :key="index" @click="toOrderDetail(item.deviceSn,item.id)">
<view class="line"></view>
@ -112,7 +112,6 @@
开始时间<span></span>
</view>
<view class="half_info_li">
<!-- 租赁时长<span>{{computedList(item.duration)}}</span> -->
租赁时长<span>{{formatDatess(item.startTime,item.endTime)}}</span>
</view>
</view>
@ -168,6 +167,7 @@
showtk: false,
orderInfo: {},
initialValues: {},
isRefreshing: false,
areaId: false,
tit: '车牌号',
shows: false,
@ -200,11 +200,7 @@
}
},
onShow() {
// if (uni.getStorageSync('adminAreaid')) {
// this.areaId = uni.getStorageSync('adminAreaid')
// this.orderList()
// // this.getArea()
// }
},
watch: {
@ -231,6 +227,16 @@
},
methods: {
//
onRefresh() {
this.isRefreshing = true
this.pageNum = 1
this.orderList()
setTimeout(() => {
this.isRefreshing = false
}, 1000)
},
formatPayedAmount(payedAmount, payRefunded, payRefunding) {
if (!payedAmount) return '0.00元';
@ -295,17 +301,6 @@
this.typeidx = e[0].value
this.tit = e[0].label
},
computedList(seconds, showSeconds = true) {
if (isNaN(seconds)) return "--";
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = seconds % 60;
const parts = [];
if (h > 0) parts.push(`${h}`);
if (m > 0 || h > 0) parts.push(`${m}`); //
if (showSeconds) parts.push(`${s}`);
return parts.join("") || "0钟";
},
toOrderDetail(id,orid) {
uni.navigateTo({
url: '/page_shanghu/guanli/order_detail?id=' + id + '&orid=' + orid

View File

@ -125,6 +125,12 @@
客服设置
</view>
</view>
<view class="cont" @click="btnsp">
<image src="https://api.ccttiot.com/smartmeter/img/static/ur7n7u3LdDMLKQdzTtD7" mode=""></image>
<view class="text">
视频教程
</view>
</view>
<!-- <view class="cont" @click="btngggl">
<image src="https://api.ccttiot.com/smartmeter/img/static/ui8unTyOFXCkgier5F5P" mode=""></image>
<view class="text">
@ -136,8 +142,8 @@
<view class="text">
免责协议
</view>
</view>
<view class="cont" @click="btnggsz">
</view> -->
<!-- <view class="cont" @click="btnggsz">
<image src="https://api.ccttiot.com/smartmeter/img/static/uov2297NuScFZayry0iH" mode=""></image>
<view class="text">
广告设置
@ -237,6 +243,12 @@ export default {
}
},
methods: {
//
btnsp(){
uni.navigateTo({
url:'/page_user/shiping/index'
})
},
//
btnywry(){
uni.navigateTo({

View File

@ -1474,9 +1474,9 @@
.new_infocard{
width: 750rpx;
height: 50vh;
overflow: scroll;
padding-bottom: 100rpx;
height: 80vh;
// overflow: scroll;
// padding-bottom: 100rpx;
background: #FFFFFF;
border-radius: 30rpx;
padding: 30rpx;

View File

@ -125,17 +125,20 @@
车辆信息
</view>
<view class="card">
<view class="pic_cont" v-for="(item,index) in processedOrderDeviceList" :key="index">
<view class="jilu">
<view class="one" v-if="index == 0">
初始车辆
</view>
<view class="one" v-else>
更换车辆
</view>
<view class="two">
{{item.startTime == null ? '--' : item.startTime}}
<view class="pic_cont" v-for="(item,index) in processedOrderDeviceList" :key="index" @click="btntz(item.deviceId)">
<view class="jilu" style="display: flex;justify-content: space-between;width: 100%;align-items: center;">
<view class="" style="display: flex;align-items: center;">
<view class="one" v-if="index == 0">
初始车辆
</view>
<view class="one" v-else>
更换车辆
</view>
<view class="two">
{{item.startTime == null ? '--' : item.startTime}}
</view>
</view>
<u-icon name="arrow-right" color="#4C97E7" size="28"></u-icon>
</view>
<view class="bianhao">
<view class="">
@ -334,6 +337,30 @@
</view>
</view>
<view class="mask" v-if="tkflag"></view>
<!-- 辅助还车是否收取调度费 -->
<view class="diaodu" v-if="ddflag">
<view class="top" @click="btncha">
×
</view>
<view class="cen">
该车辆未在停车区还车是否收取调度费{{fuzhuobj.manageFee > 0 ? fuzhuobj.manageFee : fuzhuobj.dispatchFee > 0 ? fuzhuobj.dispatchFee : ''}}
</view>
<view class="anniu">
<view class="bu" @click="btnfuzhus(false)">
不收取
</view>
<view class="shou" @click="btnfuzhus(true)">
收取
</view>
</view>
</view>
<view class="mask" v-if="ddflag">
</view>
</view>
</template>
@ -346,7 +373,6 @@
return {
devicesList: [],
searching: false,
texts: '正在扫描蓝牙设备...',
btnflag: true,
tishiflag: false,
option: '',
@ -417,7 +443,10 @@
currentPolyline:[],
trackPoints: [], //
tkje:true
tkje:true,
ddflag:false,
fuzhuobj:{}
}
},
onLoad(e) {
@ -492,6 +521,11 @@
}
},
methods: {
btntz(id){
uni.navigateTo({
url:'/page_shanghu/guanli/device_detail?id=' + id
})
},
formatSecondsToHMS(seconds) {
const h = Math.floor(seconds / 3600).toString().padStart(2, '0');
const m = Math.floor((seconds % 3600) / 60).toString().padStart(2, '0');
@ -697,38 +731,95 @@
console.log(11);
}
},
btncha(){
this.ddflag = false
},
//
btnfuzhus(flag){
uni.showLoading({
title: '还车中...',
mask: true
})
let data = {
orderId:this.orid,
needDispatchFee:flag
}
this.$u.put(`/bst/order/end`,data).then(res =>{
if(res.code == 200){
uni.showToast({
title: '辅助还车成功',
icon: 'success',
duration: 2000
})
uni.hideLoading()
this.ddflag = false
setTimeout(()=>{
this.deviceInfo()
this.getorderxq()
},1500)
}else{
uni.hideLoading()
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
//
btnfuzhu(){
let that = this
uni.showModal({
title: '提示',
content: '您确定要进行辅助还车吗?',
showCancel: true,
success: function (res) {
if (res.confirm) {
let data = {
orderId:that.orid
}
that.$u.put(`/bst/order/end`,data).then(res =>{
if(res.code == 200){
uni.showToast({
title: '辅助还车成功',
icon: 'success',
duration: 2000
})
that.deviceInfo()
that.getorderxq()
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
let data = {
orderId: this.orid,
checkLocation:false
}
this.$u.post(`/app/order/calcFee`, data).then(res => {
if (res.code == 200) {
this.fuzhuobj = res.data
if (res.data.manageFee > 0 || res.data.dispatchFee > 0) {
this.ddflag = true
} else {
let that = this
uni.showModal({
title: '提示',
content: '您确定要进行辅助还车吗?',
showCancel: true,
success: function (res) {
if (res.confirm) {
let data = {
orderId:that.orid
}
that.$u.put(`/bst/order/end`,data).then(res =>{
if(res.code == 200){
uni.showToast({
title: '辅助还车成功',
icon: 'success',
duration: 2000
})
setTimeout(()=>{
that.deviceInfo()
that.getorderxq()
},1500)
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
} else if (res.cancel) {
}
}
})
} else if (res.cancel) {
}
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
@ -1948,6 +2039,67 @@
overflow-x: hidden;
background-color: #F3F3F3;
}
.diaodu{
position: fixed;
width: 560rpx;
background-color: #fff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 24rpx;
overflow: hidden;
z-index: 999;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
.top{
width: 100%;
height: 80rpx;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 30rpx;
box-sizing: border-box;
font-size: 40rpx;
color: #999;
}
.cen{
font-size: 32rpx;
color: #333;
padding: 0 40rpx 40rpx;
box-sizing: border-box;
text-align: center;
line-height: 1.5;
}
.anniu{
display: flex;
height: 100rpx;
border-top: 1px solid #f5f5f5;
view{
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
font-weight: 500;
}
.bu{
color: #666;
background: #f8f8f8;
}
.shou{
color: #fff;
background: #4C97E7;
}
}
}
.mask{
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: 998;
background-color: rgba(0, 0, 0, 0.5);
}
.xingchengxx{
width: 750rpx;
max-height: 99999rpx;

View File

@ -150,14 +150,19 @@ export default {
},
onShow() {
uni.getLocation({
type: 'wgs84',
success: (res) => {
this.latitude = res.latitude
this.longitude = res.longitude
},
fail: (err) => {
console.error('获取位置失败:', err)
}
type: 'gcj02', //
isHighAccuracy: true,
accuracy:'best',
success: (res) => {
console.log('精确坐标:', res);
this.latitude = res.latitude
this.longitude = res.longitude
},
fail: (err) => {
console.error('获取位置失败:', err);
this.latitude = null
this.longitude = null
}
})
},
computed: {
@ -236,6 +241,17 @@ export default {
xBlufi.notifySendCustomData({
customData: "11close@"
})
// let data = {
// mac:that.mac,
// reason:'',
// command:'close',
// longitude:that.lon,
// latitude:that.lat,
// result:''
// }
// that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
// console.log(res,'');
// })
setTimeout(()=>{
xBlufi.notifyConnectBle({
isStart: false,

View File

@ -14,9 +14,6 @@
<view class="name">
身份证号 <input type="text" v-model="zfzh" placeholder="请填写身份证号" />
</view>
<!-- <view class="name">
手机号 <input type="text" v-model="tel" placeholder="请填写手机号" />
</view> -->
<view class="" style="width: 100%;text-align: center;margin-top: 20rpx;color: #ccc;">
您当前还未完成实名认证
</view>
@ -31,9 +28,6 @@
<view class="name">
身份证号 <input type="text" v-model="zfzh" :disabled="true" placeholder="请填写身份证号" />
</view>
<!-- <view class="name">
手机号 <input type="text" v-model="tel" :disabled="true" placeholder="请填写手机号" />
</view> -->
<view class="" style="width: 100%;text-align: center;margin-top: 20rpx;color: #ccc;">
您当前已完成实名认证
</view>
@ -52,7 +46,6 @@
bgc: {
backgroundColor: "",
},
tel:'',
name:'',
zfzh:'',
isReal:false,
@ -63,7 +56,6 @@
if(option.user){
console.log(option);
this.isReal = JSON.parse(option.user).isReal
this.tel = JSON.parse(option.user).phonenumber
this.name = JSON.parse(option.user).realName
this.zfzh = JSON.parse(option.user).realIdCard
}
@ -122,7 +114,6 @@
let data = {
userName:this.name,
idCard:this.zfzh,
// mobile:this.tel
}
this.$u.put(`/app/realName/twoElementRealName`,data).then(res =>{ //
if(res.code == 200){

View File

@ -0,0 +1,50 @@
<template>
<view class="page">
<u-navbar title="视频教程" :border-bottom="false" :background="bgc" back-icon-color="#262B37" title-color='#262B37'
title-size='36' height='36' id="navbar">
</u-navbar>
<view class="list">
<view class="list_item">
<web-view :src="http" @load="onWebViewLoad" @error="onWebViewError"></web-view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bgc: {
backgroundColor: "#fff",
},
http:''
}
},
onLoad() {
this.http = 'https://ele.ccttiot.com/ext?url=' + encodeURIComponent('https://player.bilibili.com/player.html?isOutside=true&aid=114369123849636&bvid=BV1CuLczFEe2&cid=29515777844&p=1')
console.log(this.http);
},
methods: {
onWebViewLoad(e) {
console.log('网页加载完成', e)
uni.showToast({ title: '页面加载完成', icon: 'none' })
},
//
onWebViewError(e) {
console.error('加载失败', e)
uni.showToast({ title: '加载失败', icon: 'none' })
}
}
}
</script>
<style lang="scss">
page {
background: #fff;
}
</style>

View File

@ -82,6 +82,13 @@
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
},{
"path": "shiping/index",
"style": {
"navigationBarTitleText": "上传",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
},{
"path": "zhaoshang",
"style": {

View File

@ -18,13 +18,13 @@
车牌号{{deivceobj.deviceVehicleNum == null ? '--' : deivceobj.deviceVehicleNum}}
<text>SN{{deivceobj.deviceSn == null ? '--' : deivceobj.deviceSn}}</text>
</view>
<view class="lanya" v-if="ver_dataflag == 3">
<view class="lanya" v-if="ver_dataflag == 3" style="display: flex;align-items: center;color: #1890ff;">
<image src="https://api.ccttiot.com/smartmeter/img/static/uFfCiqhjHpbTBXcZvKl6" class="ljimg"
mode=""></image>
mode=""></image> 已连接
</view>
<view class="lanya" v-else>
<view class="lanya" v-else style="display: flex;align-items: center;color: rgb(245, 108, 108);">
<image src="https://api.ccttiot.com/smartmeter/img/static/uO1TOFA1vdxQlz3NJenN" class="ljimg"
mode=""></image>
mode=""></image> 连接中...
</view>
</view>
<view class="dianliang">
@ -138,7 +138,7 @@
需支付<text>{{fajinobj.manageFee > 0 ? fajinobj.manageFee : fajinobj.dispatchFee > 0 ? fajinobj.dispatchFee : ''}}</text>你可查看<text
@click="btntcd">最近停车点</text>
</view>
<image src="https://api.ccttiot.com/smartmeter/img/static/uzRrRFiToK3bb3IurIHU" class="tcimg" mode="">
<image @click="btntcd" src="https://api.ccttiot.com/smartmeter/img/static/uzRrRFiToK3bb3IurIHU" class="tcimg" mode="">
</image>
<view class="btnan">
<view class="fj" @click="btnfajin">
@ -217,7 +217,13 @@
name: '',
kefuflag:false,
kefulist:[],
ljflag:true
ljflag:true,
lslat:'',
lslon:'',
bluetoothData:{},
uploadTimer: null, // ID
lastUploadTime: 0, //
isUploading: false //
};
},
onLoad(option) {
@ -252,7 +258,7 @@
// 60
this.timer = setInterval(() => {
this.executeTask();
}, 60000);
}, 30000);
xBlufi.notifyConnectBle({
isStart: false,
deviceId: this.deviceId,
@ -277,6 +283,10 @@
console.log('清除定时器2');
}
},
//
beforeDestroy() {
clearTimeout(this.uploadTimer);
},
methods: {
//
btnkefu(){
@ -322,6 +332,7 @@
if(this.ver_dataflag != 3){
console.log('离线离线');
setTimeout(()=>{
console.log('11ly',this.ljflag);
if(this.ljflag == true){
this.ljflag = false
this.findDevice()
@ -368,6 +379,8 @@
if (!options.result) {
this.ver_dataflag = 1
console.log(this.ver_dataflag,'断开断开');
clearTimeout(this.uploadTimer) //
this.findDevice()
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
@ -387,10 +400,14 @@
})
this.deviceid = options.data.deviceId
this.name = this.name
}else{
this.ver_dataflag = 1
this.ljflag = true
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
console.log("1收到设备发来的自定义数据结果", options.data)
this.getlysj(options.data)
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
@ -402,9 +419,138 @@
break;
}
},
getlysj(data) {
if (!data) return;
// 1.
const dataStr = data.toString();
// console.log(':', dataStr);
const dataObj = {};
dataStr.split(',').forEach(part => {
const [key, value] = part.split(':').map(item => item.trim());
if (!key || value === undefined) return;
switch (key) {
case 'status': dataObj.status = value; break;
case 'bat': dataObj.bat = parseFloat(value); break;
case 'csq': dataObj.csq = parseInt(value); break;
case 'lat': dataObj.lat = parseFloat(value); break;
case 'lon': dataObj.lon = parseFloat(value); break;
case 'q': dataObj.q = parseInt(value); break;
case 's': dataObj.s = parseInt(value); break;
}
});
// 2.
uni.getLocation({
type: 'gcj02',
isHighAccuracy: true,
success: (res) => {
this.submitData({
...dataObj,
lon: res.longitude,
lat: res.latitude
});
},
fail: () => {
this.submitData({
...dataObj,
lon: 0,
lat: 0
});
}
});
},
// 3.
submitData(data) {
const payload = {
mac: this.mac,
sys: {
bat: Number(data.bat) || 0,
csq: Number(data.csq) || 0,
s: Number(data.s) ?? null,
q: Number(data.q) ?? null,
status: String(data.status || '0'),
lon: Number(data.lon) || 0,
lat: Number(data.lat) || 0
}
};
this.bluetoothData = payload
// console.log(':', payload);
this.throttledUpload()
// 4.
// this.$u.put('/app/device/iot/bltUpload', payload)
// .then(res => {
// if (res.code !== 200) throw new Error(res.msg);
// console.log('');
// })
// .catch(err => {
// console.error(':', err);
// // uni.showToast({ title: err.message, icon: 'none' });
// });
},
//
throttledUpload() {
const now = Date.now();
const throttleInterval = 10000; // 10
//
clearTimeout(this.uploadTimer);
// 10
if (now - this.lastUploadTime >= throttleInterval && !this.isUploading) {
this.doUpload();
} else {
//
const remainingTime = throttleInterval - (now - this.lastUploadTime);
this.uploadTimer = setTimeout(() => {
this.doUpload();
}, remainingTime);
}
},
//
doUpload() {
if (!this.bluetoothData || this.isUploading) return;
this.isUploading = true;
this.lastUploadTime = Date.now();
console.log(this.bluetoothData,'this.bluetoothDatathis.bluetoothData');
this.$u.put(`/app/device/iot/bltUpload`, this.bluetoothData)
.then(res => {
if(res.code == 200) {
console.log('上传蓝牙数据成功',this.bluetoothData, new Date().toLocaleTimeString());
} else {
console.log('上传蓝牙数据失败', res.msg);
}
})
.catch(err => {
console.error('上传异常:', err);
})
.finally(() => {
this.isUploading = false;
});
},
// and
btnqd() {
if (this.deivceobj.deviceLockStatus == 0) {
uni.getLocation({
type: 'gcj02', //
isHighAccuracy: true,
accuracy:'best',
success: (res) => {
console.log('精确坐标:', res);
this.lslat = res.latitude;
this.lslon = res.longitude;
},
fail: (err) => {
console.error('获取位置失败:', err);
this.lat = null
this.lon = null
}
})
let that = this
uni.showModal({
title: '提示',
@ -412,29 +558,81 @@
showCancel: true,
success: function(res) {
if (res.confirm) {
that.$u.put(`/app/order/openDevice?orderId=${that.deivceobj.orderId}`).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '解锁成功',
icon: 'success',
duration: 2000
})
that.deivceobj.deviceLockStatus = 1
that.getorderdevice()
} else if (res.code == 20001) {
console.log(that.ver_dataflag,'thatthat');
if (that.ver_dataflag == 3) {
xBlufi.notifySendCustomData({
customData: "11open@"
})
that.deivceobj.deviceLockStatus = 1
let flag = ''
if(that.ver_dataflag == 3){
flag = false
}else{
flag = true
}
that.$u.put(`/app/order/openDevice?orderId=${that.deivceobj.orderId}&lat=${that.lslat}&lon=${that.lslon}&requiredIot=${flag}`).then((res) => {
console.log(res,'0202020202');
if (res.code == 200 && res.data.db >= 1) {
if (res.data.iot == false) {
console.log(that.lslat,that.lslon,'临时解锁');
console.log(that.ver_dataflag,'thatthat');
if (that.ver_dataflag == 3) {
xBlufi.notifySendCustomData({
customData: "11open@"
})
that.deivceobj.deviceLockStatus = 1
let data = {
mac:that.mac,
reason:'解锁',
command:'close',
longitude:that.lslon,
latitude:that.lslat,
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {})
} else {
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
let data = {
mac:that.mac,
reason:'解锁',
command:'close',
longitude:that.lslon,
latitude:that.lslat,
result:'蓝牙未连接'
}
that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
})
}
} else {
uni.showToast({
title: '设备离线',
icon: 'none',
title: '解锁成功',
icon: 'success',
duration: 2000
})
that.deivceobj.deviceLockStatus = 1
that.getorderdevice()
}
} else if(res.code == 20001){
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
} else {
uni.showToast({
title: res.msg,
@ -450,46 +648,102 @@
})
} else if (this.deivceobj.deviceLockStatus == 1) {
uni.getLocation({
type: 'wgs84',
success: (res) => {
console.log(res);
this.lat = res.latitude
this.lon = res.longitude
},
fail: (err) => {
console.error('获取位置失败:', err)
}
type: 'gcj02', //
isHighAccuracy: true,
accuracy:'best',
success: (res) => {
console.log('精确坐标:', res);
this.lat = res.latitude
this.lon = res.longitude
},
fail: (err) => {
this.lat = null
this.lon = null
console.error('获取位置失败:', err);
}
})
let that = this
let flag = ''
if(that.ver_dataflag == 3){
flag = false
}else{
flag = true
}
uni.showModal({
title: '提示',
content: '您是否要临时锁车?',
showCancel: true,
success: function(res) {
if (res.confirm) {
that.$u.put(`/app/order/closeDevice?orderId=${that.deivceobj.orderId}&lat=${that.lat}&lon=${that.lon}`).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '临时锁车成功',
icon: 'success',
duration: 2000
})
that.deivceobj.deviceLockStatus = 0
that.getorderdevice()
} else if (res.code == 20001) {
console.log(that.ver_dataflag,'thatthat');
if (that.ver_dataflag == 3) {
xBlufi.notifySendCustomData({
customData: "11close@"
})
that.deivceobj.deviceLockStatus = 0
} else {
that.$u.put(`/app/order/closeDevice?orderId=${that.deivceobj.orderId}&lat=${that.lat}&lon=${that.lon}&requiredIot=${flag}`).then((res) => {
if (res.code == 200 && res.data.db >= 1) {
if(res.data.iot == false){
console.log(that.ver_dataflag,'thatthat');
if (that.ver_dataflag == 3) {
xBlufi.notifySendCustomData({
customData: "11llose@",
})
that.deivceobj.deviceLockStatus = 0
let data = {
mac:that.mac,
reason:'临时锁车',
command:'close',
longitude:that.lon,
latitude:that.lat,
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
console.log(res,'蓝牙');
})
} else {
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
let data = {
mac:that.mac,
reason:'临时锁车',
command:'close',
longitude:that.lon,
latitude:that.lat,
result:'蓝牙未连接'
}
that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
console.log(res,'蓝牙');
})
}
}else{
uni.showToast({
title: '设备离线',
icon: 'none',
title: '临时锁车成功',
icon: 'success',
duration: 2000
})
that.deivceobj.deviceLockStatus = 0
that.getorderdevice()
}
} else if(res.code == 20001){
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
} else {
uni.showToast({
title: res.msg,
@ -520,10 +774,18 @@
customData: "11play1@"
})
} else {
uni.showToast({
title: '设备离线',
icon: 'none',
duration: 2000
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
}
} else {
@ -543,10 +805,18 @@
url: '/page_user/huanbike?sn=' + this.deivceobj.deviceSn + '&orderid=' + this.deivceobj.orderId + '&deviceid=' + this.deviceid + '&devicename=' + this.devicename
})
}else{
uni.showToast({
title: "设备离线,暂不支持换车",
icon: 'none',
duration: 2000
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
}
}else{
@ -557,16 +827,16 @@
},
//
executeTask() {
this.counter++;
console.log(`定时执行第 ${this.counter}`, );
this.counter++
console.log(`定时执行第 ${this.counter}`, )
//
this.getorderdevice()
},
//
clearTimer() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
clearInterval(this.timer)
this.timer = null
}
},
//
@ -587,6 +857,7 @@
uni.getLocation({
type: 'gcj02', //
isHighAccuracy: true,
accuracy:'best',
success: (res) => {
console.log('精确坐标:', res);
this.lat = res.latitude;
@ -595,8 +866,9 @@
},
fail: (err) => {
console.error('获取位置失败:', err);
uni.showToast({ title: '定位失败,请重试', icon: 'none' });
this.getfeiyong(); //
this.lat = null
this.lon = null
this.getfeiyong() //
}
});
}
@ -661,10 +933,17 @@
gethuan() {
if(this.deivceobj.deviceOnlineStatus == 0){
if(this.ver_dataflag != 3){
uni.showToast({
title: '设备离线',
icon: 'success',
duration: 2000
uni.showModal({
title: '提示',
content: '设备未连接,请靠近车辆等待连接',
showCancel: false,
success: function(res) {
if (res.confirm) {
} else if (res.cancel) {
}
}
})
}else{
let that = this
@ -699,8 +978,24 @@
customData: "11close@"
})
setTimeout(()=>{
xBlufi.notifyConnectBle({
isStart: false,
deviceId: that.deviceId,
name: that.name
})
that.getorderdevice()
},1000)
let data = {
mac:that.mac,
reason:'还车',
command:'close',
longitude:that.lon,
latitude:that.lat,
result:'成功'
}
that.$u.post(`/app/commandLog/bluetooth`,data).then(res => {
console.log(res,'蓝牙')
})
}
}else if(res.msg == null) {
uni.hideLoading()
@ -751,10 +1046,15 @@
})
setTimeout(()=>{
that.getorderdevice()
xBlufi.notifyConnectBle({
isStart: false,
deviceId: that.deviceId,
name: that.name
})
},1000)
}else{
xBlufi.notifySendCustomData({
customData: "11close@"
customData: "11llose@"
})
setTimeout(()=>{
that.getorderdevice()
@ -948,25 +1248,25 @@
width: 252rpx;
height: 72rpx;
border-radius: 45rpx 45rpx 45rpx 45rpx;
border: 2rpx solid #808080;
font-weight: 600;
font-size: 32rpx;
color: #808080;
color: #fff;
text-align: center;
line-height: 72rpx;
background: #4C97E7;
}
.qx {
width: 252rpx;
height: 72rpx;
background: #4C97E7;
border-radius: 45rpx 45rpx 45rpx 45rpx;
text-align: center;
line-height: 72rpx;
box-sizing: border-box;
font-weight: 600;
font-size: 32rpx;
color: #FFFFFF;
color: #808080;
border: 2rpx solid #808080;
}
}
@ -1277,6 +1577,7 @@
.ljimg {
width: 60rpx;
height: 60rpx;
margin-right: 10rpx;
}
}
}