commit c25e282398453916525b674f1e89a039e403d624 Author: XuJiacheng Date: Thu Dec 11 09:50:02 2025 +0800 初始化 diff --git a/.cloudbase/container/debug.json b/.cloudbase/container/debug.json new file mode 100644 index 0000000..0d44458 --- /dev/null +++ b/.cloudbase/container/debug.json @@ -0,0 +1 @@ +{"containers":[],"config":{}} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14ea590 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Windows +[Dd]esktop.ini +Thumbs.db +$RECYCLE.BIN/ + +# macOS +.DS_Store +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes + +# Node.js +node_modules/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/SQL/日志表.sql b/SQL/日志表.sql new file mode 100644 index 0000000..0b30fd7 --- /dev/null +++ b/SQL/日志表.sql @@ -0,0 +1,83 @@ +--�������������ݿ�AuthorityDB sql +if Exists(select top 1 * from sysObjects where Id=OBJECT_ID(N'MACLogs') and xtype='U') + drop table MACLogs +go +create table MACLogs( +Id int identity(1,1), +HostsId int not null, +MAC nvarchar(50) null, +userid int not null, +location nvarchar(100) null, +Ip nvarchar(50) null, +ActionId INT null, +[type] int default 0, -- 0 ���� 1 ��� 2 ���İ� +CreateTime datetime default getdate()-- 0 ���� 1 ��� +) +go +--�������������ݿ�AuthorityDB sql +if Exists(select top 1 * from sysObjects where Id=OBJECT_ID(N'ErrorInfo') and xtype='U') + drop table ErrorInfo +go +create table ErrorInfo( +Id int identity(1,1), +HostsId int not null, +MAC nvarchar(50) null, +userid int not null, +[type] int default 0, -- 0 ���䱻�� 1 MAC���� +[status] int default 0,--�Ƿ��Ѿ����� 0 δ���� 1 �Ѿ����� +CreateTime datetime default getdate()-- ʱ�� +) +go + +select * from Hosts where id = 14939 + +SELECT * FROM MACLogs +if EXISTS(SELECT 1 FROM sys.views WHERE name='View_MAClog') +begin +drop view View_MAClog +end +go +create view View_MAClog +as +select m.*,u.[Uid] ,ht.Name,Hotelsid = ht.Id +from MACLogs m +left join Hotels ht on ht.id = m.HotelID +left join UserInfo u on u.id = m.userid +go +select *,CreateTime from MACLogs +SELECT * FROM View_MAClog +SELECT * FROM ErrorInfo --WHERE +SELECT * FROM UserInfo WHERE ID = 212 +--�� sql +select * from tb_Hosts where hotelid = 3 + +update tb_Hosts set MAC=MAC where MAC= '34-D0-B8-11-10-4D';update tb_Hosts set MAC='34-D0-B8-11-10-4D' where Id = 14810; +DECLARE @MAC int; +DECLARE @ID int; + --���� @MAC �µ�MAC @ID Ϊ��Ҫ����mac��id + begin tran + DECLARE @HostsId int; + DECLARE @oldmac nvarchar(50); + DECLARE @HostsIdoldmac nvarchar(50); + SET @HostsId = -1; + SET @oldmac = '-1'; + SET @HostsIdoldmac = '-1'; + SELECT TOP 1 @HostsId = id, @oldmac= MAC FROM tb_Hosts where MAC = @MAC + SELECT TOP 1 @HostsIdoldmac = MAC FROM tb_Hosts where Id = @ID and mac is not null and mac!='' + PRINT convert(varchar,@HostsId) +'&'+ @oldmac+'&'+@HostsIdoldmac + update tb_Hosts set MAC='' where id = @HostsId + update tb_Hosts set MAC=@MAC where Id = @ID + if @@ERROR>0 + begin + rollback tran + end + ELSE + BEGIN + COMMIT TRAN + END + + ; + + go + + select * from Hosts where Id = 14939 \ No newline at end of file diff --git a/app copy.js b/app copy.js new file mode 100644 index 0000000..0eff51e --- /dev/null +++ b/app copy.js @@ -0,0 +1,153 @@ +//app.js +import { + LoginToken +} from '/lib/RequestingCenter.js' +import { + Toastsuccess,ToastError +} from '/lib/Toast.js' +let sum = 0; +App({ + onLaunch: function() { + wx.removeStorage({ + key: 'oldHotelinfo', + }) + // 获取系统状态栏信息 + wx.getSystemInfo({ + success: e => { + this.globalData.StatusBar = e.statusBarHeight; + let capsule = wx.getMenuButtonBoundingClientRect(); + if (capsule) { + this.globalData.Custom = capsule; + this.globalData.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight; + } else { + this.globalData.CustomBar = e.statusBarHeight + 50; + } + } + }) + // 登录 + // this.userLogin(); + }, + globalData: { + ImgUrl : "https://auth.blv-oa.com/ImgServer/FileImage?url=ImgUrl&&ftp=11", + userinfo: null, + MapKey: '6JMBZ-BSAWP-D2NDJ-LFL4J-QJQQ3-3TBTV', + MapSk:'MHAGZ4S3aYeAD1pFoMTy6HAFL7nG18', + autho: null, + authotype:{ + no:1, + ok:3 + } + }, + toast:function(type,title,success,time){ + if(type==1){ + Toastsuccess(title,success,time) + } + if(type==2){ + ToastError(title,success,time) + } + // Toast(title,icon,success,time) + }, + //TOKEN登录 + userLogin:async function (back) { + let that = this; + // 读取本地信息尝试登录 + const xiaoxi_token = wx.getStorageSync('xiaoxi_token') || null + if (xiaoxi_token != null && xiaoxi_token!="") { + await LoginToken({ + token: xiaoxi_token + }).then(res => { + if(res.Status!=200){ + that.toast(2,res.Message||"网络繁忙",function () { + wx.reLaunch({ + url: "../login/login", + }) + }) + return; + } + res.Data.userinfo.error = res.Data.error + res.Data.userinfo.HeadImg = that.globalData.ImgUrl.replace("ImgUrl",res.Data.userinfo.HeadImg) + that.globalData.userinfo = res.Data.userinfo + that.globalData.autho = res.Data.autho + //由于这里是网络请求,可能会在 Page.onLoad 之后才返回 + // 所以此处加入 callback 以防止这种情况 + // if (that.checkLoginReadyCallback){ + // that.checkLoginReadyCallback(); + // } + wx.setStorageSync('xiaoxi_token', res.Data.token) + back(); + }, + err=>{ + that.toast(2,'网络繁忙',function () { + wx.reLaunch({ + url: "/pages/login/login", + }) + }) + } + ).catch( + err => { + console.log(err) + that.toast(2,'网络繁忙', ()=> { + wx.reLaunch({ + url: "/pages/login/login", + }) + }) + } + ); + } else { + wx.reLaunch({ + url: "/pages/login/login", + }) + } + }, + //检测授权信息 + SQ: function (back) { + let that = this; + wx.getSetting({ + success: (res) => { + // res.authSetting['scope.userLocation'] == undefined 表示 初始化进入该页面 + // res.authSetting['scope.userLocation'] == false 表示 非初始化进入该页面,且未授权 + // res.authSetting['scope.userLocation'] == true 表示 地理位置授权 + if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) { + //以前被拒绝授权指引用户授权 + wx.showModal({ + title: '请求授权当前位置', + content: '需要获取您的地理位置,请确认授权', + success: function (res) { + if (res.cancel) { + console.log('0') + back(false) + } else if (res.confirm) { + wx.openSetting({ + success: function (dataAu) { + if (dataAu.authSetting["scope.userLocation"] == true) { + back(true); + } else { + back(false) + } + } + }) + } + } + }) + } else if (res.authSetting['scope.userLocation'] == undefined) { + back(false) + } else { + // 已经授权 + back(true); + } + } + }) + }, + // 微信api,获取经纬度 + getLocation(back,err) { + wx.getLocation({ + type: 'gcj02', + success: (params) =>{ + back(); + }, + fail: (e) => { + err(); + } + }) + } +}) \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..3758242 --- /dev/null +++ b/app.js @@ -0,0 +1,208 @@ +//app.js +import { + LoginToken +} from '/lib/RequestingCenter.js' +import { + Toastsuccess,ToastError +} from '/lib/Toast.js' +let sum = 0; +App({ + onLaunch: function() { + wx.removeStorage({ + key: 'oldHotelinfo', + }) + // 获取系统状态栏信息 + wx.getSystemInfo({ + success: e => { + this.globalData.StatusBar = e.statusBarHeight; + let capsule = wx.getMenuButtonBoundingClientRect(); + if (capsule) { + this.globalData.Custom = capsule; + this.globalData.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight; + } else { + this.globalData.CustomBar = e.statusBarHeight + 50; + } + } + }) + // 登录 + // this.userLogin(); + }, + globalData: { + ImgUrl : "https://auth.blv-oa.com/ImgServer/FileImage?url=ImgUrl&&ftp=11", + userinfo: null, + MapKey: '6JMBZ-BSAWP-D2NDJ-LFL4J-QJQQ3-3TBTV', + MapSk:'MHAGZ4S3aYeAD1pFoMTy6HAFL7nG18', + autho: null, + authotype:{ + no:1, + ok:3 + }, + + roontypeList:[], + roomIDName:[], + roomName:[], + HotelId:-1, + CreateTime:null, + HotelCode:null, + }, + toast:function(type,title,success,time){ + if(type==1){ + Toastsuccess(title,success,time) + } + if(type==2){ + ToastError(title,success,time) + } + // Toast(title,icon,success,time) + }, + //TOKEN登录 + userLogin:async function (back) { + let that = this; + // 读取本地信息尝试登录 + const xiaoxi_token = wx.getStorageSync('xiaoxi_token') || null + if (xiaoxi_token != null && xiaoxi_token!="") { + await LoginToken({ + token: xiaoxi_token + }).then(res => { + if(res.Status!=200){ + that.toast(2,res.Message||"网络繁忙",function () { + wx.reLaunch({ + url: "../login/login", + }) + }) + return; + } + res.Data.userinfo.error = res.Data.error + res.Data.userinfo.HeadImg = that.globalData.ImgUrl.replace("ImgUrl",res.Data.userinfo.HeadImg) + that.globalData.userinfo = res.Data.userinfo + that.globalData.autho = res.Data.autho + //由于这里是网络请求,可能会在 Page.onLoad 之后才返回 + // 所以此处加入 callback 以防止这种情况 + // if (that.checkLoginReadyCallback){ + // that.checkLoginReadyCallback(); + // } + wx.setStorageSync('xiaoxi_token', res.Data.token) + back(); + }, + err=>{ + that.toast(2,'网络繁忙',function () { + wx.reLaunch({ + url: "/pages/login/login", + }) + }) + } + ).catch( + err => { + console.log(err) + that.toast(2,'网络繁忙', ()=> { + wx.reLaunch({ + url: "/pages/login/login", + }) + }) + } + ); + } else { + wx.reLaunch({ + url: "/pages/login/login", + }) + } + }, + //检测授权信息 + SQ: function (back) { + let that = this; + wx.getSetting({ + success: (res) => { + // res.authSetting['scope.userLocation'] == undefined 表示 初始化进入该页面 + // res.authSetting['scope.userLocation'] == false 表示 非初始化进入该页面,且未授权 + // res.authSetting['scope.userLocation'] == true 表示 地理位置授权 + if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) { + //以前被拒绝授权指引用户授权 + wx.showModal({ + title: '请求授权当前位置', + content: '需要获取您的地理位置,请确认授权', + success: function (res) { + if (res.cancel) { + console.log('0') + back(false) + } else if (res.confirm) { + wx.openSetting({ + success: function (dataAu) { + if (dataAu.authSetting["scope.userLocation"] == true) { + back(true); + } else { + back(false) + } + } + }) + } + } + }) + } else if (res.authSetting['scope.userLocation'] == undefined) { + back(false) + } else { + // 已经授权 + back(true); + } + } + }) + }, + + // 微信api,获取经纬度 + // wx.getFuzzyLocation + getFuzzyLocations(back,err) { + wx.getFuzzyLocation({ + type: 'wgs84', + success: (params) =>{ + back(); + }, + fail: (e) => { + err(); + } + }) + }, + + SetroontypeListindex: function (back){ + + this.globalData.roontypeList=back.Data + this.GetRoomIDNameArry() + // for (let index = 0; index < back.Data.length; index++) { + // //console.log( this.globalData.roontypeList.length) + // //console.log(back.Data[index].ROOM_TYPE_ID) + // //console.log( back.Data[index]) + // this.globalData.roontypeList[back.Data[index].ROOM_TYPE_ID]=back.Data[index] + // // console.log(res.Data[index].ROOM_TYPE_ID) + + // } + //console.log( this.globalData.roontypeList.length) + }, + GetroontypeListindex: function (){ + return this.globalData.roontypeList + }, + GetRoomIDNameArry(){ + var narr = [] + var narr3 = [] + let narr2 = [] + narr2=this.globalData.roontypeList + //debugger + for (let index = 0; index < this.globalData.roontypeList.length; index++) { + //console.log( this.globalData.roontypeList.length) + //console.log(back.Data[index].ROOM_TYPE_ID) + //console.log( back.Data[index]) + // narr[app.globalData.roontypeList[index].ROOM_TYPE_ID]=app.globalData.roontypeList[index] + // console.log(res.Data[index].ROOM_TYPE_ID) + // let rs = { + // id:narr2[index].ROOM_TYPE_ID, + // name:narr2[index].ROOM_TYPE_NAME + // } + let rs = narr2[index].ROOM_TYPE_OLD_ID + '|' + narr2[index].ROOM_TYPE_NAME + narr3.push(narr2[index].ROOM_TYPE_NAME) + narr.push(rs) + } + + this.globalData.roomIDName=narr + this.globalData.roomName=narr3 + //console.log(narr) + + + } + +}) \ No newline at end of file diff --git a/app.json b/app.json new file mode 100644 index 0000000..5553764 --- /dev/null +++ b/app.json @@ -0,0 +1,60 @@ +{ + "pages": [ + "pages/autho/index", + "pages/login/login", + "pages/index/index", + "pages/mycenter/index", + "pages/logs/logs", + "pages/NewHome/NewHome", + "pages/basics/MakingRounds/MakingRounds", + "pages/basics/MakingRounds/process/process", + "pages/basics/MakingRoundsAbnormal/MakingRoundsAbnormal", + "pages/basics/HostUpgrade/HostUpgrade", + "pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol" + ], + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "ColorUI", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + }, + "requiredPrivateInfos": [ + "getFuzzyLocation" + ], + "usingComponents": { + "cu-custom": "/colorui/components/cu-custom" + }, + "useExtendedLib": { + "weui": true + }, + "sitemapLocation": "sitemap.json", + "tabBar": { + "selectedColor": "#2bab99", + "list": [ + { + "pagePath": "pages/index/index", + "text": "首页", + "iconPath": "/icon/home_.png", + "selectedIconPath": "/icon/home.png" + }, + { + "pagePath": "pages/logs/logs", + "text": "操作日志", + "iconPath": "/icon/log_.png", + "selectedIconPath": "/icon/log.png" + }, + { + "pagePath": "pages/mycenter/index", + "text": "我的", + "iconPath": "/icon/usercenter_.png", + "selectedIconPath": "/icon/usercenter.png" + } + ] + }, + "permission": { + "scope.userFuzzyLocation": { + "desc": "你的位置信息将用于记录用户信息~" + } + } +} \ No newline at end of file diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..a458c1f --- /dev/null +++ b/app.wxss @@ -0,0 +1,124 @@ +@import "colorui/main.wxss"; +@import "colorui/icon.wxss"; + +.scrollPage { + height: 60vh; +} + +.nav-list { + display: flex; + flex-wrap: wrap; + padding: 0px 20rpx 0px; + justify-content: space-between; +} +.nav-list1 { + display: flex; + flex-wrap: wrap; + padding: 0px 10rpx 0px; + justify-content: flex-start; +} + +.nav-li { + padding: 30rpx; + border-radius: 12rpx; + width: 47%; + margin: 0 1% 40rpx; + background-image: url(https://image.weilanwl.com/color2.0/cardBg.png); + background-size: cover; + background-position: center; + position: relative; + z-index: 1; +} +.nav-li4 { + padding: 30rpx; + border-radius: 12rpx; + width: 32%; + margin: 0 5rpx 5rpx; + background-image: url(https://image.weilanwl.com/color2.0/cardBg.png); + background-size: cover; + background-position: center; + position: relative; + z-index: 1; +} + +.nav-li::after { + content: ""; + position: absolute; + z-index: -1; + background-color: inherit; + width: 100%; + height: 100%; + left: 0; + bottom: -10%; + border-radius: 10rpx; + opacity: 0.2; + transform: scale(0.9, 0.9); +} + +.nav-li.cur { + color: #fff; + background: rgb(94, 185, 94); + box-shadow: 4rpx 4rpx 6rpx rgba(94, 185, 94, 0.4); +} + +.nav-title { + font-size: 27rpx; + font-weight: 150; +} + +.nav-title::first-letter { + font-size: 40rpx; + margin-right: 4rpx; +} + +.nav-name { + font-size: 28rpx; + text-transform: Capitalize; + margin-top: 20rpx; + position: relative; +} + +.nav-name::before { + content: ""; + position: absolute; + display: block; + width: 40rpx; + height: 6rpx; + background: #fff; + bottom: 0; + right: 0; + opacity: 0.5; +} + +.nav-name::after { + content: ""; + position: absolute; + display: block; + width: 100rpx; + height: 1px; + background: #fff; + bottom: 0; + right: 10rpx; + opacity: 0.3; +} + +.nav-name::first-letter { + font-weight: bold; + font-size: 36rpx; + margin-right: 1px; +} + +.nav-li text { + position: absolute; + right: 30rpx; + top: 30rpx; + font-size: 52rpx; + width: 60rpx; + height: 10rpx; + text-align: center; + line-height: 10rpx; +} + +.text-light { + font-weight: 300; +} diff --git a/colorui/animation.wxss b/colorui/animation.wxss new file mode 100644 index 0000000..931bb51 --- /dev/null +++ b/colorui/animation.wxss @@ -0,0 +1,184 @@ +/* + Animation 微动画 + 基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28 + */ + +/* css 滤镜 控制黑白底色gif的 */ +.gif-black{ + mix-blend-mode: screen; +} +.gif-white{ + mix-blend-mode: multiply; +} + + +/* Animation css */ +[class*=animation-] { + animation-duration: .5s; + animation-timing-function: ease-out; + animation-fill-mode: both +} + +.animation-fade { + animation-name: fade; + animation-duration: .8s; + animation-timing-function: linear +} + +.animation-scale-up { + animation-name: scale-up +} + +.animation-scale-down { + animation-name: scale-down +} + +.animation-slide-top { + animation-name: slide-top +} + +.animation-slide-bottom { + animation-name: slide-bottom +} + +.animation-slide-left { + animation-name: slide-left +} + +.animation-slide-right { + animation-name: slide-right +} + +.animation-shake { + animation-name: shake +} + +.animation-reverse { + animation-direction: reverse +} + +@keyframes fade { + 0% { + opacity: 0 + } + + 100% { + opacity: 1 + } +} + +@keyframes scale-up { + 0% { + opacity: 0; + transform: scale(.2) + } + + 100% { + opacity: 1; + transform: scale(1) + } +} + +@keyframes scale-down { + 0% { + opacity: 0; + transform: scale(1.8) + } + + 100% { + opacity: 1; + transform: scale(1) + } +} + +@keyframes slide-top { + 0% { + opacity: 0; + transform: translateY(-100%) + } + + 100% { + opacity: 1; + transform: translateY(0) + } +} + +@keyframes slide-bottom { + 0% { + opacity: 0; + transform: translateY(100%) + } + + 100% { + opacity: 1; + transform: translateY(0) + } +} + +@keyframes shake { + + 0%, + 100% { + transform: translateX(0) + } + + 10% { + transform: translateX(-9px) + } + + 20% { + transform: translateX(8px) + } + + 30% { + transform: translateX(-7px) + } + + 40% { + transform: translateX(6px) + } + + 50% { + transform: translateX(-5px) + } + + 60% { + transform: translateX(4px) + } + + 70% { + transform: translateX(-3px) + } + + 80% { + transform: translateX(2px) + } + + 90% { + transform: translateX(-1px) + } +} + +@keyframes slide-left { + 0% { + opacity: 0; + transform: translateX(-100%) + } + + 100% { + opacity: 1; + transform: translateX(0) + } +} + +@keyframes slide-right { + 0% { + opacity: 0; + transform: translateX(100%) + } + + 100% { + opacity: 1; + transform: translateX(0) + } +} \ No newline at end of file diff --git a/colorui/components/cu-custom.js b/colorui/components/cu-custom.js new file mode 100644 index 0000000..7159ad8 --- /dev/null +++ b/colorui/components/cu-custom.js @@ -0,0 +1,54 @@ +const app = getApp(); +Component({ + /** + * 组件的一些选项 + */ + options: { + addGlobalClass: true, + multipleSlots: true + }, + /** + * 组件的对外属性 + */ + properties: { + bgColor: { + type: String, + default: '' + }, + isCustom: { + type: [Boolean, String], + default: false + }, + isBack: { + type: [Boolean, String], + default: false + }, + bgImage: { + type: String, + default: '' + }, + }, + /** + * 组件的初始数据 + */ + data: { + StatusBar: app.globalData.StatusBar, + CustomBar: app.globalData.CustomBar, + Custom: app.globalData.Custom + }, + /** + * 组件的方法列表 + */ + methods: { + BackPage() { + wx.navigateBack({ + delta: 1 + }); + }, + toHome(){ + wx.reLaunch({ + url: '/pages/index/index', + }) + } + } +}) \ No newline at end of file diff --git a/colorui/components/cu-custom.json b/colorui/components/cu-custom.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/colorui/components/cu-custom.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/colorui/components/cu-custom.wxml b/colorui/components/cu-custom.wxml new file mode 100644 index 0000000..c248d48 --- /dev/null +++ b/colorui/components/cu-custom.wxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/colorui/components/cu-custom.wxss b/colorui/components/cu-custom.wxss new file mode 100644 index 0000000..07675e2 --- /dev/null +++ b/colorui/components/cu-custom.wxss @@ -0,0 +1 @@ +/* colorui/components/cu-custom.wxss */ \ No newline at end of file diff --git a/colorui/icon.wxss b/colorui/icon.wxss new file mode 100644 index 0000000..e19a7bb --- /dev/null +++ b/colorui/icon.wxss @@ -0,0 +1,1226 @@ +@keyframes cuIcon-spin { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +.iconfont-spin { + -webkit-animation: cuIcon-spin 2s infinite linear; + animation: cuIcon-spin 2s infinite linear; + display: inline-block; +} + +.iconfont-pulse { + -webkit-animation: cuIcon-spin 1s infinite steps(8); + animation: cuIcon-spin 1s infinite steps(8); + display: inline-block; +} + +[class*="cuIcon-"] { + font-family: "cuIcon"; + font-size: inherit; + font-style: normal; +} + +@font-face { + font-family: "cuIcon"; + src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831'); + /* IE9*/ + src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'), + /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#iconfont') format('svg'); + /* iOS 4.1- */ +} + +.cuIcon-appreciate:before { + content: "\e644"; +} + +.cuIcon-check:before { + content: "\e645"; +} + +.cuIcon-close:before { + content: "\e646"; +} + +.cuIcon-edit:before { + content: "\e649"; +} + +.cuIcon-emoji:before { + content: "\e64a"; +} + +.cuIcon-favorfill:before { + content: "\e64b"; +} + +.cuIcon-favor:before { + content: "\e64c"; +} + +.cuIcon-loading:before { + content: "\e64f"; +} + +.cuIcon-locationfill:before { + content: "\e650"; +} + +.cuIcon-location:before { + content: "\e651"; +} + +.cuIcon-phone:before { + content: "\e652"; +} + +.cuIcon-roundcheckfill:before { + content: "\e656"; +} + +.cuIcon-roundcheck:before { + content: "\e657"; +} + +.cuIcon-roundclosefill:before { + content: "\e658"; +} + +.cuIcon-roundclose:before { + content: "\e659"; +} + +.cuIcon-roundrightfill:before { + content: "\e65a"; +} + +.cuIcon-roundright:before { + content: "\e65b"; +} + +.cuIcon-search:before { + content: "\e65c"; +} + +.cuIcon-taxi:before { + content: "\e65d"; +} + +.cuIcon-timefill:before { + content: "\e65e"; +} + +.cuIcon-time:before { + content: "\e65f"; +} + +.cuIcon-unfold:before { + content: "\e661"; +} + +.cuIcon-warnfill:before { + content: "\e662"; +} + +.cuIcon-warn:before { + content: "\e663"; +} + +.cuIcon-camerafill:before { + content: "\e664"; +} + +.cuIcon-camera:before { + content: "\e665"; +} + +.cuIcon-commentfill:before { + content: "\e666"; +} + +.cuIcon-comment:before { + content: "\e667"; +} + +.cuIcon-likefill:before { + content: "\e668"; +} + +.cuIcon-like:before { + content: "\e669"; +} + +.cuIcon-notificationfill:before { + content: "\e66a"; +} + +.cuIcon-notification:before { + content: "\e66b"; +} + +.cuIcon-order:before { + content: "\e66c"; +} + +.cuIcon-samefill:before { + content: "\e66d"; +} + +.cuIcon-same:before { + content: "\e66e"; +} + +.cuIcon-deliver:before { + content: "\e671"; +} + +.cuIcon-evaluate:before { + content: "\e672"; +} + +.cuIcon-pay:before { + content: "\e673"; +} + +.cuIcon-send:before { + content: "\e675"; +} + +.cuIcon-shop:before { + content: "\e676"; +} + +.cuIcon-ticket:before { + content: "\e677"; +} + +.cuIcon-back:before { + content: "\e679"; +} + +.cuIcon-cascades:before { + content: "\e67c"; +} + +.cuIcon-discover:before { + content: "\e67e"; +} + +.cuIcon-list:before { + content: "\e682"; +} + +.cuIcon-more:before { + content: "\e684"; +} + +.cuIcon-scan:before { + content: "\e689"; +} + +.cuIcon-settings:before { + content: "\e68a"; +} + +.cuIcon-questionfill:before { + content: "\e690"; +} + +.cuIcon-question:before { + content: "\e691"; +} + +.cuIcon-shopfill:before { + content: "\e697"; +} + +.cuIcon-form:before { + content: "\e699"; +} + +.cuIcon-pic:before { + content: "\e69b"; +} + +.cuIcon-filter:before { + content: "\e69c"; +} + +.cuIcon-footprint:before { + content: "\e69d"; +} + +.cuIcon-top:before { + content: "\e69e"; +} + +.cuIcon-pulldown:before { + content: "\e69f"; +} + +.cuIcon-pullup:before { + content: "\e6a0"; +} + +.cuIcon-right:before { + content: "\e6a3"; +} + +.cuIcon-refresh:before { + content: "\e6a4"; +} + +.cuIcon-moreandroid:before { + content: "\e6a5"; +} + +.cuIcon-deletefill:before { + content: "\e6a6"; +} + +.cuIcon-refund:before { + content: "\e6ac"; +} + +.cuIcon-cart:before { + content: "\e6af"; +} + +.cuIcon-qrcode:before { + content: "\e6b0"; +} + +.cuIcon-remind:before { + content: "\e6b2"; +} + +.cuIcon-delete:before { + content: "\e6b4"; +} + +.cuIcon-profile:before { + content: "\e6b7"; +} + +.cuIcon-home:before { + content: "\e6b8"; +} + +.cuIcon-cartfill:before { + content: "\e6b9"; +} + +.cuIcon-discoverfill:before { + content: "\e6ba"; +} + +.cuIcon-homefill:before { + content: "\e6bb"; +} + +.cuIcon-message:before { + content: "\e6bc"; +} + +.cuIcon-addressbook:before { + content: "\e6bd"; +} + +.cuIcon-link:before { + content: "\e6bf"; +} + +.cuIcon-lock:before { + content: "\e6c0"; +} + +.cuIcon-unlock:before { + content: "\e6c2"; +} + +.cuIcon-vip:before { + content: "\e6c3"; +} + +.cuIcon-weibo:before { + content: "\e6c4"; +} + +.cuIcon-activity:before { + content: "\e6c5"; +} + +.cuIcon-friendaddfill:before { + content: "\e6c9"; +} + +.cuIcon-friendadd:before { + content: "\e6ca"; +} + +.cuIcon-friendfamous:before { + content: "\e6cb"; +} + +.cuIcon-friend:before { + content: "\e6cc"; +} + +.cuIcon-goods:before { + content: "\e6cd"; +} + +.cuIcon-selection:before { + content: "\e6ce"; +} + +.cuIcon-explore:before { + content: "\e6d2"; +} + +.cuIcon-present:before { + content: "\e6d3"; +} + +.cuIcon-squarecheckfill:before { + content: "\e6d4"; +} + +.cuIcon-square:before { + content: "\e6d5"; +} + +.cuIcon-squarecheck:before { + content: "\e6d6"; +} + +.cuIcon-round:before { + content: "\e6d7"; +} + +.cuIcon-roundaddfill:before { + content: "\e6d8"; +} + +.cuIcon-roundadd:before { + content: "\e6d9"; +} + +.cuIcon-add:before { + content: "\e6da"; +} + +.cuIcon-notificationforbidfill:before { + content: "\e6db"; +} + +.cuIcon-explorefill:before { + content: "\e6dd"; +} + +.cuIcon-fold:before { + content: "\e6de"; +} + +.cuIcon-game:before { + content: "\e6df"; +} + +.cuIcon-redpacket:before { + content: "\e6e0"; +} + +.cuIcon-selectionfill:before { + content: "\e6e1"; +} + +.cuIcon-similar:before { + content: "\e6e2"; +} + +.cuIcon-appreciatefill:before { + content: "\e6e3"; +} + +.cuIcon-infofill:before { + content: "\e6e4"; +} + +.cuIcon-info:before { + content: "\e6e5"; +} + +.cuIcon-forwardfill:before { + content: "\e6ea"; +} + +.cuIcon-forward:before { + content: "\e6eb"; +} + +.cuIcon-rechargefill:before { + content: "\e6ec"; +} + +.cuIcon-recharge:before { + content: "\e6ed"; +} + +.cuIcon-vipcard:before { + content: "\e6ee"; +} + +.cuIcon-voice:before { + content: "\e6ef"; +} + +.cuIcon-voicefill:before { + content: "\e6f0"; +} + +.cuIcon-friendfavor:before { + content: "\e6f1"; +} + +.cuIcon-wifi:before { + content: "\e6f2"; +} + +.cuIcon-share:before { + content: "\e6f3"; +} + +.cuIcon-wefill:before { + content: "\e6f4"; +} + +.cuIcon-we:before { + content: "\e6f5"; +} + +.cuIcon-lightauto:before { + content: "\e6f6"; +} + +.cuIcon-lightforbid:before { + content: "\e6f7"; +} + +.cuIcon-lightfill:before { + content: "\e6f8"; +} + +.cuIcon-camerarotate:before { + content: "\e6f9"; +} + +.cuIcon-light:before { + content: "\e6fa"; +} + +.cuIcon-barcode:before { + content: "\e6fb"; +} + +.cuIcon-flashlightclose:before { + content: "\e6fc"; +} + +.cuIcon-flashlightopen:before { + content: "\e6fd"; +} + +.cuIcon-searchlist:before { + content: "\e6fe"; +} + +.cuIcon-service:before { + content: "\e6ff"; +} + +.cuIcon-sort:before { + content: "\e700"; +} + +.cuIcon-down:before { + content: "\e703"; +} + +.cuIcon-mobile:before { + content: "\e704"; +} + +.cuIcon-mobilefill:before { + content: "\e705"; +} + +.cuIcon-copy:before { + content: "\e706"; +} + +.cuIcon-countdownfill:before { + content: "\e707"; +} + +.cuIcon-countdown:before { + content: "\e708"; +} + +.cuIcon-noticefill:before { + content: "\e709"; +} + +.cuIcon-notice:before { + content: "\e70a"; +} + +.cuIcon-upstagefill:before { + content: "\e70e"; +} + +.cuIcon-upstage:before { + content: "\e70f"; +} + +.cuIcon-babyfill:before { + content: "\e710"; +} + +.cuIcon-baby:before { + content: "\e711"; +} + +.cuIcon-brandfill:before { + content: "\e712"; +} + +.cuIcon-brand:before { + content: "\e713"; +} + +.cuIcon-choicenessfill:before { + content: "\e714"; +} + +.cuIcon-choiceness:before { + content: "\e715"; +} + +.cuIcon-clothesfill:before { + content: "\e716"; +} + +.cuIcon-clothes:before { + content: "\e717"; +} + +.cuIcon-creativefill:before { + content: "\e718"; +} + +.cuIcon-creative:before { + content: "\e719"; +} + +.cuIcon-female:before { + content: "\e71a"; +} + +.cuIcon-keyboard:before { + content: "\e71b"; +} + +.cuIcon-male:before { + content: "\e71c"; +} + +.cuIcon-newfill:before { + content: "\e71d"; +} + +.cuIcon-new:before { + content: "\e71e"; +} + +.cuIcon-pullleft:before { + content: "\e71f"; +} + +.cuIcon-pullright:before { + content: "\e720"; +} + +.cuIcon-rankfill:before { + content: "\e721"; +} + +.cuIcon-rank:before { + content: "\e722"; +} + +.cuIcon-bad:before { + content: "\e723"; +} + +.cuIcon-cameraadd:before { + content: "\e724"; +} + +.cuIcon-focus:before { + content: "\e725"; +} + +.cuIcon-friendfill:before { + content: "\e726"; +} + +.cuIcon-cameraaddfill:before { + content: "\e727"; +} + +.cuIcon-apps:before { + content: "\e729"; +} + +.cuIcon-paintfill:before { + content: "\e72a"; +} + +.cuIcon-paint:before { + content: "\e72b"; +} + +.cuIcon-picfill:before { + content: "\e72c"; +} + +.cuIcon-refresharrow:before { + content: "\e72d"; +} + +.cuIcon-colorlens:before { + content: "\e6e6"; +} + +.cuIcon-markfill:before { + content: "\e730"; +} + +.cuIcon-mark:before { + content: "\e731"; +} + +.cuIcon-presentfill:before { + content: "\e732"; +} + +.cuIcon-repeal:before { + content: "\e733"; +} + +.cuIcon-album:before { + content: "\e734"; +} + +.cuIcon-peoplefill:before { + content: "\e735"; +} + +.cuIcon-people:before { + content: "\e736"; +} + +.cuIcon-servicefill:before { + content: "\e737"; +} + +.cuIcon-repair:before { + content: "\e738"; +} + +.cuIcon-file:before { + content: "\e739"; +} + +.cuIcon-repairfill:before { + content: "\e73a"; +} + +.cuIcon-taoxiaopu:before { + content: "\e73b"; +} + +.cuIcon-weixin:before { + content: "\e612"; +} + +.cuIcon-attentionfill:before { + content: "\e73c"; +} + +.cuIcon-attention:before { + content: "\e73d"; +} + +.cuIcon-commandfill:before { + content: "\e73e"; +} + +.cuIcon-command:before { + content: "\e73f"; +} + +.cuIcon-communityfill:before { + content: "\e740"; +} + +.cuIcon-community:before { + content: "\e741"; +} + +.cuIcon-read:before { + content: "\e742"; +} + +.cuIcon-calendar:before { + content: "\e74a"; +} + +.cuIcon-cut:before { + content: "\e74b"; +} + +.cuIcon-magic:before { + content: "\e74c"; +} + +.cuIcon-backwardfill:before { + content: "\e74d"; +} + +.cuIcon-playfill:before { + content: "\e74f"; +} + +.cuIcon-stop:before { + content: "\e750"; +} + +.cuIcon-tagfill:before { + content: "\e751"; +} + +.cuIcon-tag:before { + content: "\e752"; +} + +.cuIcon-group:before { + content: "\e753"; +} + +.cuIcon-all:before { + content: "\e755"; +} + +.cuIcon-backdelete:before { + content: "\e756"; +} + +.cuIcon-hotfill:before { + content: "\e757"; +} + +.cuIcon-hot:before { + content: "\e758"; +} + +.cuIcon-post:before { + content: "\e759"; +} + +.cuIcon-radiobox:before { + content: "\e75b"; +} + +.cuIcon-rounddown:before { + content: "\e75c"; +} + +.cuIcon-upload:before { + content: "\e75d"; +} + +.cuIcon-writefill:before { + content: "\e760"; +} + +.cuIcon-write:before { + content: "\e761"; +} + +.cuIcon-radioboxfill:before { + content: "\e763"; +} + +.cuIcon-punch:before { + content: "\e764"; +} + +.cuIcon-shake:before { + content: "\e765"; +} + +.cuIcon-move:before { + content: "\e768"; +} + +.cuIcon-safe:before { + content: "\e769"; +} + +.cuIcon-activityfill:before { + content: "\e775"; +} + +.cuIcon-crownfill:before { + content: "\e776"; +} + +.cuIcon-crown:before { + content: "\e777"; +} + +.cuIcon-goodsfill:before { + content: "\e778"; +} + +.cuIcon-messagefill:before { + content: "\e779"; +} + +.cuIcon-profilefill:before { + content: "\e77a"; +} + +.cuIcon-sound:before { + content: "\e77b"; +} + +.cuIcon-sponsorfill:before { + content: "\e77c"; +} + +.cuIcon-sponsor:before { + content: "\e77d"; +} + +.cuIcon-upblock:before { + content: "\e77e"; +} + +.cuIcon-weblock:before { + content: "\e77f"; +} + +.cuIcon-weunblock:before { + content: "\e780"; +} + +.cuIcon-my:before { + content: "\e78b"; +} + +.cuIcon-myfill:before { + content: "\e78c"; +} + +.cuIcon-emojifill:before { + content: "\e78d"; +} + +.cuIcon-emojiflashfill:before { + content: "\e78e"; +} + +.cuIcon-flashbuyfill:before { + content: "\e78f"; +} + +.cuIcon-text:before { + content: "\e791"; +} + +.cuIcon-goodsfavor:before { + content: "\e794"; +} + +.cuIcon-musicfill:before { + content: "\e795"; +} + +.cuIcon-musicforbidfill:before { + content: "\e796"; +} + +.cuIcon-card:before { + content: "\e624"; +} + +.cuIcon-triangledownfill:before { + content: "\e79b"; +} + +.cuIcon-triangleupfill:before { + content: "\e79c"; +} + +.cuIcon-roundleftfill-copy:before { + content: "\e79e"; +} + +.cuIcon-font:before { + content: "\e76a"; +} + +.cuIcon-title:before { + content: "\e82f"; +} + +.cuIcon-recordfill:before { + content: "\e7a4"; +} + +.cuIcon-record:before { + content: "\e7a6"; +} + +.cuIcon-cardboardfill:before { + content: "\e7a9"; +} + +.cuIcon-cardboard:before { + content: "\e7aa"; +} + +.cuIcon-formfill:before { + content: "\e7ab"; +} + +.cuIcon-coin:before { + content: "\e7ac"; +} + +.cuIcon-cardboardforbid:before { + content: "\e7af"; +} + +.cuIcon-circlefill:before { + content: "\e7b0"; +} + +.cuIcon-circle:before { + content: "\e7b1"; +} + +.cuIcon-attentionforbid:before { + content: "\e7b2"; +} + +.cuIcon-attentionforbidfill:before { + content: "\e7b3"; +} + +.cuIcon-attentionfavorfill:before { + content: "\e7b4"; +} + +.cuIcon-attentionfavor:before { + content: "\e7b5"; +} + +.cuIcon-titles:before { + content: "\e701"; +} + +.cuIcon-icloading:before { + content: "\e67a"; +} + +.cuIcon-full:before { + content: "\e7bc"; +} + +.cuIcon-mail:before { + content: "\e7bd"; +} + +.cuIcon-peoplelist:before { + content: "\e7be"; +} + +.cuIcon-goodsnewfill:before { + content: "\e7bf"; +} + +.cuIcon-goodsnew:before { + content: "\e7c0"; +} + +.cuIcon-medalfill:before { + content: "\e7c1"; +} + +.cuIcon-medal:before { + content: "\e7c2"; +} + +.cuIcon-newsfill:before { + content: "\e7c3"; +} + +.cuIcon-newshotfill:before { + content: "\e7c4"; +} + +.cuIcon-newshot:before { + content: "\e7c5"; +} + +.cuIcon-news:before { + content: "\e7c6"; +} + +.cuIcon-videofill:before { + content: "\e7c7"; +} + +.cuIcon-video:before { + content: "\e7c8"; +} + +.cuIcon-exit:before { + content: "\e7cb"; +} + +.cuIcon-skinfill:before { + content: "\e7cc"; +} + +.cuIcon-skin:before { + content: "\e7cd"; +} + +.cuIcon-moneybagfill:before { + content: "\e7ce"; +} + +.cuIcon-usefullfill:before { + content: "\e7cf"; +} + +.cuIcon-usefull:before { + content: "\e7d0"; +} + +.cuIcon-moneybag:before { + content: "\e7d1"; +} + +.cuIcon-redpacket_fill:before { + content: "\e7d3"; +} + +.cuIcon-subscription:before { + content: "\e7d4"; +} + +.cuIcon-loading1:before { + content: "\e633"; +} + +.cuIcon-github:before { + content: "\e692"; +} + +.cuIcon-global:before { + content: "\e7eb"; +} + +.cuIcon-settingsfill:before { + content: "\e6ab"; +} + +.cuIcon-back_android:before { + content: "\e7ed"; +} + +.cuIcon-expressman:before { + content: "\e7ef"; +} + +.cuIcon-evaluate_fill:before { + content: "\e7f0"; +} + +.cuIcon-group_fill:before { + content: "\e7f5"; +} + +.cuIcon-play_forward_fill:before { + content: "\e7f6"; +} + +.cuIcon-deliver_fill:before { + content: "\e7f7"; +} + +.cuIcon-notice_forbid_fill:before { + content: "\e7f8"; +} + +.cuIcon-fork:before { + content: "\e60c"; +} + +.cuIcon-pick:before { + content: "\e7fa"; +} + +.cuIcon-wenzi:before { + content: "\e6a7"; +} + +.cuIcon-ellipse:before { + content: "\e600"; +} + +.cuIcon-qr_code:before { + content: "\e61b"; +} + +.cuIcon-dianhua:before { + content: "\e64d"; +} + +.cuIcon-icon:before { + content: "\e602"; +} + +.cuIcon-loading2:before { + content: "\e7f1"; +} + +.cuIcon-btn:before { + content: "\e601"; +} diff --git a/colorui/main.wxss b/colorui/main.wxss new file mode 100644 index 0000000..fef3f65 --- /dev/null +++ b/colorui/main.wxss @@ -0,0 +1,4054 @@ +/* + ColorUi for MP-weixin v2.1.4 | by 文晓港 2019年4月25日19:15:42 + 仅供学习交流,如作它用所承受的法律责任一概与作者无关 + 使用ColorUi开发扩展与插件时,请注明基于ColorUi开发 + + (QQ交流群:240787041) +*/ + +/* ================== + 初始化 + ==================== */ +page { + /* Color 可以自定义相关配色 */ + /* var属性兼容性 --> https://www.caniuse.com/#feat=css-variables */ + /* 标准色 */ + --red: #e54d42; + --orange: #f37b1d; + --yellow: #fbbd08; + --olive: #8dc63f; + --green: #39b54a; + --cyan: #1cbbb4; + --blue: #0081ff; + --purple: #6739b6; + --mauve: #9c26b0; + --pink: #e03997; + --brown: #a5673f; + --grey: #8799a3; + --black: #333333; + --darkGray: #414040; + --gray: #aaaaaa; + --ghostWhite: #f1f1f1; + --white: #ffffff; + /* 浅色 */ + --grayLight: #b5bbc4; + --redLight: #bdbdbd; + --orangeLight: #fde6d2; + --yellowLight: #fef2ce; + --oliveLight: #e8f4d9; + --greenLight: #d7f0db; + --cyanLight: #d2f1f0; + --blueLight: #cce6ff; + --purpleLight: #e1d7f0; + --mauveLight: #ebd4ef; + --pinkLight: #f9d7ea; + --brownLight: #ede1d9; + --greyLight: #e7ebed; + /* 渐变色 */ + --gradualRed: linear-gradient(45deg, #f43f3b, #ec008c); + --gradualOrange: linear-gradient(45deg, #ff9700, #ed1c24); + --gradualGreen: linear-gradient(45deg, #39b54a, #8dc63f); + --gradualPurple: linear-gradient(45deg, #9000ff, #5e00ff); + --gradualPink: linear-gradient(45deg, #ec008c, #6739b6); + --gradualBlue: linear-gradient(45deg, #0081ff, #1cbbb4); + /* 阴影透明色 */ + --ShadowSize: 6rpx 6rpx 8rpx; + --redShadow: rgba(204, 69, 59, 0.2); + --orangeShadow: rgba(217, 109, 26, 0.2); + --yellowShadow: rgba(224, 170, 7, 0.2); + --oliveShadow: rgba(124, 173, 55, 0.2); + --greenShadow: rgba(48, 156, 63, 0.2); + --cyanShadow: rgba(28, 187, 180, 0.2); + --blueShadow: rgba(0, 102, 204, 0.2); + --purpleShadow: rgba(88, 48, 156, 0.2); + --mauveShadow: rgba(133, 33, 150, 0.2); + --pinkShadow: rgba(199, 50, 134, 0.2); + --brownShadow: rgba(140, 88, 53, 0.2); + --greyShadow: rgba(114, 130, 138, 0.2); + --grayShadow: rgba(114, 130, 138, 0.2); + --blackShadow: rgba(26, 26, 26, 0.2); + + background-color: var(--ghostWhite); + font-size: 28rpx; + color: var(--black); + font-family: Helvetica Neue, Helvetica, sans-serif; +} + +view, +scroll-view, +swiper, +button, +input, +textarea, +label, +navigator, +image { + box-sizing: border-box; +} + +.round { + border-radius: 5000rpx; +} + +.radius { + border-radius: 6rpx; +} + +/* ================== + 图片 + ==================== */ + +image { + max-width: 100%; + display: inline-block; + position: relative; + z-index: 0; +} + +image.loading::before { + content: ""; + background-color: #f5f5f5; + display: block; + position: absolute; + width: 100%; + height: 100%; + z-index: -2; +} + +image.loading::after { + content: "\e7f1"; + font-family: "cuIcon"; + position: absolute; + top: 0; + left: 0; + width: 32rpx; + height: 32rpx; + line-height: 32rpx; + right: 0; + bottom: 0; + z-index: -1; + font-size: 32rpx; + margin: auto; + color: #ccc; + -webkit-animation: cuIcon-spin 2s infinite linear; + animation: cuIcon-spin 2s infinite linear; + display: block; +} + +.response { + width: 100%; +} + +/* ================== + 开关 + ==================== */ + +switch, +checkbox, +radio { + position: relative; +} + +switch::after, +switch::before { + font-family: "cuIcon"; + content: "\e645"; + position: absolute; + color: var(--white) !important; + top: 0%; + left: 0rpx; + font-size: 26rpx; + line-height: 26px; + width: 50%; + text-align: center; + pointer-events: none; + transform: scale(0, 0); + transition: all 0.3s ease-in-out 0s; + z-index: 9; + bottom: 0; + height: 26px; + margin: auto; +} + +switch::before { + content: "\e646"; + right: 0; + transform: scale(1, 1); + left: auto; +} + +switch[checked]::after, +switch.checked::after { + transform: scale(1, 1); +} + +switch[checked]::before, +switch.checked::before { + transform: scale(0, 0); +} + +switch[checked]::before { + transform: scale(0, 0); +} + +radio::before, +checkbox::before { + font-family: "cuIcon"; + content: "\e645"; + position: absolute; + color: var(--white) !important; + top: 50%; + margin-top: -8px; + right: 5px; + font-size: 32rpx; + line-height: 16px; + pointer-events: none; + transform: scale(1, 1); + transition: all 0.3s ease-in-out 0s; + z-index: 9; +} + +radio .wx-radio-input, +checkbox .wx-checkbox-input { + margin: 0; + width: 24px; + height: 24px; +} + +checkbox.round .wx-checkbox-input { + border-radius: 100rpx; +} + +switch .wx-switch-input { + border: none; + padding: 0 24px; + width: 48px; + height: 26px; + margin: 0; + border-radius: 100rpx; +} + +switch .wx-switch-input:not([class*="bg-"]) { + background: var(--grey) !important; +} + +switch .wx-switch-input::after { + margin: auto; + width: 26px; + height: 26px; + border-radius: 100rpx; + left: 0rpx; + top: 0rpx; + bottom: 0rpx; + position: absolute; + transform: scale(0.9, 0.9); + transition: all 0.1s ease-in-out 0s; +} + +switch .wx-switch-input.wx-switch-input-checked::after { + margin: auto; + left: 22px; + box-shadow: none; + transform: scale(0.9, 0.9); +} + +radio-group { + display: inline-block; +} + + + +switch.radius .wx-switch-input::after, +switch.radius .wx-switch-input, +switch.radius .wx-switch-input::before { + border-radius: 10rpx; +} + +switch .wx-switch-input::before, +radio.radio::before, +checkbox .wx-checkbox-input::before, +radio .wx-radio-input::before, +radio.radio::before { + display: none; +} + +radio.radio[checked]::after { + content: ""; + background-color: transparent; + display: block; + position: absolute; + width: 8px; + height: 8px; + z-index: 999; + top: 0rpx; + left: 0rpx; + right: 0; + bottom: 0; + margin: auto; + border-radius: 200rpx; + border: 8px solid var(--white) !important; +} + +.switch-sex::after { + content: "\e71c"; +} + +.switch-sex::before { + content: "\e71a"; +} + +.switch-sex .wx-switch-input { + background: var(--red) !important; + border-color: var(--red) !important; +} + +.switch-sex[checked] .wx-switch-input { + background: var(--blue) !important; + border-color: var(--blue) !important; +} + +switch.red[checked] .wx-switch-input, +checkbox.red[checked] .wx-checkbox-input, +radio.red[checked] .wx-radio-input { + border-color: var(--red) !important; +} + +switch.orange[checked] .wx-switch-input, +checkbox.orange[checked] .wx-checkbox-input, +radio.orange[checked] .wx-radio-input { + border-color: var(--orange) !important; +} + +switch.yellow[checked] .wx-switch-input, +checkbox.yellow[checked] .wx-checkbox-input, +radio.yellow[checked] .wx-radio-input { + border-color: var(--yellow) !important; +} + +switch.olive[checked] .wx-switch-input, +checkbox.olive[checked] .wx-checkbox-input, +radio.olive[checked] .wx-radio-input { + border-color: var(--olive) !important; +} + +switch.green[checked] .wx-switch-input, +checkbox.green[checked] .wx-checkbox-input, +checkbox[checked] .wx-checkbox-input, +radio.green[checked] .wx-radio-input { + border-color: var(--green) !important; +} + +switch.cyan[checked] .wx-switch-input, +checkbox.cyan[checked] .wx-checkbox-input, +radio.cyan[checked] .wx-radio-input { + border-color: var(--cyan) !important; +} + +switch.blue[checked] .wx-switch-input, +checkbox.blue[checked] .wx-checkbox-input, +radio.blue[checked] .wx-radio-input { + border-color: var(--blue) !important; +} + +switch.purple[checked] .wx-switch-input, +checkbox.purple[checked] .wx-checkbox-input, +radio.purple[checked] .wx-radio-input { + border-color: var(--purple) !important; +} + +switch.mauve[checked] .wx-switch-input, +checkbox.mauve[checked] .wx-checkbox-input, +radio.mauve[checked] .wx-radio-input { + border-color: var(--mauve) !important; +} + +switch.pink[checked] .wx-switch-input, +checkbox.pink[checked] .wx-checkbox-input, +radio.pink[checked] .wx-radio-input { + border-color: var(--pink) !important; +} + +switch.brown[checked] .wx-switch-input, +checkbox.brown[checked] .wx-checkbox-input, +radio.brown[checked] .wx-radio-input { + border-color: var(--brown) !important; +} + +switch.grey[checked] .wx-switch-input, +checkbox.grey[checked] .wx-checkbox-input, +radio.grey[checked] .wx-radio-input { + border-color: var(--grey) !important; +} + +switch.gray[checked] .wx-switch-input, +checkbox.gray[checked] .wx-checkbox-input, +radio.gray[checked] .wx-radio-input { + border-color: var(--grey) !important; +} + +switch.black[checked] .wx-switch-input, +checkbox.black[checked] .wx-checkbox-input, +radio.black[checked] .wx-radio-input { + border-color: var(--black) !important; +} + +switch.white[checked] .wx-switch-input, +checkbox.white[checked] .wx-checkbox-input, +radio.white[checked] .wx-radio-input { + border-color: var(--white) !important; +} + +switch.red[checked] .wx-switch-input.wx-switch-input-checked, +checkbox.red[checked] .wx-checkbox-input, +radio.red[checked] .wx-radio-input { + background-color: var(--red) !important; + color: var(--white) !important; +} + +switch.orange[checked] .wx-switch-input, +checkbox.orange[checked] .wx-checkbox-input, +radio.orange[checked] .wx-radio-input { + background-color: var(--orange) !important; + color: var(--white) !important; +} + +switch.yellow[checked] .wx-switch-input, +checkbox.yellow[checked] .wx-checkbox-input, +radio.yellow[checked] .wx-radio-input { + background-color: var(--yellow) !important; + color: var(--black) !important; +} + +switch.olive[checked] .wx-switch-input, +checkbox.olive[checked] .wx-checkbox-input, +radio.olive[checked] .wx-radio-input { + background-color: var(--olive) !important; + color: var(--white) !important; +} + +switch.green[checked] .wx-switch-input, +switch[checked] .wx-switch-input, +checkbox.green[checked] .wx-checkbox-input, +checkbox[checked] .wx-checkbox-input, +radio.green[checked] .wx-radio-input, +radio[checked] .wx-radio-input { + background-color: var(--green) !important; + color: var(--white) !important; +} + +switch.cyan[checked] .wx-switch-input, +checkbox.cyan[checked] .wx-checkbox-input, +radio.cyan[checked] .wx-radio-input { + background-color: var(--cyan) !important; + color: var(--white) !important; +} + +switch.blue[checked] .wx-switch-input, +checkbox.blue[checked] .wx-checkbox-input, +radio.blue[checked] .wx-radio-input { + background-color: var(--blue) !important; + color: var(--white) !important; +} + +switch.purple[checked] .wx-switch-input, +checkbox.purple[checked] .wx-checkbox-input, +radio.purple[checked] .wx-radio-input { + background-color: var(--purple) !important; + color: var(--white) !important; +} + +switch.mauve[checked] .wx-switch-input, +checkbox.mauve[checked] .wx-checkbox-input, +radio.mauve[checked] .wx-radio-input { + background-color: var(--mauve) !important; + color: var(--white) !important; +} + +switch.pink[checked] .wx-switch-input, +checkbox.pink[checked] .wx-checkbox-input, +radio.pink[checked] .wx-radio-input { + background-color: var(--pink) !important; + color: var(--white) !important; +} + +switch.brown[checked] .wx-switch-input, +checkbox.brown[checked] .wx-checkbox-input, +radio.brown[checked] .wx-radio-input { + background-color: var(--brown) !important; + color: var(--white) !important; +} + +switch.grey[checked] .wx-switch-input, +checkbox.grey[checked] .wx-checkbox-input, +radio.grey[checked] .wx-radio-input { + background-color: var(--grey) !important; + color: var(--white) !important; +} + +switch.gray[checked] .wx-switch-input, +checkbox.gray[checked] .wx-checkbox-input, +radio.gray[checked] .wx-radio-input { + background-color: #f0f0f0 !important; + color: var(--black) !important; +} + +switch.black[checked] .wx-switch-input, +checkbox.black[checked] .wx-checkbox-input, +radio.black[checked] .wx-radio-input { + background-color: var(--black) !important; + color: var(--white) !important; +} + +switch.white[checked] .wx-switch-input, +checkbox.white[checked] .wx-checkbox-input, +radio.white[checked] .wx-radio-input { + background-color: var(--white) !important; + color: var(--black) !important; +} + +/* ================== + 边框 + ==================== */ + +/* -- 实线 -- */ + +.solid, +.solid-top, +.solid-right, +.solid-bottom, +.solid-left, +.solids, +.solids-top, +.solids-right, +.solids-bottom, +.solids-left, +.dashed, +.dashed-top, +.dashed-right, +.dashed-bottom, +.dashed-left { + position: relative; +} + +.solid::after, +.solid-top::after, +.solid-right::after, +.solid-bottom::after, +.solid-left::after, +.solids::after, +.solids-top::after, +.solids-right::after, +.solids-bottom::after, +.solids-left::after, +.dashed::after, +.dashed-top::after, +.dashed-right::after, +.dashed-bottom::after, +.dashed-left::after { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + border-radius: inherit; + transform: scale(0.5); + transform-origin: 0 0; + pointer-events: none; + box-sizing: border-box; +} + +.solid::after { + border: 1rpx solid rgba(0, 0, 0, 0.1); +} + +.solid-top::after { + border-top: 1rpx solid rgba(0, 0, 0, 0.1); +} + +.solid-right::after { + border-right: 1rpx solid rgba(0, 0, 0, 0.1); +} + +.solid-bottom::after { + border-bottom: 1rpx solid rgba(0, 0, 0, 0.1); +} + +.solid-left::after { + border-left: 1rpx solid rgba(0, 0, 0, 0.1); +} + +.solids::after { + border: 8rpx solid #eee; +} + +.solids-top::after { + border-top: 8rpx solid #eee; +} + +.solids-right::after { + border-right: 8rpx solid #eee; +} + +.solids-bottom::after { + border-bottom: 8rpx solid #eee; +} + +.solids-left::after { + border-left: 8rpx solid #eee; +} + +/* -- 虚线 -- */ + +.dashed::after { + border: 1rpx dashed #ddd; +} + +.dashed-top::after { + border-top: 1rpx dashed #ddd; +} + +.dashed-right::after { + border-right: 1rpx dashed #ddd; +} + +.dashed-bottom::after { + border-bottom: 1rpx dashed #ddd; +} + +.dashed-left::after { + border-left: 1rpx dashed #ddd; +} + +/* -- 阴影 -- */ + +.shadow[class*='white'] { + --ShadowSize: 0 1rpx 6rpx; +} + +.shadow-lg { + --ShadowSize: 0rpx 40rpx 100rpx 0rpx; +} + +.shadow-warp { + position: relative; + box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.1); +} + +.shadow-warp:before, +.shadow-warp:after { + position: absolute; + content: ""; + top: 20rpx; + bottom: 30rpx; + left: 20rpx; + width: 50%; + box-shadow: 0 30rpx 20rpx rgba(0, 0, 0, 0.2); + transform: rotate(-3deg); + z-index: -1; +} + +.shadow-warp:after { + right: 20rpx; + left: auto; + transform: rotate(3deg); +} + +.shadow-blur { + position: relative; +} + +.shadow-blur::before { + content: ""; + display: block; + background: inherit; + filter: blur(10rpx); + position: absolute; + width: 100%; + height: 100%; + top: 10rpx; + left: 10rpx; + z-index: -1; + opacity: 0.4; + transform-origin: 0 0; + border-radius: inherit; + transform: scale(1, 1); +} + +/* ================== + 按钮 + ==================== */ + +.cu-btn { + position: relative; + border: 0rpx; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 0 20rpx; + font-size: 20rpx; + height: 64rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} + +.cu-btn::after { + display: none; +} + +.cu-btn:not([class*="bg-"]) { + background-color: #f0f0f0; +} + +.cu-btn[class*="line"] { + background-color: transparent; +} + +.cu-btn[class*="line"]::after { + content: " "; + display: block; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + border: 1rpx solid currentColor; + transform: scale(0.5); + transform-origin: 0 0; + box-sizing: border-box; + border-radius: 12rpx; + z-index: 1; + pointer-events: none; +} + +.cu-btn.round[class*="line"]::after { + border-radius: 1000rpx; +} +.cu-btn.round1[class*="line"]::after { + border-radius: 10rpx; +} + +.cu-btn[class*="lines"]::after { + border: 6rpx solid currentColor; +} + +.cu-btn[class*="bg-"]::after { + display: none; +} + +.cu-btn.sm { + padding: 0 20rpx; + font-size: 20rpx; + height: 48rpx; +} +.cu-btn.nlg { + padding: 0 30rpx; + font-size:26rpx; + height: 60rpx; + +} + +.cu-btn.Elg { + padding: 0 5rpx; + font-size:28rpx; + height: 80rpx; + width: 150rpx; +} +.cu-btn.EElg { + padding: 0 5rpx; + font-size:28rpx; + height: 80rpx; + width: 90rpx; +} +.cu-btn.ulg { + padding: 0 30rpx; + font-size:26rpx; + height: 80rpx; +} +.cu-btn.clg { + padding: 0 30rpx; + font-size:26rpx; + height: 80rpx; + width: 150rpx; +} +.cu-btn.vlg { + padding: 0 30rpx; + font-size:28rpx; + height: 80rpx; + width: 170rpx; +} +.cu-btn.vvlg { + padding: 0 30rpx; + font-size:28rpx; + height: 80rpx; + width: 70rpx; +} +.cu-btn.lg { + padding: 0 40rpx; + font-size: 32rpx; + height: 80rpx; +} + +.cu-btn.icon.sm { + width: 48rpx; + height: 48rpx; +} + +.cu-btn.icon { + width: 64rpx; + height: 64rpx; + border-radius: 500rpx; + padding: 0; +} + +button.icon.lg { + width: 80rpx; + height: 80rpx; +} + +.cu-btn.shadow-blur::before { + top: 4rpx; + left: 4rpx; + filter: blur(6rpx); + opacity: 0.6; +} + +.cu-btn.button-hover { + transform: translate(1rpx, 1rpx); +} + +.block { + display: block; +} + +.cu-btn.block { + display: flex; +} + +.cu-btn[disabled] { + opacity: 0.6; + color: var(--white); +} + +/* ================== + 徽章 + ==================== */ + +.cu-tag { + font-size: 32rpx; + vertical-align: middle; + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 0rpx 0rpx; + height: 50rpx; + font-family: Helvetica Neue, Helvetica, sans-serif; + white-space: nowrap; +} + +.cu-tag:not([class*="bg"]):not([class*="line"]) { + background-color: var(--ghostWhite); +} + +.cu-tag[class*="line-"]::after { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + border: 1rpx solid currentColor; + transform: scale(0.5); + transform-origin: 0 0; + box-sizing: border-box; + border-radius: inherit; + z-index: 1; + pointer-events: none; +} + +.cu-tag.radius[class*="line"]::after { + border-radius: 12rpx; +} + +.cu-tag.round[class*="line"]::after { + border-radius: 1000rpx; +} + +.cu-tag[class*="line-"]::after { + border-radius: 0; +} + +.cu-tag+.cu-tag { + margin-left: 10rpx; +} + +.cu-tag.sm { + font-size: 20rpx; + padding: 0rpx 12rpx; + height: 32rpx; +} + +.cu-capsule { + display: inline-flex; + vertical-align: middle; +} + +.cu-capsule+.cu-capsule { + margin-left: 10rpx; +} + +.cu-capsule .cu-tag { + margin: 0; +} + +.cu-capsule .cu-tag[class*="line-"]:last-child::after { + border-left: 0rpx solid transparent; +} + +.cu-capsule .cu-tag[class*="line-"]:first-child::after { + border-right: 0rpx solid transparent; +} + +.cu-capsule.radius .cu-tag:first-child { + border-top-left-radius: 6rpx; + border-bottom-left-radius: 6rpx; +} + +.cu-capsule.radius .cu-tag:last-child::after, +.cu-capsule.radius .cu-tag[class*="line-"] { + border-top-right-radius: 12rpx; + border-bottom-right-radius: 12rpx; +} + +.cu-capsule.round .cu-tag:first-child { + border-top-left-radius: 200rpx; + border-bottom-left-radius: 200rpx; + text-indent: 4rpx; +} + +.cu-capsule.round .cu-tag:last-child::after, +.cu-capsule.round .cu-tag:last-child { + border-top-right-radius: 200rpx; + border-bottom-right-radius: 200rpx; + text-indent: -4rpx; +} + +.cu-tag.badge { + border-radius: 200rpx; + position: absolute; + top: -10rpx; + right: -10rpx; + font-size: 20rpx; + padding: 0rpx 10rpx; + height: 28rpx; + color: var(--white); +} + +.cu-tag.badge:not([class*="bg-"]) { + background-color: #dd514c; +} + +.cu-tag:empty:not([class*="cuIcon-"]) { + padding: 0rpx; + width: 16rpx; + height: 16rpx; + top: -4rpx; + right: -4rpx; +} + +.cu-tag[class*="cuIcon-"] { + width: 32rpx; + height: 32rpx; + top: -4rpx; + right: -4rpx; +} + +/* ================== + 头像 + ==================== */ + +.cu-avatar { + font-variant: small-caps; + margin: 0; + padding: 0; + display: inline-flex; + text-align: center; + justify-content: center; + align-items: center; + background-color: #ccc; + color: var(--white); + white-space: nowrap; + position: relative; + width: 64rpx; + height: 64rpx; + background-size: cover; + background-position: center; + vertical-align: middle; + font-size: 1.5em; +} + +.cu-avatar.sm { + width: 48rpx; + height: 48rpx; + font-size: 1em; +} + +.cu-avatar.lg { + width: 96rpx; + height: 96rpx; + font-size: 2em; +} + +.cu-avatar.xl { + width: 128rpx; + height: 128rpx; + font-size: 2.5em; +} + +.cu-avatar .avatar-text { + font-size: 0.4em; +} + +.cu-avatar-group { + direction: rtl; + unicode-bidi: bidi-override; + padding: 0 10rpx 0 40rpx; + display: inline-block; +} + +.cu-avatar-group .cu-avatar { + margin-left: -30rpx; + border: 4rpx solid var(--ghostWhite); + vertical-align: middle; +} + +.cu-avatar-group .cu-avatar.sm { + margin-left: -20rpx; + border: 1rpx solid var(--ghostWhite); +} + +/* ================== + 进度条 + ==================== */ + +.cu-progress { + overflow: hidden; + height: 28rpx; + background-color: #ebeef5; + display: inline-flex; + align-items: center; + width: 100%; +} + +.cu-progress+view, +.cu-progress+text { + line-height: 1; +} + +.cu-progress.xs { + height: 10rpx; +} + +.cu-progress.sm { + height: 20rpx; +} + +.cu-progress view { + width: 0; + height: 100%; + align-items: center; + display: flex; + justify-items: flex-end; + justify-content: space-around; + font-size: 20rpx; + color: var(--white); + transition: width 0.6s ease; +} + +.cu-progress text { + align-items: center; + display: flex; + font-size: 20rpx; + color: var(--black); + text-indent: 10rpx; +} + +.cu-progress.text-progress { + padding-right: 60rpx; +} + +.cu-progress.striped view { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 72rpx 72rpx; +} + +.cu-progress.active view { + animation: progress-stripes 2s linear infinite; +} + +@keyframes progress-stripes { + from { + background-position: 72rpx 0; + } + + to { + background-position: 0 0; + } +} + +/* ================== + 加载 + ==================== */ + +.cu-load { + display: block; + line-height: 3em; + text-align: center; +} + +.cu-load::before { + font-family: "cuIcon"; + display: inline-block; + margin-right: 6rpx; +} + +.cu-load.loading::before { + content: "\e67a"; + animation: cuIcon-spin 2s infinite linear; +} + +.cu-load.loading::after { + content: "加载中..."; +} + +.cu-load.over::before { + content: "\e64a"; +} + +.cu-load.over::after { + content: "没有更多了"; +} + +.cu-load.erro::before { + content: "\e658"; +} + +.cu-load.erro::after { + content: "加载失败"; +} + +.cu-load.load-icon::before { + font-size: 32rpx; +} + +.cu-load.load-icon::after { + display: none; +} + +.cu-load.load-icon.over { + display: none; +} + +.cu-load.load-modal { + position: fixed; + top: 0; + right: 0; + bottom: 140rpx; + left: 0; + margin: auto; + width: 260rpx; + height: 260rpx; + background-color: var(--white); + border-radius: 10rpx; + box-shadow: 0 0 0rpx 2000rpx rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + font-size: 28rpx; + z-index: 9999; + line-height: 2.4em; +} + +.cu-load.load-modal [class*="cuIcon-"] { + font-size: 60rpx; +} + +.cu-load.load-modal image { + width: 70rpx; + height: 70rpx; +} + +.cu-load.load-modal::after { + content: ""; + position: absolute; + background-color: var(--white); + border-radius: 50%; + width: 200rpx; + height: 200rpx; + font-size: 10px; + border-top: 6rpx solid rgba(0, 0, 0, 0.05); + border-right: 6rpx solid rgba(0, 0, 0, 0.05); + border-bottom: 6rpx solid rgba(0, 0, 0, 0.05); + border-left: 6rpx solid var(--orange); + animation: cuIcon-spin 1s infinite linear; + z-index: -1; +} + +.load-progress { + pointer-events: none; + top: 0; + position: fixed; + width: 100%; + left: 0; + z-index: 2000; +} + +.load-progress.hide { + display: none; +} + +.load-progress .load-progress-bar { + position: relative; + width: 100%; + height: 4rpx; + overflow: hidden; + transition: all 200ms ease 0s; +} + +.load-progress .load-progress-spinner { + position: absolute; + top: 10rpx; + right: 10rpx; + z-index: 2000; + display: block; +} + +.load-progress .load-progress-spinner::after { + content: ""; + display: block; + width: 24rpx; + height: 24rpx; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: solid 4rpx transparent; + border-top-color: inherit; + border-left-color: inherit; + border-radius: 50%; + -webkit-animation: load-progress-spinner 0.4s linear infinite; + animation: load-progress-spinner 0.4s linear infinite; +} + +@-webkit-keyframes load-progress-spinner { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes load-progress-spinner { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +/* ================== + 列表 + ==================== */ +.grayscale { + filter: grayscale(1); +} + +.cu-list+.cu-list { + margin-top: 30rpx +} + +.cu-list>.cu-item { + transition: all .6s ease-in-out 0s; + transform: translateX(0rpx) +} + +.cu-list>.cu-item.move-cur { + transform: translateX(-260rpx) +} + +.cu-list>.cu-item .move { + position: absolute; + right: 0; + display: flex; + width: 260rpx; + height: 100%; + transform: translateX(100%) +} + +.cu-list>.cu-item .move view { + display: flex; + flex: 1; + justify-content: center; + align-items: center +} + +.cu-list.menu-avatar { + overflow: hidden; +} + +.cu-list.menu-avatar>.cu-item { + position: relative; + display: flex; + padding-right: 10rpx; + height: 140rpx; + background-color: var(--white); + justify-content: flex-end; + align-items: center +} + +.cu-list.menu-avatar>.cu-item>.cu-avatar { + position: absolute; + left: 30rpx +} + +.cu-list.menu-avatar>.cu-item .flex .text-cut { + max-width: 510rpx +} + +.cu-list.menu-avatar>.cu-item .content { + position: absolute; + left: 146rpx; + width: calc(100% - 96rpx - 60rpx - 120rpx - 20rpx); + line-height: 1.6em; +} + +.cu-list.menu-avatar>.cu-item .content.flex-sub { + width: calc(100% - 96rpx - 60rpx - 20rpx); +} + +.cu-list.menu-avatar>.cu-item .content>view:first-child { + font-size: 30rpx; + display: flex; + align-items: center +} + +.cu-list.menu-avatar>.cu-item .content .cu-tag.sm { + display: inline-block; + margin-left: 10rpx; + height: 28rpx; + font-size: 16rpx; + line-height: 32rpx +} + +.cu-list.menu-avatar>.cu-item .action { + width: 100rpx; + text-align: center +} + +.cu-list.menu-avatar>.cu-item .action view+view { + margin-top: 10rpx +} + +.cu-list.menu-avatar.comment>.cu-item .content { + position: relative; + left: 0; + width: auto; + flex: 1; +} + +.cu-list.menu-avatar.comment>.cu-item { + padding: 30rpx 30rpx 30rpx 120rpx; + height: auto +} + +.cu-list.menu-avatar.comment .cu-avatar { + align-self: flex-start +} + +.cu-list.menu>.cu-item { + position: relative; + display: flex; + padding: 0 30rpx; + min-height: 100rpx; + background-color: var(--white); + justify-content: space-between; + align-items: center +} +.cu-list.menu>.cu-itemz { + position: relative; + display: flex; + padding: 0 10rpx; + min-height: 100rpx; + background-color: var(--white); + justify-content: space-between; + align-items: center +} + +.cu-list.menu>.cu-item:last-child:after { + border: none +} + +.cu-list.menu>.cu-item:after { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 200%; + height: 200%; + border-bottom: 1rpx solid #ddd; + border-radius: inherit; + content: " "; + transform: scale(.5); + transform-origin: 0 0; + pointer-events: none +} + +.cu-list.menu>.cu-item.grayscale { + background-color: #f5f5f5 +} + +.cu-list.menu>.cu-item.cur { + background-color: #fcf7e9 +} + +.cu-list.menu>.cu-item.arrow { + padding-right: 90rpx +} + +.cu-list.menu>.cu-item.arrow:before { + position: absolute; + top: 0; + right: 30rpx; + bottom: 0; + display: block; + margin: auto; + width: 30rpx; + height: 30rpx; + color: var(--grey); + content: "\e6a3"; + text-align: center; + font-size: 34rpx; + font-family: "cuIcon"; + line-height: 30rpx +} + +.cu-list.menu>.cu-item button.content { + padding: 0; + background-color: transparent; + justify-content: flex-start +} + +.cu-list.menu>.cu-item button.content:after { + display: none +} + +.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar { + border-color: var(--white) +} + +.cu-list.menu>.cu-item .content>view:first-child { + display: flex; + align-items: center +} + +.cu-list.menu>.cu-item .content>text[class*=cuIcon] { + display: inline-block; + margin-right: 10rpx; + width: 1.6em; + text-align: center +} + +.cu-list.menu>.cu-item .content>image { + display: inline-block; + margin-right: 10rpx; + width: 1.6em; + height: 1.6em; + vertical-align: middle +} + +.cu-list.menu>.cu-item .content { + font-size: 30rpx; + line-height: 1.6em; + flex: 1 +} + +.cu-list.menu>.cu-item .content .cu-tag.sm { + display: inline-block; + margin-left: 10rpx; + height: 28rpx; + font-size: 16rpx; + line-height: 32rpx +} + +.cu-list.menu>.cu-item .action .cu-tag:empty { + right: 10rpx +} + +.cu-list.menu { + display: block; + overflow: hidden +} + +.cu-list.menu.sm-border>.cu-item:after { + left: 30rpx; + width: calc(200% - 120rpx) +} + +.cu-list.grid>.cu-item { + position: relative; + display: flex; + padding: 20rpx 0 30rpx; + transition-duration: 0s; + flex-direction: column +} + +.cu-list.grid>.cu-item:after { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 200%; + height: 200%; + border-right: 1px solid rgba(0, 0, 0, .1); + border-bottom: 1px solid rgba(0, 0, 0, .1); + border-radius: inherit; + content: " "; + transform: scale(.5); + transform-origin: 0 0; + pointer-events: none +} + +.cu-list.grid>.cu-item text { + display: block; + margin-top: 10rpx; + color: #888; + font-size: 26rpx; + line-height: 40rpx +} + +.cu-list.grid>.cu-item [class*=cuIcon] { + position: relative; + display: block; + margin-top: 20rpx; + width: 100%; + font-size: 48rpx +} + +.cu-list.grid>.cu-item .cu-tag { + right: auto; + left: 50%; + margin-left: 20rpx +} + +.cu-list.grid { + background-color: var(--white); + text-align: center +} + +.cu-list.grid.no-border>.cu-item { + padding-top: 10rpx; + padding-bottom: 20rpx +} + +.cu-list.grid.no-border>.cu-item:after { + border: none +} + +.cu-list.grid.no-border { + padding: 20rpx 10rpx +} + +.cu-list.grid.col-3>.cu-item:nth-child(3n):after, +.cu-list.grid.col-4>.cu-item:nth-child(4n):after, +.cu-list.grid.col-5>.cu-item:nth-child(5n):after { + border-right-width: 0 +} + +.cu-list.card-menu { + overflow: hidden; + margin-right: 30rpx; + margin-left: 30rpx; + border-radius: 20rpx +} + + +/* ================== + 操作条 + ==================== */ + +.cu-bar { + display: flex; + position: relative; + align-items: center; + min-height: 100rpx ; + justify-content: space-between; +} + +.cu-bar .action { + display: flex; + align-items:flex-start center; + height: 100%; + justify-content: center; + max-width: 100%; +} + +.cu-bar .action.border-title { + position: relative; + top: -10rpx; +} + +.cu-bar .action.border-title text[class*="bg-"]:last-child { + position: absolute; + bottom: -0.5rem; + min-width: 2rem; + height: 6rpx; + left: 0; +} + +.cu-bar .action.sub-title { + position: relative; + top: -0.2rem; +} + +.cu-bar .action.sub-title text { + position: relative; + z-index: 1; +} + +.cu-bar .action.sub-title text[class*="bg-"]:last-child { + position: absolute; + display: inline-block; + bottom: -0.2rem; + border-radius: 6rpx; + width: 100%; + height: 0.6rem; + left: 0.6rem; + opacity: 0.3; + z-index: 0; +} + +.cu-bar .action.sub-title text[class*="text-"]:last-child { + position: absolute; + display: inline-block; + bottom: -0.7rem; + left: 0.5rem; + opacity: 0.2; + z-index: 0; + text-align: right; + font-weight: 900; + font-size: 36rpx; +} + +.cu-bar.justify-center .action.border-title text:last-child, +.cu-bar.justify-center .action.sub-title text:last-child { + left: 0; + right: 0; + margin: auto; + text-align: center; +} + +.cu-bar .action:first-child { + margin-left: 30rpx; + font-size: 30rpx; +} + +.cu-bar .action text.text-cut { + text-align: left; + width: 100%; +} + +.cu-bar .cu-avatar:first-child { + margin-left: 20rpx; +} + +.cu-bar .action:first-child>text[class*="cuIcon-"] { + margin-left: -0.3em; + margin-right: 0.3em; +} + +.cu-bar .action:last-child { + margin-right: 30rpx; +} + +.cu-bar .action>text[class*="cuIcon-"], +.cu-bar .action>view[class*="cuIcon-"] { + font-size: 36rpx; +} + +.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] { + margin-left: 0.5em; +} + +.cu-bar .content { + position: absolute; + text-align: center; + width: calc(100% - 340rpx); + left: 0; + right: 0; + bottom: 0; + top: 0; + margin: auto; + height: 60rpx; + font-size: 32rpx; + line-height: 60rpx; + cursor: none; + pointer-events: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.cu-bar.ios .content { + bottom: 7px; + height: 30px; + font-size: 32rpx; + line-height: 30px; +} + +.cu-bar.btn-group { + justify-content: space-around; +} + +.cu-bar.btn-group button { + padding: 20rpx 32rpx; +} + +.cu-bar.btn-group button { + flex: 1; + margin: 0 20rpx; + max-width: 50%; +} + +.cu-bar .search-form { + background-color: #f5f5f5; + line-height: 64rpx; + height: 64rpx; + font-size: 24rpx; + color: var(--black); + flex: 1; + display: flex; + align-items: center; + margin: 0 30rpx; +} + +.cu-bar .search-form+.action { + margin-right: 30rpx; +} + +.cu-bar .search-form input { + flex: 1; + padding-right: 30rpx; + height: 64rpx; + line-height: 64rpx; + font-size: 26rpx; + background-color: transparent; +} + +.cu-bar .search-form [class*="cuIcon-"] { + margin: 0 0.5em 0 0.8em; +} + +.cu-bar .search-form [class*="cuIcon-"]::before { + top: 0rpx; +} + +.cu-bar.fixed, +.nav.fixed { + position: fixed; + width: 100%; + top: 0; + z-index: 1024; + box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0.1); +} + +.cu-bar.foot { + position: fixed; + width: 100%; + bottom: 0; + z-index: 1024; + box-shadow: 0 -1rpx 6rpx rgba(0, 0, 0, 0.1); +} +.cu-bar.top { + position: fixed; + width: 100%; + z-index: 1024; + box-shadow: 0 -1rpx 6rpx rgba(0, 0, 0, 0.1); +} + +.cu-bar.tabbar { + padding: 0; + height: calc(100rpx +e nv(safe-area-inset-bottom) / 2); + padding-bottom: calc(env(safe-area-inset-bottom) / 2); +} + +.cu-tabbar-height { + min-height: 100rpx; + height: calc(100rpx + env(safe-area-inset-bottom) / 2); +} + +.cu-bar.tabbar.shadow { + box-shadow: 0 -1rpx 6rpx rgba(0, 0, 0, 0.1); +} + +.cu-bar.tabbar .action { + font-size: 22rpx; + position: relative; + flex: 1; + text-align: center; + padding: 0; + display: block; + height: auto; + line-height: 1; + margin: 0; + overflow: initial; +} + +.cu-bar.tabbar.shop .action { + width: 140rpx; + flex: initial; +} + +.cu-bar.tabbar .action.add-action { + position: relative; + z-index: 2; + padding-top: 50rpx; + background-color: inherit; +} + +.cu-bar.tabbar .action.add-action [class*="cuIcon-"] { + position: absolute; + width: 70rpx; + z-index: 2; + height: 70rpx; + border-radius: 50%; + line-height: 70rpx; + font-size: 50rpx; + top: -35rpx; + left: 0; + right: 0; + margin: auto; + padding: 0; +} + +.cu-bar.tabbar .action.add-action::after { + content: ""; + position: absolute; + width: 100rpx; + height: 100rpx; + top: -50rpx; + left: 0; + right: 0; + margin: auto; + box-shadow: 0 -3rpx 8rpx rgba(0, 0, 0, 0.08); + border-radius: 50rpx; + background-color: inherit; + z-index: 0; +} + +.cu-bar.tabbar .action.add-action::before { + content: ""; + position: absolute; + width: 100rpx; + height: 30rpx; + bottom: 30rpx; + left: 0; + right: 0; + margin: auto; + background-color: inherit; + z-index: 1; +} + +.cu-bar.tabbar .btn-group { + flex: 1; + display: flex; + justify-content: space-around; + align-items: center; + padding: 0 10rpx; +} + +.cu-bar.tabbar button.action::after { + border: 0; +} + +.cu-bar.tabbar .action [class*="cuIcon-"] { + width: 100rpx; + position: relative; + display: block; + height: auto; + margin: 0 auto 10rpx; + text-align: center; + font-size: 40rpx; +} + +.cu-bar.tabbar .action .cuIcon-cu-image { + margin: 0 auto; +} + +.cu-bar.tabbar .action .cuIcon-cu-image image { + width: 50rpx; + height: 50rpx; + display: inline-block; +} + +.cu-bar.tabbar .submit { + align-items: center; + display: flex; + justify-content: center; + text-align: center; + position: relative; + flex: 2; + align-self: stretch; +} + +.cu-bar.tabbar .submit:last-child { + flex: 2.6; +} + +.cu-bar.tabbar .submit+.submit { + flex: 2; +} + +.cu-bar.tabbar.border .action::before { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + transform: scale(0.5); + transform-origin: 0 0; + border-right: 1rpx solid rgba(0, 0, 0, 0.1); + z-index: 3; +} + +.cu-bar.tabbar.border .action:last-child:before { + display: none; +} + +.cu-bar.input { + padding-right: 20rpx; + background-color: var(--white); +} + +.cu-bar.input input { + overflow: initial; + line-height: 64rpx; + height: 64rpx; + min-height: 64rpx; + flex: 1; + font-size: 30rpx; + margin: 0 20rpx; +} + +.cu-bar.input .action { + margin-left: 20rpx; +} + +.cu-bar.input .action [class*="cuIcon-"] { + font-size: 48rpx; +} + +.cu-bar.input input+.action { + margin-right: 20rpx; + margin-left: 0rpx; +} + +.cu-bar.input .action:first-child [class*="cuIcon-"] { + margin-left: 0rpx; +} + +.cu-custom { + display: block; + position: relative; +} + +.cu-custom .cu-bar .content { + width: calc(100% - 440rpx); +} + + +.cu-custom .cu-bar .content image { + height: 60rpx; + width: 240rpx; +} + +.cu-custom .cu-bar { + min-height: 0px; + padding-right: 220rpx; + box-shadow: 0rpx 0rpx 0rpx; + z-index: 9999; +} + +.cu-custom .cu-bar .border-custom { + position: relative; + background: rgba(0, 0, 0, 0.15); + border-radius: 1000rpx; + height: 30px; +} + +.cu-custom .cu-bar .border-custom::after { + content: " "; + width: 200%; + height: 200%; + position: absolute; + top: 0; + left: 0; + border-radius: inherit; + transform: scale(0.5); + transform-origin: 0 0; + pointer-events: none; + box-sizing: border-box; + border: 1rpx solid var(--white); + opacity: 0.5; +} + +.cu-custom .cu-bar .border-custom::before { + content: " "; + width: 1rpx; + height: 110%; + position: absolute; + top: 22.5%; + left: 0; + right: 0; + margin: auto; + transform: scale(0.5); + transform-origin: 0 0; + pointer-events: none; + box-sizing: border-box; + opacity: 0.6; + background-color: var(--white); +} + +.cu-custom .cu-bar .border-custom text { + display: block; + flex: 1; + margin: auto !important; + text-align: center; + font-size: 34rpx; +} + +/* ================== + 导航栏 + ==================== */ + +.nav { + white-space: nowrap; +} + +::-webkit-scrollbar { + display: none; +} + +.nav .cu-item { + height: 90rpx; + display: inline-block; + line-height: 90rpx; + margin: 0 10rpx; + padding: 0 20rpx; +} + +.nav .cu-item.cur { + border-bottom: 4rpx solid; +} + +/* ================== + 时间轴 + ==================== */ + +.cu-timeline { + display: block; + background-color: var(--white); +} + +.cu-timeline .cu-time { + width: 120rpx; + text-align: center; + padding: 20rpx 0; + font-size: 26rpx; + color: #888; + display: block; +} + +.cu-timeline>.cu-item { + padding: 30rpx 30rpx 30rpx 120rpx; + position: relative; + display: block; + z-index: 0; +} + +.cu-timeline>.cu-item:not([class*="text-"]) { + color: #ccc; +} + +.cu-timeline>.cu-item::after { + content: ""; + display: block; + position: absolute; + width: 1rpx; + background-color: #ddd; + left: 60rpx; + height: 100%; + top: 0; + z-index: 8; +} + +.cu-timeline>.cu-item::before { + font-family: "cuIcon"; + display: block; + position: absolute; + top: 36rpx; + z-index: 9; + background-color: var(--white); + width: 50rpx; + height: 50rpx; + text-align: center; + border: none; + line-height: 50rpx; + left: 36rpx; +} + +.cu-timeline>.cu-item:not([class*="cuIcon-"])::before { + content: "\e763"; +} + +.cu-timeline>.cu-item[class*="cuIcon-"]::before { + background-color: var(--white); + width: 50rpx; + height: 50rpx; + text-align: center; + border: none; + line-height: 50rpx; + left: 36rpx; +} + +.cu-timeline>.cu-item>.content { + padding: 30rpx; + border-radius: 6rpx; + display: block; + line-height: 1.6; +} + +.cu-timeline>.cu-item>.content:not([class*="bg-"]) { + background-color: var(--ghostWhite); + color: var(--black); +} + +.cu-timeline>.cu-item>.content+.content { + margin-top: 20rpx; +} + +/* ================== + 聊天 + ==================== */ + +.cu-chat { + display: flex; + flex-direction: column; +} + +.cu-chat .cu-item { + display: flex; + padding: 30rpx 30rpx 70rpx; + position: relative; +} + +.cu-chat .cu-item>.cu-avatar { + width: 80rpx; + height: 80rpx; +} + +.cu-chat .cu-item>.main { + max-width: calc(100% - 260rpx); + margin: 0 40rpx; + display: flex; + align-items: center; +} + +.cu-chat .cu-item>image { + height: 320rpx; +} + +.cu-chat .cu-item>.main .content { + padding: 20rpx; + border-radius: 6rpx; + display: inline-flex; + max-width: 100%; + align-items: center; + font-size: 30rpx; + position: relative; + min-height: 80rpx; + line-height: 40rpx; + text-align: left; +} + +.cu-chat .cu-item>.main .content:not([class*="bg-"]) { + background-color: var(--white); + color: var(--black); +} + +.cu-chat .cu-item .date { + position: absolute; + font-size: 24rpx; + color: var(--grey); + width: calc(100% - 320rpx); + bottom: 20rpx; + left: 160rpx; +} + +.cu-chat .cu-item .action { + padding: 0 30rpx; + display: flex; + align-items: center; +} + +.cu-chat .cu-item>.main .content::after { + content: ""; + top: 27rpx; + transform: rotate(45deg); + position: absolute; + z-index: 100; + display: inline-block; + overflow: hidden; + width: 24rpx; + height: 24rpx; + left: -12rpx; + right: initial; + background-color: inherit; +} + +.cu-chat .cu-item.self>.main .content::after { + left: auto; + right: -12rpx; +} + +.cu-chat .cu-item>.main .content::before { + content: ""; + top: 30rpx; + transform: rotate(45deg); + position: absolute; + z-index: -1; + display: inline-block; + overflow: hidden; + width: 24rpx; + height: 24rpx; + left: -12rpx; + right: initial; + background-color: inherit; + filter: blur(5rpx); + opacity: 0.3; +} + +.cu-chat .cu-item>.main .content:not([class*="bg-"])::before { + background-color: var(--black); + opacity: 0.1; +} + +.cu-chat .cu-item.self>.main .content::before { + left: auto; + right: -12rpx; +} + +.cu-chat .cu-item.self { + justify-content: flex-end; + text-align: right; +} + +.cu-chat .cu-info { + display: inline-block; + margin: 20rpx auto; + font-size: 24rpx; + padding: 8rpx 12rpx; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 6rpx; + color: var(--white); + max-width: 400rpx; + line-height: 1.4; +} + +/* ================== + 卡片 + ==================== */ + +.cu-card { + display: block; + overflow: hidden; +} + +.cu-card>.cu-item { + display: block; + background-color: var(--white); + overflow: hidden; + border-radius: 10rpx; + margin: 30rpx; +} + +.cu-card>.cu-item.shadow-blur { + overflow: initial; +} + +.cu-card.no-card>.cu-item { + margin: 0rpx; + border-radius: 0rpx; +} + +.cu-card .grid.grid-square { + margin-bottom: -20rpx; +} + +.cu-card.case .image { + position: relative; +} + +.cu-card.case .image image { + width: 100%; +} + +.cu-card.case .image .cu-tag { + position: absolute; + right: 0; + top: 0; +} + +.cu-card.case .image .cu-bar { + position: absolute; + bottom: 0; + width: 100%; + background-color: transparent; + padding: 0rpx 30rpx; +} + +.cu-card.case.no-card .image { + margin: 30rpx 30rpx 0; + overflow: hidden; + border-radius: 10rpx; +} + +.cu-card.dynamic { + display: block; +} + +.cu-card.dynamic>.cu-item { + display: block; + background-color: var(--white); + overflow: hidden; +} + +.cu-card.dynamic>.cu-item>.text-content { + padding: 0 30rpx 0; + max-height: 6.4em; + overflow: hidden; + font-size: 30rpx; + margin-bottom: 20rpx; +} + +.cu-card.dynamic>.cu-item .square-img { + width: 100%; + height: 200rpx; + border-radius: 6rpx; +} + +.cu-card.dynamic>.cu-item .only-img { + width: 100%; + height: 320rpx; + border-radius: 6rpx; +} + +.cu-card.article { + display: block; +} + +.cu-card.article>.cu-item { + padding-bottom: 30rpx; +} + +.cu-card.article>.cu-item .title { + font-size: 30rpx; + font-weight: 900; + color: var(--black); + line-height: 100rpx; + padding: 0 30rpx; +} + +.cu-card.article>.cu-item .content { + display: flex; + padding: 0 30rpx; +} + +.cu-card.article>.cu-item .content>image { + width: 240rpx; + height: 6.4em; + margin-right: 20rpx; + border-radius: 6rpx; +} + +.cu-card.article>.cu-item .content .desc { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.cu-card.article>.cu-item .content .text-content { + font-size: 28rpx; + color: #888; + height: 4.8em; + overflow: hidden; +} + +/* ================== + 表单 + ==================== */ + +.cu-form-group { + background-color: var(--white); + padding: 1rpx 30rpx; + display: flex; + align-items: center; + min-height: 100rpx; + justify-content: space-between; +} + +.cu-form-group+.cu-form-group { + border-top: 1rpx solid #eee; +} + +.cu-form-group .title { + text-align: justify; + padding-right: 30rpx; + font-size: 30rpx; + position: relative; + height: 60rpx; + line-height: 60rpx; +} + +.cu-form-group input { + flex: 1; + font-size: 30rpx; + color: #555; + padding-right: 20rpx; +} + +.cu-form-group>text[class*="cuIcon-"] { + font-size: 36rpx; + padding: 0; + box-sizing: border-box; +} + +.cu-form-group textarea { + margin: 32rpx 0 30rpx; + height: 4.6em; + width: 100%; + line-height: 1.2em; + flex: 1; + font-size: 28rpx; + padding: 0; +} + +.cu-form-group.align-start .title { + height: 1em; + margin-top: 32rpx; + line-height: 1em; +} + +.cu-form-group picker { + flex: 1; + padding-right: 40rpx; + overflow: hidden; + position: relative; +} + +.cu-form-group picker .picker { + line-height: 100rpx; + font-size: 28rpx; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 100%; + text-align: right; +} + +.cu-form-group picker::after { + font-family: "cuIcon"; + display: block; + content: "\e6a3"; + position: absolute; + font-size: 34rpx; + color: var(--grey); + line-height: 100rpx; + width: 60rpx; + text-align: center; + top: 0; + bottom: 0; + right: -20rpx; + margin: auto; +} + +.cu-form-group textarea[disabled], +.cu-form-group textarea[disabled] .placeholder { + color: transparent; +} + +/* ================== + 模态窗口 + ==================== */ + +.cu-modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1110; + opacity: 0; + outline: 0; + text-align: center; + -ms-transform: scale(1.185); + transform: scale(1.185); + backface-visibility: hidden; + perspective: 2000rpx; + background: rgba(0, 0, 0, 0.6); + transition: all 0.3s ease-in-out 0s; + pointer-events: none; +} + +.cu-modal::before { + content: "\200B"; + display: inline-block; + height: 100%; + vertical-align: middle; +} + +.cu-modal.show { + opacity: 1; + transition-duration: 0.3s; + -ms-transform: scale(1); + transform: scale(1); + overflow-x: hidden; + overflow-y: auto; + pointer-events: auto; +} + +.cu-dialog { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: auto; + margin-right: auto; + width: 680rpx; + max-width: 100%; + background-color: #f8f8f8; + border-radius: 10rpx; + overflow: hidden; +} +.cu-Ndialog { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: auto; + margin-right: auto; + width: 100%; + top: 10%; + height: 90%; + max-width: 100%; + background-color: #f8f8f8; + border-radius: 10rpx; + overflow: hidden; +} + +.cu-modal.bottom-modal::before { + vertical-align: bottom; +} + +.cu-modal.bottom-modal .cu-dialog { + width: 100%; + border-radius: 0; +} + +.cu-modal.bottom-modal { + margin-bottom: -1000rpx; +} + +.cu-modal.bottom-modal.show { + margin-bottom: 0; +} + +.cu-modal.drawer-modal { + transform: scale(1); + display: flex; +} + +.cu-modal.drawer-modal .cu-dialog { + height: 100%; + min-width: 200rpx; + border-radius: 0; + margin: initial; + transition-duration: 0.3s; +} + +.cu-modal.drawer-modal.justify-start .cu-dialog { + transform: translateX(-100%); +} + +.cu-modal.drawer-modal.justify-end .cu-dialog { + transform: translateX(100%); +} + +.cu-modal.drawer-modal.show .cu-dialog { + transform: translateX(0%); +} +.cu-modal .cu-dialog>.cu-bar:first-child .action{ + min-width: 100rpx; + margin-right: 0; + min-height: 100rpx; +} +/* ================== + 轮播 + ==================== */ +swiper .a-swiper-dot { + display: inline-block; + width: 16rpx; + height: 16rpx; + background: rgba(0, 0, 0, .3); + border-radius: 50%; + vertical-align: middle; +} + +swiper[class*="-dot"] .wx-swiper-dots { + display: flex; + align-items: center; + width: 100%; + justify-content: center; +} + +swiper.square-dot .wx-swiper-dot { + background-color: var(--white); + opacity: 0.4; + width: 10rpx; + height: 10rpx; + border-radius: 20rpx; + margin: 0 8rpx !important; +} + +swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active { + opacity: 1; + width: 30rpx; +} + +swiper.round-dot .wx-swiper-dot { + width: 10rpx; + height: 10rpx; + position: relative; + margin: 4rpx 8rpx !important; +} + +swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after { + content: ""; + position: absolute; + width: 10rpx; + height: 10rpx; + top: 0rpx; + left: 0rpx; + right: 0; + bottom: 0; + margin: auto; + background-color: var(--white); + border-radius: 20rpx; +} + +swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active { + width: 18rpx; + height: 18rpx; +} + +.screen-swiper { + min-height: 375rpx; +} + +.screen-swiper image, +.screen-swiper video, +.swiper-item image, +.swiper-item video { + width: 100%; + display: block; + height: 100%; + margin: 0; + pointer-events: none; +} + +.card-swiper { + height: 420rpx !important; +} + +.card-swiper swiper-item { + width: 610rpx !important; + left: 70rpx; + box-sizing: border-box; + padding: 40rpx 0rpx 70rpx; + overflow: initial; +} + +.card-swiper swiper-item .swiper-item { + width: 100%; + display: block; + height: 100%; + border-radius: 10rpx; + transform: scale(0.9); + transition: all 0.2s ease-in 0s; + overflow: hidden; +} + +.card-swiper swiper-item.cur .swiper-item { + transform: none; + transition: all 0.2s ease-in 0s; +} + + +.tower-swiper { + height: 420rpx; + position: relative; + max-width: 750rpx; + overflow: hidden; +} + +.tower-swiper .tower-item { + position: absolute; + width: 300rpx; + height: 380rpx; + top: 0; + bottom: 0; + left: 50%; + margin: auto; + transition: all 0.2s ease-in 0s; + opacity: 1; +} + +.tower-swiper .tower-item.none { + opacity: 0; +} + +.tower-swiper .tower-item .swiper-item { + width: 100%; + height: 100%; + border-radius: 6rpx; + overflow: hidden; +} + +/* ================== + 步骤条 + ==================== */ + +.cu-steps { + display: flex; +} + +scroll-view.cu-steps { + display: block; + white-space: nowrap; +} + +scroll-view.cu-steps .cu-item { + display: inline-block; +} + +.cu-steps .cu-item { + flex: 1; + text-align: center; + position: relative; + min-width: 100rpx; +} + +.cu-steps .cu-item:not([class*="text-"]) { + color: var(--grey); +} + +.cu-steps .cu-item [class*="cuIcon-"], +.cu-steps .cu-item .num { + display: block; + font-size: 40rpx; + line-height: 80rpx; +} + +.cu-steps .cu-item::before, +.cu-steps .cu-item::after, +.cu-steps.steps-arrow .cu-item::before, +.cu-steps.steps-arrow .cu-item::after { + content: ""; + display: block; + position: absolute; + height: 0px; + width: calc(100% - 80rpx); + border-bottom: 1px solid #ccc; + left: calc(0px - (100% - 80rpx) / 2); + top: 40rpx; + z-index: 0; +} + +.cu-steps.steps-arrow .cu-item::before, +.cu-steps.steps-arrow .cu-item::after { + content: "\e6a3"; + font-family: "cuIcon"; + height: 30rpx; + border-bottom-width: 0px; + line-height: 30rpx; + top: 0; + bottom: 0; + margin: auto; + color: #ccc; +} + +.cu-steps.steps-bottom .cu-item::before, +.cu-steps.steps-bottom .cu-item::after { + bottom: 40rpx; + top: initial; +} + +.cu-steps .cu-item::after { + border-bottom: 1px solid currentColor; + width: 0px; + transition: all 0.3s ease-in-out 0s; +} + +.cu-steps .cu-item[class*="text-"]::after { + width: calc(100% - 80rpx); + color: currentColor; +} + +.cu-steps .cu-item:first-child::before, +.cu-steps .cu-item:first-child::after { + display: none; +} + +.cu-steps .cu-item .num { + width: 40rpx; + height: 40rpx; + border-radius: 50%; + line-height: 40rpx; + margin: 20rpx auto; + font-size: 24rpx; + border: 1px solid currentColor; + position: relative; + overflow: hidden; +} + +.cu-steps .cu-item[class*="text-"] .num { + background-color: currentColor; +} + +.cu-steps .cu-item .num::before, +.cu-steps .cu-item .num::after { + content: attr(data-index); + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + transition: all 0.3s ease-in-out 0s; + transform: translateY(0rpx); +} + +.cu-steps .cu-item[class*="text-"] .num::before { + transform: translateY(-40rpx); + color: var(--white); +} + +.cu-steps .cu-item .num::after { + transform: translateY(40rpx); + color: var(--white); + transition: all 0.3s ease-in-out 0s; +} + +.cu-steps .cu-item[class*="text-"] .num::after { + content: "\e645"; + font-family: "cuIcon"; + color: var(--white); + transform: translateY(0rpx); +} + +.cu-steps .cu-item[class*="text-"] .num.err::after { + content: "\e646"; +} + +/* ================== + 布局 + ==================== */ + +/* -- flex弹性布局 -- */ + +.flex { + display: flex; +} +.basis-mss { + flex-basis: 10%; +} +.basis-xs { + flex-basis: 20%; +} + +.basis-sm { + flex-basis: 40%; +} + +.basis-df { + flex-basis: 50%; +} + +.basis-lg { + flex-basis: 60%; +} + +.basis-xl { + flex-basis: 80%; +} +.basis-xxl { + flex-basis: 90%; +} +.basis-xxxl { + flex-basis: 100%; +} +.flex-xsub { + flex: 0.8; +} +.flex-sub { + flex: 1; +} +.flex-subN { + flex: 1.5; +} +.flex-twice { + flex: 2; +} + +.flex-treble { + flex: 3; +} +.flex-eight { + flex: 7; +} +.flex-xis { + flex: 4; +} +.flex-8 { + flex: 8; +} +.flex-6 { + flex: 6; +} +.flex-9 { + flex: 9; +} + +.flex-direction { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.align-start { + align-items: flex-start; +} + +.align-end { + align-items: flex-end; +} + +.align-center { + align-items: center; +} + +.align-stretch { + align-items: stretch; +} + +.self-start { + align-self: flex-start; +} + +.self-center { + align-self: flex-center; +} + +.self-end { + align-self: flex-end; +} + +.self-stretch { + align-self: stretch; +} + +.align-stretch { + align-items: stretch; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +/* grid布局 */ + +.grid { + display: flex; + flex-wrap: wrap; +} + +.grid.grid-square { + overflow: hidden; +} + +.grid.grid-square .cu-tag { + position: absolute; + right: 0; + top: 0; + border-bottom-left-radius: 6rpx; + padding: 6rpx 12rpx; + height: auto; + background-color: rgba(0, 0, 0, 0.5); +} + +.grid.grid-square>view>text[class*="cuIcon-"] { + font-size: 52rpx; + position: absolute; + color: var(--grey); + margin: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +.grid.grid-square>view { + margin-right: 20rpx; + margin-bottom: 20rpx; + border-radius: 6rpx; + position: relative; + overflow: hidden; +} + +.grid.grid-square>view.bg-img image { + width: 100%; + height: 100%; + position: absolute; +} + +.grid.col-1.grid-square>view { + padding-bottom: 100%; + height: 0; + margin-right: 0; +} + +.grid.col-2.grid-square>view { + padding-bottom: calc((100% - 20rpx)/2); + height: 0; + width: calc((100% - 20rpx)/2); +} + +.grid.col-3.grid-square>view { + padding-bottom: calc((100% - 40rpx)/3); + height: 0; + width: calc((100% - 40rpx)/3); +} + +.grid.col-4.grid-square>view { + padding-bottom: calc((100% - 60rpx)/4); + height: 0; + width: calc((100% - 60rpx)/4); +} + +.grid.col-5.grid-square>view { + padding-bottom: calc((100% - 80rpx)/5); + height: 0; + width: calc((100% - 80rpx)/5); +} + +.grid.col-2.grid-square>view:nth-child(2n), +.grid.col-3.grid-square>view:nth-child(3n), +.grid.col-4.grid-square>view:nth-child(4n), +.grid.col-5.grid-square>view:nth-child(5n){ + margin-right: 0; +} + +.grid.col-1>view { + width: 100%; +} + +.grid.col-2>view { + width: 50%; +} + +.grid.col-3>view { + width: 33.33%; +} + +.grid.col-4>view { + width: 25%; +} + +.grid.col-5>view { + width: 20%; +} + +/* -- 内外边距 -- */ + +.margin-0 { + margin: 0; +} +.margin-3 { + margin: 3rpx; +} +.margin-5 { + margin: 5rpx; +} +.margin-xs { + margin: 10rpx; +} + +.margin-sm { + margin: 20rpx; +} + +.margin { + margin: 30rpx; +} + +.margin-lg { + margin: 40rpx; +} + +.margin-xl { + margin: 50rpx; +} + +.margin-top-xs { + margin-top: 10rpx; +} + +.margin-top-sm { + margin-top: 20rpx; +} + +.margin-top { + margin-top: 30rpx; +} + +.margin-top-lg { + margin-top: 40rpx; +} + +.margin-top-xl { + margin-top: 50rpx; +} + +.margin-right-xs { + margin-right: 10rpx; +} + +.margin-right-sm { + margin-right: 20rpx; +} + +.margin-right { + margin-right: 30rpx; +} + +.margin-right-lg { + margin-right: 40rpx; +} + +.margin-right-xl { + margin-right: 50rpx; +} + +.margin-bottom-xs { + margin-bottom: 10rpx; +} + +.margin-bottom-sm { + margin-bottom: 20rpx; +} + +.margin-bottom { + margin-bottom: 30rpx; +} + +.margin-bottom-lg { + margin-bottom: 40rpx; +} + +.margin-bottom-xl { + margin-bottom: 50rpx; +} + +.margin-left-xs { + margin-left: 10rpx; +} + +.margin-left-sm { + margin-left: 20rpx; +} + +.margin-left { + margin-left: 30rpx; +} + +.margin-left-lg { + margin-left: 40rpx; +} + +.margin-left-xl { + margin-left: 50rpx; +} + +.margin-lr-xs { + margin-left: 10rpx; + margin-right: 10rpx; +} + +.margin-lr-sm { + margin-left: 20rpx; + margin-right: 20rpx; +} + +.margin-lr { + margin-left: 30rpx; + margin-right: 30rpx; +} + +.margin-lr-lg { + margin-left: 40rpx; + margin-right: 40rpx; +} + +.margin-lr-xl { + margin-left: 50rpx; + margin-right: 50rpx; +} + +.margin-tb-xs { + margin-top: 10rpx; + margin-bottom: 10rpx; +} + +.margin-tb-sm { + margin-top: 20rpx; + margin-bottom: 20rpx; +} + +.margin-tb { + margin-top: 30rpx; + margin-bottom: 30rpx; +} + +.margin-tb-lg { + margin-top: 40rpx; + margin-bottom: 40rpx; +} + +.margin-tb-xl { + margin-top: 50rpx; + margin-bottom: 50rpx; +} + +.padding-0 { + padding: 0; +} +.padding-5 { + padding: 5rpx; +} +.padding-xs { + padding: 10rpx; +} + +.padding-sm { + padding: 20rpx; +} + +.padding { + padding: 30rpx; +} + +.padding-lg { + padding: 40rpx; +} + +.padding-xl { + padding: 50rpx; +} + +.padding-top-xs { + padding-top: 10rpx; +} + +.padding-top-sm { + padding-top: 20rpx; +} + +.padding-top { + padding-top: 30rpx; +} + +.padding-top-lg { + padding-top: 40rpx; +} + +.padding-top-xl { + padding-top: 50rpx; +} + +.padding-right-xs { + padding-right: 10rpx; +} + +.padding-right-sm { + padding-right: 20rpx; +} + +.padding-right { + padding-right: 30rpx; +} + +.padding-right-lg { + padding-right: 40rpx; +} + +.padding-right-xl { + padding-right: 50rpx; +} + +.padding-bottom-xs { + padding-bottom: 10rpx; +} + +.padding-bottom-sm { + padding-bottom: 20rpx; +} + +.padding-bottom { + padding-bottom: 30rpx; +} + +.padding-bottom-lg { + padding-bottom: 40rpx; +} + +.padding-bottom-xl { + padding-bottom: 50rpx; +} + +.padding-left-xs { + padding-left: 10rpx; +} + +.padding-left-sm { + padding-left: 20rpx; +} + +.padding-left { + padding-left: 30rpx; +} + +.padding-left-lg { + padding-left: 40rpx; +} + +.padding-left-xl { + padding-left: 50rpx; +} + +.padding-lr-xs { + padding-left: 10rpx; + padding-right: 10rpx; +} + +.padding-lr-sm { + padding-left: 20rpx; + padding-right: 20rpx; +} + +.padding-lr { + padding-left: 30rpx; + padding-right: 30rpx; +} + +.padding-lr-lg { + padding-left: 40rpx; + padding-right: 40rpx; +} + +.padding-lr-xl { + padding-left: 50rpx; + padding-right: 50rpx; +} + +.padding-tb-xs { + padding-top: 10rpx; + padding-bottom: 10rpx; +} + +.padding-tb-sm { + padding-top: 20rpx; + padding-bottom: 20rpx; +} + +.padding-tb { + padding-top: 30rpx; + padding-bottom: 30rpx; +} + +.padding-tb-lg { + padding-top: 40rpx; + padding-bottom: 40rpx; +} + +.padding-tb-xl { + padding-top: 50rpx; + padding-bottom: 50rpx; +} + +/* -- 浮动 -- */ + +.cf::after, +.cf::before { + content: " "; + display: table; +} + +.cf::after { + clear: both; +} + +.fl { + float: left; +} + +.fr { + float: right; +} + +/* ================== + 背景 + ==================== */ + +.line-red::after, +.lines-red::after { + border-color: var(--red); +} + +.line-orange::after, +.lines-orange::after { + border-color: var(--orange); +} + +.line-yellow::after, +.lines-yellow::after { + border-color: var(--yellow); +} + +.line-olive::after, +.lines-olive::after { + border-color: var(--olive); +} + +.line-green::after, +.lines-green::after { + border-color: var(--green); +} + +.line-cyan::after, +.lines-cyan::after { + border-color: var(--cyan); +} + +.line-blue::after, +.lines-blue::after { + border-color: var(--blue); +} + +.line-purple::after, +.lines-purple::after { + border-color: var(--purple); +} + +.line-mauve::after, +.lines-mauve::after { + border-color: var(--mauve); +} + +.line-pink::after, +.lines-pink::after { + border-color: var(--pink); +} + +.line-brown::after, +.lines-brown::after { + border-color: var(--brown); +} + +.line-grey::after, +.lines-grey::after { + border-color: var(--grey); +} + +.line-gray::after, +.lines-gray::after { + border-color: var(--gray); +} + +.line-black::after, +.lines-black::after { + border-color: var(--black); +} + +.line-white::after, +.lines-white::after { + border-color: var(--white); +} + +.bg-red { + background-color: var(--red); + color: var(--white); +} + +.bg-orange { + background-color: var(--orange); + color: var(--white); +} + +.bg-yellow { + background-color: var(--yellow); + color: var(--black); +} + +.bg-olive { + background-color: var(--olive); + color: var(--white); +} + +.bg-green { + background-color: var(--green); + color: var(--white); +} + +.bg-cyan { + background-color: var(--cyan); + color: var(--white); +} + +.bg-blue { + background-color: var(--blue); + color: var(--white); +} + +.bg-purple { + background-color: var(--purple); + color: var(--white); +} + +.bg-mauve { + background-color: var(--mauve); + color: var(--white); +} + +.bg-pink { + background-color: var(--pink); + color: var(--white); +} + +.bg-brown { + background-color: var(--brown); + color: var(--white); +} + +.bg-grey { + background-color: var(--grey); + color: var(--white); +} + +.bg-gray { + background-color: #f0f0f0; + color: var(--black); +} + +.bg-black { + background-color: var(--black); + color: var(--white); +} + +.bg-white { + background-color: var(--white); + color: var(--darkGray); +} + +.bg-shadeTop { + background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01)); + color: var(--white); +} + +.bg-shadeBottom { + background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1)); + color: var(--white); +} + +.bg-red.light { + color: var(--red); + background-color: var(--redLight); +} + +.bg-orange.light { + color: var(--orange); + background-color: var(--orangeLight); +} + +.bg-yellow.light { + color: var(--yellow); + background-color: var(--yellowLight); +} + +.bg-olive.light { + color: var(--olive); + background-color: var(--oliveLight); +} + +.bg-green.light { + color: var(--green); + background-color: var(--greenLight); +} + +.bg-cyan.light { + color: var(--cyan); + background-color: var(--cyanLight); +} + +.bg-blue.light { + color: var(--blue); + background-color: var(--blueLight); +} + +.bg-purple.light { + color: var(--purple); + background-color: var(--purpleLight); +} + +.bg-mauve.light { + color: var(--mauve); + background-color: var(--mauveLight); +} + +.bg-pink.light { + color: var(--pink); + background-color: var(--pinkLight); +} + +.bg-brown.light { + color: var(--brown); + background-color: var(--brownLight); +} + +.bg-grey.light { + color: var(--grey); + background-color: var(--greyLight); +} + +.bg-gradual-red { + background-image: var(--gradualRed); + color: var(--white); +} + +.bg-gradual-orange { + background-image: var(--gradualOrange); + color: var(--white); +} + +.bg-gradual-green { + background-image: var(--gradualGreen); + color: var(--white); +} + +.bg-gradual-purple { + background-image: var(--gradualPurple); + color: var(--white); +} + +.bg-gradual-pink { + background-image: var(--gradualPink); + color: var(--white); +} + +.bg-gradual-blue { + background-image: var(--gradualBlue); + color: var(--white); +} + +.shadow[class*="-red"] { + box-shadow: var(--ShadowSize) var(--redShadow); +} + +.shadow[class*="-orange"] { + box-shadow: var(--ShadowSize) var(--orangeShadow); +} + +.shadow[class*="-yellow"] { + box-shadow: var(--ShadowSize) var(--yellowShadow); +} + +.shadow[class*="-olive"] { + box-shadow: var(--ShadowSize) var(--oliveShadow); +} + +.shadow[class*="-green"] { + box-shadow: var(--ShadowSize) var(--greenShadow); +} + +.shadow[class*="-cyan"] { + box-shadow: var(--ShadowSize) var(--cyanShadow); +} + +.shadow[class*="-blue"] { + box-shadow: var(--ShadowSize) var(--blueShadow); +} + +.shadow[class*="-purple"] { + box-shadow: var(--ShadowSize) var(--purpleShadow); +} + +.shadow[class*="-mauve"] { + box-shadow: var(--ShadowSize) var(--mauveShadow); +} + +.shadow[class*="-pink"] { + box-shadow: var(--ShadowSize) var(--pinkShadow); +} + +.shadow[class*="-brown"] { + box-shadow: var(--ShadowSize) var(--brownShadow); +} + +.shadow[class*="-grey"] { + box-shadow: var(--ShadowSize) var(--greyShadow); +} + +.shadow[class*="-gray"] { + box-shadow: var(--ShadowSize) var(--grayShadow); +} + +.shadow[class*="-black"] { + box-shadow: var(--ShadowSize) var(--blackShadow); +} + +.shadow[class*="-white"] { + box-shadow: var(--ShadowSize) var(--blackShadow); +} + +.text-shadow[class*="-red"] { + text-shadow: var(--ShadowSize) var(--redShadow); +} + +.text-shadow[class*="-orange"] { + text-shadow: var(--ShadowSize) var(--orangeShadow); +} + +.text-shadow[class*="-yellow"] { + text-shadow: var(--ShadowSize) var(--yellowShadow); +} + +.text-shadow[class*="-olive"] { + text-shadow: var(--ShadowSize) var(--oliveShadow); +} + +.text-shadow[class*="-green"] { + text-shadow: var(--ShadowSize) var(--greenShadow); +} + +.text-shadow[class*="-cyan"] { + text-shadow: var(--ShadowSize) var(--cyanShadow); +} + +.text-shadow[class*="-blue"] { + text-shadow: var(--ShadowSize) var(--blueShadow); +} + +.text-shadow[class*="-purple"] { + text-shadow: var(--ShadowSize) var(--purpleShadow); +} + +.text-shadow[class*="-mauve"] { + text-shadow: var(--ShadowSize) var(--mauveShadow); +} + +.text-shadow[class*="-pink"] { + text-shadow: var(--ShadowSize) var(--pinkShadow); +} + +.text-shadow[class*="-brown"] { + text-shadow: var(--ShadowSize) var(--brownShadow); +} + +.text-shadow[class*="-grey"] { + text-shadow: var(--ShadowSize) var(--greyShadow); +} + +.text-shadow[class*="-gray"] { + text-shadow: var(--ShadowSize) var(--grayShadow); +} + +.text-shadow[class*="-black"] { + text-shadow: var(--ShadowSize) var(--blackShadow); +} + +.bg-img { + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.bg-mask { + background-color: var(--black); + position: relative; +} + +.bg-mask::after { + content: ""; + border-radius: inherit; + width: 100%; + height: 100%; + display: block; + background-color: rgba(0, 0, 0, 0.4); + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; +} + +.bg-mask view, +.bg-mask cover-view { + z-index: 5; + position: relative; +} + +.bg-video { + position: relative; +} + +.bg-video video { + display: block; + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; + position: absolute; + top: 0; + z-index: 0; + pointer-events: none; +} + +/* ================== + 文本 + ==================== */ + +.text-xs { + font-size: 20rpx; +} + +.text-sm { + font-size: 24rpx; +} + +.text-df { + font-size: 28rpx; +} + +.text-lg { + font-size: 32rpx; +} + +.text-xl { + font-size: 36rpx; +} + +.text-xxl { + font-size: 44rpx; +} + +.text-sl { + font-size: 80rpx; +} + +.text-xsl { + font-size: 120rpx; +} + +.text-Abc { + text-transform: Capitalize; +} + +.text-ABC { + text-transform: Uppercase; +} + +.text-abc { + text-transform: Lowercase; +} + +.text-price::before { + content: "¥"; + font-size: 80%; + margin-right: 4rpx; +} +.text-Nprice::before { + content: ""; + font-size: 80%; + margin-right: 4rpx; +} + +.text-cut { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.text-bold { + font-weight: bold; +} + +.text-center { + text-align: center; +} + +.text-content { + line-height: 1.6; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-red, +.line-red, +.lines-red { + color: var(--red); +} + +.text-orange, +.line-orange, +.lines-orange { + color: var(--orange); +} + +.text-yellow, +.line-yellow, +.lines-yellow { + color: var(--yellow); +} + +.text-olive, +.line-olive, +.lines-olive { + color: var(--olive); +} + +.text-green, +.line-green, +.lines-green { + color: var(--green); +} + +.text-cyan, +.line-cyan, +.lines-cyan { + color: var(--cyan); +} + +.text-blue, +.line-blue, +.lines-blue { + color: var(--blue); +} + +.text-purple, +.line-purple, +.lines-purple { + color: var(--purple); +} + +.text-mauve, +.line-mauve, +.lines-mauve { + color: var(--mauve); +} + +.text-pink, +.line-pink, +.lines-pink { + color: var(--pink); +} + +.text-brown, +.line-brown, +.lines-brown { + color: var(--brown); +} + +.text-grey, +.line-grey, +.lines-grey { + color: var(--grey); +} + +.text-gray, +.line-gray, +.lines-gray { + color: var(--gray); +} + +.text-black, +.line-black, +.lines-black { + color: var(--black); +} + +.text-white, +.line-white, +.lines-white { + color: var(--white); +} diff --git a/components/logscom/logscom.js b/components/logscom/logscom.js new file mode 100644 index 0000000..f95522a --- /dev/null +++ b/components/logscom/logscom.js @@ -0,0 +1,144 @@ +// components/logscom.js +//导入日志信息请求发方法 +import { + Logsinfo +} from '../../lib/RequestingCenter.js' +Component({ + /** + * 组件的属性列表 + */ + properties: { + hotelsid:{ + type:String, + value:null + } + }, + + /** + * 组件的初始数据 + */ + data: { + //正加载 + status: 0, + page: 1, + logsdata: [], + sum: 0, + pagelength:10, + refresher: false + }, + lifetimes: { + // 生命周期函数,可以为函数,或一个在methods段中定义的方法名 + detached: function () { }, + ready:function(){this.onLoad()} + }, + /** + * 组件的方法列表 + */ + methods: { + onLoad: function () { + let that = this; + setTimeout(function () { + try { + // 1.使用wx.createSelectorQuery()查询到需要滚动到的元素位置 + that.createSelectorQuery().select('#scroll').boundingClientRect(res => { + console.log(res) + // 2.使用wx.getSysTemInfo()获取设备及页面高度windowHeight(px) + wx.getSystemInfo({ + success(ress) { + console.log(ress) + that.setData({ + topheight: ress.windowHeight - res.top + }) + } + }) + }).exec(function (params) { + console.log(params) + }) + } catch (error) { + console.log(error) + } + }, 500) + this.init()}, + // 下拉刷新 + toupper: function () { + if (this.data.refresher) { + return; + } + this.setData({ + refresher: true, + }) + var that = this; + that.setData({ + page: 1, + }) + that.init(); + }, + // 下拉加载 + MoreData: function (params) { + if (this.data.status == 1 || this.data.status == 3) { + return; + } + this.setData({ + status: 1, + page: this.data.page + 1 + }) + this.init(); + }, + //加载数据 + init:async function () { + try { + if(this.data.page<1){ + this.setData({ + page:1 + }) + } + let that = this; + await Logsinfo({ + page:that.data.page, + search:{ hotelsid:that.data.hotelsid,name:'',endtime:'',starttime:''}, + length:that.data.pagelength + }).then(res => { + if (res.Status == 200) { + let newdata = res.Data.data + if(that.data.page>1){ + newdata = that.data.logsdata.concat(newdata); + } + //判断是否有更多 + let more = 0; + if((that.data.page * that.data.pagelength)>=res.Data.filtcount){ + more = 3; + } + that.setData({ + refresher: false, + logsdata: newdata, + status: more, + //过滤后总数 + sum: res.Data.filtcount + }) + } else { + that.setData({ + status:2, + page:that.data.page-1 + }) + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + that.setData({ + status:2, + page:that.data.page-1 + }) + app.toast(2 ,"网络繁忙") + }).catch(err => { + that.setData({ + status:2, + page:that.data.page-1 + }) + console.log(err) + app.toast(2 ,"网络繁忙") + }); + } catch (error) { + console.log(error) + } + }, + } +}) diff --git a/components/logscom/logscom.json b/components/logscom/logscom.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/components/logscom/logscom.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/components/logscom/logscom.wxml b/components/logscom/logscom.wxml new file mode 100644 index 0000000..a66662b --- /dev/null +++ b/components/logscom/logscom.wxml @@ -0,0 +1,30 @@ + + + + + + 操作日志共{{sum}}条 + + + + + + + +{{item.Id}}{{item.uid}} {{filter.TimeFormat(item.createtime)}} +{{item.ActionId}}{{item.AppType==0?"RCU":"人脸机"}}{{item.type==0?"绑定":"解绑"}} + +酒店:{{item.Name}} +房间号:{{item.roomNumber}} - {{item.roomID}} +{{item.AppType==0?"MAC":"SN"}}:{{item.MAC}} +地点:{{item.location}} + + + + + + + + + diff --git a/components/logscom/logscom.wxss b/components/logscom/logscom.wxss new file mode 100644 index 0000000..898dfcf --- /dev/null +++ b/components/logscom/logscom.wxss @@ -0,0 +1,2 @@ +@import "../../colorui/main.wxss"; +@import "../../colorui/icon.wxss"; diff --git a/components/wanselect/wanselect.js b/components/wanselect/wanselect.js new file mode 100644 index 0000000..fd73fb7 --- /dev/null +++ b/components/wanselect/wanselect.js @@ -0,0 +1,45 @@ +// pages/components/selector/selector.js +Component({ + /** + * 组件的属性列表 + */ + properties: { + listData: { + type: Array, + value: [], + } + }, + + /** + * 组件的初始数据 + */ + data: { + selectShow: false, + index: 0 + }, + + /** + * 组件的方法列表 + */ + methods: { + // 点击下拉显示框 + /** + * 切换选择框的显示状态 + * 通过修改selectShow的值来控制选择框的显示/隐藏 + */ + selectTap() { + this.setData({ + selectShow: !this.data.selectShow + }); + }, + // 点击下拉列表 + optionTap(e) { + let Index = e.currentTarget.dataset.index; //获取点击的下拉列表的下标 + this.setData({ + selectShow: !this.data.selectShow, + index: Index + }); + this.triggerEvent('optionTap', this.data.listData[Index]) + }, + } +}) diff --git a/components/wanselect/wanselect.json b/components/wanselect/wanselect.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/components/wanselect/wanselect.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/components/wanselect/wanselect.wxml b/components/wanselect/wanselect.wxml new file mode 100644 index 0000000..5e91c93 --- /dev/null +++ b/components/wanselect/wanselect.wxml @@ -0,0 +1,11 @@ + + + {{listData[index]}} + {{selectShow ? '▲' : '▼'}} + + + {{item}} + + diff --git a/components/wanselect/wanselect.wxss b/components/wanselect/wanselect.wxss new file mode 100644 index 0000000..5b9327a --- /dev/null +++ b/components/wanselect/wanselect.wxss @@ -0,0 +1,63 @@ +/* pages/components/selector/selector.wxss */ + +.select_box { + background: #fff; + width: 100%; + height: 100%; + border-radius: 14rpx; + position: relative; + border: 1px solid #ccc; + z-index: 10; +} + +.select_box .select { + box-sizing: border-box; + width: 100%; + height: 100%; + border-radius: 8rpx; + display: flex; + align-items: center; + padding: 0 10rpx; +} + +.select_box .select .select_text { + font-size: 26rpx; + color: #777777; + line-height: 28rpx; + flex: 1; +} + +.select_box .select .select_img { + width: 30rpx; + height: 30rpx; + display: block; + transition: transform 0.3s; +} + +.select_box .select .select_img_rotate { + transform: rotate(180deg); +} + +.select_box .option_box { + position: absolute; + top: 50rpx; + left: 0; + width: 100%; + box-sizing: border-box; + height: 0; + overflow-y: auto; + background: #fff; + transition: height 0.3s; + border-left: 1px solid #efefef; + border-right: 1px solid #efefef; + +} + +.select_box .option_box .option { + display: block; + line-height: 30rpx; + font-size: 26rpx; + border-top: 1px solid #efefef; + border-bottom: 1px solid #efefef; + padding: 10rpx; +} diff --git a/icon/home.png b/icon/home.png new file mode 100644 index 0000000..76c37e8 Binary files /dev/null and b/icon/home.png differ diff --git a/icon/home_.png b/icon/home_.png new file mode 100644 index 0000000..9b98e9c Binary files /dev/null and b/icon/home_.png differ diff --git a/icon/log.png b/icon/log.png new file mode 100644 index 0000000..562150d Binary files /dev/null and b/icon/log.png differ diff --git a/icon/log_.png b/icon/log_.png new file mode 100644 index 0000000..77c7590 Binary files /dev/null and b/icon/log_.png differ diff --git a/icon/usercenter.png b/icon/usercenter.png new file mode 100644 index 0000000..0139542 Binary files /dev/null and b/icon/usercenter.png differ diff --git a/icon/usercenter_.png b/icon/usercenter_.png new file mode 100644 index 0000000..143b76d Binary files /dev/null and b/icon/usercenter_.png differ diff --git a/icon/vacant.png b/icon/vacant.png new file mode 100644 index 0000000..e3237ff Binary files /dev/null and b/icon/vacant.png differ diff --git a/icon/住宿.png b/icon/住宿.png new file mode 100644 index 0000000..c57ad6f Binary files /dev/null and b/icon/住宿.png differ diff --git a/icon/开门.png b/icon/开门.png new file mode 100644 index 0000000..815a906 Binary files /dev/null and b/icon/开门.png differ diff --git a/icon/设备编号.png b/icon/设备编号.png new file mode 100644 index 0000000..6ca04e7 Binary files /dev/null and b/icon/设备编号.png differ diff --git a/icon/退房.png b/icon/退房.png new file mode 100644 index 0000000..ab46ba3 Binary files /dev/null and b/icon/退房.png differ diff --git a/icon/酒店.png b/icon/酒店.png new file mode 100644 index 0000000..a8fce1c Binary files /dev/null and b/icon/酒店.png differ diff --git a/icon/重启.png b/icon/重启.png new file mode 100644 index 0000000..50fcb59 Binary files /dev/null and b/icon/重启.png differ diff --git a/images/BasicsBg.png b/images/BasicsBg.png new file mode 100644 index 0000000..4c0a18b Binary files /dev/null and b/images/BasicsBg.png differ diff --git a/images/cjkz.png b/images/cjkz.png new file mode 100644 index 0000000..ec9eb2a Binary files /dev/null and b/images/cjkz.png differ diff --git a/images/componentBg.png b/images/componentBg.png new file mode 100644 index 0000000..4d6ed3c Binary files /dev/null and b/images/componentBg.png differ diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000..8043b0d Binary files /dev/null and b/images/logo.png differ diff --git a/images/share.jpg b/images/share.jpg new file mode 100644 index 0000000..b27658f Binary files /dev/null and b/images/share.jpg differ diff --git a/images/tabbar/about.png b/images/tabbar/about.png new file mode 100644 index 0000000..a2e5acc Binary files /dev/null and b/images/tabbar/about.png differ diff --git a/images/tabbar/about_cur.png b/images/tabbar/about_cur.png new file mode 100644 index 0000000..36769f6 Binary files /dev/null and b/images/tabbar/about_cur.png differ diff --git a/images/tabbar/basics.png b/images/tabbar/basics.png new file mode 100644 index 0000000..8a5ce76 Binary files /dev/null and b/images/tabbar/basics.png differ diff --git a/images/tabbar/basics_cur.png b/images/tabbar/basics_cur.png new file mode 100644 index 0000000..5022f49 Binary files /dev/null and b/images/tabbar/basics_cur.png differ diff --git a/images/tabbar/component.png b/images/tabbar/component.png new file mode 100644 index 0000000..0a87a81 Binary files /dev/null and b/images/tabbar/component.png differ diff --git a/images/tabbar/component_cur.png b/images/tabbar/component_cur.png new file mode 100644 index 0000000..581eca6 Binary files /dev/null and b/images/tabbar/component_cur.png differ diff --git a/images/tabbar/plugin.png b/images/tabbar/plugin.png new file mode 100644 index 0000000..a7b540b Binary files /dev/null and b/images/tabbar/plugin.png differ diff --git a/images/tabbar/plugin_cur.png b/images/tabbar/plugin_cur.png new file mode 100644 index 0000000..f541bd8 Binary files /dev/null and b/images/tabbar/plugin_cur.png differ diff --git a/images/wave.gif b/images/wave.gif new file mode 100644 index 0000000..5e50b86 Binary files /dev/null and b/images/wave.gif differ diff --git a/images/zanCode.jpg b/images/zanCode.jpg new file mode 100644 index 0000000..765e600 Binary files /dev/null and b/images/zanCode.jpg differ diff --git a/img/back.png b/img/back.png new file mode 100644 index 0000000..b30b8c3 Binary files /dev/null and b/img/back.png differ diff --git a/img/ble.png b/img/ble.png new file mode 100644 index 0000000..22d2afd Binary files /dev/null and b/img/ble.png differ diff --git a/img/ecble.png b/img/ecble.png new file mode 100644 index 0000000..bc8f4ad Binary files /dev/null and b/img/ecble.png differ diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000..01a53b5 Binary files /dev/null and b/img/logo.png differ diff --git a/img/s1.png b/img/s1.png new file mode 100644 index 0000000..95aed59 Binary files /dev/null and b/img/s1.png differ diff --git a/img/s2.png b/img/s2.png new file mode 100644 index 0000000..912d282 Binary files /dev/null and b/img/s2.png differ diff --git a/img/s3.png b/img/s3.png new file mode 100644 index 0000000..f24adc9 Binary files /dev/null and b/img/s3.png differ diff --git a/img/s4.png b/img/s4.png new file mode 100644 index 0000000..17a6e1b Binary files /dev/null and b/img/s4.png differ diff --git a/img/s5.png b/img/s5.png new file mode 100644 index 0000000..49d802e Binary files /dev/null and b/img/s5.png differ diff --git a/lib/RequestingCenter.js b/lib/RequestingCenter.js new file mode 100644 index 0000000..182a590 --- /dev/null +++ b/lib/RequestingCenter.js @@ -0,0 +1,260 @@ +import reqeust from 'request.js' +import reqeust1 from 'request1.js' +// 本地环境 + // const Url = "http://192.168.0.104:81/ApiWx/"; + + // const Url = "http://localhost:56306/ApiWx/"; + +// 生产环境 + +const Url = "https://auth.blv-oa.com/ApiWx/"; +const BoonliveUrl = "https://auth.blv-oa.com/Upgrade/"; +// 测试环境 + //const Url = "http://auth.blv-oa.com:996/ApiWx/"; + const appid = 5; + +var token = null +//获取token +function gettoken(){ + if (token == null) { + token = wx.getStorageSync('xiaoxi_token') || "" + } + return token; +} +export function settoken(val) { + token = val; +} +//账号密码登录 +export async function Login(params) { + token = null; + params.appid = appid + return await reqeust({ + title: "登录中", + url: Url + 'Login', + data: params || {} + }) +}; +//token登录 +export async function LoginToken(params) { + token = null; + params.appid = appid + return await reqeust({ + title: "登录中", + url: Url + 'LoginToken', + data: params || {} + }) +} +//获取酒店信息 +export async function GetHostsInfo(params) { + params.appid = appid + params.token = gettoken(); + return await reqeust({ + title: "加载中...", + url: Url + 'HostsInfo', + data: params || {} + }) +} +//绑定Mac地址 +export async function GetMAC(params) { + params.token = gettoken(); + return await reqeust({ + title: params.MAC == "" ? "解绑中..." : "绑定中...", + url: Url + 'GetMAC', + data: params || {} + }) +} +// 日志信息 +export async function Logsinfo(params) { + params.token = gettoken(); + return await reqeust({ + title: "加载中...", + url: Url + 'Logsinfo', + data: params || {} + }) +} +// 反馈错误 +export async function ErrorInfo(params) { + params.token = gettoken(); + return await reqeust({ + title: "反馈中...", + url: Url + 'ErrorInfo', + data: params || {} + }) +} +// 查询人脸机是否绑定 +export async function CheckFaceSN(params) { + params.token = gettoken(); + return await reqeust({ + title:"查询中...", + url: Url + 'CheckFaceSN', + data: params || {} + }) +} +// 绑定人脸机 +export async function GetFaceSN(params) { + params.token = gettoken(); + return await reqeust({ + title: params.isjb ? "解绑中..." : "绑定中...", + url: Url + 'GetFaceSN', + data: params || {} + }) +} +//开门测试 +export async function OpenDoorTest(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发开门命令中", + url: Url + 'OpenDoorTest', + data: params || {} + }) +} +//重启测试 +export async function RestartTheDevice(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发重启命令中", + url: Url + 'RestartTheDevice', + data: params || {} + }) +} +//获取设备信息测试 + +export async function GeteDeviceInfomation(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发获取设备信息命令中", + url: Url + 'GeteDeviceInfomation', + data: params || {} + }) +} +//删除所有住户人员信息 + +export async function DeletePeopleFromDeviceByGroup(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发删除所有住户人员信息命令中", + url: Url + 'DeletePeopleFromDeviceByGroup', + data: params || {} + }) +} + +export async function GetThePeopleListOfDevice(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "获取人员信息列表", + url: Url + 'GetThePeopleListOfDevice', + data: params || {} + }) +} +//开房 +export async function openRommCheckin(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发开房命令", + url: Url + 'openRommCheckin', + data: params || {} + }) +} + +//退房 +export async function roomCheckOut(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "下发退房命令", + url: Url + 'roomCheckOut', + data: params || {} + }) +} +//获取房型 +export async function GetRoomType(params){ + params.token = gettoken(); + console.log(params) + return await reqeust({ + title: "获取酒店房型信息", + url: Url + 'GetRoomTypeAndModalsList', + data: params || {} + }) +} +//获取房型下的房间 +export async function GetRoomTypeNode(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: "获取酒店房间信息", + url: BoonliveUrl + 'GetDeviceInfo', + data: params || {} + }) +} + export async function WebChatUpgrade(params){ + + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: "准备设备升级", + url: BoonliveUrl + 'WebChatUpgrade', + data: params || {} + }) +} +export async function GetRoomTypeAndModalsListLog(params){ + + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: "获取房间配置回路信息", + url: BoonliveUrl + 'GetRoomTypeAndModalsListLog', + data: params || {} + }) +} +export async function QueryUpdateHostStatus(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'QueryUpdateHostStatus', + data: params || {} + }) +} +export async function ForwardQueryUpdateHostProgressBar(params){ + params.token = gettoken(); + // console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'ForwardQueryUpdateHostProgressBar', + data: params || {} + }) +} +export async function SetRCULight(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'SetRCULight', + data: params || {} + }) +} +export async function SetRCUAir(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'SetRCUAir', + data: params || {} + }) +} +export async function SetRCUCurtain(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'SetRCUCurtain', + data: params || {} + }) +} +SetRCUCurtain \ No newline at end of file diff --git a/lib/Toast.js b/lib/Toast.js new file mode 100644 index 0000000..59dabe5 --- /dev/null +++ b/lib/Toast.js @@ -0,0 +1,18 @@ +export function Toastsuccess(title,success,time) { + wx.showToast({ + title:title || '成功', + icon:'success', + mask:true, + duration:time||1500, + success:success || null + }) +} +export function ToastError(title,success,time) { + wx.showToast({ + title:title, + icon:'none', + mask:true, + duration:time||1500, + success:success || null + }) +} diff --git a/lib/request.js b/lib/request.js new file mode 100644 index 0000000..0edc854 --- /dev/null +++ b/lib/request.js @@ -0,0 +1,61 @@ +//请求数量 +let show = 0; +export default async function reqeust(params) { + show++; + return new Promise((resolve, reject) => { + wx.showLoading({ + title: params.title, + mask:true + }) + wx.request({ + url: params.url, + method: params.method || 'post', + data: params.data || {}, + success: res => { + resolve(res.data) + }, + fail: err => { + reject(err) + }, + complete:()=>{ + show--; + if(show==0){ + wx.hideLoading() + } + } + }) + }).catch((error) => { + throw new Error(error); + }) +} +// export default async function reqeust1(params) { +// show++; +// return new Promise((resolve, reject) => { +// wx.showLoading({ +// title: params.title, +// mask:true +// }) +// wx.request({ +// header: { +// contentType: 'application/x-www-form-urlencoded', // 填入服务名称 +// }, +// url: params.url, +// method: params.method || 'post', +// data: params.data || {}, +// success: res => { +// resolve(res.data) +// }, +// fail: err => { +// reject(err) +// }, +// complete:()=>{ +// show--; +// if(show==0){ +// wx.hideLoading() +// } +// } +// }) +// }).catch((error) => { +// throw new Error(error); +// }) +// } \ No newline at end of file diff --git a/lib/request1.js b/lib/request1.js new file mode 100644 index 0000000..36011f0 --- /dev/null +++ b/lib/request1.js @@ -0,0 +1,65 @@ +//请求数量 +let show = 0; +export default async function reqeust(params) { + show++; + return new Promise((resolve, reject) => { + + wx.showLoading({ + title: params.title, + mask:true + }) + wx.request({ + header: { + contentType: 'application/x-www-form-urlencoded', // 填入服务名称 + }, + url: params.url, + method: params.method || 'post', + data: params.data || {}, + success: res => { + resolve(res.data) + }, + fail: err => { + reject(err) + }, + complete:()=>{ + show--; + if(show==0){ + wx.hideLoading() + } + } + }) + }).catch((error) => { + throw new Error(error); + }) +} +// export default async function reqeust1(params) { +// show++; +// return new Promise((resolve, reject) => { +// wx.showLoading({ +// title: params.title, +// mask:true +// }) +// wx.request({ +// header: { +// contentType: 'application/x-www-form-urlencoded', // 填入服务名称 +// }, +// url: params.url, +// method: params.method || 'post', +// data: params.data || {}, +// success: res => { +// resolve(res.data) +// }, +// fail: err => { +// reject(err) +// }, +// complete:()=>{ +// show--; +// if(show==0){ +// wx.hideLoading() +// } +// } +// }) +// }).catch((error) => { +// throw new Error(error); +// }) +// } \ No newline at end of file diff --git a/pages/NewHome/NewHome.js b/pages/NewHome/NewHome.js new file mode 100644 index 0000000..a6c3bc0 --- /dev/null +++ b/pages/NewHome/NewHome.js @@ -0,0 +1,147 @@ +const app = getApp() +// pages/NewHome.js +Page({ + options: { + addGlobalClass: true, + }, + /** + * 页面的初始数据 + */ + data: { + elements: [{ + title: '查房', + name: 'MakingRounds', + color: 'cyan', + icon: 'newsfill' + }, + { + title: '查房异常记录', + name: 'MakingRoundsAbnormal', + color: 'blue', + icon: 'colorlens' + }, + { + title: '主机升级', + name: 'HostUpgrade', + color: 'purple', + icon: 'font' + }, + { + title: '主机绑定 ', + name: 'HostBinding', + color: 'mauve', + icon: 'icon' + }, + { + title: '人脸机绑定', + name: 'FacialDeviceBinding', + color: 'pink', + icon: 'btn' + }, + { + title: '红外转发码库下载', + name: 'InfraredLibraryDownload', + color: 'brown', + icon: 'tagfill' + }, + { + title: '程序配置', + name: 'ProgramConfiguration', + color: 'red', + icon: 'myfill' + }, + { + title: '日志查询', + name: 'progress', + color: 'orange', + icon: 'icloading' + }, + + ], + + //权限信息 + autho: null, + //酒店信息 + Hotelinfo: null, + }, + + /** + * 生命周期函数--监听页面加载 + */ + + onLoad: async function (options) { + if (!options.HotelId || app.globalData.autho == null) { + app.toast(2, "无酒店信息~") + return; + } + + this.setData({ + autho: app.globalData.autho + }) + try { + this.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + if (elements.HotelId == options.HotelId) { + this.setData({ + Hotelinfo: elements + }) + throw new Error(); + } + }) + }); + } catch (error) { + console.log("已经找到,无需循环~") + } + + + + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/NewHome/NewHome.json b/pages/NewHome/NewHome.json new file mode 100644 index 0000000..79be446 --- /dev/null +++ b/pages/NewHome/NewHome.json @@ -0,0 +1,5 @@ +{ + "usingComponents": { + + } +} \ No newline at end of file diff --git a/pages/NewHome/NewHome.wxml b/pages/NewHome/NewHome.wxml new file mode 100644 index 0000000..ee7811d --- /dev/null +++ b/pages/NewHome/NewHome.wxml @@ -0,0 +1,21 @@ + + 返回 + {{Hotelinfo.HotelName}}({{Hotelinfo.Code}}) + + + + + + + + + + + {{item.title}} + + + + + + \ No newline at end of file diff --git a/pages/NewHome/NewHome.wxss b/pages/NewHome/NewHome.wxss new file mode 100644 index 0000000..3d4e59b --- /dev/null +++ b/pages/NewHome/NewHome.wxss @@ -0,0 +1,6 @@ +.flex-center { + display: flex; + justify-content: center; /* 水平 */ + align-items: center; /* 垂直 */ + text-align: center; /* 多行时文字也居中 */ +} diff --git a/pages/autho/index.js b/pages/autho/index.js new file mode 100644 index 0000000..21fabe6 --- /dev/null +++ b/pages/autho/index.js @@ -0,0 +1,103 @@ +// pages/autho/index.js +const app = getApp() + +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + onLoad :function (params) { + wx.removeStorage({ + key: 'oldHotelinfo', + success (res) { + console.log('清除历史酒店信息~') + } + }) + this.SQ(); + }, + SQ:function(params) { + app.SQ(isok=>{ + if(isok){ + console.log(params) + app.userLogin(()=>{ + //登录成功~ + wx.reLaunch({ + url: "../index/index", + }) + }); + }else{ + app.getFuzzyLocations(function (params) { + console.log(params) + app.userLogin(()=>{ + //登录成功~ + wx.reLaunch({ + url: "../index/index", + }) + }); + }, + ()=>{ + wx.showToast({ + title: '拒绝将无法进入~', + showCancel:false, + icon:"error" + }) + }) + };} + ) + }, + /** + * 生命周期函数--监听页面加载 + */ + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) diff --git a/pages/autho/index.json b/pages/autho/index.json new file mode 100644 index 0000000..07c896c --- /dev/null +++ b/pages/autho/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/autho/index.wxml b/pages/autho/index.wxml new file mode 100644 index 0000000..e260069 --- /dev/null +++ b/pages/autho/index.wxml @@ -0,0 +1,7 @@ + + 返回 + 授权申请 + + + + \ No newline at end of file diff --git a/pages/autho/index.wxss b/pages/autho/index.wxss new file mode 100644 index 0000000..8625211 --- /dev/null +++ b/pages/autho/index.wxss @@ -0,0 +1 @@ +/* pages/autho/index.wxss */ diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.js b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.js new file mode 100644 index 0000000..e4f3b88 --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.js @@ -0,0 +1,645 @@ +// pages/basics/MakingRounds/MakingRounds.js +const app = getApp() +// const upgrade = require('../../../utils/upgrade.js') +import { + GetHostsInfo, + GetMAC, + GetFaceSN, + ErrorInfo, + CheckFaceSN, + OpenDoorTest, + GetRoomType, + GetRoomTypeAndModalsListLog, + WebChatUpgrade, + QueryUpdateHostStatus, + ForwardQueryUpdateHostProgressBar, + GetRoomTypeNode, + SetRCULight, + SetRCUAir, + SetRCUCurtain, +} from '../../../../lib/RequestingCenter.js' +import DeviceUpgrader from '../../../../utils/upgrade.js'; +const upgrader = new DeviceUpgrader(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + RoomNumber:"", + HotelName:"", + HotelId:"", + HotelCode:"", + roomtypeid:"", + devNode:null, + Gfilename:"", + Pfilename:"", + TabCur:1, + scrollHeight:0, + Completed:false, //是否处于升级状态 + CurrentUpgradeDev:'', //当前升级设备 + CurrentUpgradeDevStart:'',//当前升级设备状态 + UpgradeCount:0, //已升级设备数量 + UpgradeAllCount:1, //总升级设备数量 + // 回路调试相关数据 + roomtypeInfoNode:{}, + roomtypeInfoNodeinfo:[], + VolumeLevel:30, + showinfo:0, + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad:async function(options){ + // 初始化升级器事件监听 + upgrader.on('progress', p => { + console.log(p) + this.setData({ CurrentUpgradeDevStart: p }) // 实时刷新 UI + }) + upgrader.on('error', e => { + wx.showToast({ title: '升级失败', icon: 'none' }) + }) + + if (!options.RoomNumber || !options.HotelName ||!options.HotelId ||!options.roomtypeid ||!options.HotelCode||!options.createTime){ + app.toast(2, "无酒店信息~") + return; + } + console.log(options.RoomNumber) + this.setData ({ + RoomNumber:options.RoomNumber, + HotelName:options.HotelName, + HotelId:options.HotelId, + roomtypeid:options.roomtypeid, + HotelCode:options.HotelCode, + createTime:options.createTime + }) + try { + + // 调用 GetRoomTypeNode + const res = await GetRoomTypeNode({ + hotelid:options.HotelId, + roomTypeID: options.roomtypeid + }); + if (res.IsSuccess==true) { + let devlist = res.HostData + for (let nindex = 0; nindex < devlist.length; nindex++) { + if (devlist[nindex].RoomNumber==options.RoomNumber) { + devlist[nindex].Model =devlist[nindex].Model.trim().replace(/\0/g, "") + console.log(devlist[nindex].Model) + this.setData ({ + devNode:devlist[nindex] + }) + break + } + } + } + const Nres = await GetRoomType({ + HotelID:options.HotelId, + }) + let Gfilename="" + let Pfilename="" +if (Nres.Status==200) { + let Roomtypeinfo=Nres.Data + + for (let index = 0; index < Roomtypeinfo.length; index++) { + const element = Roomtypeinfo[index]; + + if (element.ROOM_TYPE_OLD_ID == options.roomtypeid) { + + if (element.App_Cfg_For_L2.length>0) { + Gfilename=element.App_Cfg_For_L2 + } + if (element.App_Cfg_For_L4.length>0) { + Gfilename=element.App_Cfg_For_L4 + } + if (element.APPTYPE=="App_Cfg") { + Pfilename=element.CONFIG_BIN + }else{ + Pfilename="" + } + break + } + + } + } + await GetRoomTypeAndModalsListLog({ + code:options.HotelCode +}).then(res =>{ + if (res.IsSuccess==true) { + + for (let index = 0; index < res.Result.length; index++) { + const element = res.Result[index]; + if (element.ID == options.roomtypeid) { + this.setData({ + roomtypeInfo:res.Result, + roomtypeInfoNodeinfo:element.Modals + }) + break + } + } + console.log(this.data.roomtypeInfoNodeinfo) + this.LoopDebugging(null) + } +}) + + + this.setData({ + Pfilename:Pfilename, + Gfilename:Gfilename, + }); + + } catch (err) { + console.log('GetRoomTypeNode error', err); + } + + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + this.calcScrollHeight(); + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + upgrader.cancelUpgrade() + upgrader._cleanup() + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + // 手动关闭升级进度显示 + closeUpgradeProgress() { + this.setData({ + Completed: false + }) + }, + + onShareAppMessage() { + + }, + calcScrollHeight() { + // 1. 拿到屏幕可用高度(px) + const sys = wx.getSystemInfoSync(); + const screenHeight = sys.windowHeight; // px + + // 2. 拿到 scroll-view 的 top(px) + wx.createSelectorQuery() + .in(this) + .select('#myScroll') + .boundingClientRect(rect => { + if (rect) { + const topPx = rect.top; // px + const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) + const heightPx = screenHeight - topPx - bottomPx; + + // 3. 转 rpx 并写入 + this.setData({ + scrollHeight: heightPx * 2 // px→rpx + }); + } + }) + .exec(); + }, + tabSelect(e) { + this.setData({ + TabCur: e.currentTarget.dataset.id, + }) + }, + + async UpgradeTheEquipment(e) { + let se = e + let _this = this + let updataDev = e.currentTarget.dataset.id + let errstr = "" + if (updataDev == 1) { + errstr = "固件" + } + if (updataDev == 2) { + errstr = "配置" + } + wx.showModal({ + title: "提示", + content: "是否进行" + errstr + "升级!", + async success(res) { + if (res.confirm) { + await _this.UpgradeTheEquipment2(se) + } else if (res.cancel) { + return + } + } + }) + }, + + async UpgradeTheEquipment2(e) { + let updataDev = e.currentTarget.dataset.id + let errstr = "" + let UpgradeType = "" + let filename = "" + let _this = this + let RoomTypeID = this.data.roomtypeid + let HotelId = this.data.HotelId + let devNode = this.data.devNode + + if (updataDev == 1) { + errstr = "升级固件失败" + UpgradeType = 'firmware' + filename = _this.data.Gfilename + filename = filename.replace('.hex', '.bin') + } + if (updataDev == 2) { + errstr = "升级配置失败" + UpgradeType = '' + filename = _this.data.Pfilename + } + if (filename.length == 0) { + _this.DisplayPrompt("未获取到升级文件!升级失败", 3000) + return + } + + _this.setData({ + UpgradeCount: 0, //升级计数 + CurrentUpgradeDev: devNode.RoomNumber, //当前升级设备 + CurrentUpgradeDevStart: '升级就绪',//当前升级设备状态 + Completed: true, + UpgradeAllCount: 1,//升级总数 + }) + + try { + await upgrader.startUpgrade(UpgradeType, { + roomTypeID: RoomTypeID, + hostidLists: '[' + devNode.ID + ']', + upgradefileName: filename, + hotelid: HotelId + }) + .then(res => { + _this.setData({ + UpgradeCount: _this.data.UpgradeCount + 1, //升级计数 + }) + console.log('升级完成', res) + }) + .catch(err => { + console.log('升级失败', err) + }); + + _this.DisplayPrompt2("升级完成!", 1000) + } catch (error) { + _this.setData({ + CurrentUpgradeDev: devNode.RoomNumber, //当前升级设备 + CurrentUpgradeDevStart: errstr + ',服务器响应异常',//当前升级设备状态 + }) + // this.DisplayPrompt(errstr + ',服务器响应异常', 1000) + return + } + }, + + DisplayPrompt2(tipstr, showtime) { + wx.showToast({ + title: tipstr, + icon: 'none', + duration: showtime + }) + }, + + DisplayPrompt(tipstr, showtime) { + wx.showToast({ + title: tipstr, + icon: 'none', + duration: showtime + }) + }, + + LoopDebugging:async function (e) + { + // + + let roomtypeInfoNodeinfo=this.data.roomtypeInfoNodeinfo + let addrtype + const myMap =[] + let li =[] + let addrtypelist =true + + let message =this.data.message + for (let index = 0; index < roomtypeInfoNodeinfo.length; index++) { + const element = roomtypeInfoNodeinfo[index]; + addrtype=this.GetloopType(element.ModalAddress) + if (addrtype.length==0) { + continue + } + addrtypelist=true + for (let index2 = 0; index2 < myMap.length; index2++) { + const element2 = myMap[index2]; + + if ( element2[0] == addrtype[0][0]) { + li= myMap[index2][1] + li.push([element.ModalAddress,element.Name,addrtype[0][1]]) + myMap[index2][1]=li + addrtypelist=false + break + } + } + + if (addrtypelist) { + li=[] + li.push([element.ModalAddress,element.Name,addrtype[0][1]]) + myMap.push([addrtype[0][0],li]) + } + + + } + + roomtypeInfoNodeinfo=myMap.sort((a, b) => a[0] - b[0]) + //获取房间在线状态 roomstart + console.log(roomtypeInfoNodeinfo) + + + + + + this.setData({ + roomtypeInfoNodeinfo:roomtypeInfoNodeinfo + }) + console.log(this.data.roomtypeInfoNode) + }, + GetloopType(loopaddr){ + let astr =loopaddr[0]+loopaddr[1]+loopaddr[2] + let aint =parseInt(astr,10) + let bint =[] + + switch (aint) { + case 1 : + // case 4 : + // case 54: + bint.push([1,[[1,'开关',0]]])//开关 + break; + case 5: //开关停 + bint.push([5,[[1,'开关',0]]]) + break; + case 7: //开关停 + + bint.push([7,[[1,'开关',0],[2,'模式',1],[3,'风速',1],[4,'温度',25],[5,'阀开',0]]]) + break; + case 23 : + case 24: + bint.push([23,[[1,'开关',10]]]) + break; + case 52: + bint.push([52,[[1,'开关',0],[2,'亮度',10],[3,'色温',10]]]) + break; + default: + + break; + } + + return bint + }, + + // 播放欢迎词 + GetshowinfoClick() { + this.setData({ + showinfo: this.data.showinfo + 1 + }) + }, + + // 调整音量 + changeVolumeLevel(e) { + this.setData({ + VolumeLevel: e.detail.value + }) + }, + + // 设置设备开关状态 + SetDeviceSwitchStatus(e) { + let devarr = e.target.dataset.index + let devval = parseInt(e.target.dataset.value) + let ID = parseInt(e.target.id) + let type = e.target.dataset.type + this.SetDevStartToHostMachine(ID, devarr, devval, type) + console.log(e) + }, + + // 设置设备调光亮度 + SetDeviceSwitchStatusslider(e) { + let devarr = e.target.dataset.index + let devval = parseInt(e.detail.value) + let ID = parseInt(e.target.id) + this.SetDevStartToHostMachine(ID, devarr, devval, 0) + console.log(e) + }, + + // 设备控制主方法 + SetDevStartToHostMachine: async function (id, devarr, Handletype, type) { + let roomtypeInfoNodeinfo = this.data.roomtypeInfoNodeinfo + let narry = [] + for (let index = 0; index < roomtypeInfoNodeinfo.length; index++) { + const element = roomtypeInfoNodeinfo[index]; + if (element[0] === id) { + for (let nindex = 0; nindex < element[1].length; nindex++) { + const nelement = element[1][nindex]; + if (nelement[0] === devarr) { + narry = this.SetloopDataChange(id, nelement[2], Handletype, type) + let iset = await this.ControlStatusMainCircuit(id, narry, devarr) + if (iset) { + roomtypeInfoNodeinfo[index][1][nindex][2] = narry + this.setData({ + roomtypeInfoNodeinfo: roomtypeInfoNodeinfo + }) + } + return + } + } + return + } + } + }, + + // 回路数据变更 + SetloopDataChange(id, dataarry, Handletype, type) { + let result = [] + switch (id) { + case 1: + if (dataarry[0][2] == 1) { + dataarry[0][2] = 0 + } else { + dataarry[0][2] = 1 + } + result = dataarry + break; + case 23: + case 5: + dataarry[0][2] = Handletype + result = dataarry + break; + case 52: + let devval = parseInt(type) + if (devval == 1) { + if (dataarry[devval - 1][2] == 1) { + dataarry[devval - 1][2] = 0 + result = dataarry + } else { + dataarry[devval - 1][2] = 1 + result = dataarry + } + } else { + dataarry[devval - 1][2] = Handletype + result = dataarry + } + break; + case 7: + let bevval = parseInt(type) + switch (bevval) { + case 1: + if (dataarry[bevval - 1][2] == 1) { + dataarry[bevval - 1][2] = 0 + result = dataarry + } else { + dataarry[bevval - 1][2] = 1 + result = dataarry + } + break; + case 3: + case 2: + if (dataarry[bevval - 1][2] == 4) { + dataarry[bevval - 1][2] = 1 + } else { + dataarry[bevval - 1][2] = dataarry[bevval - 1][2] + 1 + } + break; + case 4: // - + if (dataarry[bevval - 1][2] == 16) { + break; + } else { + dataarry[bevval - 1][2] = dataarry[bevval - 1][2] - 1 + } + break + case 5: // + + if (dataarry[bevval - 2][2] == 32) { + break; + } else { + dataarry[bevval - 2][2] = dataarry[bevval - 2][2] + 1 + } + break; + default: + break; + } + result = dataarry + break; + default: + break; + } + return result + }, + + // 控制状态主回路 + ControlStatusMainCircuit: async function (id, dataarry, addr) { + let RoomNumber = this.data.RoomNumber + let HotelId = this.data.HotelCode + let devNode = this.data.devNode + let res = [] + let sw = dataarry[0][2] + + // 解析.NET风格的日期格式 "/Date(1473004800000)/" + let dotNetDate = this.data.createTime + let timestamp, pageCreateTime + try { + timestamp = parseInt(dotNetDate.match(/\d+/)[0]) + pageCreateTime = new Date(timestamp) + } catch (error) { + console.error('日期解析错误:', error) + // 如果解析失败,使用当前日期作为备选 + pageCreateTime = new Date() + } + let year = pageCreateTime.getFullYear() + let month = (pageCreateTime.getMonth() + 1).toString().padStart(2, '0') + let day = pageCreateTime.getDate().toString().padStart(2, '0') + let CreateTime = `${year}-${month}-${day}` + + switch (id) { + case 1: + sw = sw == 1 ? 1 : 2 + res = await SetRCULight({ + roomNumber: RoomNumber, + code: HotelId, + creatDate: CreateTime, + status: sw, + modalAddress: addr, + brightness: 0 + }) + break; + + case 5: + res = await SetRCUCurtain({ + roomNumber: RoomNumber, + code: HotelId, + creatDate: CreateTime, + modalAddress: addr, + status: sw + }) + break + case 7: + res = await SetRCUAir({ + roomNumber: RoomNumber, + code: HotelId, + creatDate: CreateTime, + modalAddress: addr, + onOff: sw, + temperature: dataarry[3][2], + fanSpeed: dataarry[2][2] == 4 ? 0 : dataarry[2][2], + mode: dataarry[1][2] == 4 ? 0 : dataarry[1][2], + valve: 1 + }) + break + case 23: + res = await SetRCULight({ + roomNumber: RoomNumber, + code: HotelId, + creatDate: CreateTime, + status: sw == 0 ? 2 : 1, + modalAddress: addr, + brightness: sw + }) + break; + default: + return false + break; + } + + if (res.IsSuccess == true) { + return true + } + return false + }, +}) \ No newline at end of file diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.json b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxml b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxml new file mode 100644 index 0000000..ad0291f --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxml @@ -0,0 +1,242 @@ + + 返回 + ({{HotelName}})_{{RoomNumber}} + + + + + + + + + 房号:{{RoomNumber}} + {{ devNode.Status==true? "在线":"离线"}} + + + + + + MAC:{{devNode.MAC}} + + 主机:{{devNode.Model}} + 配置版本:{{devNode.ConfigVersion}} + + + 固件版本:{{devNode.Version}} + + + + + + + + + + + {{Gfilename}} + + + {{Pfilename}} + + + + + + + + + + + + 正在升级房号:{{CurrentUpgradeDev}}:{{CurrentUpgradeDevStart}} + + 关闭 + + + + + + + 主机控制 + + + 控制日志 + + + + + + + + + + + + + + + + + + {{VolumeLevel}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][DimIndex][1]}} + + {{row[1][DimIndex][2][0][2]}} + + + + + + + + 开关 + 色温 + 亮度 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][coloIndex][1]}} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][coloIndex][2][3][2]}} + + + + + + + + + + + + + + + + + + + + diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxss b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxss new file mode 100644 index 0000000..319d5e8 --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol.wxss @@ -0,0 +1,25 @@ +.cubarN { + display: flex; + position: relative; + align-items: center; + min-height: 50rpx ; + justify-content: space-between; +} +.setborder +{ + border: 1rpx solid #999; +} + .Ncu-bar { + display: flex; + position: relative; + align-items: center; + min-height: 70rpx ; + justify-content: space-between; +} +.Ncu-bar1 { + display: flex; + position: relative; + align-items: center; + min-height: 70rpx ; + +} \ No newline at end of file diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.js b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.js new file mode 100644 index 0000000..b3f9b2b --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.js @@ -0,0 +1,2020 @@ +// pages/Hosts/Hosts.js +const app = getApp() +//导入酒店信息请求发方法 +import { + GetHostsInfo, + GetMAC, + GetFaceSN, + ErrorInfo, + CheckFaceSN, + OpenDoorTest, + GetRoomType, + GetRoomTypeAndModalsListLog, + WebChatUpgrade, + QueryUpdateHostStatus, + ForwardQueryUpdateHostProgressBar, + GetRoomTypeNode, + SetRCULight, + SetRCUAir, + SetRCUCurtain, +} from '../../lib/RequestingCenter.js' +import md5 from '../../utils/md5.min.js' + +Page({ + /** + * 页面的初始数据 + */ + data: { + islogs: false, + //手动输入 + FaceSNinput: 0, + //手动输入 + input: 0, + //显示 0 全部 1 主机 2 人脸机 + showinfo:0, + //帮助 + Help: false, + //弹窗 + modal: 0, + //房间数据 + HostsData: null, + //过滤后房间数据 + HostsDataFilters: null, + //酒店信息 + Hotelinfo: null, + //是否返回 只有一个酒店不能返回 + isback: true, + //已经绑定是数量 + YMac: 0, + //未绑定是数量 + NMac: 0, + //筛选按钮的值 + sel: 0, + //权限信息 + autho: null, + //选择的房间信息 + selHosts: null, + //扫描的条形码 + code: null, + //swview高度 + top_height: 0, + top_Nheight: 0, + //本次操作的状态数据 + statusdata: [0, 0, 0, 0], + //mac绑定的酒店 服务器获取 + bdHosts:[], + //房型信息 + roomtype:[], + //升级状态 + Upgradestatus:"", + UpgradestatusTimeout:"", + UpgradestatusTimeout2:"", + UpgradestIstrue:true, + Upgradenode:[], + //房间信息 + roomtypeInfo:[], + //房间回路信息 + roomtypeInfoNode:[], + roomtypeInfoNodeinfo:[], + + ISLoopDebugging:0, + // 播放音量 + VolumeLevel:30, + + roomGfilename:"", + roomPfilename:"", + }, + // 监听单个字段 + + + observersUpgradestatus: function() { + + let Upgradestatus=this.data.Upgradestatus + let UpgradestatusTimeout2=this.data.UpgradestatusTimeout2 + if (Upgradestatus=="升级就绪"||Upgradestatus[0]=='.'||Upgradestatus[Upgradestatus.length-1]=="%") { + + if (UpgradestatusTimeout2>0) { + this.setData({ + UpgradestatusTimeout:UpgradestatusTimeout2 + }) + this.observersUpgradestatusTimeout() + } + + } + + }, + observersUpgradestatusTimeout:async function () { + let _this =this + let Upgradestatus=this.data.Upgradestatus + var timestampSec = Math.floor(Date.now() / 1000); + var UpgradestatusTimeout=this.data.UpgradestatusTimeout + if ((timestampSec-UpgradestatusTimeout) >120) { + _this.setData({ + Upgradestatus:"升级超时!", + UpgradestatusTimeout2:0 + }) + + }else{ + + + setTimeout(async function () { + let UpgradestIstrue =_this.data.UpgradestIstrue + let selHosts =_this.data.selHosts + let ID =selHosts.HotelID + let bID =selHosts.Id + let Upgradenode=_this.data.Upgradenode + let RoomTypeID = selHosts.RoomTypeID + let dastr =_this.data.Upgradestatus + let Version =Upgradenode.CFG_CURR_VER + ".0.0" + let str= Upgradenode.App_Cfg_For_L4 + var getnode + //let gVersion = str.split('_')[0]+"_"+ str.split('_')[1]+"_"+ str.split('_')[2]+"_"+ str.split('_')[3]+"_"+str.split('_')[4] + if (dastr=="升级就绪") { + dastr='' + } + if (dastr[dastr.length-1]=="%") { + dastr='' + } + if (dastr.length>6) { + dastr='.' + }else{ + dastr=dastr+'.' + } + + if (UpgradestIstrue ==true){ + await QueryUpdateHostStatus({ + hotelid:ID, + roomTypeID:RoomTypeID + }).then(res => { + if (res.total ==1) { + + if (res.rows.length>0) { + getnode=res.rows[0] + //配置 + if (getnode.ConfigVersion==Version) { + _this.setData({ + Upgradestatus:'升级完成!', + UpgradestatusTimeout2:0 + }) + + } else{ + _this.setData({ + Upgradestatus:dastr, + UpgradestatusTimeout2:timestampSec + }) + } + + + + }else + { + _this.setData({ + Upgradestatus:dastr + }) + } + + } else{ + _this.setData({ + Upgradestatus:"服务器反馈设备升级失败!", + UpgradestatusTimeout2:0 + }) + } + + }, err => { + _this.setData({ + Upgradestatus:"服务器接口调用异常,设备升级失败!", + UpgradestatusTimeout2:0 + }) + }).catch(err => { + _this.setData({ + Upgradestatus:"服务器接口调用异常,设备升级失败!", + UpgradestatusTimeout2:0 + }) + }); + }else{ + + await ForwardQueryUpdateHostProgressBar({ + hostIDList:'['+bID+']' + + }).then(res => { + if (res.IsSuccess ==true) { + + if (res.Response.length>0) { + getnode=res.Response[0] + + if (getnode.BaiFenBi=="100%") { + _this.setData({ + Upgradestatus:'升级完成!', + UpgradestatusTimeout2:0 + }) + + } else{ + if (getnode.BaiFenBi.length>0) { + _this.setData({ + Upgradestatus:getnode.BaiFenBi, + UpgradestatusTimeout2:timestampSec + }) + } else{ + _this.setData({ + Upgradestatus:dastr, + UpgradestatusTimeout2:timestampSec + }) + } + + } + + + + }else + { + _this.setData({ + Upgradestatus:dastr + }) + } + + } else{ + _this.setData({ + Upgradestatus:"服务器反馈设备升级失败!", + UpgradestatusTimeout2:0 + }) + } + + }, err => { + _this.setData({ + Upgradestatus:"服务器接口调用异常,设备升级失败!", + UpgradestatusTimeout2:0 + }) + }).catch(err => { + _this.setData({ + Upgradestatus:"服务器接口调用异常,设备升级失败!", + UpgradestatusTimeout2:0 + }) + }); + } + _this.observersUpgradestatus() + + }, 1000) + + //定时询问 + + } + }, + changeVolumeLevel(e) + { + + let VolumeLevel =e.detail.value + console.log(e) + this.setData({ + VolumeLevel:VolumeLevel + }) + }, + + GetFaceSN_long:function (params) { + if (!this.CheckFaceSNAutho()) { + app.toast(2, "无绑定权限~") + return; + } + let index = params.currentTarget.dataset['index'] + // console.log(index) + let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + this.setData({ + selHosts: selHosts, + FaceSNinput: 100 + }) + if (this.data.HostsDataFilters[index].FaceSN != "" && this.data.HostsDataFilters[index].FaceSN != null) { + this.setData({ + modal: -1, + message: [ this.data.HostsDataFilters[index].FaceSN,selHosts.RoomNumber] + }) + } else { + this.ShowInputsn(); + } + }, + /// 解绑sn + JbSn:function(params) { + let jbjd = null; + let faceSN = null; + let that = this; + let index = -1; + //debugger + if( typeof params.currentTarget.dataset['index'] != 'undefined'){ + faceSN = this.data.code; + index = params.currentTarget.dataset['index'] + //解绑的房间 + jbjd = this.data.bdHosts[index]; + // 0 表示绑定成功~ + // 1 表示绑定失败~ + // 2 表示取消绑定~ + // xg + }else{ + jbjd = this.data.selHosts; + faceSN = this.data.selHosts.FaceSN; + } + console.log(jbjd) + + GetFaceSN({faceSN:faceSN,roomID:jbjd.Id,roomNumber:jbjd.RoomNumber,faceAddress:this.data.address,HotelID:jbjd.HotelID,isjb:true}).then( + res => { + if (res.Status == 200) { + switch (res.Data) { + case 0: + try { + app.toast(1, "解绑成功~"); + let data = that.data.HostsData; + let OLD = -1; + try { + data.forEach( + (x, INDEX) => { + if (x.RoomNumber === jbjd.RoomNumber) { + OLD = INDEX; + throw new Error(); + } + } + )} catch (error) { + } + if (OLD >= 0) { + // 0 表示绑定成功~ + // 1 表示绑定失败~ + // 2 表示取消绑定~ + data[OLD].xg = 2; + data[OLD].FaceSN = ""; + } + let res = that.GetFilters(that.data.sel, data); + let databdHosts = that.data.bdHosts; + let selHosts = that.data.selHosts; + // 表示 是查询到 sn被绑定 index>-1 ==-1 表示是长安解绑 + if(index>-1){ + databdHosts.splice(index,1); + }else{ + selHosts.FaceSN = null + } + that.setData({ + selHosts:selHosts, + HostsData: data, + bdHosts:databdHosts, + HostsDataFilters: res[0], + statusdata: res[1], + input: 0 + }) + } catch (error) { + console.log(error) + } + break; + case 1: + app.toast(2, "SN已经绑定酒店~") + break; + case 2: + app.toast(2, "SN绑定酒店失败~") + break; + case 3: + app.toast(2, "SN注册绑定酒店失败~") + break; + case 4: + app.toast(2, "未知错误~") + break; + case 5: + app.toast(2, "数据不符合~") + break; + case 6: + app.toast(2, "解绑失败~") + break; + default: + app.toast(2, "其他错误~") + break; + } + /// 0 成功 + /// 1 已经注册已经绑定酒店 + /// 2 已经注册更新失败 + /// 3 未注册为分配酒店 添加注册 添加酒店是啊比 + /// 4 未能预计的结果-- + /// 5 数据不符合 + /// 6 解绑失败 + console.log(0) + + } + else{ + app.toast(2, "网络繁忙") + } + }, + err => { + app.toast(2, "网络繁忙") + } + ).catch(err => { + app.toast(2, "网络繁忙") + }); + }, + CheckFaceMAC:function(vlues){ + return true; + console.log(vlues.length != 16) + return vlues.length == 16; + }, + SetDeviceSwitchStatus(e){ + let devarr=e.target.dataset.index + let devval=parseInt(e.target.dataset.value) + let ID=parseInt(e.target.id) + let type =e.target.dataset.type + debugger + this.SetDevStartToHostMachine(ID,devarr,devval,type) + console.log(e) + + }, + SetDeviceSwitchStatusslider(e){ + let devarr=e.target.dataset.index + let devval=parseInt(e.detail.value) + let ID=parseInt(e.target.id) + + this.SetDevStartToHostMachine(ID,devarr,devval,0) + console.log(e) + + }, + SetDevStartToHostMachine: async function (id,devarr,Handletype,type){ + let roomtypeInfoNodeinfo=this.data.roomtypeInfoNodeinfo + let narry=[] + for (let index = 0; index < roomtypeInfoNodeinfo.length; index++) { + const element = roomtypeInfoNodeinfo[index]; + if (element[0]===id) { + for (let nindex = 0; nindex < element[1].length; nindex++) { + const nelement = element[1][nindex]; + if (nelement[0]===devarr) { + narry =this.SetloopDataChange(id,nelement[2] ,Handletype,type) + let iset =await this.ControlStatusMainCircuit(id,narry,devarr) + if (iset) { + roomtypeInfoNodeinfo[index][1][nindex][2]=narry + this.setData({ + roomtypeInfoNodeinfo:roomtypeInfoNodeinfo + }) + } + + + return + } + } + return + } + } + }, + SetloopDataChange(id, dataarry,Handletype,type){ + + let result =[] + switch (id) { + case 1: + if (dataarry[0][2]==1) { + dataarry[0][2]=0 + }else + { + dataarry[0][2]=1 + } + result=dataarry + break; + case 23: + case 5: + dataarry[0][2]=Handletype + result=dataarry + break; + case 52: + let devval=parseInt(type) + if (devval==1) { + if ( dataarry[devval-1][2]==1) { + dataarry[devval-1][2]=0 + result=dataarry + }else{ + dataarry[devval-1][2]=1 + result=dataarry + } + + }else{ + dataarry[devval-1][2]=Handletype + result=dataarry + } + + break; + case 7: + let bevval=parseInt(type) + switch (bevval) { + case 1: + if ( dataarry[bevval-1][2]==1) { + dataarry[bevval-1][2]=0 + result=dataarry + }else{ + dataarry[bevval-1][2]=1 + result=dataarry + } + break; + case 3: + case 2: + if (dataarry[bevval-1][2]==4) { //制冷 制热 送风 自动 + dataarry[bevval-1][2]=1 + }else{ + dataarry[bevval-1][2]= dataarry[bevval-1][2]+1 + } + + break; + + case 4: //- + if (dataarry[bevval-1][2]==16) { + break; + }else{ + dataarry[bevval-1][2]=dataarry[bevval-1][2]-1 + } + break + case 5: //+ + + if (dataarry[bevval-2][2]==32) { + break; + }else{ + dataarry[bevval-2][2]=dataarry[bevval-2][2]+1 + } + + break; + + default: + break; + } + + // bint.push([7,[[1,'开关',0],[2,'模式',0],[3,'风速',0],[4,'温度',25],[5,'阀开',0]]]) + result=dataarry + break; + default: + break; + } + return result + }, + + ControlStatusMainCircuit:async function (id, dataarry,addr){ + let HostsDataFilters =this.data.HostsDataFilters + let selHosts =this.data.selHosts + let Hotelinfo=this.data.Hotelinfo + let timestr = HostsDataFilters[0].CreateTime + console.log(timestr) + + let timestamp = parseInt(timestr.match(/\d+/)[0]); + let date = new Date(timestamp); + + // 格式化输出(示例:YYYY-MM-DD HH:mm:ss) + let year = date.getFullYear(); + let month = (date.getMonth() + 1).toString().padStart(2, '0'); + let day = date.getDate().toString().padStart(2, '0'); + let CreateTime = `${year}-${month}-${day}` + let res=[] + let sw =dataarry[0][2] + + switch (id) { + case 1: + sw= sw==1 ? 1:2 + res = await SetRCULight({ + roomNumber:selHosts.RoomNumber, + code:Hotelinfo.Code, + creatDate:CreateTime, + status: sw, + modalAddress:addr, + brightness:0 + }) + break; + + + case 5: + res = await SetRCUCurtain({ + roomNumber:selHosts.RoomNumber, + code:Hotelinfo.Code, + creatDate:CreateTime, + modalAddress:addr, + status:sw + }) + break + case 7: + + res = await SetRCUAir({ + roomNumber:selHosts.RoomNumber, + code:Hotelinfo.Code, + creatDate:CreateTime, + modalAddress:addr, + onOff:sw, + temperature:dataarry[3][2], + fanSpeed:dataarry[2][2]==4? 0:dataarry[2][2], + mode:dataarry[1][2]==4? 0:dataarry[1][2], + valve:1 + }) + break + case 23: + res = await SetRCULight({ + roomNumber:selHosts.RoomNumber, + code:Hotelinfo.Code, + creatDate:CreateTime, + status: sw==0 ? 2:1, + modalAddress:addr, + brightness:sw + }) + break; + default: + return false + break; + } + + if (res.IsSuccess==true) { + return true + } + return false + + }, + GetFaceSNend:function(){ + this.GetHide(); + let that = this; + let xg = 1; + GetFaceSN({faceSN:this.data.code, roomID:this.data.selHosts.Id,roomNumber:this.data.selHosts.RoomNumber,faceAddress:this.data.address,HotelID:this.data.Hotelinfo.HotelId}).then( + res => { + if (res.Status == 200) { + switch (res.Data) { + case 0: + app.toast(1, "绑定成功~"); + xg = 0; + break; + case 1: + app.toast(2, "SN已经绑定酒店~"); + break; + case 2: + xg = 1; + app.toast(2, "SN绑定酒店失败~"); + break; + case 3: + app.toast(2, "SN注册绑定酒店失败~"); + break; + case 4: + app.toast(2, "未知错误~"); + break; + case 5: + app.toast(2, "数据不符合~"); + break; + case 6: + app.toast(2, "解绑失败~"); + break; + default: + app.toast(2, "其他错误~"); + break; + } + + + /// 0 成功 + /// 1 已经注册已经绑定酒店 + /// 2 已经注册更新失败 + /// 3 未注册为分配酒店 添加注册 添加酒店是啊比 + /// 4 未能预计的结果-- + /// 5 数据不符合 + /// 6 解绑失败 + try { + + + that.data.selHosts.xg = xg; + if(xg==0){ + that.data.selHosts.FaceSN = this.data.code; + } + let data = that.data.HostsData; + data[that.data.selHosts.index] = that.data.selHosts; + let res = that.GetFilters(that.data.sel, that.data.HostsData); + that.setData({ + HostsData: data, + HostsDataFilters: res[0], + statusdata: res[1], + code: null, + input: 0 + }) + } catch (error) { + console.log(error) + } + } + else{ + app.toast(2, "网络繁忙") + } + }, + err => { + app.toast(2, "网络繁忙") + } + ).catch(err => { + app.toast(2, "网络繁忙") + }); + }, + CheckFaceMACWL(){ + let that = this; + CheckFaceSN({faceSN:this.data.code}).then( + res => { + if (res.Status == 200) { + if(res.Data<=0){ + that.setData({ + modal:-521, + }) + }else{ + let remove = []; + let bdHosts = res.Data; + try { + //记录已经分配酒店但是未分配房间 且酒店是当前酒店 那就判断为没有绑定 + that.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + for (let index = 0; index < bdHosts.length; index++) { + if (elements.HotelId == bdHosts[index].HotelID) { + if(bdHosts[index].HotelID == that.data.Hotelinfo.HotelId && bdHosts[index].Id==0){ + remove.push(index); + } + elements.Auth.forEach (Auth=>{ + if(Auth.AuthorityId == 21 && Auth.AuthotypeId == 3){ + //有权限 + bdHosts[index].qx = 0; + } + }) + } + } + }) + }); + } catch (error) { + console.log(error) + } + remove.forEach (x=>{ + bdHosts.splice(x, 1); + }) + let modalval = -200; + if(bdHosts.length<=0){ + modalval = -521; + } + that.setData({ + modal:modalval, + bdHosts:bdHosts + }) + // app.toast(2, "已经被绑定") + } + }else{ + app.toast(2, "网络繁忙") + } + }, + err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + app.toast(2, "网络繁忙") + }); + }, + GetFaceSNOK:function(){ + let that = this; + if (!this.CheckFaceMAC(that.data.code)) { + this.setData({ + modal: 520 + }) + return; + }; + if (that.data.selHosts.FaceSN == that.data.code) { + app.toast(2, "条码一致,无需更改~") + return; + } + this.CheckFaceMACWL() + }, + //GetFaceCode 人脸机扫码 + GetFaceCode:function(){ + var that = this; + setTimeout(function () { + that.GetHide() + }, 100); + wx.scanCode({ + // onlyFromCamera: true,// 只允许从相机扫码 + success(res) { + // 扫码成功后 在此处理接下来的逻辑 + that.setData({ + code: res.result + }) + that.GetFaceSNOK(); + }, + fail(err) { + app.toast(2, "未识别到有效条形码") + } + }) + }, + //检查人脸机房间权限 + CheckFaceSNAutho: function () { + let res = false; + this.data.Hotelinfo.Auth.forEach(x=>{ + if(x.AuthorityId==21 && x.AuthotypeId == 3){ + res = true; + } + }); + return res; + }, +// 点击人脸机 + GetFaceSN:function (params) { + //长按事件 + if (this.endTime - this.startTime > 350) { + return; + } + if (!this.CheckFaceSNAutho()) { + app.toast(2, "无绑定权限~") + return; + } + let index = params.currentTarget.dataset['index'] + // console.log(index) + let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + this.setData({ + selHosts: selHosts, + FaceSNinput: 0 + }) + if (this.data.HostsDataFilters[index].FaceSN != "" && this.data.HostsDataFilters[index].FaceSN != null) { + this.setData({ + modal:-1, + message: [this.data.HostsDataFilters[index].FaceSN, selHosts.RoomNumber] + }) + } else { + this.GetFaceCode() + } + + }, +//人脸机测试 +testinfo:function(e){ +// console.log(e.currentTarget.id) +var jbjd=this.data.selHosts +// console.log(jbjd) +wx.navigateTo({ + url: '/pages/test/test?Hotelinfo=' + e.currentTarget.id+'&RoomID='+jbjd.Id+'&faceadd='+this.data.address +}) +}, + +//开门测试 +OpenDoor:function(e){ + var that=this; + console.log(e.currentTarget.id) + var sn=e.currentTarget.id.split("_") + console.log(sn) + OpenDoorTest({faceSN:sn[2],isjb:true}).then( + res => { + if (res.Status == 200) { + app.toast(2, res.Message) + } + else{ + app.toast(2, res.Message) + } + }, + err => { + app.toast(2, "网络繁忙") + } + ).catch(err => { + app.toast(2, "网络繁忙") + }); + }, + + + + //检查房间权限 + CheckAutho: function () { + let res = false; + this.data.Hotelinfo.Auth.forEach(x=>{ + if(x.AuthorityId==16 && x.AuthotypeId == 3){ + res = true; + } + }); + return res; + }, + //touch start 开始触摸房间区域 + handleTouchStart: function (e) { + this.startTime = e.timeStamp; + //console.log(" startTime = " + e.timeStamp); + }, + //touch end结束触摸房间区域 + handleTouchEnd: function (e) { + this.endTime = e.timeStamp; + //console.log(" endTime = " + e.timeStamp); + }, + // 帮助 + HelpClick: function (params) { + this.setData({ + islogs: false, + Help: !this.data.Help + }) + }, + //日志信息 + islogsClick: function (params) { + this.setData({ + islogs: !this.data.islogs, + Help: false + }) + }, + // 长按房间 + GetMAC_long: function (params) { + if (!this.CheckAutho()) { + app.toast(2, "无绑定权限~") + return; + } + let index = params.currentTarget.dataset['index'] + // console.log(index) + let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + this.setData({ + selHosts: selHosts, + input: 100 + }) + if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) { + this.setData({ + modal: 1, + message: [selHosts.RoomNumber, this.data.HostsDataFilters[index].MAC] + }) + } else { + this.ShowInput(); + } + }, + // 手动输入mac + ShowInput: function (params) { + this.setData({ + modal: 1000, + code:"" + }) + }, + // 手动输入sn + ShowInputsn: function (params) { + this.setData({ + modal: -1000, + code:"" + }) + }, + //解绑MAC + Jb:async function(params) { + let index = params.currentTarget.dataset['index'] + //解绑的酒店 + let jbjd = this.data.bdHosts[index]; + // this.GetMacOKend(false); + let that = this; + await GetMAC({ + roomNumber: jbjd.RoomNumber, + roomID: jbjd.Id, + HotelID: jbjd.HotelID, + MAC: "", + NoCheck: false, + loc: that.data.address + }).then( + res => { + if (res.Status == 1000) { + app.toast(2, "无权限") + } + if (res.Status == 200) { + app.toast(1, "解绑成功") + var databdHosts = that.data.bdHosts; + databdHosts.splice(index,1); + that.setData({ + bdHosts:databdHosts + }) + //如果酒店是当前酒店 就把当前酒店的房间 标记为解绑 + if(jbjd.HotelID != that.data.HotelId) + { + // console.log(jbjd.HotelID) + // console.log(that.data.HotelId) + return; + } + let data = that.data.HostsData; + let OLD = -1; + try { + data.forEach( + (x, INDEX) => { + if (x.RoomNumber === jbjd.RoomNumber) { + OLD = INDEX; + throw new Error(); + } + } + )} catch (error) { + } + if (OLD >= 0) { + // 0 表示绑定成功~ + // 1 表示绑定失败~ + // 2 表示取消绑定~ + data[OLD].xg = 2; + data[OLD].MAC = ""; + } + let res = that.GetFilters(that.data.sel, data); + that.setData({ + HostsData: data, + HostsDataFilters: res[0], + statusdata: res[1] + }) + console.log(data[OLD]) + } else { + app.toast(2, "解绑失败") + } + }, + err => { + app.toast(2, "网络繁忙") + }).catch(err => { + app.toast(2, "网络繁忙") + }); + }, + + FuzzyMatch(astr,bstr ){ + if (astr.includes(bstr)) { + return true + }else{ + return false + } + }, + + + //检查mac地址 + GetMACOK: function () { + let that = this; + if (!this.CheckMAC(that.data.code)) { + this.setData({ + modal: 520 + }) + return; + }; + var newmac = ""; + for (var i = 0; i < that.data.code.length; i += 2) { + if (i + 2 >= that.data.code.length) { + newmac += that.data.code[i] + that.data.code[i + 1]; + } else { + newmac += that.data.code[i] + that.data.code[i + 1] + "-"; + } + } + if (that.data.selHosts.MAC == newmac) { + app.toast(2, "条码一致,无需更改~") + return; + } + this.setData({ + modal: 521, + }) + }, + //最终绑定MAC + GetMacOKend: async function (type) { + let that = this; + if (type != true && type != false) { + type = type.currentTarget.dataset['type'] + } + this.GetHide(); + let xg = null; + await GetMAC({ + roomNumber: that.data.selHosts.RoomNumber, + HotelID: that.data.selHosts.HotelID, + MAC: that.data.code, + NoCheck: type, + loc: that.data.address + }).then( + res => { + if (res.Status == 1000) { + xg = 100; + app.toast(2, "无权限") + } + if (res.Status == 200) { + xg = 0; + app.toast(1, "绑定成功") + } else { + if (!type) { + xg = 1; + app.toast(2, "绑定失败") + } else { + try { + if (res.Status == 100) { + xg = 100; + let modal = 3; + let mesg = [that.data.code]; + //mac绑定的房间 + let bdHosts = res.Data.Hosts; + try { + that.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + for (let index = 0; index < res.Data.Hosts.length; index++) { + if (elements.HotelId == res.Data.Hosts[index].HotelID) { + elements.Auth.forEach (Auth=>{ + if(Auth.AuthorityId == 16 && Auth.AuthotypeId == 3){ + //有权限 + bdHosts[index].qx = 0; + } + }) + } + } + }) + }); + } catch (error) { + console.log(error) + } + that.setData({ + modal: modal, + bdHosts:bdHosts, + message: mesg + }) + } else { + if (res.Status == 150) { + xg = 1; + app.toast(2, "绑定失败") + } else { + xg = 100; + app.toast(2, "网络繁忙") + } + } + } catch (error) { + xg = 100; + console.log(error) + } + } + } + }, + err => { + xg = 100; + app.toast(2, "网络繁忙") + }).catch(err => { + xg = 100; + app.toast(2, "网络繁忙") + }); + try { + // 100表示检查MAC并没有执行绑定操作 或者 请求过程出错 不执行下面的操作 + if (xg == 100) { + return; + } + //标记修改 + that.data.selHosts.xg = xg; + + // return; + var newmac = ""; + for (var i = 0; i < that.data.code.length; i += 2) { + if (i + 2 >= that.data.code.length) { + newmac += that.data.code[i] + that.data.code[i + 1]; + } else { + newmac += that.data.code[i] + that.data.code[i + 1] + "-"; + } + } + that.data.selHosts.MAC = newmac; + let data = that.data.HostsData; + // 本房间有相同的 mac的房间标记为取消绑定 已经弃用了 + // let OLD = -1; + // try { + // data.forEach( + // (x, INDEX) => { + // if (x.MAC == newmac && that.data.selHosts.Id != x.Id) { + // OLD = INDEX; + // throw new Error(); + // } + // } + // ) + // } catch (error) { + // console.log("房间 已经找到,无需循环~") + // } + // if (OLD >= 0) { + // // 0 表示绑定成功~ + // // 1 表示绑定失败~ + // // 2 表示取消绑定~ + // data[OLD].xg = 2; + // data[OLD].MAC = ""; + // } + data[that.data.selHosts.index] = that.data.selHosts; + let res = that.GetFilters(that.data.sel, that.data.HostsData); + that.setData({ + HostsData: data, + HostsDataFilters: res[0], + statusdata: res[1], + code: null, + input: 0 + }) + } catch (error) { + console.log(error) + } + }, + //检查Mac + CheckMAC: function (vlues) { + return (vlues.indexOf("34D0B8") == 0 && vlues.length == 12 && vlues.indexOf(" ") < 0); + }, + //扫码~ + GetCode: async function () { + var that = this; + setTimeout(function () { + that.GetHide() + }, 100); + wx.scanCode({ + // onlyFromCamera: true,// 只允许从相机扫码 + success(res) { + // 扫码成功后 在此处理接下来的逻辑 + that.setData({ + code: res.result + }) + that.GetMACOK(); + }, + fail(err) { + app.toast(2, "未识别到有效条形码") + } + }) + }, + //隐藏提示~ + GetHide() { + this.setData({ + modal: 0, + input: 0, + FaceSNinput:0 , + Upgradestatus:"", + UpgradestatusTimeout2:0, + ISLoopDebugging:0, + }) + }, + GetReturnSet() { + this.setData({ + + Upgradestatus:"", + UpgradestatusTimeout2:0, + ISLoopDebugging:0, + }) + }, + // 房间点击事件 + GetMAC:async function (e) { + let roomtypeInfo=this.data.roomtypeInfo + let index = e.currentTarget.dataset['index'] + // console.log(index) + let selHosts = this.data.HostsDataFilters[index]; + + for (let index = 0; index < roomtypeInfo.length; index++) { + const element = roomtypeInfo[index]; + if (selHosts.RoomTypeID==element.ID) { + this.setData({ + roomtypeInfoNode: element + }) + break + } + } + + let Gfilename="未知固件" + let Pfilename="未知配置" + await QueryUpdateHostStatus({ + hotelid:selHosts.HotelID, + roomTypeID:selHosts.RoomTypeID + }).then(res => { + if (res.total ==1) { + + if (res.rows.length>0) { + Gfilename=res.rows[0].Version + Pfilename=res.rows[0].ConfigVersion + } + } + }) + debugger + //长按事件 + if (this.endTime - this.startTime > 350) { + return; + } + if (!this.CheckAutho()) { + app.toast(2, "无绑定权限~") + return; + } + // let index = e.currentTarget.dataset['index'] + // // console.log(index) + // let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + this.setData({ + selHosts: selHosts, + input: 0 , + roomGfilename:Gfilename, + roomPfilename:Pfilename + + }) + if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) { + this.setData({ + modal: 1, + message: [this.data.HostsDataFilters[index].MAC, selHosts.RoomNumber] + }) + } else { + this.GetCode() + } + }, + // 未分配max + GetMaxby(type = 0, arry = null) { + let y = 0; + let n = 0; + if (arry == null) { + arry = this.data.HostsData; + } + arry.forEach(x => { + if (x.MAC == "" || x.MAC == null) { + n++; + } else { + y++; + } + }) + if (type == 0) { + return y; + } + return n; + }, + //分类过滤方法 + GetFilters(type = -1, arry = null) { + if (type == -1) { + type = this.data.sel + } + if (arry == null && this.data.HostsData != null) { + arry = this.data.HostsData; + } + if (arry == null) { + return; + } + let ok = 0; + let err = 0; + let no = 0; + let df = 0; + let res = []; + arry.forEach(x => { + switch (x.xg) { + case 0: + ok++; + break; + case 1: + err++; + break; + case 2: + no++; + break; + default: + df++; + break; + } + if (type == 0) { + res.push(x) + } else { + if (x.MAC == "" || x.MAC == null) { + if (type == 2) { + res.push(x) + } + } else { + if (type == 1) { + res.push(x) + } + } + } + }) + return [res, [ok, err, no, df]]; + }, + // 分类点击事件 + GetshowinfoClick(e) { + + + + let showinfo = e.currentTarget.dataset['index'] + this.setData({ + showinfo:showinfo + }) + + }, +GetRoomTypeList(){ + //debugger + GetHostsInfo({ + HotelID: that.data.Hotelinfo.HotelId + }).then(res =>{ + if (res.Status == 200) { + console.log('获取房型成功') + } + else{ + console.log('获取房型失败:'+that.data.Hotelinfo.HotelId) + } + }).catch(err => { + console.log('网络访问错误') + console.log(err) + }); +}, + + GetshowinfoClick1(e){ + let showinfo = e.currentTarget.dataset['index'] +var that=this; +that.setData({ + showinfo:showinfo + }) + + GetHostsInfo({ + HotelID: that.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + that.setData({ + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + HotelId: that.data.Hotelinfo.HotelId, + statusdata: [0, 0, 0, 0], + YMac: this.GetMaxby(0, res.Data), + NMac: this.GetMaxby(1, res.Data) + }) + that.GetLOC(); + } else { + + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + + + + }, + + + + + // 绑定筛选分类点击事件 + GetClick(e) { + this.setData({ + islogs: false, + Help: false + }) + let index = e.currentTarget.dataset['index'] + let res = this.GetFilters(index, this.data.HostsData); + this.setData({ + sel: index, + HostsDataFilters: res[0], + statusdata: res[1] + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: async function (options) { + if (!options.HotelId || app.globalData.autho == null) { + app.toast(2, "无酒店信息~") + return; + } + + + this.setData({ + autho: app.globalData.autho + }) + // console.log(this.data.autho) + + try { + this.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + if (elements.HotelId == options.HotelId) { + this.setData({ + Hotelinfo: elements + }) + throw new Error(); + } + }) + }); + } catch (error) { + console.log("已经找到,无需循环~") + } + let that = this; + setTimeout(function () { + // 1.使用wx.createSelectorQuery()查询到需要滚动到的元素位置 + wx.createSelectorQuery().select('#scroll').boundingClientRect(res => { + // 2.使用wx.getSysTemInfo()获取设备及页面高度windowHeight(px) + wx.getSystemInfo({ + success(ress) { + that.setData({ + top_height: ress.windowHeight - res.top , + top_Nheight:ress.windowHeight - res.top-80 + }) + } + }) + }).exec(function (params) { + console.log(params) + }) + }, 100) + + await GetHostsInfo({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + that.setData({ + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + HotelId: options.HotelId, + statusdata: [0, 0, 0, res.Data.length], + YMac: this.GetMaxby(0, res.Data), + NMac: this.GetMaxby(1, res.Data) + }) + app.globalData.HotelId=options.HotelId + + + that.GetLOC(); + } else { + + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + console.log(app.globalData.HotelId) + + await GetRoomType({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + app.SetroontypeListindex(res) + that.setData({ + roomtype:app.globalData.roomIDName + }) + }, err => { + console.log('GetRoomType error') + }).catch(err => { + + }); + + await GetRoomTypeAndModalsListLog({ + code:this.data.Hotelinfo.Code + }).then(res =>{ + if (res.IsSuccess==true) { + + that.setData({ + roomtypeInfo:res.Result + }) + } + }) + + + }, + //页面卸载 + onUnload: function name(params) { + let data = wx.getStorageSync("oldHotelinfo") || [] + let ok = false; + try { + for (let index = 0; index < data.length; index++) { + const element = data[index]; + if (element.key == this.data.Hotelinfo.HotelId) { + ok = true; + data[index].data = this.data.HostsData; + throw new Error(); + } + } + } catch (error) { + console.log('已经找到了') + } + if (!ok) { + data.push({ + key: this.data.Hotelinfo.HotelId, + data: this.data.HostsData + }) + } + try { + wx.setStorageSync('oldHotelinfo', data) + } catch (error) { + console.log(error) + } + + // 获取页面栈 + var pages = getCurrentPages(); + var currPage = pages[pages.length - 1]; // 当前页 + var prevPage = pages[pages.length - 2]; // 上一个页面 + prevPage.setData({ + issel: this.data.Hotelinfo.HotelId + }); + }, + LoopDebugging:async function (e) + { + // + let roomtypeInfoNode =this.data.roomtypeInfoNode + let roomtypeInfoNodeinfo=this.data.roomtypeInfoNode.Modals + let roomstart =false + let addrtype + const myMap =[] + let li =[] + let addrtypelist =true + + let message =this.data.message + for (let index = 0; index < roomtypeInfoNodeinfo.length; index++) { + const element = roomtypeInfoNodeinfo[index]; + addrtype=this.GetloopType(element.ModalAddress) + if (addrtype.length==0) { + continue + } + addrtypelist=true + for (let index2 = 0; index2 < myMap.length; index2++) { + const element2 = myMap[index2]; + + if ( element2[0] == addrtype[0][0]) { + li= myMap[index2][1] + li.push([element.ModalAddress,element.Name,addrtype[0][1]]) + myMap[index2][1]=li + addrtypelist=false + break + } + } + + if (addrtypelist) { + li=[] + li.push([element.ModalAddress,element.Name,addrtype[0][1]]) + myMap.push([addrtype[0][0],li]) + } + + + } + + roomtypeInfoNodeinfo=myMap.sort((a, b) => a[0] - b[0]) + //获取房间在线状态 roomstart + console.log(roomtypeInfoNodeinfo) + + await GetRoomTypeNode({ + hotelid: this.data.Hotelinfo.HotelId , + roomTypeID:roomtypeInfoNode.ID + }).then(res => { + if (res.IsSuccess== true) { + for (let index = 0; index < res.HostData.length; index++) { + const element = res.HostData[index]; + if (element.RoomNumber == message[1]) { + roomstart=element.Status + break + } + } + } + }) + + roomtypeInfoNode.roomstart=roomstart + + this.setData({ + ISLoopDebugging:1, + roomtypeInfoNode:roomtypeInfoNode, + roomtypeInfoNodeinfo:roomtypeInfoNodeinfo + }) + console.log(this.data.roomtypeInfoNode) + }, + Mathceil(number,tval){ + return Math.ceil(number,tval) + }, + GetloopType(loopaddr){ + let astr =loopaddr[0]+loopaddr[1]+loopaddr[2] + let aint =parseInt(astr,10) + let bint =[] + + switch (aint) { + case 1 : + // case 4 : + // case 54: + bint.push([1,[[1,'开关',0]]])//开关 + break; + case 5: //开关停 + bint.push([5,[[1,'开关',0]]]) + break; + case 7: //开关停 + + bint.push([7,[[1,'开关',0],[2,'模式',1],[3,'风速',1],[4,'温度',25],[5,'阀开',0]]]) + break; + case 23 : + case 24: + bint.push([23,[[1,'开关',10]]]) + break; + case 52: + bint.push([52,[[1,'开关',0],[2,'亮度',10],[3,'色温',10]]]) + break; + default: + + break; + } + + return bint + }, + +//固件升级 + ConfigurationUpgrade: async function(e){ + let _this=this + wx.showModal({ + title: "提示", + content: "是否进行固件升级!", + success (res) { + if (res.confirm) { + console.log('固件升级') + _this.setData({ + ISLoopDebugging:2, + }) + let selHosts =_this.data.selHosts + _this.Carryoutupgrade(false) + } else if (res.cancel) { + return + } + } + }) + + + }, + +//配置升级 +FirmwareUpgrade: async function (e){ + console.log('配置升级') + + + + let _this=this + wx.showModal({ + title: "提示", + content: "是否进行配置升级!", + success (res) { + if (res.confirm) { + console.log('固件升级') + _this.setData({ + ISLoopDebugging:2, + }) + let selHosts =_this.data.selHosts + _this.Carryoutupgrade(true) + } else if (res.cancel) { + return + } + } + }) + + + +}, +// 进行升级 +Carryoutupgrade:async function (params) { + + let selHosts =this.data.selHosts + let ID =selHosts.Id + let RoomTypeID = selHosts.RoomTypeID + let roontypeList =app.globalData.roontypeList + let Gfilename ="" + let Pfilename ="" + let Upgradenode =[] + var timestampSec = Math.floor(Date.now() / 1000); + for (let index = 0; index < roontypeList.length; index++) { + const element = roontypeList[index]; + if (RoomTypeID==element.ROOM_TYPE_OLD_ID) { + Upgradenode=element + if (element.App_Cfg_For_L2.length>0) { + Gfilename=element.App_Cfg_For_L2 + } + if (element.App_Cfg_For_L4.length>0) { + Gfilename=element.App_Cfg_For_L4 + } + if (element.APPTYPE=="App_Cfg") { + Pfilename=element.CONFIG_BIN + }else{ + Pfilename="" + } + break + } + } + Upgradenode.Gfilename=this.data.roomGfilename + Upgradenode.Pfilename=this.data.roomPfilename + // debugger + // await QueryUpdateHostStatus({ + // hotelid:selHosts.HotelID, + // roomTypeID:RoomTypeID + // }).then(res => { + // if (res.total ==1) { + + // if (res.rows.length>0) { + + // Upgradenode.Gfilename=res.rows[0].Version + // Upgradenode.Pfilename="配置版本:"+res.rows[0].ConfigVersion + // } + // } + // }) + + + + Upgradenode.App_Cfg_For_L4=Gfilename + Gfilename=Gfilename.replace('.hex','.bin') + if (params) { + if (Pfilename.length>0) { + await WebChatUpgrade({ + roomTypeID:RoomTypeID, + hostidLists:'['+ID+']', + upgradefileName:Pfilename + }).then(res => { + if (res.IsSuccess ==true) { + this.setData({ + Upgradestatus:'升级就绪', + UpgradestIstrue:params, + UpgradestatusTimeout2:timestampSec, + Upgradenode:Upgradenode + }) + this.observersUpgradestatus() + } else{ + this.setData({ + Upgradestatus:'服务器升级配置失败!' + }) + this.DisplayPrompt('服务器升级配置失败!',1000) + } + + }, err => { + this.setData({ + Upgradestatus:'升级配置失败,服务器响应异常' + }) + this.DisplayPrompt('升级配置失败,服务器响应异常',1000) + }).catch(err => { + this.setData({ + Upgradestatus:'升级配置失败,服务器响应异常' + }) + this.DisplayPrompt('升级配置失败,服务器响应异常',1000) + }); + + }else{ + this.setData({ + Upgradestatus:'升级配置失败!服务器未获取到配置!' + }) + this.DisplayPrompt('升级配置失败!服务器未获取到配置!',1000) + } + }else{ + if (Gfilename.length>0) { + await WebChatUpgrade({ + roomTypeID:RoomTypeID, + hostidLists:'['+ID+']', + upgradefileName:Gfilename + }).then(res => { + if (res.IsSuccess ==true) { + this.setData({ + Upgradestatus:'升级就绪', + UpgradestIstrue:params, + UpgradestatusTimeout2:timestampSec, + Upgradenode:Upgradenode + }) + this.observersUpgradestatus() + } else{ + this.setData({ + Upgradestatus:'服务器升级固件失败!' + }) + this.DisplayPrompt('服务器升级固件失败!',1000) + } + + }, err => { + this.setData({ + Upgradestatus:'升级固件失败,服务器响应异常' + }) + + this.DisplayPrompt('升级固件失败,服务器响应异常',1000) + }).catch(err => { + this.setData({ + Upgradestatus:'升级固件失败,服务器响应异常' + }) + + this.DisplayPrompt('升级固件失败,服务器响应异常',1000) + }); + }else + { + this.setData({ + Upgradestatus:"升级固件失败!!" + }) + + this.DisplayPrompt('升级固件失败!!',1000) + } + } + +}, +DisplayPrompt(tipstr, showtime) +{ + wx.showLoading({ + title: tipstr, + }) + setTimeout(function () { + wx.hideLoading() + }, showtime) +}, + + // 反馈异常 + ErrorInfo: async function (e) { + let type = e.currentTarget.dataset['type'] + let that = this; + await ErrorInfo({ + type: type, + MAC: this.data.selHosts.MAC, + roomNumber: this.data.selHosts.RoomNumber, + HotelID: this.data.selHosts.HotelID, + }).then(res => { + if (res.Status == 200) { + that.GetHide(); + app.globalData.userinfo.error.push({ + HostsId: that.data.selHosts.Id, + MAC: that.data.selHosts.MAC, + type: type + }); + app.toast(1, "反馈成功~") + } else { + app.toast(2, "反馈失败~") + } + }, err => { + app.toast(2, "反馈失败~") + }).catch((e) => { + app.toast(2, "反馈失败~") + }) + }, + // 微信api,获取经纬度 + getFuzzyLocations() { + wx.getFuzzyLocation({ + type: 'wgs84', + success: this.updateLocation, + fail: (e) => { + console.log(e) + } + }) + }, + // 根据经纬度,设置数据 + updateLocation(res) { + let { + latitude: lat, + longitude: lon + } = res + let data = { + lat, + lon + } + // this.setData(data) + this.getAddress(lat, lon) + }, + // 根据经纬度,逆地址解析 + getAddress(lat, lon) { + // 在wx.request中,this指向wx.request,故无法setData,此处将this指向that + var that = this + let SIG = md5("/ws/geocoder/v1?key=" + app.globalData.MapKey + "&location=" + String(lat) + "," + String(lon) + app.globalData.MapSk) + wx.request({ + url: 'https://apis.map.qq.com/ws/geocoder/v1', + data: { + key: app.globalData.MapKey, + location: `${lat},${lon}`, + sig: SIG + }, + success(res) { + let result = res.data.result + // console.log(result) + // formatted_addresses.recommend是经过腾讯地图优化过的描述方式,更具人性化特点 + let formatted_addresses = result.formatted_addresses.recommend + // 此处的that指向app + that.setData({ + address: formatted_addresses + }) + }, + fail: (e) => { + console.log(e) + } + }) + }, + //每次展示获取一次定位 + onShow() { + let that = this; + wx.getSetting({ + success: (res) => { + console.log(JSON.stringify(res)) + // res.authSetting['scope.userFuzzyLocation'] == undefined 表示 初始化进入该页面 + // res.authSetting['scope.userFuzzyLocation'] == false 表示 非初始化进入该页面,且未授权 + // res.authSetting['scope.userFuzzyLocation'] == true 表示 地理位置授权 + if (res.authSetting['scope.userFuzzyLocation'] != undefined && res.authSetting['scope.userFuzzyLocation'] != true) { + //以前被拒绝授权指引用户授权 + wx.showModal({ + title: '请求授权当前位置', + content: '需要获取您的地理位置,请确认授权', + success: function (res) { + if (res.cancel) { + app.toast(2, "拒绝授权") + } else if (res.confirm) { + wx.openSetting({ + success: function (dataAu) { + if (dataAu.authSetting["scope.userFuzzyLocation"] == true) { + app.toast(1, "授权成功") + that.getFuzzyLocations(); + } else { + app.toast(2, "授权失败") + } + } + }) + } + } + }) + + } else if (res.authSetting['scope.userFuzzyLocation'] == undefined) { + //调用wx.getFuzzyLocation + that.getFuzzyLocations(); + } else { + that.getFuzzyLocations(); + } + } + }) + }, + + Loopswitch(e){ + let addr =0 + //debugger + + }, + + + //读取本地历史缓存 并且 修改房间信息 + GetLOC() { + let hc = null; + let data = wx.getStorageSync("oldHotelinfo") || [] + try { + for (let index = 0; index < data.length; index++) { + const element = data[index]; + if (element.key == this.data.Hotelinfo.HotelId) { + hc = data[index].data; + throw new Error(); + } + } + } catch (error) { + console.log('已经找到') + } + if (hc != null) { + let data = this.data.HostsData; + hc.forEach(x => { + for (let index = 0; index < data.length; index++) { + if (data[index].Id == x.Id) { + data[index].xg = x.xg; + } + } + }) + this.setData({ + HostsData: data, + HostsDataFilters: data + }) + } + } +}) \ No newline at end of file diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.json b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.json new file mode 100644 index 0000000..9c6da14 --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.json @@ -0,0 +1,9 @@ +{ + "usingComponents": { + "loscom": "/components/logscom/logscom", + "HostUpgrade":"/pages/HostUpgrade/HostUpgrade", + "Upgrade":"/pages/Upgrade/Upgrade" + + } + +} \ No newline at end of file diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxml b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxml new file mode 100644 index 0000000..d852668 --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxml @@ -0,0 +1,668 @@ + + + 返回 + {{Hotelinfo.HotelName}}({{Hotelinfo.Code}}) + + + + + + + + + + + + + + + + + + + + + + + + + + + {{Help?'关闭':'帮助'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{item.RoomNumber}} + + + + + +M:{{item.MAC[0]}}{{item.MAC[1]}}{{item.MAC[2]}}{{item.MAC[3]}}{{item.MAC[4]}}{{item.MAC[5]}}{{item.MAC[6]}}{{item.MAC[7]}}{{item.MAC[8]}} + +{{item.MAC[9]}}{{item.MAC[10]}}{{item.MAC[11]}}{{item.MAC[12]}}{{item.MAC[13]}}{{item.MAC[14]}}{{item.MAC[15]}}{{item.MAC[16]}} + + + + + + RCU + + + 绑定 + + + + + + + + + + + + + s:{{item.FaceSN[0]}}{{item.FaceSN[1]}}{{item.FaceSN[2]}}{{item.FaceSN[3]}}{{item.FaceSN[4]}}{{item.FaceSN[5]}}{{item.FaceSN[6]}}{{item.FaceSN[7]}} + +{{item.FaceSN[8]}}{{item.FaceSN[9]}}{{item.FaceSN[10]}}{{item.FaceSN[11]}}{{item.FaceSN[12]}}{{item.FaceSN[13]}}{{item.FaceSN[14]}}{{item.FaceSN[15]}} + + + + + + + s:{{item.FaceSN[0]}}{{item.FaceSN[1]}}{{item.FaceSN[2]}}{{item.FaceSN[3]}}{{item.FaceSN[4]}}{{item.FaceSN[5]}}{{item.FaceSN[6]}}{{item.FaceSN[7]}} + +{{item.FaceSN[8]}}{{item.FaceSN[9]}}{{item.FaceSN[10]}}{{item.FaceSN[11]}}{{item.FaceSN[12]}}{{item.FaceSN[13]}}{{item.FaceSN[14]}}{{item.FaceSN[15]}} + + + + + + 人脸机 + + + + 绑定 + + + + + + + + + + + + + +暂无数据~ + + + + + + + + + + + + + + + + + 颜色指示块 + + + + 指示块,仅针对本次进入页面有效,不代表历史操作记录,刷新或者重新进入页面都会执行重置操作。 + + + + + + + + MAC绑定操作 + + + + 点击 + 点击房间,如果已经绑定MAC会弹出提示语句,点击继续,继续执行扫码绑定,扫码后,会有普通的MAC矫正,如果MAC已经被绑定,会再次弹出提示语句, + 如果MAC绑定的酒店有权限就会有提示语句,然后可以点击继续执行绑定,这将解除原有绑定,绑定当前MAC;如果MAC绑定的酒店没有权限,就仅有提示语,而没有继续绑定按钮。 + 长按 + 长按会执行手动输入MAC,后续与点击扫码绑定一致~ + + + + + + + + + + + + + + + + + + + + + + + + + + {{selHosts.RoomNumber}}已经绑定MAC({{selHosts.Status == 1 ? '在线':'离线'}}) + + + + + + + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{message[1]}} + MAC地址:{{message[0]}} + 当前固件:{{roomGfilename}} + 当前配置:{{roomPfilename}} + 房间已经绑定MAC,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + + + + + 固件升级 + 配置升级 + 回路调试 + + + 反馈错误 + 取消 + 继续 + + + + + + + + + + + + + + {{VolumeLevel}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][DimIndex][1]}} + + {{row[1][DimIndex][2][0][2]}} + + + + + + + + 开关 + 色温 + 亮度 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][coloIndex][1]}} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{row[1][coloIndex][2][3][2]}} + + + + + + + + + + + + + + + + + 设备当前版本: + {{UpgradestIstrue == 0? Upgradenode.Gfilename:Upgradenode.Pfilename}} + + + 准备升级版本: + {{UpgradestIstrue == 0? Upgradenode.App_Cfg_For_L4:Upgradenode.CONFIG_BIN}} + + + 升级状态: + {{Upgradestatus}} + + + + + + + + + + {{code}}已经被绑定 + + + + + + +酒店:{{item.HotelName}} +房间:{{item.RoomNumber}} + + + + MAC地址:{{code}} + MAC已经被其他房间绑定,点击继续将取消原有绑定,执行新的绑定;点击取消,将不会执行任何操作~ + + + 反馈错误 + 取消 + 继续 + + + + + + + + 为{{selHosts.RoomNumber}}绑定MAC + + + + + + 房间:{{selHosts.RoomNumber}} + MAC地址: + + + + + + 取消 + 确认 + + + + + + + + 绑定确认 + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{selHosts.RoomNumber}} + MAC地址:{{code}} + 确定为房间绑定MAC,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + 取消 + 继续 + + + + + + + + 无效条码 + + + + + + 无效条码:{{code}} + 扫描的条码为无效条码~ + + + 确定 + + + + + + + + + 绑定确认 + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{selHosts.RoomNumber}} + 人脸机SN:{{code}} + 确定为房间绑定SN,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + 取消 + 继续 + + + + + + + + {{selHosts.RoomNumber}}已经绑定人脸机 + + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{message[1]}} + 人脸机SN:{{message[0]}} + 房间已经绑定人脸机,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + + + + + + + 设置 + 开门 + + + + + + + + + + + + + + + + {{code}}已经被绑定 + + + + + + + + + +酒店:{{item.HotelName}} +房间:{{item.RoomNumber}} + + + + + + + + SN:{{code}} + SN已经被其他房间绑定,点击继续将取消原有绑定,执行新的绑定;点击取消,将不会执行任何操作~ + + + + 取消 + + 继续 + + + + + + + + + 为{{selHosts.RoomNumber}}绑定人脸机SN + + + + + + 房间:{{selHosts.RoomNumber}} + 人脸机SN: + + + + + + 取消 + 确认 + + + diff --git a/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxss b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxss new file mode 100644 index 0000000..bf3cb0b --- /dev/null +++ b/pages/basics/HostUpgrade/EquipmentCaontrol/Hosts/Hosts.wxss @@ -0,0 +1,42 @@ +.Ncu-bar { + display: flex; + position: relative; + align-items: center; + min-height: 70rpx ; + justify-content: space-between; +} +.Ncu-bar1 { + display: flex; + position: relative; + align-items: center; + min-height: 70rpx ; + +} +.Ncubar1 { + display: flex; + position: relative; + align-items:flex-start; + min-height: 70rpx ; + +} +.ControlLine{ + background-color: gray; + height: 1rpx; + width: 100%; +} +.ControlLine_h{ + background-color: lightgray; + height: 80rpx; + width: 1rpx; +} +.textvlg { + display: inline-flex; + align-items: center; + justify-content: center; + text-align:center; + padding: 0 5rpx; + font-size:28rpx; + height: 80rpx; + width: 70rpx; + text-decoration: none; +} \ No newline at end of file diff --git a/pages/basics/HostUpgrade/HostUpgrade.js b/pages/basics/HostUpgrade/HostUpgrade.js new file mode 100644 index 0000000..64d918a --- /dev/null +++ b/pages/basics/HostUpgrade/HostUpgrade.js @@ -0,0 +1,948 @@ +// pages/basics/MakingRounds/MakingRounds.js +const app = getApp() + //const upgrade = require('../../../utils/upgrade.js') +import { + GetHostsInfo, + GetMAC, + GetFaceSN, + ErrorInfo, + CheckFaceSN, + OpenDoorTest, + GetRoomType, + GetRoomTypeAndModalsListLog, + WebChatUpgrade, + QueryUpdateHostStatus, + ForwardQueryUpdateHostProgressBar, + GetRoomTypeNode, + SetRCULight, + SetRCUAir, + SetRCUCurtain, +} from '../../../lib/RequestingCenter.js' +import DeviceUpgrader from '../../../utils/upgrade.js'; +// const DeviceUpgrader = require('../../../utils/upgrade.js'); +const upgrader = new DeviceUpgrader(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + TabCur:1, + RoomIndex:0, + //权限信息 + autho: null, + //酒店信息 + Hotelinfo: null, + HostsData:null, + HostsDataFilters:[], + isback:null, + HotelId:null, + statusdata:null, + onlineNumber:0, + inputValue:"", + toView:"", + scrollHeight: 0, + RoomtypeNamearray: [], + Completed:false, //是否处于升级状态 + RoomtypeName: "", + devlist:[], + Roomtypeinfo:[], + Pfilename:"", + Gfilename:"", + Upgradenode:[], + myArray:[], + CurrentUpgradeDev:'', //当前升级设备 + CurrentUpgradeDevStart:'',//当前升级设备状态 + UpgradeAllCount:0, + //MAC绑定相关 + selHosts: null, + code: null, + modal: 0, + input: 0, + bdHosts: [], + address: "", + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad:async function(options) { + + if (!options.HotelId ) { + app.toast(2, "无酒店信息~") + return; + } + + this.setData({ + autho: app.globalData.autho + }) + try { + this.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + if (elements.HotelId == options.HotelId) { + this.setData({ + Hotelinfo: elements + }) + throw new Error(); + } + }) + }); + } catch (error) { + console.log("已经找到,无需循环~") + } + + let that = this + await GetHostsInfo({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + let onlineNumber=0 + for (let index = 0; index < res.Data.length; index++) { + const element = res.Data[index]; + if (element.Status===1) { + onlineNumber=onlineNumber+1 + } + } + + that.setData({ + onlineNumber:onlineNumber, + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + HotelId: options.HotelId, + statusdata: [0, 0, 0, res.Data.length] + }) + + console.log(this.data.HostsDataFilters) + + } else { + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + app.globalData.HotelId=options.HotelId + await GetRoomType({ + HotelID: options.HotelId + }).then(res => { + app.SetroontypeListindex(res) + this.setData({ + myArray:app.globalData.roomIDName , + RoomtypeNamearray:app.globalData.roomName + }) + }, err => { + console.log('GetRoomType error') + }).catch(err => { + + }); + + + upgrader.on('progress', p => { + console.log(p) + this.setData({ CurrentUpgradeDevStart: p }) // 实时刷新 UI + }) + upgrader.on('error', e => { + wx.showToast({ title: '升级失败', icon: 'none' }) + }) + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + this.calcScrollHeight(); + }, + + calcScrollHeight() { + // 1. 拿到屏幕可用高度(px) + const sys = wx.getSystemInfoSync(); + const screenHeight = sys.windowHeight; // px + + // 2. 拿到 scroll-view 的 top(px) + wx.createSelectorQuery() + .in(this) + .select('#myScroll') + .boundingClientRect(rect => { + if (rect) { + const topPx = rect.top; // px + const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) + const heightPx = screenHeight - topPx - bottomPx; + + // 3. 转 rpx 并写入 + this.setData({ + scrollHeight: heightPx * 2 // px→rpx + }); + } + }) + .exec(); + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + upgrader.cancelUpgrade() + upgrader._cleanup() + }, + + //MAC绑定相关方法 + //检查MAC地址合法性 + CheckMAC: function (vlues) { + return (vlues.indexOf("34D0B8") == 0 && vlues.length == 12 && vlues.indexOf(" ") < 0); + }, + + //扫码获取MAC地址 + GetCode: async function () { + var that = this; + setTimeout(function () { + that.GetHide() + }, 100); + wx.scanCode({ + onlyFromCamera: true, + success(res) { + that.setData({ + code: res.result + }) + that.GetMACOK(); + }, + fail(err) { + app.toast(2, "未识别到有效条形码") + } + }) + }, + + //隐藏弹窗 + GetHide() { + this.setData({ + modal: 0, + input: 0, + }) + }, + + //房间点击事件 - 扫码绑定 + /** + * 获取主机MAC地址 + * @async + * @function GetMAC + * @param {Object} e - 事件对象 + * @param {number} e.currentTarget.dataset.index - 当前选中主机的索引 + * @description 根据选中主机的索引获取MAC地址,如果MAC地址不存在则调用GetCode方法 + * @returns {Promise} + */ + GetMAC: async function (e) { + let index = e.currentTarget.dataset['index']; + let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + + this.setData({ + selHosts: selHosts, + input: 0 + }) + + if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) { + this.setData({ + modal: 1, + message: [this.data.HostsDataFilters[index].MAC, selHosts.RoomNumber] + }) + } else { + this.GetCode() + } + }, + + //长按房间事件 - 手动输入MAC + GetMAC_long: function (e) { + let indexstr = e.currentTarget.id.replace("msg-","") + let index= Number(indexstr) + + let selHosts = this.data.HostsDataFilters[index]; + selHosts.index = index; + + this.setData({ + selHosts: selHosts, + input: 100 + }) + + if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) { + this.setData({ + modal: 1, + message: [selHosts.RoomNumber, this.data.HostsDataFilters[index].MAC] + }) + } else { + this.ShowInput(); + } + }, + + //显示手动输入MAC弹窗 + ShowInput: function (params) { + this.setData({ + modal: 1000, + code: "" + }) + }, + + //验证手动输入的MAC地址 + GetMACOK: function () { + let that = this; + if (!this.CheckMAC(that.data.code)) { + this.setData({ + modal: 520 + }) + return; + } + + this.setData({ + modal: 521 + }) + }, + + //解绑MAC地址 + Jb: async function(params) { + let index = params.currentTarget.dataset['index']; + let jbjd = this.data.bdHosts[index]; + let that = this; + + await GetMAC({ + roomNumber: jbjd.RoomNumber, + roomID: jbjd.Id, + HotelID: jbjd.HotelID, + MAC: "", + NoCheck: false, + loc: that.data.address + }).then( + res => { + if (res.Status == 1000) { + app.toast(2, "无权限") + } + if (res.Status == 200) { + app.toast(1, "解绑成功") + var databdHosts = that.data.bdHosts; + databdHosts.splice(index, 1); + that.setData({ + bdHosts: databdHosts + }) + + if (jbjd.HotelID != that.data.HotelId) { + return; + } + + let data = that.data.HostsData; + let OLD = -1; + try { + data.forEach( + (x, INDEX) => { + if (x.RoomNumber === jbjd.RoomNumber) { + OLD = INDEX; + throw new Error(); + } + } + ) + } catch (error) { + } + + if (OLD >= 0) { + data[OLD].MAC = ""; + } + + let res = that.GetFilters(that.data.sel, data); + that.setData({ + HostsData: data, + HostsDataFilters: res[0], + statusdata: res[1] + }) + } else { + app.toast(2, "解绑失败") + } + }, + err => { + app.toast(2, "网络繁忙") + } + ).catch(err => { + app.toast(2, "网络繁忙") + }); + }, + + //最终绑定MAC地址 + GetMacOKend: async function (type) { + let that = this; + if (type != true && type != false) { + type = type.currentTarget.dataset['type'] + } + + this.GetHide(); + let xg = null; + + await GetMAC({ + roomNumber: that.data.selHosts.RoomNumber, + HotelID: that.data.selHosts.HotelID, + MAC: that.data.code, + NoCheck: type, + loc: that.data.address + }).then( + res => { + if (res.Status == 1000) { + xg = 100; + app.toast(2, "无权限") + } + + if (res.Status == 200) { + xg = 0; + app.toast(1, "绑定成功") + + //更新本地数据 + let data = that.data.HostsData; + let OLD = -1; + try { + data.forEach( + (x, INDEX) => { + if (x.RoomNumber === that.data.selHosts.RoomNumber) { + OLD = INDEX; + throw new Error(); + } + } + ) + } catch (error) { + } + + if (OLD >= 0) { + data[OLD].MAC = that.data.code; + } + + that.setData({ + HostsData: data, + HostsDataFilters: data + }) + } else { + if (!type) { + xg = 1; + app.toast(2, "绑定失败") + } else { + try { + if (res.Status == 100) { + xg = 100; + let modal = 3; + let mesg = [that.data.code]; + + let bdHosts = res.Data.Hosts; + try { + that.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + for (let index = 0; index < res.Data.Hosts.length; index++) { + if (elements.HotelId == res.Data.Hosts[index].HotelID) { + elements.Auth.forEach(Auth => { + if (Auth.AuthorityId == 16 && Auth.AuthotypeId == 3) { + bdHosts[index].qx = 0; + } + }) + } + } + }) + }); + } catch (error) { + console.log(error) + } + + that.setData({ + modal: modal, + bdHosts: bdHosts, + message: mesg + }) + } else { + if (res.Status == 150) { + xg = 1; + app.toast(2, "绑定失败") + } else { + xg = 100; + app.toast(2, "网络繁忙") + } + } + } catch (error) { + xg = 100; + console.log(error) + } + } + } + }, + err => { + xg = 100; + app.toast(2, "网络繁忙") + } + ).catch(err => { + xg = 100; + app.toast(2, "网络繁忙") + }); + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + + inputSearchForHotels(e){ + this.setData({ + inputValue: e.detail.value + }) + }, + async UpgradeTheEquipment(e){ + let se=e + let _this =this + let updataDev = e.currentTarget.dataset.id + let errstr ="" + if (updataDev == 1) { + errstr="固件" + } + if (updataDev == 2) { + errstr="配置" + } + wx.showModal({ + title: "提示", + content: "是否进行"+errstr+"升级!", + async success (res) { + if (res.confirm) { + await _this.UpgradeTheEquipment2(se) + } else if (res.cancel) { + return + } + } + }) + }, + async UpgradeTheEquipment2(e){ + + let updataDev = e.currentTarget.dataset.id + let errstr ="" + let devlist =this.data.devlist + let UpgradeType ="" + let filename = "" + let RoomtypeName =this.data.RoomtypeName + let _this =this + let RoomTypeID="" + let HotelId= app.globalData.HotelId + let UpgradeCount=0 + if (updataDev == 1) { + errstr="升级固件失败" + UpgradeType='firmware' + filename=_this.data.Gfilename + filename=filename.replace('.hex','.bin') + } + if (updataDev == 2) { + errstr="升级配置失败" + UpgradeType='' + filename=_this.data.Pfilename + } + if (filename.length ==0) { + _this.DisplayPrompt("未获取到升级文件!升级失败",3000) + return + } + RoomTypeID=this.GetRoomTypeId(RoomtypeName) + + let newdevlist =[] + for (let i = 0; i < this.data.devlist.length; i++) { + + devlist[i].UpgradeStatus = 0 + + if (devlist[i].checkbox) { //勾选 + if (devlist[i].Status) { //离在线 + newdevlist.push(devlist[i]) + } + } + } + + if (newdevlist.length>0) { + _this.setData({ + UpgradeCount:0, //升级计数 + CurrentUpgradeDev:"", //当前升级设备 + CurrentUpgradeDevStart:"",//当前升级设备状态 + Completed:true, + UpgradeAllCount:newdevlist.length,//升级总数 + devlist:devlist + }) + + }else + { + this.DisplayPrompt2("未选中升级设备", 1000) + return + } + + + + for (let Nvindex = 0; Nvindex < newdevlist.length; Nvindex++) { + const element = newdevlist[Nvindex]; + _this.setData({ + //升级计数 + CurrentUpgradeDev:element.RoomNumber, //当前升级设备 + CurrentUpgradeDevStart:'升级就绪',//当前升级设备状态 + }) + + try { + await upgrader.startUpgrade(UpgradeType, { + roomTypeID: RoomTypeID, + hostidLists:'['+element.ID+']', + upgradefileName: filename, + hotelid:HotelId + }) + .then(res => { + _this.setData({ + UpgradeCount:_this.data.UpgradeCount+1, //升级计数 + }) + console.log('升级完成', res) + }) + .catch(err =>{ + + + console.log('升级失败', err) + }); + }catch (error) { + _this.setData({ + //升级计数 + CurrentUpgradeDev:element.RoomNumber, //当前升级设备 + CurrentUpgradeDevStart:errstr+',服务器响应异常',//当前升级设备状态 + Completed:false + }) + //this.DisplayPrompt(errstr+',服务器响应异常',1000) + return + } + + } + + this.DisplayPrompt2("升级完成!", 1000) + + }, + DisplayPrompt2(tipstr, showtime) + { + wx.showToast({ + title: tipstr, + icon: 'none' + }) + setTimeout(function () { + wx.hideToast() + }, showtime) + }, + ALLcheckboxSub(e){ + + let devlist =this.data.devlist + let ALLcheckbox =this.data.Allcheckbox + let values = !ALLcheckbox + for (let index = 0; index < devlist.length; index++) { + devlist[index].checkbox=values + } + this.setData({ + devlist:devlist, + Allcheckbox:values +}); + }, + checkboxSub(e){ + let devlist =this.data.devlist + let ALLcheckbox =this.data.Allcheckbox + let index = e.currentTarget.dataset.id + let values =!devlist[index].checkbox + devlist[index].checkbox=values + let checksun =0 + for (let nindex = 0; nindex < devlist.length; nindex++) { + if (values) { + if ( devlist[nindex].checkbox!=values) { + values=devlist[nindex].checkbox + } + + } + if (devlist[nindex].checkbox) { + checksun=checksun+1 + } + + } + + this.setData({ + devlist:devlist, + Allcheckbox:values, + checksun:checksun +}); + }, + SearchForHotels(e){ + //debugger + let myarry =this.data.HostsDataFilters + let inputValue =this.data.inputValue.trim() + const CNaelement =this.sortHotelsByFuzzyMatch(myarry,inputValue) + this.setData({ + HostsDataFilters:CNaelement + }) + }, + goProcess(e) { + + let indexstr = e.currentTarget.id.replace("msg-","") + let index= Number(indexstr) + + + const { room, hotel, status,roomtypeid,hotelcode,createTime} = e.currentTarget.dataset; + let HostsDataFilters =this.data.HostsDataFilters + let timestr = HostsDataFilters[0].CreateTime + if (status !== 1) { + if (!HostsDataFilters[index].MAC||HostsDataFilters[index].MAC.length==0) { + //长按事件 + if (this.endTime - this.startTime > 350) { + return; + } + this.setData({ + selHosts: HostsDataFilters[index] + }) + this.GetCode() + } + + } else{ // 不为1时不跳转 + wx.navigateTo({ + url: `/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol?RoomNumber=${room}&HotelName=${hotel}&HotelId=${this.data.Hotelinfo.HotelId }&roomtypeid=${roomtypeid }&HotelCode=${hotelcode}&createTime=${timestr}` + }); + } + + }, + RefreshTheRoom:async function(e){ + let that = this + await GetHostsInfo({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + let onlineNumber=0 + for (let index = 0; index < res.Data.length; index++) { + const element = res.Data[index]; + if (element.Status===1) { + onlineNumber=onlineNumber+1 + } + } + + that.setData({ + onlineNumber:onlineNumber, + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + statusdata: [0, 0, 0, res.Data.length] + }) + + console.log(this.data.HostsDataFilters) + + } else { + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + }, + //touch start 开始触摸房间区域 + handleTouchStart: function (e) { + this.startTime = e.timeStamp; + //console.log(" startTime = " + e.timeStamp); + }, + //touch end结束触摸房间区域 + handleTouchEnd: function (e) { + this.endTime = e.timeStamp; + //console.log(" endTime = " + e.timeStamp); + }, + sortHotelsByFuzzyMatch:function(hotels, keyword) { + // 1. 参数验证 + if (!Array.isArray(hotels)) { + console.warn('第一个参数必须是数组'); + return []; + } + + if (typeof keyword !== 'string') { + console.warn('第二个参数必须是字符串'); + return hotels.slice(); + } + + // 2. 处理空数组或空关键字的情况 + const trimmedKeyword = keyword.trim(); + if (hotels.length === 0 || trimmedKeyword === '') { + return hotels.slice(); + } + + const lowerKeyword = trimmedKeyword.toLowerCase(); + + // 3. 分离匹配和不匹配的酒店 + const matchedHotels = []; + const unmatchedHotels = []; + + hotels.forEach(hotel => { + // 检查是否为有效酒店对象 + if (!hotel || typeof hotel !== 'object' || !hotel.RoomNumber) { + unmatchedHotels.push(hotel); + return; + } + + const hotelName = String(hotel.RoomNumber).toLowerCase(); + const isMatch = hotelName.includes(lowerKeyword); + + if (isMatch) { + matchedHotels.push(hotel); + } else { + unmatchedHotels.push(hotel); + } + }); + + // 4. 合并数组并返回 + return [...matchedHotels, ...unmatchedHotels]; + }, + RefreshTheRoomType(e){ + e.detail=this.data.RoomtypeName + this.bindPickerChange(e) + }, + GetRoomTypeId(roomTypeName){ + if (roomTypeName.length>0) { + let myArray =this.data.myArray + + for (let index = 0; index < myArray.length; index++) { + let strbuf = myArray[index].split('|') ; + if (strbuf[1]==roomTypeName) { + return strbuf[0] + } + } + }else{ + return "" + } + }, + DisplayPrompt(tipstr, showtime) +{ + + // wx.showModal({ + // title: '提示', + // content: '确认执行此操作吗?', + // success(res) { + // if (res.confirm) { /* 用户点击确定 */ } + // } + // }); + + wx.showLoading({ + title: tipstr, + }) + + + setTimeout(function () { + wx.hideLoading() + }, showtime) +}, + async bindPickerChange(e) { + + let Completed =this.data.Completed + let _this =this + if (Completed) { + this.DisplayPrompt("正在升级中!",1000) + return + } + let devlist=[] + let Roomtypeinfo=[] + + let roomid = this.GetRoomTypeId(e.detail) + if (roomid.length==0) { + return + } + let Pfilename ="" + let Gfilename ="" + let Upgradenode =[] + try { + // 调用 GetRoomTypeNode + const res = await GetRoomTypeNode({ + hotelid: app.globalData.HotelId, + roomTypeID: roomid, + }); + if (res.IsSuccess==true) { + devlist = res.HostData + for (let nindex = 0; nindex < devlist.length; nindex++) { + devlist[nindex].show=1 + devlist[nindex].checkbox=0 + devlist[nindex].UpgradeStatus=0 + devlist[nindex].Model =_this.removeNullCharsAndInvisibleChars(devlist[nindex].Model) + } + } + const Nres = await GetRoomType({ + HotelID:app.globalData.HotelId + }) +if (Nres.Status==200) { + Roomtypeinfo=Nres.Data + for (let index = 0; index < Roomtypeinfo.length; index++) { + const element = Roomtypeinfo[index]; + + if (element.ROOM_TYPE_OLD_ID == roomid) { + Upgradenode=element + if (element.App_Cfg_For_L2.length>0) { + Gfilename=element.App_Cfg_For_L2 + } + if (element.App_Cfg_For_L4.length>0) { + Gfilename=element.App_Cfg_For_L4 + } + if (element.APPTYPE=="App_Cfg") { + Pfilename=element.CONFIG_BIN + }else{ + Pfilename="" + } + break + } + + } + } + + this.setData({ + RoomtypeName: e.detail, + devlist:devlist, + Roomtypeinfo:Roomtypeinfo, + Pfilename:Pfilename, + Gfilename:Gfilename, + Upgradenode:Upgradenode + }); + console.log(devlist) + } catch (err) { + console.log('GetRoomTypeNode error', err); + } + }, + removeNullCharsAndInvisibleChars(str) { + try { + + return str.replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200F\u202A-\u202E\u2060-\u206F\uFEFF]/g, ''); + } catch (error) { + return "NULL" + } + + }, + tabSelect(e) { + this.setData({ + TabCur: e.currentTarget.dataset.id, + }) + }, + +}) \ No newline at end of file diff --git a/pages/basics/HostUpgrade/HostUpgrade.json b/pages/basics/HostUpgrade/HostUpgrade.json new file mode 100644 index 0000000..71473bc --- /dev/null +++ b/pages/basics/HostUpgrade/HostUpgrade.json @@ -0,0 +1,5 @@ +{ + "usingComponents": { + "wanselect": "/components/wanselect/wanselect" + } +} \ No newline at end of file diff --git a/pages/basics/HostUpgrade/HostUpgrade.wxml b/pages/basics/HostUpgrade/HostUpgrade.wxml new file mode 100644 index 0000000..ea10388 --- /dev/null +++ b/pages/basics/HostUpgrade/HostUpgrade.wxml @@ -0,0 +1,238 @@ + + 返回 + {{Hotelinfo.HotelName}}({{Hotelinfo.Code}}) + + + + + 单房间升级 + + + 批量升级 + + + + + + + + + + + 房间在线: + {{onlineNumber}}/ + {{HostsDataFilters.length}} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{item.RoomNumber}} + {{item.MAC}} + + + + + + + + + + + + + + + 房型: + + + + + + + + + + + + + + + + + + {{Gfilename}} + + + {{Pfilename}} + + + + + + + + + + + + + + + + 全选 + +正在升级房号:{{CurrentUpgradeDev}}:{{CurrentUpgradeDevStart}} +已升级设备: {{UpgradeCount}} + + + + + + + + + + + + + + + + + + 房号:{{devlist[index].RoomNumber}} + {{devlist[index].Status==true? "在线":"离线"}} + + + + + + MAC:{{devlist[index].MAC}} + + 主机:{{devlist[index].Model}} + 配置版本:{{devlist[index].ConfigVersion}} + + + 固件版本:{{devlist[index].Version}} + + + + + + + + + + + + {{code}}已经被绑定 + + + + + + +酒店:{{item.HotelName}} +房间:{{item.RoomNumber}} + + + + MAC地址:{{code}} + MAC已经被其他房间绑定,点击继续将取消原有绑定,执行新的绑定;点击取消,将不会执行任何操作~ + + + 反馈错误 + 取消 + 继续 + + + + + + + + 为{{selHosts.RoomNumber}}绑定MAC + + + + + + 房间: + {{selHosts.RoomNumber}} + MAC地址: + + + + + + 取消 + 确认 + + + + + + + + 绑定确认 + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{selHosts.RoomNumber}} + MAC地址:{{code}} + 确定为房间绑定MAC,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + 取消 + 继续 + + + + + + + + 无效条码 + + + + + + 无效条码:{{code}} + 扫描的条码为无效条码~ + + + 确定 + + + \ No newline at end of file diff --git a/pages/basics/HostUpgrade/HostUpgrade.wxss b/pages/basics/HostUpgrade/HostUpgrade.wxss new file mode 100644 index 0000000..e613993 --- /dev/null +++ b/pages/basics/HostUpgrade/HostUpgrade.wxss @@ -0,0 +1,112 @@ +.aside{ + width:8rem; + border-right: 1px solid #ddd; + font-size: .85rem; +} +.type-nav{ + width:8rem; + position: relative; + padding:.7rem .3rem; + text-align: center; + border-bottom: 1px solid #ddd; + z-index: 10; +} +.flex-wrap{ + display: flex; +} +.type-nav.selected{ + margin-right: -1px; + padding-left:0,-1px; + color: #333; + background-color: #fff; +} +/* .content{ + background-color: #fff; +} */ + +.dish{ + margin-left: 1rem; + padding: 1rem; + border-bottom: 1px solid #ddd; +} +.dish .title{ + display: block; + font-size: 1rem; +} +.dish p{ + color: orange; + font-size: .75rem; +} +.dish .add-btn{ + width: 8rem; + text-align: right; +} +.cu-bar1 { + display: flex; + + align-items: center; + + justify-content: space-between; +} +.cart{ + display: block; + position: fixed; + left: 0; + right: 0; + bottom: 0; + padding: 1rem; + background: #ddd; +} +.container { + height: 50%; + box-sizing: border-box; + background-color: #f4f4f4; +} +.cu1-btn { + position: relative; + border: 0rpx; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 5rpx 5rpx; + font-size: 26rpx; + height: 70rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} + +.cu-btn1 { + position: relative; + border: 0rpx; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 0 5rpx; + font-size: 26rpx; + height: 64rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} +.setborder +{ + border: 1rpx solid currentColor; +} +.cubarN { + display: flex; + position: relative; + align-items: center; + min-height: 50rpx ; + justify-content: space-between; +} \ No newline at end of file diff --git a/pages/basics/MakingRounds/MakingRounds.js b/pages/basics/MakingRounds/MakingRounds.js new file mode 100644 index 0000000..2c57958 --- /dev/null +++ b/pages/basics/MakingRounds/MakingRounds.js @@ -0,0 +1,286 @@ +// pages/basics/MakingRounds/MakingRounds.js +const app = getApp() +import { + GetHostsInfo, + GetMAC, + GetFaceSN, + ErrorInfo, + CheckFaceSN, + OpenDoorTest, + GetRoomType, + GetRoomTypeAndModalsListLog, + WebChatUpgrade, + QueryUpdateHostStatus, + ForwardQueryUpdateHostProgressBar, + GetRoomTypeNode, + SetRCULight, + SetRCUAir, + SetRCUCurtain, +} from '../../../lib/RequestingCenter.js' +Page({ + + /** + * 页面的初始数据 + */ + data: { + RoomIndex:0, + //权限信息 + autho: null, + //酒店信息 + Hotelinfo: null, + HostsData:null, + HostsDataFilters:[], + isback:null, + HotelId:null, + statusdata:null, + onlineNumber:0, + inputValue:"", + toView:"", + scrollHeight: 0 + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad:async function(options) { + if (!options.HotelId || app.globalData.autho == null) { + app.toast(2, "无酒店信息~") + return; + } + + this.setData({ + autho: app.globalData.autho + }) + try { + this.data.autho.forEach((element, index) => { + element.Hotels.forEach((elements, indexs) => { + if (elements.HotelId == options.HotelId) { + this.setData({ + Hotelinfo: elements + }) + throw new Error(); + } + }) + }); + } catch (error) { + console.log("已经找到,无需循环~") + } + + let that = this + await GetHostsInfo({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + let onlineNumber=0 + for (let index = 0; index < res.Data.length; index++) { + const element = res.Data[index]; + if (element.Status===1) { + onlineNumber=onlineNumber+1 + } + } + + that.setData({ + onlineNumber:onlineNumber, + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + HotelId: options.HotelId, + statusdata: [0, 0, 0, res.Data.length] + }) + + console.log(this.data.HostsDataFilters) + + } else { + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + + + + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + this.calcScrollHeight(); + }, + calcScrollHeight() { + // 1. 拿到屏幕可用高度(px) + const sys = wx.getSystemInfoSync(); + const screenHeight = sys.windowHeight; // px + + // 2. 拿到 scroll-view 的 top(px) + wx.createSelectorQuery() + .in(this) + .select('#myScroll') + .boundingClientRect(rect => { + if (rect) { + const topPx = rect.top; // px + const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) + const heightPx = screenHeight - topPx - bottomPx; + + // 3. 转 rpx 并写入 + this.setData({ + scrollHeight: heightPx * 2 // px→rpx + }); + } + }) + .exec(); + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + + inputSearchForHotels(e){ + this.setData({ + inputValue: e.detail.value + }) + }, + SearchForHotels(e){ + //debugger + let myarry =this.data.HostsDataFilters + let inputValue =this.data.inputValue.trim() + const CNaelement =this.sortHotelsByFuzzyMatch(myarry,inputValue) + this.setData({ + HostsDataFilters:CNaelement + }) + }, + goProcess(e) { + const { room, hotel, status } = e.currentTarget.dataset; + + if (status !== 1) return; // 不为1时不跳转 + wx.navigateTo({ + url: `/pages/basics/MakingRounds/process/process?RoomNumber=${room}&HotelName=${hotel}&HotelId=${this.data.Hotelinfo.HotelId }` + }); + }, + RefreshTheRoom:async function(e){ + let that = this + await GetHostsInfo({ + HotelID: this.data.Hotelinfo.HotelId + }).then(res => { + + if (res.Status == 200) { + let onlineNumber=0 + for (let index = 0; index < res.Data.length; index++) { + const element = res.Data[index]; + if (element.Status===1) { + onlineNumber=onlineNumber+1 + } + } + + that.setData({ + onlineNumber:onlineNumber, + HostsData: res.Data, + HostsDataFilters: res.Data, + isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1), + statusdata: [0, 0, 0, res.Data.length] + }) + + console.log(this.data.HostsDataFilters) + + } else { + app.toast(2, res.Message || "网络繁忙") + } + }, err => { + console.log(err) + app.toast(2, "网络繁忙") + }).catch(err => { + console.log(err) + + app.toast(2, "网络繁忙") + }); + }, + + sortHotelsByFuzzyMatch:function(hotels, keyword) { + // 1. 参数验证 + if (!Array.isArray(hotels)) { + console.warn('第一个参数必须是数组'); + return []; + } + + if (typeof keyword !== 'string') { + console.warn('第二个参数必须是字符串'); + return hotels.slice(); + } + + // 2. 处理空数组或空关键字的情况 + const trimmedKeyword = keyword.trim(); + if (hotels.length === 0 || trimmedKeyword === '') { + return hotels.slice(); + } + + const lowerKeyword = trimmedKeyword.toLowerCase(); + + // 3. 分离匹配和不匹配的酒店 + const matchedHotels = []; + const unmatchedHotels = []; + + hotels.forEach(hotel => { + // 检查是否为有效酒店对象 + if (!hotel || typeof hotel !== 'object' || !hotel.RoomNumber) { + unmatchedHotels.push(hotel); + return; + } + + const hotelName = String(hotel.RoomNumber).toLowerCase(); + const isMatch = hotelName.includes(lowerKeyword); + + if (isMatch) { + matchedHotels.push(hotel); + } else { + unmatchedHotels.push(hotel); + } + }); + + // 4. 合并数组并返回 + return [...matchedHotels, ...unmatchedHotels]; + }, +}) \ No newline at end of file diff --git a/pages/basics/MakingRounds/MakingRounds.json b/pages/basics/MakingRounds/MakingRounds.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/basics/MakingRounds/MakingRounds.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/basics/MakingRounds/MakingRounds.wxml b/pages/basics/MakingRounds/MakingRounds.wxml new file mode 100644 index 0000000..c203a78 --- /dev/null +++ b/pages/basics/MakingRounds/MakingRounds.wxml @@ -0,0 +1,46 @@ + + 返回 + {{Hotelinfo.HotelName}}({{Hotelinfo.Code}}) + + + + + +房号:{{HostsDataFilters[RoomIndex].RoomNumber}} + + + 房间在线: + {{onlineNumber}}/ + {{HostsDataFilters.length}} + + + + + + + + + + + + + + + + + + + + + + + + + {{item.RoomNumber}} + {{item.MAC}} + + + + diff --git a/pages/basics/MakingRounds/MakingRounds.wxss b/pages/basics/MakingRounds/MakingRounds.wxss new file mode 100644 index 0000000..e9b4548 --- /dev/null +++ b/pages/basics/MakingRounds/MakingRounds.wxss @@ -0,0 +1,101 @@ +.aside{ + width:8rem; + border-right: 1px solid #ddd; + font-size: .85rem; +} +.type-nav{ + width:8rem; + position: relative; + padding:.7rem .3rem; + text-align: center; + border-bottom: 1px solid #ddd; + z-index: 10; +} +.flex-wrap{ + display: flex; +} +.type-nav.selected{ + margin-right: -1px; + padding-left:0,-1px; + color: #333; + background-color: #fff; +} +/* .content{ + background-color: #fff; +} */ + +.dish{ + margin-left: 1rem; + padding: 1rem; + border-bottom: 1px solid #ddd; +} +.dish .title{ + display: block; + font-size: 1rem; +} +.dish p{ + color: orange; + font-size: .75rem; +} +.dish .add-btn{ + width: 8rem; + text-align: right; +} +.cu-bar1 { + display: flex; + + align-items: center; + + justify-content: space-between; +} +.cart{ + display: block; + position: fixed; + left: 0; + right: 0; + bottom: 0; + padding: 1rem; + background: #ddd; +} +.container { + height: 50%; + box-sizing: border-box; + background-color: #f4f4f4; +} +.cu1-btn { + position: relative; + border: 0rpx; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 5rpx 5rpx; + font-size: 26rpx; + height: 70rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} + +.cu-btn1 { + position: relative; + border: 0rpx; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 0 5rpx; + font-size: 26rpx; + height: 64rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} diff --git a/pages/basics/MakingRounds/process/process.js b/pages/basics/MakingRounds/process/process.js new file mode 100644 index 0000000..c8be377 --- /dev/null +++ b/pages/basics/MakingRounds/process/process.js @@ -0,0 +1,182 @@ +// pages/basics/MakingRounds/process/process.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + RoomNumber:"", + HotelName:"", + deviceList:[ + {id:1, name:'取电面板通讯', status:'在线',note:'在线',isnote:"0"}, + {id:2, name:'温控面板通讯', status:'在线',note:'在线',isnote:0}, + {id:3, name:'红外转发通讯', status:'离线',note:'在线',isnote:0}, + {id:4, name:'485窗帘电机通讯',status:'在线',note:'在线',isnote:0}, + {id:5, name:'门口传感器测试', status:'显示',note:'在线',isnote:0}, + {id:6, name:'卫生间传感器测试',status:'显示',note:'在线',isnote:0}, + {id:7, name:'淋浴间传感器测试',status:'不显示',note:'在线',isnote:0}, + {id:8, name:'床尾传感器测试', status:'不显示',note:'在线',isnote:0}, + {id:9, name:'镜前传感器测试', status:'不显示',note:'在线',isnote:0}, + {id:10,name:'休闲区传感器测试',status:'不显示',note:'在线',isnote:0}, + {id:11,name:'客厅传感器测试', status:'不显示',note:'在线',isnote:0}, + {id:12,name:'厅卫传感器测试', status:'不显示',note:'在线',isnote:0}, + {id:13,name:'浴缸传感器测试', status:'不显示',note:'在线',isnote:0}, + {id:14,name:'门磁测试', status:'不显示',note:'在线',isnote:0}, + {id:15,name:'干接点窗帘测试', status:'正常',note:'在线',isnote:0} // 最后一条你自行改状态 + ], + deviceListindex:0, + inputValue:"", + toView:"", + scrollHeight: 0 , + modalName: "", + note:"", + noteok:"", + errorsNumber:0, + HotelId:"" + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + if (!options.RoomNumber || !options.HotelName ||!options.HotelId) { + app.toast(2, "无酒店信息~") + return; + } + console.log(options.RoomNumber) + this.setData ({ + RoomNumber:options.RoomNumber, + HotelName:options.HotelName, + HotelId:options.HotelId + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + this.calcScrollHeight(); + }, + calcScrollHeight() { + // 1. 拿到屏幕可用高度(px) + const sys = wx.getSystemInfoSync(); + const screenHeight = sys.windowHeight; // px + + // 2. 拿到 scroll-view 的 top(px) + wx.createSelectorQuery() + .in(this) + .select('#myScroll') + .boundingClientRect(rect => { + if (rect) { + const topPx = rect.top; // px + const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) + const heightPx = screenHeight - topPx - bottomPx; + + // 3. 转 rpx 并写入 + this.setData({ + scrollHeight: heightPx * 2 // px→rpx + }); + } + }) + .exec(); + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + showModal(e) { + this.setData({ + modalName: e.currentTarget.dataset.target, + deviceListindex:e.currentTarget.dataset.id-1 + }) + }, + DialogModal1(e){ + let deviceList = this.data.deviceList + let deviceListindex=this.data.deviceListindex + deviceList[deviceListindex].equipmentstatus=e.currentTarget.dataset.id + + this.setData({ + modalName: null, + deviceList:deviceList + }) + console.log(this.data.deviceList) + }, + DialogModal2(e){ + let deviceList = this.data.deviceList + let deviceListindex=this.data.deviceListindex + if (e.currentTarget.dataset.id==="hideModal_1") { + deviceList[deviceListindex].isnote=1 + }else{ + deviceList[deviceListindex].isnote=0 + } + + + this.setData({ + deviceList:deviceList + }) + console.log(this.data.deviceList) + }, + inputSearchForHotels(e){ + this.setData({ + note: e.detail.value + }) + console.log(this.data.note) + }, + checkWardRoundRecords(e){ + + wx.navigateTo({ + url: `/pages/basics/MakingRoundsAbnormal/MakingRoundsAbnormal?HotelId=${this.data.HotelId}&RoomNumber=${this.data.RoomNumber}` + }); + }, + saveTheText(e){ + let deviceList = this.data.deviceList + let deviceListindex=this.data.deviceListindex + let note=this.data.note + let noteok=e.currentTarget.dataset.id + deviceList[deviceListindex].isnote= 0 + if (noteok==="ok") { + deviceList[deviceListindex].note= note + } + this.setData({ + deviceList:deviceList + }) + }, +}) \ No newline at end of file diff --git a/pages/basics/MakingRounds/process/process.json b/pages/basics/MakingRounds/process/process.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/basics/MakingRounds/process/process.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/basics/MakingRounds/process/process.wxml b/pages/basics/MakingRounds/process/process.wxml new file mode 100644 index 0000000..844212d --- /dev/null +++ b/pages/basics/MakingRounds/process/process.wxml @@ -0,0 +1,84 @@ + + 返回 + ({{HotelName}})_{{RoomNumber}} + + + + 异常数量: + 1 + /{{deviceList.length}} + + + 查看查房记录 + 上传查房状态 + + + + + + 设备名称 + 状态 + 设备检测 + + + + + + + {{item.name}} + + + + + {{item.status}} + + + + + + + + + + + + + + + + + + {{deviceList[deviceListindex].name}} + + + + 检测流程: +