Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
d53783a9
Commit
d53783a9
authored
Aug 12, 2017
by
jmdhappy
Browse files
初始化提交
parent
324ccaaf
Changes
465
Hide whitespace changes
Inline
Side-by-side
xxpay-shop/src/main/resources/logback.xml
0 → 100755
View file @
d53783a9
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender
name=
"CONSOLE"
class=
"ch.qos.logback.core.ConsoleAppender"
>
<encoder
class=
"ch.qos.logback.classic.encoder.PatternLayoutEncoder"
>
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n
</Pattern>
</encoder>
</appender>
<appender
name=
"ROLLING"
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<rollingPolicy
class=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
>
<fileNamePattern>
logs/xxpay-shop.%d.log
</fileNamePattern>
<maxHistory>
30
</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n
</Pattern>
</encoder>
</appender>
<logger
name=
"org.springframework"
level=
"WARN"
/>
<logger
name=
"org.apache"
level=
"WARN"
/>
<logger
name=
"freemarker"
level=
"WARN"
/>
<logger
name=
"org.hibernate"
level=
"WARN"
/>
<logger
name=
"org.hibernate.cache"
level=
"WARN"
/>
<logger
name=
"org.hibernate.type"
level=
"WARN"
/>
<logger
name=
"org.hibernate.SQL"
level=
"DEBUG"
/>
<logger
name=
"org.hibernate.type.descriptor.sql.BasicBinder"
level=
"TRACE"
/>
<root
level=
"INFO"
>
<appender-ref
ref=
"CONSOLE"
/>
<appender-ref
ref=
"ROLLING"
/>
</root>
</configuration>
xxpay-shop/src/main/resources/org/xxpay/shop/dao/mapper/GoodsOrderMapper.xml
0 → 100644
View file @
d53783a9
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace=
"org.xxpay.shop.dao.mapper.GoodsOrderMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"org.xxpay.shop.dao.model.GoodsOrder"
>
<id
column=
"GoodsOrderId"
property=
"goodsOrderId"
jdbcType=
"VARCHAR"
/>
<result
column=
"GoodsId"
property=
"goodsId"
jdbcType=
"VARCHAR"
/>
<result
column=
"GoodsName"
property=
"goodsName"
jdbcType=
"VARCHAR"
/>
<result
column=
"Amount"
property=
"amount"
jdbcType=
"BIGINT"
/>
<result
column=
"UserId"
property=
"userId"
jdbcType=
"VARCHAR"
/>
<result
column=
"Status"
property=
"status"
jdbcType=
"TINYINT"
/>
<result
column=
"PayOrderId"
property=
"payOrderId"
jdbcType=
"VARCHAR"
/>
<result
column=
"ChannelId"
property=
"channelId"
jdbcType=
"VARCHAR"
/>
<result
column=
"ChannelUserId"
property=
"channelUserId"
jdbcType=
"VARCHAR"
/>
<result
column=
"CreateTime"
property=
"createTime"
jdbcType=
"TIMESTAMP"
/>
<result
column=
"UpdateTime"
property=
"updateTime"
jdbcType=
"TIMESTAMP"
/>
</resultMap>
<sql
id=
"Example_Where_Clause"
>
<where
>
<foreach
collection=
"oredCriteria"
item=
"criteria"
separator=
"or"
>
<if
test=
"criteria.valid"
>
<trim
prefix=
"("
suffix=
")"
prefixOverrides=
"and"
>
<foreach
collection=
"criteria.criteria"
item=
"criterion"
>
<choose
>
<when
test=
"criterion.noValue"
>
and ${criterion.condition}
</when>
<when
test=
"criterion.singleValue"
>
and ${criterion.condition} #{criterion.value}
</when>
<when
test=
"criterion.betweenValue"
>
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when
test=
"criterion.listValue"
>
and ${criterion.condition}
<foreach
collection=
"criterion.value"
item=
"listItem"
open=
"("
close=
")"
separator=
","
>
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql
id=
"Update_By_Example_Where_Clause"
>
<where
>
<foreach
collection=
"example.oredCriteria"
item=
"criteria"
separator=
"or"
>
<if
test=
"criteria.valid"
>
<trim
prefix=
"("
suffix=
")"
prefixOverrides=
"and"
>
<foreach
collection=
"criteria.criteria"
item=
"criterion"
>
<choose
>
<when
test=
"criterion.noValue"
>
and ${criterion.condition}
</when>
<when
test=
"criterion.singleValue"
>
and ${criterion.condition} #{criterion.value}
</when>
<when
test=
"criterion.betweenValue"
>
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when
test=
"criterion.listValue"
>
and ${criterion.condition}
<foreach
collection=
"criterion.value"
item=
"listItem"
open=
"("
close=
")"
separator=
","
>
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql
id=
"Base_Column_List"
>
GoodsOrderId, GoodsId, GoodsName, Amount, UserId, Status, PayOrderId, ChannelId,
ChannelUserId, CreateTime, UpdateTime
</sql>
<select
id=
"selectByExample"
resultMap=
"BaseResultMap"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrderExample"
>
select
<if
test=
"distinct"
>
distinct
</if>
<include
refid=
"Base_Column_List"
/>
from t_goods_order
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
<if
test=
"orderByClause != null"
>
order by ${orderByClause}
</if>
<if
test=
"limit != null"
>
<if
test=
"offset != null"
>
limit ${offset}, ${limit}
</if>
<if
test=
"offset == null"
>
limit ${limit}
</if>
</if>
</select>
<select
id=
"selectByPrimaryKey"
resultMap=
"BaseResultMap"
parameterType=
"java.lang.String"
>
select
<include
refid=
"Base_Column_List"
/>
from t_goods_order
where GoodsOrderId = #{goodsOrderId,jdbcType=VARCHAR}
</select>
<delete
id=
"deleteByPrimaryKey"
parameterType=
"java.lang.String"
>
delete from t_goods_order
where GoodsOrderId = #{goodsOrderId,jdbcType=VARCHAR}
</delete>
<delete
id=
"deleteByExample"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrderExample"
>
delete from t_goods_order
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
</delete>
<insert
id=
"insert"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrder"
>
insert into t_goods_order (GoodsOrderId, GoodsId, GoodsName,
Amount, UserId, Status,
PayOrderId, ChannelId, ChannelUserId,
CreateTime, UpdateTime)
values (#{goodsOrderId,jdbcType=VARCHAR}, #{goodsId,jdbcType=VARCHAR}, #{goodsName,jdbcType=VARCHAR},
#{amount,jdbcType=BIGINT}, #{userId,jdbcType=VARCHAR}, #{status,jdbcType=TINYINT},
#{payOrderId,jdbcType=VARCHAR}, #{channelId,jdbcType=VARCHAR}, #{channelUserId,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
</insert>
<insert
id=
"insertSelective"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrder"
>
insert into t_goods_order
<trim
prefix=
"("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"goodsOrderId != null"
>
GoodsOrderId,
</if>
<if
test=
"goodsId != null"
>
GoodsId,
</if>
<if
test=
"goodsName != null"
>
GoodsName,
</if>
<if
test=
"amount != null"
>
Amount,
</if>
<if
test=
"userId != null"
>
UserId,
</if>
<if
test=
"status != null"
>
Status,
</if>
<if
test=
"payOrderId != null"
>
PayOrderId,
</if>
<if
test=
"channelId != null"
>
ChannelId,
</if>
<if
test=
"channelUserId != null"
>
ChannelUserId,
</if>
<if
test=
"createTime != null"
>
CreateTime,
</if>
<if
test=
"updateTime != null"
>
UpdateTime,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"goodsOrderId != null"
>
#{goodsOrderId,jdbcType=VARCHAR},
</if>
<if
test=
"goodsId != null"
>
#{goodsId,jdbcType=VARCHAR},
</if>
<if
test=
"goodsName != null"
>
#{goodsName,jdbcType=VARCHAR},
</if>
<if
test=
"amount != null"
>
#{amount,jdbcType=BIGINT},
</if>
<if
test=
"userId != null"
>
#{userId,jdbcType=VARCHAR},
</if>
<if
test=
"status != null"
>
#{status,jdbcType=TINYINT},
</if>
<if
test=
"payOrderId != null"
>
#{payOrderId,jdbcType=VARCHAR},
</if>
<if
test=
"channelId != null"
>
#{channelId,jdbcType=VARCHAR},
</if>
<if
test=
"channelUserId != null"
>
#{channelUserId,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
#{createTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"updateTime != null"
>
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<select
id=
"countByExample"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrderExample"
resultType=
"java.lang.Integer"
>
select count(*) from t_goods_order
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
</select>
<update
id=
"updateByExampleSelective"
parameterType=
"map"
>
update t_goods_order
<set
>
<if
test=
"record.goodsOrderId != null"
>
GoodsOrderId = #{record.goodsOrderId,jdbcType=VARCHAR},
</if>
<if
test=
"record.goodsId != null"
>
GoodsId = #{record.goodsId,jdbcType=VARCHAR},
</if>
<if
test=
"record.goodsName != null"
>
GoodsName = #{record.goodsName,jdbcType=VARCHAR},
</if>
<if
test=
"record.amount != null"
>
Amount = #{record.amount,jdbcType=BIGINT},
</if>
<if
test=
"record.userId != null"
>
UserId = #{record.userId,jdbcType=VARCHAR},
</if>
<if
test=
"record.status != null"
>
Status = #{record.status,jdbcType=TINYINT},
</if>
<if
test=
"record.payOrderId != null"
>
PayOrderId = #{record.payOrderId,jdbcType=VARCHAR},
</if>
<if
test=
"record.channelId != null"
>
ChannelId = #{record.channelId,jdbcType=VARCHAR},
</if>
<if
test=
"record.channelUserId != null"
>
ChannelUserId = #{record.channelUserId,jdbcType=VARCHAR},
</if>
<if
test=
"record.createTime != null"
>
CreateTime = #{record.createTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"record.updateTime != null"
>
UpdateTime = #{record.updateTime,jdbcType=TIMESTAMP},
</if>
</set>
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
</update>
<update
id=
"updateByExample"
parameterType=
"map"
>
update t_goods_order
set GoodsOrderId = #{record.goodsOrderId,jdbcType=VARCHAR},
GoodsId = #{record.goodsId,jdbcType=VARCHAR},
GoodsName = #{record.goodsName,jdbcType=VARCHAR},
Amount = #{record.amount,jdbcType=BIGINT},
UserId = #{record.userId,jdbcType=VARCHAR},
Status = #{record.status,jdbcType=TINYINT},
PayOrderId = #{record.payOrderId,jdbcType=VARCHAR},
ChannelId = #{record.channelId,jdbcType=VARCHAR},
ChannelUserId = #{record.channelUserId,jdbcType=VARCHAR},
CreateTime = #{record.createTime,jdbcType=TIMESTAMP},
UpdateTime = #{record.updateTime,jdbcType=TIMESTAMP}
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
</update>
<update
id=
"updateByPrimaryKeySelective"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrder"
>
update t_goods_order
<set
>
<if
test=
"goodsId != null"
>
GoodsId = #{goodsId,jdbcType=VARCHAR},
</if>
<if
test=
"goodsName != null"
>
GoodsName = #{goodsName,jdbcType=VARCHAR},
</if>
<if
test=
"amount != null"
>
Amount = #{amount,jdbcType=BIGINT},
</if>
<if
test=
"userId != null"
>
UserId = #{userId,jdbcType=VARCHAR},
</if>
<if
test=
"status != null"
>
Status = #{status,jdbcType=TINYINT},
</if>
<if
test=
"payOrderId != null"
>
PayOrderId = #{payOrderId,jdbcType=VARCHAR},
</if>
<if
test=
"channelId != null"
>
ChannelId = #{channelId,jdbcType=VARCHAR},
</if>
<if
test=
"channelUserId != null"
>
ChannelUserId = #{channelUserId,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
CreateTime = #{createTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"updateTime != null"
>
UpdateTime = #{updateTime,jdbcType=TIMESTAMP},
</if>
</set>
where GoodsOrderId = #{goodsOrderId,jdbcType=VARCHAR}
</update>
<update
id=
"updateByPrimaryKey"
parameterType=
"org.xxpay.shop.dao.model.GoodsOrder"
>
update t_goods_order
set GoodsId = #{goodsId,jdbcType=VARCHAR},
GoodsName = #{goodsName,jdbcType=VARCHAR},
Amount = #{amount,jdbcType=BIGINT},
UserId = #{userId,jdbcType=VARCHAR},
Status = #{status,jdbcType=TINYINT},
PayOrderId = #{payOrderId,jdbcType=VARCHAR},
ChannelId = #{channelId,jdbcType=VARCHAR},
ChannelUserId = #{channelUserId,jdbcType=VARCHAR},
CreateTime = #{createTime,jdbcType=TIMESTAMP},
UpdateTime = #{updateTime,jdbcType=TIMESTAMP}
where GoodsOrderId = #{goodsOrderId,jdbcType=VARCHAR}
</update>
</mapper>
\ No newline at end of file
xxpay-shop/src/main/resources/static/app/app.js
0 → 100755
View file @
d53783a9
(
function
(
angular
)
{
angular
.
module
(
"
myApp.controllers
"
,
[]);
angular
.
module
(
"
myApp.services
"
,
[]);
angular
.
module
(
"
myApp
"
,
[
"
ngResource
"
,
"
myApp.controllers
"
,
"
myApp.services
"
]);
}(
angular
));
\ No newline at end of file
xxpay-shop/src/main/resources/static/app/controllers.js
0 → 100755
View file @
d53783a9
(
function
(
angular
)
{
var
AppController
=
function
(
$scope
,
Item
)
{
Item
.
query
(
function
(
response
)
{
$scope
.
items
=
response
?
response
:
[];
});
$scope
.
addItem
=
function
(
content
)
{
new
Item
({
content
:
content
,
checked
:
false
}).
$save
(
function
(
item
)
{
$scope
.
items
.
push
(
item
);
});
$scope
.
newItem
=
""
;
};
$scope
.
updateItem
=
function
(
item
)
{
item
.
$update
();
};
$scope
.
deleteItem
=
function
(
item
)
{
item
.
$remove
(
function
()
{
$scope
.
items
.
splice
(
$scope
.
items
.
indexOf
(
item
),
1
);
});
};
};
AppController
.
$inject
=
[
'
$scope
'
,
'
Item
'
];
angular
.
module
(
"
myApp.controllers
"
).
controller
(
"
AppController
"
,
AppController
);
}(
angular
));
\ No newline at end of file
xxpay-shop/src/main/resources/static/app/services.js
0 → 100755
View file @
d53783a9
(
function
(
angular
)
{
var
ItemFactory
=
function
(
$resource
)
{
return
$resource
(
'
/todos/:id
'
,
{
id
:
'
@id
'
},
{
update
:
{
method
:
"
PUT
"
},
remove
:
{
method
:
"
DELETE
"
}
});
};
ItemFactory
.
$inject
=
[
'
$resource
'
];
angular
.
module
(
"
myApp.services
"
).
factory
(
"
Item
"
,
ItemFactory
);
}(
angular
));
\ No newline at end of file
xxpay-shop/src/main/resources/static/css/main.css
0 → 100755
View file @
d53783a9
html
{
position
:
relative
;
min-height
:
100%
;
}
body
{
/* Margin bottom by footer height */
margin-bottom
:
60px
;
}
.footer
{
position
:
absolute
;
bottom
:
0
;
width
:
100%
;
/* Set the fixed height of the footer here */
height
:
60px
;
background-color
:
#f5f5f5
;
}
.container
{
width
:
auto
;
max-width
:
680px
;
padding
:
0
15px
;
}
.container
.text-muted
{
margin
:
20px
0
;
}
\ No newline at end of file
xxpay-shop/src/main/resources/static/favicon.ico
0 → 100644
View file @
d53783a9
1.12 KB
xxpay-shop/src/main/resources/static/js/qrcode.js
0 → 100755
View file @
d53783a9
/**
* @fileoverview
* - Using the 'QRCode for Javascript library'
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
*/
var
QRCode
;
(
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
//
//---------------------------------------------------------------------
function
QR8bitByte
(
data
)
{
this
.
mode
=
QRMode
.
MODE_8BIT_BYTE
;
this
.
data
=
data
;
this
.
parsedData
=
[];
// Added to support UTF-8 Characters
for
(
var
i
=
0
,
l
=
this
.
data
.
length
;
i
<
l
;
i
++
)
{
var
byteArray
=
[];
var
code
=
this
.
data
.
charCodeAt
(
i
);
if
(
code
>
0x10000
)
{
byteArray
[
0
]
=
0xF0
|
((
code
&
0x1C0000
)
>>>
18
);
byteArray
[
1
]
=
0x80
|
((
code
&
0x3F000
)
>>>
12
);
byteArray
[
2
]
=
0x80
|
((
code
&
0xFC0
)
>>>
6
);
byteArray
[
3
]
=
0x80
|
(
code
&
0x3F
);
}
else
if
(
code
>
0x800
)
{
byteArray
[
0
]
=
0xE0
|
((
code
&
0xF000
)
>>>
12
);
byteArray
[
1
]
=
0x80
|
((
code
&
0xFC0
)
>>>
6
);
byteArray
[
2
]
=
0x80
|
(
code
&
0x3F
);
}
else
if
(
code
>
0x80
)
{
byteArray
[
0
]
=
0xC0
|
((
code
&
0x7C0
)
>>>
6
);
byteArray
[
1
]
=
0x80
|
(
code
&
0x3F
);
}
else
{
byteArray
[
0
]
=
code
;
}
this
.
parsedData
.
push
(
byteArray
);
}
this
.
parsedData
=
Array
.
prototype
.
concat
.
apply
([],
this
.
parsedData
);
if
(
this
.
parsedData
.
length
!=
this
.
data
.
length
)
{
this
.
parsedData
.
unshift
(
191
);
this
.
parsedData
.
unshift
(
187
);
this
.
parsedData
.
unshift
(
239
);
}
}
QR8bitByte
.
prototype
=
{
getLength
:
function
(
buffer
)
{
return
this
.
parsedData
.
length
;
},
write
:
function
(
buffer
)
{
for
(
var
i
=
0
,
l
=
this
.
parsedData
.
length
;
i
<
l
;
i
++
)
{
buffer
.
put
(
this
.
parsedData
[
i
],
8
);
}
}
};
function
QRCodeModel
(
typeNumber
,
errorCorrectLevel
)
{
this
.
typeNumber
=
typeNumber
;
this
.
errorCorrectLevel
=
errorCorrectLevel
;
this
.
modules
=
null
;
this
.
moduleCount
=
0
;
this
.
dataCache
=
null
;
this
.
dataList
=
[];
}
QRCodeModel
.
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
(){
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
;}}
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
=
QRCodeModel
.
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
);
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
;}}
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
;}}
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
;}}}}};
QRCodeModel
.
PAD0
=
0xEC
;
QRCodeModel
.
PAD1
=
0x11
;
QRCodeModel
.
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
);}
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
+
"
)
"
);}
if
(
buffer
.
getLengthInBits
()
+
4
<=
totalDataCount
*
8
){
buffer
.
put
(
0
,
4
);}
while
(
buffer
.
getLengthInBits
()
%
8
!=
0
){
buffer
.
putBit
(
false
);}
while
(
true
){
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
){
break
;}
buffer
.
put
(
QRCodeModel
.
PAD0
,
8
);
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
){
break
;}
buffer
.
put
(
QRCodeModel
.
PAD1
,
8
);}
return
QRCodeModel
.
createBytes
(
buffer
,
rsBlocks
);};
QRCodeModel
.
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
;};
var
QRMode
=
{
MODE_NUMBER
:
1
<<
0
,
MODE_ALPHA_NUM
:
1
<<
1
,
MODE_8BIT_BYTE
:
1
<<
2
,
MODE_KANJI
:
1
<<
3
};
var
QRErrorCorrectLevel
=
{
L
:
1
,
M
:
0
,
Q
:
3
,
H
:
2
};
var
QRMaskPattern
=
{
PATTERN000
:
0
,
PATTERN001
:
1
,
PATTERN010
:
2
,
PATTERN011
:
3
,
PATTERN100
:
4
,
PATTERN101
:
5
,
PATTERN110
:
6
,
PATTERN111
:
7
};
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
){
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
){
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
){
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
;
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
);}}}
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
;}}}
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
;}}}
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
;}};
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
;}
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
);}
return
new
QRPolynomial
(
num
,
0
).
mod
(
e
);}};
function
QRRSBlock
(
totalCount
,
dataCount
){
this
.
totalCount
=
totalCount
;
this
.
dataCount
=
dataCount
;}
QRRSBlock
.
RS_BLOCK_TABLE
=
[[
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
]];
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
=
[];
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
;}};
function
QRBitBuffer
(){
this
.
buffer
=
[];
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
++
;}};
var
QRCodeLimitLength
=
[[
17
,
14
,
11
,
7
],[
32
,
26
,
20
,
14
],[
53
,
42
,
32
,
24
],[
78
,
62
,
46
,
34
],[
106
,
84
,
60
,
44
],[
134
,
106
,
74
,
58
],[
154
,
122
,
86
,
64
],[
192
,
152
,
108
,
84
],[
230
,
180
,
130
,
98
],[
271
,
213
,
151
,
119
],[
321
,
251
,
177
,
137
],[
367
,
287
,
203
,
155
],[
425
,
331
,
241
,
177
],[
458
,
362
,
258
,
194
],[
520
,
412
,
292
,
220
],[
586
,
450
,
322
,
250
],[
644
,
504
,
364
,
280
],[
718
,
560
,
394
,
310
],[
792
,
624
,
442
,
338
],[
858
,
666
,
482
,
382
],[
929
,
711
,
509
,
403
],[
1003
,
779
,
565
,
439
],[
1091
,
857
,
611
,
461
],[
1171
,
911
,
661
,
511
],[
1273
,
997
,
715
,
535
],[
1367
,
1059
,
751
,
593
],[
1465
,
1125
,
805
,
625
],[
1528
,
1190
,
868
,
658
],[
1628
,
1264
,
908
,
698
],[
1732
,
1370
,
982
,
742
],[
1840
,
1452
,
1030
,
790
],[
1952
,
1538
,
1112
,
842
],[
2068
,
1628
,
1168
,
898
],[
2188
,
1722
,
1228
,
958
],[
2303
,
1809
,
1283
,
983
],[
2431
,
1911
,
1351
,
1051
],[
2563
,
1989
,
1423
,
1093
],[
2699
,
2099
,
1499
,
1139
],[
2809
,
2213
,
1579
,
1219
],[
2953
,
2331
,
1663
,
1273
]];
function
_isSupportCanvas
()
{
return
typeof
CanvasRenderingContext2D
!=
"
undefined
"
;
}
// android 2.x doesn't support Data-URI spec
function
_getAndroid
()
{
var
android
=
false
;
var
sAgent
=
navigator
.
userAgent
;
if
(
/android/i
.
test
(
sAgent
))
{
// android
android
=
true
;
var
aMat
=
sAgent
.
toString
().
match
(
/android
([
0-9
]\.[
0-9
])
/i
);
if
(
aMat
&&
aMat
[
1
])
{
android
=
parseFloat
(
aMat
[
1
]);
}
}
return
android
;
}
var
svgDrawer
=
(
function
()
{
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_el
=
el
;
this
.
_htOption
=
htOption
;
};
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
var
_htOption
=
this
.
_htOption
;
var
_el
=
this
.
_el
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
Math
.
floor
(
_htOption
.
width
/
nCount
);
var
nHeight
=
Math
.
floor
(
_htOption
.
height
/
nCount
);
this
.
clear
();
function
makeSVG
(
tag
,
attrs
)
{
var
el
=
document
.
createElementNS
(
'
http://www.w3.org/2000/svg
'
,
tag
);
for
(
var
k
in
attrs
)
if
(
attrs
.
hasOwnProperty
(
k
))
el
.
setAttribute
(
k
,
attrs
[
k
]);
return
el
;
}
var
svg
=
makeSVG
(
"
svg
"
,
{
'
viewBox
'
:
'
0 0
'
+
String
(
nCount
)
+
"
"
+
String
(
nCount
),
'
width
'
:
'
100%
'
,
'
height
'
:
'
100%
'
,
'
fill
'
:
_htOption
.
colorLight
});
svg
.
setAttributeNS
(
"
http://www.w3.org/2000/xmlns/
"
,
"
xmlns:xlink
"
,
"
http://www.w3.org/1999/xlink
"
);
_el
.
appendChild
(
svg
);
svg
.
appendChild
(
makeSVG
(
"
rect
"
,
{
"
fill
"
:
_htOption
.
colorLight
,
"
width
"
:
"
100%
"
,
"
height
"
:
"
100%
"
}));
svg
.
appendChild
(
makeSVG
(
"
rect
"
,
{
"
fill
"
:
_htOption
.
colorDark
,
"
width
"
:
"
1
"
,
"
height
"
:
"
1
"
,
"
id
"
:
"
template
"
}));
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
if
(
oQRCode
.
isDark
(
row
,
col
))
{
var
child
=
makeSVG
(
"
use
"
,
{
"
x
"
:
String
(
col
),
"
y
"
:
String
(
row
)});
child
.
setAttributeNS
(
"
http://www.w3.org/1999/xlink
"
,
"
href
"
,
"
#template
"
)
svg
.
appendChild
(
child
);
}
}
}
};
Drawing
.
prototype
.
clear
=
function
()
{
while
(
this
.
_el
.
hasChildNodes
())
this
.
_el
.
removeChild
(
this
.
_el
.
lastChild
);
};
return
Drawing
;
})();
var
useSVG
=
document
.
documentElement
.
tagName
.
toLowerCase
()
===
"
svg
"
;
// Drawing in DOM by using Table tag
var
Drawing
=
useSVG
?
svgDrawer
:
!
_isSupportCanvas
()
?
(
function
()
{
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_el
=
el
;
this
.
_htOption
=
htOption
;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
var
_htOption
=
this
.
_htOption
;
var
_el
=
this
.
_el
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
Math
.
floor
(
_htOption
.
width
/
nCount
);
var
nHeight
=
Math
.
floor
(
_htOption
.
height
/
nCount
);
var
aHTML
=
[
'
<table style="border:0;border-collapse:collapse;">
'
];
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
aHTML
.
push
(
'
<tr>
'
);
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
aHTML
.
push
(
'
<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:
'
+
nWidth
+
'
px;height:
'
+
nHeight
+
'
px;background-color:
'
+
(
oQRCode
.
isDark
(
row
,
col
)
?
_htOption
.
colorDark
:
_htOption
.
colorLight
)
+
'
;"></td>
'
);
}
aHTML
.
push
(
'
</tr>
'
);
}
aHTML
.
push
(
'
</table>
'
);
_el
.
innerHTML
=
aHTML
.
join
(
''
);
// Fix the margin values as real size.
var
elTable
=
_el
.
childNodes
[
0
];
var
nLeftMarginTable
=
(
_htOption
.
width
-
elTable
.
offsetWidth
)
/
2
;
var
nTopMarginTable
=
(
_htOption
.
height
-
elTable
.
offsetHeight
)
/
2
;
if
(
nLeftMarginTable
>
0
&&
nTopMarginTable
>
0
)
{
elTable
.
style
.
margin
=
nTopMarginTable
+
"
px
"
+
nLeftMarginTable
+
"
px
"
;
}
};
/**
* Clear the QRCode
*/
Drawing
.
prototype
.
clear
=
function
()
{
this
.
_el
.
innerHTML
=
''
;
};
return
Drawing
;
})()
:
(
function
()
{
// Drawing in Canvas
function
_onMakeImage
()
{
this
.
_elImage
.
src
=
this
.
_elCanvas
.
toDataURL
(
"
image/png
"
);
this
.
_elImage
.
style
.
display
=
"
block
"
;
this
.
_elCanvas
.
style
.
display
=
"
none
"
;
}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if
(
this
.
_android
&&
this
.
_android
<=
2.1
)
{
var
factor
=
1
/
window
.
devicePixelRatio
;
var
drawImage
=
CanvasRenderingContext2D
.
prototype
.
drawImage
;
CanvasRenderingContext2D
.
prototype
.
drawImage
=
function
(
image
,
sx
,
sy
,
sw
,
sh
,
dx
,
dy
,
dw
,
dh
)
{
if
((
"
nodeName
"
in
image
)
&&
/img/i
.
test
(
image
.
nodeName
))
{
for
(
var
i
=
arguments
.
length
-
1
;
i
>=
1
;
i
--
)
{
arguments
[
i
]
=
arguments
[
i
]
*
factor
;
}
}
else
if
(
typeof
dw
==
"
undefined
"
)
{
arguments
[
1
]
*=
factor
;
arguments
[
2
]
*=
factor
;
arguments
[
3
]
*=
factor
;
arguments
[
4
]
*=
factor
;
}
drawImage
.
apply
(
this
,
arguments
);
};
}
/**
* Check whether the user's browser supports Data URI or not
*
* @private
* @param {Function} fSuccess Occurs if it supports Data URI
* @param {Function} fFail Occurs if it doesn't support Data URI
*/
function
_safeSetDataURI
(
fSuccess
,
fFail
)
{
var
self
=
this
;
self
.
_fFail
=
fFail
;
self
.
_fSuccess
=
fSuccess
;
// Check it just once
if
(
self
.
_bSupportDataURI
===
null
)
{
var
el
=
document
.
createElement
(
"
img
"
);
var
fOnError
=
function
()
{
self
.
_bSupportDataURI
=
false
;
if
(
self
.
_fFail
)
{
self
.
_fFail
.
call
(
self
);
}
};
var
fOnSuccess
=
function
()
{
self
.
_bSupportDataURI
=
true
;
if
(
self
.
_fSuccess
)
{
self
.
_fSuccess
.
call
(
self
);
}
};
el
.
onabort
=
fOnError
;
el
.
onerror
=
fOnError
;
el
.
onload
=
fOnSuccess
;
el
.
src
=
"
data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
"
;
// the Image contains 1px data.
return
;
}
else
if
(
self
.
_bSupportDataURI
===
true
&&
self
.
_fSuccess
)
{
self
.
_fSuccess
.
call
(
self
);
}
else
if
(
self
.
_bSupportDataURI
===
false
&&
self
.
_fFail
)
{
self
.
_fFail
.
call
(
self
);
}
};
/**
* Drawing QRCode by using canvas
*
* @constructor
* @param {HTMLElement} el
* @param {Object} htOption QRCode Options
*/
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_bIsPainted
=
false
;
this
.
_android
=
_getAndroid
();
this
.
_htOption
=
htOption
;
this
.
_elCanvas
=
document
.
createElement
(
"
canvas
"
);
this
.
_elCanvas
.
width
=
htOption
.
width
;
this
.
_elCanvas
.
height
=
htOption
.
height
;
el
.
appendChild
(
this
.
_elCanvas
);
this
.
_el
=
el
;
this
.
_oContext
=
this
.
_elCanvas
.
getContext
(
"
2d
"
);
this
.
_bIsPainted
=
false
;
this
.
_elImage
=
document
.
createElement
(
"
img
"
);
this
.
_elImage
.
alt
=
"
Scan me!
"
;
this
.
_elImage
.
style
.
display
=
"
none
"
;
this
.
_el
.
appendChild
(
this
.
_elImage
);
this
.
_bSupportDataURI
=
null
;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
var
_elImage
=
this
.
_elImage
;
var
_oContext
=
this
.
_oContext
;
var
_htOption
=
this
.
_htOption
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
_htOption
.
width
/
nCount
;
var
nHeight
=
_htOption
.
height
/
nCount
;
var
nRoundedWidth
=
Math
.
round
(
nWidth
);
var
nRoundedHeight
=
Math
.
round
(
nHeight
);
_elImage
.
style
.
display
=
"
none
"
;
this
.
clear
();
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
var
bIsDark
=
oQRCode
.
isDark
(
row
,
col
);
var
nLeft
=
col
*
nWidth
;
var
nTop
=
row
*
nHeight
;
_oContext
.
strokeStyle
=
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
;
_oContext
.
lineWidth
=
1
;
_oContext
.
fillStyle
=
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
;
_oContext
.
fillRect
(
nLeft
,
nTop
,
nWidth
,
nHeight
);
// 안티 앨리어싱 방지 처리
_oContext
.
strokeRect
(
Math
.
floor
(
nLeft
)
+
0.5
,
Math
.
floor
(
nTop
)
+
0.5
,
nRoundedWidth
,
nRoundedHeight
);
_oContext
.
strokeRect
(
Math
.
ceil
(
nLeft
)
-
0.5
,
Math
.
ceil
(
nTop
)
-
0.5
,
nRoundedWidth
,
nRoundedHeight
);
}
}
this
.
_bIsPainted
=
true
;
};
/**
* Make the image from Canvas if the browser supports Data URI.
*/
Drawing
.
prototype
.
makeImage
=
function
()
{
if
(
this
.
_bIsPainted
)
{
_safeSetDataURI
.
call
(
this
,
_onMakeImage
);
}
};
/**
* Return whether the QRCode is painted or not
*
* @return {Boolean}
*/
Drawing
.
prototype
.
isPainted
=
function
()
{
return
this
.
_bIsPainted
;
};
/**
* Clear the QRCode
*/
Drawing
.
prototype
.
clear
=
function
()
{
this
.
_oContext
.
clearRect
(
0
,
0
,
this
.
_elCanvas
.
width
,
this
.
_elCanvas
.
height
);
this
.
_bIsPainted
=
false
;
};
/**
* @private
* @param {Number} nNumber
*/
Drawing
.
prototype
.
round
=
function
(
nNumber
)
{
if
(
!
nNumber
)
{
return
nNumber
;
}
return
Math
.
floor
(
nNumber
*
1000
)
/
1000
;
};
return
Drawing
;
})();
/**
* Get the type by string length
*
* @private
* @param {String} sText
* @param {Number} nCorrectLevel
* @return {Number} type
*/
function
_getTypeNumber
(
sText
,
nCorrectLevel
)
{
var
nType
=
1
;
var
length
=
_getUTF8Length
(
sText
);
for
(
var
i
=
0
,
len
=
QRCodeLimitLength
.
length
;
i
<=
len
;
i
++
)
{
var
nLimit
=
0
;
switch
(
nCorrectLevel
)
{
case
QRErrorCorrectLevel
.
L
:
nLimit
=
QRCodeLimitLength
[
i
][
0
];
break
;
case
QRErrorCorrectLevel
.
M
:
nLimit
=
QRCodeLimitLength
[
i
][
1
];
break
;
case
QRErrorCorrectLevel
.
Q
:
nLimit
=
QRCodeLimitLength
[
i
][
2
];
break
;
case
QRErrorCorrectLevel
.
H
:
nLimit
=
QRCodeLimitLength
[
i
][
3
];
break
;
}
if
(
length
<=
nLimit
)
{
break
;
}
else
{
nType
++
;
}
}
if
(
nType
>
QRCodeLimitLength
.
length
)
{
throw
new
Error
(
"
Too long data
"
);
}
return
nType
;
}
function
_getUTF8Length
(
sText
)
{
var
replacedText
=
encodeURI
(
sText
).
toString
().
replace
(
/
\%[
0-9a-fA-F
]{2}
/g
,
'
a
'
);
return
replacedText
.
length
+
(
replacedText
.
length
!=
sText
?
3
:
0
);
}
/**
* @class QRCode
* @constructor
* @example
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
*
* @example
* var oQRCode = new QRCode("test", {
* text : "http://naver.com",
* width : 128,
* height : 128
* });
*
* oQRCode.clear(); // Clear the QRCode.
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
*
* @param {HTMLElement|String} el target element or 'id' attribute of element.
* @param {Object|String} vOption
* @param {String} vOption.text QRCode link data
* @param {Number} [vOption.width=256]
* @param {Number} [vOption.height=256]
* @param {String} [vOption.colorDark="#000000"]
* @param {String} [vOption.colorLight="#ffffff"]
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
*/
QRCode
=
function
(
el
,
vOption
)
{
this
.
_htOption
=
{
width
:
256
,
height
:
256
,
typeNumber
:
4
,
colorDark
:
"
#000000
"
,
colorLight
:
"
#ffffff
"
,
correctLevel
:
QRErrorCorrectLevel
.
H
};
if
(
typeof
vOption
===
'
string
'
)
{
vOption
=
{
text
:
vOption
};
}
// Overwrites options
if
(
vOption
)
{
for
(
var
i
in
vOption
)
{
this
.
_htOption
[
i
]
=
vOption
[
i
];
}
}
if
(
typeof
el
==
"
string
"
)
{
el
=
document
.
getElementById
(
el
);
}
if
(
this
.
_htOption
.
useSVG
)
{
Drawing
=
svgDrawer
;
}
this
.
_android
=
_getAndroid
();
this
.
_el
=
el
;
this
.
_oQRCode
=
null
;
this
.
_oDrawing
=
new
Drawing
(
this
.
_el
,
this
.
_htOption
);
if
(
this
.
_htOption
.
text
)
{
this
.
makeCode
(
this
.
_htOption
.
text
);
}
};
/**
* Make the QRCode
*
* @param {String} sText link data
*/
QRCode
.
prototype
.
makeCode
=
function
(
sText
)
{
this
.
_oQRCode
=
new
QRCodeModel
(
_getTypeNumber
(
sText
,
this
.
_htOption
.
correctLevel
),
this
.
_htOption
.
correctLevel
);
this
.
_oQRCode
.
addData
(
sText
);
this
.
_oQRCode
.
make
();
this
.
_el
.
title
=
sText
;
this
.
_oDrawing
.
draw
(
this
.
_oQRCode
);
this
.
makeImage
();
};
/**
* Make the Image from Canvas element
* - It occurs automatically
* - Android below 3 doesn't support Data-URI spec.
*
* @private
*/
QRCode
.
prototype
.
makeImage
=
function
()
{
if
(
typeof
this
.
_oDrawing
.
makeImage
==
"
function
"
&&
(
!
this
.
_android
||
this
.
_android
>=
3
))
{
this
.
_oDrawing
.
makeImage
();
}
};
/**
* Clear the QRCode
*/
QRCode
.
prototype
.
clear
=
function
()
{
this
.
_oDrawing
.
clear
();
};
/**
* @name QRCode.CorrectLevel
*/
QRCode
.
CorrectLevel
=
QRErrorCorrectLevel
;
})();
xxpay-shop/src/main/resources/static/js/qrcode.min.js
0 → 100755
View file @
d53783a9
var
QRCode
;
!
function
(){
function
a
(
a
){
this
.
mode
=
c
.
MODE_8BIT_BYTE
,
this
.
data
=
a
,
this
.
parsedData
=
[];
for
(
var
b
=
[],
d
=
0
,
e
=
this
.
data
.
length
;
e
>
d
;
d
++
){
var
f
=
this
.
data
.
charCodeAt
(
d
);
f
>
65536
?(
b
[
0
]
=
240
|
(
1835008
&
f
)
>>>
18
,
b
[
1
]
=
128
|
(
258048
&
f
)
>>>
12
,
b
[
2
]
=
128
|
(
4032
&
f
)
>>>
6
,
b
[
3
]
=
128
|
63
&
f
):
f
>
2048
?(
b
[
0
]
=
224
|
(
61440
&
f
)
>>>
12
,
b
[
1
]
=
128
|
(
4032
&
f
)
>>>
6
,
b
[
2
]
=
128
|
63
&
f
):
f
>
128
?(
b
[
0
]
=
192
|
(
1984
&
f
)
>>>
6
,
b
[
1
]
=
128
|
63
&
f
):
b
[
0
]
=
f
,
this
.
parsedData
=
this
.
parsedData
.
concat
(
b
)}
this
.
parsedData
.
length
!=
this
.
data
.
length
&&
(
this
.
parsedData
.
unshift
(
191
),
this
.
parsedData
.
unshift
(
187
),
this
.
parsedData
.
unshift
(
239
))}
function
b
(
a
,
b
){
this
.
typeNumber
=
a
,
this
.
errorCorrectLevel
=
b
,
this
.
modules
=
null
,
this
.
moduleCount
=
0
,
this
.
dataCache
=
null
,
this
.
dataList
=
[]}
function
i
(
a
,
b
){
if
(
void
0
==
a
.
length
)
throw
new
Error
(
a
.
length
+
"
/
"
+
b
);
for
(
var
c
=
0
;
c
<
a
.
length
&&
0
==
a
[
c
];)
c
++
;
this
.
num
=
new
Array
(
a
.
length
-
c
+
b
);
for
(
var
d
=
0
;
d
<
a
.
length
-
c
;
d
++
)
this
.
num
[
d
]
=
a
[
d
+
c
]}
function
j
(
a
,
b
){
this
.
totalCount
=
a
,
this
.
dataCount
=
b
}
function
k
(){
this
.
buffer
=
[],
this
.
length
=
0
}
function
m
(){
return
"
undefined
"
!=
typeof
CanvasRenderingContext2D
}
function
n
(){
var
a
=!
1
,
b
=
navigator
.
userAgent
;
return
/android/i
.
test
(
b
)
&&
(
a
=!
0
,
aMat
=
b
.
toString
().
match
(
/android
([
0-9
]\.[
0-9
])
/i
),
aMat
&&
aMat
[
1
]
&&
(
a
=
parseFloat
(
aMat
[
1
]))),
a
}
function
r
(
a
,
b
){
for
(
var
c
=
1
,
e
=
s
(
a
),
f
=
0
,
g
=
l
.
length
;
g
>=
f
;
f
++
){
var
h
=
0
;
switch
(
b
){
case
d
.
L
:
h
=
l
[
f
][
0
];
break
;
case
d
.
M
:
h
=
l
[
f
][
1
];
break
;
case
d
.
Q
:
h
=
l
[
f
][
2
];
break
;
case
d
.
H
:
h
=
l
[
f
][
3
]}
if
(
h
>=
e
)
break
;
c
++
}
if
(
c
>
l
.
length
)
throw
new
Error
(
"
Too long data
"
);
return
c
}
function
s
(
a
){
var
b
=
encodeURI
(
a
).
toString
().
replace
(
/
\%[
0-9a-fA-F
]{2}
/g
,
"
a
"
);
return
b
.
length
+
(
b
.
length
!=
a
?
3
:
0
)}
a
.
prototype
=
{
getLength
:
function
(){
return
this
.
parsedData
.
length
},
write
:
function
(
a
){
for
(
var
b
=
0
,
c
=
this
.
parsedData
.
length
;
c
>
b
;
b
++
)
a
.
put
(
this
.
parsedData
[
b
],
8
)}},
b
.
prototype
=
{
addData
:
function
(
b
){
var
c
=
new
a
(
b
);
this
.
dataList
.
push
(
c
),
this
.
dataCache
=
null
},
isDark
:
function
(
a
,
b
){
if
(
0
>
a
||
this
.
moduleCount
<=
a
||
0
>
b
||
this
.
moduleCount
<=
b
)
throw
new
Error
(
a
+
"
,
"
+
b
);
return
this
.
modules
[
a
][
b
]},
getModuleCount
:
function
(){
return
this
.
moduleCount
},
make
:
function
(){
this
.
makeImpl
(
!
1
,
this
.
getBestMaskPattern
())},
makeImpl
:
function
(
a
,
c
){
this
.
moduleCount
=
4
*
this
.
typeNumber
+
17
,
this
.
modules
=
new
Array
(
this
.
moduleCount
);
for
(
var
d
=
0
;
d
<
this
.
moduleCount
;
d
++
){
this
.
modules
[
d
]
=
new
Array
(
this
.
moduleCount
);
for
(
var
e
=
0
;
e
<
this
.
moduleCount
;
e
++
)
this
.
modules
[
d
][
e
]
=
null
}
this
.
setupPositionProbePattern
(
0
,
0
),
this
.
setupPositionProbePattern
(
this
.
moduleCount
-
7
,
0
),
this
.
setupPositionProbePattern
(
0
,
this
.
moduleCount
-
7
),
this
.
setupPositionAdjustPattern
(),
this
.
setupTimingPattern
(),
this
.
setupTypeInfo
(
a
,
c
),
this
.
typeNumber
>=
7
&&
this
.
setupTypeNumber
(
a
),
null
==
this
.
dataCache
&&
(
this
.
dataCache
=
b
.
createData
(
this
.
typeNumber
,
this
.
errorCorrectLevel
,
this
.
dataList
)),
this
.
mapData
(
this
.
dataCache
,
c
)},
setupPositionProbePattern
:
function
(
a
,
b
){
for
(
var
c
=-
1
;
7
>=
c
;
c
++
)
if
(
!
(
-
1
>=
a
+
c
||
this
.
moduleCount
<=
a
+
c
))
for
(
var
d
=-
1
;
7
>=
d
;
d
++
)
-
1
>=
b
+
d
||
this
.
moduleCount
<=
b
+
d
||
(
this
.
modules
[
a
+
c
][
b
+
d
]
=
c
>=
0
&&
6
>=
c
&&
(
0
==
d
||
6
==
d
)
||
d
>=
0
&&
6
>=
d
&&
(
0
==
c
||
6
==
c
)
||
c
>=
2
&&
4
>=
c
&&
d
>=
2
&&
4
>=
d
?
!
0
:
!
1
)},
getBestMaskPattern
:
function
(){
for
(
var
a
=
0
,
b
=
0
,
c
=
0
;
8
>
c
;
c
++
){
this
.
makeImpl
(
!
0
,
c
);
var
d
=
f
.
getLostPoint
(
this
);(
0
==
c
||
a
>
d
)
&&
(
a
=
d
,
b
=
c
)}
return
b
},
createMovieClip
:
function
(
a
,
b
,
c
){
var
d
=
a
.
createEmptyMovieClip
(
b
,
c
),
e
=
1
;
this
.
make
();
for
(
var
f
=
0
;
f
<
this
.
modules
.
length
;
f
++
)
for
(
var
g
=
f
*
e
,
h
=
0
;
h
<
this
.
modules
[
f
].
length
;
h
++
){
var
i
=
h
*
e
,
j
=
this
.
modules
[
f
][
h
];
j
&&
(
d
.
beginFill
(
0
,
100
),
d
.
moveTo
(
i
,
g
),
d
.
lineTo
(
i
+
e
,
g
),
d
.
lineTo
(
i
+
e
,
g
+
e
),
d
.
lineTo
(
i
,
g
+
e
),
d
.
endFill
())}
return
d
},
setupTimingPattern
:
function
(){
for
(
var
a
=
8
;
a
<
this
.
moduleCount
-
8
;
a
++
)
null
==
this
.
modules
[
a
][
6
]
&&
(
this
.
modules
[
a
][
6
]
=
0
==
a
%
2
);
for
(
var
b
=
8
;
b
<
this
.
moduleCount
-
8
;
b
++
)
null
==
this
.
modules
[
6
][
b
]
&&
(
this
.
modules
[
6
][
b
]
=
0
==
b
%
2
)},
setupPositionAdjustPattern
:
function
(){
for
(
var
a
=
f
.
getPatternPosition
(
this
.
typeNumber
),
b
=
0
;
b
<
a
.
length
;
b
++
)
for
(
var
c
=
0
;
c
<
a
.
length
;
c
++
){
var
d
=
a
[
b
],
e
=
a
[
c
];
if
(
null
==
this
.
modules
[
d
][
e
])
for
(
var
g
=-
2
;
2
>=
g
;
g
++
)
for
(
var
h
=-
2
;
2
>=
h
;
h
++
)
this
.
modules
[
d
+
g
][
e
+
h
]
=-
2
==
g
||
2
==
g
||-
2
==
h
||
2
==
h
||
0
==
g
&&
0
==
h
?
!
0
:
!
1
}},
setupTypeNumber
:
function
(
a
){
for
(
var
b
=
f
.
getBCHTypeNumber
(
this
.
typeNumber
),
c
=
0
;
18
>
c
;
c
++
){
var
d
=!
a
&&
1
==
(
1
&
b
>>
c
);
this
.
modules
[
Math
.
floor
(
c
/
3
)][
c
%
3
+
this
.
moduleCount
-
8
-
3
]
=
d
}
for
(
var
c
=
0
;
18
>
c
;
c
++
){
var
d
=!
a
&&
1
==
(
1
&
b
>>
c
);
this
.
modules
[
c
%
3
+
this
.
moduleCount
-
8
-
3
][
Math
.
floor
(
c
/
3
)]
=
d
}},
setupTypeInfo
:
function
(
a
,
b
){
for
(
var
c
=
this
.
errorCorrectLevel
<<
3
|
b
,
d
=
f
.
getBCHTypeInfo
(
c
),
e
=
0
;
15
>
e
;
e
++
){
var
g
=!
a
&&
1
==
(
1
&
d
>>
e
);
6
>
e
?
this
.
modules
[
e
][
8
]
=
g
:
8
>
e
?
this
.
modules
[
e
+
1
][
8
]
=
g
:
this
.
modules
[
this
.
moduleCount
-
15
+
e
][
8
]
=
g
}
for
(
var
e
=
0
;
15
>
e
;
e
++
){
var
g
=!
a
&&
1
==
(
1
&
d
>>
e
);
8
>
e
?
this
.
modules
[
8
][
this
.
moduleCount
-
e
-
1
]
=
g
:
9
>
e
?
this
.
modules
[
8
][
15
-
e
-
1
+
1
]
=
g
:
this
.
modules
[
8
][
15
-
e
-
1
]
=
g
}
this
.
modules
[
this
.
moduleCount
-
8
][
8
]
=!
a
},
mapData
:
function
(
a
,
b
){
for
(
var
c
=-
1
,
d
=
this
.
moduleCount
-
1
,
e
=
7
,
g
=
0
,
h
=
this
.
moduleCount
-
1
;
h
>
0
;
h
-=
2
)
for
(
6
==
h
&&
h
--
;;){
for
(
var
i
=
0
;
2
>
i
;
i
++
)
if
(
null
==
this
.
modules
[
d
][
h
-
i
]){
var
j
=!
1
;
g
<
a
.
length
&&
(
j
=
1
==
(
1
&
a
[
g
]
>>>
e
));
var
k
=
f
.
getMask
(
b
,
d
,
h
-
i
);
k
&&
(
j
=!
j
),
this
.
modules
[
d
][
h
-
i
]
=
j
,
e
--
,
-
1
==
e
&&
(
g
++
,
e
=
7
)}
if
(
d
+=
c
,
0
>
d
||
this
.
moduleCount
<=
d
){
d
-=
c
,
c
=-
c
;
break
}}}},
b
.
PAD0
=
236
,
b
.
PAD1
=
17
,
b
.
createData
=
function
(
a
,
c
,
d
){
for
(
var
e
=
j
.
getRSBlocks
(
a
,
c
),
g
=
new
k
,
h
=
0
;
h
<
d
.
length
;
h
++
){
var
i
=
d
[
h
];
g
.
put
(
i
.
mode
,
4
),
g
.
put
(
i
.
getLength
(),
f
.
getLengthInBits
(
i
.
mode
,
a
)),
i
.
write
(
g
)}
for
(
var
l
=
0
,
h
=
0
;
h
<
e
.
length
;
h
++
)
l
+=
e
[
h
].
dataCount
;
if
(
g
.
getLengthInBits
()
>
8
*
l
)
throw
new
Error
(
"
code length overflow. (
"
+
g
.
getLengthInBits
()
+
"
>
"
+
8
*
l
+
"
)
"
);
for
(
g
.
getLengthInBits
()
+
4
<=
8
*
l
&&
g
.
put
(
0
,
4
);
0
!=
g
.
getLengthInBits
()
%
8
;)
g
.
putBit
(
!
1
);
for
(;;){
if
(
g
.
getLengthInBits
()
>=
8
*
l
)
break
;
if
(
g
.
put
(
b
.
PAD0
,
8
),
g
.
getLengthInBits
()
>=
8
*
l
)
break
;
g
.
put
(
b
.
PAD1
,
8
)}
return
b
.
createBytes
(
g
,
e
)},
b
.
createBytes
=
function
(
a
,
b
){
for
(
var
c
=
0
,
d
=
0
,
e
=
0
,
g
=
new
Array
(
b
.
length
),
h
=
new
Array
(
b
.
length
),
j
=
0
;
j
<
b
.
length
;
j
++
){
var
k
=
b
[
j
].
dataCount
,
l
=
b
[
j
].
totalCount
-
k
;
d
=
Math
.
max
(
d
,
k
),
e
=
Math
.
max
(
e
,
l
),
g
[
j
]
=
new
Array
(
k
);
for
(
var
m
=
0
;
m
<
g
[
j
].
length
;
m
++
)
g
[
j
][
m
]
=
255
&
a
.
buffer
[
m
+
c
];
c
+=
k
;
var
n
=
f
.
getErrorCorrectPolynomial
(
l
),
o
=
new
i
(
g
[
j
],
n
.
getLength
()
-
1
),
p
=
o
.
mod
(
n
);
h
[
j
]
=
new
Array
(
n
.
getLength
()
-
1
);
for
(
var
m
=
0
;
m
<
h
[
j
].
length
;
m
++
){
var
q
=
m
+
p
.
getLength
()
-
h
[
j
].
length
;
h
[
j
][
m
]
=
q
>=
0
?
p
.
get
(
q
):
0
}}
for
(
var
r
=
0
,
m
=
0
;
m
<
b
.
length
;
m
++
)
r
+=
b
[
m
].
totalCount
;
for
(
var
s
=
new
Array
(
r
),
t
=
0
,
m
=
0
;
d
>
m
;
m
++
)
for
(
var
j
=
0
;
j
<
b
.
length
;
j
++
)
m
<
g
[
j
].
length
&&
(
s
[
t
++
]
=
g
[
j
][
m
]);
for
(
var
m
=
0
;
e
>
m
;
m
++
)
for
(
var
j
=
0
;
j
<
b
.
length
;
j
++
)
m
<
h
[
j
].
length
&&
(
s
[
t
++
]
=
h
[
j
][
m
]);
return
s
};
for
(
var
c
=
{
MODE_NUMBER
:
1
,
MODE_ALPHA_NUM
:
2
,
MODE_8BIT_BYTE
:
4
,
MODE_KANJI
:
8
},
d
=
{
L
:
1
,
M
:
0
,
Q
:
3
,
H
:
2
},
e
=
{
PATTERN000
:
0
,
PATTERN001
:
1
,
PATTERN010
:
2
,
PATTERN011
:
3
,
PATTERN100
:
4
,
PATTERN101
:
5
,
PATTERN110
:
6
,
PATTERN111
:
7
},
f
=
{
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
:
1335
,
G18
:
7973
,
G15_MASK
:
21522
,
getBCHTypeInfo
:
function
(
a
){
for
(
var
b
=
a
<<
10
;
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G15
)
>=
0
;)
b
^=
f
.
G15
<<
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G15
);
return
(
a
<<
10
|
b
)
^
f
.
G15_MASK
},
getBCHTypeNumber
:
function
(
a
){
for
(
var
b
=
a
<<
12
;
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G18
)
>=
0
;)
b
^=
f
.
G18
<<
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G18
);
return
a
<<
12
|
b
},
getBCHDigit
:
function
(
a
){
for
(
var
b
=
0
;
0
!=
a
;)
b
++
,
a
>>>=
1
;
return
b
},
getPatternPosition
:
function
(
a
){
return
f
.
PATTERN_POSITION_TABLE
[
a
-
1
]},
getMask
:
function
(
a
,
b
,
c
){
switch
(
a
){
case
e
.
PATTERN000
:
return
0
==
(
b
+
c
)
%
2
;
case
e
.
PATTERN001
:
return
0
==
b
%
2
;
case
e
.
PATTERN010
:
return
0
==
c
%
3
;
case
e
.
PATTERN011
:
return
0
==
(
b
+
c
)
%
3
;
case
e
.
PATTERN100
:
return
0
==
(
Math
.
floor
(
b
/
2
)
+
Math
.
floor
(
c
/
3
))
%
2
;
case
e
.
PATTERN101
:
return
0
==
b
*
c
%
2
+
b
*
c
%
3
;
case
e
.
PATTERN110
:
return
0
==
(
b
*
c
%
2
+
b
*
c
%
3
)
%
2
;
case
e
.
PATTERN111
:
return
0
==
(
b
*
c
%
3
+
(
b
+
c
)
%
2
)
%
2
;
default
:
throw
new
Error
(
"
bad maskPattern:
"
+
a
)}},
getErrorCorrectPolynomial
:
function
(
a
){
for
(
var
b
=
new
i
([
1
],
0
),
c
=
0
;
a
>
c
;
c
++
)
b
=
b
.
multiply
(
new
i
([
1
,
g
.
gexp
(
c
)],
0
));
return
b
},
getLengthInBits
:
function
(
a
,
b
){
if
(
b
>=
1
&&
10
>
b
)
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
10
;
case
c
.
MODE_ALPHA_NUM
:
return
9
;
case
c
.
MODE_8BIT_BYTE
:
return
8
;
case
c
.
MODE_KANJI
:
return
8
;
default
:
throw
new
Error
(
"
mode:
"
+
a
)}
else
if
(
27
>
b
)
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
12
;
case
c
.
MODE_ALPHA_NUM
:
return
11
;
case
c
.
MODE_8BIT_BYTE
:
return
16
;
case
c
.
MODE_KANJI
:
return
10
;
default
:
throw
new
Error
(
"
mode:
"
+
a
)}
else
{
if
(
!
(
41
>
b
))
throw
new
Error
(
"
type:
"
+
b
);
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
14
;
case
c
.
MODE_ALPHA_NUM
:
return
13
;
case
c
.
MODE_8BIT_BYTE
:
return
16
;
case
c
.
MODE_KANJI
:
return
12
;
default
:
throw
new
Error
(
"
mode:
"
+
a
)}}},
getLostPoint
:
function
(
a
){
for
(
var
b
=
a
.
getModuleCount
(),
c
=
0
,
d
=
0
;
b
>
d
;
d
++
)
for
(
var
e
=
0
;
b
>
e
;
e
++
){
for
(
var
f
=
0
,
g
=
a
.
isDark
(
d
,
e
),
h
=-
1
;
1
>=
h
;
h
++
)
if
(
!
(
0
>
d
+
h
||
d
+
h
>=
b
))
for
(
var
i
=-
1
;
1
>=
i
;
i
++
)
0
>
e
+
i
||
e
+
i
>=
b
||
(
0
!=
h
||
0
!=
i
)
&&
g
==
a
.
isDark
(
d
+
h
,
e
+
i
)
&&
f
++
;
f
>
5
&&
(
c
+=
3
+
f
-
5
)}
for
(
var
d
=
0
;
b
-
1
>
d
;
d
++
)
for
(
var
e
=
0
;
b
-
1
>
e
;
e
++
){
var
j
=
0
;
a
.
isDark
(
d
,
e
)
&&
j
++
,
a
.
isDark
(
d
+
1
,
e
)
&&
j
++
,
a
.
isDark
(
d
,
e
+
1
)
&&
j
++
,
a
.
isDark
(
d
+
1
,
e
+
1
)
&&
j
++
,(
0
==
j
||
4
==
j
)
&&
(
c
+=
3
)}
for
(
var
d
=
0
;
b
>
d
;
d
++
)
for
(
var
e
=
0
;
b
-
6
>
e
;
e
++
)
a
.
isDark
(
d
,
e
)
&&!
a
.
isDark
(
d
,
e
+
1
)
&&
a
.
isDark
(
d
,
e
+
2
)
&&
a
.
isDark
(
d
,
e
+
3
)
&&
a
.
isDark
(
d
,
e
+
4
)
&&!
a
.
isDark
(
d
,
e
+
5
)
&&
a
.
isDark
(
d
,
e
+
6
)
&&
(
c
+=
40
);
for
(
var
e
=
0
;
b
>
e
;
e
++
)
for
(
var
d
=
0
;
b
-
6
>
d
;
d
++
)
a
.
isDark
(
d
,
e
)
&&!
a
.
isDark
(
d
+
1
,
e
)
&&
a
.
isDark
(
d
+
2
,
e
)
&&
a
.
isDark
(
d
+
3
,
e
)
&&
a
.
isDark
(
d
+
4
,
e
)
&&!
a
.
isDark
(
d
+
5
,
e
)
&&
a
.
isDark
(
d
+
6
,
e
)
&&
(
c
+=
40
);
for
(
var
k
=
0
,
e
=
0
;
b
>
e
;
e
++
)
for
(
var
d
=
0
;
b
>
d
;
d
++
)
a
.
isDark
(
d
,
e
)
&&
k
++
;
var
l
=
Math
.
abs
(
100
*
k
/
b
/
b
-
50
)
/
5
;
return
c
+=
10
*
l
}},
g
=
{
glog
:
function
(
a
){
if
(
1
>
a
)
throw
new
Error
(
"
glog(
"
+
a
+
"
)
"
);
return
g
.
LOG_TABLE
[
a
]},
gexp
:
function
(
a
){
for
(;
0
>
a
;)
a
+=
255
;
for
(;
a
>=
256
;)
a
-=
255
;
return
g
.
EXP_TABLE
[
a
]},
EXP_TABLE
:
new
Array
(
256
),
LOG_TABLE
:
new
Array
(
256
)},
h
=
0
;
8
>
h
;
h
++
)
g
.
EXP_TABLE
[
h
]
=
1
<<
h
;
for
(
var
h
=
8
;
256
>
h
;
h
++
)
g
.
EXP_TABLE
[
h
]
=
g
.
EXP_TABLE
[
h
-
4
]
^
g
.
EXP_TABLE
[
h
-
5
]
^
g
.
EXP_TABLE
[
h
-
6
]
^
g
.
EXP_TABLE
[
h
-
8
];
for
(
var
h
=
0
;
255
>
h
;
h
++
)
g
.
LOG_TABLE
[
g
.
EXP_TABLE
[
h
]]
=
h
;
i
.
prototype
=
{
get
:
function
(
a
){
return
this
.
num
[
a
]},
getLength
:
function
(){
return
this
.
num
.
length
},
multiply
:
function
(
a
){
for
(
var
b
=
new
Array
(
this
.
getLength
()
+
a
.
getLength
()
-
1
),
c
=
0
;
c
<
this
.
getLength
();
c
++
)
for
(
var
d
=
0
;
d
<
a
.
getLength
();
d
++
)
b
[
c
+
d
]
^=
g
.
gexp
(
g
.
glog
(
this
.
get
(
c
))
+
g
.
glog
(
a
.
get
(
d
)));
return
new
i
(
b
,
0
)},
mod
:
function
(
a
){
if
(
this
.
getLength
()
-
a
.
getLength
()
<
0
)
return
this
;
for
(
var
b
=
g
.
glog
(
this
.
get
(
0
))
-
g
.
glog
(
a
.
get
(
0
)),
c
=
new
Array
(
this
.
getLength
()),
d
=
0
;
d
<
this
.
getLength
();
d
++
)
c
[
d
]
=
this
.
get
(
d
);
for
(
var
d
=
0
;
d
<
a
.
getLength
();
d
++
)
c
[
d
]
^=
g
.
gexp
(
g
.
glog
(
a
.
get
(
d
))
+
b
);
return
new
i
(
c
,
0
).
mod
(
a
)}},
j
.
RS_BLOCK_TABLE
=
[[
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
]],
j
.
getRSBlocks
=
function
(
a
,
b
){
var
c
=
j
.
getRsBlockTable
(
a
,
b
);
if
(
void
0
==
c
)
throw
new
Error
(
"
bad rs block @ typeNumber:
"
+
a
+
"
/errorCorrectLevel:
"
+
b
);
for
(
var
d
=
c
.
length
/
3
,
e
=
[],
f
=
0
;
d
>
f
;
f
++
)
for
(
var
g
=
c
[
3
*
f
+
0
],
h
=
c
[
3
*
f
+
1
],
i
=
c
[
3
*
f
+
2
],
k
=
0
;
g
>
k
;
k
++
)
e
.
push
(
new
j
(
h
,
i
));
return
e
},
j
.
getRsBlockTable
=
function
(
a
,
b
){
switch
(
b
){
case
d
.
L
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
0
];
case
d
.
M
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
1
];
case
d
.
Q
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
2
];
case
d
.
H
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
3
];
default
:
return
void
0
}},
k
.
prototype
=
{
get
:
function
(
a
){
var
b
=
Math
.
floor
(
a
/
8
);
return
1
==
(
1
&
this
.
buffer
[
b
]
>>>
7
-
a
%
8
)},
put
:
function
(
a
,
b
){
for
(
var
c
=
0
;
b
>
c
;
c
++
)
this
.
putBit
(
1
==
(
1
&
a
>>>
b
-
c
-
1
))},
getLengthInBits
:
function
(){
return
this
.
length
},
putBit
:
function
(
a
){
var
b
=
Math
.
floor
(
this
.
length
/
8
);
this
.
buffer
.
length
<=
b
&&
this
.
buffer
.
push
(
0
),
a
&&
(
this
.
buffer
[
b
]
|=
128
>>>
this
.
length
%
8
),
this
.
length
++
}};
var
l
=
[[
17
,
14
,
11
,
7
],[
32
,
26
,
20
,
14
],[
53
,
42
,
32
,
24
],[
78
,
62
,
46
,
34
],[
106
,
84
,
60
,
44
],[
134
,
106
,
74
,
58
],[
154
,
122
,
86
,
64
],[
192
,
152
,
108
,
84
],[
230
,
180
,
130
,
98
],[
271
,
213
,
151
,
119
],[
321
,
251
,
177
,
137
],[
367
,
287
,
203
,
155
],[
425
,
331
,
241
,
177
],[
458
,
362
,
258
,
194
],[
520
,
412
,
292
,
220
],[
586
,
450
,
322
,
250
],[
644
,
504
,
364
,
280
],[
718
,
560
,
394
,
310
],[
792
,
624
,
442
,
338
],[
858
,
666
,
482
,
382
],[
929
,
711
,
509
,
403
],[
1003
,
779
,
565
,
439
],[
1091
,
857
,
611
,
461
],[
1171
,
911
,
661
,
511
],[
1273
,
997
,
715
,
535
],[
1367
,
1059
,
751
,
593
],[
1465
,
1125
,
805
,
625
],[
1528
,
1190
,
868
,
658
],[
1628
,
1264
,
908
,
698
],[
1732
,
1370
,
982
,
742
],[
1840
,
1452
,
1030
,
790
],[
1952
,
1538
,
1112
,
842
],[
2068
,
1628
,
1168
,
898
],[
2188
,
1722
,
1228
,
958
],[
2303
,
1809
,
1283
,
983
],[
2431
,
1911
,
1351
,
1051
],[
2563
,
1989
,
1423
,
1093
],[
2699
,
2099
,
1499
,
1139
],[
2809
,
2213
,
1579
,
1219
],[
2953
,
2331
,
1663
,
1273
]],
o
=
function
(){
var
a
=
function
(
a
,
b
){
this
.
_el
=
a
,
this
.
_htOption
=
b
};
return
a
.
prototype
.
draw
=
function
(
a
){
function
g
(
a
,
b
){
var
c
=
document
.
createElementNS
(
"
http://www.w3.org/2000/svg
"
,
a
);
for
(
var
d
in
b
)
b
.
hasOwnProperty
(
d
)
&&
c
.
setAttribute
(
d
,
b
[
d
]);
return
c
}
var
b
=
this
.
_htOption
,
c
=
this
.
_el
,
d
=
a
.
getModuleCount
();
Math
.
floor
(
b
.
width
/
d
),
Math
.
floor
(
b
.
height
/
d
),
this
.
clear
();
var
h
=
g
(
"
svg
"
,{
viewBox
:
"
0 0
"
+
String
(
d
)
+
"
"
+
String
(
d
),
width
:
"
100%
"
,
height
:
"
100%
"
,
fill
:
b
.
colorLight
});
h
.
setAttributeNS
(
"
http://www.w3.org/2000/xmlns/
"
,
"
xmlns:xlink
"
,
"
http://www.w3.org/1999/xlink
"
),
c
.
appendChild
(
h
),
h
.
appendChild
(
g
(
"
rect
"
,{
fill
:
b
.
colorDark
,
width
:
"
1
"
,
height
:
"
1
"
,
id
:
"
template
"
}));
for
(
var
i
=
0
;
d
>
i
;
i
++
)
for
(
var
j
=
0
;
d
>
j
;
j
++
)
if
(
a
.
isDark
(
i
,
j
)){
var
k
=
g
(
"
use
"
,{
x
:
String
(
i
),
y
:
String
(
j
)});
k
.
setAttributeNS
(
"
http://www.w3.org/1999/xlink
"
,
"
href
"
,
"
#template
"
),
h
.
appendChild
(
k
)}},
a
.
prototype
.
clear
=
function
(){
for
(;
this
.
_el
.
hasChildNodes
();)
this
.
_el
.
removeChild
(
this
.
_el
.
lastChild
)},
a
}(),
p
=
"
svg
"
===
document
.
documentElement
.
tagName
.
toLowerCase
(),
q
=
p
?
o
:
m
()?
function
(){
function
a
(){
this
.
_elImage
.
src
=
this
.
_elCanvas
.
toDataURL
(
"
image/png
"
),
this
.
_elImage
.
style
.
display
=
"
block
"
,
this
.
_elCanvas
.
style
.
display
=
"
none
"
}
function
d
(
a
,
b
){
var
c
=
this
;
if
(
c
.
_fFail
=
b
,
c
.
_fSuccess
=
a
,
null
===
c
.
_bSupportDataURI
){
var
d
=
document
.
createElement
(
"
img
"
),
e
=
function
(){
c
.
_bSupportDataURI
=!
1
,
c
.
_fFail
&&
_fFail
.
call
(
c
)},
f
=
function
(){
c
.
_bSupportDataURI
=!
0
,
c
.
_fSuccess
&&
c
.
_fSuccess
.
call
(
c
)};
return
d
.
onabort
=
e
,
d
.
onerror
=
e
,
d
.
onload
=
f
,
d
.
src
=
"
data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
"
,
void
0
}
c
.
_bSupportDataURI
===!
0
&&
c
.
_fSuccess
?
c
.
_fSuccess
.
call
(
c
):
c
.
_bSupportDataURI
===!
1
&&
c
.
_fFail
&&
c
.
_fFail
.
call
(
c
)}
if
(
this
.
_android
&&
this
.
_android
<=
2.1
){
var
b
=
1
/
window
.
devicePixelRatio
,
c
=
CanvasRenderingContext2D
.
prototype
.
drawImage
;
CanvasRenderingContext2D
.
prototype
.
drawImage
=
function
(
a
,
d
,
e
,
f
,
g
,
h
,
i
,
j
){
if
(
"
nodeName
"
in
a
&&
/img/i
.
test
(
a
.
nodeName
))
for
(
var
l
=
arguments
.
length
-
1
;
l
>=
1
;
l
--
)
arguments
[
l
]
=
arguments
[
l
]
*
b
;
else
"
undefined
"
==
typeof
j
&&
(
arguments
[
1
]
*=
b
,
arguments
[
2
]
*=
b
,
arguments
[
3
]
*=
b
,
arguments
[
4
]
*=
b
);
c
.
apply
(
this
,
arguments
)}}
var
e
=
function
(
a
,
b
){
this
.
_bIsPainted
=!
1
,
this
.
_android
=
n
(),
this
.
_htOption
=
b
,
this
.
_elCanvas
=
document
.
createElement
(
"
canvas
"
),
this
.
_elCanvas
.
width
=
b
.
width
,
this
.
_elCanvas
.
height
=
b
.
height
,
a
.
appendChild
(
this
.
_elCanvas
),
this
.
_el
=
a
,
this
.
_oContext
=
this
.
_elCanvas
.
getContext
(
"
2d
"
),
this
.
_bIsPainted
=!
1
,
this
.
_elImage
=
document
.
createElement
(
"
img
"
),
this
.
_elImage
.
style
.
display
=
"
none
"
,
this
.
_el
.
appendChild
(
this
.
_elImage
),
this
.
_bSupportDataURI
=
null
};
return
e
.
prototype
.
draw
=
function
(
a
){
var
b
=
this
.
_elImage
,
c
=
this
.
_oContext
,
d
=
this
.
_htOption
,
e
=
a
.
getModuleCount
(),
f
=
d
.
width
/
e
,
g
=
d
.
height
/
e
,
h
=
Math
.
round
(
f
),
i
=
Math
.
round
(
g
);
b
.
style
.
display
=
"
none
"
,
this
.
clear
();
for
(
var
j
=
0
;
e
>
j
;
j
++
)
for
(
var
k
=
0
;
e
>
k
;
k
++
){
var
l
=
a
.
isDark
(
j
,
k
),
m
=
k
*
f
,
n
=
j
*
g
;
c
.
strokeStyle
=
l
?
d
.
colorDark
:
d
.
colorLight
,
c
.
lineWidth
=
1
,
c
.
fillStyle
=
l
?
d
.
colorDark
:
d
.
colorLight
,
c
.
fillRect
(
m
,
n
,
f
,
g
),
c
.
strokeRect
(
Math
.
floor
(
m
)
+
.
5
,
Math
.
floor
(
n
)
+
.
5
,
h
,
i
),
c
.
strokeRect
(
Math
.
ceil
(
m
)
-
.
5
,
Math
.
ceil
(
n
)
-
.
5
,
h
,
i
)}
this
.
_bIsPainted
=!
0
},
e
.
prototype
.
makeImage
=
function
(){
this
.
_bIsPainted
&&
d
.
call
(
this
,
a
)},
e
.
prototype
.
isPainted
=
function
(){
return
this
.
_bIsPainted
},
e
.
prototype
.
clear
=
function
(){
this
.
_oContext
.
clearRect
(
0
,
0
,
this
.
_elCanvas
.
width
,
this
.
_elCanvas
.
height
),
this
.
_bIsPainted
=!
1
},
e
.
prototype
.
round
=
function
(
a
){
return
a
?
Math
.
floor
(
1
e3
*
a
)
/
1
e3
:
a
},
e
}():
function
(){
var
a
=
function
(
a
,
b
){
this
.
_el
=
a
,
this
.
_htOption
=
b
};
return
a
.
prototype
.
draw
=
function
(
a
){
for
(
var
b
=
this
.
_htOption
,
c
=
this
.
_el
,
d
=
a
.
getModuleCount
(),
e
=
Math
.
floor
(
b
.
width
/
d
),
f
=
Math
.
floor
(
b
.
height
/
d
),
g
=
[
'
<table style="border:0;border-collapse:collapse;">
'
],
h
=
0
;
d
>
h
;
h
++
){
g
.
push
(
"
<tr>
"
);
for
(
var
i
=
0
;
d
>
i
;
i
++
)
g
.
push
(
'
<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:
'
+
e
+
"
px;height:
"
+
f
+
"
px;background-color:
"
+
(
a
.
isDark
(
h
,
i
)?
b
.
colorDark
:
b
.
colorLight
)
+
'
;"></td>
'
);
g
.
push
(
"
</tr>
"
)}
g
.
push
(
"
</table>
"
),
c
.
innerHTML
=
g
.
join
(
""
);
var
j
=
c
.
childNodes
[
0
],
k
=
(
b
.
width
-
j
.
offsetWidth
)
/
2
,
l
=
(
b
.
height
-
j
.
offsetHeight
)
/
2
;
k
>
0
&&
l
>
0
&&
(
j
.
style
.
margin
=
l
+
"
px
"
+
k
+
"
px
"
)},
a
.
prototype
.
clear
=
function
(){
this
.
_el
.
innerHTML
=
""
},
a
}();
QRCode
=
function
(
a
,
b
){
if
(
this
.
_htOption
=
{
width
:
256
,
height
:
256
,
typeNumber
:
4
,
colorDark
:
"
#000000
"
,
colorLight
:
"
#ffffff
"
,
correctLevel
:
d
.
H
},
"
string
"
==
typeof
b
&&
(
b
=
{
text
:
b
}),
b
)
for
(
var
c
in
b
)
this
.
_htOption
[
c
]
=
b
[
c
];
"
string
"
==
typeof
a
&&
(
a
=
document
.
getElementById
(
a
)),
this
.
_android
=
n
(),
this
.
_el
=
a
,
this
.
_oQRCode
=
null
,
this
.
_oDrawing
=
new
q
(
this
.
_el
,
this
.
_htOption
),
this
.
_htOption
.
text
&&
this
.
makeCode
(
this
.
_htOption
.
text
)},
QRCode
.
prototype
.
makeCode
=
function
(
a
){
this
.
_oQRCode
=
new
b
(
r
(
a
,
this
.
_htOption
.
correctLevel
),
this
.
_htOption
.
correctLevel
),
this
.
_oQRCode
.
addData
(
a
),
this
.
_oQRCode
.
make
(),
this
.
_el
.
title
=
a
,
this
.
_oDrawing
.
draw
(
this
.
_oQRCode
),
this
.
makeImage
()},
QRCode
.
prototype
.
makeImage
=
function
(){
"
function
"
==
typeof
this
.
_oDrawing
.
makeImage
&&
(
!
this
.
_android
||
this
.
_android
>=
3
)
&&
this
.
_oDrawing
.
makeImage
()},
QRCode
.
prototype
.
clear
=
function
(){
this
.
_oDrawing
.
clear
()},
QRCode
.
CorrectLevel
=
d
}();
\ No newline at end of file
xxpay-shop/src/main/resources/templates/openQrPay.ftl
0 → 100755
View file @
d53783a9
<#
assign
base = request.contextPath />
<!
DOCTYPE
html>
<
html
lang="zh-CN">
<
head
>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="fyunli">
<base id="base" href="$
{
base
}
">
<title>【XXPAY】开源聚合支付</title>
<!-- Bootstrap core CSS -->
<link href="//cdn.jsdelivr.net/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="$
{
base
}
/css/main.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="$
{
base
}
/favicon.ico">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="//cdn.jsdelivr.net/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="//cdn.jsdelivr.net/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</
head
>
<
body
>
<!--
Begin page content -->
<
div
class="container">
<div class="page-header">
<h1>【XXPAY】开源聚合支付系统</h1>
</div>
<!--
<div>
Date: $
{
time
?
date
}
<br>
Time: $
{
time
?
time
}
<br>
Message: $
{
message
}
</div>
-->
<div class="main" align="center">
<div class="inwrap">
<h3>#扫码测试#</h3>
<h5>
<input type="radio" name="amount" id="amount" value="1" checked="checked"> 0.01 元
<input type="radio" name="amount" id="amount" value="100"> 1.00 元
<input type="radio" name="amount" id="amount" value="1000"> 10.00 元
任意: <input type="text" id="othAmt" style="width: 60px;" value=""> 元
</h5>
<div class="example" >
<div id="qrcode"></div>
<div><h3 id="vAmt" style="color: red">0.01元</h3></div>
<div><h4 >请使用支付宝或微信手机客户端扫一扫</h4></div>
</div>
</div>
</div>
</
div
>
<
footer
class="footer">
<div class="container">
<p class="text-muted">©2017 xxpay</p>
</div>
</
footer
>
<!--
IE10 viewport hack for Surface/desktop Windows 8 bug -->
<
script
src="//cdn.jsdelivr.net/ie10-viewport/1.0.0/ie10-viewport.min.js"></script>
<
script
src="//cdn.jsdelivr.net/jquery/1.12.1/jquery.min.js"></script>
<
script
src="//cdn.jsdelivr.net/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<
script
src="$
{
base
}
/js/qrcode.min.js"></script>
<
script
>
var qrcode = new QRCode(document.getElementById("qrcode"),
{
width
:
200
,
height
:
200
}
);
function makeCode ()
{
var
elText
=
document
.getElementById
(
"othAmt"
)
;
var
amt
=
$
.trim
(
elText
.value
)
;
var
vAmt
=
(
amt
/
1
)
.toFixed
(
2
)
;
if
(
amt
==
''
)
{
amt
=
$
(
"input[name='amount']:checked"
)
.val
()
;
vAmt
=
(
amt
/
100
)
.toFixed
(
2
)
;
}
if
(
vAmt
==
'
N
aN
'
||
vAmt
<=
0
)
{
alert
(
"输入金额不正确"
)
;
$
(
"#othAmt"
)
.val
(
''
)
;
return
;
}
$
(
"#vAmt"
)
.text
(
vAmt
+'元'
)
;
//
var
qrText
=
'
http
:
//
xxpay-shop
.ngrok.cc
/
goods
/
qrPay
/'
+
(
vAmt
*
100
)
;
var
qrText
=
'
http
:
//
shop
.xxpay.org
/
goods
/
qrPay
.html
?
amount
='
+
(
vAmt
*
100
)
;
qrcode
.makeCode
(
qrText
)
;
}
makeCode();
$("input:radio").click(function ()
{
$
(
"#othAmt"
)
.val
(
''
)
;
makeCode
()
;
}
);
$("#othAmt").on("blur", function ()
{
makeCode
()
;
}
).on("keydown", function (e)
{
if
(
e
.keyCode
==
13
)
{
makeCode
()
;
}
}
);
</
script
>
</
body
>
</
html
>
xxpay-shop/src/main/resources/templates/qrPay.ftl
0 → 100644
View file @
d53783a9
<!
DOCTYPE
HTML>
<
html
>
<
head
>
<meta charset="htf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>XXPAY支付中心</title>
<style>
body
{
font-family
:
'
M
icrosoft
Y
aHei
';
}
#amount,#error
{
height
:
80
px
;
line-height
:
80
px
;
text-align
:
center
;
color
:
#
f00
;
font-size
:
30
px
;
font-weight
:
bold
;
}
#error
{
font-size
:
20
px
;
}
#info
{
padding
:
0
10
px
;
font-size
:
12
px
;
}
table
{
width
:
100
%;
border-collapse
:
collapse
;
}
tr
{
border
:
1
px
solid
#
ddd
;
}
td
{
padding
:
10
px
;
}
.fr
{
text-align
:
right; font-weight: bold;
}
</style>
<script src="//cdn.jsdelivr.net/jquery/1.12.1/jquery.min.js"></script>
</
head
>
<
body
>
<#
if
(orderMap.resCode == 'SUCCESS')>
<
div
id="amount">¥ $
{
amount
}
</div>
<
div
id="info">
<table>
<tr>
<td>购买商品</td>
<td class="fr">$
{
goodsOrder
.goodsName
}
</td>
</tr>
<tr>
<td>收款方</td>
<td class="fr">北京骏易科技有限公司</td>
</tr>
</table>
</
div
>
<#if (client == 'alipay')>
<script>
location.href = '$
{
orderMap
.payUrl
}
';
</script>
</#if>
<#if (client == 'wx')>
<script>
function onBridgeReady()
{
W
eixinJSBridge
.invoke
(
'
getBrandWCPayRequest
'
,
{
"appId"
:
"${orderMap.payParams.appId}"
,
//公众号名称,由商户传入
"timeStamp"
:
"${orderMap.payParams.timeStamp?c}"
,
//时间戳,自
1970
年以来的秒数
"nonceStr"
:
"${orderMap.payParams.nonceStr}"
,
//随机串
"package"
:
"${orderMap.payParams.package}"
,
"signType"
:
"${orderMap.payParams.signType}"
,
//微信签名方式:
"paySign"
:
"${orderMap.payParams.paySign}"
//微信签名
,
paySign
采用统一的微信支付
S
ign
签名生成方法,注意这里
appId
也要参与签名,
appId
与
config
中传入的
appId
一致,即最后参与签名的参数有
appId
,
timeStamp
,
nonceStr
,
package
,
signType
。
},
function
(
res
)
{
if
(
res
.err_msg
==
"get_brand_wcpay_request:ok"
)
{
//
使用以上方式判断前端返回
,
微信团队郑重提示:
res
.err_msg
将在用户支付成功后返回
ok
,但并不保证它绝对可靠。
alert
(
'支付成功!'
)
;
}
else
{
alert
(
'支付失败:'
+
res
.err_msg
)
;
}
W
eixinJSBridge
.call
(
'
closeWindow
'
)
;
}
)
;
}
if (typeof WeixinJSBridge == "undefined")
{
if
(
document
.addEventListener
)
{
document
.addEventListener
(
'
W
eixinJSBridgeReady
'
,
onBridgeReady
,
false
)
;
}
else
if
(
document
.attachEvent
)
{
document
.attachEvent
(
'
W
eixinJSBridgeReady
'
,
onBridgeReady
)
;
document
.attachEvent
(
'
onWeixinJSBridgeReady
'
,
onBridgeReady
)
;
}
}
else
{
onBridgeReady
()
;
}
</script>
</#if>
<#
else
>
<
div
id="error">
<#if (result == 'failed')>
$
{
resMsg
}
</#if>
</
div
>
</#
if
>
</
body
>
</
html
>
\ No newline at end of file
xxpay-shop/src/main/scripts/shop.sh
0 → 100755
View file @
d53783a9
#!/bin/sh
#
#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,
#也可以作为启动java程序的独立脚本来使用。
#
#JDK所在路径
JAVA_HOME
=
"/usr/local/jdk/jdk1.8.0_121"
#Java程序所在的目录(classes的上一级目录)
APP_HOME
=
/home/xxpay/service/xxpay-shop
#需要启动的Java主程序(main方法类)
APP_MAINCLASS
=
org.xxpay.shop.XxPayShopApplication
#拼凑完整的classpath参数,包括指定lib目录下所有的jar
CLASSPATH
=
$APP_HOME
/classes
for
i
in
"
$APP_HOME
"
/lib/
*
.jar
;
do
CLASSPATH
=
"
$CLASSPATH
"
:
"
$i
"
done
#java虚拟机启动参数
JAVA_OPTS
=
"-ms1024m -mx1024m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
###################################
#(函数)判断程序是否已启动
#
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid ($1部分),及Java程序名称($2部分)
#当jps命令不可用时,使用: ps -ef | grep $APP_MAINCLASS | grep -v "grep" | awk '{print $2}' 代替
###################################
#初始化psid变量(全局)
psid
=
0
checkpid
()
{
javaps
=
`
$JAVA_HOME
/bin/jps
-l
|
grep
$APP_MAINCLASS
`
#javaps=`ps -ef | grep $APP_MAINCLASS | grep -v "grep" | awk '{print $2}'`
if
[
-n
"
$javaps
"
]
;
then
psid
=
`
echo
$javaps
|
awk
'{print $1}'
`
else
psid
=
0
fi
}
###################################
#(函数)启动程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示程序已启动
#3. 如果程序没有被启动,则执行启动命令行
#4. 启动命令执行后,再次调用checkpid函数
#5. 如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
#注意:echo -n 表示打印字符后,不换行
#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
start
()
{
checkpid
if
[
$psid
-ne
0
]
;
then
echo
"================================"
echo
"warn:
$APP_MAINCLASS
already started! (pid=
$psid
)"
echo
"================================"
else
echo
-n
"Starting
$APP_MAINCLASS
..."
# -DlogFn=active 指的是生产日志文件名为active
nohup
$JAVA_HOME
/bin/java
$JAVA_OPTS
-DlogFn
=
level
-classpath
$CLASSPATH
$APP_MAINCLASS
>
/dev/null 2>&1 &
checkpid
if
[
$psid
-ne
0
]
;
then
echo
"(pid=
$psid
) [OK]"
else
echo
"[Failed]"
fi
fi
}
###################################
#(函数)停止程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
#3. 使用kill -9 pid命令进行强制杀死进程
#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
#注意:echo -n 表示打印字符后,不换行
#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
stop
()
{
checkpid
if
[
$psid
-ne
0
]
;
then
echo
-n
"Stopping
$APP_MAINCLASS
...(pid=
$psid
) "
kill
-9
$psid
if
[
$?
-eq
0
]
;
then
echo
"[OK]"
else
echo
"[Failed]"
fi
checkpid
if
[
$psid
-ne
0
]
;
then
stop
fi
else
echo
"================================"
echo
"warn:
$APP_MAINCLASS
is not running"
echo
"================================"
fi
}
###################################
#(函数)检查程序运行状态
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid
#3. 否则,提示程序未运行
###################################
status
()
{
checkpid
if
[
$psid
-ne
0
]
;
then
echo
"
$APP_MAINCLASS
is running! (pid=
$psid
)"
else
echo
"
$APP_MAINCLASS
is not running"
fi
}
###################################
#(函数)打印系统环境参数
###################################
info
()
{
echo
"System Information:"
echo
"****************************"
echo
`
head
-n
1 /etc/issue
`
echo
`
uname
-a
`
echo
echo
"JAVA_HOME=
$JAVA_HOME
"
echo
`
$JAVA_HOME
/bin/java
-version
`
echo
echo
"APP_HOME=
$APP_HOME
"
echo
"APP_MAINCLASS=
$APP_MAINCLASS
"
echo
"****************************"
}
###################################
#读取脚本的第一个参数($1),进行判断
#参数取值范围:{start|stop|restart|status|info}
#如参数不在指定范围之内,则打印帮助信息
###################################
case
"
$1
"
in
'start'
)
start
;;
'stop'
)
stop
;;
'restart'
)
stop
start
;;
'status'
)
status
;;
'info'
)
info
;;
*
)
echo
"Usage:
$0
{start|stop|restart|status|info}"
exit
1
esac
exit
0
\ No newline at end of file
xxpay4spring-cloud/pom.xml
0 → 100755
View file @
d53783a9
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
org.xxpay
</groupId>
<artifactId>
xxpay4spring-cloud
</artifactId>
<version>
0.0.1-SNAPSHOT
</version>
<packaging>
pom
</packaging>
<modules>
<module>
xxpay-server
</module>
<module>
xxpay-config
</module>
<module>
xxpay-service
</module>
<module>
xxpay-web
</module>
<module>
xxpay-gateway
</module>
</modules>
<!-- 使用最新的spring-boot版本 -->
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.4.0.RELEASE
</version>
</parent>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<java.version>
1.8
</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-dependencies
</artifactId>
<version>
Brixton.SR5
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
</plugin>
</plugins>
</build>
</project>
xxpay4spring-cloud/xxpay-config/pom.xml
0 → 100755
View file @
d53783a9
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
org.xxpay
</groupId>
<artifactId>
xxpay-config
</artifactId>
<version>
1.0.0
</version>
<packaging>
jar
</packaging>
<name>
xxpay-config
</name>
<description></description>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.4.5.RELEASE
</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<java.version>
1.8
</java.version>
</properties>
<dependencies>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-config-server
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-security
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-eureka-server
</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-dependencies
</artifactId>
<version>
Camden.RELEASE
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<configuration>
<finalName>
${project.name}
</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
xxpay4spring-cloud/xxpay-config/src/main/java/org.xxpay/XxPayConfigApplication.java
0 → 100644
View file @
d53783a9
package
org.xxpay
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.cloud.client.discovery.EnableDiscoveryClient
;
import
org.springframework.cloud.config.server.EnableConfigServer
;
/**
* @Description: xxpay配置中心服务端
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public
class
XxPayConfigApplication
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
XxPayConfigApplication
.
class
,
args
);
}
}
xxpay4spring-cloud/xxpay-config/src/main/resources/application.yml
0 → 100755
View file @
d53783a9
server
:
port
:
2020
spring
:
application
:
name
:
xxpay-config
cloud
:
config
:
server
:
native
:
search-locations
:
classpath:/shared
profiles
:
active
:
native
security
:
user
:
password
:
xxpay
eureka
:
client
:
serviceUrl
:
defaultZone
:
http://localhost:2000/eureka/
xxpay4spring-cloud/xxpay-config/src/main/resources/shared/application.yml
0 → 100755
View file @
d53783a9
logging
:
level
:
org.springframework.security
:
INFO
hystrix
:
command
:
default
:
execution
:
isolation
:
thread
:
timeoutInMilliseconds
:
10000
eureka
:
instance
:
prefer-ip-address
:
true
client
:
serviceUrl
:
defaultZone
:
http://localhost:2000/eureka/
xxpay4spring-cloud/xxpay-config/src/main/resources/shared/xxpay-gateway.yml
0 → 100755
View file @
d53783a9
server
:
port
:
3020
hystrix
:
command
:
default
:
execution
:
isolation
:
thread
:
timeoutInMilliseconds
:
60000
ribbon
:
ReadTimeout
:
60000
ConnectTimeout
:
60000
zuul
:
ignoredServices
:
'
*'
host
:
connect-timeout-millis
:
60000
socket-timeout-millis
:
60000
routes
:
xxpay-service
:
path
:
/api/**
serviceId
:
xxpay-web
xxpay-web
:
path
:
/notify/**
serviceId
:
xxpay-service
xxpay4spring-cloud/xxpay-config/src/main/resources/shared/xxpay-service-dev.properties
0 → 100644
View file @
d53783a9
# \u652F\u4ED8\u5B9D\u56DE\u8C03\u5730\u5740
ali.notify_url
=
http://xxpay.ngrok.cc/notify/pay/aliPayNotifyRes.htm
# \u5FAE\u4FE1\u652F\u4ED8\u56DE\u8C03\u5730\u5740
wx.notify_url
=
http://xxpay.ngrok.cc/notify/pay/wxPayNotifyRes.htm
xxpay4spring-cloud/xxpay-config/src/main/resources/shared/xxpay-service-prod.properties
0 → 100644
View file @
d53783a9
# \u652F\u4ED8\u5B9D\u56DE\u8C03\u5730\u5740
ali.notify_url
=
http://api.xxpay.org/notify/aliPayNotifyRes.htm
# \u5FAE\u4FE1\u652F\u4ED8\u56DE\u8C03\u5730\u5740
wx.notify_url
=
http://api.xxpay.org/notify/wxPayNotifyRes.htm
Prev
1
…
14
15
16
17
18
19
20
21
22
…
24
Next
Write
Preview
Supports
Markdown
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