miue-ui
Version:
ali miniProgram UI components for vehicle.
484 lines (453 loc) • 14.3 kB
JavaScript
if(my.MIUE_SERVER){
var _SERVER=my.MIUE_SERVER;
_SERVER.USER=_SERVER.USER || {};
}
import INFO from '../../modules/systeminfo';
import MIUE_UI from '../../modules/version';
var LOGIN_INTERVAL=null;
var THAT=null;
var LOGIN_KEY='LOGIN';
var LOGIN_TIME=120,LOGIN_STEP=5;
var DEVICE_ID='';
var SYSTEM_FONTSIZE=0;
INFO.getDeviceId().then((res)=>{
if(res!=null){
DEVICE_ID=res.data;
_SERVER.USER.DEVICE_ID=DEVICE_ID;
}
});
Component({
mixins: [],
data: {
type:'all',
fontsize:4, // 22px=1 ,25=2,28=3,31=4,
fontsizes:[18,20,24,28,32,36,40,44],
fontsizesLabel:['0','1','2','3','4','5','6','7'],
systemfontsize:null,
colorhue:0,
isshow:false,
hue:0,
theme:'dark',
localStorageKey:'panelSet',
localStorage:{},
handle:'left',
ishandle:false,
fontsizeMin:1,
fontsizeMax:7,
ismember:false,
showqrcode:false,
nocanvas:false,
countdown:'',
islogin:false,
user:null,
MIUE_INFO:`-C${MIUE_UI.VERSION}-D${MIUE_UI.UPDATETIME}`,
},
props: {},
didMount() {
// 初始化组件;向页面注册自己
THAT=this;
let props=this.props;
let _id=props.id?props.id:'panel_'+this.$id;
if(this.$page.MIUE==undefined){
this.$page.MIUE=new Map();
}
this.$page.MIUE.set(_id,this);
this.setData({id:_id});
// 设置字号和色相
let {hue=0,fontsize=32,ishandle=false,version='',ismember=false,beian=''}=getApp().config || my.MIUE_CONFIG || {};
this.setData({ismember:ismember});
this.setData({colorhue:hue});
this.setData({version:version});
this.setData({ishandle:ishandle});
this.setData({beian:beian});
this._setFontSize(fontsize);
// 读取本地存储的数据
let _key=this.data.localStorageKey;
this._read(_key).then((res)=>{
//resolve(res); // 返回本地存储数据
this.data.localStorage=res.data;
})
.catch((error)=>{ // 本地存诸读取失败的情况
//console.log(error);
}) // 正常返回本地存储数据
// 设置动画
this.animation = my.createAnimation({
transformOrigin: "70% 30% 0",
duration: 300,
timeFunction: "ease-in",
delay: 0,
});
// 初始化登录状态;
this.initLogin();
// 如果高度少于600,则关闭 7 字号 设定,小于480侧最大字号为 5;
INFO.read().then((res)=>{
console.warn(res);
let {windowHeight,theme='dark',fontSizeSetting}=res;
this.setData({theme:theme});
if(windowHeight<601){
this.setData({fontsizeMax:6})
}
if(windowHeight<481){
this.setData({fontsizeMax:5})
}
// 对于超过 12 设定的字号生效;
if(fontSizeSetting>18){
SYSTEM_FONTSIZE=fontSizeSetting;
let fontsizes=THAT.data.fontsizes;
let fontsizesLabel=THAT.data.fontsizesLabel;
//let systemfontsize=THAT.data.systemfontsize;
//let newfontsizes=[];
let _sysdef;
fontsizes.forEach((ele,idx) => {
if(fontSizeSetting==ele){
//newfontsizes.push(ele)
fontSizeSetting=0;
//systemfontsize=idx-1;
fontsizesLabel[idx]=`系统默认 [ ${ele} ]`;
}else if(fontSizeSetting<ele && fontSizeSetting>1){
//newfontsizes.push(fontSizeSetting);
fontsizes.splice(idx,0,fontSizeSetting);
fontsizesLabel.splice(idx,0,`系统默认 [ ${fontSizeSetting} ]`);
fontSizeSetting=0;
//systemfontsize=idx;
}
});
console.warn(fontsizes);
console.warn(fontsizesLabel);
//console.warn(_sysdef);
}
});
},
didUpdate() {},
didUnmount() {},
methods: {
_setFontSize(n){
// console.warn(n);
this.setData({fontsize:n});
let _value=this.data.fontsizes.indexOf(parseInt(n));
let _label= this.data.fontsizesLabel[_value];
this.setData({fontsize_label_txt:_label});
this.setData({fontsize_label:_value});
//this._save(this.data.localStorageKey,this.data.localStorage);
},
_setColorHue(n){
this.setData({colorhue:n%360});
},
_setHandle(s){
this.setData({handle:s});
},
onSliderChange(e){
//console.log(e.detail.value);
//console.log(e.target.dataset.type);
let _type=e.target.dataset.type;
let _value=e.detail.value;
if(_type=='fontSize'){
// {target:this,type:,value:}
//let console.warn(this.data.fontsizesLabel[_value]);
// 看当前字号是否是系统默认设置;
let isSysfontsize=this.data.fontsizesLabel[_value].indexOf('系统') > -1;
//console.warn(isSysfontsize);
_value=this.data.fontsizes[_value];
// console.warn(this.data.fontsizes.indexOf(parseInt(_value)));
this._setFontSize(_value);
if(isSysfontsize){
this.data.localStorage.fontsize=0; // 本地存储字号失效;
}else{
this.data.localStorage.fontsize=_value;
}
this._onChange({target:this,type:_type,value:_value})
}
if(_type=='colorHue'){
this._setColorHue(_value);
this.data.localStorage.colorhue=_value;
if(_value==0){_value=360};// 兼容置为0时,setData不生效的问题;
this._onChange({target:this,type:_type,value:_value})
}
// 存入本地
this._save(this.data.localStorageKey,this.data.localStorage);
},
// 发出值的变化的事件
_onChange(_event){
if(this.props.onChange){ this.props.onChange(_event);}
},
switchChange(e){
//console.log(e.detail.value);
let _value=e.detail.value;
let _handle='left';
if(_value){
_handle='right';
}
this.data.localStorage.handle=_handle;
this._save(this.data.localStorageKey,this.data.localStorage);
this._onChange({target:this,type:'handle',value:_handle})
},
_save(key,data){
my.setStorage(
{
key:key,
data:{data:data},
success:()=>{ /** 写入成功 */},
fail:()=>{/** 写入失败 */},
}
)
},
_read(key){
return new Promise((resolve, reject) => {
my.getStorage({
key: key,
success: (res)=> { //获取成功
//console.log(res);
let _data=res.data;
if(_data==null){
reject({code:11,msg:'暂无本地设置数据或数据失效'});
}
resolve(_data);
},
fail: (res)=>{//读取失败
reject({code:11,msg:'获取当前数据失败'});
}
});
})
},
onClose(e){
//this.setData({type:'mini'});
//this.animation.opacity(0.1).step();
//this.setData({ animation: this.animation.export()})
this.show(false);
},
onOpen(e){
//this.setData({type:'all'});
//this.animation.opacity(1).step();
//this.setData({ animation: this.animation.export()})
},
onLogin(e){
//console.log(`login:${e}`);
// const wxRSA = require('wx-rsa');
try{
let foreground_color='#ffffffff';
if(this.data.theme=='light'){
foreground_color='#000000ff'
}
var _cavvas_obj={
'id':'canvas',
'level': 'L',
'size': 300,
'padding':25,
'foreground':foreground_color,
'foregroundAlpha':'0.8',
};
const Qrcode=require('miue-qrcode');
let qrcode = new Qrcode(_cavvas_obj);
// 无效的登录地址的情况;
if(_SERVER.LOGIN_URL!=undefined && DEVICE_ID!=''){
let url=`${_SERVER.LOGIN_URL}${DEVICE_ID}`;
qrcode.judgeBlockDraw(url);
this._showCavnas('swap',true);
}else{
qrcode.drawText('登录二维码无法展示\n末配置有效登录地址\n或设备标识获取失败');
console.warn('末能展示二码难,没有配置 server.api.js 中末配置有效的登录的LOGIN_URL');
this._showCavnas('swap');
}
}catch(err){
//qrcode.drawText('登录二维码无法展示\nmiue-qrcode模块错误');
console.warn('缺少miue-qrcode模块,或配置错误!需在根目录 / min.project.json 文件配置 node_modules_es6_whitelist 模块 "miue-qrcode"');
//this._showCavnas('swap');
this._showCavansError();
//console.warn(err);
}
},
onLogout(e){
//console.log(`logout:${e}`);
this.setData({islogin:false});
my.removeStorage({key:LOGIN_KEY}); //
//
if(this.props.onLogout){
this.props.onLogout({
type:'logout',
target:this
});
}
// 登出
_SERVER.logout(DEVICE_ID).then((res)=>{
console.log(res.data.msg);
},
(error)=>{})
},
_showCavansError(){
this.setData({nocanvas:true});
},
_showCavnas(isShow,load=false){
let showqrcode=this.data.showqrcode;
//console.log(isShow);
let isShowCanvas=(isShow=='swap')?!showqrcode:isShow; // 入参为空的话,直接变换
this.setData({showqrcode:isShowCanvas});
if(isShowCanvas && load){
this.setData({countdown:LOGIN_TIME});
LOGIN_INTERVAL= setInterval(THAT.loading,1000);
}else{
this.setData({countdown:''});
clearInterval(LOGIN_INTERVAL);
}
},
loading(){
// 开始倒计时
let countdown=THAT.data.countdown;
// 当倒计结整时,不显示二维码登录状态;
if(countdown==0){
THAT._showCavnas(false,false);
}
// 按一定频率加载读取数据;
if( countdown % LOGIN_STEP == 0 ){
// 先读取本地缓存数据
THAT._read(LOGIN_KEY).then((res)=>{
//console.log(`read:then-1:then:`);
let {data}=res;
// console.log(data);
if(data.uid){ // 当本地存在已经登录的数据时
THAT.islogined(data);
}else{
THAT._requestLoginStatus();
}
}).catch((err)=>{
// 本调读取失败之后;
console.log(`_read:then-1:error:${err}`)
//return my.MIUE_SERVER.getloginStatus('ALIAUTOBANMA20230720');
THAT._requestLoginStatus();
});
}
//countdown--;
countdown=countdown-1;
THAT.setData({countdown:countdown});
//console.log(`loading~~:${countdown}`);
},
_requestLoginStatus(){
try{
_SERVER.getloginStatus(DEVICE_ID).then((res)=>{
this._save(LOGIN_KEY,res);
},
(error)=>{}
);
}catch(err){
console.warn('SERVER.getloginStatus 末定义~,移除状态轮询');
clearInterval(LOGIN_INTERVAL);
}
},
islogined(data){
//console.warn('islogined ::')
//console.log(data);
let {vipExpire}=data;
//let [_vipexpire=false]=vipEndDate.match(/^\d{4}-\d{1,2}-\d{1,2}/) || [];
if(vipExpire){
data.expiceInfo='会员有效期至:'+vipExpire;
}else{
data.expiceInfo='非会员或会员已过期';
}
THAT._showCavnas(false);
this.setData({islogin:true});
this.setData({user:data});
_SERVER.USER=data;
//输出登录成功的事件
let eventData=data;
eventData.DEVICE_ID=DEVICE_ID
if(this.props.onLogin){
this.props.onLogin({
type:'login',
target:this,
data:eventData
});
}
//console.log(my.MIUE_SERVER.USER);
},
getIsLogin(){
return this.data.islogin;
},
show(s){
/*
THAT._read(LOGIN_KEY).then((res)=>{
let {data}=res.data;
if(data.uid){ // 当本地存在已经登录的数据时
THAT.islogined(data);
}
});
*/
this.setData({isshow:s});
if(!s){
this._showCavnas(s);
}
//console.log(_SERVER.USER.uid);
if(s && this.data.islogin){
//console.log("get user info:");
_SERVER.getUserInfo({deviceId:DEVICE_ID,userId:_SERVER.USER.uid}).then((res)=>{
//console.log(res);
this.islogined(res);
},
(error)=>{})
}
},
initLogin(){
THAT._read(LOGIN_KEY).then((res)=>{
// console.log(res);
let {data}=res;
// console.log(data);
if(data.uid){ // 当本地存在已经登录的数据时
THAT.islogined(data);
}
}).catch((err)=>{
console.log('读本本地已登录信息:'+err.msg);
});
},
getLocalData(){
return new Promise((resolve, reject) => {
this._read(this.data.localStorageKey).then((res)=>{
//console.warn(res.data);
// 对本地存储的字号进行读取;
let {fontsize=0,colorhue=null,handle=null}=res.data;
let data={}
if(fontsize>0){
data.fontsize=fontsize;
data.fontsizeSource='USER';
data.msg='自定义设置的字号';
}else if(fontsize==0 && SYSTEM_FONTSIZE>0){
data.fontsize=SYSTEM_FONTSIZE;
data.fontsizeSource='SYSTEM';
data.msg='系统默认的字号';
}else{
data.fontsizeSource='MINI';
data.msg='默认的字号';
}
if(colorhue){
data.colorhue=colorhue;
}
if(handle){
data.handle=handle;
}
//console.warn(data);
resolve(data);
//this.data.localStorage=res.data;
})
.catch((error)=>{ // 本地存诸读取失败的情况
if(SYSTEM_FONTSIZE>0){
resolve({fontsize:SYSTEM_FONTSIZE,msg:'系统设置的默认字号',fontsizeSource:'SYSTEM'});
}else{
reject(error);
}
}) // 正常返回本地存储数据
})
},
onBeian(s){
let txt='工信部备案系统网址:https://beian.miit.gov.cn/';
my.alert({ content: txt });
//my.showToast({content:txt});
},
setHue(s){
this._setColorHue(s);
//this.setData({colorhue:s});
},
setFontSize(s){
this._setFontSize(s);
},
setHandle(s){
this._setHandle(s);
}
},
});