提交 cae0e903 编写于 作者: DCloud_JSON's avatar DCloud_JSON

删除中可选链操作符,解决vue3版本在hbuilderX内置浏览器不兼容的问题

上级 394628f2
<script> <script>
import initApp from '@/common/appInit.js'; import initApp from '@/common/appInit.js';
import openApp from '@/common/openApp.js'; import openApp from '@/common/openApp.js';
import checkIsAgree from '@/pages/uni-agree/utils/uni-agree.js'; import checkIsAgree from '@/pages/uni-agree/utils/uni-agree.js';
export default { export default {
globalData: { globalData: {
searchText: '', searchText: '',
appVersion: {}, appVersion: {},
config: {}, config: {},
$i18n: {}, $i18n: {},
$t: {} $t: {}
}, },
onLaunch: function() { onLaunch: function() {
console.log('App Launch') console.log('App Launch')
this.globalData.$i18n = this.$i18n this.globalData.$i18n = this.$i18n
this.globalData.$t = str => this.$t(str) this.globalData.$t = str => this.$t(str)
initApp(); initApp();
// #ifdef H5 // #ifdef H5
openApp() //创建在h5端全局悬浮引导用户下载app的功能 openApp() //创建在h5端全局悬浮引导用户下载app的功能
// #endif // #endif
// #ifdef APP-PLUS // #ifdef APP-PLUS
//checkIsAgree(); APP端暂时先用原生默认生成的。目前,自定义方式启动vue界面时,原生层已经请求了部分权限这并不符合国家的法规 //checkIsAgree(); APP端暂时先用原生默认生成的。目前,自定义方式启动vue界面时,原生层已经请求了部分权限这并不符合国家的法规
// #endif // #endif
// #ifdef H5 // #ifdef H5
// checkIsAgree(); // 默认不开启。目前全球,仅欧盟国家有网页端同意隐私权限的需要。如果需要可以自己去掉注视后生效 // checkIsAgree(); // 默认不开启。目前全球,仅欧盟国家有网页端同意隐私权限的需要。如果需要可以自己去掉注视后生效
// #endif // #endif
// #ifdef APP-PLUS // #ifdef APP-PLUS
//idfa有需要的用户在应用首次启动时自己获取存储到storage中 //idfa有需要的用户在应用首次启动时自己获取存储到storage中
//https://ask.dcloud.net.cn/article/36107 //https://ask.dcloud.net.cn/article/36107
/*if(~plus.storage.getItem('idfa')){ /*if(~plus.storage.getItem('idfa')){
plus.device.getInfo({//需要勾选IDFA plus.device.getInfo({//需要勾选IDFA
success:function(e){ success:function(e){
console.log('idfa = '+JSON.stringify(e.idfa)); console.log('idfa = '+JSON.stringify(e.idfa));
}, },
fail:function(e){ fail:function(e){
console.log('getDeviceInfo failed: '+JSON.stringify(e)); console.log('getDeviceInfo failed: '+JSON.stringify(e));
} }
}); });
}*/ }*/
// #endif // #endif
}, },
onShow: function() { onShow: function() {
console.log('App Show') console.log('App Show')
}, },
onHide: function() { onHide: function() {
console.log('App Hide') console.log('App Hide')
} }
} }
</script> </script>
<style> <style>
/*每个页面公共css */ /*每个页面公共css */
</style> </style>
此差异已折叠。
<template> <template>
<view> <view>
<canvas :id="cid" :canvas-id="cid" :style="{width: `${size}px`, height: `${size}px`}" /> <canvas :id="cid" :canvas-id="cid" :style="{width: `${size}px`, height: `${size}px`}" />
</view> </view>
</template> </template>
<script> <script>
import uQRCode from './uqrcode.js' import uQRCode from './uqrcode.js'
export default { export default {
props: { props: {
cid: { cid: {
type: String, type: String,
default(){ default(){
return Date.now()+Math.random()+''; return Date.now()+Math.random()+'';
} }
}, },
text: { text: {
type: String, type: String,
required: true required: true
}, },
size: { size: {
type: Number, type: Number,
default: uni.upx2px(200) default: uni.upx2px(200)
}, },
margin: { margin: {
type: Number, type: Number,
default: 0 default: 0
}, },
backgroundColor: { backgroundColor: {
type: String, type: String,
default: '#ffffff' default: '#ffffff'
}, },
foregroundColor: { foregroundColor: {
type: String, type: String,
default: '#000000' default: '#000000'
}, },
backgroundImage: { backgroundImage: {
type: String type: String
}, },
logo: { logo: {
type: String type: String
}, },
makeOnLoad: { makeOnLoad: {
type: Boolean, type: Boolean,
default: false default: false
} }
}, },
data() { data() {
return { return {
} }
}, },
mounted() { mounted() {
if (this.makeOnLoad) { if (this.makeOnLoad) {
this.make() this.make()
} }
}, },
methods: { methods: {
async make() { async make() {
var options = { var options = {
canvasId: this.cid, canvasId: this.cid,
componentInstance: this, componentInstance: this,
text: this.text, text: this.text,
size: this.size, size: this.size,
margin: this.margin, margin: this.margin,
backgroundColor: this.backgroundImage ? 'rgba(255,255,255,0)' : this.backgroundColor, backgroundColor: this.backgroundImage ? 'rgba(255,255,255,0)' : this.backgroundColor,
foregroundColor: this.foregroundColor foregroundColor: this.foregroundColor
} }
var filePath = await this.makeSync(options) var filePath = await this.makeSync(options)
if (this.backgroundImage) { if (this.backgroundImage) {
filePath = await this.drawBackgroundImageSync(filePath) filePath = await this.drawBackgroundImageSync(filePath)
} }
if (this.logo) { if (this.logo) {
filePath = await this.drawLogoSync(filePath) filePath = await this.drawLogoSync(filePath)
} }
this.makeComplete(filePath) this.makeComplete(filePath)
}, },
makeComplete(filePath) { makeComplete(filePath) {
this.$emit('makeComplete', filePath) this.$emit('makeComplete', filePath)
}, },
drawBackgroundImage(options) { drawBackgroundImage(options) {
var ctx = uni.createCanvasContext(this.cid, this) var ctx = uni.createCanvasContext(this.cid, this)
ctx.drawImage(this.backgroundImage, 0, 0, this.size, this.size) ctx.drawImage(this.backgroundImage, 0, 0, this.size, this.size)
ctx.drawImage(options.filePath, 0, 0, this.size, this.size) ctx.drawImage(options.filePath, 0, 0, this.size, this.size)
ctx.draw(false, () => { ctx.draw(false, () => {
uni.canvasToTempFilePath({ uni.canvasToTempFilePath({
canvasId: this.cid, canvasId: this.cid,
success: res => { success: res => {
options.success && options.success(res.tempFilePath) options.success && options.success(res.tempFilePath)
}, },
fail: error => { fail: error => {
options.fail && options.fail(error) options.fail && options.fail(error)
} }
}, this) }, this)
}) })
}, },
async drawBackgroundImageSync(filePath) { async drawBackgroundImageSync(filePath) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.drawBackgroundImage({ this.drawBackgroundImage({
filePath: filePath, filePath: filePath,
success: res => { success: res => {
resolve(res) resolve(res)
}, },
fail: error => { fail: error => {
reject(error) reject(error)
} }
}) })
}) })
}, },
fillRoundRect(ctx, r, x, y, w, h) { fillRoundRect(ctx, r, x, y, w, h) {
ctx.save() ctx.save()
ctx.translate(x, y) ctx.translate(x, y)
ctx.beginPath() ctx.beginPath()
ctx.arc(w - r, h - r, r, 0, Math.PI / 2) ctx.arc(w - r, h - r, r, 0, Math.PI / 2)
ctx.lineTo(r, h) ctx.lineTo(r, h)
ctx.arc(r, h - r, r, Math.PI / 2, Math.PI) ctx.arc(r, h - r, r, Math.PI / 2, Math.PI)
ctx.lineTo(0, r) ctx.lineTo(0, r)
ctx.arc(r, r, r, Math.PI, Math.PI * 3 / 2) ctx.arc(r, r, r, Math.PI, Math.PI * 3 / 2)
ctx.lineTo(w - r, 0) ctx.lineTo(w - r, 0)
ctx.arc(w - r, r, r, Math.PI * 3 / 2, Math.PI * 2) ctx.arc(w - r, r, r, Math.PI * 3 / 2, Math.PI * 2)
ctx.lineTo(w, h - r) ctx.lineTo(w, h - r)
ctx.closePath() ctx.closePath()
ctx.setFillStyle('#ffffff') ctx.setFillStyle('#ffffff')
ctx.fill() ctx.fill()
ctx.restore() ctx.restore()
}, },
drawLogo(options) { drawLogo(options) {
var ctx = uni.createCanvasContext(this.cid, this) var ctx = uni.createCanvasContext(this.cid, this)
ctx.drawImage(options.filePath, 0, 0, this.size, this.size) ctx.drawImage(options.filePath, 0, 0, this.size, this.size)
var logoSize = this.size / 4 var logoSize = this.size / 4
var logoX = this.size / 2 - logoSize / 2 var logoX = this.size / 2 - logoSize / 2
var logoY = logoX var logoY = logoX
var borderSize = logoSize + 10 var borderSize = logoSize + 10
var borderX = this.size / 2 - borderSize / 2 var borderX = this.size / 2 - borderSize / 2
var borderY = borderX var borderY = borderX
var borderRadius = 5 var borderRadius = 5
this.fillRoundRect(ctx, borderRadius, borderX, borderY, borderSize, borderSize) this.fillRoundRect(ctx, borderRadius, borderX, borderY, borderSize, borderSize)
ctx.drawImage(this.logo, logoX, logoY, logoSize, logoSize) ctx.drawImage(this.logo, logoX, logoY, logoSize, logoSize)
ctx.draw(false, () => { ctx.draw(false, () => {
uni.canvasToTempFilePath({ uni.canvasToTempFilePath({
canvasId: this.cid, canvasId: this.cid,
success: res => { success: res => {
options.success && options.success(res.tempFilePath) options.success && options.success(res.tempFilePath)
}, },
fail: error => { fail: error => {
options.fail && options.fail(error) options.fail && options.fail(error)
} }
}, this) }, this)
}) })
}, },
async drawLogoSync(filePath) { async drawLogoSync(filePath) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.drawLogo({ this.drawLogo({
filePath: filePath, filePath: filePath,
success: res => { success: res => {
resolve(res) resolve(res)
}, },
fail: error => { fail: error => {
reject(error) reject(error)
} }
}) })
}) })
}, },
async makeSync(options) { async makeSync(options) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uQRCode.make({ uQRCode.make({
canvasId: options.canvasId, canvasId: options.canvasId,
componentInstance: options.componentInstance, componentInstance: options.componentInstance,
text: options.text, text: options.text,
size: options.size, size: options.size,
margin: options.margin, margin: options.margin,
backgroundColor: options.backgroundColor, backgroundColor: options.backgroundColor,
foregroundColor: options.foregroundColor, foregroundColor: options.foregroundColor,
success: res => { success: res => {
resolve(res) resolve(res)
}, },
fail: error => { fail: error => {
reject(error) reject(error)
} }
}) })
}) })
} }
} }
} }
</script> </script>
<template> <template>
<view @click="onClick" :style="{width,height}"> <view @click="onClick" :style="{width,height}">
<image v-if="cSrc" :style="{width,height}" :src="cSrc" :mode="mode"></image> <image v-if="cSrc" :style="{width,height}" :src="cSrc" :mode="mode"></image>
</view> </view>
</template> </template>
<script> <script>
export default { export default {
name: "cloud-image", name: "cloud-image",
emits:['click','switchChange'], emits:['click','switchChange'],
props: { props: {
mode: { mode: {
type:String, type:String,
default () { default () {
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
} }
}, },
src: { src: {
// type:String, // type:String,
default () { default () {
return "" return ""
} }
}, },
width: { width: {
type:String, type:String,
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
default () { default () {
return '100rpx' return '100rpx'
} }
} }
}, },
watch: { watch: {
src:{ src:{
...@@ -61,10 +61,10 @@ ...@@ -61,10 +61,10 @@
this.$emit('click') this.$emit('click')
} }
}, },
data() { data() {
return { return {
cSrc:false cSrc:false
}; };
} }
} }
</script> </script>
\ No newline at end of file
<template> <template>
<uni-popup ref="popup" type="bottom"> <uni-popup ref="popup" type="bottom">
<view class="box"> <view class="box">
<text class="headBox">绑定资料</text> <text class="headBox">绑定资料</text>
<text class="tip">将一键获取你的手机号码绑定你的个人资料</text> <text class="tip">将一键获取你的手机号码绑定你的个人资料</text>
<view class="btnBox"> <view class="btnBox">
<text @click="closeMe" class="close">关闭</text> <text @click="closeMe" class="close">关闭</text>
<button class="agree" type="warn" @click="beforeGetphonenumber" open-type="getPhoneNumber" <button class="agree" type="warn" @click="beforeGetphonenumber" open-type="getPhoneNumber"
@getphonenumber="bindMobileByMpWeixin">获取</button> @getphonenumber="bindMobileByMpWeixin">获取</button>
</view> </view>
</view> </view>
</uni-popup> </uni-popup>
</template> </template>
<script> <script>
import { import {
mapMutations, mapMutations,
mapGetters mapGetters
} from 'vuex'; } from 'vuex';
const db = uniCloud.database(); const db = uniCloud.database();
const usersTable = db.collection('uni-id-users') const usersTable = db.collection('uni-id-users')
let userId = '' let userId = ''
export default { export default {
emits: ['next'], emits: ['next'],
computed: { computed: {
...mapGetters({ ...mapGetters({
userInfo: 'user/info', userInfo: 'user/info',
login: 'user/hasLogin' login: 'user/hasLogin'
}) })
}, },
data() { data() {
return {} return {}
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
setUserInfo: 'user/login' setUserInfo: 'user/login'
}), }),
beforeGetphonenumber() { beforeGetphonenumber() {
uni.showLoading({ uni.showLoading({
mask:true mask:true
}) })
wx.checkSession({ wx.checkSession({
success() { success() {
console.log('session_key 未过期'); console.log('session_key 未过期');
uni.hideLoading() uni.hideLoading()
}, },
fail() { fail() {
console.log('session_key 已经失效,正在执行更新'); console.log('session_key 已经失效,正在执行更新');
wx.login({ wx.login({
success({code}) { success({code}) {
...@@ -65,20 +65,20 @@ ...@@ -65,20 +65,20 @@
fail: (err) => { fail: (err) => {
console.error(err); console.error(err);
} }
}) })
} }
}) })
}, },
bindMobileByMpWeixin(e) { bindMobileByMpWeixin(e) {
console.log(e.detail); console.log(e.detail);
uniCloud.callFunction({ uniCloud.callFunction({
name: "uni-id-cf", name: "uni-id-cf",
data: { data: {
"action": "bindMobileByMpWeixin", "action": "bindMobileByMpWeixin",
"params": e.detail "params": e.detail
}, },
complete: (e) => { complete: (e) => {
console.log(e); console.log(e);
}, },
success: (e) => { success: (e) => {
uni.showToast({ uni.showToast({
...@@ -91,99 +91,99 @@ ...@@ -91,99 +91,99 @@
}) })
} }
this.closeMe() this.closeMe()
} }
}) })
}, },
async open(uid) { async open(uid) {
userId = uid userId = uid
this.$refs.popup.open() this.$refs.popup.open()
this.beforeGetphonenumber() this.beforeGetphonenumber()
}, },
closeMe(e) { closeMe(e) {
this.$refs.popup.close() this.$refs.popup.close()
}, },
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
view { view {
display: flex; display: flex;
} }
.box { .box {
background-color: #FFFFFF; background-color: #FFFFFF;
height: 200px; height: 200px;
width: 750rpx; width: 750rpx;
flex-direction: column; flex-direction: column;
border-top-left-radius: 15px; border-top-left-radius: 15px;
border-top-right-radius: 15px; border-top-right-radius: 15px;
} }
.headBox { .headBox {
padding: 20rpx; padding: 20rpx;
height: 80rpx; height: 80rpx;
line-height: 80rpx; line-height: 80rpx;
text-align: left; text-align: left;
font-size: 32upx; font-size: 32upx;
color: #333333; color: #333333;
margin-left: 15rpx; margin-left: 15rpx;
} }
.tip { .tip {
color: #666666; color: #666666;
text-align: left; text-align: left;
justify-content: center; justify-content: center;
margin: 10rpx 30rpx; margin: 10rpx 30rpx;
font-size: 36rpx; font-size: 36rpx;
} }
.btnBox { .btnBox {
margin-top: 45rpx; margin-top: 45rpx;
justify-content: center; justify-content: center;
flex-direction: row; flex-direction: row;
} }
.close, .close,
.agree { .agree {
text-align: center; text-align: center;
width: 200rpx; width: 200rpx;
height: 80upx; height: 80upx;
line-height: 80upx; line-height: 80upx;
border-radius: 50px; border-radius: 50px;
margin: 0 20rpx; margin: 0 20rpx;
font-size: 36rpx; font-size: 36rpx;
} }
.close { .close {
color: #999999; color: #999999;
border-color: #EEEEEE; border-color: #EEEEEE;
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
background-color: #FFFFFF; background-color: #FFFFFF;
} }
.close:active { .close:active {
color: #989898; color: #989898;
background-color: #E2E2E2; background-color: #E2E2E2;
} }
.agree { .agree {
background-color: #DD524D; background-color: #DD524D;
color: #FFFFFF; color: #FFFFFF;
} }
/* #ifdef MP */ /* #ifdef MP */
.agree::after { .agree::after {
border: none; border: none;
} }
.agree { .agree {
background-color: #DD524D; background-color: #DD524D;
} }
/* #endif */ /* #endif */
.agree:active { .agree:active {
background-color: #F5F5F6; background-color: #F5F5F6;
} }
</style> </style>
{ {
"noData": "No Data", "noData": "No Data",
"noNetwork": "Network error", "noNetwork": "Network error",
"toSet": "Go to settings", "toSet": "Go to settings",
"error": "error" "error": "error"
} }
import en from './en.json' import en from './en.json'
import zhHans from './zh-Hans.json' import zhHans from './zh-Hans.json'
export default { export default {
en, en,
'zh-Hans': zhHans 'zh-Hans': zhHans
} }
{ {
"noData": "暂无数据", "noData": "暂无数据",
"noNetwork": "网络异常", "noNetwork": "网络异常",
"toSet": "前往设置", "toSet": "前往设置",
"error": "错误" "error": "错误"
} }
<template> <template>
<view class="short-code-btn" hover-class="hover" @click="start"> <view class="short-code-btn" hover-class="hover" @click="start">
<text class="inner-text" :class="reverseNumber==0?'inner-text-active':''">{{innerText}}</text> <text class="inner-text" :class="reverseNumber==0?'inner-text-active':''">{{innerText}}</text>
</view> </view>
</template> </template>
<script> <script>
function debounce(func, wait) { function debounce(func, wait) {
let timer; let timer;
wait = wait || 500; wait = wait || 500;
return function() { return function() {
let context = this; let context = this;
let args = arguments; let args = arguments;
if (timer) clearTimeout(timer); if (timer) clearTimeout(timer);
let callNow = !timer; let callNow = !timer;
timer = setTimeout(() => { timer = setTimeout(() => {
timer = null; timer = null;
}, wait) }, wait)
if (callNow) func.apply(context, args); if (callNow) func.apply(context, args);
} }
} }
export default { export default {
name: "uni-send-sms-code", name: "uni-send-sms-code",
props: { props: {
/** /**
* 倒计时时长 s * 倒计时时长 s
*/ */
count: { count: {
type: [String, Number], type: [String, Number],
default: 60 default: 60
}, },
/** /**
* 手机号码 * 手机号码
*/ */
phone: { phone: {
type: [String, Number], type: [String, Number],
default: '' default: ''
}, },
/* /*
验证码类型,用于防止不同功能的验证码混用,目前支持的类型login登录、register注册、bind绑定手机、unbind解绑手机 验证码类型,用于防止不同功能的验证码混用,目前支持的类型login登录、register注册、bind绑定手机、unbind解绑手机
*/ */
codeType:{ codeType:{
type: String, type: String,
default(){ default(){
return 'login' return 'login'
} }
} }
}, },
data() { data() {
return { return {
reverseNumber: 0, reverseNumber: 0,
reverseTimer: null reverseTimer: null
}; };
}, },
computed: { computed: {
innerText() { innerText() {
if (this.reverseNumber == 0) return this.$t('common.getVerifyCode'); if (this.reverseNumber == 0) return this.$t('common.getVerifyCode');
return this.$t('smsCode.resendVerifyCode')+ '('+this.reverseNumber+'s)'; return this.$t('smsCode.resendVerifyCode')+ '('+this.reverseNumber+'s)';
} }
}, },
created() { created() {
this.initClick(); this.initClick();
}, },
methods: { methods: {
initClick() { initClick() {
this.start = debounce(() => { this.start = debounce(() => {
if (this.reverseNumber != 0) return; if (this.reverseNumber != 0) return;
this.sendMsg(); this.sendMsg();
}) })
}, },
sendMsg() { sendMsg() {
let reg_phone = /^1\d{10}$/; let reg_phone = /^1\d{10}$/;
if(!reg_phone.test(this.phone))return uni.showToast({ if(!reg_phone.test(this.phone))return uni.showToast({
title: this.$t('smsCode.phoneErrTip'), title: this.$t('smsCode.phoneErrTip'),
icon: 'none' icon: 'none'
}); });
uniCloud.callFunction({ uniCloud.callFunction({
name:'uni-id-cf', name:'uni-id-cf',
data:{ data:{
action:'sendSmsCode', action:'sendSmsCode',
params:{ params:{
"mobile": this.phone, "mobile": this.phone,
"type": this.codeType "type": this.codeType
}, },
}, },
success: ({result}) => { success: ({result}) => {
console.log(result); console.log(result);
if(result.code===0){ if(result.code===0){
uni.showToast({ uni.showToast({
title: this.$t('smsCode.sendSuccessTip'), title: this.$t('smsCode.sendSuccessTip'),
icon: 'none' icon: 'none'
}); });
this.reverseNumber = Number(this.count); this.reverseNumber = Number(this.count);
this.getCode(); this.getCode();
this.$emit('getCode'); this.$emit('getCode');
}else{ }else{
uni.showModal({ uni.showModal({
content: result.msg, content: result.msg,
showCancel: false showCancel: false
}); });
} }
} }
}) })
}, },
getCode() { getCode() {
if (this.reverseNumber == 0) { if (this.reverseNumber == 0) {
clearTimeout(this.reverseTimer); clearTimeout(this.reverseTimer);
this.reverseTimer = null; this.reverseTimer = null;
return; return;
} }
this.reverseNumber--; this.reverseNumber--;
this.reverseTimer = setTimeout(() => { this.reverseTimer = setTimeout(() => {
this.getCode(); this.getCode();
}, 1000) }, 1000)
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
view{ view{
display: flex; display: flex;
box-sizing: border-box; box-sizing: border-box;
flex-direction: column; flex-direction: column;
} }
/* #endif */ /* #endif */
.short-code-btn { .short-code-btn {
width: 200rpx; width: 200rpx;
height: 85rpx; height: 85rpx;
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
display: flex; display: flex;
/* #endif */ /* #endif */
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.inner-text { .inner-text {
font-size: 28rpx; font-size: 28rpx;
color: #AAAAAA; color: #AAAAAA;
} }
.inner-text-active { .inner-text-active {
color: #007aff; color: #007aff;
} }
</style> </style>
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
{ {
"uni-countdown.day": "day", "uni-countdown.day": "day",
"uni-countdown.h": "h", "uni-countdown.h": "h",
"uni-countdown.m": "m", "uni-countdown.m": "m",
"uni-countdown.s": "s" "uni-countdown.s": "s"
} }
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册