Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
U
uni-pdtravel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
panyongping
uni-pdtravel
Commits
480c39de
Commit
480c39de
authored
Mar 17, 2023
by
qipeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
订单详情
parent
15a4a3db
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2465 additions
and
0 deletions
+2465
-0
uqrcode.js
common/js/uqrcode.js
+1440
-0
pages.json
pages.json
+9
-0
electronicTicketNew.vue
pages/my/order/electronicTicketNew/electronicTicketNew.vue
+981
-0
project.config.json
project.config.json
+28
-0
project.private.config.json
project.private.config.json
+7
-0
icon01.png
static/img/my/icon01.png
+0
-0
No files found.
common/js/uqrcode.js
0 → 100644
View file @
480c39de
// uqrcode.js
//---------------------------------------------------------------------
// github https://github.com/Sansnn/uQRCode
//---------------------------------------------------------------------
let
uQRCode
=
{};
(
function
()
{
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// QR8bitByte
//---------------------------------------------------------------------
function
QR8bitByte
(
data
)
{
this
.
mode
=
QRMode
.
MODE_8BIT_BYTE
;
this
.
data
=
data
;
}
QR8bitByte
.
prototype
=
{
getLength
:
function
(
buffer
)
{
return
this
.
data
.
length
;
},
write
:
function
(
buffer
)
{
for
(
var
i
=
0
;
i
<
this
.
data
.
length
;
i
++
)
{
// not JIS ...
buffer
.
put
(
this
.
data
.
charCodeAt
(
i
),
8
);
}
}
};
//---------------------------------------------------------------------
// QRCode
//---------------------------------------------------------------------
function
QRCode
(
typeNumber
,
errorCorrectLevel
)
{
this
.
typeNumber
=
typeNumber
;
this
.
errorCorrectLevel
=
errorCorrectLevel
;
this
.
modules
=
null
;
this
.
moduleCount
=
0
;
this
.
dataCache
=
null
;
this
.
dataList
=
new
Array
();
}
QRCode
.
prototype
=
{
addData
:
function
(
data
)
{
var
newData
=
new
QR8bitByte
(
data
);
this
.
dataList
.
push
(
newData
);
this
.
dataCache
=
null
;
},
isDark
:
function
(
row
,
col
)
{
if
(
row
<
0
||
this
.
moduleCount
<=
row
||
col
<
0
||
this
.
moduleCount
<=
col
)
{
throw
new
Error
(
row
+
","
+
col
);
}
return
this
.
modules
[
row
][
col
];
},
getModuleCount
:
function
()
{
return
this
.
moduleCount
;
},
make
:
function
()
{
// Calculate automatically typeNumber if provided is < 1
if
(
this
.
typeNumber
<
1
)
{
var
typeNumber
=
1
;
for
(
typeNumber
=
1
;
typeNumber
<
40
;
typeNumber
++
)
{
var
rsBlocks
=
QRRSBlock
.
getRSBlocks
(
typeNumber
,
this
.
errorCorrectLevel
);
var
buffer
=
new
QRBitBuffer
();
var
totalDataCount
=
0
;
for
(
var
i
=
0
;
i
<
rsBlocks
.
length
;
i
++
)
{
totalDataCount
+=
rsBlocks
[
i
].
dataCount
;
}
for
(
var
i
=
0
;
i
<
this
.
dataList
.
length
;
i
++
)
{
var
data
=
this
.
dataList
[
i
];
buffer
.
put
(
data
.
mode
,
4
);
buffer
.
put
(
data
.
getLength
(),
QRUtil
.
getLengthInBits
(
data
.
mode
,
typeNumber
));
data
.
write
(
buffer
);
}
if
(
buffer
.
getLengthInBits
()
<=
totalDataCount
*
8
)
break
;
}
this
.
typeNumber
=
typeNumber
;
}
this
.
makeImpl
(
false
,
this
.
getBestMaskPattern
());
},
makeImpl
:
function
(
test
,
maskPattern
)
{
this
.
moduleCount
=
this
.
typeNumber
*
4
+
17
;
this
.
modules
=
new
Array
(
this
.
moduleCount
);
for
(
var
row
=
0
;
row
<
this
.
moduleCount
;
row
++
)
{
this
.
modules
[
row
]
=
new
Array
(
this
.
moduleCount
);
for
(
var
col
=
0
;
col
<
this
.
moduleCount
;
col
++
)
{
this
.
modules
[
row
][
col
]
=
null
;
//(col + row) % 3;
}
}
this
.
setupPositionProbePattern
(
0
,
0
);
this
.
setupPositionProbePattern
(
this
.
moduleCount
-
7
,
0
);
this
.
setupPositionProbePattern
(
0
,
this
.
moduleCount
-
7
);
this
.
setupPositionAdjustPattern
();
this
.
setupTimingPattern
();
this
.
setupTypeInfo
(
test
,
maskPattern
);
if
(
this
.
typeNumber
>=
7
)
{
this
.
setupTypeNumber
(
test
);
}
if
(
this
.
dataCache
==
null
)
{
this
.
dataCache
=
QRCode
.
createData
(
this
.
typeNumber
,
this
.
errorCorrectLevel
,
this
.
dataList
);
}
this
.
mapData
(
this
.
dataCache
,
maskPattern
);
},
setupPositionProbePattern
:
function
(
row
,
col
)
{
for
(
var
r
=
-
1
;
r
<=
7
;
r
++
)
{
if
(
row
+
r
<=
-
1
||
this
.
moduleCount
<=
row
+
r
)
continue
;
for
(
var
c
=
-
1
;
c
<=
7
;
c
++
)
{
if
(
col
+
c
<=
-
1
||
this
.
moduleCount
<=
col
+
c
)
continue
;
if
((
0
<=
r
&&
r
<=
6
&&
(
c
==
0
||
c
==
6
))
||
(
0
<=
c
&&
c
<=
6
&&
(
r
==
0
||
r
==
6
))
||
(
2
<=
r
&&
r
<=
4
&&
2
<=
c
&&
c
<=
4
))
{
this
.
modules
[
row
+
r
][
col
+
c
]
=
true
;
}
else
{
this
.
modules
[
row
+
r
][
col
+
c
]
=
false
;
}
}
}
},
getBestMaskPattern
:
function
()
{
var
minLostPoint
=
0
;
var
pattern
=
0
;
for
(
var
i
=
0
;
i
<
8
;
i
++
)
{
this
.
makeImpl
(
true
,
i
);
var
lostPoint
=
QRUtil
.
getLostPoint
(
this
);
if
(
i
==
0
||
minLostPoint
>
lostPoint
)
{
minLostPoint
=
lostPoint
;
pattern
=
i
;
}
}
return
pattern
;
},
createMovieClip
:
function
(
target_mc
,
instance_name
,
depth
)
{
var
qr_mc
=
target_mc
.
createEmptyMovieClip
(
instance_name
,
depth
);
var
cs
=
1
;
this
.
make
();
for
(
var
row
=
0
;
row
<
this
.
modules
.
length
;
row
++
)
{
var
y
=
row
*
cs
;
for
(
var
col
=
0
;
col
<
this
.
modules
[
row
].
length
;
col
++
)
{
var
x
=
col
*
cs
;
var
dark
=
this
.
modules
[
row
][
col
];
if
(
dark
)
{
qr_mc
.
beginFill
(
0
,
100
);
qr_mc
.
moveTo
(
x
,
y
);
qr_mc
.
lineTo
(
x
+
cs
,
y
);
qr_mc
.
lineTo
(
x
+
cs
,
y
+
cs
);
qr_mc
.
lineTo
(
x
,
y
+
cs
);
qr_mc
.
endFill
();
}
}
}
return
qr_mc
;
},
setupTimingPattern
:
function
()
{
for
(
var
r
=
8
;
r
<
this
.
moduleCount
-
8
;
r
++
)
{
if
(
this
.
modules
[
r
][
6
]
!=
null
)
{
continue
;
}
this
.
modules
[
r
][
6
]
=
(
r
%
2
==
0
);
}
for
(
var
c
=
8
;
c
<
this
.
moduleCount
-
8
;
c
++
)
{
if
(
this
.
modules
[
6
][
c
]
!=
null
)
{
continue
;
}
this
.
modules
[
6
][
c
]
=
(
c
%
2
==
0
);
}
},
setupPositionAdjustPattern
:
function
()
{
var
pos
=
QRUtil
.
getPatternPosition
(
this
.
typeNumber
);
for
(
var
i
=
0
;
i
<
pos
.
length
;
i
++
)
{
for
(
var
j
=
0
;
j
<
pos
.
length
;
j
++
)
{
var
row
=
pos
[
i
];
var
col
=
pos
[
j
];
if
(
this
.
modules
[
row
][
col
]
!=
null
)
{
continue
;
}
for
(
var
r
=
-
2
;
r
<=
2
;
r
++
)
{
for
(
var
c
=
-
2
;
c
<=
2
;
c
++
)
{
if
(
r
==
-
2
||
r
==
2
||
c
==
-
2
||
c
==
2
||
(
r
==
0
&&
c
==
0
))
{
this
.
modules
[
row
+
r
][
col
+
c
]
=
true
;
}
else
{
this
.
modules
[
row
+
r
][
col
+
c
]
=
false
;
}
}
}
}
}
},
setupTypeNumber
:
function
(
test
)
{
var
bits
=
QRUtil
.
getBCHTypeNumber
(
this
.
typeNumber
);
for
(
var
i
=
0
;
i
<
18
;
i
++
)
{
var
mod
=
(
!
test
&&
((
bits
>>
i
)
&
1
)
==
1
);
this
.
modules
[
Math
.
floor
(
i
/
3
)][
i
%
3
+
this
.
moduleCount
-
8
-
3
]
=
mod
;
}
for
(
var
i
=
0
;
i
<
18
;
i
++
)
{
var
mod
=
(
!
test
&&
((
bits
>>
i
)
&
1
)
==
1
);
this
.
modules
[
i
%
3
+
this
.
moduleCount
-
8
-
3
][
Math
.
floor
(
i
/
3
)]
=
mod
;
}
},
setupTypeInfo
:
function
(
test
,
maskPattern
)
{
var
data
=
(
this
.
errorCorrectLevel
<<
3
)
|
maskPattern
;
var
bits
=
QRUtil
.
getBCHTypeInfo
(
data
);
// vertical
for
(
var
i
=
0
;
i
<
15
;
i
++
)
{
var
mod
=
(
!
test
&&
((
bits
>>
i
)
&
1
)
==
1
);
if
(
i
<
6
)
{
this
.
modules
[
i
][
8
]
=
mod
;
}
else
if
(
i
<
8
)
{
this
.
modules
[
i
+
1
][
8
]
=
mod
;
}
else
{
this
.
modules
[
this
.
moduleCount
-
15
+
i
][
8
]
=
mod
;
}
}
// horizontal
for
(
var
i
=
0
;
i
<
15
;
i
++
)
{
var
mod
=
(
!
test
&&
((
bits
>>
i
)
&
1
)
==
1
);
if
(
i
<
8
)
{
this
.
modules
[
8
][
this
.
moduleCount
-
i
-
1
]
=
mod
;
}
else
if
(
i
<
9
)
{
this
.
modules
[
8
][
15
-
i
-
1
+
1
]
=
mod
;
}
else
{
this
.
modules
[
8
][
15
-
i
-
1
]
=
mod
;
}
}
// fixed module
this
.
modules
[
this
.
moduleCount
-
8
][
8
]
=
(
!
test
);
},
mapData
:
function
(
data
,
maskPattern
)
{
var
inc
=
-
1
;
var
row
=
this
.
moduleCount
-
1
;
var
bitIndex
=
7
;
var
byteIndex
=
0
;
for
(
var
col
=
this
.
moduleCount
-
1
;
col
>
0
;
col
-=
2
)
{
if
(
col
==
6
)
col
--
;
while
(
true
)
{
for
(
var
c
=
0
;
c
<
2
;
c
++
)
{
if
(
this
.
modules
[
row
][
col
-
c
]
==
null
)
{
var
dark
=
false
;
if
(
byteIndex
<
data
.
length
)
{
dark
=
(((
data
[
byteIndex
]
>>>
bitIndex
)
&
1
)
==
1
);
}
var
mask
=
QRUtil
.
getMask
(
maskPattern
,
row
,
col
-
c
);
if
(
mask
)
{
dark
=
!
dark
;
}
this
.
modules
[
row
][
col
-
c
]
=
dark
;
bitIndex
--
;
if
(
bitIndex
==
-
1
)
{
byteIndex
++
;
bitIndex
=
7
;
}
}
}
row
+=
inc
;
if
(
row
<
0
||
this
.
moduleCount
<=
row
)
{
row
-=
inc
;
inc
=
-
inc
;
break
;
}
}
}
}
};
QRCode
.
PAD0
=
0xEC
;
QRCode
.
PAD1
=
0x11
;
QRCode
.
createData
=
function
(
typeNumber
,
errorCorrectLevel
,
dataList
)
{
var
rsBlocks
=
QRRSBlock
.
getRSBlocks
(
typeNumber
,
errorCorrectLevel
);
var
buffer
=
new
QRBitBuffer
();
for
(
var
i
=
0
;
i
<
dataList
.
length
;
i
++
)
{
var
data
=
dataList
[
i
];
buffer
.
put
(
data
.
mode
,
4
);
buffer
.
put
(
data
.
getLength
(),
QRUtil
.
getLengthInBits
(
data
.
mode
,
typeNumber
));
data
.
write
(
buffer
);
}
// calc num max data.
var
totalDataCount
=
0
;
for
(
var
i
=
0
;
i
<
rsBlocks
.
length
;
i
++
)
{
totalDataCount
+=
rsBlocks
[
i
].
dataCount
;
}
if
(
buffer
.
getLengthInBits
()
>
totalDataCount
*
8
)
{
throw
new
Error
(
"code length overflow. ("
+
buffer
.
getLengthInBits
()
+
">"
+
totalDataCount
*
8
+
")"
);
}
// end code
if
(
buffer
.
getLengthInBits
()
+
4
<=
totalDataCount
*
8
)
{
buffer
.
put
(
0
,
4
);
}
// padding
while
(
buffer
.
getLengthInBits
()
%
8
!=
0
)
{
buffer
.
putBit
(
false
);
}
// padding
while
(
true
)
{
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
)
{
break
;
}
buffer
.
put
(
QRCode
.
PAD0
,
8
);
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
)
{
break
;
}
buffer
.
put
(
QRCode
.
PAD1
,
8
);
}
return
QRCode
.
createBytes
(
buffer
,
rsBlocks
);
}
QRCode
.
createBytes
=
function
(
buffer
,
rsBlocks
)
{
var
offset
=
0
;
var
maxDcCount
=
0
;
var
maxEcCount
=
0
;
var
dcdata
=
new
Array
(
rsBlocks
.
length
);
var
ecdata
=
new
Array
(
rsBlocks
.
length
);
for
(
var
r
=
0
;
r
<
rsBlocks
.
length
;
r
++
)
{
var
dcCount
=
rsBlocks
[
r
].
dataCount
;
var
ecCount
=
rsBlocks
[
r
].
totalCount
-
dcCount
;
maxDcCount
=
Math
.
max
(
maxDcCount
,
dcCount
);
maxEcCount
=
Math
.
max
(
maxEcCount
,
ecCount
);
dcdata
[
r
]
=
new
Array
(
dcCount
);
for
(
var
i
=
0
;
i
<
dcdata
[
r
].
length
;
i
++
)
{
dcdata
[
r
][
i
]
=
0xff
&
buffer
.
buffer
[
i
+
offset
];
}
offset
+=
dcCount
;
var
rsPoly
=
QRUtil
.
getErrorCorrectPolynomial
(
ecCount
);
var
rawPoly
=
new
QRPolynomial
(
dcdata
[
r
],
rsPoly
.
getLength
()
-
1
);
var
modPoly
=
rawPoly
.
mod
(
rsPoly
);
ecdata
[
r
]
=
new
Array
(
rsPoly
.
getLength
()
-
1
);
for
(
var
i
=
0
;
i
<
ecdata
[
r
].
length
;
i
++
)
{
var
modIndex
=
i
+
modPoly
.
getLength
()
-
ecdata
[
r
].
length
;
ecdata
[
r
][
i
]
=
(
modIndex
>=
0
)
?
modPoly
.
get
(
modIndex
)
:
0
;
}
}
var
totalCodeCount
=
0
;
for
(
var
i
=
0
;
i
<
rsBlocks
.
length
;
i
++
)
{
totalCodeCount
+=
rsBlocks
[
i
].
totalCount
;
}
var
data
=
new
Array
(
totalCodeCount
);
var
index
=
0
;
for
(
var
i
=
0
;
i
<
maxDcCount
;
i
++
)
{
for
(
var
r
=
0
;
r
<
rsBlocks
.
length
;
r
++
)
{
if
(
i
<
dcdata
[
r
].
length
)
{
data
[
index
++
]
=
dcdata
[
r
][
i
];
}
}
}
for
(
var
i
=
0
;
i
<
maxEcCount
;
i
++
)
{
for
(
var
r
=
0
;
r
<
rsBlocks
.
length
;
r
++
)
{
if
(
i
<
ecdata
[
r
].
length
)
{
data
[
index
++
]
=
ecdata
[
r
][
i
];
}
}
}
return
data
;
}
//---------------------------------------------------------------------
// QRMode
//---------------------------------------------------------------------
var
QRMode
=
{
MODE_NUMBER
:
1
<<
0
,
MODE_ALPHA_NUM
:
1
<<
1
,
MODE_8BIT_BYTE
:
1
<<
2
,
MODE_KANJI
:
1
<<
3
};
//---------------------------------------------------------------------
// QRErrorCorrectLevel
//---------------------------------------------------------------------
var
QRErrorCorrectLevel
=
{
L
:
1
,
M
:
0
,
Q
:
3
,
H
:
2
};
//---------------------------------------------------------------------
// QRMaskPattern
//---------------------------------------------------------------------
var
QRMaskPattern
=
{
PATTERN000
:
0
,
PATTERN001
:
1
,
PATTERN010
:
2
,
PATTERN011
:
3
,
PATTERN100
:
4
,
PATTERN101
:
5
,
PATTERN110
:
6
,
PATTERN111
:
7
};
//---------------------------------------------------------------------
// QRUtil
//---------------------------------------------------------------------
var
QRUtil
=
{
PATTERN_POSITION_TABLE
:
[
[],
[
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
]
],
G15
:
(
1
<<
10
)
|
(
1
<<
8
)
|
(
1
<<
5
)
|
(
1
<<
4
)
|
(
1
<<
2
)
|
(
1
<<
1
)
|
(
1
<<
0
),
G18
:
(
1
<<
12
)
|
(
1
<<
11
)
|
(
1
<<
10
)
|
(
1
<<
9
)
|
(
1
<<
8
)
|
(
1
<<
5
)
|
(
1
<<
2
)
|
(
1
<<
0
),
G15_MASK
:
(
1
<<
14
)
|
(
1
<<
12
)
|
(
1
<<
10
)
|
(
1
<<
4
)
|
(
1
<<
1
),
getBCHTypeInfo
:
function
(
data
)
{
var
d
=
data
<<
10
;
while
(
QRUtil
.
getBCHDigit
(
d
)
-
QRUtil
.
getBCHDigit
(
QRUtil
.
G15
)
>=
0
)
{
d
^=
(
QRUtil
.
G15
<<
(
QRUtil
.
getBCHDigit
(
d
)
-
QRUtil
.
getBCHDigit
(
QRUtil
.
G15
)));
}
return
((
data
<<
10
)
|
d
)
^
QRUtil
.
G15_MASK
;
},
getBCHTypeNumber
:
function
(
data
)
{
var
d
=
data
<<
12
;
while
(
QRUtil
.
getBCHDigit
(
d
)
-
QRUtil
.
getBCHDigit
(
QRUtil
.
G18
)
>=
0
)
{
d
^=
(
QRUtil
.
G18
<<
(
QRUtil
.
getBCHDigit
(
d
)
-
QRUtil
.
getBCHDigit
(
QRUtil
.
G18
)));
}
return
(
data
<<
12
)
|
d
;
},
getBCHDigit
:
function
(
data
)
{
var
digit
=
0
;
while
(
data
!=
0
)
{
digit
++
;
data
>>>=
1
;
}
return
digit
;
},
getPatternPosition
:
function
(
typeNumber
)
{
return
QRUtil
.
PATTERN_POSITION_TABLE
[
typeNumber
-
1
];
},
getMask
:
function
(
maskPattern
,
i
,
j
)
{
switch
(
maskPattern
)
{
case
QRMaskPattern
.
PATTERN000
:
return
(
i
+
j
)
%
2
==
0
;
case
QRMaskPattern
.
PATTERN001
:
return
i
%
2
==
0
;
case
QRMaskPattern
.
PATTERN010
:
return
j
%
3
==
0
;
case
QRMaskPattern
.
PATTERN011
:
return
(
i
+
j
)
%
3
==
0
;
case
QRMaskPattern
.
PATTERN100
:
return
(
Math
.
floor
(
i
/
2
)
+
Math
.
floor
(
j
/
3
))
%
2
==
0
;
case
QRMaskPattern
.
PATTERN101
:
return
(
i
*
j
)
%
2
+
(
i
*
j
)
%
3
==
0
;
case
QRMaskPattern
.
PATTERN110
:
return
((
i
*
j
)
%
2
+
(
i
*
j
)
%
3
)
%
2
==
0
;
case
QRMaskPattern
.
PATTERN111
:
return
((
i
*
j
)
%
3
+
(
i
+
j
)
%
2
)
%
2
==
0
;
default
:
throw
new
Error
(
"bad maskPattern:"
+
maskPattern
);
}
},
getErrorCorrectPolynomial
:
function
(
errorCorrectLength
)
{
var
a
=
new
QRPolynomial
([
1
],
0
);
for
(
var
i
=
0
;
i
<
errorCorrectLength
;
i
++
)
{
a
=
a
.
multiply
(
new
QRPolynomial
([
1
,
QRMath
.
gexp
(
i
)],
0
));
}
return
a
;
},
getLengthInBits
:
function
(
mode
,
type
)
{
if
(
1
<=
type
&&
type
<
10
)
{
// 1 - 9
switch
(
mode
)
{
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:"
+
mode
);
}
}
else
if
(
type
<
27
)
{
// 10 - 26
switch
(
mode
)
{
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:"
+
mode
);
}
}
else
if
(
type
<
41
)
{
// 27 - 40
switch
(
mode
)
{
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:"
+
mode
);
}
}
else
{
throw
new
Error
(
"type:"
+
type
);
}
},
getLostPoint
:
function
(
qrCode
)
{
var
moduleCount
=
qrCode
.
getModuleCount
();
var
lostPoint
=
0
;
// LEVEL1
for
(
var
row
=
0
;
row
<
moduleCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
moduleCount
;
col
++
)
{
var
sameCount
=
0
;
var
dark
=
qrCode
.
isDark
(
row
,
col
);
for
(
var
r
=
-
1
;
r
<=
1
;
r
++
)
{
if
(
row
+
r
<
0
||
moduleCount
<=
row
+
r
)
{
continue
;
}
for
(
var
c
=
-
1
;
c
<=
1
;
c
++
)
{
if
(
col
+
c
<
0
||
moduleCount
<=
col
+
c
)
{
continue
;
}
if
(
r
==
0
&&
c
==
0
)
{
continue
;
}
if
(
dark
==
qrCode
.
isDark
(
row
+
r
,
col
+
c
))
{
sameCount
++
;
}
}
}
if
(
sameCount
>
5
)
{
lostPoint
+=
(
3
+
sameCount
-
5
);
}
}
}
// LEVEL2
for
(
var
row
=
0
;
row
<
moduleCount
-
1
;
row
++
)
{
for
(
var
col
=
0
;
col
<
moduleCount
-
1
;
col
++
)
{
var
count
=
0
;
if
(
qrCode
.
isDark
(
row
,
col
))
count
++
;
if
(
qrCode
.
isDark
(
row
+
1
,
col
))
count
++
;
if
(
qrCode
.
isDark
(
row
,
col
+
1
))
count
++
;
if
(
qrCode
.
isDark
(
row
+
1
,
col
+
1
))
count
++
;
if
(
count
==
0
||
count
==
4
)
{
lostPoint
+=
3
;
}
}
}
// LEVEL3
for
(
var
row
=
0
;
row
<
moduleCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
moduleCount
-
6
;
col
++
)
{
if
(
qrCode
.
isDark
(
row
,
col
)
&&
!
qrCode
.
isDark
(
row
,
col
+
1
)
&&
qrCode
.
isDark
(
row
,
col
+
2
)
&&
qrCode
.
isDark
(
row
,
col
+
3
)
&&
qrCode
.
isDark
(
row
,
col
+
4
)
&&
!
qrCode
.
isDark
(
row
,
col
+
5
)
&&
qrCode
.
isDark
(
row
,
col
+
6
))
{
lostPoint
+=
40
;
}
}
}
for
(
var
col
=
0
;
col
<
moduleCount
;
col
++
)
{
for
(
var
row
=
0
;
row
<
moduleCount
-
6
;
row
++
)
{
if
(
qrCode
.
isDark
(
row
,
col
)
&&
!
qrCode
.
isDark
(
row
+
1
,
col
)
&&
qrCode
.
isDark
(
row
+
2
,
col
)
&&
qrCode
.
isDark
(
row
+
3
,
col
)
&&
qrCode
.
isDark
(
row
+
4
,
col
)
&&
!
qrCode
.
isDark
(
row
+
5
,
col
)
&&
qrCode
.
isDark
(
row
+
6
,
col
))
{
lostPoint
+=
40
;
}
}
}
// LEVEL4
var
darkCount
=
0
;
for
(
var
col
=
0
;
col
<
moduleCount
;
col
++
)
{
for
(
var
row
=
0
;
row
<
moduleCount
;
row
++
)
{
if
(
qrCode
.
isDark
(
row
,
col
))
{
darkCount
++
;
}
}
}
var
ratio
=
Math
.
abs
(
100
*
darkCount
/
moduleCount
/
moduleCount
-
50
)
/
5
;
lostPoint
+=
ratio
*
10
;
return
lostPoint
;
}
};
//---------------------------------------------------------------------
// QRMath
//---------------------------------------------------------------------
var
QRMath
=
{
glog
:
function
(
n
)
{
if
(
n
<
1
)
{
throw
new
Error
(
"glog("
+
n
+
")"
);
}
return
QRMath
.
LOG_TABLE
[
n
];
},
gexp
:
function
(
n
)
{
while
(
n
<
0
)
{
n
+=
255
;
}
while
(
n
>=
256
)
{
n
-=
255
;
}
return
QRMath
.
EXP_TABLE
[
n
];
},
EXP_TABLE
:
new
Array
(
256
),
LOG_TABLE
:
new
Array
(
256
)
};
for
(
var
i
=
0
;
i
<
8
;
i
++
)
{
QRMath
.
EXP_TABLE
[
i
]
=
1
<<
i
;
}
for
(
var
i
=
8
;
i
<
256
;
i
++
)
{
QRMath
.
EXP_TABLE
[
i
]
=
QRMath
.
EXP_TABLE
[
i
-
4
]
^
QRMath
.
EXP_TABLE
[
i
-
5
]
^
QRMath
.
EXP_TABLE
[
i
-
6
]
^
QRMath
.
EXP_TABLE
[
i
-
8
];
}
for
(
var
i
=
0
;
i
<
255
;
i
++
)
{
QRMath
.
LOG_TABLE
[
QRMath
.
EXP_TABLE
[
i
]]
=
i
;
}
//---------------------------------------------------------------------
// QRPolynomial
//---------------------------------------------------------------------
function
QRPolynomial
(
num
,
shift
)
{
if
(
num
.
length
==
undefined
)
{
throw
new
Error
(
num
.
length
+
"/"
+
shift
);
}
var
offset
=
0
;
while
(
offset
<
num
.
length
&&
num
[
offset
]
==
0
)
{
offset
++
;
}
this
.
num
=
new
Array
(
num
.
length
-
offset
+
shift
);
for
(
var
i
=
0
;
i
<
num
.
length
-
offset
;
i
++
)
{
this
.
num
[
i
]
=
num
[
i
+
offset
];
}
}
QRPolynomial
.
prototype
=
{
get
:
function
(
index
)
{
return
this
.
num
[
index
];
},
getLength
:
function
()
{
return
this
.
num
.
length
;
},
multiply
:
function
(
e
)
{
var
num
=
new
Array
(
this
.
getLength
()
+
e
.
getLength
()
-
1
);
for
(
var
i
=
0
;
i
<
this
.
getLength
();
i
++
)
{
for
(
var
j
=
0
;
j
<
e
.
getLength
();
j
++
)
{
num
[
i
+
j
]
^=
QRMath
.
gexp
(
QRMath
.
glog
(
this
.
get
(
i
))
+
QRMath
.
glog
(
e
.
get
(
j
)));
}
}
return
new
QRPolynomial
(
num
,
0
);
},
mod
:
function
(
e
)
{
if
(
this
.
getLength
()
-
e
.
getLength
()
<
0
)
{
return
this
;
}
var
ratio
=
QRMath
.
glog
(
this
.
get
(
0
))
-
QRMath
.
glog
(
e
.
get
(
0
));
var
num
=
new
Array
(
this
.
getLength
());
for
(
var
i
=
0
;
i
<
this
.
getLength
();
i
++
)
{
num
[
i
]
=
this
.
get
(
i
);
}
for
(
var
i
=
0
;
i
<
e
.
getLength
();
i
++
)
{
num
[
i
]
^=
QRMath
.
gexp
(
QRMath
.
glog
(
e
.
get
(
i
))
+
ratio
);
}
// recursive call
return
new
QRPolynomial
(
num
,
0
).
mod
(
e
);
}
};
//---------------------------------------------------------------------
// QRRSBlock
//---------------------------------------------------------------------
function
QRRSBlock
(
totalCount
,
dataCount
)
{
this
.
totalCount
=
totalCount
;
this
.
dataCount
=
dataCount
;
}
QRRSBlock
.
RS_BLOCK_TABLE
=
[
// L
// M
// Q
// H
// 1
[
1
,
26
,
19
],
[
1
,
26
,
16
],
[
1
,
26
,
13
],
[
1
,
26
,
9
],
// 2
[
1
,
44
,
34
],
[
1
,
44
,
28
],
[
1
,
44
,
22
],
[
1
,
44
,
16
],
// 3
[
1
,
70
,
55
],
[
1
,
70
,
44
],
[
2
,
35
,
17
],
[
2
,
35
,
13
],
// 4
[
1
,
100
,
80
],
[
2
,
50
,
32
],
[
2
,
50
,
24
],
[
4
,
25
,
9
],
// 5
[
1
,
134
,
108
],
[
2
,
67
,
43
],
[
2
,
33
,
15
,
2
,
34
,
16
],
[
2
,
33
,
11
,
2
,
34
,
12
],
// 6
[
2
,
86
,
68
],
[
4
,
43
,
27
],
[
4
,
43
,
19
],
[
4
,
43
,
15
],
// 7
[
2
,
98
,
78
],
[
4
,
49
,
31
],
[
2
,
32
,
14
,
4
,
33
,
15
],
[
4
,
39
,
13
,
1
,
40
,
14
],
// 8
[
2
,
121
,
97
],
[
2
,
60
,
38
,
2
,
61
,
39
],
[
4
,
40
,
18
,
2
,
41
,
19
],
[
4
,
40
,
14
,
2
,
41
,
15
],
// 9
[
2
,
146
,
116
],
[
3
,
58
,
36
,
2
,
59
,
37
],
[
4
,
36
,
16
,
4
,
37
,
17
],
[
4
,
36
,
12
,
4
,
37
,
13
],
// 10
[
2
,
86
,
68
,
2
,
87
,
69
],
[
4
,
69
,
43
,
1
,
70
,
44
],
[
6
,
43
,
19
,
2
,
44
,
20
],
[
6
,
43
,
15
,
2
,
44
,
16
],
// 11
[
4
,
101
,
81
],
[
1
,
80
,
50
,
4
,
81
,
51
],
[
4
,
50
,
22
,
4
,
51
,
23
],
[
3
,
36
,
12
,
8
,
37
,
13
],
// 12
[
2
,
116
,
92
,
2
,
117
,
93
],
[
6
,
58
,
36
,
2
,
59
,
37
],
[
4
,
46
,
20
,
6
,
47
,
21
],
[
7
,
42
,
14
,
4
,
43
,
15
],
// 13
[
4
,
133
,
107
],
[
8
,
59
,
37
,
1
,
60
,
38
],
[
8
,
44
,
20
,
4
,
45
,
21
],
[
12
,
33
,
11
,
4
,
34
,
12
],
// 14
[
3
,
145
,
115
,
1
,
146
,
116
],
[
4
,
64
,
40
,
5
,
65
,
41
],
[
11
,
36
,
16
,
5
,
37
,
17
],
[
11
,
36
,
12
,
5
,
37
,
13
],
// 15
[
5
,
109
,
87
,
1
,
110
,
88
],
[
5
,
65
,
41
,
5
,
66
,
42
],
[
5
,
54
,
24
,
7
,
55
,
25
],
[
11
,
36
,
12
],
// 16
[
5
,
122
,
98
,
1
,
123
,
99
],
[
7
,
73
,
45
,
3
,
74
,
46
],
[
15
,
43
,
19
,
2
,
44
,
20
],
[
3
,
45
,
15
,
13
,
46
,
16
],
// 17
[
1
,
135
,
107
,
5
,
136
,
108
],
[
10
,
74
,
46
,
1
,
75
,
47
],
[
1
,
50
,
22
,
15
,
51
,
23
],
[
2
,
42
,
14
,
17
,
43
,
15
],
// 18
[
5
,
150
,
120
,
1
,
151
,
121
],
[
9
,
69
,
43
,
4
,
70
,
44
],
[
17
,
50
,
22
,
1
,
51
,
23
],
[
2
,
42
,
14
,
19
,
43
,
15
],
// 19
[
3
,
141
,
113
,
4
,
142
,
114
],
[
3
,
70
,
44
,
11
,
71
,
45
],
[
17
,
47
,
21
,
4
,
48
,
22
],
[
9
,
39
,
13
,
16
,
40
,
14
],
// 20
[
3
,
135
,
107
,
5
,
136
,
108
],
[
3
,
67
,
41
,
13
,
68
,
42
],
[
15
,
54
,
24
,
5
,
55
,
25
],
[
15
,
43
,
15
,
10
,
44
,
16
],
// 21
[
4
,
144
,
116
,
4
,
145
,
117
],
[
17
,
68
,
42
],
[
17
,
50
,
22
,
6
,
51
,
23
],
[
19
,
46
,
16
,
6
,
47
,
17
],
// 22
[
2
,
139
,
111
,
7
,
140
,
112
],
[
17
,
74
,
46
],
[
7
,
54
,
24
,
16
,
55
,
25
],
[
34
,
37
,
13
],
// 23
[
4
,
151
,
121
,
5
,
152
,
122
],
[
4
,
75
,
47
,
14
,
76
,
48
],
[
11
,
54
,
24
,
14
,
55
,
25
],
[
16
,
45
,
15
,
14
,
46
,
16
],
// 24
[
6
,
147
,
117
,
4
,
148
,
118
],
[
6
,
73
,
45
,
14
,
74
,
46
],
[
11
,
54
,
24
,
16
,
55
,
25
],
[
30
,
46
,
16
,
2
,
47
,
17
],
// 25
[
8
,
132
,
106
,
4
,
133
,
107
],
[
8
,
75
,
47
,
13
,
76
,
48
],
[
7
,
54
,
24
,
22
,
55
,
25
],
[
22
,
45
,
15
,
13
,
46
,
16
],
// 26
[
10
,
142
,
114
,
2
,
143
,
115
],
[
19
,
74
,
46
,
4
,
75
,
47
],
[
28
,
50
,
22
,
6
,
51
,
23
],
[
33
,
46
,
16
,
4
,
47
,
17
],
// 27
[
8
,
152
,
122
,
4
,
153
,
123
],
[
22
,
73
,
45
,
3
,
74
,
46
],
[
8
,
53
,
23
,
26
,
54
,
24
],
[
12
,
45
,
15
,
28
,
46
,
16
],
// 28
[
3
,
147
,
117
,
10
,
148
,
118
],
[
3
,
73
,
45
,
23
,
74
,
46
],
[
4
,
54
,
24
,
31
,
55
,
25
],
[
11
,
45
,
15
,
31
,
46
,
16
],
// 29
[
7
,
146
,
116
,
7
,
147
,
117
],
[
21
,
73
,
45
,
7
,
74
,
46
],
[
1
,
53
,
23
,
37
,
54
,
24
],
[
19
,
45
,
15
,
26
,
46
,
16
],
// 30
[
5
,
145
,
115
,
10
,
146
,
116
],
[
19
,
75
,
47
,
10
,
76
,
48
],
[
15
,
54
,
24
,
25
,
55
,
25
],
[
23
,
45
,
15
,
25
,
46
,
16
],
// 31
[
13
,
145
,
115
,
3
,
146
,
116
],
[
2
,
74
,
46
,
29
,
75
,
47
],
[
42
,
54
,
24
,
1
,
55
,
25
],
[
23
,
45
,
15
,
28
,
46
,
16
],
// 32
[
17
,
145
,
115
],
[
10
,
74
,
46
,
23
,
75
,
47
],
[
10
,
54
,
24
,
35
,
55
,
25
],
[
19
,
45
,
15
,
35
,
46
,
16
],
// 33
[
17
,
145
,
115
,
1
,
146
,
116
],
[
14
,
74
,
46
,
21
,
75
,
47
],
[
29
,
54
,
24
,
19
,
55
,
25
],
[
11
,
45
,
15
,
46
,
46
,
16
],
// 34
[
13
,
145
,
115
,
6
,
146
,
116
],
[
14
,
74
,
46
,
23
,
75
,
47
],
[
44
,
54
,
24
,
7
,
55
,
25
],
[
59
,
46
,
16
,
1
,
47
,
17
],
// 35
[
12
,
151
,
121
,
7
,
152
,
122
],
[
12
,
75
,
47
,
26
,
76
,
48
],
[
39
,
54
,
24
,
14
,
55
,
25
],
[
22
,
45
,
15
,
41
,
46
,
16
],
// 36
[
6
,
151
,
121
,
14
,
152
,
122
],
[
6
,
75
,
47
,
34
,
76
,
48
],
[
46
,
54
,
24
,
10
,
55
,
25
],
[
2
,
45
,
15
,
64
,
46
,
16
],
// 37
[
17
,
152
,
122
,
4
,
153
,
123
],
[
29
,
74
,
46
,
14
,
75
,
47
],
[
49
,
54
,
24
,
10
,
55
,
25
],
[
24
,
45
,
15
,
46
,
46
,
16
],
// 38
[
4
,
152
,
122
,
18
,
153
,
123
],
[
13
,
74
,
46
,
32
,
75
,
47
],
[
48
,
54
,
24
,
14
,
55
,
25
],
[
42
,
45
,
15
,
32
,
46
,
16
],
// 39
[
20
,
147
,
117
,
4
,
148
,
118
],
[
40
,
75
,
47
,
7
,
76
,
48
],
[
43
,
54
,
24
,
22
,
55
,
25
],
[
10
,
45
,
15
,
67
,
46
,
16
],
// 40
[
19
,
148
,
118
,
6
,
149
,
119
],
[
18
,
75
,
47
,
31
,
76
,
48
],
[
34
,
54
,
24
,
34
,
55
,
25
],
[
20
,
45
,
15
,
61
,
46
,
16
]
];
QRRSBlock
.
getRSBlocks
=
function
(
typeNumber
,
errorCorrectLevel
)
{
var
rsBlock
=
QRRSBlock
.
getRsBlockTable
(
typeNumber
,
errorCorrectLevel
);
if
(
rsBlock
==
undefined
)
{
throw
new
Error
(
"bad rs block @ typeNumber:"
+
typeNumber
+
"/errorCorrectLevel:"
+
errorCorrectLevel
);
}
var
length
=
rsBlock
.
length
/
3
;
var
list
=
new
Array
();
for
(
var
i
=
0
;
i
<
length
;
i
++
)
{
var
count
=
rsBlock
[
i
*
3
+
0
];
var
totalCount
=
rsBlock
[
i
*
3
+
1
];
var
dataCount
=
rsBlock
[
i
*
3
+
2
];
for
(
var
j
=
0
;
j
<
count
;
j
++
)
{
list
.
push
(
new
QRRSBlock
(
totalCount
,
dataCount
));
}
}
return
list
;
}
QRRSBlock
.
getRsBlockTable
=
function
(
typeNumber
,
errorCorrectLevel
)
{
switch
(
errorCorrectLevel
)
{
case
QRErrorCorrectLevel
.
L
:
return
QRRSBlock
.
RS_BLOCK_TABLE
[(
typeNumber
-
1
)
*
4
+
0
];
case
QRErrorCorrectLevel
.
M
:
return
QRRSBlock
.
RS_BLOCK_TABLE
[(
typeNumber
-
1
)
*
4
+
1
];
case
QRErrorCorrectLevel
.
Q
:
return
QRRSBlock
.
RS_BLOCK_TABLE
[(
typeNumber
-
1
)
*
4
+
2
];
case
QRErrorCorrectLevel
.
H
:
return
QRRSBlock
.
RS_BLOCK_TABLE
[(
typeNumber
-
1
)
*
4
+
3
];
default
:
return
undefined
;
}
}
//---------------------------------------------------------------------
// QRBitBuffer
//---------------------------------------------------------------------
function
QRBitBuffer
()
{
this
.
buffer
=
new
Array
();
this
.
length
=
0
;
}
QRBitBuffer
.
prototype
=
{
get
:
function
(
index
)
{
var
bufIndex
=
Math
.
floor
(
index
/
8
);
return
((
this
.
buffer
[
bufIndex
]
>>>
(
7
-
index
%
8
))
&
1
)
==
1
;
},
put
:
function
(
num
,
length
)
{
for
(
var
i
=
0
;
i
<
length
;
i
++
)
{
this
.
putBit
(((
num
>>>
(
length
-
i
-
1
))
&
1
)
==
1
);
}
},
getLengthInBits
:
function
()
{
return
this
.
length
;
},
putBit
:
function
(
bit
)
{
var
bufIndex
=
Math
.
floor
(
this
.
length
/
8
);
if
(
this
.
buffer
.
length
<=
bufIndex
)
{
this
.
buffer
.
push
(
0
);
}
if
(
bit
)
{
this
.
buffer
[
bufIndex
]
|=
(
0x80
>>>
(
this
.
length
%
8
));
}
this
.
length
++
;
}
};
//---------------------------------------------------------------------
// Support Chinese
//---------------------------------------------------------------------
function
utf16To8
(
text
)
{
var
result
=
''
;
var
c
;
for
(
var
i
=
0
;
i
<
text
.
length
;
i
++
)
{
c
=
text
.
charCodeAt
(
i
);
if
(
c
>=
0x0001
&&
c
<=
0x007F
)
{
result
+=
text
.
charAt
(
i
);
}
else
if
(
c
>
0x07FF
)
{
result
+=
String
.
fromCharCode
(
0xE0
|
c
>>
12
&
0x0F
);
result
+=
String
.
fromCharCode
(
0x80
|
c
>>
6
&
0x3F
);
result
+=
String
.
fromCharCode
(
0x80
|
c
>>
0
&
0x3F
);
}
else
{
result
+=
String
.
fromCharCode
(
0xC0
|
c
>>
6
&
0x1F
);
result
+=
String
.
fromCharCode
(
0x80
|
c
>>
0
&
0x3F
);
}
}
return
result
;
}
uQRCode
=
{
errorCorrectLevel
:
QRErrorCorrectLevel
,
defaults
:
{
size
:
354
,
margin
:
0
,
backgroundColor
:
'#ffffff'
,
foregroundColor
:
'#000000'
,
fileType
:
'png'
,
// 'jpg', 'png'
errorCorrectLevel
:
QRErrorCorrectLevel
.
H
,
typeNumber
:
-
1
},
make
:
function
(
options
)
{
return
new
Promise
((
reslove
,
reject
)
=>
{
var
defaultOptions
=
{
canvasId
:
options
.
canvasId
,
componentInstance
:
options
.
componentInstance
,
text
:
options
.
text
,
size
:
this
.
defaults
.
size
,
margin
:
this
.
defaults
.
margin
,
backgroundColor
:
this
.
defaults
.
backgroundColor
,
foregroundColor
:
this
.
defaults
.
foregroundColor
,
fileType
:
this
.
defaults
.
fileType
,
errorCorrectLevel
:
this
.
defaults
.
errorCorrectLevel
,
typeNumber
:
this
.
defaults
.
typeNumber
};
if
(
options
)
{
for
(
var
i
in
options
)
{
defaultOptions
[
i
]
=
options
[
i
];
}
}
options
=
defaultOptions
;
if
(
!
options
.
canvasId
)
{
console
.
error
(
'uQRCode: Please set canvasId!'
);
return
;
}
function
createCanvas
()
{
var
qrcode
=
new
QRCode
(
options
.
typeNumber
,
options
.
errorCorrectLevel
);
qrcode
.
addData
(
utf16To8
(
options
.
text
));
qrcode
.
make
();
var
ctx
=
uni
.
createCanvasContext
(
options
.
canvasId
,
options
.
componentInstance
);
ctx
.
setFillStyle
(
options
.
backgroundColor
);
ctx
.
fillRect
(
0
,
0
,
options
.
size
,
options
.
size
);
var
tileW
=
(
options
.
size
-
options
.
margin
*
2
)
/
qrcode
.
getModuleCount
();
var
tileH
=
tileW
;
for
(
var
row
=
0
;
row
<
qrcode
.
getModuleCount
();
row
++
)
{
for
(
var
col
=
0
;
col
<
qrcode
.
getModuleCount
();
col
++
)
{
var
style
=
qrcode
.
isDark
(
row
,
col
)
?
options
.
foregroundColor
:
options
.
backgroundColor
;
ctx
.
setFillStyle
(
style
);
var
x
=
Math
.
round
(
col
*
tileW
)
+
options
.
margin
;
var
y
=
Math
.
round
(
row
*
tileH
)
+
options
.
margin
;
var
w
=
Math
.
ceil
((
col
+
1
)
*
tileW
)
-
Math
.
floor
(
col
*
tileW
);
var
h
=
Math
.
ceil
((
row
+
1
)
*
tileW
)
-
Math
.
floor
(
row
*
tileW
);
ctx
.
fillRect
(
x
,
y
,
w
,
h
);
}
}
setTimeout
(
function
()
{
ctx
.
draw
(
false
,
(
function
()
{
setTimeout
(
function
()
{
uni
.
canvasToTempFilePath
({
canvasId
:
options
.
canvasId
,
fileType
:
options
.
fileType
,
width
:
options
.
size
,
height
:
options
.
size
,
destWidth
:
options
.
size
,
destHeight
:
options
.
size
,
success
:
function
(
res
)
{
let
resData
;
// 将统一为base64格式
let
tempFilePath
=
res
.
tempFilePath
;
// H5为base64,其他为相对路径
// #ifdef H5
resData
=
tempFilePath
;
options
.
success
&&
options
.
success
(
resData
);
reslove
(
resData
);
// #endif
// #ifdef APP-PLUS
const
path
=
plus
.
io
.
convertLocalFileSystemURL
(
tempFilePath
)
// 绝对路径
let
fileReader
=
new
plus
.
io
.
FileReader
();
fileReader
.
readAsDataURL
(
path
);
fileReader
.
onloadend
=
res
=>
{
resData
=
res
.
target
.
result
;
options
.
success
&&
options
.
success
(
resData
);
reslove
(
resData
);
};
// #endif
// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
uni
.
getFileSystemManager
().
readFile
({
filePath
:
tempFilePath
,
encoding
:
'base64'
,
success
:
res
=>
{
resData
=
'data:image/png;base64,'
+
res
.
data
;
options
.
success
&&
options
.
success
(
resData
);
reslove
(
resData
);
}
})
// #endif
// #ifndef H5 || APP-PLUS || MP-WEIXIN || MP-QQ || MP-TOUTIAO
if
(
plus
)
{
const
path
=
plus
.
io
.
convertLocalFileSystemURL
(
tempFilePath
)
// 绝对路径
let
fileReader
=
new
plus
.
io
.
FileReader
();
fileReader
.
readAsDataURL
(
path
);
fileReader
.
onloadend
=
res
=>
{
resData
=
res
.
target
.
result
;
options
.
success
&&
options
.
success
(
resData
);
reslove
(
resData
);
};
}
else
{
uni
.
request
({
url
:
tempFilePath
,
method
:
'GET'
,
responseType
:
'arraybuffer'
,
success
:
res
=>
{
resData
=
`data:image/png;base64,
${
uni
.
arrayBufferToBase64
(
res
.
data
)}
`
;
// 把arraybuffer转成base64
options
.
success
&&
options
.
success
(
resData
);
reslove
(
resData
);
}
})
}
// #endif
},
fail
:
function
(
error
)
{
options
.
fail
&&
options
.
fail
(
error
);
reject
(
error
);
},
complete
:
function
(
res
)
{
options
.
complete
&&
options
.
complete
(
res
);
}
},
options
.
componentInstance
);
},
options
.
text
.
length
+
100
);
})());
},
150
);
}
createCanvas
();
});
}
}
})()
export
default
uQRCode
pages.json
View file @
480c39de
...
@@ -292,6 +292,15 @@
...
@@ -292,6 +292,15 @@
}
}
}
}
,{
"path"
:
"pages/my/order/electronicTicketNew/electronicTicketNew"
,
"style"
:
{
"navigationBarTitleText"
:
""
,
"enablePullDownRefresh"
:
false
}
}
],
],
"globalStyle"
:
{
"globalStyle"
:
{
"navigationBarTextStyle"
:
"white"
,
"navigationBarTextStyle"
:
"white"
,
...
...
pages/my/order/electronicTicketNew/electronicTicketNew.vue
0 → 100644
View file @
480c39de
<
template
>
<view
class=
"page-box"
>
<view
class=
"order-status"
>
<view
class=
"status-box"
>
<view
class=
"status-type"
v-if=
"orderInfo.orderStatus==2"
>
<template
v-if=
"orderInfo.orderType==1"
>
出票成功
</
template
>
<
template
v-else-if=
"orderInfo.orderType==2"
>
预订成功
</
template
>
<
template
v-else-if=
"orderInfo.orderType==3"
>
预订成功
</
template
>
<
template
v-else-if=
"orderInfo.orderType==4"
>
购买成功
</
template
>
</view>
<view
class=
"status-product"
>
{{orderInfo.merchantName}}({{orderInfo.productName}})
</view>
</view>
</view>
<
template
v-if=
"orderInfo.orderType==1||orderInfo.orderType==3"
>
<view
class=
"order-certificate order-allType order-positionTop"
>
<!--
<view
class=
"alltype-title"
>
<view
class=
"title-line"
>
<view></view>
</view>
<view
class=
"title-label"
>
入园凭证
</view>
</view>
-->
<view
class=
"certificate-box"
>
<view
class=
"box-verificationCode"
>
验证码:
{{
ticketCode
}}
</view>
<canvas
class=
"box-QRcode"
canvas-id=
"qrcode"
/>
<view
class=
"progress-box"
>
<progress
:percent=
"percentage"
activeColor=
"#3688FF"
stroke-width=
"3"
/>
</view>
<!--
<view
class=
"box-prompt"
>
自动更新,截屏无效
</view>
-->
<view
class=
"box-prompt2"
>
{{
orderInfo
.
orderType
==
1
?
'二维码自动更新,截屏无法验证'
:
'二维码自动更新,截屏无法验证'
}}
</view>
</view>
</view>
</
template
>
<view
class=
"order-queueUp order-allType order-positionTop"
v-if=
"orderInfo.isFetch==1&&sortsInfo"
>
<view
class=
"alltype-title"
>
<!-- <view class="title-line">
<view></view>
</view> -->
<view
class=
"title-label"
>
排队详情
</view>
<!-- <u-icon name="reload"></u-icon> -->
</view>
<view
class=
"queueUp-rowNumber"
v-for=
"(item,index) in sortData"
:key=
"index"
>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
正排队号区间:
</text>
<view
class=
"list-value"
>
{{item.showStart}} ~ {{item.showEnd}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
我的排队号:
</text>
<view
class=
"list-value"
>
{{item.sortNo}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
<!-- <text class="list-btnNew" @click="sortAgain(item)" v-if="item.resetSort">重新排号</text> -->
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
预计进入时间:
</text>
<text
class=
"list-value"
>
{{item.sortNoTime}}
</text>
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
排号温馨提示:
</text>
<text
class=
"list-value2"
>
请及时关注排号信息,系统30s自动刷新。空号较多时,预计进入时间可能提前或推后,感谢您的理解。
</text>
</view>
</view>
<view
class=
"queueUp-rowNumber"
v-for=
"(item,index) in sortData"
:key=
"index"
>
<view
class=
"rowNumber-list rowNumber-list2"
>
<text
class=
"list-name"
>
正排队号区间:
</text>
<view
class=
"list-value3"
>
{{item.showStart}} ~ {{item.showEnd}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
</view>
<view
class=
"rowNumber-takeNum"
>
取号
</view>
<view
class=
"rowNumber-takeTimer"
>
9分53秒后可取号
</view>
</view>
<view
class=
"queueUp-rowNumber queueUp-rowNumber2"
v-for=
"(item,index) in sortData"
:key=
"index"
>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
正排队号区间:
</text>
<view
class=
"list-value"
>
{{item.showStart}} ~ {{item.showEnd}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
我的排队号:
</text>
<view
class=
"list-value"
>
{{item.sortNo}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
<!-- <text class="list-btnNew" @click="sortAgain(item)" v-if="item.resetSort">重新排号</text> -->
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
预计进入时间:
</text>
<text
class=
"list-value"
>
{{item.sortNoTime}}
</text>
</view>
<view
class=
"rowNumber-list"
>
<text
class=
"list-name"
>
排号温馨提示:
</text>
<text
class=
"list-value2"
>
请及时关注排号信息,系统30s自动刷新。空号较多时,预计进入时间可能提前或推后,感谢您的理解。
</text>
</view>
</view>
<view
class=
"queueUp-rowNumber queueUp-rowNumber3"
v-for=
"(item,index) in sortData"
:key=
"index"
>
<view
class=
"rowNumber-list rowNumber-list2"
>
<text
class=
"list-name"
>
正排队号区间:
</text>
<view
class=
"list-value3"
>
{{item.showStart}} ~ {{item.showEnd}}
<text
style=
"font-size: 28rpx;margin-left: 8rpx;line-height: 56rpx;"
>
({{item.projectName}})
</text></view>
</view>
<view
class=
"rowNumber-list rowNumber-list2"
>
<view
class=
"rowNumber-signOver"
>
您排队号已过
</view>
<view
class=
"rowNumber-takeNum2"
>
取号
</view>
</view>
<view
class=
"rowNumber-takeTimer"
>
9分53秒后可取号
</view>
</view>
<view
class=
"queueUp-historyNum"
>
历史排号:240(北站)/ 587(北站)
</view>
</view>
<view
class=
"order-mes order-allType order-positionTop"
>
<view
class=
"alltype-title"
>
<!-- <view class="title-line">
<view></view>
</view> -->
<view
class=
"title-label"
>
订单信息
</view>
<u-icon
name=
"arrow-down"
v-if=
"orderTypeNum==0"
@
click=
"orderTypeNum=1"
style=
"line-height: 44rpx !important;
color: #999999 !important;
position: absolute !important;
right: 24rpx !important;
top: 24rpx !important;"
></u-icon>
<u-icon
name=
"arrow-up"
v-if=
"orderTypeNum==1"
@
click=
"orderTypeNum=0"
style=
"line-height: 44rpx !important;
color: #999999 !important;
position: absolute !important;
right: 24rpx !important;
top: 24rpx !important;"
></u-icon>
</view>
<view
class=
"mes-box"
v-if=
"orderTypeNum==1"
>
<view
class=
"box-case"
>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
订单编号
</view>
<view
class=
"list-text list-text2"
>
{{orderInfo.id}}
</view>
<image
class=
"list-btn"
@
click=
"copyText(orderInfo.id)"
src=
"../../../../static/img/my/icon01.png"
></image>
<!-- <view class="list-btn" @click="copyText(orderInfo.id)">复制</view> -->
</view>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
产品名称
</view>
<view
class=
"list-text"
>
{{orderInfo.merchantName}}({{orderInfo.productName}})
</view>
</view>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
购买数量
</view>
<view
class=
"list-text"
>
{{orderInfo.orderNum}}
</view>
</view>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
购买时间
</view>
<view
class=
"list-text"
>
{{orderInfo.orderTime}}
</view>
</view>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
游玩日期
</view>
<view
class=
"list-text"
>
{{orderInfo.playDate?orderInfo.playDate.substr(0,10):""}} {{orderInfo.startPlayTime?orderInfo.startPlayTime.substr(0,8):""}}
</view>
</view>
<view
class=
"case-list"
v-for=
"(item,index) in orderExtendList"
:key=
"index"
>
<view
class=
"list-name"
>
{{item.title}}
</view>
<view
class=
"list-text"
>
{{item.content}}
</view>
</view>
</view>
<view
class=
"box-case"
v-if=
"touristInfo.length>0"
>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
游客信息
</view>
<view
class=
"list-text"
>
<view
v-for=
"(list,index) in touristInfo"
:key=
"index"
>
<view>
{{list.name}} {{orderInfo.ticketPhone}}
</view>
{{list.credentialNumber.substr(0,4)+"****"+list.credentialNumber.substr(14,list.credentialNumber.length-1)}}
</view>
</view>
</view>
</view>
<view
class=
"box-case"
>
<view
class=
"case-list"
>
<view
class=
"list-name"
>
退票规则
</view>
<view
class=
"list-text"
>
<
template
v-if=
"orderInfo.isRefund==0"
>
不支持退票
</
template
>
<
template
v-else-if=
"orderInfo.isRefund==1"
>
<!--
<div>
规定时间可退
</div>
-->
<text
v-if=
"orderInfo.orderRefundRuleList[0]&&orderInfo.orderRefundRuleList[0].refundDay!=0"
>
使用日期截止前
{{
orderInfo
.
orderRefundRuleList
[
0
].
refundDay
}}
天
</text>
<text
v-else
>
游玩当天
</text>
<text
v-if=
"orderInfo.orderRefundRuleList[0]"
>
{{
orderInfo
.
orderRefundRuleList
[
0
].
refundTime
.
substr
(
0
,
5
)
}}
之前可退
</text>
</
template
>
<
template
v-else-if=
"orderInfo.isRefund==2"
>
随时可退
</
template
>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<
script
>
import
uQRCode
from
'@/common/js/uqrcode.js'
export
default
{
filters
:{
orderStatus1
(
i
){
//景区订单状态
switch
(
i
){
case
0
:
return
'待支付'
break
case
1
:
return
'出票中'
break
case
2
:
return
'出票成功'
break
case
3
:
return
'出票失败'
break
case
4
:
return
'核销中'
break
case
5
:
return
'核销完成'
break
case
6
:
return
'退款中'
break
case
7
:
return
'部分退退货退款'
break
case
8
:
return
'全部退退货退款'
break
case
9
:
return
'取消'
break
case
10
:
return
'已完成 '
break
case
11
:
return
'已过期 '
break
case
12
:
return
'退票审核中 '
break
}
},
orderStatus2
(
i
){
//酒店订单状态
switch
(
i
){
case
0
:
return
'待支付'
break
case
1
:
return
'确认中'
break
case
2
:
return
'预定成功'
break
case
3
:
return
'预定失败'
break
case
4
:
return
'核销中'
break
case
5
:
return
'核销完成'
break
case
6
:
return
'退款中'
break
case
7
:
return
'部分退退货退款'
break
case
8
:
return
'全部退退货退款'
break
case
9
:
return
'取消 '
break
case
10
:
return
'已完成 '
break
}
},
orderStatus3
(
i
){
//餐饮订单状态
switch
(
i
){
case
0
:
return
'待支付'
break
case
1
:
return
'确认中'
break
case
2
:
return
'预定成功'
break
case
3
:
return
'预定失败'
break
case
4
:
return
'核销中'
break
case
5
:
return
'核销完成'
break
case
6
:
return
'退款中'
break
case
7
:
return
'部分退货退款'
break
case
8
:
return
'全部退款退货'
break
case
9
:
return
'取消 '
break
case
10
:
return
'已完成 '
break
}
},
orderStatus4
(
i
){
//特产订单状态
switch
(
i
){
case
0
:
return
'待支付'
break
case
1
:
return
'待发货'
break
case
2
:
return
'待收货'
break
case
3
:
return
'预定失败'
break
case
4
:
return
'核销中'
break
case
5
:
return
'已收货'
break
case
6
:
return
'退款中'
break
case
7
:
return
'部分退货/退款'
break
case
8
:
return
'全部退款退货 '
break
case
9
:
return
'取消 '
break
case
10
:
return
'已完成 '
break
}
}
},
data
()
{
return
{
openId
:
''
,
//用户信息
id
:
''
,
//订单ID
orderInfo
:{},
//订单信息
sortsInfo
:
''
,
//取号数据
sortData
:[],
//排队号信息
ticketCode
:
null
,
//订单编码
verifyCode
:
null
,
//二维码
ticketStatus
:
null
,
//票状态 0未使用,1已核销,2退票,3过期
codeStart
:
''
,
//开始时间
codes
:[],
//我二维码数组
percentage
:
0
,
//进度条百分比
orderExtendList
:[],
//订单拓展信息
touristInfo
:[],
//游客信息
orderTypeNum
:
1
,
//订单是否展开
timer1
:
null
,
timer2
:
null
,
}
},
onLoad
(
option
)
{
//this.id = option.orderId
this
.
id
=
"z0016790198036828fdab58f248e3835"
//this.openId = uni.getStorageSync("openid") //openid
this
.
openId
=
"oh2UV1lyYABHMZ1rMlgjhVHyyYDQ"
this
.
getDetail
();
},
onUnload
()
{
if
(
this
.
timer1
)
{
clearTimeout
(
this
.
timer1
)
this
.
timer1
=
null
}
if
(
this
.
timer2
)
{
clearTimeout
(
this
.
timer2
)
this
.
timer2
=
null
}
},
methods
:
{
getDetail
(){
//*-----------------加载订单
let
data
=
{
orderId
:
this
.
id
,
//订单ID
userId
:
this
.
openId
,
//用户Id
}
this
.
$request
(
'order/userOrder/findOrderDetail'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
"00"
){
this
.
orderInfo
=
res
.
data
this
.
orderExtendList
=
res
.
data
.
orderExtendList
if
(
this
.
orderInfo
.
orderTicketDetailList
&&
this
.
orderInfo
.
orderTicketDetailList
.
length
>
0
){
this
.
verifyCode
=
this
.
orderInfo
.
orderTicketDetailList
[
0
].
verifyCode
this
.
ticketStatus
=
this
.
orderInfo
.
orderTicketDetailList
[
0
].
ticketStatus
this
.
ticketCode
=
this
.
orderInfo
.
orderTicketDetailList
[
0
].
ticketCode
}
this
.
touristInfo
=
res
.
data
.
orderTouristList
if
(
this
.
orderInfo
.
orderType
==
1
||
this
.
orderInfo
.
orderType
==
3
){
if
(
this
.
orderInfo
.
subOrderType
!=
4
&&
this
.
orderInfo
.
subOrderType
!=
5
){
this
.
$nextTick
(()
=>
{
if
(
this
.
orderInfo
.
playDate
.
substr
(
0
,
10
)
==
this
.
$commonjs
.
today
()
&&
this
.
orderInfo
.
exchangeMode
==
4
||
this
.
orderInfo
.
playDate
.
substr
(
0
,
10
)
==
this
.
$commonjs
.
today
()
&&
this
.
orderInfo
.
exchangeMode
==
5
){
this
.
dynamicCode
()
}
else
{
this
.
qecode
()
}
})
}
}
if
(
this
.
orderInfo
.
isFetch
==
1
){
//isFetch==1需要排队
this
.
getSortInfo
()
this
.
timer2
=
setInterval
(()
=>
{
this
.
getSortInfo
()
},
1000
*
120
)
// this.$once('hook:beforeDestroy',()=>{
// clearInterval(timer)
// })
}
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
},
getSortInfo
(){
//-------------------------排号信息加载
var
areaCode
=
this
.
orderInfo
.
areaCode
var
orderNum
=
this
.
orderInfo
.
orderNum
var
userId
=
this
.
openId
var
orderId
=
this
.
orderInfo
.
id
var
verifyCode
=
this
.
ticketCode
let
data
=
{
areaCode
,
orderNum
,
userId
,
orderId
,
verifyCode
,
'againNumber'
:
0
}
this
.
$request
(
'distribution/distribution/getNewFetchInfo'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
"00"
){
if
(
res
.
data
.
length
>
0
){
this
.
sortsInfo
=
res
.
data
[
0
]
var
sortArr
=
this
.
sortsInfo
.
sorts
var
northArr
=
null
var
southArr
=
null
sortArr
.
forEach
((
item
)
=>
{
if
(
item
.
projectId
==
'cjsd_project_0002'
){
//北站
if
(
northArr
){
if
(
item
.
sortNo
>
northArr
.
sortNo
){
northArr
=
item
}
}
else
{
northArr
=
item
}
}
else
{
//南站
if
(
southArr
){
if
(
item
.
sortNo
>
southArr
.
sortNo
){
southArr
=
item
}
}
else
{
southArr
=
item
}
}
})
var
arr
=
[]
if
(
northArr
){
arr
.
push
(
northArr
)
}
if
(
southArr
){
arr
.
push
(
southArr
)
}
this
.
sortData
=
arr
}
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
}).
catch
((
err
)
=>
{
this
.
timer1
=
setTimeout
(()
=>
{
this
.
getSortInfo
()
},
2000
)
// this.$once('hook:beforeDestroy',()=>{
// clearTimeout(timer)
// })
})
},
sortAgain
(
item
){
//--------------------------------------重新排队
let
data
=
{
againNumber
:
1
,
thirdId
:
this
.
sortsInfo
.
order
.
orderId
,
areaCode
:
item
.
projectId
,
userId
:
this
.
openId
}
this
.
$request
(
'distribution/distribution/newFetchNumber'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
"00"
){
this
.
getSortInfo
()
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
},
qecode
(){
//生成二维码
if
(
this
.
verifyCode
){
// let qrcode = new QRCode('qrcode',{
// width: 180,
// height: 180,
// text:this.verifyCode
// })
uQRCode
.
make
({
canvasId
:
'qrcode'
,
componentInstance
:
this
,
text
:
this
.
verifyCode
,
size
:
180
,
margin
:
10
,
backgroundColor
:
'#ffffff'
,
foregroundColor
:
'#000000'
,
fileType
:
'jpg'
,
errorCorrectLevel
:
uQRCode
.
errorCorrectLevel
.
H
})
}
},
dynamicCodeRefresh
(){
// 获取当前显示第几个二维码
let
codes
=
this
.
codes
let
now
=
new
Date
().
getTime
()
let
nowTime
=
(
now
-
this
.
codeStart
)
/
1000
let
code
=
null
// 寻找到当前时间的二维码
for
(
let
i
=
0
;
i
<
codes
.
length
;
i
++
){
let
item
=
codes
[
i
]
nowTime
-=
item
.
timeout
if
(
nowTime
<=
0
){
code
=
item
break
}
}
// 全部遍历完成后,需要重新获取新的二维码
if
(
code
==
null
){
this
.
dynamicCode
()
}
else
if
(
code
.
code
!=
this
.
codeNo
){
this
.
codeNo
=
code
.
code
// if(document.querySelector('#qrcode img')){//移除子元素
// document.querySelector('#qrcode img').remove()
// document.querySelector('#qrcode canvas').remove()
// }
// let qrcode = new QRCode('qrcode',{//进入先获取二维码
// width: 180,
// height: 180,
// text:this.codeNo
// })
uQRCode
.
make
({
canvasId
:
'qrcode'
,
componentInstance
:
this
,
text
:
this
.
codeNo
,
size
:
180
,
margin
:
10
,
backgroundColor
:
'#ffffff'
,
foregroundColor
:
'#000000'
,
fileType
:
'jpg'
,
errorCorrectLevel
:
uQRCode
.
errorCorrectLevel
.
H
})
}
this
.
percentage
+=
1
if
(
this
.
percentage
>=
100
){
this
.
percentage
=
0
}
},
dynamicCode
(){
//动态码
let
data
=
{
codeNo
:
this
.
ticketCode
,
//二维码编号
orderId
:
this
.
id
,
//订单号
userId
:
this
.
openId
//openid
}
clearInterval
(
this
.
codeFlag
)
this
.
$request
(
'distribution/distribution/getAutoCode'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
){
this
.
codes
=
res
.
data
.
codes
this
.
codeStart
=
new
Date
().
getTime
()
this
.
codeFlag
=
setInterval
(()
=>
{
this
.
dynamicCodeRefresh
()
},
300
)
this
.
$once
(
'hook:beforeDestroy'
,
()
=>
{
clearInterval
(
this
.
codeFlag
)
})
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
}).
catch
((
err
)
=>
{
let
timer
=
setTimeout
(()
=>
{
this
.
dynamicCode
()
},
2000
)
this
.
$once
(
'hook:beforeDestroy'
,
()
=>
{
clearTimeout
(
timer
)
})
})
},
copyText
(
value
){
//-------------------------复制内容
uni
.
setClipboardData
({
data
:
value
,
success
:
function
(){
uni
.
showToast
({
title
:
"复制成功"
,
icon
:
'none'
})
}
})
},
}
}
</
script
>
<
style
scoped=
"scoped"
>
.page-box
{
background-color
:
#ECF3FE
;
min-height
:
100vh
;
padding-bottom
:
80
rpx
;
}
.order-status
{
width
:
750
rpx
;
height
:
464
rpx
;
background
:
linear-gradient
(
180deg
,
#3688FF
0%
,
#3688FF
37%
,
#ECF3FE
100%
);
padding
:
48
rpx
32
rpx
32
rpx
40
rpx
;
box-sizing
:
border-box
;
position
:
relative
;
}
.order-status
.status-box
{
display
:
flex
;
color
:
#fff
;
overflow
:
hidden
;
}
.order-status
.status-type
{
font-size
:
48
rpx
;
line-height
:
66
rpx
;
font-weight
:
bold
;
margin-bottom
:
8
rpx
;
flex-shrink
:
0
}
.order-status
.status-product
,
.order-status
.status-prompt
{
font-size
:
28
rpx
;
line-height
:
85
rpx
;
margin-left
:
16
rpx
;
overflow
:
hidden
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
-o-text-overflow
:
ellipsis
;
}
.order-status
.status-icon
{
width
:
106
rpx
;
height
:
104
rpx
;
position
:
absolute
;
right
:
64
rpx
;
top
:
58
rpx
;
}
/*排队信息*/
.order-allType
{
width
:
710
rpx
;
background-color
:
#fff
;
box-shadow
:
0
rpx
0
rpx
16
rpx
2
rpx
rgba
(
0
,
0
,
0
,
0.08
);
border-radius
:
16
rpx
16
rpx
16
rpx
16
rpx
;
margin
:
0
auto
16
rpx
auto
;
}
.order-allType
.alltype-title
{
display
:
flex
;
height
:
92
rpx
;
padding
:
24
rpx
24
rpx
0
24
rpx
;
box-shadow
:
0
rpx
2
rpx
0
rpx
2
rpx
rgba
(
0
,
0
,
0
,
0.08
);
position
:
relative
;
}
.order-allType
.alltype-title
.title-line
{
width
:
20
rpx
;
height
:
44
rpx
;
overflow
:
hidden
;
position
:
relative
;
}
.order-allType
.alltype-title
.title-line
view
{
width
:
4
rpx
;
height
:
24
rpx
;
background-color
:
var
(
--main-color
);
margin
:
auto
;
position
:
absolute
;
left
:
0
;
top
:
0
;
bottom
:
0
;
}
.order-allType
.alltype-title
.title-label
{
font-size
:
32
rpx
;
color
:
var
(
--title-color
);
font-weight
:
bold
;
line-height
:
44
rpx
;
}
.order-allType
.alltype-title
.uicon-reload
{
line-height
:
44
rpx
!important
;
color
:
var
(
--title-color
)
!important
;
margin-left
:
22
rpx
!important
;
}
.order-allType
.alltype-title
.uicon-arrow-down
,
.order-allType
.alltype-title
.uicon-arrow-up
{
line-height
:
44
rpx
!important
;
color
:
#999999
!important
;
position
:
absolute
!important
;
right
:
24
rpx
!important
;
top
:
24
rpx
!important
;
}
.order-positionTop
:nth-child
(
2
)
{
margin-top
:
-302
rpx
;
position
:
relative
;
z-index
:
2
;
}
/*排队详情*/
.order-queueUp
{
}
.order-queueUp
.queueUp-rowNumber
{
padding
:
24
rpx
24
rpx
24
rpx
24
rpx
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
{
display
:
flex
;
font-size
:
28
rpx
;
line-height
:
56
rpx
;
margin-bottom
:
24
rpx
;
position
:
relative
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list2
{
justify-content
:
center
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-name
{
width
:
220
rpx
;
color
:
var
(
--title-color
);
flex-shrink
:
0
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-value
{
flex
:
1
;
display
:
flex
;
color
:
#FC771D
;
font-size
:
40
rpx
;
font-weight
:
bold
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-value2
{
color
:
#333333
;
font-size
:
24
rpx
;
line-height
:
35
rpx
;
padding-top
:
8
rpx
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-value3
{
display
:
flex
;
color
:
#FC771D
;
font-size
:
40
rpx
;
font-weight
:
bold
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list2
.list-value
{
flex
:
0
;
}
.order-queueUp
.queueUp-rowNumber2
{
color
:
#fff
;
background-color
:
#1EA838
;
}
.order-queueUp
.queueUp-rowNumber2
.rowNumber-list
.list-value
,
.order-queueUp
.queueUp-rowNumber2
.rowNumber-list
.list-value2
{
color
:
#fff
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-right48
{
margin-right
:
48
rpx
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-right24
{
margin-right
:
24
rpx
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
.list-btnNew
{
width
:
140
rpx
;
height
:
40
rpx
;
border-radius
:
26
rpx
26
rpx
26
rpx
26
rpx
;
text-align
:
center
;
line-height
:
40
rpx
;
color
:
var
(
--main-color
);
border
:
1
rpx
solid
var
(
--main-color
);
position
:
absolute
;
top
:
0
;
right
:
0
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-list
:nth-last-child
(
1
)
{
margin-bottom
:
0
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-takeNum
{
width
:
136
rpx
;
height
:
56
rpx
;
background
:
#3688FF
;
border-radius
:
32
rpx
32
rpx
32
rpx
32
rpx
;
font-size
:
28
rpx
;
color
:
#FFFFFF
;
line-height
:
56
rpx
;
text-align
:
center
;
margin
:
0
auto
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-takeNum2
{
width
:
136
rpx
;
height
:
56
rpx
;
background
:
#3688FF
;
border-radius
:
32
rpx
32
rpx
32
rpx
32
rpx
;
font-size
:
28
rpx
;
color
:
#FFFFFF
;
line-height
:
56
rpx
;
text-align
:
center
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-takeTimer
{
font-size
:
28
rpx
;
color
:
#FC771D
;
line-height
:
40
rpx
;
font-weight
:
bold
;
margin-top
:
16
rpx
;
text-align
:
center
;
}
.order-queueUp
.queueUp-historyNum
{
font-size
:
24
rpx
;
color
:
#333333
;
line-height
:
34
rpx
;
border-top
:
2
rpx
solid
#ECECEC
;
padding
:
24
rpx
24
rpx
24
rpx
24
rpx
;
}
.order-queueUp
.queueUp-rowNumber3
{
color
:
#fff
;
background-color
:
#DA3844
;
}
.order-queueUp
.queueUp-rowNumber
.rowNumber-signOver
{
font-size
:
32
rpx
;
color
:
#fff
;
line-height
:
56
rpx
;
font-weight
:
bold
;
margin-right
:
40
rpx
;
}
.order-queueUp
.queueUp-rowNumber3
.rowNumber-list
.list-value
,
.order-queueUp
.queueUp-rowNumber3
.rowNumber-list
.list-value2
,
.order-queueUp
.queueUp-rowNumber3
.rowNumber-takeTimer
,
.order-queueUp
.queueUp-rowNumber3
.rowNumber-list
.list-value3
{
color
:
#fff
;
}
.order-queueUp
.queueUp-rowNumber3
.rowNumber-takeNum
,
.order-queueUp
.queueUp-rowNumber3
.rowNumber-takeNum2
{
background-color
:
#fff
;
color
:
#3688FF
;
}
/*入园凭证*/
.order-certificate
.certificate-box
{
padding
:
16
rpx
0
24
rpx
0
;
overflow
:
hidden
;
}
.order-certificate
.certificate-box
.box-verificationCode
{
margin
:
8
rpx
0
8
rpx
0
;
font-size
:
24
rpx
;
color
:
#333333
;
line-height
:
40
rpx
;
text-align
:
center
;
}
.order-certificate
.certificate-box
.box-QRcode
{
display
:
block
;
width
:
320
rpx
;
height
:
320
rpx
;
margin
:
0
auto
;
}
.order-certificate
.certificate-box
.progress-box
{
width
:
304
rpx
;
margin
:
6
rpx
auto
0
auto
;
}
.order-certificate
.certificate-box
.box-prompt
{
font-size
:
28
rpx
;
color
:
var
(
--main-color
);
line-height
:
40
rpx
;
text-align
:
center
;
margin
:
16
rpx
0
8
rpx
0
;
}
.order-certificate
.certificate-box
.box-prompt2
{
font-size
:
28
rpx
;
font-weight
:
bold
;
color
:
#FC771D
;
line-height
:
40
rpx
;
text-align
:
center
;
margin
:
24
rpx
0
0
0
;
}
/*订单信息*/
.order-mes
.mes-box
{
padding
:
44
rpx
24
rpx
24
rpx
24
rpx
;
overflow
:
hidden
;
}
.order-mes
.mes-box
.box-case
{
width
:
638
rpx
;
border-bottom
:
2
rpx
solid
#ECECEC
;
margin-bottom
:
40
rpx
;
}
.order-mes
.mes-box
.box-case
:nth-last-child
(
1
)
{
border-bottom
:
none
;
margin-bottom
:
0
rpx
;
}
.order-mes
.mes-box
.box-case
.case-list
{
display
:
flex
;
width
:
638
rpx
;
font-size
:
28
rpx
;
line-height
:
40
rpx
;
margin-bottom
:
28
rpx
;
position
:
relative
;
}
.order-mes
.mes-box
.box-case
.case-list
.list-name
{
flex-shrink
:
0
;
width
:
144
rpx
;
color
:
#AAAAAA
;
}
.order-mes
.mes-box
.box-case
.case-list
.list-text
{
flex
:
1
;
word-wrap
:
break-word
;
color
:
#333333
;
}
.order-mes
.mes-box
.box-case
.case-list
.list-text2
{
flex
:
0
;
width
:
430
rpx
;
/* height: 40rpx;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis; */
}
.order-mes
.mes-box
.box-case
.case-list
.list-btn
{
/* flex-shrink: 0;
width: 104rpx;
height: 40rpx;
border-radius: 26rpx 26rpx 26rpx 26rpx;
text-align: center;
line-height: 38rpx;
color: #333333;
border: 1rpx solid #999999; */
width
:
32
rpx
;
height
:
32
rpx
;
margin
:
auto
;
position
:
absolute
;
top
:
0
;
right
:
0
;
bottom
:
0
;
}
</
style
>
project.config.json
0 → 100644
View file @
480c39de
{
"appid"
:
"wxe678d5240e98a7b8"
,
"compileType"
:
"miniprogram"
,
"libVersion"
:
"2.30.3"
,
"packOptions"
:
{
"ignore"
:
[],
"include"
:
[]
},
"setting"
:
{
"coverView"
:
true
,
"es6"
:
true
,
"postcss"
:
true
,
"minified"
:
true
,
"enhance"
:
true
,
"showShadowRootInWxmlPanel"
:
true
,
"packNpmRelationList"
:
[],
"babelSetting"
:
{
"ignore"
:
[],
"disablePlugins"
:
[],
"outputPath"
:
""
}
},
"condition"
:
{},
"editorSetting"
:
{
"tabIndent"
:
"insertSpaces"
,
"tabSize"
:
4
}
}
\ No newline at end of file
project.private.config.json
0 → 100644
View file @
480c39de
{
"description"
:
"项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html"
,
"projectname"
:
"uni-pdtravel"
,
"setting"
:
{
"compileHotReLoad"
:
true
}
}
\ No newline at end of file
static/img/my/icon01.png
0 → 100644
View file @
480c39de
394 Bytes
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment