提交 8f0b3775 编写于 作者: hbcui1984's avatar hbcui1984

迁移hello uni-app示例工程

新地址:https://github.com/dcloudio/hello-uniapp
上级 23f9d945
<script>
export default {
onLaunch: function () {
console.log('App Launch');
//#ifdef APP-PLUS
/* 5+环境锁定屏幕方向 */
plus.screen.lockOrientation('portrait-primary'); //锁定
/* 5+环境升级提示 */
var server = "https://uniapp.dcloud.io/update"; //检查更新地址
var req = { //升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version,
"imei": plus.device.imei
};
uni.request({
url: server,
data: req,
success: (res) => {
console.log("success", res);
if (res.statusCode == 200 && res.data.isUpdate) {
let openUrl = plus.os.name === 'iOS' ? res.data.iOS : res.data.Android;
uni.showModal({ //提醒用户更新
title: '更新提示',
content: res.data.note ? res.data.note : '是否选择更新',
success: (res) => {
if (res.confirm) {
plus.runtime.openURL(openUrl);
}
}
})
}
}
})
//#endif
},
onShow: function () {
console.log('App Show')
},
onHide: function () {
console.log('App Hide')
}
}
</script>
<style>
/* uni.css - 通用组件、模板样式库,可以当作一套ui库应用 */
@import "./common/uni.css";
/* 以下样式用于 hello uni-app 演示所需 */
page {
background-color:#F4F5F6;
height: 100%;
font-size:28upx;
line-height: 1.8;
}
.uni-header-logo{
padding:30upx;
text-align:center;
margin-top:10upx;
}
.uni-header-logo image{
width: 140upx;
height: 140upx;
}
.uni-hello-text{
color:#7A7E83;
}
.uni-hello-addfile{
text-align:center;
line-height:300upx;
background:#FFF;
padding:50upx;
margin-top:10px;
font-size:38upx;
color:#808080;
}
</style>
\ No newline at end of file
module.exports ={
"list": [{
"letter": "A",
"data": [
"阿克苏机场",
"阿拉山口机场",
"阿勒泰机场",
"阿里昆莎机场",
"安庆天柱山机场",
"澳门国际机场"
]
}, {
"letter": "B",
"data": [
"保山机场",
"包头机场",
"北海福成机场",
"北京南苑机场",
"北京首都国际机场"
]
}, {
"letter": "C",
"data": [
"长白山机场",
"长春龙嘉国际机场",
"常德桃花源机场",
"昌都邦达机场",
"长沙黄花国际机场",
"长治王村机场",
"常州奔牛机场",
"成都双流国际机场",
"赤峰机场"
]
}, {
"letter": "D",
"data": [
"大理机场",
"大连周水子国际机场",
"大庆萨尔图机场",
"大同东王庄机场",
"达州河市机场",
"丹东浪头机场",
"德宏芒市机场",
"迪庆香格里拉机场",
"东营机场",
"敦煌机场"
]
}, {
"letter": "E",
"data": [
"鄂尔多斯机场",
"恩施许家坪机场",
"二连浩特赛乌苏国际机场"
]
}, {
"letter": "F",
"data": [
"阜阳西关机场",
"福州长乐国际机场"
]
}, {
"letter": "G",
"data": [
"赣州黄金机场",
"格尔木机场",
"固原六盘山机场",
"广元盘龙机场",
"广州白云国际机场",
"桂林两江国际机场",
"贵阳龙洞堡国际机场"
]
}, {
"letter": "H",
"data": [
"哈尔滨太平国际机场",
"哈密机场",
"海口美兰国际机场",
"海拉尔东山国际机场",
"邯郸机场",
"汉中机场",
"杭州萧山国际机场",
"合肥骆岗国际机场",
"和田机场",
"黑河机场",
"呼和浩特白塔国际机场",
"淮安涟水机场",
"黄山屯溪国际机场"
]
}, {
"letter": "I",
"data": []
}, {
"letter": "J",
"data": [
"济南遥墙国际机场",
"济宁曲阜机场",
"鸡西兴凯湖机场",
"佳木斯东郊机场",
"嘉峪关机场",
"锦州小岭子机场",
"景德镇机场",
"井冈山机场",
"九江庐山机场",
"九寨黄龙机场"
]
}, {
"letter": "K",
"data": [
"喀什机场",
"克拉玛依机场",
"库车龟兹机场",
"库尔勒机场",
"昆明巫家坝国际机场"
]
}, {
"letter": "L",
"data": [
"拉萨贡嘎机场",
"兰州中川机场",
"丽江三义机场",
"黎平机场",
"连云港白塔埠机场",
"临沧机场",
"临沂机场",
"林芝米林机场",
"柳州白莲机场",
"龙岩冠豸山机场",
"泸州蓝田机场",
"洛阳北郊机场"
]
}, {
"letter": "M",
"data": [
"满洲里西郊机场",
"绵阳南郊机场",
"漠河古莲机场",
"牡丹江海浪机场"
]
}, {
"letter": "N",
"data": [
"南昌昌北国际机场",
"南充高坪机场",
"南京禄口国际机场",
"南宁吴圩机场",
"南通兴东机场",
"南阳姜营机场",
"宁波栎社国际机场"
]
}, {
"letter": "O",
"data": []
}, {
"letter": "P",
"data": [
"普洱思茅机场"
]
}, {
"letter": "Q",
"data": [
"齐齐哈尔三家子机场",
"秦皇岛山海关机场",
"青岛流亭国际机场",
"衢州机场",
"泉州晋江机场"
]
}, {
"letter": "R",
"data": [
"日喀则和平机场"
]
}, {
"letter": "S",
"data": [
"三亚凤凰国际机场",
"汕头外砂机场",
"上海虹桥国际机场",
"上海浦东国际机场",
"深圳宝安国际机场",
"沈阳桃仙国际机场",
"石家庄正定国际机场",
"苏南硕放国际机场"
]
}, {
"letter": "T",
"data": [
"塔城机场",
"太原武宿国际机场",
"台州路桥机场 (黄岩机场)",
"唐山三女河机场",
"腾冲驼峰机场",
"天津滨海国际机场",
"通辽机场",
"铜仁凤凰机场"
]
}, {
"letter": "U",
"data": []
}, {
"letter": "V",
"data": []
}, {
"letter": "W",
"data": [
"万州五桥机场",
"潍坊机场",
"威海大水泊机场",
"文山普者黑机场",
"温州永强国际机场",
"乌海机场",
"武汉天河国际机场",
"乌兰浩特机场",
"乌鲁木齐地窝堡国际机场",
"武夷山机场",
"梧州长洲岛机场"
]
}, {
"letter": "X",
"data": [
"西安咸阳国际机场",
"西昌青山机场",
"锡林浩特机场",
"西宁曹家堡机场",
"西双版纳嘎洒机场",
"厦门高崎国际机场",
"香港国际机场",
"襄阳刘集机场",
"兴义机场",
"徐州观音机场"
]
}, {
"letter": "Y",
"data": [
"延安二十里堡机场",
"盐城机场",
"延吉朝阳川机场",
"烟台莱山国际机场",
"宜宾菜坝机场",
"宜昌三峡机场",
"伊春林都机场",
"伊宁机场",
"义乌机场",
"银川河东机场",
"永州零陵机场",
"榆林榆阳机场",
"玉树巴塘机场",
"运城张孝机场"
]
}, {
"letter": "Z",
"data": [
"湛江机场",
"昭通机场",
"郑州新郑国际机场",
"芷江机场",
"重庆江北国际机场",
"中卫香山机场",
"舟山朱家尖机场",
"珠海三灶机场"
]
}]
}
此差异已折叠。
/**
数据验证(表单验证)
来自 grace.hcoder.net
作者 hcoder 深海
*/
module.exports = {
error:'',
check : function (data, rule){
for(var i = 0; i < rule.length; i++){
if (!rule[i].checkType){return true;}
if (!rule[i].name) {return true;}
if (!rule[i].errorMsg) {return true;}
if (!data[rule[i].name]) {this.error = rule[i].errorMsg; return false;}
switch (rule[i].checkType){
case 'string':
var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
break;
case 'int':
var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$');
if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
break;
break;
case 'between':
if (!this.isNumber(data[rule[i].name])){
this.error = rule[i].errorMsg;
return false;
}
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'betweenD':
var reg = /^-?[1-9][0-9]?$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'betweenF':
var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
var minMax = rule[i].checkRule.split(',');
minMax[0] = Number(minMax[0]);
minMax[1] = Number(minMax[1]);
if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
this.error = rule[i].errorMsg;
return false;
}
break;
case 'same':
if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
break;
case 'notsame':
if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
break;
case 'email':
var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'phoneno':
var reg = /^1[0-9]{10,10}$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'zipcode':
var reg = /^[0-9]{6}$/;
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'reg':
var reg = new RegExp(rule[i].checkRule);
if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
break;
case 'in':
if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
this.error = rule[i].errorMsg; return false;
}
break;
case 'notnull':
if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
break;
}
}
return true;
},
isNumber : function (checkVal){
var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
return reg.test(checkVal);
}
}
\ No newline at end of file
此差异已折叠。
function formatTime(time) {
if (typeof time !== 'number' || time < 0) {
return time
}
var hour = parseInt(time / 3600)
time = time % 3600
var minute = parseInt(time / 60)
time = time % 60
var second = time
return ([hour, minute, second]).map(function (n) {
n = n.toString()
return n[1] ? n : '0' + n
}).join(':')
}
function formatLocation(longitude, latitude) {
if (typeof longitude === 'string' && typeof latitude === 'string') {
longitude = parseFloat(longitude)
latitude = parseFloat(latitude)
}
longitude = longitude.toFixed(2)
latitude = latitude.toFixed(2)
return {
longitude: longitude.toString().split('.'),
latitude: latitude.toString().split('.')
}
}
var dateUtils = {
UNITS: {
'': 31557600000,
'': 2629800000,
'': 86400000,
'小时': 3600000,
'分钟': 60000,
'': 1000
},
humanize: function (milliseconds) {
var humanize = '';
for (var key in this.UNITS) {
if (milliseconds >= this.UNITS[key]) {
humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '';
break;
}
}
return humanize || '刚刚';
},
format: function (dateStr) {
var date = this.parse(dateStr)
var diff = Date.now() - date.getTime();
if (diff < this.UNITS['']) {
return this.humanize(diff);
}
var _format = function (number) {
return (number < 10 ? ('0' + number) : number);
};
return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDay()) + '-' +
_format(date.getHours()) + ':' + _format(date.getMinutes());
},
parse: function (str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
var a = str.split(/[^0-9]/);
return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
}
};
module.exports = {
formatTime: formatTime,
formatLocation: formatLocation,
dateUtils: dateUtils
}
因为 它太大了无法显示 source diff 。你可以改为 查看blob
<template>
<view class="footer">
<view class="footer-left">
<view class="uni-icon uni-icon-mic" @tap="startRecognize"> </view>
</view>
<view class="footer-center">
<input class="input-text" type="text" v-model="inputValue"></input>
</view>
<view class="footer-right" @tap="sendMessge">
<view id='msg-type' >发送</view>
</view>
</view>
</template>
<script>
export default {
name: "chat-input",
data() {
return {
inputValue: ''
}
},
methods: {
startRecognize: function () {
var options = {};
var that = this;
options.engine = 'iFly';
that.inputValue = "";
plus.speech.startRecognize(options, function (s) {
console.log(s);
that.inputValue += s;
}, function (e) {
console.log("语音识别失败:" + e.message);
});
},
sendMessge: function () {
var that = this;
if (that.inputValue.trim() == '') {
that.inputValue = '';
} else {
//点击发送按钮时,通知父组件用户输入的内容
this.$emit('send-message', {
type: 'text',
content: that.inputValue
});
that.inputValue = '';
}
}
}
}
</script>
<style>
.footer {
display: flex;
flex-direction: row;
width: 100%;
height: 80upx;
min-height: 80upx;
border-top: solid 1px #bbb;
overflow: hidden;
padding: 5upx;
background-color: #fafafa;
}
.footer-left {
width: 80upx;
height: 80upx;
display: flex;
justify-content: center;
align-items: center;
}
.footer-right {
width: 120upx;
height: 80upx;
display: flex;
justify-content: center;
align-items: center;
color: #1482D1;
}
.footer-center {
flex: 1;
height: 80upx;
display: flex;
justify-content: center;
align-items: center;
}
.footer-center .input-text {
flex: 1;
background: #fff;
border: solid 1upx #ddd;
padding: 10upx !important;
font-family: verdana !important;
overflow: hidden;
border-radius: 15upx;
}
</style>
<template>
<view class="m-item" :id="'message'+id">
<view class="m-left">
<image class="head_icon" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/app/homeHL.png" v-if="message.user=='home'"></image>
</view>
<view class="m-content">
<view class="m-content-head" :class="{'m-content-head-right':message.user=='customer'}">
<view :class="'m-content-head-'+message.user">{{message.content}} </view>
</view>
</view>
<view class="m-right">
<image class="head_icon" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/app/customerHL.png" v-if="message.user=='customer'"></image>
</view>
</view>
</template>
<script>
export default {
props: ['message', 'id']
}
</script>
<style>
.m-item {
display: flex;
flex-direction: row;
padding-top: 40upx;
}
.m-left {
display: flex;
width: 120upx;
justify-content: center;
align-items: flex-start;
}
.m-content {
display: flex;
flex: 1;
flex-direction: column;
justify-content: center;
word-break: break-all;
}
.m-right {
display: flex;
width: 120upx;
justify-content: center;
align-items: flex-start;
}
.head_icon {
width: 80upx;
height: 80upx;
}
.m-content-head {
position: relative;
}
.m-content-head-right {
display: flex;
justify-content: flex-end;
}
.m-content-head-home {
text-align: left;
background: #1482d1;
border: 1px #1482d1 solid;
border-radius: 20upx;
padding: 20upx;
color: white;
}
.m-content-head-home:before {
border: 15upx solid transparent;
border-right: 15upx solid #1482d1;
left: -26upx;
width: 0;
height: 0;
position: absolute;
content: ' '
}
.m-content-head-customer {
border: 1upx white solid;
background: white;
border-radius: 20upx;
padding: 20upx;
}
.m-content-head-customer:after {
border: 15upx solid transparent;
border-left: 15upx solid white;
top: 20upx;
right: -26upx;
width: 0;
height: 0;
position: absolute;
content: ' '
}
</style>
<template>
<view>
<view>
<view class="toolbar">
<view class="iconfont icon-bold" @click="toolBarClick('bold')"></view>
<view class="iconfont icon-italic" @click="toolBarClick('italic')"></view>
<view class="iconfont icon-xiahuaxian1" @click="toolBarClick('header')"></view>
<view class="iconfont icon-underline" @click="toolBarClick('underline')"></view>
<view class="iconfont icon-strike" @click="toolBarClick('strike')"></view>
<view class="iconfont icon-sup" @click="toolBarClick('sup')"></view>
<view class="iconfont icon-sub" @click="toolBarClick('sub')"></view>
<view class="iconfont icon-alignleft" @click="toolBarClick('alignleft')"></view>
<view class="iconfont icon-aligncenter" @click="toolBarClick('aligncenter')"></view>
<view class="iconfont icon-alignright" @click="toolBarClick('alignright')"></view>
<view class="iconfont icon-link" @click="toolBarClick('link')"></view>
<view class="iconfont icon-image" @click="toolBarClick('imgage')"></view>
<view class="iconfont icon-code" @click="toolBarClick('code')"></view>
<view class="iconfont icon-table" @click="toolBarClick('table')"></view>
<view class="iconfont icon-qingkong" @click="toolBarClick('clear')"></view>
</view>
<view class="input-content">
<textarea auto-height maxlength="-1" v-model="textareaDataSync" @blur="getCursor"></textarea>
</view>
</view>
<view class="preview" v-if="showPreview && textareaHtmlSync">
<scroll-view scroll-y :style="'height:'+screenHeight/2.5+'px;padding:10px;box-sizing: border-box;'">
<wxParse :content="textareaHtmlSync" @preview="preview" @navigate="navigate" />
</scroll-view>
</view>
</view>
</template>
<script>
import marked from '../marked'
import wxParse from '../mpvue-wxparse/src/wxParse.vue'
export default {
name: "ly-markdown",
components: {
wxParse
},
data: function () {
return {
screenHeight: 0,
cursor: 0,
textareaDataSync:this.textareaData,
textareaHtmlSync:this.textareaHtml
}
},
props: {
textareaData: {
type: String,
default: ""
},
textareaHtml: {
type: String,
default: ""
},
showPreview: {
type: Boolean,
default: false
}
},
methods: {
preview(src, e) {
uni.previewImage({
urls: src,
})
},
navigate(href, e) {
// 如允许点击超链接跳转,则应该打开一个新页面,并传入href,由新页面内嵌webview组件负责显示该链接内容
// #ifdef APP-PLUS
plus.runtime.openURL(href)
// #endif
// #ifdef MP-WEIXIN
uni.setClipboardData({
data: href,
success: function () {
uni.showModal({
content: "网址已复制,请在浏览器中粘贴打开",
showCancel: false
})
}
})
// #endif
},
toolBarClick(type) {
if (type == 'bold') {
this.textareaDataSync += "**粗体文字** "
} else if (type == "italic") {
this.textareaDataSync += "*斜体* "
} else if (type == "header") {
uni.showActionSheet({
itemList: ["标题1", "标题2", "标题3", "标题4", "标题5", "标题6"],
success: res => {
switch (res.tapIndex) {
case 0:
this.textareaDataSync += "# 标题1\r";
return;
case 1:
this.textareaDataSync += "## 标题2\r";
return;
case 2:
this.textareaDataSync += "### 标题3\r";
return;
case 3:
this.textareaDataSync += "#### 标题4\r";
return;
case 4:
this.textareaDataSync += "##### 标题5\r";
return;
case 5:
this.textareaDataSync += "###### 标题6\r";
return;
}
}
})
} else if (type == "underline") {
this.textareaDataSync += "++下划线++ "
} else if (type == "strike") {
this.textareaDataSync += "~~中划线~~ "
} else if (type == "sup") {
this.textareaDataSync += "^上角标^ "
} else if (type == "sub") {
this.textareaDataSync += "~下角标~ "
} else if (type == "alignleft") {
this.textareaDataSync += "\n::: hljs-left\n\n左对齐\n\n:::\n"
} else if (type == "aligncenter") {
this.textareaDataSync += "\n::: hljs-center\n\n居中对齐\n\n:::\n"
} else if (type == "alignright") {
this.textareaDataSync += "\n::: hljs-right\n\n\n\n右对齐\n\n:::\n"
} else if (type == "link") {
this.textareaDataSync += "[在此输入网址描述](在此输入网址) "
} else if (type == "imgage") {
this.textareaDataSync += "![](在此输入图片地址) "
} else if (type == "code") {
this.textareaDataSync += "\n``` 代码块 \n\n```\n"
} else if (type == "table") {
this.textareaDataSync += "\n|列1|列2|列3|\n|-|-|-|\n|单元格1|单元格2|单元格3|\n"
} else if (type == "clear") {
uni.showModal({
title: "提示",
content: "确定清空?",
success: res => {
if (res.confirm) {
this.textareaDataSync = "";
}
}
})
}
},
getCursor(e) {
//安卓失去焦点获取不到cursor位置,暂不使用
//this.cursor = e.detail.cursor;
}
},
watch: {
"textareaDataSync": function (newValue, oldValue) {
this.textareaHtmlSync = marked(newValue)
this.$emit('update:textareaData', newValue)
this.$emit('update:textareaHtml', this.textareaHtmlSync)
}
},
mounted: function () {
uni.getSystemInfo({
success: res => {
this.screenHeight = res.screenHeight
}
})
}
}
</script>
<style>
@import './markdown.css';
@import url("../mpvue-wxparse/src/wxParse.css");
.input-content {
width: 100%;
}
.input-content textarea {
padding: 16upx 25upx 15upx 25upx;
font-size: 30upx;
min-height: 500upx;
line-height: 1.5;
}
.preview {
border-top: 1upx solid #e0e0e0;
width: 100%;
}
.toolbar {
width: 100%;
border: none;
box-shadow: 0 0upx 4upx rgba(0, 0, 0, 0.157), 0 0upx 4upx rgba(0, 0, 0, 0.227);
}
.toolbar .iconfont {
display: inline-block;
cursor: pointer;
height: 61.6upx;
width: 61.6upx;
margin: 13upx 0 11upx 0upx;
font-size: 33upx;
padding: 10upx 13upx 11upx 8upx;
color: #757575;
border-radius: 11upx;
text-align: center;
background: none;
border: none;
outline: none;
line-height: 2.2;
vertical-align: middle;
}
.input-content {
min-height: ;
}
</style>
@font-face {
font-family: 'iconfont';
src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'),
url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
font-weight: normal;
font-style: normal;
}
.iconfont {
font-family:"iconfont" !important;
font-size:16upx;
font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-aligncenter:before { content: "\e600"; }
.icon-alignjustify:before { content: "\e601"; }
.icon-alignleft:before { content: "\e602"; }
.icon-aligncenter1:before { content: "\e603"; }
.icon-alignjustify1:before { content: "\e604"; }
.icon-alignleft1:before { content: "\e605"; }
.icon-alignright:before { content: "\e606"; }
.icon-anchor:before { content: "\e607"; }
.icon-blockquote:before { content: "\e608"; }
.icon-bold:before { content: "\e609"; }
.icon-char:before { content: "\e60a"; }
.icon-clearformat:before { content: "\e60b"; }
.icon-code:before { content: "\e60c"; }
.icon-configure:before { content: "\e60d"; }
.icon-copy:before { content: "\e60e"; }
.icon-corner:before { content: "\e60f"; }
.icon-cut:before { content: "\e610"; }
.icon-datetime:before { content: "\e611"; }
.icon-explore:before { content: "\e612"; }
.icon-find:before { content: "\e613"; }
.icon-fullscreen:before { content: "\e614"; }
.icon-help:before { content: "\e615"; }
.icon-hr:before { content: "\e616"; }
.icon-indent:before { content: "\e618"; }
.icon-italic:before { content: "\e619"; }
.icon-link:before { content: "\e61a"; }
.icon-ltr:before { content: "\e61b"; }
.icon-nbsp:before { content: "\e61c"; }
.icon-new:before { content: "\e61d"; }
.icon-ok:before { content: "\e61e"; }
.icon-orderedlist:before { content: "\e61f"; }
.icon-outdent:before { content: "\e620"; }
.icon-pagebreak:before { content: "\e621"; }
.icon-paragraph:before { content: "\e622"; }
.icon-paste:before { content: "\e623"; }
.icon-pasteastext:before { content: "\e624"; }
.icon-preview:before { content: "\e625"; }
.icon-print:before { content: "\e626"; }
.icon-redo:before { content: "\e627"; }
.icon-rtl:before { content: "\e628"; }
.icon-save:before { content: "\e629"; }
.icon-smiley:before { content: "\e62a"; }
.icon-specialchar:before { content: "\e62b"; }
.icon-spellcheck:before { content: "\e62c"; }
.icon-strike:before { content: "\e62d"; }
.icon-sub:before { content: "\e62e"; }
.icon-sup:before { content: "\e62f"; }
.icon-table:before { content: "\e630"; }
.icon-template:before { content: "\e631"; }
.icon-underline:before { content: "\e632"; }
.icon-undo:before { content: "\e633"; }
.icon-unlink:before { content: "\e634"; }
.icon-unorderedlist:before { content: "\e635"; }
.icon-video:before { content: "\e636"; }
.icon-mark:before { content: "\e63a"; }
.icon-image:before { content: "\e63e"; }
.icon-xiahuaxian1:before { content: "\e7d1"; }
.icon-qingkong:before { content: "\e6a3"; }
/* eslint-disable */
var provinceData = [{
"label": "北京市",
"value": "11"
},
{
"label": "天津市",
"value": "12"
},
{
"label": "河北省",
"value": "13"
},
{
"label": "山西省",
"value": "14"
},
{
"label": "内蒙古自治区",
"value": "15"
},
{
"label": "辽宁省",
"value": "21"
},
{
"label": "吉林省",
"value": "22"
},
{
"label": "黑龙江省",
"value": "23"
},
{
"label": "上海市",
"value": "31"
},
{
"label": "江苏省",
"value": "32"
},
{
"label": "浙江省",
"value": "33"
},
{
"label": "安徽省",
"value": "34"
},
{
"label": "福建省",
"value": "35"
},
{
"label": "江西省",
"value": "36"
},
{
"label": "山东省",
"value": "37"
},
{
"label": "河南省",
"value": "41"
},
{
"label": "湖北省",
"value": "42"
},
{
"label": "湖南省",
"value": "43"
},
{
"label": "广东省",
"value": "44"
},
{
"label": "广西壮族自治区",
"value": "45"
},
{
"label": "海南省",
"value": "46"
},
{
"label": "重庆市",
"value": "50"
},
{
"label": "四川省",
"value": "51"
},
{
"label": "贵州省",
"value": "52"
},
{
"label": "云南省",
"value": "53"
},
{
"label": "西藏自治区",
"value": "54"
},
{
"label": "陕西省",
"value": "61"
},
{
"label": "甘肃省",
"value": "62"
},
{
"label": "青海省",
"value": "63"
},
{
"label": "宁夏回族自治区",
"value": "64"
},
{
"label": "新疆维吾尔自治区",
"value": "65"
},
{
"label": "台湾",
"value": "66"
},
{
"label": "香港",
"value": "67"
},
{
"label": "澳门",
"value": "68"
}
]
export default provinceData;
<template>
<div class="mpvue-picker">
<div :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></div>
<div class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
<div class="mpvue-picker__hd" catchtouchmove="true">
<div class="mpvue-picker__action" @click="pickerCancel">取消</div>
<div class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</div>
</div>
<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange">
<block>
<picker-view-column>
<div class="picker-item" v-for="(item,index) in provinceDataList" :key="index">{{item.label}}</div>
</picker-view-column>
<picker-view-column>
<div class="picker-item" v-for="(item,index) in cityDataList" :key="index">{{item.label}}</div>
</picker-view-column>
<picker-view-column>
<div class="picker-item" v-for="(item,index) in areaDataList" :key="index">{{item.label}}</div>
</picker-view-column>
</block>
</picker-view>
</div>
</div>
</template>
<script>
import provinceData from './city-data/province.js';
import cityData from './city-data/city.js';
import areaData from './city-data/area.js';
export default {
data() {
return {
pickerValue: [0, 0, 0],
provinceDataList: [],
cityDataList: [],
areaDataList: [],
/* 是否显示控件 */
showPicker: false,
};
},
created() {
this.init()
},
props: {
/* 默认值 */
pickerValueDefault: {
type: Array,
default(){
return [0, 0, 0]
}
},
/* 主题色 */
themeColor: String
},
watch:{
pickerValueDefault(){
this.init();
}
},
methods: {
init() {
this.handPickValueDefault(); // 对 pickerValueDefault 做兼容处理
this.provinceDataList = provinceData;
this.cityDataList = cityData[this.pickerValueDefault[0]];
this.areaDataList = areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]];
this.pickerValue = this.pickerValueDefault;
},
show() {
setTimeout(() => {
this.showPicker = true;
}, 0);
},
maskClick() {
this.pickerCancel();
},
pickerCancel() {
this.showPicker = false;
this._$emit('onCancel');
},
pickerConfirm(e) {
this.showPicker = false;
this._$emit('onConfirm');
},
showPickerView() {
this.showPicker = true;
},
handPickValueDefault() {
if (this.pickerValueDefault !== [0, 0, 0]) {
if (this.pickerValueDefault[0] > provinceData.length - 1) {
this.pickerValueDefault[0] = provinceData.length - 1;
}
if (this.pickerValueDefault[1] > cityData[this.pickerValueDefault[0]].length - 1) {
this.pickerValueDefault[1] = cityData[this.pickerValueDefault[0]].length - 1;
}
if (this.pickerValueDefault[2] > areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1) {
this.pickerValueDefault[2] = areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1;
}
}
},
pickerChange(e) {
let changePickerValue = e.mp.detail.value;
if (this.pickerValue[0] !== changePickerValue[0]) {
// 第一级发生滚动
this.cityDataList = cityData[changePickerValue[0]];
this.areaDataList = areaData[changePickerValue[0]][0];
changePickerValue[1] = 0;
changePickerValue[2] = 0;
} else if (this.pickerValue[1] !== changePickerValue[1]) {
// 第二级滚动
this.areaDataList =
areaData[changePickerValue[0]][changePickerValue[1]];
changePickerValue[2] = 0;
}
this.pickerValue = changePickerValue;
this._$emit('onChange');
},
_$emit(emitName) {
let pickObj = {
label: this._getLabel(),
value: this.pickerValue,
cityCode: this._getCityCode()
};
this.$emit(emitName, pickObj);
},
_getLabel() {
let pcikerLabel =
this.provinceDataList[this.pickerValue[0]].label +
'-' +
this.cityDataList[this.pickerValue[1]].label +
'-' +
this.areaDataList[this.pickerValue[2]].label;
return pcikerLabel;
},
_getCityCode() {
return this.areaDataList[this.pickerValue[2]].value;
}
}
};
</script>
<style>
.pickerMask {
position: fixed;
z-index: 1000;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
}
.mpvue-picker-content {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
transition: all 0.3s ease;
transform: translateY(100%);
z-index: 3000;
}
.mpvue-picker-view-show {
transform: translateY(0);
}
.mpvue-picker__hd {
display: flex;
padding: 9px 15px;
background-color: #fff;
position: relative;
text-align: center;
font-size: 17px;
}
.mpvue-picker__hd:after {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #e5e5e5;
color: #e5e5e5;
transform-origin: 0 100%;
transform: scaleY(0.5);
}
.mpvue-picker__action {
display: block;
flex: 1;
color: #1aad19;
}
.mpvue-picker__action:first-child {
text-align: left;
color: #888;
}
.mpvue-picker__action:last-child {
text-align: right;
}
.picker-item {
text-align: center;
line-height: 40px;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 16px;
}
.mpvue-picker-view {
position: relative;
bottom: 0;
left: 0;
width: 100%;
height: 238px;
background-color: rgba(255, 255, 255, 1);
}
</style>
<template>
<canvas
v-if="canvasId"
class="ec-canvas"
:id="canvasId"
:canvasId="canvasId"
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
@error="error">
</canvas>
</template>
<script>
import WxCanvas from './wx-canvas';
export default {
props: {
echarts: {
required: true,
type: Object,
default() {
return null;
},
},
onInit: {
required: true,
type: Function,
default: null,
},
canvasId: {
type: String,
default: 'ec-canvas',
},
lazyLoad: {
type: Boolean,
default: false,
},
disableTouch: {
type: Boolean,
default: false,
},
throttleTouch: {
type: Boolean,
default: false,
},
},
onReady() {
if (!this.echarts) {
console.warn('组件需绑定 echarts 变量,例:<ec-canvas id="mychart-dom-bar" '
+ 'canvas-id="mychart-bar" :echarts="echarts"></ec-canvas>');
return;
}
if (!this.lazyLoad) this.init();
},
methods: {
init() {
const version = wx.version.version.split('.').map(n => parseInt(n, 10));
const isValid = version[0] > 1 || (version[0] === 1 && version[1] > 9)
|| (version[0] === 1 && version[1] === 9 && version[2] >= 91);
if (!isValid) {
console.error('微信基础库版本过低,需大于等于 1.9.91。'
+ '参见:https://github.com/ecomfe/echarts-for-weixin'
+ '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82');
return;
}
if (!this.onInit) {
console.warn('请传入 onInit 函数进行初始化');
return;
}
const { canvasId } = this;
this.ctx = wx.createCanvasContext(canvasId);
const canvas = new WxCanvas(this.ctx, canvasId);
this.echarts.setCanvasCreator(() => canvas);
const query = wx.createSelectorQuery();
query.select(`#${canvasId}`).boundingClientRect((res) => {
if (!res) {
setTimeout(() => this.init(), 50);
return;
}
this.chart = this.onInit(canvas, res.width, res.height);
}).exec();
},
canvasToTempFilePath(opt) {
const { canvasId } = this;
this.ctx.draw(true, () => {
wx.canvasToTempFilePath({
canvasId,
...opt,
});
});
},
touchStart(e) {
const { disableTouch, chart } = this;
if (disableTouch || !chart || !e.mp.touches.length) return;
const touch = e.mp.touches[0];
chart._zr.handler.dispatch('mousedown', {
zrX: touch.x,
zrY: touch.y,
});
chart._zr.handler.dispatch('mousemove', {
zrX: touch.x,
zrY: touch.y,
});
},
touchMove(e) {
const {
disableTouch, throttleTouch, chart, lastMoveTime,
} = this;
if (disableTouch || !chart || !e.mp.touches.length) return;
if (throttleTouch) {
const currMoveTime = Date.now();
if (currMoveTime - lastMoveTime < 240) return;
this.lastMoveTime = currMoveTime;
}
const touch = e.mp.touches[0];
chart._zr.handler.dispatch('mousemove', {
zrX: touch.x,
zrY: touch.y,
});
},
touchEnd(e) {
const { disableTouch, chart } = this;
if (disableTouch || !chart) return;
const touch = e.mp.changedTouches ? e.mp.changedTouches[0] : {};
chart._zr.handler.dispatch('mouseup', {
zrX: touch.x,
zrY: touch.y,
});
chart._zr.handler.dispatch('click', {
zrX: touch.x,
zrY: touch.y,
});
},
},
};
</script>
<style scoped>
.ec-canvas {
width: 100%;
height: 100%;
flex: 1;
}
</style>
export default class WxCanvas {
constructor(ctx, canvasId) {
this.ctx = ctx;
this.canvasId = canvasId;
this.chart = null;
WxCanvas.initStyle(ctx);
this.initEvent();
}
getContext(contextType) {
return contextType === '2d' ? this.ctx : null;
}
setChart(chart) {
this.chart = chart;
}
attachEvent() {
// noop
}
detachEvent() {
// noop
}
static initStyle(ctx) {
const styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
styles.forEach((style) => {
Object.defineProperty(ctx, style, {
set: (value) => {
if ((style !== 'fillStyle' && style !== 'strokeStyle')
|| (value !== 'none' && value !== null)
) {
ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value);
}
},
});
});
ctx.createRadialGradient = () => ctx.createCircularGradient(arguments);
}
initEvent() {
this.event = {};
const eventNames = [{
wxName: 'touchStart',
ecName: 'mousedown',
}, {
wxName: 'touchMove',
ecName: 'mousemove',
}, {
wxName: 'touchEnd',
ecName: 'mouseup',
}, {
wxName: 'touchEnd',
ecName: 'click',
}];
eventNames.forEach((name) => {
this.event[name.wxName] = (e) => {
const touch = e.mp.touches[0];
this.chart._zr.handler.dispatch(name.ecName, {
zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
zrY: name.wxName === 'tap' ? touch.clientY : touch.y,
});
};
});
}
}
<template>
<!--增加audio标签支持-->
<audio
:id="node.attr.id"
:class="node.classStr"
:style="node.styleStr"
:src="node.attr.src"
:loop="node.attr.loop"
:poster="node.attr.poster"
:name="node.attr.name"
:author="node.attr.author"
controls></audio>
</template>
<script>
export default {
name: 'wxParseAudio',
props: {
node: {
type: Object,
default() {
return {};
},
},
},
};
</script>
<template>
<image
:mode="node.attr.mode"
:lazy-load="node.attr.lazyLoad"
:class="node.classStr"
:style="newStyleStr || node.styleStr"
:data-src="node.attr.src"
:src="node.attr.src"
@tap="wxParseImgTap"
@load="wxParseImgLoad"
/>
</template>
<script>
export default {
name: 'wxParseImg',
data() {
return {
newStyleStr: '',
preview: true,
};
},
props: {
node: {
type: Object,
default() {
return {};
},
},
},
methods: {
wxParseImgTap(e) {
if (!this.preview) return;
const { src } = e.target.dataset;
if (!src) return;
this.node.$host.preview(src, e);
},
// 图片视觉宽高计算函数区
wxParseImgLoad(e) {
const { src } = e.target.dataset;
if (!src) return;
const { width, height } = e.mp.detail;
const recal = this.wxAutoImageCal(width, height);
const { imageheight, imageWidth } = recal;
const { padding, mode } = this.node.attr;
const { styleStr } = this.node;
const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px; padding: 0 ${+padding}px;`;
},
// 计算视觉优先的图片宽高
wxAutoImageCal(originalWidth, originalHeight) {
// 获取图片的原始长宽
const { padding } = this.node.attr;
const windowWidth = this.node.$screen.width - (2 * padding);
const results = {};
if (originalWidth < 60 || originalHeight < 60) {
const { src } = this.node.attr;
this.node.$host.removeImageUrl(src);
this.preview = false;
}
// 判断按照那种方式进行缩放
if (originalWidth > windowWidth) {
// 在图片width大于手机屏幕width时候
results.imageWidth = windowWidth;
results.imageheight = windowWidth * (originalHeight / originalWidth);
} else {
// 否则展示原来的数据
results.imageWidth = originalWidth;
results.imageheight = originalHeight;
}
return results;
},
},
};
</script>
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--table类型-->
<block v-else-if="node.tag == 'table'">
<view :class="node.classStr" class="table" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate1';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate0',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.target.dataset;
if (!href) return;
this.node.$host.navigate(href, e);
},
},
};
</script>
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate2';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate1',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.target.dataset;
if (!href) return;
this.node.$host.navigate(href, e);
},
},
};
</script>
<template>
<!--增加video标签支持,并循环添加-->
<view :class="node.classStr" :style="node.styleStr">
<video :class="node.classStr" class="video-video" :src="node.attr.src"></video>
</view>
</template>
<script>
export default {
name: 'wxParseVideo',
props: {
node: {},
},
};
</script>
<template name="page-head">
<view class="uni-page-head">
<view class="uni-page-head-title">{{title}}</view>
</view>
</template>
<script>
export default {
name: "page-head",
props: {
title: {
type: String,
default: ""
}
}
}
</script>
此差异已折叠。
function qrPolynomial(r,t){if("undefined"==typeof r.length)throw new Error(r.length+"/"+t);var e=function(){for(var e=0;e<r.length&&0==r[e];)e+=1;for(var n=new Array(r.length-e+t),o=0;o<r.length-e;o+=1)n[o]=r[o+e];return n}(),n={};return n.getAt=function(r){return e[r]},n.getLength=function(){return e.length},n.multiply=function(r){for(var t=new Array(n.getLength()+r.getLength()-1),e=0;e<n.getLength();e+=1)for(var o=0;o<r.getLength();o+=1)t[e+o]^=QRMath.gexp(QRMath.glog(n.getAt(e))+QRMath.glog(r.getAt(o)));return qrPolynomial(t,0)},n.mod=function(r){if(n.getLength()-r.getLength()<0)return n;for(var t=QRMath.glog(n.getAt(0))-QRMath.glog(r.getAt(0)),e=new Array(n.getLength()),o=0;o<n.getLength();o+=1)e[o]=n.getAt(o);for(var o=0;o<r.getLength();o+=1)e[o]^=QRMath.gexp(QRMath.glog(r.getAt(o))+t);return qrPolynomial(e,0).mod(r)},n}var qrcode=function(r,t){var e=236,n=17,o=r,a=QRErrorCorrectLevel[t],i=null,u=0,f=null,c=new Array,g={},l=function(r,t){u=4*o+17,i=function(r){for(var t=new Array(r),e=0;e<r;e+=1){t[e]=new Array(r);for(var n=0;n<r;n+=1)t[e][n]=null}return t}(u),h(0,0),h(u-7,0),h(0,u-7),d(),s(),y(r,t),o>=7&&w(r),null==f&&(f=p(o,a,c)),M(f,t)},h=function(r,t){for(var e=-1;e<=7;e+=1)if(!(r+e<=-1||u<=r+e))for(var n=-1;n<=7;n+=1)t+n<=-1||u<=t+n||(0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4?i[r+e][t+n]=!0:i[r+e][t+n]=!1)},v=function(){for(var r=0,t=0,e=0;e<8;e+=1){l(!0,e);var n=QRUtil.getLostPoint(g);(0==e||r>n)&&(r=n,t=e)}return t},s=function(){for(var r=8;r<u-8;r+=1)null==i[r][6]&&(i[r][6]=r%2==0);for(var t=8;t<u-8;t+=1)null==i[6][t]&&(i[6][t]=t%2==0)},d=function(){for(var r=QRUtil.getPatternPosition(o),t=0;t<r.length;t+=1)for(var e=0;e<r.length;e+=1){var n=r[t],a=r[e];if(null==i[n][a])for(var u=-2;u<=2;u+=1)for(var f=-2;f<=2;f+=1)u==-2||2==u||f==-2||2==f||0==u&&0==f?i[n+u][a+f]=!0:i[n+u][a+f]=!1}},w=function(r){for(var t=QRUtil.getBCHTypeNumber(o),e=0;e<18;e+=1){var n=!r&&1==(t>>e&1);i[Math.floor(e/3)][e%3+u-8-3]=n}for(var e=0;e<18;e+=1){var n=!r&&1==(t>>e&1);i[e%3+u-8-3][Math.floor(e/3)]=n}},y=function(r,t){for(var e=a<<3|t,n=QRUtil.getBCHTypeInfo(e),o=0;o<15;o+=1){var f=!r&&1==(n>>o&1);o<6?i[o][8]=f:o<8?i[o+1][8]=f:i[u-15+o][8]=f}for(var o=0;o<15;o+=1){var f=!r&&1==(n>>o&1);o<8?i[8][u-o-1]=f:o<9?i[8][15-o-1+1]=f:i[8][15-o-1]=f}i[u-8][8]=!r},M=function(r,t){for(var e=-1,n=u-1,o=7,a=0,f=QRUtil.getMaskFunction(t),c=u-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var g=0;g<2;g+=1)if(null==i[n][c-g]){var l=!1;a<r.length&&(l=1==(r[a]>>>o&1));var h=f(n,c-g);h&&(l=!l),i[n][c-g]=l,o-=1,o==-1&&(a+=1,o=7)}if(n+=e,n<0||u<=n){n-=e,e=-e;break}}},B=function(r,t){for(var e=0,n=0,o=0,a=new Array(t.length),i=new Array(t.length),u=0;u<t.length;u+=1){var f=t[u].dataCount,c=t[u].totalCount-f;n=Math.max(n,f),o=Math.max(o,c),a[u]=new Array(f);for(var g=0;g<a[u].length;g+=1)a[u][g]=255&r.getBuffer()[g+e];e+=f;var l=QRUtil.getErrorCorrectPolynomial(c),h=qrPolynomial(a[u],l.getLength()-1),v=h.mod(l);i[u]=new Array(l.getLength()-1);for(var g=0;g<i[u].length;g+=1){var s=g+v.getLength()-i[u].length;i[u][g]=s>=0?v.getAt(s):0}}for(var d=0,g=0;g<t.length;g+=1)d+=t[g].totalCount;for(var w=new Array(d),y=0,g=0;g<n;g+=1)for(var u=0;u<t.length;u+=1)g<a[u].length&&(w[y]=a[u][g],y+=1);for(var g=0;g<o;g+=1)for(var u=0;u<t.length;u+=1)g<i[u].length&&(w[y]=i[u][g],y+=1);return w},p=function(r,t,o){for(var a=QRRSBlock.getRSBlocks(r,t),i=qrBitBuffer(),u=0;u<o.length;u+=1){var f=o[u];i.put(f.getMode(),4),i.put(f.getLength(),QRUtil.getLengthInBits(f.getMode(),r)),f.write(i)}for(var c=0,u=0;u<a.length;u+=1)c+=a[u].dataCount;if(i.getLengthInBits()>8*c)throw new Error("code length overflow. ("+i.getLengthInBits()+">"+8*c+")");for(i.getLengthInBits()+4<=8*c&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(!1);for(;;){if(i.getLengthInBits()>=8*c)break;if(i.put(e,8),i.getLengthInBits()>=8*c)break;i.put(n,8)}return B(i,a)};return g.addData=function(r){var t=qr8BitByte(r);c.push(t),f=null},g.isDark=function(r,t){if(r<0||u<=r||t<0||u<=t)throw new Error(r+","+t);return i[r][t]},g.getModuleCount=function(){return u},g.make=function(){l(!1,v())},g.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='<table style="',e+=" border-width: 0upx; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0upx; margin: "+t+"upx;",e+='">',e+="<tbody>";for(var n=0;n<g.getModuleCount();n+=1){e+="<tr>";for(var o=0;o<g.getModuleCount();o+=1)e+='<td style="',e+=" border-width: 0upx; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0upx; margin: 0upx;",e+=" width: "+r+"upx;",e+=" height: "+r+"upx;",e+=" background-color: ",e+=g.isDark(n,o)?"#000000":"#ffffff",e+=";",e+='"/>';e+="</tr>"}return e+="</tbody>",e+="</table>"},g.createImgTag=function(r,t,e){r=r||2,t="undefined"==typeof t?4*r:t;var n=t,o=g.getModuleCount()*r+t;return createImgTag(e,e,function(t,e){if(n<=t&&t<o&&n<=e&&e<o){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return g.isDark(i,a)?0:1}return 1})},g};qrcode.stringToBytes=function(r){for(var t=new Array,e=0;e<r.length;e+=1){var n=r.charCodeAt(e);t.push(255&n)}return t},qrcode.createStringToBytes=function(r,t){var e=function(){for(var e=base64DecodeInputStream(r),n=function(){var r=e.read();if(r==-1)throw new Error;return r},o=0,a={};;){var i=e.read();if(i==-1)break;var u=n(),f=n(),c=n(),g=String.fromCharCode(i<<8|u),l=f<<8|c;a[g]=l,o+=1}if(o!=t)throw new Error(o+" != "+t);return a}(),n="?".charCodeAt(0);return function(r){for(var t=new Array,o=0;o<r.length;o+=1){var a=r.charCodeAt(o);if(a<128)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var QRMode={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},QRErrorCorrectLevel={L:1,M:0,Q:3,H:2},QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},QRUtil=function(){var r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],t=1335,e=7973,n=21522,o={},a=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return o.getBCHTypeInfo=function(r){for(var e=r<<10;a(e)-a(t)>=0;)e^=t<<a(e)-a(t);return(r<<10|e)^n},o.getBCHTypeNumber=function(r){for(var t=r<<12;a(t)-a(e)>=0;)t^=e<<a(t)-a(e);return r<<12|t},o.getPatternPosition=function(t){return r[t-1]},o.getMaskFunction=function(r){switch(r){case QRMaskPattern.PATTERN000:return function(r,t){return(r+t)%2==0};case QRMaskPattern.PATTERN001:return function(r,t){return r%2==0};case QRMaskPattern.PATTERN010:return function(r,t){return t%3==0};case QRMaskPattern.PATTERN011:return function(r,t){return(r+t)%3==0};case QRMaskPattern.PATTERN100:return function(r,t){return(Math.floor(r/2)+Math.floor(t/3))%2==0};case QRMaskPattern.PATTERN101:return function(r,t){return r*t%2+r*t%3==0};case QRMaskPattern.PATTERN110:return function(r,t){return(r*t%2+r*t%3)%2==0};case QRMaskPattern.PATTERN111:return function(r,t){return(r*t%3+(r+t)%2)%2==0};default:throw new Error("bad maskPattern:"+r)}},o.getErrorCorrectPolynomial=function(r){for(var t=qrPolynomial([1],0),e=0;e<r;e+=1)t=t.multiply(qrPolynomial([1,QRMath.gexp(e)],0));return t},o.getLengthInBits=function(r,t){if(1<=t&&t<10)switch(r){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(t<27)switch(r){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(t<41))throw new Error("type:"+t);switch(r){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},o.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;n<t;n+=1)for(var o=0;o<t;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;u<=1;u+=1)if(!(n+u<0||t<=n+u))for(var f=-1;f<=1;f+=1)o+f<0||t<=o+f||0==u&&0==f||i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;n<t-1;n+=1)for(var o=0;o<t-1;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),0!=c&&4!=c||(e+=3)}for(var n=0;n<t;n+=1)for(var o=0;o<t-6;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;o<t;o+=1)for(var n=0;n<t-6;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var g=0,o=0;o<t;o+=1)for(var n=0;n<t;n+=1)r.isDark(n,o)&&(g+=1);var l=Math.abs(100*g/t/t-50)/5;return e+=10*l},o}(),QRMath=function(){for(var r=new Array(256),t=new Array(256),e=0;e<8;e+=1)r[e]=1<<e;for(var e=8;e<256;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;e<255;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(r<1)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;t<0;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),QRRSBlock=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},n=function(t,e){switch(e){case QRErrorCorrectLevel.L:return r[4*(t-1)+0];case QRErrorCorrectLevel.M:return r[4*(t-1)+1];case QRErrorCorrectLevel.Q:return r[4*(t-1)+2];case QRErrorCorrectLevel.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var o=n(r,e);if("undefined"==typeof o)throw new Error("bad rs block [url=home.php?mod=space&uid=5302]@[/url] typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=o.length/3,i=new Array,u=0;u<a;u+=1)for(var f=o[3*u+0],c=o[3*u+1],g=o[3*u+2],l=0;l<f;l+=1)i.push(t(c,g));return i},e}(),qrBitBuffer=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;n<t;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},qr8BitByte=function(r){for(var t=QRMode.MODE_8BIT_BYTE,e=r,n=[],o={},a=0,i=e.length;a<i;a++){var u=[],f=e.charCodeAt(a);f>65536?(u[0]=240|(1835008&f)>>>18,u[1]=128|(258048&f)>>>12,u[2]=128|(4032&f)>>>6,u[3]=128|63&f):f>2048?(u[0]=224|(61440&f)>>>12,u[1]=128|(4032&f)>>>6,u[2]=128|63&f):f>128?(u[0]=192|(1984&f)>>>6,u[1]=128|63&f):u[0]=f,n.push(u)}n=Array.prototype.concat.apply([],n),n.length!=e.length&&(n.unshift(191),n.unshift(187),n.unshift(239));var c=n;return o.getMode=function(){return t},o.getLength=function(r){return c.length},o.write=function(r){for(var t=0;t<c.length;t+=1)r.put(c[t],8)},o},byteArrayOutputStream=function(){var r=new Array,t={};return t.writeByte=function(t){r.push(255&t)},t.writeShort=function(r){t.writeByte(r),t.writeByte(r>>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;o<n;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e<r.length;e+=1)t.writeByte(r.charCodeAt(e))},t.toByteArray=function(){return r},t.toString=function(){var t="";t+="[";for(var e=0;e<r.length;e+=1)e>0&&(t+=","),t+=r[e];return t+="]"},t},base64EncodeOutputStream=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(r<0);else{if(r<26)return 65+r;if(r<52)return 97+(r-26);if(r<62)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;i<o;i+=1)n+="="},o.toString=function(){return n},o},base64DecodeInputStream=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;o<8;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(65<=r&&r<=90)return r-65;if(97<=r&&r<=122)return r-97+26;if(48<=r&&r<=57)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},gifImage=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<<e|n)),o-=8-e,r>>>=8-e,n=0,e=0;n|=r<<e,e+=o},o.flush=function(){e>0&&t.writeByte(n)},o},u=function(r){for(var t=1<<r,e=(1<<r)+1,n=r+1,a=f(),u=0;u<t;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=byteArrayOutputStream(),g=i(c);g.write(t,n);var l=0,h=String.fromCharCode(o[l]);for(l+=1;l<o.length;){var v=String.fromCharCode(o[l]);l+=1,a.contains(h+v)?h+=v:(g.write(a.indexOf(h),n),a.size()<4095&&(a.size()==1<<n&&(n+=1),a.add(h+v)),h=v)}return g.write(a.indexOf(h),n),g.write(e,n),g.flush(),c.toByteArray()},f=function(){var r={},t=0,e={};return e.add=function(n){if(e.contains(n))throw new Error("dup key:"+n);r[n]=t,t+=1},e.size=function(){return t},e.indexOf=function(t){return r[t]},e.contains=function(t){return"undefined"!=typeof r[t]},e};return a},createImgTag=function(r,t,e,n){for(var o=gifImage(r,t),a=0;a<t;a+=1)for(var i=0;i<r;i+=1)o.setPixel(i,a,e(i,a));var u=byteArrayOutputStream();o.write(u);for(var f=base64EncodeOutputStream(),c=u.toByteArray(),g=0;g<c.length;g+=1)f.writeByte(c[g]);f.flush();var l="";return l+="data:image/gif;base64,",l+=f},createQrCodeImg=function(r,t){t=t||{};var e,n=t.typeNumber||4,o=t.errorCorrectLevel||"M",a=t.size||500;try{e=qrcode(n,o||"M"),e.addData(r),e.make()}catch(t){if(n>=40)throw new Error("Text too long to encode");return gen(r,{size:a,errorCorrectLevel:o,typeNumber:n+1})}var i=parseInt(a/e.getModuleCount()),u=parseInt((a-e.getModuleCount()*i)/2);return e.createImgTag(i,u,a)};module.exports={createQrCodeImg:createQrCodeImg};
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册