From f52cfe714fb81902c3e3b44c86a80cba13035079 Mon Sep 17 00:00:00 2001 From: XuJiacheng Date: Thu, 11 Dec 2025 09:50:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cloudbase/container/debug.json | 1 + .gitignore | 14 + SQL/日志表.sql | 83 + app copy.js | 153 ++ app.js | 206 ++ app.json | 58 + app.wxss | 2 + colorui/animation.wxss | 184 ++ colorui/components/cu-custom.js | 54 + colorui/components/cu-custom.json | 4 + colorui/components/cu-custom.wxml | 16 + colorui/components/cu-custom.wxss | 1 + colorui/icon.wxss | 1226 +++++++++ colorui/main.wxss | 3967 ++++++++++++++++++++++++++++ components/logscom/logscom.js | 144 + components/logscom/logscom.json | 4 + components/logscom/logscom.wxml | 30 + components/logscom/logscom.wxss | 2 + icon/home.png | Bin 0 -> 2275 bytes icon/home_.png | Bin 0 -> 2028 bytes icon/log.png | Bin 0 -> 2580 bytes icon/log_.png | Bin 0 -> 2522 bytes icon/usercenter.png | Bin 0 -> 4720 bytes icon/usercenter_.png | Bin 0 -> 3873 bytes icon/vacant.png | Bin 0 -> 7306 bytes icon/住宿.png | Bin 0 -> 4174 bytes icon/开门.png | Bin 0 -> 4360 bytes icon/设备编号.png | Bin 0 -> 6658 bytes icon/退房.png | Bin 0 -> 6663 bytes icon/酒店.png | Bin 0 -> 2941 bytes icon/重启.png | Bin 0 -> 7949 bytes lib/RequestingCenter.js | 232 ++ lib/Toast.js | 18 + lib/request.js | 61 + lib/request1.js | 65 + pages/HostUpgrade/HostUpgrade.js | 420 +++ pages/HostUpgrade/HostUpgrade.json | 3 + pages/HostUpgrade/HostUpgrade.wxml | 117 + pages/HostUpgrade/HostUpgrade.wxss | 80 + pages/Hosts/Hosts.js | 1477 +++++++++++ pages/Hosts/Hosts.json | 9 + pages/Hosts/Hosts.wxml | 475 ++++ pages/Hosts/Hosts.wxss | 0 pages/Upgrade/Upgrade.js | 118 + pages/Upgrade/Upgrade.json | 3 + pages/Upgrade/Upgrade.wxml | 72 + pages/Upgrade/Upgrade.wxss | 24 + pages/autho/index.js | 103 + pages/autho/index.json | 3 + pages/autho/index.wxml | 7 + pages/autho/index.wxss | 1 + pages/index/index.js | 99 + pages/index/index.json | 3 + pages/index/index.wxml | 38 + pages/index/index.wxss | 0 pages/login/login.js | 115 + pages/login/login.json | 2 + pages/login/login.wxml | 48 + pages/login/login.wxss | 0 pages/logs/logs.js | 314 +++ pages/logs/logs.json | 3 + pages/logs/logs.wxml | 79 + pages/logs/logs.wxss | 1 + pages/mycenter/index.js | 81 + pages/mycenter/index.json | 3 + pages/mycenter/index.wxml | 33 + pages/mycenter/index.wxss | 0 pages/test/test.js | 647 +++++ pages/test/test.json | 3 + pages/test/test.wxml | 143 + pages/test/test.wxss | 1 + project.config.json | 70 + project.private.config.json | 45 + sitemap.json | 7 + utils/filters.wxs | 30 + utils/md5.min.js | 2 + utils/util.js | 59 + utils/watch.js | 41 + 78 files changed, 11304 insertions(+) create mode 100644 .cloudbase/container/debug.json create mode 100644 .gitignore create mode 100644 SQL/日志表.sql create mode 100644 app copy.js create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 colorui/animation.wxss create mode 100644 colorui/components/cu-custom.js create mode 100644 colorui/components/cu-custom.json create mode 100644 colorui/components/cu-custom.wxml create mode 100644 colorui/components/cu-custom.wxss create mode 100644 colorui/icon.wxss create mode 100644 colorui/main.wxss create mode 100644 components/logscom/logscom.js create mode 100644 components/logscom/logscom.json create mode 100644 components/logscom/logscom.wxml create mode 100644 components/logscom/logscom.wxss create mode 100644 icon/home.png create mode 100644 icon/home_.png create mode 100644 icon/log.png create mode 100644 icon/log_.png create mode 100644 icon/usercenter.png create mode 100644 icon/usercenter_.png create mode 100644 icon/vacant.png create mode 100644 icon/住宿.png create mode 100644 icon/开门.png create mode 100644 icon/设备编号.png create mode 100644 icon/退房.png create mode 100644 icon/酒店.png create mode 100644 icon/重启.png create mode 100644 lib/RequestingCenter.js create mode 100644 lib/Toast.js create mode 100644 lib/request.js create mode 100644 lib/request1.js create mode 100644 pages/HostUpgrade/HostUpgrade.js create mode 100644 pages/HostUpgrade/HostUpgrade.json create mode 100644 pages/HostUpgrade/HostUpgrade.wxml create mode 100644 pages/HostUpgrade/HostUpgrade.wxss create mode 100644 pages/Hosts/Hosts.js create mode 100644 pages/Hosts/Hosts.json create mode 100644 pages/Hosts/Hosts.wxml create mode 100644 pages/Hosts/Hosts.wxss create mode 100644 pages/Upgrade/Upgrade.js create mode 100644 pages/Upgrade/Upgrade.json create mode 100644 pages/Upgrade/Upgrade.wxml create mode 100644 pages/Upgrade/Upgrade.wxss create mode 100644 pages/autho/index.js create mode 100644 pages/autho/index.json create mode 100644 pages/autho/index.wxml create mode 100644 pages/autho/index.wxss create mode 100644 pages/index/index.js create mode 100644 pages/index/index.json create mode 100644 pages/index/index.wxml create mode 100644 pages/index/index.wxss create mode 100644 pages/login/login.js create mode 100644 pages/login/login.json create mode 100644 pages/login/login.wxml create mode 100644 pages/login/login.wxss create mode 100644 pages/logs/logs.js create mode 100644 pages/logs/logs.json create mode 100644 pages/logs/logs.wxml create mode 100644 pages/logs/logs.wxss create mode 100644 pages/mycenter/index.js create mode 100644 pages/mycenter/index.json create mode 100644 pages/mycenter/index.wxml create mode 100644 pages/mycenter/index.wxss create mode 100644 pages/test/test.js create mode 100644 pages/test/test.json create mode 100644 pages/test/test.wxml create mode 100644 pages/test/test.wxss create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 sitemap.json create mode 100644 utils/filters.wxs create mode 100644 utils/md5.min.js create mode 100644 utils/util.js create mode 100644 utils/watch.js 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/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..5dff823 --- /dev/null +++ b/app.js @@ -0,0 +1,206 @@ +//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:[], + 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 = [] + 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 + + narr.push(rs) + } + + this.globalData.roomIDName=narr + + //console.log(narr) + + + } + +}) \ No newline at end of file diff --git a/app.json b/app.json new file mode 100644 index 0000000..f271b61 --- /dev/null +++ b/app.json @@ -0,0 +1,58 @@ +{ + "pages": [ + "pages/autho/index", + "pages/login/login", + "pages/index/index", + "pages/mycenter/index", + "pages/logs/logs", + "pages/test/test", + "pages/Hosts/Hosts", + "pages/HostUpgrade/HostUpgrade", + "pages/Upgrade/Upgrade" + ], + "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..97c8b6a --- /dev/null +++ b/app.wxss @@ -0,0 +1,2 @@ +@import "colorui/main.wxss"; +@import "colorui/icon.wxss"; 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..a526f85 --- /dev/null +++ b/colorui/main.wxss @@ -0,0 +1,3967 @@ +/* + 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[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.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-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: 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-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-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-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-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-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/icon/home.png b/icon/home.png new file mode 100644 index 0000000000000000000000000000000000000000..76c37e857195ce15da8fcfc705626028ae906c3e GIT binary patch literal 2275 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 literal 0 HcmV?d00001 diff --git a/icon/home_.png b/icon/home_.png new file mode 100644 index 0000000000000000000000000000000000000000..9b98e9c932dbc2420dc716ff3d60735215be3da7 GIT binary patch literal 2028 zcmah~c{tnI8vdb-+N$=4P*c$=B1tU?YO7SzkhCGzRP9?Owj>lmExk>Q(nKv)^x{!7 zv_$LHu3Af`Wt5^Qv6f)U&}zf9^rrLQz0WiEp6C6}`@G-zzH`p|oIeihA|5R-qbUOb zfc$w3%2mXK?;$NEnrrj079u(n=74hmfW|!8uK|)GEk<=kp9SiNKx-nQ8-#Ji0YK6T z0JxR~0Dp>7*H!_54g-L7e*my51_1S#(l){w(Zb;vj5iek6nejhSb>p(mMAF|=!`~* zSTyz=+tWm(Pdn#D3l5-#SOvv}hzK|hI}L}x;gHh^A{=gIYGGxDFoGeiV6fp|1>FB= zphO2pgeLxdLq&m~oTvf){RC=!m{ni^H3UMBivU6+$RSoxC^S5p5&{hfrbI+RBZ8u% zAfeGwG$@S{^Oy27HBX4LfSDo!;emfunuzu&#~aLwT;!fdIS{X2-ni?Garaf>75NnU z_}uAqG2$qKFu2NLj+B(7H`r&aSI3aKiUA>+25|TdNp|KTy$YekIfGGFwgfBdwA{Ud z0vp^$z~_{2%eH6~}+29G~2n0R`tAHo=~>X&aqiTxcw z(CsB&-q`eXUAd()4@m@@U~`kRL&G&&bVXt0vyod;=aS3BNN7}?~v zuT3{cH__HyeYzNy5bsA>np#>B3(v39mS3uViVB)=ix4&liNhg=t+Z;XT>f$1&s-iMn>t1(XMY<3|a>~ri{CahL?3DYu zO@|JvwY8NS)b{orRts42_JI)_(#`@%cErv;*QFntEntw;3rZmKluU|{c342vOQf`yHDzX5&Q?Id@ z_I1}`d3jmo*s+GocM{KNvIIkAOSQtCHMi`XoKoGbPrpx?r5!M?L`L4#RU}Vx)4vHP z8-r#NvRov3#ch+f7yFvhzNHp!oI0b#+Su5*&EY)XGcq=IDL7d9eWGD(VgemDR9aDm z&Z~X>i$f2mxEQ0Ytv#c0=ULcip>TBSaaiksS^i*4@8F(1cBYvRT3@RcQqfvbz%YXzl&`;8-b)`l?jQ-iPaN8vHI)S68pAdiUxbjr+VY%}b>8 zWveQG(D^VadRYS-n=<@8+lSbYt6TG8qQa4m#E(e3l4m$a#M;|`MV9(iE8gs_tUR8b zoxOOeDQ@{?taxn0E#a-*V|J;=CW`MT8#CM5+QKL5eL)5J^cxrTU?*M;47gQq>M61E zbZja!e>f6%8j)ZFXo~IZ4KM20GQ0|gjKlkcoBRP^of)L*J-f6OJR>ATUl5!SW34p8 z$6zq?hQVsge@L*?^HC~ESY2jrZYZ0VcTAuL+P~m=k13RMf; zzU5@(=Y#!Zo%1to^q&e`5;@ju80&if=Mt8T=_i!2(a|bwP2NKcgWvFLA-1ZnsmpMk!O#u?7-S{(AGDaW6Ag|5Yzk^{#Ix|Tj@ucr}X*m z3*7#60iI>+2|9K35w}Eqz|Dt5`ewZavdgxVM|*~uddXDQJ-&-1=oY&xm1Y0er68<) zx;b}d(qv`-q(@Biv>seGIFc>6F01}?OG|N0C18;dJ=4N2s`J(+_y>X2`j$*@Qj}MT zL5(343d9c4&9QyZ(bpflwAgq<(z=n$dY!F!$)ZalnZ$J&-t{Bj?5Xt`G{mWslwY)so(}K2|&om+}BF9z{GG5-z@mLnFRI%Yzn9S_J<26n^4j}XWKZ-;Bx*lNf=WSpP30~b3sP0h( zL(7mSt|RHP&y5w-YT7f_U}RWP4r-8~ASbt_kXcfq>D)Tp4PgPJ9*F4Kck+l`lK3SJ zAM!_h5+gMrprV>#uG&Ilytk*Up`;5j* QqR$REe-4kTKkJ|IZ}i`dSO5S3 literal 0 HcmV?d00001 diff --git a/icon/log.png b/icon/log.png new file mode 100644 index 0000000000000000000000000000000000000000..562150d7f8919fdd6082219f2fe0ae2a4e054b5d GIT binary patch literal 2580 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 V;2Um!6h_OJ=wRz?Q*$;j`9EOzFi`*i literal 0 HcmV?d00001 diff --git a/icon/usercenter.png b/icon/usercenter.png new file mode 100644 index 0000000000000000000000000000000000000000..0139542ff18d06699a67e059def0d7f51bcfaf94 GIT binary patch literal 4720 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 literal 0 HcmV?d00001 diff --git a/icon/vacant.png b/icon/vacant.png new file mode 100644 index 0000000000000000000000000000000000000000..e3237ff7cf74b9fbf3c9609bd56890cb1e45d944 GIT binary patch literal 7306 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 literal 0 HcmV?d00001 diff --git a/icon/开门.png b/icon/开门.png new file mode 100644 index 0000000000000000000000000000000000000000..815a90676a132c7dca71ac1b47b5e04a5d545d5d GIT binary patch literal 4360 zcmeHK_g7O}w@pI8BnpJCNQn@niwKISUZLD4H=J*o1isv-k&lK-2|}zS8Y#!FXnI3a-(*q+A<=ivYX>9BUs`#mQuow;N|q z9n{_R0)D7Iwn=b|+tOftBz<}H=~{qYJGFRN38jOx73FI+US@A0TM*yCH8fM33+?ZZbrYdS>86Ne2^wm7-L^C+2K zNq}l|#&^xj$`JKYjZJF1e(=W(+aBXYP@Yn6t!l#7>!SU7nz6*_zQgyOwTC5S58)Tj zT@&nQI|syRKX7}T%rS#&@phaUb39+u#j_kC74 zDkS?SpSstZ{%WB4y+^n$8EhT>u`}I|a=^&1vi2Hi-~P)YcBb*F*IdSXlA_mTJ}Ip2 z!z+8`{C$&FsV7&u;?tc(Ul=Su2b9L#Xo-PGcC}TLBs`3frSM|N?*5g+e^SP-&Y3xKjkS6G~AVK$2 z>4?U;>F}MM91oM4rcpuwzGSo@DVytf6(!g`@o1zw!?ClF^AlAN7FkQsp37PQ{a|@P z9@X4F7wrc}X=1H%pw+`?VFPbY#`JdAL!3>C&pk&-7LT3@&@%EUudPs2OUaN^jlfn7 zqHz*agLi3F`-sOiFzu9+aju{6f-a>!4! zP9n#(k>wv7hAJUvNTB>Q%X6efw<_)zZZ|SjWg_!@4im2-4{x?`J`)PuR5WP|pBLAL zy>v}2jk?Z7m%4~(y!H79*6sI+CmgkjEWaD*7(kt!W*F}JsqdGd@bh2ovNI2IYa|eZ zk1Ita`Y8^Rkt)!(WuaG+yt4khy8P~wbLHCsazW-qa~Hhq%u2#VC@|)|#Yt}ZcXra> zDyQD%07agGw>hdE7&^PYy=|&+_-V2C6_IF8XaYT*e<2Lu4_Rs+k&|0XOMa!?_qHPq zq9b>svjm$QOP%ix9!_TLoW<9t+ zyOUJF=D}sR#SOPJaIH(2kpytKc^|q=yok^)$qrld&B@w+?G8qEcdQ+G0>QWMhJIih zX;0FA{Ej2I!eP5_&u4v-(Zm8=Z0t~7&F%;GiIMu6V>_o}19s#wSy#R3KO_;VHC|%w zvTNL@04k~RZxFZjRqqZdG4JI%OFVZMLcV-lT)7& zkfETJa9h?p+xxb4yC2^DxPZ_n0}jXz#Fq_tJ(SzPV;K|*b22o%gFko3IQ3EYo*EA; z1OimtH1_mm#;*8rV}1z)_|HF8>bfoT;4>IgmDY2TYsNlTm2aNVQ9$uDw76t+?nLXP-EDhrx?DXin4r?^_6GV zf>?$`3@T|}7*A1&{p(Jw#*f zq%bR9Pe)%$4?!+@66JAiG7+Ov#;Y5kU8IkK=pplveDC(N9WOcDuL}LI_c^^wXD+67 z#h_AykM7rfO-Blw&NSog&YFL8dz1=h5%v$mHQhQ~_0(lrULr8ac<#nOGp-pX6JyD{ zE)0SCb2-YxhY&4wu3|Rk>r|XcaVr-=wbGVOUftpej2krAdP1BMQsHFI`tzD`8x+)7 zy2N*K>FZem>_nMAAtS!IM2AU^H!uH^&YXtX6b*X0_OcD6OctYlDQn2j5|-JW-CdR# zQu~m?%G5+ZbI*wb*>Zue2l_6jsF{7nU(v8c7=waDUsZCcfHN7`{I03VWYVv2eJ{r^ z#?09BrjH+am;klsWjmTl!+CI&8o&hpOi!z{j%G?Gw?8p~VFK1l7W}7~$xqgHw401! z?jr84Umsimp;46!?(R34z=K{R8#yf|TmDcF4@o9ak|zB;iutUr+%n246ZpSFq7@CJ zS#HIWjh@u}k9A(t{kQ*!;dkekaK*dhUdgP|I!>%=SMOUZdzpLqmCyTu#AI| zl{gQkxnhV)4O+n9F$U~)z6L)i`45YkGbbiMzF-rNTyLD9^92O{I%}V|IS?3tRbv!Y z>!DFYzT9t}us})3^sU>fzv8PqHU1r9G2JV7yfl@3Q5vF`ju9`blH$1OJ+0^{avU&$ zL?G}tliv2`4NS&ZUYY4zkE4ney|Vr zb>h{zfH9?f;wDmvAP~%vn1UMlx`yUw6+_tE!altzUxo(k7HtR@DrmMI9`1I8*N%$O zUP1Ie_ZNf@QydfuIa@f%!l1(N68n&9MTy>H_M|2Z7#WHiN{q>ZXTf0Xq+1WkQ*^VPeePG_^z`9$>!rJoNiA)yAPJSP$pfFKuzt?iZ+bx;x4BLP}Cfv$zdE1i4{@8_sGP}~of!7s?Pl_l+;oon&K#q~qD=bjGWp_Yn zLap2G0n0|kMC5^r&(_)7yRbOR2{Qk}vsusFguCYF6?)oxpYzZo=xfukaNv0T>=~ac z*P@zTzPNE-)V91=G89sU7KwZ7ZIGS4QB)*(%E&kGr}Zi4lA$J>oKaojnS3AE-d4KR zZUbI@i%pl=zmBtz&JD-d2XDS@`hF@3BL$hk1V~KyFy$lII29qDSpb#(#6P@ z_bjD)8angkVEPDzvsaCxBvb&U0X7b zGbDqYl)Al4?d!N_@4{MN*_(_NoLuR5?AZUpy-DQmCyEBrZusyi2xa@K!4L3cWnK(Xt4E)11}8lQf^ z-gr$X6410aS~lFHDf+E;|Ho|Tk!?)@;qXlIhNZ`@yrOy`$_f_U`K*X1s{b(->FV1L zw25-YEq4!mB3H%KLBCW{2%V0*JW>c0BThGX zkkSOKgmoEhMZoJgT8dMwQ`Jrx0;8rBc^Bw?CZE46j2X@iTA|w5`^iu4`wh}~(Z1{& z`g1+Q)4$JV)8S`m=G%XW8ax?mV)0#Sv-5oD00;MF@CH#Jmr(G#kR&UlJnVpBOmqUR uaNZUMvhT3`Dz9HrZwNF<*!Cd#3m$RmORI#wFYn(5Fb{ogj8-Z79_c?VvGbPz literal 0 HcmV?d00001 diff --git a/icon/设备编号.png b/icon/设备编号.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca04e743be93ba7a23f134784116158ea76bd28 GIT binary patch literal 6658 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 G`2PT)AjOyf literal 0 HcmV?d00001 diff --git a/icon/退房.png b/icon/退房.png new file mode 100644 index 0000000000000000000000000000000000000000..ab46ba374e854116d951f6b28f772c10a8c65e92 GIT binary patch literal 6663 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 R3+Mm<002ovPDHLkV1j)xaz+3E literal 0 HcmV?d00001 diff --git a/icon/酒店.png b/icon/酒店.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fce1cab48a9e29bbf02a4494b8afc1ae8b789b GIT binary patch literal 2941 zcmc&$X;4#H8oeQgAWMjCfCgEDKr1TJAQ42AMA;$`3Hu^jTo3_iBnlCMu(SkOL>)m^ z1F|TD$PT6f5l~!Q2w>$yZy~=X{NEs5%2#(=ii@CN8Ef=|t zEs;?39$EcY8~Lag@eTTDhPqVG?(Gd^{kP|R?Of&`d{WelVU@tAP9$q&Qe{*2%VDVb znv8}tRdq9r0XhfEAjQ34*~m}Xd?Lu}AHE)DU1>1QXDIg<&eR@yNdeq=3xYAFWyDgAOpNbRsVs3VnBaG)wrZ72|BF~XPqCx0Ce_cvlKHJQ0%g( zw#gO)l!27TclQ2x0MDO>ZF(k9%@e4e37D%^JI5=99voXjhQYIyQ1c9`)6ywUp2*=5r#KEH`d?KHqYR^i+t5^>Ug45*l)n`7ahP1~ zW*GeR=bggSLJdHOKYP zAZzAC5Ml#)?ucsN4wV734ves&uuTKA+ z2j{C&e@c87n6w7(JQax2NWI^*);)yS^cbdQG^-x;W5>^l$V@eS)^-<4==%>|gAWT@ zit`4#Dw2<%-`}T(?cuy`--GKn3~p>D*L^ov8sX)#)|iJ1F3P@}$&y@?vT_(oTB(Rl z)fVUlUEXXScMq%$Aw;LGN$Ch?jaC1!Uo^IG4d0@F#0UdTN^OsQc|N>NwIO6(xShD9 z#{9JF?u1<*Eogq&ct_Ns7F;TY=ns3VGbgoj5HVhssAT6{>fCsw#I=uROU+Y&mrZne z+hQ953n|YgeTmxO?9KQUhTmM9iGmKXU*bN2L0CFFJIGM zfTN%0zL8D4zaB!27G_=gmDc>IXgN?jVB0_Thr;d2y5Y9CWs~PT`}H&b+&>iJwljA% z>rx*rw%1?pO>=HB(igJX5v-8E!xsyTW+E^=!blq&3wRSc8p_+TK>x&Oy|+FcSVhz) z|D;KWF2A73s4gIeT^!eMy#t{}P2}%da0z-%7+1nlOoE==_hm6d`adhczSHAJDhv(n z@VFcr)Kv7vY$0^G{t&=}_CThax3r#4<@)$(uGc{k;E*D8r&NA<5p7EGg)PO_X^7I6#|CB0Y4h=t;r{O+no zzU_LleoBC)rjf+62`Jg#IEhw-eVsxaM-O^Q2LQ)51a=4J=yHvt&sU~4<1sC zkb2gBGBe7B}fQY!^OSqCkU{(-*B{Y$jUBTmw|W){~G6MV7tOXJL0t`da^?! zpL`HU1LFJIeX}q$c*1LVa_cW}y@-_8aSw{B#Ze2NvCeWPQ}&H0F|6uQoC^wMTC*d? z;hl9xH)i-;@-M4Yxw?`n_Ywpe_y@^z@gTEYDZ#ZGcSZGudU^(viZ*6sWPIs9iOkf| zRXJB@(W@cAdd2b}bzWWtao^uBjQjrQ>V$s6$B}U*BIHLnEfGa=yo;h>dQ~lul>wH> zx7NR~6+FUq`54PDh!Ad z+xc;Q1Y^aEf)|i)Cq>~ULYM@ds^8Za2iu0f`Duj&bqbg}$IM4U5tSaF&gCPaXm;UG z%0l)iaypKd%i^IcBj%PlCc1I)?a*s4sC~ZdRZZo$_(uAa9ziOus>?szTeC5yjKro;YjffN zHwzkhOCG(FdMthsbfSAM>#|%f@H~?in5B_u|+hbcFO0`oHi(Qp_LIy&ff1VPh2R3|5u(WnKraeFFd`#LA@ShCX#xT9aia!*`qemgU!v3BZl-d!@(Z5 z^~`AEb*H3vx65Dc5*L0h|DkMUyZJGlIft8B5`-9<+KBJr7yyT_NDlxcP?%$CzNm^_2_Ma3y8Mn?udqCDAT+Og#~ zeLZ^efJK|<)pzt9=Rw1pWykmL_ljXI`Rf_XwjPw7M73&pW!S0{k%$~!;f7e1{A5Yl zbx(qb>bg6Bua5(EKA2-GnhS5ZXuUkK*BhVp)o*%pWbk35q^7K7jk8a|>G>zi?h7kA z;u~Dv9}3*MKYp~2hfo&w@KXeLaIzmR1t2hxm1DWyCAXMA0^Tp2}BQ0f|m=4n7Q LCz-KN_{9DRoem%0 literal 0 HcmV?d00001 diff --git a/icon/重启.png b/icon/重启.png new file mode 100644 index 0000000000000000000000000000000000000000..50fcb59bed025c977d441b779716e7f5b6edd7e1 GIT binary patch literal 7949 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 Da?dyJ literal 0 HcmV?d00001 diff --git a/lib/RequestingCenter.js b/lib/RequestingCenter.js new file mode 100644 index 0000000..11f1e4a --- /dev/null +++ b/lib/RequestingCenter.js @@ -0,0 +1,232 @@ +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 SetRCULight(params){ + params.token = gettoken(); + console.log(params) + return await reqeust1({ + title: null, + url: BoonliveUrl + 'SetRCULight', + data: params || {} + }) +} \ 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/HostUpgrade/HostUpgrade.js b/pages/HostUpgrade/HostUpgrade.js new file mode 100644 index 0000000..960cd96 --- /dev/null +++ b/pages/HostUpgrade/HostUpgrade.js @@ -0,0 +1,420 @@ + + +const app = getApp() +function inArray(arr, key, val) { + for (let i = 0; i < arr.length; i++) { + if (arr[i][key] === val) { + return i; + } + } + return -1; +} + +// ArrayBuffer转16进度字符串示例 +function ab2hex(buffer) { + var hexArr = Array.prototype.map.call( + new Uint8Array(buffer), + function (bit) { + return ('00' + bit.toString(16)).slice(-2) + } + ) + return hexArr.join(''); +} + + + +Component({ + properties: { + paramA: Number, + paramB: String, + // 定义属性,属性值可以是任意类型 + myProperty: { + type: Array, + value: {} + } + }, + data: { + devices: [], + connected: false, + chs: [], + TimerNumber:0, + myArray: [], + index: null, + firmwareName:"这里显示文件名称", + devicedisplay:0, + dat_filename:"", + dat_filePath:"", + hex_filename:"", + hex_filePath:"", + }, + + methods: { + onLoad: function() { + this.data.paramA // 页面参数 paramA 的值 + this.data.paramB // 页面参数 paramB 的值 + + }, + bindPickerChange: function(e) { + console.log('picker发送选择改变,携带值为', e.detail.value) + this.setData({ + index: e.detail.value + }) + }, +// 初始化蓝牙 +openBluetoothAdapter() { + wx.openBluetoothAdapter({ + success: (res) => { + console.log('openBluetoothAdapter success', res) + this.startBluetoothDevicesDiscovery() + }, + fail: (res) => { + if (res.errCode === 10001) { + wx.onBluetoothAdapterStateChange(function (res) { + console.log('onBluetoothAdapterStateChange', res) + if (res.available) { + this.startBluetoothDevicesDiscovery() + } + }) + } + } + }) + var _this =this; + let num =setTimeout(function(){ + _this.stopBluetoothDevicesDiscovery() + },20000) + // console.log('setTimeout'+num) + this.setData({ + TimerNumber: num, + }) + // console.log('setTimeout'+this.data.TimerNumber) +}, + + +startBluetoothDevicesDiscovery() { + console.log('startBluetoothDevicesDiscovery ') + if (this._discoveryStarted) { + return + } + this._discoveryStarted = true + wx.startBluetoothDevicesDiscovery({ + allowDuplicatesKey: true, + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + fail(res) { + console.error('startBluetoothDevicesDiscovery', res) + } + }) +}, +closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this.data.deviceId + }) + this.setData({ + connected: false, + chs: [], + canWrite: false, + devicedisplay:-1 + }) +}, +onBluetoothDeviceFound() { + // console.log('onBluetoothDeviceFound ') + wx.onBluetoothDeviceFound((res) => { + // console.log('onBluetoothDeviceFound ',res) + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const data = {} + if (idx === -1) { + data[`devices[${foundDevices.length}]`] = device + } else { + data[`devices[${idx}]`] = device + } + this.setData(data) + }) + }) +}, +getBluetoothAdapterState() { + wx.getBluetoothAdapterState({ + success: (res) => { + console.log('getBluetoothAdapterState', res) + if (res.discovering) { + this.onBluetoothDeviceFound() + } else if (res.available) { + this.startBluetoothDevicesDiscovery() + } + } + }) +}, +startBluetoothDevicesDiscovery() { + console.log('startBluetoothDevicesDiscovery ') + if (this._discoveryStarted) { + return + } + this._discoveryStarted = true + wx.startBluetoothDevicesDiscovery({ + allowDuplicatesKey: true, + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + fail(res) { + console.error('startBluetoothDevicesDiscovery', res) + } + }) +}, +stopBluetoothDevicesDiscovery() { + // console.log('setTimeout'+this.data.TimerNumber) + + wx.stopBluetoothDevicesDiscovery() + if (this.data.TimerNumber!=0){ + // console.log('timeoutID'+ this.data.TimerNumber) + clearTimeout(this.data.TimerNumber) + } + +}, +createBLEConnection(e) { + + const ds = e.currentTarget.dataset + const deviceId = ds.deviceId + const name = ds.name + + console.log('createBLEConnection:'+deviceId) + wx.createBLEConnection({ + deviceId, + success: (res) => { + this.setData({ + connected: true, + name, + deviceId, + devicedisplay:deviceId, + }) + console.log('kkkkk:'+this.devicedisplay) + this.getBLEDeviceServices(deviceId) + }, + fail: (res) => { + console.error('createBLEConnection', res.errMsg) + } + } + ) + this.stopBluetoothDevicesDiscovery() +}, + +getBLEDeviceServices(deviceId) { + wx.getBLEDeviceServices({ + deviceId, + success: (res) => { + console.log('getBLEDeviceServices', res.characteristics) + for (let i = 0; i < res.services.length; i++) { + if (res.services[i].isPrimary) { + this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) + return + } + } + } + }) +}, +getBLEDeviceCharacteristics(deviceId, serviceId) { + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log('getBLEDeviceCharacteristics success', res.characteristics) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i] + + if (item.properties.read) { + console.log('read characteristicId:'+item.uuid, res.errMsg) + wx.readBLECharacteristicValue({ + deviceId, + serviceId, + characteristicId: item.uuid, + }) + } + if (item.properties.write && item.properties.notify) { + this.setData({ + canWrite: true + }) + this._deviceId = deviceId + this._serviceId = serviceId + this._characteristicId = item.uuid + console.log('Write _characteristicId:'+item.uuid, res.errMsg) + + // this.writeBLECharacteristicValue('11223344AABBCC') + } + if (item.properties.notify || item.properties.indicate) { + console.log('notify OR indicate characteristicId:'+item.uuid, res.errMsg) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: item.uuid, + state: true, + }) + } + } + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + // 操作之前先监听,保证第一时间获取数据 + wx.onBLECharacteristicValueChange((characteristic) => { + const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId) + const data = {} + if (idx === -1) { + data[`chs[${this.data.chs.length}]`] = { + uuid: characteristic.characteristicId, + value: ab2hex(characteristic.value) + } + } else { + data[`chs[${idx}]`] = { + uuid: characteristic.characteristicId, + value: ab2hex(characteristic.value) + } + } + // data[`chs[${this.data.chs.length}]`] = { + // uuid: characteristic.characteristicId, + // value: ab2hex(characteristic.value) + // } + this.setData(data) + }) +}, + +stringToBytes : function(strtxt) { + return new TextEncoder().encode(strtxt) + }, +stringToByteArray:function (str) { +console.log('str'+str) + var array = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + array[i] = str.charCodeAt(i); + console.log('array[i]'+array[i]) + } + return array; + } , + chooseMessageFile(e){ + const ds = e.currentTarget.dataset; + const name = ds.name; + const _this =this + let array = [name] + + + console.log(_this.properties.paramA) + console.log(app.globalData.roomIDName.length) + console.log(_this.data.myArray.length) + console.log(_this.properties.myProperty.length) + + + wx.chooseMessageFile({ + count: 1, + type:'file', + extension:array, + success(res){ + console.log(res) + if (name === '.hex') + { + console.log('chooseMessageFile True HEX:'+res.tempFiles[0].path) + _this.setData({ + hex_filename:res.tempFiles[0].name, + hex_filePath:res.tempFiles[0].path, + + }) + } + else if (name === '.dat') { + console.log('chooseMessageFile True DAT:'+res.tempFiles[0].path) + _this.setData({ + dat_filename:res.tempFiles[0].name, + dat_filePath:res.tempFiles[0].path, + }) + + } + + + + }, + fail (res) { + console.log('Failed to get file', res.errMsg) + } + + + }) + }, + + +writeBLECharacteristicValue(sendstr) { + // 向蓝牙设备发送一个0x00的16进制数据 + + console.log(sendstr) + let datebuffer =this.stringToByteArray(sendstr); + // console.log('buffer Size:'+buffer.length) + + let buffer = datebuffer.buffer + console.log('datebuffer'+datebuffer) + // let dataView = new Uint8Array(buffer) + // dataView.a + console.log('buffer.leng'+buffer.byteLength) + console.log('buffer.leng'+buffer) + // dataView.setUint8(1,11) + // dataView.setUint8(2,16) + // dataView.setUint8(3,13) + // dataView.setUint8(4,18) + // dataView.setUint8(5,12) + // dataView.setUint8(6,24) + // dataView.setUint8(7,54) + // dataView.setUint8(8,34) + + console.log('UUID :'+this._characteristicId) + + wx.writeBLECharacteristicValue({ + deviceId: this._deviceId, + serviceId: this._serviceId, + characteristicId: this._characteristicId, + value: buffer, + success (res) { + console.log('writeBLECharacteristicValue success', res.errMsg) + }, + fail (res) { + console.log('writeBLECharacteristicValue fail', res.errMsg) + } + }) +}, +writeBLECharacteristicValue1(){ + this.writeBLECharacteristicValue('1233456789a') +}, + +closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false +}, + + + + }, + + + + ready: function () { + + console.log(app.globalData.roomIDName) + this.setData({ + myArray:app.globalData.roomIDName + }) + console.log( this.data.myArray) + }, + + + + + + // 蓝牙操作 + + + + + + +}) diff --git a/pages/HostUpgrade/HostUpgrade.json b/pages/HostUpgrade/HostUpgrade.json new file mode 100644 index 0000000..07c896c --- /dev/null +++ b/pages/HostUpgrade/HostUpgrade.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/HostUpgrade/HostUpgrade.wxml b/pages/HostUpgrade/HostUpgrade.wxml new file mode 100644 index 0000000..8f3f1df --- /dev/null +++ b/pages/HostUpgrade/HostUpgrade.wxml @@ -0,0 +1,117 @@ + + + + + 房型: + + + + + + {{myArray[index]}} + + + + + + + + + + + + + + + + + 固件: + + + {{hex_filename}} + + + + + + + + + + + + + + 配置: + + + {{dat_filename}} + + + + + + + + + + + + + + + + 获取 + 文件 + + + + + + + + + 80% + + + + + +已发现 {{devices.length}} 个外围设备: + + + + + + + + {{item.name}} + 信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%) + UUID: {{item.deviceId}} + Service数量: {{utils.len(item.advertisServiceUUIDs)}} + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/HostUpgrade/HostUpgrade.wxss b/pages/HostUpgrade/HostUpgrade.wxss new file mode 100644 index 0000000..665dbe8 --- /dev/null +++ b/pages/HostUpgrade/HostUpgrade.wxss @@ -0,0 +1,80 @@ +/* pages/HostUpgrade/HostUpgrade.wxss */@import "../../colorui/main.wxss"; +@import "../../colorui/icon.wxss"; + +.flex-nine +{ + flex: 8; +} +.flex-five +{ + flex: 5; +} + +.newcu-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: 70rpx; + font-family: Helvetica Neue, Helvetica, sans-serif; + white-space: nowrap; + } + .newcu-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; + } + +.devices_summary { + margin-top: 2px; + padding: 6px; + font-size: 16px; +} +.device_list { + height: 500px; + margin: 50px 5px; + margin-top: 0; + border: 1px solid #EEE; + border-radius: 5px; + width: auto; +} +.device_item { + border-bottom: 1px solid #EEE; + padding: 10px; + color: #666; +} +.device_item_hover { + background-color: rgba(0, 0, 0, .1); +} +.connected_info { + position: fixed; + bottom: 0; + width: 100%; + background-color: #F0F0F0; + padding: 10px; + padding-bottom: 20px; + margin-bottom: env(safe-area-inset-bottom); + font-size: 14px; + min-height: 100px; + box-shadow: 0px 0px 3px 0px; +} +.connected_info .operation { + position: absolute; + display: inline-block; + right: 30px; +} + diff --git a/pages/Hosts/Hosts.js b/pages/Hosts/Hosts.js new file mode 100644 index 0000000..d46bbfd --- /dev/null +++ b/pages/Hosts/Hosts.js @@ -0,0 +1,1477 @@ +// pages/Hosts/Hosts.js +const app = getApp() +//导入酒店信息请求发方法 +import { + GetHostsInfo, + GetMAC, + GetFaceSN, + ErrorInfo, + CheckFaceSN, + OpenDoorTest, + GetRoomType, + GetRoomTypeAndModalsListLog, + WebChatUpgrade, + QueryUpdateHostStatus, +} 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, + //本次操作的状态数据 + statusdata: [0, 0, 0, 0], + //mac绑定的酒店 服务器获取 + bdHosts:[], + //房型信息 + roomtype:[], + //升级状态 + Upgradestatus:"", + UpgradestatusTimeout:"", + UpgradestatusTimeout2:"", + UpgradestIstrue:true, + //房间信息 + roomtypeInfo:[], + //房间回路信息 + roomtypeInfoNode:[], + + }, + // 监听单个字段 + + + observersUpgradestatus: function() { + let Upgradestatus=this.data.Upgradestatus + let UpgradestatusTimeout2=this.data.UpgradestatusTimeout2 + if (Upgradestatus=='升级就绪'||Upgradestatus[0]=='.') { + if (UpgradestatusTimeout2>0) { + this.setData({ + UpgradestatusTimeout:UpgradestatusTimeout2 + }) + this.observersUpgradestatusTimeout() + } + + } + + }, + observersUpgradestatusTimeout:function () { + let Upgradestatus=this.data.Upgradestatus + var timestampSec = Math.floor(Date.now() / 1000); + var UpgradestatusTimeout=this.data.UpgradestatusTimeout + if ((timestampSec-UpgradestatusTimeout) >60) { + this.setData({ + Upgradestatus:"升级超时!", + UpgradestatusTimeout2:0 + }) + }else{ + setTimeout(function () { + let selHosts =this.data.selHosts + let ID =selHosts.Id + let RoomTypeID = selHosts.RoomTypeID + let dastr =this.data.Upgradestatus + if (dastr.length>6) { + dastr='.' + }else{ + dastr=dastr+'.' + } + + QueryUpdateHostStatus({ + hotelid:ID, + roomTypeID:RoomTypeID + }).then(res => { + if (res.IsSuccess ==true) { + if (res.Response.length>0) { + if (res.Response.BaiFenBi=='100%') { + 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 + }) + }); + this.observersUpgradestatus() + + }, 1000) + + //定时询问 + + } + }, + + + 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; + }, + 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, "网络繁忙") + }); + }, + //检查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:"", + }) + }, + // 房间点击事件 + GetMAC: function (e) { + //长按事件 + 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 + }) + 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 + }) + } + }) + }).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) + } + console.log('000') + // 获取页面栈 + var pages = getCurrentPages(); + var currPage = pages[pages.length - 1]; // 当前页 + var prevPage = pages[pages.length - 2]; // 上一个页面 + prevPage.setData({ + issel: this.data.Hotelinfo.HotelId + }); + }, + +//固件升级 + ConfigurationUpgrade: async function(e){ + console.log('固件升级') + + let selHosts =this.data.selHosts + this. Carryoutupgrade(false) + }, + +//配置升级 +FirmwareUpgrade: async function (e){ + console.log('配置升级') + this.Carryoutupgrade(true) +}, +// 进行升级 +Carryoutupgrade:function (params) { + //debugger + let selHosts =this.data.selHosts + let ID =selHosts.Id + let RoomTypeID = selHosts.RoomTypeID + let roontypeList =app.globalData.roontypeList + let Gfilename ="" + let Pfilename ="" + for (let index = 0; index < roontypeList.length; index++) { + const element = roontypeList[index]; + if (RoomTypeID==element.ROOM_TYPE_OLD_ID) { + 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 + } + } +debugger + Gfilename=Gfilename.replace('.hex','.bin') + if (params) { + if (Pfilename.length>0) { + WebChatUpgrade({ + roomTypeID:RoomTypeID, + hostid_lists:'['+ID+']', + upgradefileName:Pfilename + }).then(res => { + if (res.IsSuccess ==true) { + this.setData({ + Upgradestatus:"升级就绪", + UpgradestIstrue:params + }) + 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) { + WebChatUpgrade({ + roomTypeID:RoomTypeID, + hostid_lists:'['+ID+']', + upgradefileName:Gfilename + }).then(res => { + if (res.IsSuccess ==true) { + this.setData({ + Upgradestatus:"升级就绪", + UpgradestIstrue:params + }) + 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(); + } + } + }) + }, + //读取本地历史缓存 并且 修改房间信息 + 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/Hosts/Hosts.json b/pages/Hosts/Hosts.json new file mode 100644 index 0000000..e0ee405 --- /dev/null +++ b/pages/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/Hosts/Hosts.wxml b/pages/Hosts/Hosts.wxml new file mode 100644 index 0000000..9730e77 --- /dev/null +++ b/pages/Hosts/Hosts.wxml @@ -0,0 +1,475 @@ + + + 返回 + {{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 + + + + + + 酒店:{{Hotelinfo.HotelName}} + 房间:{{message[0]}} + MAC地址:{{message[1]}} + 房间已经绑定MAC,点击继续将执行扫描绑定;点击取消,将不会执行任何操作~ + + + 升级状态:{{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/Hosts/Hosts.wxss b/pages/Hosts/Hosts.wxss new file mode 100644 index 0000000..e69de29 diff --git a/pages/Upgrade/Upgrade.js b/pages/Upgrade/Upgrade.js new file mode 100644 index 0000000..c5844ab --- /dev/null +++ b/pages/Upgrade/Upgrade.js @@ -0,0 +1,118 @@ +import { + GetRoomTypeNode +} from '../../lib/RequestingCenter.js' + +const app = getApp() + +Component({ + + /** + * 组件的属性列表 + */ + properties: { + cWidth: { // 属性名 + type: Number, + value: 100, + }, + cheight: { // 属性名 + type: Number, + value: 100, + }, + }, + + /** + * 组件的初始数据 + */ + data: { + myArray: [], + index: -1, + dat_filename:"固件文件.dat", + hex_filename:"固件文件.Hex", + devlist:[], + RoomNomber:[], + }, + + /** + * 组件的方法列表 + */ + methods: { + async bindPickerChange(e) { + console.log('picker发送选择改变,携带值为', e.detail.value); + + // 更新数据 + this.setData({ + index: e.detail.value, + }); + let strbuf= this.data. myArray[e.detail.value].split('|') + + + + try { + // 调用 GetRoomTypeNode + const res = await GetRoomTypeNode({ + hotelid: app.globalData.HotelId, + roomTypeID: strbuf[0], + }); + + // 调用全局方法 + // await app.SetroontypeListindex(res); + + // // 更新数据 + // this.setData({ + // roomtype: app.globalData.roomIDName, + // }); + + console.log(res); + } catch (err) { + console.log('GetRoomTypeNode error', err); + } + }, + }, + + + // 组件生命周期 + pageLifetimes: { + show: function() { + console.log('页面被展示') + }, + hide: function() { + console.log('页面被隐藏') + }, + resize: function(size) { + console.log('页面尺寸变化') + }, + + }, + lifetimes:{ + show: function() { + debugger + console.log('picker发送选择改变,携带值为') + }, + ready: function () { + debugger + console.log(app.globalData.roomIDName) + this.setData({ + myArray:app.globalData.roomIDName + }) + + console.log( this.data.myArray) + }, + attached: function() { + // // 在组件实例进入页面节点树时执行 + // debugger + // console.log(app.globalData.roomIDName) + // this.setData({ + // myArray:app.globalData.roomIDName + // }) + // console.log( this.data.myArray)\ + + + + }, + detached: function() { + // 在组件实例被从页面节点树移除时执行 + console.log('在组件实例被从页面节点树移除时执行') + } + }, + +}) diff --git a/pages/Upgrade/Upgrade.json b/pages/Upgrade/Upgrade.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/Upgrade/Upgrade.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/Upgrade/Upgrade.wxml b/pages/Upgrade/Upgrade.wxml new file mode 100644 index 0000000..95fb1ba --- /dev/null +++ b/pages/Upgrade/Upgrade.wxml @@ -0,0 +1,72 @@ + + + + + 房型: + + + + + {{myArray[index]}} + + + + + + + + + + + + 固件 + 配置 + + + + {{dat_filename}} + + + {{hex_filename}} + + + + + + + + + + + + + +已升级设备{{devlist.length}}: + + + + + + + + {{item.name}} + 信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%) + UUID: {{item.deviceId}} + Service数量: {{utils.len(item.advertisServiceUUIDs)}} + + + + + + + + + + + + + + + diff --git a/pages/Upgrade/Upgrade.wxss b/pages/Upgrade/Upgrade.wxss new file mode 100644 index 0000000..56779c7 --- /dev/null +++ b/pages/Upgrade/Upgrade.wxss @@ -0,0 +1,24 @@ +@import "../../colorui/main.wxss"; +@import "../../colorui/icon.wxss"; +.setborder +{ + border: 1rpx solid currentColor; +} +.newcu-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: 50rpx; + line-height: 1; + text-align: center; + text-decoration: none; + overflow: visible; + margin-left: initial; + transform: translate(0rpx, 0rpx); + margin-right: initial; +} \ No newline at end of file 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/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..920ab95 --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,99 @@ +// index.js +// 获取应用实例 +const app = getApp() +Page({ + data: { + userInfo: null, + autho: null, + selectGroupIndex: -1, + ishotel: false, + hotelIndex: -1, + issel:false + }, + ///选择酒店 + SelHotel: function (e) { + let index = e.currentTarget.dataset['index']; + this.setData({ + hotelIndex: index + }) + wx.setStorageSync(this.data.userInfo.Id + '_xiaoxi_hotelId', this.data.autho[this.data.selectGroupIndex].Hotels[this.data.hotelIndex].HotelId) + }, + //确定选择酒店 + ShowSelHotel: function (e) { + let id = e.currentTarget.dataset['id']; + if(id==-1){ + id = this.data.autho[this.data.selectGroupIndex].Hotels[this.data.hotelIndex].HotelId; + } + if(this.data.hotelIndex>=0){ + wx.navigateTo({ + url: '/pages/Hosts/Hosts?HotelId=' + id + }) + }else{ + app.toast(2,'未选择酒店') + } + }, + //选择酒店组 + bindgroup: function (e) { + let index = e.currentTarget.dataset['index'] + this.setData({ + selectGroupIndex: index, + hotelIndex: 0, + ishotel: true + }) + wx.setStorageSync(this.data.userInfo.Id + '_xiaoxi_hotelId', this.data.autho[this.data.selectGroupIndex].Hotels[this.data.hotelIndex].HotelId) + wx.setStorageSync(this.data.userInfo.Id + '_xiaoxi_selectGroupId', this.data.autho[this.data.selectGroupIndex].HotelGroupsId) + }, + //登录 + onLoad: async function (option) { + this.setData({ + userInfo: app.globalData.userinfo, + autho: app.globalData.autho + }) + if (this.data.userInfo == null) { + app.checkLoginReadyCallback = res => { + this.setData({ + userInfo: app.globalData.userinfo, + autho: app.globalData.autho + }) + this.ReaSel() + }; + } else { + this.ReaSel() + } + + }, + //读取历史选择酒店 + ReaSel: function () { + let _xiaoxi_hotelId = wx.getStorageSync(this.data.userInfo.Id + '_xiaoxi_hotelId') + let _xiaoxi_selectGroupId = wx.getStorageSync(this.data.userInfo.Id + '_xiaoxi_selectGroupId') + let _xiaoxi_selectGroupIndex = -1; + let _xiaoxi_hotelIndex = -1; + this.data.autho.forEach((element, index) => { + if (element.HotelGroupsId == _xiaoxi_selectGroupId) { + _xiaoxi_selectGroupIndex = index; + element.Hotels.forEach((elements, indexs) => { + if (elements.HotelId == _xiaoxi_hotelId) { + _xiaoxi_hotelIndex = indexs; + } + }) + } + }); + this.setData({ + selectGroupIndex: _xiaoxi_selectGroupIndex, + hotelIndex: _xiaoxi_hotelIndex + }) + //非选择 读取上次进行跳转 + if(!this.data.issel && this.data.hotelIndex>-1){ + wx.navigateTo({ + url: '/pages/Hosts/Hosts?HotelId='+this.data.autho[this.data.selectGroupIndex].Hotels[this.data.hotelIndex].HotelId + }) + } + // console.log(this.data.autho.length==1 && this.data.autho[0].Hotels.length==1 && option.issel!=0) + //非选择 如果只有一个酒店就直接进行跳转 + if(this.data.autho.length==1 && this.data.autho[0].Hotels.length==1 && !this.data.issel){ + wx.navigateTo({ + url: '/pages/Hosts/Hosts?HotelId='+this.data.autho[0].Hotels[0].HotelId + }) + } + } +}) \ No newline at end of file diff --git a/pages/index/index.json b/pages/index/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/index/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..1478556 --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,38 @@ + + 返回 + BLV + + + + + +{{autho[selectGroupIndex].Hotels[hotelIndex].Code}}:{{autho[selectGroupIndex].Hotels[hotelIndex].HotelName}} + + + + + + + + 酒店组信息 + + + + + + + +暂无相关酒店信息 + + + + + + + + {{item.HotelName}} + + + + + diff --git a/pages/index/index.wxss b/pages/index/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/pages/login/login.js b/pages/login/login.js new file mode 100644 index 0000000..03bf8e7 --- /dev/null +++ b/pages/login/login.js @@ -0,0 +1,115 @@ +// pages/login.js +// app.js +const app = getApp() +import { + settoken, + Login +} from '../../lib/RequestingCenter.js' +Page({ + /** + * 页面的初始数据 + */ + data: { + login:false, + islong:false, + Uid:null, + Pwd:null + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + getwxlogin:function(){ + app.toast(2,"暂未开放!"); + }, +//验证 +submitForm(e) { + let that = this; + let type = e.currentTarget.dataset['type'] + if(type=="1"){ + that.setData({ + islong:true + }) + } +if(this.data.Uid == null || this.data.Uid=="" || this.data.Pwd == ""|| this.data.Pwd == null){ + app.toast(2,"数据不完整") +}else { + Login({Pwd:that.data.Pwd,islong:that.data.islong,Uid:that.data.Uid}).then(res=>{ + if(res.Status==200){ + settoken(res.Data.token) + console.log("------------------------------------------") + // console.log(res) + if(that.data.islong){ + wx.setStorageSync('xiaoxi_token', res.Data.token) + } + res.Data.userinfo.HeadImg = app.globalData.ImgUrl.replace("ImgUrl",res.Data.userinfo.HeadImg) + app.globalData.userinfo = res.Data.userinfo, + // console.log(res.Data.userinfo) + app.globalData.autho = res.Data.autho + // console.log(res.Data.autho) + // console.log("------------------------------------------") + app.toast(1,"登录成功",wx.reLaunch({ + url: "/pages/index/index", + })) + }else{ + app.toast(2,res.Message||"网络繁忙") + } + },err=>{ + app.toast(2,"网络繁忙") + } + ).catch( + err => { + console.log(err) + app.toast("异常",'error') + } + ); + } +}, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + //登录 + getlogin:function(){ + this.setData({ + login:true + }) + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + }, + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + }, + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + } +}) diff --git a/pages/login/login.json b/pages/login/login.json new file mode 100644 index 0000000..0af704e --- /dev/null +++ b/pages/login/login.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/pages/login/login.wxml b/pages/login/login.wxml new file mode 100644 index 0000000..36ba6f3 --- /dev/null +++ b/pages/login/login.wxml @@ -0,0 +1,48 @@ + + BLV + + + + + + + + 账号密码登录 + + + + + + + + + 微信登录 + + + + + + + + + +
+ + 账号 + + + + 密码 + + +
+ + + + +
+
+ +
+ + \ No newline at end of file diff --git a/pages/login/login.wxss b/pages/login/login.wxss new file mode 100644 index 0000000..e69de29 diff --git a/pages/logs/logs.js b/pages/logs/logs.js new file mode 100644 index 0000000..d6d7ed3 --- /dev/null +++ b/pages/logs/logs.js @@ -0,0 +1,314 @@ +const app = getApp() +//导入日志信息请求发方法 +import { + Logsinfo +} from '../../lib/RequestingCenter.js' +var util = require('../../utils/util.js') +// pages/logs/logs.js +Page({ + /** + * 页面的初始数据 + */ + data: { + // 查询类型 + apptype:-1, + // 时间范围 4 今日 + seltime:4, + // 起始时间 + starttime:"", + // 结束时间 + endtime:"", + //正加载 + status:0, + page:1, + logsdata:[], + //总数 + sum:0, + //过滤后 + filtcount:0, + //每次加载数量 + pagelength:10, + //swview高度 + topheight: 0, + //是否下拉 + refresher:false, + // 酒店 + Hotels:[], + // 下拉框的酒店 + Hotelslist:[], + // 下拉框的索引 + index:0, + //名字搜素 + name:'' + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad:async function (options) { + //测试无需登录 + if(app.globalData.userinfo==null){ + wx.reLaunch({ + url: "../autho/index", + }) + return; + } + let that = this; + //酒店信息 + let Hotels =[]; + let Hotelslist =[] + Hotelslist.push("全部酒店"); + let autho = app.globalData.autho + autho.forEach((x)=>{ + x.Hotels.forEach(z=>{ + Hotels.push(z); + Hotelslist.push(z.HotelName); + }) + }) + that.setData({ + Hotels :Hotels, + Hotelslist:Hotelslist + }) + setTimeout(function () { + try { + // 1.使用wx.createSelectorQuery()查询到需要滚动到的元素位置 + wx.createSelectorQuery().select('#scroll').boundingClientRect(res => { + // 2.使用wx.getSysTemInfo()获取设备及页面高度windowHeight(px) + wx.getSystemInfo({ + success(ress) { + that.setData({ + topheight: ress.windowHeight - res.top + }) + } + }) + }).exec(function (params) { + console.log(params) + }) + } catch (error) { + console.log(error) + } + }, 100) + that.init(); + }, + sreach:function(params) { + this.setData({ + page:1 + }) + this.init(); + }, + /** + * 下拉选择酒店 + */ + bindPickerChange:function (e) { + this.setData({ + index: e.detail.value, + page:1 + }) + this.init(); + }, + bindTimeChange:function (e) { + if(e.target.dataset.type==1){ + this.setData({ + seltime:5, + starttime: e.detail.value, + page:1 + }) + }else{ + this.setData({ + seltime:5, + endtime: e.detail.value, + page:1 + }) + } + 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; + } + let s = this.data.page+1; + this.setData({ + status:1, + page:s + }) + this.init(); + }, + //加载数据 +init:async function () { + try { + if(this.data.page<1){ + this.setData({ + page:1 + }) + } + let that = this; + let search = {name:that.data.name,endtime:that.data.endtime,starttime:that.data.starttime,hotelsid:''}; + let index = this.data.index -1; + if(index>=0){ + search.hotelsid= that.data.Hotels[index].HotelId + } + await Logsinfo({ + page:that.data.page, + search:search, + length:that.data.pagelength, + AppType:that.data.apptype + }).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; + } + if(res.Data.filtcount<=0){ + newdata = []; + } + that.setData({ + refresher: false, + logsdata: newdata, + status: more, + filtcount:res.Data.filtcount, + sum: res.Data.sum + }) + } 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) +} +}, +selapptype:function (e) { + let sel =Number(e.target.dataset.val) ; + this.setData({ + apptype: sel, + page:1 + }) + this.init(); +}, +// 时间选择 +seltime:function (e) { + let sel =Number(e.target.dataset.val) ; + let starttime = util.formatTime(new Date()).split(' ')[0]; + let endtime = util.formatTime(new Date()).split(' ')[0]; + switch (sel) { + case 2: + let time = this.getThisWeekData(); + + starttime = time.start_day;//显示周一 + endtime = time.end_day;//显示周日 + break; + case 3: + starttime = util.getCurrentMonthFirst(new Date()) + endtime = util.getCurrentMonthLast(new Date()) + break; + case 4: + starttime = "" + endtime = "" + break; + } + this.setData({ + seltime: sel, + starttime:starttime, + endtime:endtime, + page:1 + }) + this.init(); + +}, +getThisWeekData:function () {//获得本周周一~周日的年月日 + var thisweek = {}; + var date = new Date(); + // 本周一的日期 + date.setDate(date.getDate() - date.getDay() + 1); + thisweek.start_day = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() ; + + // 本周日的日期 + date.setDate(date.getDate() + 6); + thisweek.end_day = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); + return thisweek; +}, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { +// this.init(); + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) diff --git a/pages/logs/logs.json b/pages/logs/logs.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/logs/logs.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/logs/logs.wxml b/pages/logs/logs.wxml new file mode 100644 index 0000000..d0354ac --- /dev/null +++ b/pages/logs/logs.wxml @@ -0,0 +1,79 @@ + + + + 返回 + 操作日志 + + + + + 操作日志共{{sum}}条 + 过滤后{{filtcount}}条 + + + + 酒店: + + + {{Hotelslist[index]}} + + + + + + + 全部 + RCU主机绑定信息 + 人脸机绑定信息 + + + + + 全部 + 今日 + 本周 + 本月 + 指定时间 + + + + 起始时间: + + + {{starttime==""?"请选择":starttime}} + + + 截止时间: + + + {{endtime==""?"请选择":endtime}} + + + + + 用户名: + + 搜素 + + + + + + + +{{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/pages/logs/logs.wxss b/pages/logs/logs.wxss new file mode 100644 index 0000000..92165d0 --- /dev/null +++ b/pages/logs/logs.wxss @@ -0,0 +1 @@ +/* pages/logs/logs.wxss */ \ No newline at end of file diff --git a/pages/mycenter/index.js b/pages/mycenter/index.js new file mode 100644 index 0000000..8fe66be --- /dev/null +++ b/pages/mycenter/index.js @@ -0,0 +1,81 @@ +// pages/mycenter/index.js +const app = getApp() + +Page({ + + /** + * 页面的初始数据 + */ + data: { + userInfo: null, + }, +//退出登录 +LoginOut(){ + wx.removeStorage({ + key: 'xiaoxi_token', + success (res) { + wx.reLaunch({ + url: "../login/login", + }) + } + }) +}, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + this.setData({ + userInfo: app.globalData.userinfo, + autho: app.globalData.autho + }) + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) diff --git a/pages/mycenter/index.json b/pages/mycenter/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/mycenter/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/mycenter/index.wxml b/pages/mycenter/index.wxml new file mode 100644 index 0000000..176c0c8 --- /dev/null +++ b/pages/mycenter/index.wxml @@ -0,0 +1,33 @@ + + + 个人中心 + + + + + + + +{{userInfo.Uid}} + + + +
+ + + 我的反馈 + + {{userInfo.error.length || 0}} + + + + + + 退出登录 + + +
+
+
+ + \ No newline at end of file diff --git a/pages/mycenter/index.wxss b/pages/mycenter/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/pages/test/test.js b/pages/test/test.js new file mode 100644 index 0000000..0053ad4 --- /dev/null +++ b/pages/test/test.js @@ -0,0 +1,647 @@ +const app = getApp() +//导入测试请求发方法 +import { + OpenDoorTest, + RestartTheDevice, + GeteDeviceInfomation, + DeletePeopleFromDeviceByGroup, + GetThePeopleListOfDevice, + openRommCheckin, + roomCheckOut,GetFaceSN +} from '../../lib/RequestingCenter.js' +// pages/test/test.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + imgList:[], + cout:1, + isbut:false, + isbuts:false, + count:1, + //测试信息 +sn:"", +hid:"", +HotelId:"", +HotelName:"", +Roomid:"", +openUserName:"李四", +openUserID:"123456789456123456", +openUserSex:"1", +outUserName:"", +outUserID:"", +imgurl:"", +openUserTel:"15915641569", +RoomNO:"", +faceadd:"" +}, +isCard(e) { + +if(this.data.isCardds==this.data.isCard){ + this.setData({ + isCard: e.detail.value, + isCardds:!e.detail.value + }) +}else{ + this.setData({ + isCard: e.detail.value, + isCardds:"" + }) +} + + + // this.setData({ + // isCard: e.detail.value + // }) +}, + +isCardds(e){ +if(this.data.isCardds==this.data.isCard){ + this.setData({ + isCard: !e.detail.value, + isCardds:e.detail.value + }) +}else{ + this.setData({ + isCard: "", + isCardds:e.detail.value + }) +} + +}, + + + + + +//开房测试 +OpenRoom:function(params){ + + this.setData({ + islogs: false, + openrom: !this.data.openrom + }) + //调用打开摄像头代码 + + // wx.chooseMedia({ + // count: 1, // 可以选择的图片数量 + // sizeType: ['compressed'], // 可以指定是原图还是压缩图 + // sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机 + // success: function (res) { + // // 将拍照后的照片保存在本地文件夹中 + // var tempFilePaths = res.tempFiles[0].tempFilePath + // console.log(res.tempFiles[0].tempFilePath) + // wx.uploadFile({ + // url: 'http://localhost:56306/ImgServer/Update',//开发者放服务地址 + // filePath: tempFilePaths, + // name: 'file', + // success: function (res) { + // var data = res.data; + // console.log(data); + // }, + // fail: function (res) { + // console.log(res); + // } + // }) + // } + // }) +//授权获取用户摄像头权限 + +}, +ViewImage(e) { + wx.previewImage({ + urls: this.data.imgList, + current: e.currentTarget.dataset.url + }); +}, +ChooseImage() { + console.log(111111111111) + var that =this; + wx.chooseImage({ + count: 1, //默认9 + sizeType: ['original'], //可以指定是原图还是压缩图,默认二者都有,'compressed' + sourceType: ['camera'], //从相册选择camera,album + camera: 'front', + success: (res) => { + console.log(res.tempFilePaths) + if (that.data.imgList.length != 0) { + that.setData({ + imgList: that.data.imgList.concat(res.tempFilePaths) + }) + + } else { + that.setData({ + imgList: res.tempFilePaths + }) + } + console.log(that.data.imgList) + // https://auth.blv-oa.com/Wx/Update + // http://auth.blv-oa.com/Wx/Update + wx.uploadFile({ + url: 'https://auth.blv-oa.com/Wx/Update',//开发者放服务地址 + filePath: that.data.imgList[0], + name: 'file', + success: function (res) { + var data = res.data; + console.log(res) + data=JSON.parse(data) + console.log(data.data.src) + that.setData({ + imgurl:data.data.src + }) + + }, + fail: function (res) { + console.log(res); + } + }) + }, + fail:(res)=>{ + console.log(res) + } + }); + // wx.authorize({ + // scope: 'scope.camera', + // success: function () { + // console.log("授权成功"); + + // // wx.chooseMedia({ + // // count: 1, + // // mediaType: ['image'], + // // sourceType: ['album'], + // // maxDuration: 30, + // // camera: 'front', + // // success(res) { + // // console.log(res.tempFiles) + // // // console.log(res.tempFiles[0].tempFilePath) + // // // console.log(res.tempFiles[0].size) + // // if (that.data.imgList.length != 0) { + // // that.setData({ + // // imgList: that.data.imgList.concat(res.tempFiles[0].tempFilePath) + // // }) + + // // } else { + // // that.setData({ + // // imgList: res.tempFiles[0].tempFilePath + // // }) + // // } + // // console.log(that.data.imgList) + // // // wx.uploadFile({ + // // // url: 'https://auth.blv-oa.com/Wx/Update',//开发者放服务地址 + // // // filePath: that.data.imgList[0], + // // // name: 'file', + // // // success: function (res) { + // // // var data = res.data; + // // // console.log(res) + // // // data=JSON.parse(data) + // // // console.log(data.data.src) + // // // that.setData({ + // // // imgurl:data.data.src + // // // }) + + // // // }, + // // // fail: function (res) { + // // // console.log(res); + // // // } + // // // }) + // // } + // // }) + + + + + + // }, + // fail: function (err) { + // console.log(err); + // } + // }) +}, +DelImg(e) { + wx.showModal({ + title: '', + content: '确定要删除这张照片吗?', + cancelText: '再看看', + confirmText: '再见', + success: res => { + if (res.confirm) { + this.data.imgList.splice(e.currentTarget.dataset.index, 1); + this.setData({ + imgList: this.data.imgList + }) + } + } + }) +}, + +radioChang:function(e){ + console.log("radio发生change事件,携带value值为", e.detail.value) + this.setData({ + openUserSex:e.detail.value + }) +}, + + /// + /// pms开房测试 + /// + /// + /// + /// + /// + /// + /// + /// 房间编号 + /// 开房时间 + /// 开房时间长度 + /// +//开房按钮 +Checkin:function(){ +console.log("姓名:"+this.data.openUserName+"证件类型:"+this.data.openUserID+"性别:"+this.data.openUserSex+"照片路径:"+this.data.imgurl) +var that=this; +console.log("房间id:"+that.data.Roomid+"人脸机编号:"+that.data.sn+"酒店编号:"+that.data.hid) +openRommCheckin({ + idNumber:that.data.openUserID, + name:that.data.openUserName, + sex:that.data.openUserSex, + picture:that.data.imgurl, + phone:that.data.openUserTel, + room:that.data.Roomid, + faceSN:that.data.sn, + hotelCode:that.data.hid, +}).then( + res => { + console.log(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, "网络繁忙") +}); +}, + +//解绑 +JbSn:function(params) { + var that=this; + wx.showModal({ + title: '提示', + content: '确定要解绑吗?', + success (res) { + if (res.confirm) { + + GetFaceSN({ + faceSN:that.data.sn, + roomID:that.data.RoomNO, + roomNumber:that.data.Roomid, + faceAddress:that.data.address, + HotelID:that.data.hid, + isjb:true + }).then( + res => { + if (res.Status == 200) { + switch (res.Data) { + case 0: + app.toast(1, "解绑成功~"); + + wx.navigateTo({ + url: '/pages/Hosts/Hosts?HotelId='+that.data.hid + }) + 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, "网络繁忙") + }); + } else if (res.cancel) { + console.log('用户点击取消') + } + } + }) + + + + + + + + + + + + + + + + + +// if (confirm("你确定要继续吗?")) { + +// } else { +// // 用户点击了取消 +// } + +}, + +//退房测试 +checkOut:function(params){ + var that=this; + + wx.showModal({ + title: '提示', + content: '确定退房吗?', + success (res) { + if (res.confirm) { + roomCheckOut({ + room:that.data.Roomid, + faceSN:that.data.sn, + hotelCode:that.data.hid, + }).then( + res => { + if (res.Status == 200){ + app.toast(2,"退房命令下发成功") + } + else{ + app.toast(2, "退房命令下发成功") + } + }, + err => { + app.toast(2, "退房命令下发失败") + } + ).catch(err => { + app.toast(2, "退房命令下发失败") + }); + + } else if (res.cancel) { + console.log('用户点击取消') + } + } + }) + + + + +}, + + + + + + // 帮助 + HelpClick: function (params) { + this.setData({ + islogs: false, + Help: !this.data.Help, + openrom: false + }) + }, + + //功能测试 + // featurutist:function(){ + + + // }, +//测试 +// featurutistlist:function(e){ + +// }, + + + + +//开门测试 +OpenDoor:function(){ +var that=this; +OpenDoorTest({faceSN:that.data.sn,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, "网络繁忙") +}); +}, + +//版本号码查询 +Getversionnumber:function(){ + console.log(2); + var that=this; + GeteDeviceInfomation({faceSN:that.data.sn,hotelCode:that.data.HotelId, 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, "网络繁忙") + }); +}, +//人数查询 +Getpeopleobjained:function(){ + console.log(3) + var that=this; + GetThePeopleListOfDevice({faceSN:that.data.sn,hotelCode:that.data.HotelId, 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, "网络繁忙") + }); + +}, +//删除所有人 +Deletepeople:function(){ + console.log(4) + var that=this; + wx.showModal({ + title: '提示', + content: '确定删除设备中用户组为1的所有人信息吗?', + success (res) { + if (res.confirm) { + DeletePeopleFromDeviceByGroup({faceSN:that.data.sn,hotelCode:that.data.HotelId, 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, "网络繁忙") + }); + } else if (res.cancel) { + console.log('用户点击取消') + } + } + }) +}, +//设备重新启动 +RestartDevice:function(){ + console.log(5) + var that=this; + wx.showModal({ + title: '提示', + content: '确定让设备重新启动吗?', + success (res) { + if (res.confirm) { + RestartTheDevice({faceSN:that.data.sn,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, "网络繁忙") + }); + } else if (res.cancel) { + console.log('用户点击取消') + } + } + }) +}, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + console.log(options) +var splitArray = options.Hotelinfo.split("_"); +console.log(splitArray) +var that=this; +that.setData({ +sn:splitArray[2], +HotelId:splitArray[3], +Roomid:splitArray[1], +HotelName:splitArray[0], +hid:splitArray[4], +RoomNO:options.RoomID, +faceadd:options.faceadd + +}); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) + \ No newline at end of file diff --git a/pages/test/test.json b/pages/test/test.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/test/test.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/test/test.wxml b/pages/test/test.wxml new file mode 100644 index 0000000..5be27fc --- /dev/null +++ b/pages/test/test.wxml @@ -0,0 +1,143 @@ + + 返回 + {{HotelId}}-{{HotelName}} + + + + + 编号:{{HotelId}} + 酒店:{{HotelName}} + 房间:{{Roomid}} + SN:{{sn}} + + + {{Help?'关闭':'帮助'}} + + + + + + + + + + + 开房测试 + + + + + + + + + + +
+ + 姓 名: + + + + 证件号: + + + + 电话号码: + + + + 性 别: + + 男 + 女 + + + + + 图片上传 + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + 功能测试 + + + + + + + + + + + + + + +
+ + + + + 页面说明 + + + + + 此处的说明信息只在本页面使用。其他页面不可以使用本页面说明, + + + + + + + + 功能测试区域所有按钮含义 + + + + 开门 + 点击开门按钮是下发开门命令给设备,如果成功会听见继电器闭合声音或弹框开门成功。否则弹出开门失败或没有听见继电器闭合声音。 + 版本号 + 点击版本号是下发获取设备信息命令给设备,如果成功会弹出设备的版本号。否则弹出无法获取设备的版本信息。 + + 删除 + 点击删除是下发删除所有入住人员命令给设备,如果成功弹出删除成功,否则弹出删除失败。 + 重启 + 点击删除是下发重启命令给设备,如果成功下发成功设备将重新启动,否则弹出下发失败,设备不会重新启动。 + 开房 + 开房所有信息默认值,性别默认是:女,姓名默认:李四,电话默认:15915641569,证件号码默认:123456789456123456,直接点击图片上传,上传照片后,点击开房即可发送信息给人脸机。(注意图片上传成功会显示在页面上) + 退房 + 直接点击退房,会直接下发退房命令给人脸机。 + + + + + + diff --git a/pages/test/test.wxss b/pages/test/test.wxss new file mode 100644 index 0000000..3ee2480 --- /dev/null +++ b/pages/test/test.wxss @@ -0,0 +1 @@ +/* pages/test/test.wxss */ \ No newline at end of file diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..91d0e38 --- /dev/null +++ b/project.config.json @@ -0,0 +1,70 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "setting": { + "urlCheck": false, + "es6": true, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": true, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": true, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "enableEngineNative": false, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "useStaticServer": true, + "condition": false, + "skylineRenderEnable": false, + "ignoreUploadUnusedFiles": true + }, + "compileType": "miniprogram", + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "condition": { + "search": { + "list": [] + }, + "conversation": { + "list": [] + }, + "game": { + "currentL": -1, + "list": [] + }, + "miniprogram": { + "list": [] + } + }, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "packOptions": { + "ignore": [], + "include": [] + }, + "appid": "wx2278e1d160883eb0" +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..82145c2 --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,45 @@ +{ + "setting": { + "compileHotReLoad": true, + "urlCheck": true + }, + "condition": { + "miniprogram": { + "list": [ + { + "name": "pages/index/index", + "pathName": "pages/index/index", + "query": "issel=0", + "scene": null + }, + { + "name": "pages/logs/logs", + "pathName": "pages/logs/logs", + "query": "", + "scene": null + }, + { + "name": "pages/mycenter/index", + "pathName": "pages/mycenter/index", + "query": "", + "scene": null + }, + { + "name": "pages/Hosts/Hosts", + "pathName": "pages/Hosts/Hosts", + "query": "HotelId=1", + "scene": null + }, + { + "name": "", + "pathName": "pages/logs/logs", + "query": "", + "scene": null + } + ] + } + }, + "projectname": "App", + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "libVersion": "2.29.2" +} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/utils/filters.wxs b/utils/filters.wxs new file mode 100644 index 0000000..c1b226f --- /dev/null +++ b/utils/filters.wxs @@ -0,0 +1,30 @@ + function formatTime(date) { + var year = date.getFullYear() + var month = date.getMonth() + 1 + var day = date.getDate() + var hour = date.getHours() + var minute = date.getMinutes() + var second = date.getSeconds() + return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') +} + +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} + +module.exports = { + /** + * 日期格式化 + * @param formatTime + * @returns {string} + */ + TimeFormat: function(formatTimestr) { + var str = parseFloat(formatTimestr.replace("/Date(", "").replace(")/", "")); + //转化为时间类型 + var obj = (getDate(str)); + console.log(obj) + // return obj; + return formatTime(obj); + } +} \ No newline at end of file diff --git a/utils/md5.min.js b/utils/md5.min.js new file mode 100644 index 0000000..7d8a3f5 --- /dev/null +++ b/utils/md5.min.js @@ -0,0 +1,2 @@ +!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t>5]|=(255&n.charCodeAt(t/8))<16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this); +//# sourceMappingURL=md5.min.js.map \ No newline at end of file diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..73e57cb --- /dev/null +++ b/utils/util.js @@ -0,0 +1,59 @@ +const formatTime = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : '0' + n +} + + + + +const getCurrentMonthFirst = date =>{ + date.setDate(1); + let month = parseInt(date.getMonth()+1); + let day = date.getDate(); + if (month < 10) { + month = '0' + month + } + if (day < 10) { + day = '0' + day + } + return date.getFullYear() + '-' + month + '-' + day; +} + + +const getCurrentMonthLast = function (date = null){ +if(date==null) { + date = new Date(); +} +let currentMonth=date.getMonth(); +let nextMonth=++currentMonth; +let nextMonthFirstDay=new Date(date.getFullYear(),nextMonth,1); +let oneDay=1000*60*60*24; +let lastTime = new Date(nextMonthFirstDay-oneDay); +let month = parseInt(lastTime.getMonth()+1); +let day = lastTime.getDate(); + if (month < 10) { + month = '0' + month + } + if (day < 10) { + day = '0' + day + } + console.log(date.getFullYear() + '-' + month + '-' + day) + return date.getFullYear() + '-' + month + '-' + day; +} + +module.exports = { + formatTime: formatTime, + getCurrentMonthFirst:getCurrentMonthFirst, + getCurrentMonthLast:getCurrentMonthLast +} \ No newline at end of file diff --git a/utils/watch.js b/utils/watch.js new file mode 100644 index 0000000..06e9c03 --- /dev/null +++ b/utils/watch.js @@ -0,0 +1,41 @@ +// watch.js + +const observe = (obj, key, watchFun, deep, page) => { + let oldVal = obj[key] + // 如果监听对象是object类型并且指定deep(深度监听) + if (oldVal !== null && typeof oldVal === 'object' && deep) { + // 递归子集,依次执行observe() + Object.keys(oldVal).forEach(item => { + observe(oldVal, item, watchFun, deep, page) + }) + } + // 使用Object.defineProperty()劫持数据的写操作,在监听对象改变后执行传入的watchFun + Object.defineProperty(obj, key, { + configurable: true, + enumerable: true, + set(value) { + if (value === oldVal) return + watchFun.call(page, value, oldVal) + oldVal = value + }, + get() { + return oldVal + } + }) +} + +export const setWatcher = (page) => { + // 页面里的data字段 + const data = page.data + // 页面里的watch字段 + const watch = page.watch + // 对watch里列举的每一个字段(需要监听的字段)执行observe() + Object.keys(watch).forEach(key => { + let targetData = data + const targetKey = key + // 支持deep深度监听,使用deep时需要配合handler使用,否则直接编写函数 + const watchFun = watch[key].handler || watch[key] + const deep = watch[key].deep + observe(targetData, targetKey, watchFun, deep, page) + }) +} \ No newline at end of file