前言

程序配置的创建分表语句有误,创建了大量的未使用的分表,需要执行sql循环删除空表。这里的空表指的数据表行数为空,保险起见数据表存在记录时不删除该表。

定义存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 删除空表的存储过程
create or replace procedure SP_DROP_EMPTY_TABLE(owner varchar2, tableName varchar2)
is
v_cnt number;
v_index number := 0;
v_owner varchar(100) := owner;
v_table varchar2(100) := tableName;
v_sql varchar2(200) := '';
cursor cur_tables(c_owner varchar2, c_tableName varchar2) is select TABLE_NAME from all_tables where OWNER = UPPER(c_owner) and TABLE_NAME like UPPER(c_tableName) || '%' ;
begin
dbms_output.enable(buffer_size => null);
open cur_tables(owner, tableName); -- 打开游标
loop
fetch cur_tables into v_table; -- 提取游标
exit when cur_tables%notfound;
v_index := v_index + 1;
v_sql := 'select count(*) from ' || v_table;
execute immediate v_sql into v_cnt;
if v_cnt = 0 then
v_sql := 'drop table '|| v_table;
execute immediate v_sql;
dbms_output.put_line('table:' || v_table || ' is empty, drop success.');
else
dbms_output.put_line('table:' || v_table || ' has records, drop fail. total count=' || v_cnt);
end if;
end loop;
close cur_tables; -- 关闭游标

if v_index = 0 then
dbms_output.put_line('table:' || tableName || ' does not exist.');
end if;
end;
/

执行存储过程

1
call SP_DROP_EMPTY_TABLE('test', 't_table_xxx');

定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 删除空表的函数
create or replace function FUN_DROP_EMPTY_TABLE(owner VARCHAR2, tableName VARCHAR2)
return clob
as
v_result clob := '';
v_cnt number;
v_owner varchar2(100) := owner;
v_table varchar2(100) := tableName;
v_sql varchar2(200) := '';
cursor cur_tables(c_owner varchar2, c_tableName varchar2) is select TABLE_NAME from all_tables where OWNER = UPPER(c_owner) and TABLE_NAME like UPPER(c_tableName) || '%' ;
begin
open cur_tables(owner, tableName); -- 打开游标
loop
fetch cur_tables into v_table; -- 提取游标
exit when cur_tables%notfound;
v_sql := 'select count(*) from ' || v_table;
execute immediate v_sql into v_cnt;
if v_cnt = 0 then
v_sql := 'drop table '|| v_table;
execute immediate v_sql;
v_result := v_result || 'table:' || v_table || ' is empty, drop success.' || chr(13);
else
v_result := v_result || 'table:' || v_table || ' has records, drop fail. total count=' || v_cnt || chr(13);
end if;
end loop;
close cur_tables; -- 关闭游标

if v_result = '' or v_result is null then
return 'table:' || tableName || ' does not exist';
end if;

return v_result;
end;
/

编写删除空表的函数版踩了多个坑。函数执行一般执行使用select FUN_DROP_EMPTY_TABLE(‘test’, ‘t_table_xxx’) from dual,由于存在DDL操作,不能使用select语句,否则会出现如下提示。

1
2
> ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 
ORA-06512: at "TEST.FUN_DROP_EMPTY_TABLE", line 19

一度以为函数不可用的时候,发现可以使用begin end包裹语句,在内部调用dbms_output.put_line显示执行结果。
但是又引出另外一个坑,Oracle 12c以前的版本,函数需要返回值。最开始编写这个函数时,把表的删除结果拼接后返回类型为varchar2,当数据表过多时函数执行后会抛出缓冲区过小异常。

1
2
3
> ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "TEST.FUN_DROP_EMPTY_TABLE", line 20
ORA-06512: at line 3

要解决缓冲区问题要么减少返回值,要么将返回类型修改为clob. 函数返回字符串过长时,有可能导致dbms_output.put_line输出异常或不输出…
最后,最好使用存储过程。

执行函数

1
2
3
4
begin
-- dbms_output.enable(buffer_size => null);
dbms_output.put_line(FUN_DROP_EMPTY_TABLE('test', 't_table_xxx'));
end;

直接执行sql

考虑到部分账户可能没有执行存储过程和函数的权限,这里给出个直接执行sql的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- 直接执行语句
declare
v_owner varchar(100) := 'admin'; -- 必须输入项: 账户, 即拥有者
v_table varchar2(100) := 'T_XXX_YYMMDD'; -- 必须输入项: 表名或表名前缀
v_cnt number;
v_index number := 0;
v_sql varchar2(200) := '';
cursor cur_tables(c_owner varchar2, c_tableName varchar2) is select TABLE_NAME from all_tables where OWNER = UPPER(c_owner) and TABLE_NAME like UPPER(c_tableName) || '%' ;
begin
dbms_output.enable(buffer_size => null);
open cur_tables(owner, tableName); -- 打开游标
loop
fetch cur_tables into v_table; -- 提取游标
exit when cur_tables%notfound;
v_index := v_index + 1;
v_sql := 'select count(*) from ' || v_table;
execute immediate v_sql into v_cnt;
if v_cnt = 0 then
v_sql := 'drop table '|| v_table;
execute immediate v_sql;
dbms_output.put_line('table:' || v_table || ' is empty, drop success.');
else
dbms_output.put_line('table:' || v_table || ' has records, drop fail. total count=' || v_cnt);
end if;
end loop;
close cur_tables; -- 关闭游标

if v_index = 0 then
dbms_output.put_line('table:' || tableName || ' does not exist.');
end if;
end;

附录:MySQL批量删除空表的存储过程

程序的超时判断逻辑,一般用于指定时间范围内执行某项操作或等待操作结果。举个例子,Tcp通信中客户端向服务端发送请求数据后,需要等待服务端返回结果。这里的等待一般是有时间限制的,如果不做超时处理,客户端接收数据的线程将长时间处于阻塞状态,影响客户端的运行性能。
在超时处理中,有一种很常见的用法是有Bug的,比如下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.ReceiveTimeout = 10000;
sock.Connect("192.168.1.100", 10000);

var startAt = DateTime.Now;
var buffer = new Byte[4096];

while ((DateTime.Now - startAt).TotalMilliseconds < sock.ReceiveTimeout)
{
if (!sock.Poll(10, SelectMode.SelectRead) || sock.Available <= 0)
{
Thread.Sleep(1);
continue;
}

sock.Receive(buffer, SocketFlags.None);
}

示例代码采用DateTime来获取系统时间,当前时间减去开始时间得到时间范围,当时间范围大于某个值时,超时。这个用法之所以存在Bug是因为是没有考虑系统校时的影响,在时钟回拨的时候,while循环有可能需要执行更长的时间。正确的用法应当采用System.Diagnostics命名空间的Stopwatch.

1
2
3
4
5
6
7
8
9
10
11
var watch = Stopwatch.StartNew();
while (watch.Elapsed.TotalMilliseconds < sock.ReceiveTimeout)
{
if (!sock.Poll(10, SelectMode.SelectRead) || sock.Available <= 0)
{
Thread.Sleep(1);
continue;
}

sock.Receive(buffer, SocketFlags.None);
}

那么,Stopwatch就不会受系统校时影响了吗?答案是看硬件支持情况。.NET Framework版的Stopwatch内部实现基于系统硬件支持高分辨率性能计数器(QueryPerformanceFrequency),不支持高分辨率性能计数器时采用DateTime.UtcNow.Ticks作为时间戳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   //.NET Framework Stopwatch部分源代码
static Stopwatch() {
bool succeeded = SafeNativeMethods.QueryPerformanceFrequency(out Frequency);
if(!succeeded) {
IsHighResolution = false;
Frequency = TicksPerSecond;
tickFrequency = 1;
}
else {
IsHighResolution = true;
tickFrequency = TicksPerSecond;
tickFrequency /= Frequency;
}
}

public static long GetTimestamp() {
if(IsHighResolution) {
long timestamp = 0;
SafeNativeMethods.QueryPerformanceCounter(out timestamp);
return timestamp;
}
else {
return DateTime.UtcNow.Ticks;
}
}

通过查看源代码我们知道,可以使用Stopwatch.IsHighResolution字段来判断计时器是否基于高分辨率性能计数器。在最新版的.Net Core源代码中,这个字段直接初始化为true,也就是说.Net Core默认都是采用高分辨率性能计数器来做时间戳的。为什么.Net Core中不像Framework那样内部做下兼容性判断呢,可能的原因是,在Windows XP及以后的操作系统都支持QueryPerformanceFrequency函数,再加上现在的硬件环境普遍越来越好,所以直接取消掉了兼容性处理。

总结,推荐使用Stopwatch来做超时判断处理。尽管一些老旧机器不支持高分辨率性能计数器,传统的.NET Framework在内部做了兼容性处理,.Net Core在最新的硬件上运行默认是支持的,可以放心使用。

参考链接:

https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Stopwatch.cs

https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stopwatch.ishighresolution?view=net-5.0

https://docs.microsoft.com/zh-cn/windows/win32/sysinfo/acquiring-high-resolution-time-stamps

https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Stopwatch.cs,c5257ce1ef4b0422

https://referencesource.microsoft.com/#System/compmod/microsoft/win32/SafeNativeMethods.cs,b692d974115ae110

https://docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency

项目中有一个计算Http请求哈希值的环节,客户端按照指定文本格式生成哈希值;服务端收到Http请求后按照相同格式的生成文本并计算哈希,比较哈希值的异同判断请求信息是否被篡改。定义的文本格式如下:

1
2
3
4
5
6
7
Request Method      + "\n" +
Accept + "\n" +
Content-Type + "\n" +
Request URI + "\n" +
MD5(Request Body) + "\n" +
jti + "\n" +
iat

公司内部测试没啥问题,移交给客户后报出生成的哈希值和工具生成的哈希值不匹配,而用工具生成的哈希值是可以请求服务接口的。截图也看了,日志也看了,明明是相同的文本,为啥生成的哈希就是不一样呢。找了好久才发现是不可见字符的影响,原来在服务端拼接指定格式文本的时候使用的StringBuilder的AppendLine方法,而AppendLine方法的内部自动追加了一个Environment.NewLine.

我们都知道“\n”是换行符,一直以来C#的各种编程实践都推荐使用 Environment.NewLine 用于指定系统换行符,但是 Environment.NewLine != “\n”. 所以在这个示例中正确的用法应该是使用Append方法,在Append方法里添加”\n”作为换行使用.

操作系统 回车换行所用字符
Linux/Unix/Android/Mac OS X 10 \n = Newline = 0x0A = 10 = LF =Line Feed = 换行 = Ctrl + J
Mac OS 9 \r = Return = 0x0D = 13 = CR = Carriage Return = 回车 = Ctrl + M
Windows/Dos \r \n = 0x0D 0x0A = CR LF = 回车 换行

Windows平台的换行符是”\r\n“,而Linux平台的换行符是”\n“,在不同平台下调用系统换行符返回的换行符是不一样的。很多时候我们需要保证平台兼容性,让Linux平台和Windows平台的保持一致时应该拒绝使用编程语言提供的系统换行符,应该使用原生的”\n”或”\r\n”。至于是使用”\n”还是”\r\n”来定义换行格式,理论上都可以,只要约定好就行。

编程语言/环境 系统换行符
C# Environment.NewLine
Java/JDK7前 System.getProperty(“line.separator”)
Java/JDK7后 System.lineSeparator()
Python os.linesep

后记:在排查完问题后,很好奇到底还有那些字符属于不可见字符。原来在ASCII中存在控制字符和打印字符的说法,通常我们说的不可见字符大多是控制字符。常见的控制字符(US-ASCII控制字符)见下表。

十进制 十六进制 控制字符 转义字符 说明
0 00 NUL \0 Null character(空字符)
1 01 SOH Start of Header(标题开始)
2 02 STX Start of Text(正文开始)
3 03 ETX End of Text(正文结束)
4 04 EOT End of Transmission(传输结束)
5 05 ENQ Enquiry(请求)
6 06 ACK Acknowledgment(收到通知/响应)
7 07 BEL \a Bell(响铃)
8 08 BS \b Backspace(退格)
9 09 HT \t Horizontal Tab(水平制表符)
10 0A LF \n Line feed(换行键)
11 0B VT \v Vertical Tab(垂直制表符)
12 0C FF \f Form feed(换页键)
13 0D CR \r Carriage return(回车键)
14 0E SO Shift Out(不用切换)
15 0F SI Shift In(启用切换)
16 10 DLE Data Link Escape(数据链路转义)
17 11 DC1 Device Control 1(设备控制1) /XON(Transmit On)
18 12 DC2 Device Control 2(设备控制2)
19 13 DC3 Device Control 3(设备控制3) /XOFF(Transmit Off)
20 14 DC4 Device Control 4(设备控制4)
21 15 NAK Negative Acknowledgement(拒绝接收/无响应)
22 16 SYN Synchronous Idle(同步空闲)
23 17 ETB End of Trans the Block(传输块结束)
24 18 CAN Cancel(取消)
25 19 EM End of Medium(已到介质末端/介质存储已满)
26 1A SUB Substitute(替补/替换)
27 1B ESC \e Escape(溢出/逃离/取消)
28 1C FS File Separator(文件分割符)
29 1D GS Group Separator(分组符)
30 1E RS Record Separator(记录分隔符)
31 1F US Unit Separator(单元分隔符)
32 20 SP White space
127 7F DEL Delete(删除)

参考链接:

https://zh.wikipedia.org/zh-hans/%E6%8E%A7%E5%88%B6%E5%AD%97%E7%AC%A6

https://www.ruanyifeng.com/blog/2006/04/post_213.html

https://www.crifan.com/files/doc/docbook/char_encoding/release/webhelp/ascii_ctrl_char.html

https://www.crifan.com/detailed_carriage_return_0x0d_0x0a_cr_lf__r__n_the_context/

前言

Spring Data Jpa的增删改查仓库接口(CrudRepository)提供一个sava方法,用于保存实体对象。众所周知,在ORM框架中实体对应数据表,对实体的保存操作最终会转换为sql执行语句。数据保存实际上是执行插入和更新操作,在数据表中不存在该记录时,使用insert语句插入,存在相关记录时,使用update语句更新非主键列。本文主要介绍MySql数据表插入或更新的几种sql语句实现。

在正式开始之前,假设我们要是保存的数据表是t_sequence,并且存在部分数据。数据表结构定义如下:

1
2
3
4
5
6
7
8
9
drop table if exists t_sequence;
create table t_sequence
(
seq_name varchar(64) not null primary key comment '序列名称',
start_value bigint(20) not null default 1 comment '起始值',
increment int(11) not null default 1 comment '增量值',
updated_at timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间'
) engine=InnoDB;
alter table t_sequence comment '序列表';

初始表中数据显示如下:

1
2
3
4
5
6
7
8
9
10
mysql> insert into t_sequence(seq_name, start_value, increment, updated_at) values ('a', 1, 1, '2021-04-27 00:00:00');
Query OK, 1 row affected (0.04 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 1 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
1 row in set (0.00 sec)

INSERT … ON DUPLICATE KEY UPDATE语法

该语法用于插入或更新,使用前提是数据表必须包含唯一索引或主键。当执行的sql包含on duplicate key update子句时,插入的记录已经存在时,执行更新操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> insert into t_sequence (seq_name, start_value, increment, updated_at) values ('a', 100, 1, now()) on duplicate key update start_value=200, increment=1, updated_at=now();
Query OK, 2 rows affected (0.04 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
+----------+-------------+-----------+---------------------+
1 row in set (0.00 sec)

mysql> insert into t_sequence (seq_name, start_value, increment, updated_at) values ('b', 1, 1, now()) on duplicate key update start_value=1, increment=1, updated_at=now();
Query OK, 1 row affected (0.05 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 1 | 1 | 2021-04-27 17:13:31 |
+----------+-------------+-----------+---------------------+
2 rows in set (0.00 sec)

REPLACE INTO语法

replace into语法的工作方式和insert完全相同,不同之处在于,如果表中旧行的主键或唯一索引与新行值相同,则在插入新行之前删除旧行。简述:要么插入,要么删除后再插入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> replace into t_sequence (seq_name, start_value, increment, updated_at) values ('b', 10, 1, '2021-04-27 00:00:00');
Query OK, 2 rows affected (0.03 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
2 rows in set (0.00 sec)

mysql> replace into t_sequence(seq_name, start_value, increment, updated_at) values ('c', 1, 1, '2021-04-27 00:00:00');
Query OK, 1 row affected (0.03 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
3 rows in set (0.00 sec)

先插入后更新

先插入后更新主要运用MySql提供的insert ignore语法执行数据插入,执行update语句更新数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql> insert ignore into t_sequence (seq_name, start_value, increment, updated_
at) values ('d', 1, 1, '2021-04-27 00:00:00');
Query OK, 1 row affected (0.05 sec)

mysql> update t_sequence
-> set start_value= 1, increment=1, updated_at=now()
-> where seq_name = 'd';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
| d | 1 | 1 | 2021-04-27 17:15:17 |
+----------+-------------+-----------+---------------------+
4 rows in set (0.00 sec)

mysql> insert ignore into t_sequence (seq_name, start_value, increment, updated_at) values ('d', 1, 1, '2021-04-27 00:00:00');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> update t_sequence
-> set start_value= 1, increment=1, updated_at='2021-04-27 00:00:00'
-> where seq_name = 'd';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
| d | 1 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
4 rows in set (0.00 sec)

先更新后插入

先更新后插入和先插入后更新的原理相同,都用到了insert ignore语法,只是insert 语句和update语句调换了顺序。这里更高级的用法是:先执行update语句,使用row_count()函数获取影响行数,再使用insert ignore … select语法过滤where条件后执行插入操作。

PS:当待更新的数据在表中存在,执行update语句后,数据未发送变化时,row_count()函数结果可能返回0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
mysql> update t_sequence
-> set start_value= 1, increment=1, updated_at=now()
-> where seq_name = 'e';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0

mysql> select ROW_COUNT() into @cnt;
Query OK, 1 row affected (0.00 sec)

mysql> insert ignore into t_sequence (seq_name, start_value, increment, updated_at)
-> select * from (select 'e' as seq_name, 1 as start_value, 1 as increment,'2021-04-27 00:00:00' as updated_at) t
-> where 1 = if(@cnt > 0, 0, 1);
Query OK, 1 row affected (0.08 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
| d | 1 | 1 | 2021-04-27 00:00:00 |
| e | 1 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
5 rows in set (0.00 sec)

mysql> update t_sequence
-> set start_value= 1000, increment=1, updated_at=now()
-> where seq_name = 'e';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select ROW_COUNT() into @cnt;
Query OK, 1 row affected (0.00 sec)

mysql> insert ignore into t_sequence (seq_name, start_value, increment, updated_at)
-> select * from (select 'e' as seq_name, 1 as start_value, 1 as increment,'2021-04-27 00:00:00' as updated_at) t
-> where 1 = if(@cnt > 0, 0, 1);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
| d | 1 | 1 | 2021-04-27 00:00:00 |
| e | 1000 | 1 | 2021-04-27 17:20:37 |
+----------+-------------+-----------+---------------------+
5 rows in set (0.00 sec)

先删除后插入

先删除后插入:先执行delete语句删除数据,然后执行insert语句插入数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> delete from t_sequence where seq_name = 'e';
Query OK, 1 row affected (0.04 sec)

mysql> insert into t_sequence(seq_name, start_value, increment, updated_at) values ('e', 10, 1, '2021-04-27 00:00:00');
Query OK, 1 row affected (0.06 sec)

mysql> select * from t_sequence;
+----------+-------------+-----------+---------------------+
| seq_name | start_value | increment | updated_at |
+----------+-------------+-----------+---------------------+
| a | 200 | 1 | 2021-04-27 17:12:27 |
| b | 10 | 1 | 2021-04-27 00:00:00 |
| c | 1 | 1 | 2021-04-27 00:00:00 |
| d | 1 | 1 | 2021-04-27 00:00:00 |
| e | 10 | 1 | 2021-04-27 00:00:00 |
+----------+-------------+-----------+---------------------+
5 rows in set (0.00 sec)

总结

毫无疑问,insert … on duplicate key update语法是最适合数据表插入或更新操作的最佳方式。

严格意义上说,replace into语法和先删除后插入都不符合数据插入或更新的标准,执行过程存在删除操作,因此不推荐。

先插入后更新、先更新后插入的核心在于insert ignore语法,当插入的数据与主键或唯一索引冲突时,数据插入会被丢弃,且不会抛出异常。当数据表不存在主键和唯一索引时,先插入后更新、先更新后插入可以作为备选方案。结合row_count()和if()函数在where子句中对插入或更新影响行数进行过滤,可以减少一次sql语句执行,进而提升处理效率。

插入或更新实现方式 前提条件 推荐指数 备注
INSERT … ON DUPLICATE KEY UPDATE语法 数据表存在主键或唯一索引 ★★★★★ 推荐
REPLACE INTO语法 数据表存在主键或唯一索引 ★★★ 存在删除操作
先插入后更新 ★★★ 结合ROW_COUNT()可更高效
先更新后插入 ★★★ 结合ROW_COUNT()可更高效
先删除后插入 ★★ 存在删除操作

参考信息:

https://dev.mysql.com/doc/refman/5.7/en/insert.html

https://dev.mysql.com/doc/refman/5.7/en/insert-select.html

https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

https://dev.mysql.com/doc/refman/5.7/en/replace.html

https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_row-count

https://docs.spring.io/spring-data/jpa/docs/2.5.0/reference/html/#jpa.entity-persistence.saving-entites

前言

随着数据库的存储规模的增长,需要选择合适的数据批量写入技术。在MySql中实现批量导入,是指一次性的在数据表中插入很多记录,一般用于解决数据库写入性能。本文主要介绍C#中实现批量导入的MySql数据库的几种方法。

环境准备

本文使用的MySql数据库版本是:5.7,数据库连接驱动采用nuget.org的最新中间件MySql.Data,安装方式如下:

1
Install-Package MySql.Data -Version 8.0.24

我们将通过详细的代码示例研究这些方法,首先我们定义用于测试的数据表结构:

1
2
3
4
5
6
7
8
9
10
DROP TABLE IF EXISTS t_vehicle_pass_record;
CREATE TABLE t_vehicle_pass_record (
id bigint NOT NULL AUTO_INCREMENT,
plate_no varchar(10) NOT NULL DEFAULT '',
plate_color varchar(6) NOT NULL DEFAULT '',
pass_time datetime NOT NULL DEFAULT now(),
equip_id varchar(20) NOT NULL,
created_at datetime NOT NULL DEFAULT now(),
PRIMARY KEY (id)
) ENGINE=InnoDB;

然后定义代码所引用的C#模型代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class VehiclePassModel
{
public Int64 Id { get; set; }

public string PlateNO { get; set; }

public string PlateColor { get; set; }

public DateTime PassTime { get; set; }

public string EquipId { get; set; }

public DateTime CreatedAt { get; set; }
}

循环执行命令

循环执行命令(MySqlCommand)是一种常规的方式,一般步骤是:创建连接->打开数据库连接->创建事务->创建命令->循环执行命令->提交事务->关闭连接,结束。小提示:循环执行命令时,需要将绑定的参数清空后重新绑定,避免抛出参数已经定义的异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static int DoInsertList1(IEnumerable<VehiclePassModel> list)
{
const string sql = "insert into t_vehicle_pass_record (id, plate_no, plate_color, pass_time, equip_id, created_at) values (?id, ?plate_no, ?plate_color, ?pass_time, ?equip_id, now());";
var result = 0;
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;

using (var conn = new MySqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;

foreach (var model in list)
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("id", model.Id);
cmd.Parameters.AddWithValue("plate_no", model.PlateNO);
cmd.Parameters.AddWithValue("plate_color", model.PlateColor);
cmd.Parameters.AddWithValue("pass_time", model.PassTime);
cmd.Parameters.AddWithValue("equip_id", model.EquipId);

result += cmd.ExecuteNonQuery(); //执行sql语句
}
}

tran.Commit();
}
}

return result;
}

适配器批量更新

使用此方法执行插入语句,内部实现同样采用循环执行原理,不同的是适配器(MySqlDataAdapter)会根据UpdateBatchSize参数进行分组后循环执行。适配器包含4个执行命令:UpdateCommand、SelectCommand、InsertCommand、DeleteCommand,用于数据的更新、查询、插入、删除操作。批量插入时应当使用InsertCommand,同时不要给其他执行命令赋值,因为给其他执行命令赋值会造成不必要的执行。适配器包含一个UpdateBatchSize属性,用于将DataTable中的Rows拆分按照数量拆分成多个(Rows.Count / UpdateBatchSize)执行命令;UpdateBatchSize未设置或者小于1时,UpdateBatchSize等于DataTable行数,此时只有一个执行命令。

适配器的Update方法,提供多个方法重载,推荐使用传入DataTable类型,并设置表名称。传入DataSet类型时方法内部会转换为DataTable,并调用UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)方法,因此传入DataTable类型的方法更高效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public static int DoInsertList2(IEnumerable<VehiclePassModel> list)
{
const string sql = "insert into t_vehicle_pass_record (id, plate_no, plate_color, pass_time, equip_id, created_at) values (?id, ?plate_no, ?plate_color, ?pass_time, ?equip_id, now());";
var result = 0;
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;

var table = new DataTable("t_vehicle_pass_record");
table.Columns.Add("id", typeof(Int64));
table.Columns.Add("plate_no", typeof(string));
table.Columns.Add("plate_color", typeof(string));
table.Columns.Add("pass_time", typeof(DateTime));
table.Columns.Add("equip_id", typeof(string));

foreach (var model in list)
{
var row = table.NewRow();
row["id"] = model.Id;
row["plate_no"] = model.PlateNO;
row["plate_color"] = model.PlateColor;
row["pass_time"] = model.PassTime;
row["equip_id"] = model.EquipId;

table.Rows.Add(row);
}

using (var conn = new MySqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;

using (var adapter = new MySqlDataAdapter())
{
adapter.InsertCommand = cmd;

adapter.InsertCommand.Parameters.Add("?id", MySqlDbType.Int64, 21, "id");
adapter.InsertCommand.Parameters.Add("?plate_no", MySqlDbType.VarChar, 10, "plate_no");
adapter.InsertCommand.Parameters.Add("?plate_color", MySqlDbType.VarChar, 6, "plate_color");
adapter.InsertCommand.Parameters.Add("?pass_time", MySqlDbType.DateTime, 8, "pass_time");
adapter.InsertCommand.Parameters.Add("?equip_id", MySqlDbType.VarChar, 20, "equip_id");

adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;

adapter.UpdateBatchSize = 1000;
result = adapter.Update(table); //执行sql语句
}
}

tran.Commit();
}
}

return result;
}

执行拼接SQL语句

MySql的INSERT ... VALUES 语法中提供插入多个值列表的功能。

1
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

此方法的核心在于拼接SQL语句,绑定参数变量列表,然后执行SQL.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public static int DoInsertList3(IEnumerable<VehiclePassModel> list)
{
const string insertIntoClause = "insert into t_vehicle_pass_record (id, plate_no, plate_color, pass_time, equip_id, created_at) values ";
var result = 0;
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;

var valueClauses = new List<string>(list.Count());
var index = 0;
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tran;

//foreach (var model in list)
//{
// var suffix = Convert.ToString(index, 16);
// var clause = $"(?a{suffix}, ?b{suffix}, ?c{suffix}, ?d{suffix}, ?e{suffix}, now())";
// valueClauses.Add(clause);
// cmd.Parameters.AddWithValue($"a{suffix}", model.Id);
// cmd.Parameters.AddWithValue($"b{suffix}", model.PlateNO);
// cmd.Parameters.AddWithValue($"c{suffix}", model.PlateColor);
// cmd.Parameters.AddWithValue($"d{suffix}", model.PassTime);
// cmd.Parameters.AddWithValue($"e{suffix}", model.EquipId);
// index++;
//}

foreach (var model in list)
{
var clause = $"(?id_{index}, ?plate_no_{index}, ?plate_color_{index}, ?pass_time_{index}, ?equip_id_{index}, now())";
valueClauses.Add(clause);
cmd.Parameters.AddWithValue($"id_{index}", model.Id);
cmd.Parameters.AddWithValue($"plate_no_{index}", model.PlateNO);
cmd.Parameters.AddWithValue($"plate_color_{index}", model.PlateColor);
cmd.Parameters.AddWithValue($"pass_time_{index}", model.PassTime);
cmd.Parameters.AddWithValue($"equip_id_{index}", model.EquipId);
index++;
}

var sql = insertIntoClause + string.Join(",", valueClauses) + ";";
cmd.CommandText = sql;

Console.WriteLine(sql.Length);
Console.WriteLine(Encoding.UTF8.GetBytes(sql).Length);

result = cmd.ExecuteNonQuery(); //执行sql语句
}

tran.Commit();
}
}

return result;
}

使用MySqlBulkLoader

MySqlBulkLoader主要包装MySql的语法 LOAD DATA INFILE,提供将数据文件从本地或远程保存到数据库。使用参数详解:

  1. Local表示要加载的文件是否在客户端本地,默认值为false(如果导入程序和数据库在同一台服务器,此参数可以设置为false),使用时应当设置为true;
  2. TableName为待导入的数据表名,为必传参数;
  3. FileName为导入的文本文件路径,导入的格式可以为后缀为:.txt、.csv的UTF-8文本文件。推荐使用csv格式,将FieldTerminator设置为”,”,LineTerminator设置为Environment.NewLine;
  4. 导入的文本文件包含中文字符时,文本保存的格式应当设置为UTF-8,同时将CharacterSet属性设置为”utf8mb4”;
  5. NumberOfLinesToSkip表示跳过多少条文本开始导入,主要用于跳过表头设置。标准的csv文件格式带有一行表头,所以此处应当设置为1;
  6. Columns用于指定待导入的数据字段,字段名称和数据表中字段名称保持一致,字段顺序和内容需一一对应。通过此参数可以设置只导入部分字段内容,未设置时,需要将文本文件设置为全表字段内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public static int DoInsertList4(IEnumerable<VehiclePassModel> list)
{
var result = 0;
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Guid.NewGuid().ToString() + ".csv");
var head = "id,plate_color,plate_no,pass_time,equip_id";
using (var writer = File.CreateText(path))
{
writer.WriteLine(head);//注释掉此行后, loader.NumberOfLinesToSkip可以设置为0
foreach (var item in list)
{
var content = $"{item.Id},{item.PlateColor},{item.PlateNO},{item.PassTime.ToString("yyyy-MM-dd HH:mm:ss")},{item.EquipId}";
writer.WriteLine(content);
}
writer.Flush();
}

try
{
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
MySqlBulkLoader loader = new MySqlBulkLoader(conn);
loader.Local = true;
loader.FieldTerminator = ",";
loader.LineTerminator = Environment.NewLine;
loader.FileName = path;
loader.NumberOfLinesToSkip = 1;
loader.CharacterSet = "utf8mb4";

loader.TableName = "t_vehicle_pass_record";
loader.Columns.AddRange(head.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

result = loader.Load();
}
}
finally
{
if (File.Exists(path))
{
File.Delete(path);
}
}

return result;
}

总结

使用适配器更新时,第一次验证未设置UpdateBatchSize参数测试结果和循环执行差不多,设置为1000后,性能有着明显的提升。

在导入数量超过10w时,执行拼接SQL语句异常。

1
2
3
4
5
6
7
8
9
MySql.Data.MySqlClient.MySqlException (0x80004005): Packets larger than max_allowed_packet are not allowed.
在 MySql.Data.MySqlClient.MySqlStream.SendPacket(MySqlPacket packet)
在 MySql.Data.MySqlClient.NativeDriver.ExecutePacket(MySqlPacket packetToExecute)
在 MySql.Data.MySqlClient.NativeDriver.SendQuery(MySqlPacket queryPacket)
在 MySql.Data.MySqlClient.Driver.SendQuery(MySqlPacket p)
在 MySql.Data.MySqlClient.Statement.ExecuteNext()
在 MySql.Data.MySqlClient.PreparableStatement.Execute()
在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()

异常原因是客户端传输的数据包消息长度超过了4MB,解决方案是:修改数据库max_allowed_packet参数,或分批执行SQL,或修改SQL缩小语句长度和变量参数名称长度。

1
2
3
4
5
6
7
8
9
10
11
12
foreach (var model in list)
{
var suffix = Convert.ToString(index, 16);
var clause = $"(?a{suffix}, ?b{suffix}, ?c{suffix}, ?d{suffix}, ?e{suffix}, now())";
valueClauses.Add(clause);
cmd.Parameters.AddWithValue($"a{suffix}", model.Id);
cmd.Parameters.AddWithValue($"b{suffix}", model.PlateNO);
cmd.Parameters.AddWithValue($"c{suffix}", model.PlateColor);
cmd.Parameters.AddWithValue($"d{suffix}", model.PassTime);
cmd.Parameters.AddWithValue($"e{suffix}", model.EquipId);
index++;
}

实际运用时,还可以做更进一步的导入优化:

  • 缩小SQL绑定变量的大小,减少网络传输的消耗;
  • 确保待执行的SQL在85k以内避免产生内存大对象;
  • 设置合适的批次执行的数量,以达到最优解;

批量导入的耗时是评价导入性能的参照标准之一,这里我们分别导入100、1000、10000、50000、10000条数据测试本地MySql数据库的平均耗时,供读者参考。

导入数量 循环执行命令 适配器批量更新 执行拼接SQL语句 使用MySqlBulkLoader
100 121ms 149ms 124ms 95ms
1000 509ms 430ms 296ms 210ms
10000 2.87s 1.74s 787ms 387ms
50000 14.21s 9.12s 2.92s 2.21s
100000 27.73s 27.77s 异常 3.45s

从测试结果来看排名:

  1. MySqlBulkLoader,缺点是会生成临时文件,优点是速度最快性能最好,推荐使用;

  2. 拼接SQL语句,性能次之,编码方便,数据量不大情况推荐使用。

  3. 适配器批量更新,适配器的核心在于设置UpdateBatchSize参数,需手动调优,少量数据时使用;

  4. 循环执行,简单方案,少量数据时使用;


参考信息:

https://referencesource.microsoft.com/#System.Data/fx/src/data/System/Data/Common/DbDataAdapter.cs

https://dev.mysql.com/doc/refman/5.7/en/insert.html

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-bulk-loader.html

https://dev.mysql.com/doc/dev/connector-net/8.0/html/T_MySql_Data_MySqlClient_MySqlBulkLoader.htm

https://dev.mysql.com/doc/refman/5.7/en/replication-features-max-allowed-packet.html

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet

在Oracle中我们使用sequence来生成整型自增ID,而MySql不支持创建sequence. 虽然MySql中可以对主键设置AUTO_INCREMENT属性来实现表ID自增,但某些场景下需要提前获取ID标识领域对象,以实现业务生存周期的后续处理。在不支持sequence的其他RMDB中,一般使用序列表来实现对数列值的管理,并定义函数或存储过程用于获取更新序列值。

序列表的定义大同小异,一般包含序列名称(业务编号)、起始值(当前值)、增量(步长)等字段。

1
2
3
4
5
6
7
8
9
drop table if exists t_sequence;
create table t_sequence
(
seq_name varchar(64) not null primary key comment '序列名称',
start_value bigint(20) not null default 1 comment '起始值',
increment int(11) not null default 1 comment '增量值',
updated_at timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间'
) engine=InnoDB;
alter table t_sequence comment '序列表';

在MySql的分支项目MariaDB,从10.3开始支持创建sequence,可以使用Oracle的PL/SQL语法调用序列。MariaDB为了兼容PostgreSQL语法风格,定义了函数:setval()、nextval()、lastval(),分布用于设置当前序列值、获取下一个序列值、获取当前序列值。在PostgreSQL还定义了currval函数,用于返回序列最近获取的值,功能上和lastval相同;不同的是lastval不需要传递序列参数,获取的是当前会话的的序列的最近值。MariaDB中的lastval函数其实应该对应PostgreSQL中的currval,等同于Oracle中的sequence_name.currval.

为了和MariaDB保持兼容,我们定义名称相同的函数以实现序列功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- 启用函数创建功能
-- set global log_bin_trust_function_creators=1;

drop function if exists setval;
create function setval(vseq varchar(64), vstart bigint(20))
returns bigint(20)
begin
insert into t_sequence(seq_name, start_value, increment, updated_at)
values (vseq, vstart + 1, 1, CURRENT_TIMESTAMP())
on duplicate key update start_value = vstart + increment;

return vstart;
end;

drop function if exists nextval;
create function nextval(vseq varchar(64))
returns bigint(20)
begin
set @next = null;
update t_sequence
set start_value = (@next := start_value) + increment
where seq_name = vseq;

return ifnull(@next, setval(vseq, 1));
end;

drop function if exists lastval;
create function lastval(vseq varchar(64))
returns bigint(20)
begin
set @cur_val = null;
select start_value into @cur_val
from t_sequence
where seq_name = vseq;

return ifnull(@cur_val, setval(vseq, 1));
end;

虽然每一个函数都有自动创建序列的功能,但是推荐在使用nextval函数前,初始化序列,避免高并发时获取到重复的初始值。使用示例如下。

1
2
3
select setval('abc',1);  -- 返回1
select nextval('abc'); -- 返回2
select lastval('abc'); -- 返回3

序列的默认增量为1,业务需要高并发生成ID时,可适当扩充增量值,并通过编程实现批量获取ID值。以下是伪代码示例。

1
2
3
4
5
6
7
8
9
-- 执行sql:
insert into t_sequence (seq_name, start_value, increment) values ('system', 1, 100); -- 序列名称:system,初始值:1, 增量:100
批量获取序列值:
var startId = nextval('system'); // 返回1
var increment = 100;
var ids = new List<long>();
for(var i = 0; i < increment; i++) {
ids.add(startId++);
}

本文所列举的是MySql的示例,此方案同样可用于其他不支持sequence的RMDB,比如Sql Server 2008、Sqlite…

sql附件: mysql_sequence.sql

参考信息:

https://mariadb.com/kb/en/sequence-overview/

https://mariadb.com/kb/en/create-sequence/

https://mariadb.com/kb/en/sequence-functions/

https://www.postgresql.org/docs/current/sql-createsequence.html

https://www.postgresql.org/docs/current/functions-sequence.html

经常参与一些政府的招标项目,标书文档里普遍引用了一些国家和行业相关标准等内容。处于好奇的目的,收集这些术语及含义。

机动车测速仪 motor vehicle speed detector
用于测定在道路上行驶机动车速度的装置,包括利用雷达、激光测速原理由人工操作仅测定机动车速度的单一功能测速仪和利用雷达、激光、线圈感应、视频分析等测速原理测定机动车速度,同时采集、处理图像的复合功能测速仪。

雷达测速 radar speed detect
通过测量雷达波的发射频率和反射波频率之间的变化量,计算得出机动车的行驶速度。

激光测速 laser speed detect
通过测量一定时间间隔内被测机动车的移动距离,计算得出机动车的行驶速度。

线圈感应测速 loop induction speed detect
通过测量机动车经过一组按一定距离埋设于地面的感应线圈的时间差,计算得出机动车的行驶速度。

视频分析测速 video analysis speed detect
通过测量机动车经过视频中一定距离的时间差,或对视频中目标机动车的运动轨迹进行实时跟踪并分析车辆在一定时间间隔内的移动距离,计算得出机动车的行驶速度。

静态测速 speed detect in stationary mode
测速仪在固定静止位置上对机动车进行速度测定。

动态测速 speed detect in moving mode
测速仪安装于测量车上,在行驶状态下对被测机动车进行速度测定。

测定角度 speed detect angle
测速仪的测速单元与被测机动车行驶方向之间的夹角。

测定区域 detect area
测速仪能够有效测定机动车速度并采集对应机动车图像的区域。

有效速度测定区域 effective speed detect area
测速仪能够准确测定机动车速度的区域。

有效图像采集区域 effective area of taking picture
测速仪能够清晰采集机动车图像的区域。

超速车辆捕获率 overspeed vehicle capture ratio
有效记录的超速车辆数与有效通行的超速车辆数的百分比。
注:1、有效记录的超速车辆数是指记录中包含有效车辆信息(号牌号码、号牌颜色、车辆类型等)和对应行驶速度的车辆数。
2、有效通行的超速车辆数是指实际通行车辆中超过速度限定值并且机动车号牌完好(悬挂规范、无遮挡、无污损)的车辆数。

速度图像对应性 corresponding of speed and picture
测速仪采集的图像中反映的机动车与被测定速度的机动车相对应的特性。

响应时间 responding time
测速仪从机动车进入测定区域开始到形成超速记录为止所需要的时间。

图像分辨率 picture distinguish ratio
图像文件在水平和垂直方向上能够分辨的像素数,以“水平像素数×垂直像素数”表示。

兴趣点(POI)分类表

大类 中类 小类 Big Category Mid Category Sub Category
汽车服务 汽车服务相关 汽车服务相关 Auto Service Automobile Service Related Automobile Service Related
汽车服务 加油站 加油站 Auto Service Filling Station Filling Station
汽车服务 加油站 中国石化 Auto Service Filling Station Sinopec
汽车服务 加油站 中国石油 Auto Service Filling Station PetroChina
汽车服务 加油站 壳牌 Auto Service Filling Station Shell
汽车服务 加油站 美孚 Auto Service Filling Station Mobil
汽车服务 加油站 加德士 Auto Service Filling Station Caltex
汽车服务 加油站 东方 Auto Service Filling Station FEOSO
汽车服务 加油站 中石油碧辟 Auto Service Filling Station BP PetroChina
汽车服务 加油站 中石化碧辟 Auto Service Filling Station BP Sinopec
汽车服务 加油站 道达尔 Auto Service Filling Station TOTAL
汽车服务 加油站 埃索 Auto Service Filling Station ESSO
汽车服务 加油站 中化道达尔 Auto Service Filling Station TOTAL-SINOCHEM
汽车服务 其它能源站 其它能源站 Auto Service Other Energy Station Other Energy Station
汽车服务 加气站 加气站 Auto Service Filling Station Filling Station
汽车服务 汽车养护/装饰 汽车养护 Auto Service Automobile Maintenance/Decoration Automobile Maintenance
汽车服务 汽车养护/装饰 加水站 Auto Service Automobile Maintenance/Decoration Add Water Station
汽车服务 洗车场 洗车场 Auto Service Car Wash Car Wash
汽车服务 汽车俱乐部 汽车俱乐部 Auto Service Automobile Club Automobile Club
汽车服务 汽车救援 汽车救援 Auto Service Automobile Rescue Automobile Rescue
汽车服务 汽车配件销售 汽车配件销售 Auto Service Automobile Parts Sales Automobile Parts Sales
汽车服务 汽车租赁 汽车租赁 Auto Service Automobile Rental Automobile Rental
汽车服务 汽车租赁 汽车租赁还车 Auto Service Automobile Rental Rent-a-Car Return
汽车服务 二手车交易 二手车交易 Auto Service Used Automobile Dealer Used Automobile Dealer
汽车服务 充电站 充电站 Auto Service Charging Station Charging Station
汽车销售 汽车销售 汽车销售 Auto Dealers Automobile Sales Automobile Sales
汽车销售 大众特约销售 大众销售 Auto Dealers Volkswagen Franchised Sales Volkswagen Sales
汽车销售 大众特约销售 上海大众销售 Auto Dealers Volkswagen Franchised Sales Shanghai Volkswagen Sales
汽车销售 大众特约销售 一汽-大众销售 Auto Dealers Volkswagen Franchised Sales FAW-Volkswagen Sales
汽车销售 大众特约销售 斯柯达销售 Auto Dealers Volkswagen Franchised Sales Skoda Sales
汽车销售 大众特约销售 进口大众销售 Auto Dealers Volkswagen Franchised Sales Import Volkswagen Sales
汽车销售 大众特约销售 宾利销售 Auto Dealers Volkswagen Franchised Sales Bentley Sales
汽车销售 大众特约销售 兰博基尼销售 Auto Dealers Volkswagen Franchised Sales Lamborghini Sales
汽车销售 本田特约销售 本田销售 Auto Dealers Honda Franchised Sales Honda Sales
汽车销售 本田特约销售 广汽本田销售 Auto Dealers Honda Franchised Sales GAC Honda Sales
汽车销售 本田特约销售 东风本田销售 Auto Dealers Honda Franchised Sales Dongfeng Honda Sales
汽车销售 本田特约销售 本田讴歌销售 Auto Dealers Honda Franchised Sales Acura Sales
汽车销售 奥迪特约销售 奥迪销售 Auto Dealers Audi Franchised Sales Audi Sales
汽车销售 奥迪特约销售 一汽-大众奥迪销售 Auto Dealers Audi Franchised Sales FAW-Audi Sales
汽车销售 通用特约销售 通用销售 Auto Dealers General Motors Franchised Sales General Motors Sales
汽车销售 通用特约销售 凯迪拉克销售 Auto Dealers General Motors Franchised Sales Cadillac Sales
汽车销售 通用特约销售 别克销售 Auto Dealers General Motors Franchised Sales Buick Sales
汽车销售 通用特约销售 雪佛兰销售 Auto Dealers General Motors Franchised Sales Chevrolet Sales
汽车销售 通用特约销售 欧宝销售 Auto Dealers General Motors Franchised Sales Opel Sales
汽车销售 通用特约销售 萨博销售 Auto Dealers General Motors Franchised Sales Saab Sales
汽车销售 通用特约销售 沃克斯豪尔销售 Auto Dealers General Motors Franchised Sales Vauxhall Sales
汽车销售 通用特约销售 土星销售 Auto Dealers General Motors Franchised Sales Saturn Sales
汽车销售 通用特约销售 大宇销售 Auto Dealers General Motors Franchised Sales Daewoo Sales
汽车销售 宝马特约销售 宝马销售 Auto Dealers BMW Franchised Sales BMW Sales
汽车销售 宝马特约销售 宝马MINI销售 Auto Dealers BMW Franchised Sales BMW MINI Sales
汽车销售 宝马特约销售 劳斯莱斯销售 Auto Dealers BMW Franchised Sales Rolls-Royce Sales
汽车销售 日产特约销售 日产销售 Auto Dealers Nissan Franchised Sales Nissan Sales
汽车销售 日产特约销售 东风日产销售 Auto Dealers Nissan Franchised Sales Dongfeng Nissan Sales
汽车销售 日产特约销售 郑州日产销售 Auto Dealers Nissan Franchised Sales Zhengzhou Nissan Sales
汽车销售 日产特约销售 英菲尼迪销售 Auto Dealers Nissan Franchised Sales Infiniti Sales
汽车销售 雷诺特约销售 雷诺销售 Auto Dealers Renault Franchised Sales Renault Sales
汽车销售 梅赛德斯-奔驰特约销售 梅赛德斯-奔驰销售 Auto Dealers Mercedes-Benz Franchised Sales Mercedes-Benz Sales
汽车销售 梅赛德斯-奔驰特约销售 迈巴赫销售 Auto Dealers Mercedes-Benz Franchised Sales Maybach Sales
汽车销售 梅赛德斯-奔驰特约销售 精灵销售 Auto Dealers Mercedes-Benz Franchised Sales Smart Sales
汽车销售 丰田特约销售 丰田销售 Auto Dealers Toyota Franchised Sales Toyota Sales
汽车销售 丰田特约销售 一汽丰田销售 Auto Dealers Toyota Franchised Sales FAW-Toyota Sales
汽车销售 丰田特约销售 广汽丰田销售 Auto Dealers Toyota Franchised Sales GAC Toyota Sales
汽车销售 丰田特约销售 雷克萨斯销售 Auto Dealers Toyota Franchised Sales Lexus Sales
汽车销售 丰田特约销售 大发销售 Auto Dealers Toyota Franchised Sales Daihatsu Sales
汽车销售 斯巴鲁特约销售 斯巴鲁销售 Auto Dealers Subaru Franchised Sales Subaru Sales
汽车销售 标致雪铁龙特约销售 雪铁龙销售 Auto Dealers Peugeot Citroen Franchised Sales Citroen Sales
汽车销售 标致雪铁龙特约销售 东风雪铁龙销售 Auto Dealers Peugeot Citroen Franchised Sales Dongfeng Citroen Sales
汽车销售 标致雪铁龙特约销售 东风标致销售 Auto Dealers Peugeot Citroen Franchised Sales Dongfeng Peugeot Sales
汽车销售 标致雪铁龙特约销售 DS销售 Auto Dealers Peugeot Citroen DS Sales
汽车销售 三菱特约销售 三菱销售 Auto Dealers Mitsubishi Franchised Sales Mitsubishi Sales
汽车销售 三菱特约销售 广汽三菱销售 Auto Dealers Mitsubishi Franchised Sales GAC Mitsubishi Sales
汽车销售 菲亚特约销售 菲亚特销售 Auto Dealers Fiat Franchised Sales Fiat Sales
汽车销售 菲亚特约销售 阿尔法-罗密欧销售 Auto Dealers Fiat Franchised Sales Alfa Romeo Sales
汽车销售 法拉利特约销售 法拉利销售 Auto Dealers Ferrari Franchised Sales Ferrari Sales
汽车销售 法拉利特约销售 玛莎拉蒂销售 Auto Dealers Ferrari Franchised Sales Maserati Sales
汽车销售 现代特约销售 现代销售 Auto Dealers Hyundai Franchised Sales Hyundai Sales
汽车销售 现代特约销售 进口现代销售 Auto Dealers Hyundai Franchised Sales Import Hyundai Sales
汽车销售 现代特约销售 北京现代销售 Auto Dealers Hyundai Franchised Sales Beijing Hyundai Sales
汽车销售 起亚特约销售 起亚销售 Auto Dealers KIA Franchised Sales KIA Sales
汽车销售 起亚特约销售 进口起亚销售 Auto Dealers KIA Franchised Sales Import KIA Sales
汽车销售 起亚特约销售 东风悦达起亚销售 Auto Dealers KIA Franchised Sales Dongfeng Yueda KIA Sales
汽车销售 福特特约销售 福特销售 Auto Dealers Ford Franchised Sales Ford Sales
汽车销售 福特特约销售 马自达销售 Auto Dealers Ford Franchised Sales Mazda Sales
汽车销售 福特特约销售 林肯销售 Auto Dealers Ford Franchised Sales Lincoln Sales
汽车销售 福特特约销售 水星销售 Auto Dealers Ford Franchised Sales Mercury Sales
汽车销售 捷豹特约销售 捷豹销售 Auto Dealers JAGUAR Franchised Sales JAGUAR Sales
汽车销售 路虎特约销售 路虎销售 Auto Dealers Land Rover Franchised Sales Land Rover Sales
汽车销售 保时捷特约销售 保时捷销售 Auto Dealers Porsche Franchised Sales Porsche Sales
汽车销售 东风特约销售 东风销售 Auto Dealers DFM Franchised Sales DFM Sales
汽车销售 吉利特约销售 吉利销售 Auto Dealers Geely Franchised Sales Geely Sales
汽车销售 吉利特约销售 沃尔沃汽车销售 Auto Dealers Geely Franchised Sales Volvo Cars Sales
汽车销售 奇瑞特约销售 奇瑞销售 Auto Dealers Chery Franchised Sales Chery Sales
汽车销售 克莱斯勒特约销售 克莱斯勒销售 Auto Dealers Chrysler Franchised Sales Chrysler Sales
汽车销售 克莱斯勒特约销售 吉普销售 Auto Dealers Chrysler Franchised Sales Jeep Sales
汽车销售 克莱斯勒特约销售 道奇销售 Auto Dealers Chrysler Franchised Sales Dodge Sales
汽车销售 荣威销售 荣威销售 Auto Dealers ROEWE Sales ROEWE Sales
汽车销售 名爵销售 名爵销售 Auto Dealers MG Sales MG Sales
汽车销售 江淮销售 江淮销售 Auto Dealers JAC Sales JAC Sales
汽车销售 红旗销售 红旗销售 Auto Dealers Hongqi Sales Hongqi Sales
汽车销售 长安汽车销售 长安汽车销售 Auto Dealers Chang’an Sales Chang’an Sales
汽车销售 海马汽车销售 海马汽车销售 Auto Dealers Haima Sales Haima Sales
汽车销售 北京汽车销售 北京汽车销售 Auto Dealers BAIC MOTOR Sales BAIC MOTOR Sales
汽车销售 长城汽车销售 长城汽车销售 Auto Dealers Great Wall Sales Great Wall Sales
汽车销售 长城汽车销售 魏派汽车销售 Auto Dealers Great Wall Sales WEY Sales
汽车销售 纳智捷销售 纳智捷销售 Auto Dealers Luxgen Sales Luxgen Sales
汽车销售 广汽传祺销售 广汽传祺销售 Auto Dealers GAC Trumpchi Sales GAC Trumpchi Sales
汽车销售 货车销售 货车销售 Auto Dealers Truck Sales Truck Sales
汽车销售 东风货车销售 东风货车销售 Auto Dealers Dongfeng Truck Sales Dongfeng Truck Sales
汽车销售 中国重汽销售 中国重汽销售 Auto Dealers SINOTRUK Sales SINOTRUK Sales
汽车销售 一汽解放销售 一汽解放销售 Auto Dealers FAW Jiefang Sales FAW Jiefang Sales
汽车销售 福田卡车销售 福田卡车销售 Auto Dealers Foton Truck Sales Foton Truck Sales
汽车销售 陕西重汽销售 陕西重汽销售 Auto Dealers Shaanxi Heavy-duty Truck Sales Shaanxi Heavy-duty Truck Sales
汽车销售 北奔重汽销售 北奔重汽销售 Auto Dealers Beiben Trucks Sales Beiben Trucks Sales
汽车销售 江淮货车销售 江淮货车销售 Auto Dealers JAC Truck Sales JAC Truck Sales
汽车销售 华菱星马销售 华菱星马销售 Auto Dealers CAMC Sales CAMC Sales
汽车销售 成都大运汽车销售 成都大运汽车销售 Auto Dealers Chengdu Dayun Automotive Sales Chengdu Dayun Automotive Sales
汽车销售 梅赛德斯-奔驰卡车销售 梅赛德斯-奔驰卡车销售 Auto Dealers Mercedes-Benz Truck Sales Mercedes-Benz Truck Sales
汽车销售 德国曼恩销售 德国曼恩销售 Auto Dealers MAN Sales MAN Sales
汽车销售 斯堪尼亚销售 斯堪尼亚销售 Auto Dealers SCANIA Sales SCANIA Sales
汽车销售 沃尔沃卡车销售 沃尔沃卡车销售 Auto Dealers Volvo Truck Sales Volvo Truck Sales
汽车销售 观致销售 观致销售 Auto Dealers Qoros Sales Qoros Sales
汽车维修 汽车维修 汽车维修 Auto Repair Automobile Repair Automobile Repair
汽车维修 汽车综合维修 汽车综合维修 Auto Repair Automobile Comprehensive Repair Automobile Comprehensive Repair
汽车维修 大众特约维修 大众维修 Auto Repair Volkswagen Franchised Repair Volkswagen Repair
汽车维修 大众特约维修 上海大众维修 Auto Repair Volkswagen Franchised Repair Shanghai Volkswagen Repair
汽车维修 大众特约维修 一汽-大众维修 Auto Repair Volkswagen Franchised Repair FAW-Volkswagen Repair
汽车维修 大众特约维修 斯柯达维修 Auto Repair Volkswagen Franchised Repair Skoda Repair
汽车维修 大众特约维修 进口大众维修 Auto Repair Volkswagen Franchised Repair Import Volkswagen Repair
汽车维修 大众特约维修 宾利维修 Auto Repair Volkswagen Franchised Repair Bentley Repair
汽车维修 大众特约维修 兰博基尼维修 Auto Repair Volkswagen Franchised Repair Lamborghini Repair
汽车维修 本田特约维修 本田维修 Auto Repair Honda Franchised Repair Honda Repair
汽车维修 本田特约维修 广汽本田维修 Auto Repair Honda Franchised Repair GAC Honda Repair
汽车维修 本田特约维修 东风本田维修 Auto Repair Honda Franchised Repair Dongfeng Honda Repair
汽车维修 本田特约维修 本田讴歌维修 Auto Repair Honda Franchised Repair Acura Repair
汽车维修 奥迪特约维修 奥迪维修 Auto Repair Audi Franchised Repair Audi Repair
汽车维修 奥迪特约维修 一汽-大众奥迪维修 Auto Repair Audi Franchised Repair FAW-Audi Repair
汽车维修 通用特约维修 通用维修 Auto Repair General Motors Franchised Repair General Motors Repair
汽车维修 通用特约维修 凯迪拉克维修 Auto Repair General Motors Franchised Repair Cadillac Repair
汽车维修 通用特约维修 别克维修 Auto Repair General Motors Franchised Repair Buick Repair
汽车维修 通用特约维修 雪佛兰维修 Auto Repair General Motors Franchised Repair Chevrolet Repair
汽车维修 通用特约维修 欧宝维修 Auto Repair General Motors Franchised Repair Opel Repair
汽车维修 通用特约维修 萨博维修 Auto Repair General Motors Franchised Repair Saab Repair
汽车维修 通用特约维修 沃克斯豪尔维修 Auto Repair General Motors Franchised Repair Vauxhall Repair
汽车维修 通用特约维修 土星维修 Auto Repair General Motors Franchised Repair Saturn Repair
汽车维修 通用特约维修 大宇维修 Auto Repair General Motors Franchised Repair Daewoo Repair
汽车维修 宝马特约维修 宝马维修 Auto Repair BMW Franchised Repair BMW Repair
汽车维修 宝马特约维修 宝马MINI维修 Auto Repair BMW Franchised Repair BMW MINI Repair
汽车维修 宝马特约维修 劳斯莱斯维修 Auto Repair BMW Franchised Repair Rolls-Royce Repair
汽车维修 日产特约维修 日产维修 Auto Repair Nissan Franchised Repair Nissan Repair
汽车维修 日产特约维修 英菲尼迪维修 Auto Repair Nissan Franchised Repair Infiniti Repair
汽车维修 日产特约维修 东风日产维修 Auto Repair Nissan Franchised Repair Dongfeng Nissan Repair
汽车维修 日产特约维修 郑州日产维修 Auto Repair Nissan Franchised Repair Zhengzhou Nissan Repair
汽车维修 雷诺特约维修 雷诺维修 Auto Repair Renault Franchised Repair Renault Repair
汽车维修 梅赛德斯-奔驰特约维修 梅赛德斯-奔驰维修 Auto Repair Mercedes-Benz Franchised Repair Mercedes-Benz Repair
汽车维修 梅赛德斯-奔驰特约维修 迈巴赫维修 Auto Repair Mercedes-Benz Franchised Repair Maybach Repair
汽车维修 梅赛德斯-奔驰特约维修 精灵维修 Auto Repair Mercedes-Benz Franchised Repair Smart Repair
汽车维修 丰田特约维修 丰田维修 Auto Repair Toyota Franchised Repair Toyota Repair
汽车维修 丰田特约维修 一汽丰田维修 Auto Repair Toyota Franchised Repair FAW-Toyota Repair
汽车维修 丰田特约维修 广汽丰田维修 Auto Repair Toyota Franchised Repair GAC Toyota Repair
汽车维修 丰田特约维修 雷克萨斯维修 Auto Repair Toyota Franchised Repair Lexus Repair
汽车维修 丰田特约维修 大发维修 Auto Repair Toyota Franchised Repair Daihatsu Repair
汽车维修 斯巴鲁特约维修 斯巴鲁维修 Auto Repair Subaru Franchised Repair Subaru Repair
汽车维修 标致雪铁龙特约维修 雪铁龙维修 Auto Repair Peugeot Citroen Franchised Repair Citroen Repair
汽车维修 标致雪铁龙特约维修 东风标致维修 Auto Repair Peugeot Citroen Franchised Repair Dongfeng Peugeot Repair
汽车维修 标致雪铁龙特约维修 东风雪铁龙维修 Auto Repair Peugeot Citroen Franchised Repair Dongfeng Citroen Repair
汽车维修 标致雪铁龙特约维修 DS维修 Auto Repair Peugeot Citroen DS Repair
汽车维修 三菱特约维修 三菱维修 Auto Repair Mitsubishi Franchised Repair Mitsubishi Repair
汽车维修 三菱特约维修 广汽三菱维修 Auto Repair Mitsubishi Franchised Repair GAC Mitsubishi Repair
汽车维修 菲亚特特约维修 菲亚特维修 Auto Repair Fiat Franchised Repair Fiat Repair
汽车维修 菲亚特特约维修 阿尔法-罗密欧维修 Auto Repair Fiat Franchised Repair Alfa Romeo Repair
汽车维修 法拉利特约维修 法拉利维修 Auto Repair Ferrari Franchised Repair Ferrari Repair
汽车维修 法拉利特约维修 玛莎拉蒂维修 Auto Repair Ferrari Franchised Repair Maserati Repair
汽车维修 现代特约维修 现代维修 Auto Repair Hyundai Franchised Repair Hyundai Repair
汽车维修 现代特约维修 进口现代维修 Auto Repair Hyundai Franchised Repair Import Hyundai Repair
汽车维修 现代特约维修 北京现代维修 Auto Repair Hyundai Franchised Repair Beijing Hyundai Repair
汽车维修 起亚特约维修 起亚维修 Auto Repair KIA Franchised Repair KIA Repair
汽车维修 起亚特约维修 进口起亚维修 Auto Repair KIA Franchised Repair Import KIA Repair
汽车维修 起亚特约维修 东风悦达起亚维修 Auto Repair KIA Franchised Repair Dongfeng Yueda KIA Repair
汽车维修 福特特约维修 福特维修 Auto Repair Ford Franchised Repair Ford Repair
汽车维修 福特特约维修 马自达维修 Auto Repair Ford Franchised Repair Mazda Repair
汽车维修 福特特约维修 林肯维修 Auto Repair Ford Franchised Repair Lincoln Repair
汽车维修 福特特约维修 水星维修 Auto Repair Ford Franchised Repair Mercury Repair
汽车维修 捷豹特约维修 捷豹维修 Auto Repair JAGUAR Franchised Repair JAGUAR Repair
汽车维修 路虎特约维修 路虎维修 Auto Repair Land Rover Franchised Repair Land Rover Repair
汽车维修 保时捷特约维修 保时捷维修 Auto Repair Porsche Franchised Repair Porsche Repair
汽车维修 东风特约维修 东风维修 Auto Repair DFM Franchised Repair DFM Repair
汽车维修 吉利特约维修 吉利维修 Auto Repair Geely Franchised Repair Geely Repair
汽车维修 吉利特约维修 沃尔沃汽车维修 Auto Repair Geely Franchised Repair Volvo Cars Repair
汽车维修 奇瑞特约维修 奇瑞维修 Auto Repair Chery Franchised Repair Chery Repair
汽车维修 克莱斯勒特约维修 克莱斯勒维修 Auto Repair Chrysler Franchised Repair Chrysler Repair
汽车维修 克莱斯勒特约维修 吉普维修 Auto Repair Chrysler Franchised Repair Jeep Repair
汽车维修 克莱斯勒特约维修 道奇维修 Auto Repair Chrysler Franchised Repair Dodge Repair
汽车维修 荣威维修 荣威维修 Auto Repair ROEWE Repair ROEWE Repair
汽车维修 名爵维修 名爵维修 Auto Repair MG Repair MG Repair
汽车维修 江淮维修 江淮维修 Auto Repair JAC Repair JAC Repair
汽车维修 红旗维修 红旗维修 Auto Repair Hongqi Repair Hongqi Repair
汽车维修 长安汽车维修 长安汽车维修 Auto Repair Chang’an Repair Chang’an Repair
汽车维修 海马汽车维修 海马汽车维修 Auto Repair Haima Repair Haima Repair
汽车维修 北京汽车维修 北京汽车维修 Auto Repair BAIC MOTOR Repair BAIC MOTOR Repair
汽车维修 长城汽车维修 长城汽车维修 Auto Repair Great Wall Repair Great Wall Repair
汽车维修 长城汽车维修 魏派汽车维修 Auto Repair Great Wall Repair WEY Repair
汽车维修 纳智捷维修 纳智捷维修 Auto Repair Luxgen Repair Luxgen Repair
汽车维修 广汽传祺维修 广汽传祺维修 Auto Repair GAC Trumpchi Repair GAC Trumpchi Repair
汽车维修 货车维修 货车维修 Auto Repair Truck Repair Truck Repair
汽车维修 东风货车维修 东风货车维修 Auto Repair Dongfeng Truck Repair Dongfeng Truck Repair
汽车维修 中国重汽维修 中国重汽维修 Auto Repair SINOTRUK Repair SINOTRUK Repair
汽车维修 一汽解放维修 一汽解放维修 Auto Repair FAW Jiefang Repair FAW Jiefang Repair
汽车维修 福田卡车维修 福田卡车维修 Auto Repair Foton Truck Repair Foton Truck Repair
汽车维修 陕西重汽维修 陕西重汽维修 Auto Repair Shaanxi Heavy-duty Truck Repair Shaanxi Heavy-duty Truck Repair
汽车维修 北奔重汽维修 北奔重汽维修 Auto Repair Beiben Trucks Repair Beiben Trucks Repair
汽车维修 江淮货车维修 江淮货车维修 Auto Repair JAC Truck Repair JAC Truck Repair
汽车维修 华菱星马维修 华菱星马维修 Auto Repair CAMC Repair CAMC Repair
汽车维修 成都大运汽车维修 成都大运汽车维修 Auto Repair Chengdu Dayun Automotive Repair Chengdu Dayun Automotive Repair
汽车维修 梅赛德斯-奔驰卡车维修 梅赛德斯-奔驰卡车维修 Auto Repair Mercedes-Benz Truck Repair Mercedes-Benz Truck Repair
汽车维修 德国曼恩维修 德国曼恩维修 Auto Repair MAN Repair MAN Repair
汽车维修 斯堪尼亚维修 斯堪尼亚维修 Auto Repair SCANIA Repair SCANIA Repair
汽车维修 沃尔沃卡车维修 沃尔沃卡车维修 Auto Repair Volvo Truck Repair Volvo Truck Repair
汽车维修 观致维修 观致维修 Auto Repair Qoros Repair Qoros Repair
摩托车服务 摩托车服务相关 摩托车服务相关 Motorcycle Service Motorcycle Service Related Motorcycle Service Related
摩托车服务 摩托车销售 摩托车销售 Motorcycle Service Motorcycle Sales Motorcycle Sales
摩托车服务 摩托车销售 宝马摩托车销售 Motorcycle Service Motorcycle Sales BMW Motorcycle Sales
摩托车服务 摩托车维修 摩托车维修 Motorcycle Service Motorcycle Repair Motorcycle Repair
摩托车服务 摩托车维修 宝马摩托车维修 Motorcycle Service Motorcycle Repair BMW Motorcycle Repair
餐饮服务 餐饮相关场所 餐饮相关 Food & Beverages Food & Beverages Related Food & Beverages Related
餐饮服务 中餐厅 中餐厅 Food & Beverages Chinese Food Restaurant Chinese Food Restaurant
餐饮服务 中餐厅 综合酒楼 Food & Beverages Chinese Food Restaurant Complex Food
餐饮服务 中餐厅 四川菜(川菜) Food & Beverages Chinese Food Restaurant Sichuan Food
餐饮服务 中餐厅 广东菜(粤菜) Food & Beverages Chinese Food Restaurant Cantonese Food
餐饮服务 中餐厅 山东菜(鲁菜) Food & Beverages Chinese Food Restaurant Shandong Food
餐饮服务 中餐厅 江苏菜 Food & Beverages Chinese Food Restaurant Jiangsu Food
餐饮服务 中餐厅 浙江菜 Food & Beverages Chinese Food Restaurant Zhejiang Food
餐饮服务 中餐厅 上海菜 Food & Beverages Chinese Food Restaurant Shanghai Food
餐饮服务 中餐厅 湖南菜(湘菜) Food & Beverages Chinese Food Restaurant Hunan Food
餐饮服务 中餐厅 安徽菜(徽菜) Food & Beverages Chinese Food Restaurant Anhui Food
餐饮服务 中餐厅 福建菜 Food & Beverages Chinese Food Restaurant Fujian Food
餐饮服务 中餐厅 北京菜 Food & Beverages Chinese Food Restaurant Beijing Food
餐饮服务 中餐厅 湖北菜(鄂菜) Food & Beverages Chinese Food Restaurant Hubei Food
餐饮服务 中餐厅 东北菜 Food & Beverages Chinese Food Restaurant Northeastern Chinese Food
餐饮服务 中餐厅 云贵菜 Food & Beverages Chinese Food Restaurant Yunnan & Guizhou Food
餐饮服务 中餐厅 西北菜 Food & Beverages Chinese Food Restaurant Northwestern Chinese Food
餐饮服务 中餐厅 老字号 Food & Beverages Chinese Food Restaurant Traditional Brand
餐饮服务 中餐厅 火锅店 Food & Beverages Chinese Food Restaurant Hotpot Restaurant
餐饮服务 中餐厅 特色/地方风味餐厅 Food & Beverages Chinese Food Restaurant Local Special Food
餐饮服务 中餐厅 海鲜酒楼 Food & Beverages Chinese Food Restaurant Sea Food
餐饮服务 中餐厅 中式素菜馆 Food & Beverages Chinese Food Restaurant Vegetarian Food
餐饮服务 中餐厅 清真菜馆 Food & Beverages Chinese Food Restaurant Islamic Food
餐饮服务 中餐厅 台湾菜 Food & Beverages Chinese Food Restaurant Taiwan Food
餐饮服务 中餐厅 潮州菜 Food & Beverages Chinese Food Restaurant Chaozhou Food
餐饮服务 外国餐厅 外国餐厅 Food & Beverages Foreign Food Restaurant Foreign Food Restaurant
餐饮服务 外国餐厅 西餐厅(综合风味) Food & Beverages Foreign Food Restaurant Western Restaurant
餐饮服务 外国餐厅 日本料理 Food & Beverages Foreign Food Restaurant Japanese Cuisine
餐饮服务 外国餐厅 韩国料理 Food & Beverages Foreign Food Restaurant South Korean Cuisine
餐饮服务 外国餐厅 法式菜品餐厅 Food & Beverages Foreign Food Restaurant French Food
餐饮服务 外国餐厅 意式菜品餐厅 Food & Beverages Foreign Food Restaurant Italian Food
餐饮服务 外国餐厅 泰国/越南菜品餐厅 Food & Beverages Foreign Food Restaurant Thai/Vietnamese Food
餐饮服务 外国餐厅 地中海风格菜品 Food & Beverages Foreign Food Restaurant Mediterranean Food
餐饮服务 外国餐厅 美式风味 Food & Beverages Foreign Food Restaurant American Food
餐饮服务 外国餐厅 印度风味 Food & Beverages Foreign Food Restaurant Indian Food
餐饮服务 外国餐厅 英国式菜品餐厅 Food & Beverages Foreign Food Restaurant British Food
餐饮服务 外国餐厅 牛扒店(扒房) Food & Beverages Foreign Food Restaurant Steak House
餐饮服务 外国餐厅 俄国菜 Food & Beverages Foreign Food Restaurant Russian Food
餐饮服务 外国餐厅 葡国菜 Food & Beverages Foreign Food Restaurant Portuguese Food
餐饮服务 外国餐厅 德国菜 Food & Beverages Foreign Food Restaurant German Food
餐饮服务 外国餐厅 巴西菜 Food & Beverages Foreign Food Restaurant Brazilian Food
餐饮服务 外国餐厅 墨西哥菜 Food & Beverages Foreign Food Restaurant Mexican Food
餐饮服务 外国餐厅 其它亚洲菜 Food & Beverages Foreign Food Restaurant Other Asian Food
餐饮服务 快餐厅 快餐厅 Food & Beverages Fast Food Restaurant Fast Food Restaurant
餐饮服务 快餐厅 肯德基 Food & Beverages Fast Food Restaurant KFC
餐饮服务 快餐厅 麦当劳 Food & Beverages Fast Food Restaurant McDonald’s
餐饮服务 快餐厅 必胜客 Food & Beverages Fast Food Restaurant Pizza Hut
餐饮服务 快餐厅 永和豆浆 Food & Beverages Fast Food Restaurant Yon ho
餐饮服务 快餐厅 茶餐厅 Food & Beverages Fast Food Restaurant Teahouse
餐饮服务 快餐厅 大家乐 Food & Beverages Fast Food Restaurant Cafe de Coral
餐饮服务 快餐厅 大快活 Food & Beverages Fast Food Restaurant Fairwood
餐饮服务 快餐厅 美心 Food & Beverages Fast Food Restaurant Maxim’s
餐饮服务 快餐厅 吉野家 Food & Beverages Fast Food Restaurant Yoshinoya
餐饮服务 快餐厅 仙跡岩 Food & Beverages Fast Food Restaurant Saint’s Alp Teahouse
餐饮服务 快餐厅 呷哺呷哺 Food & Beverages Fast Food Restaurant Xiabu Xiabu
餐饮服务 休闲餐饮场所 休闲餐饮场所 Food & Beverages Leisure Food Restaurant Leisure Food Restaurant
餐饮服务 咖啡厅 咖啡厅 Food & Beverages Coffee House Coffee House
餐饮服务 咖啡厅 星巴克咖啡 Food & Beverages Coffee House Starbucks Coffee
餐饮服务 咖啡厅 上岛咖啡 Food & Beverages Coffee House UBC Coffee
餐饮服务 咖啡厅 Pacific Coffee Company Food & Beverages Coffee House Pacific Coffee Company
餐饮服务 咖啡厅 巴黎咖啡店 Food & Beverages Coffee House Paris Cafe
餐饮服务 茶艺馆 茶艺馆 Food & Beverages Tea House Tea House
餐饮服务 冷饮店 冷饮店 Food & Beverages Icecream Shop Icecream Shop
餐饮服务 糕饼店 糕饼店 Food & Beverages Bakery Bakery
餐饮服务 甜品店 甜品店 Food & Beverages Dessert House Dessert House
购物服务 购物相关场所 购物相关场所 Shopping Shopping Related Places Shopping Related Places
购物服务 商场 商场 Shopping Shopping Plaza Shopping Plaza
购物服务 商场 购物中心 Shopping Shopping Plaza Shopping Centre
购物服务 商场 普通商场 Shopping Shopping Plaza Shops
购物服务 商场 免税品店 Shopping Shopping Plaza Duty-free Shop
购物服务 便民商店/便利店 便民商店/便利店 Shopping Convenience Store Convenience Store
购物服务 便民商店/便利店 7-ELEVEn便利店 Shopping Convenience Store 7-ELEVEn
购物服务 便民商店/便利店 OK便利店 Shopping Convenience Store Circle K
购物服务 家电电子卖场 家电电子卖场 Shopping Home Electronics Hypermarket Home Electronics Hypermarket
购物服务 家电电子卖场 综合家电商场 Shopping Home Electronics Hypermarket Comprehensive Home Electronics Shopping Center
购物服务 家电电子卖场 国美 Shopping Home Electronics Hypermarket GOME
购物服务 家电电子卖场 大中 Shopping Home Electronics Hypermarket Dazhong
购物服务 家电电子卖场 苏宁 Shopping Home Electronics Hypermarket Suning
购物服务 家电电子卖场 手机销售 Shopping Home Electronics Hypermarket Mobile Handsets Sales
购物服务 家电电子卖场 数码电子 Shopping Home Electronics Hypermarket Digital Electronics
购物服务 家电电子卖场 丰泽 Shopping Home Electronics Hypermarket Fortress
购物服务 家电电子卖场 苏宁镭射 Shopping Home Electronics Hypermarket Suning Citicall
购物服务 超级市场 超市 Shopping Supermarket Supermarket
购物服务 超级市场 家乐福 Shopping Supermarket Carrefour
购物服务 超级市场 沃尔玛 Shopping Supermarket Wal-Mart
购物服务 超级市场 华润 Shopping Supermarket CRC
购物服务 超级市场 北京华联 Shopping Supermarket Beijing Hualian
购物服务 超级市场 上海华联 Shopping Supermarket Shanghai Hualian
购物服务 超级市场 麦德龙 Shopping Supermarket METRO
购物服务 超级市场 乐天玛特 Shopping Supermarket LOTTE Mart
购物服务 超级市场 华堂 Shopping Supermarket Ito Yokado
购物服务 超级市场 卜蜂莲花 Shopping Supermarket Lotus
购物服务 超级市场 屈臣氏 Shopping Supermarket Watsons
购物服务 超级市场 惠康超市 Shopping Supermarket Wellcome
购物服务 超级市场 百佳超市 Shopping Supermarket PARKnSHOP
购物服务 超级市场 万宁超市 Shopping Supermarket Mannings
购物服务 花鸟鱼虫市场 花鸟鱼虫市场 Shopping Plants & Pet Market Plants & Pet Market
购物服务 花鸟鱼虫市场 花卉市场 Shopping Plants & Pet Market Flower Shop
购物服务 花鸟鱼虫市场 宠物市场 Shopping Plants & Pet Market Pet Market
购物服务 家居建材市场 家居建材市场 Shopping Home Building Materials Market Home Building Materials Market
购物服务 家居建材市场 家具建材综合市场 Shopping Home Building Materials Market Home Building Materials Market
购物服务 家居建材市场 家具城 Shopping Home Building Materials Market Furniture Store
购物服务 家居建材市场 建材五金市场 Shopping Home Building Materials Market Hardware Store
购物服务 家居建材市场 厨卫市场 Shopping Home Building Materials Market Kitchen Supply
购物服务 家居建材市场 布艺市场 Shopping Home Building Materials Market Deco Cloth Store
购物服务 家居建材市场 灯具瓷器市场 Shopping Home Building Materials Market Lighting & Porcelain Market
购物服务 综合市场 综合市场 Shopping Comprehensive Market Comprehensive Market
购物服务 综合市场 小商品市场 Shopping Comprehensive Market Small Commodity Market
购物服务 综合市场 旧货市场 Shopping Comprehensive Market Flea Market
购物服务 综合市场 农副产品市场 Shopping Comprehensive Market Agricultural Products Market
购物服务 综合市场 果品市场 Shopping Comprehensive Market Fruits Market
购物服务 综合市场 蔬菜市场 Shopping Comprehensive Market Vegetable Market
购物服务 综合市场 水产海鲜市场 Shopping Comprehensive Market Seafood Market
购物服务 文化用品店 文化用品店 Shopping Stationary Store Stationary Store
购物服务 体育用品店 体育用品店 Shopping Sports Store Sports Store
购物服务 体育用品店 李宁专卖店 Shopping Sports Store Li-Ning
购物服务 体育用品店 耐克专卖店 Shopping Sports Store NIKE
购物服务 体育用品店 阿迪达斯专卖店 Shopping Sports Store adidas
购物服务 体育用品店 锐步专卖店 Shopping Sports Store Reebok
购物服务 体育用品店 彪马专卖店 Shopping Sports Store PUMA
购物服务 体育用品店 高尔夫用品店 Shopping Sports Store Golf Accessories Shop
购物服务 体育用品店 户外用品 Shopping Sports Store Outdoor Sports Shop
购物服务 特色商业街 特色商业街 Shopping Commercial Street Commercial Street
购物服务 特色商业街 步行街 Shopping Commercial Street Pedestrian Street
购物服务 服装鞋帽皮具店 服装鞋帽皮具店 Shopping Clothing Store Clothing Store
购物服务 服装鞋帽皮具店 品牌服装店 Shopping Clothing Store Brand Clothing Store
购物服务 服装鞋帽皮具店 品牌鞋店 Shopping Clothing Store Brand Shoes Store
购物服务 服装鞋帽皮具店 品牌皮具店 Shopping Clothing Store Brand Leather Ware Store
购物服务 服装鞋帽皮具店 品牌箱包店 Shopping Clothing Store Brand Bags and Suitcases Store
购物服务 专卖店 专营店 Shopping Franchise Store Franchise Store
购物服务 专卖店 古玩字画店 Shopping Franchise Store Antique Shop
购物服务 专卖店 珠宝首饰工艺品 Shopping Franchise Store Jewelry Store
购物服务 专卖店 钟表店 Shopping Franchise Store Watches Shop
购物服务 专卖店 眼镜店 Shopping Franchise Store Optical Shop
购物服务 专卖店 书店 Shopping Franchise Store Bookstore
购物服务 专卖店 音像店 Shopping Franchise Store CD/DVD Shop
购物服务 专卖店 儿童用品店 Shopping Franchise Store Children’s Store
购物服务 专卖店 自行车专卖店 Shopping Franchise Store Bike Shop
购物服务 专卖店 礼品饰品店 Shopping Franchise Store Gift Store
购物服务 专卖店 烟酒专卖店 Shopping Franchise Store Tobacco & Wine Franchise Store
购物服务 专卖店 宠物用品店 Shopping Franchise Store Pet’s Store
购物服务 专卖店 摄影器材店 Shopping Franchise Store Camera Shop
购物服务 专卖店 宝马生活方式 Shopping Franchise Store BMW Lifestyle
购物服务 专卖店 土特产专卖店 Shopping Franchise Store Local Products Franchise Store
购物服务 特殊买卖场所 特殊买卖场所 Shopping Special Trade House Special Trade House
购物服务 特殊买卖场所 拍卖行 Shopping Special Trade House Auction House
购物服务 特殊买卖场所 典当行 Shopping Special Trade House Pawn House
购物服务 个人用品/化妆品店 其它个人用品店 Shopping Personal Care Items Shop Personal Care Items Shop
购物服务 个人用品/化妆品店 莎莎 Shopping Personal Care Items Shop Sasa
生活服务 生活服务场所 生活服务场所 Daily Life Service Daily Life Service Place Daily Life Service Place
生活服务 旅行社 旅行社 Daily Life Service Travel Agency Travel Agency
生活服务 信息咨询中心 信息咨询中心 Daily Life Service Information Centre Information Centre
生活服务 信息咨询中心 服务中心 Daily Life Service Information Centre Service Centre
生活服务 信息咨询中心 旅馆问讯 Daily Life Service Information Centre Enquire of Hotel
生活服务 信息咨询中心 行李查询/行李问询 Daily Life Service Information Centre Enquire of Baggage
生活服务 售票处 售票处 Daily Life Service Ticket Office Ticket Office
生活服务 售票处 飞机票代售点 Daily Life Service Ticket Office Airline Tickets Office
生活服务 售票处 火车票代售点 Daily Life Service Ticket Office Train Ticket Office
生活服务 售票处 长途汽车票代售点 Daily Life Service Ticket Office Coach Ticket Office
生活服务 售票处 船票代售点 Daily Life Service Ticket Office Ferry Ticket Office
生活服务 售票处 公交卡/月票代售点 Daily Life Service Ticket Office Bus IC Card
生活服务 售票处 公园景点售票处 Daily Life Service Ticket Office Park Box Office
生活服务 邮局 邮局 Daily Life Service Post Office Post Office
生活服务 邮局 邮政速递 Daily Life Service Post Office Express Post
生活服务 物流速递 物流速递 Daily Life Service Logistics Service Logistics Service
生活服务 物流速递 物流仓储场地 Daily Life Service Logistics Service Logistics Warehouse Space
生活服务 电讯营业厅 电讯营业厅 Daily Life Service Telecom Office Telecom Office
生活服务 电讯营业厅 中国电信营业厅 Daily Life Service Telecom Office China Telecom Office
生活服务 电讯营业厅 中国移动营业厅 Daily Life Service Telecom Office China Mobile Office
生活服务 电讯营业厅 中国联通营业厅 Daily Life Service Telecom Office China Unicom Office
生活服务 电讯营业厅 中国铁通营业厅 Daily Life Service Telecom Office China Tietong Office
生活服务 电讯营业厅 中国卫通营业厅 Daily Life Service Telecom Office China Satcom Office
生活服务 电讯营业厅 和记电讯 Daily Life Service Telecom Office Hutchison Telecommunications
生活服务 电讯营业厅 数码通电讯 Daily Life Service Telecom Office SmarTone
生活服务 电讯营业厅 电讯盈科 Daily Life Service Telecom Office PCCW
生活服务 电讯营业厅 中国移动香港 Daily Life Service Telecom Office China Mobile Hong Kong
生活服务 事务所 事务所 Daily Life Service Professional Service Firm Professional Service Firm
生活服务 事务所 律师事务所 Daily Life Service Professional Service Firm Law Firm
生活服务 事务所 会计师事务所 Daily Life Service Professional Service Firm Accounting Firm
生活服务 事务所 评估事务所 Daily Life Service Professional Service Firm Evaluation Firm
生活服务 事务所 审计事务所 Daily Life Service Professional Service Firm Audit Firm
生活服务 事务所 认证事务所 Daily Life Service Professional Service Firm Authentication Services
生活服务 事务所 专利事务所 Daily Life Service Professional Service Firm Patent Office
生活服务 人才市场 人才市场 Daily Life Service Job Center Job Center
生活服务 自来水营业厅 自来水营业厅 Daily Life Service Water Supply Service Office Water Supply Service Office
生活服务 电力营业厅 电力营业厅 Daily Life Service Electric Supply Service Office Electric Supply Service Office
生活服务 美容美发店 美容美发店 Daily Life Service Beauty and Hairdressing Store Beauty and Hairdressing Store
生活服务 维修站点 维修站点 Daily Life Service Repair Store Repair Store
生活服务 摄影冲印店 摄影冲印 Daily Life Service Photo Finishing Photo Finishing
生活服务 洗浴推拿场所 洗浴推拿场所 Daily Life Service Bath & Massage Center Bath & Massage Center
生活服务 洗衣店 洗衣店 Daily Life Service Laundry Laundry
生活服务 中介机构 中介机构 Daily Life Service Agency Agency
生活服务 搬家公司 搬家公司 Daily Life Service Move Service Move Service
生活服务 彩票彩券销售点 彩票彩券销售点 Daily Life Service Lottery Store Lottery Store
生活服务 彩票彩券销售点 马会投注站 Daily Life Service Lottery Store Horse-Betting Center
生活服务 丧葬设施 丧葬设施 Daily Life Service Funeral Facilities Funeral Facilities
生活服务 丧葬设施 陵园 Daily Life Service Funeral Facilities Cemetery
生活服务 丧葬设施 公墓 Daily Life Service Funeral Facilities Cemetery
生活服务 丧葬设施 殡仪馆 Daily Life Service Funeral Facilities Funeral House
生活服务 婴儿服务场所 婴儿服务场所 Daily Life Service Baby Service Place Baby Service Place
生活服务 婴儿服务场所 婴儿游泳馆 Daily Life Service Baby Service Place Baby Natatorium
体育休闲服务 体育休闲服务场所 体育休闲服务场所 Sports & Recreation Sports & Recreation Places Sports & Recreation Places
体育休闲服务 运动场馆 运动场所 Sports & Recreation Sports Stadium Sports Places
体育休闲服务 运动场馆 综合体育馆 Sports & Recreation Sports Stadium Sports Centre
体育休闲服务 运动场馆 保龄球馆 Sports & Recreation Sports Stadium Bowling Hall
体育休闲服务 运动场馆 网球场 Sports & Recreation Sports Stadium Tennis Court
体育休闲服务 运动场馆 篮球场馆 Sports & Recreation Sports Stadium Basketball Stadium
体育休闲服务 运动场馆 足球场 Sports & Recreation Sports Stadium Football Field
体育休闲服务 运动场馆 滑雪场 Sports & Recreation Sports Stadium Ski Field
体育休闲服务 运动场馆 溜冰场 Sports & Recreation Sports Stadium Skating Rink
体育休闲服务 运动场馆 户外健身场所 Sports & Recreation Sports Stadium Outdoor Gym Facility
体育休闲服务 运动场馆 海滨浴场 Sports & Recreation Sports Stadium Public Beach
体育休闲服务 运动场馆 游泳馆 Sports & Recreation Sports Stadium Natatorium
体育休闲服务 运动场馆 健身中心 Sports & Recreation Sports Stadium Gym Center
体育休闲服务 运动场馆 乒乓球馆 Sports & Recreation Sports Stadium Table Tennis Hall
体育休闲服务 运动场馆 台球厅 Sports & Recreation Sports Stadium Pool Room
体育休闲服务 运动场馆 壁球场 Sports & Recreation Sports Stadium Squash Court
体育休闲服务 运动场馆 马术俱乐部 Sports & Recreation Sports Stadium Horse Riding Club
体育休闲服务 运动场馆 赛马场 Sports & Recreation Sports Stadium Race Track
体育休闲服务 运动场馆 橄榄球场 Sports & Recreation Sports Stadium Rugby Court
体育休闲服务 运动场馆 羽毛球场 Sports & Recreation Sports Stadium Badminton Court
体育休闲服务 运动场馆 跆拳道场馆 Sports & Recreation Sports Stadium Taekwondo Venue
体育休闲服务 高尔夫相关 高尔夫相关 Sports & Recreation Golf Related Golf Related
体育休闲服务 高尔夫相关 高尔夫球场 Sports & Recreation Golf Related Golf Course
体育休闲服务 高尔夫相关 高尔夫练习场 Sports & Recreation Golf Related Golf Training Course
体育休闲服务 娱乐场所 娱乐场所 Sports & Recreation Recreation Center Recreation Center
体育休闲服务 娱乐场所 夜总会 Sports & Recreation Recreation Center Night Club
体育休闲服务 娱乐场所 KTV Sports & Recreation Recreation Center KTV
体育休闲服务 娱乐场所 迪厅 Sports & Recreation Recreation Center Disco
体育休闲服务 娱乐场所 酒吧 Sports & Recreation Recreation Center Pub
体育休闲服务 娱乐场所 游戏厅 Sports & Recreation Recreation Center Game Center
体育休闲服务 娱乐场所 棋牌室 Sports & Recreation Recreation Center Card & Chess Room
体育休闲服务 娱乐场所 博彩中心 Sports & Recreation Recreation Center Lottery Center
体育休闲服务 娱乐场所 网吧 Sports & Recreation Recreation Center Internet Bar
体育休闲服务 度假疗养场所 度假疗养场所 Sports & Recreation Holiday & Nursing Resort Holiday & Nursing Resort
体育休闲服务 度假疗养场所 度假村 Sports & Recreation Holiday & Nursing Resort Resort
体育休闲服务 度假疗养场所 疗养院 Sports & Recreation Holiday & Nursing Resort Nursing Home
体育休闲服务 休闲场所 休闲场所 Sports & Recreation Recreation Place Recreation Place
体育休闲服务 休闲场所 游乐场 Sports & Recreation Recreation Place Amusement Park
体育休闲服务 休闲场所 垂钓园 Sports & Recreation Recreation Place Fishing Spot
体育休闲服务 休闲场所 采摘园 Sports & Recreation Recreation Place Plucking Park
体育休闲服务 休闲场所 露营地 Sports & Recreation Recreation Place Camping Site
体育休闲服务 休闲场所 水上活动中心 Sports & Recreation Recreation Place Water Sports Centre
体育休闲服务 影剧院 影剧院相关 Sports & Recreation Theatre & Cinema Theatre & Cinema Related
体育休闲服务 影剧院 电影院 Sports & Recreation Theatre & Cinema Cinema
体育休闲服务 影剧院 音乐厅 Sports & Recreation Theatre & Cinema Concert Hall
体育休闲服务 影剧院 剧场 Sports & Recreation Theatre & Cinema Theatre
医疗保健服务 医疗保健服务场所 医疗保健服务场所 Medical Service Medical and Health Care Service Place Medical and Health Care Service Place
医疗保健服务 综合医院 综合医院 Medical Service Hospital Hospital
医疗保健服务 综合医院 三级甲等医院 Medical Service Hospital AAA Class Hospital
医疗保健服务 综合医院 卫生院 Medical Service Hospital Health Center
医疗保健服务 专科医院 专科医院 Medical Service Special Hospital Special Hospital
医疗保健服务 专科医院 整形美容 Medical Service Special Hospital Plastic Surgery
医疗保健服务 专科医院 口腔医院 Medical Service Special Hospital Stomatological Hospital
医疗保健服务 专科医院 眼科医院 Medical Service Special Hospital Ophthalmology Hospital
医疗保健服务 专科医院 耳鼻喉医院 Medical Service Special Hospital ENT Hospital
医疗保健服务 专科医院 胸科医院 Medical Service Special Hospital Chest Hospital
医疗保健服务 专科医院 骨科医院 Medical Service Special Hospital Orthopedic Hospital
医疗保健服务 专科医院 肿瘤医院 Medical Service Special Hospital Tumor Hospital
医疗保健服务 专科医院 脑科医院 Medical Service Special Hospital Brain Hospital
医疗保健服务 专科医院 妇科医院 Medical Service Special Hospital Maternity Hospital
医疗保健服务 专科医院 精神病医院 Medical Service Special Hospital Psychiatric Hospital
医疗保健服务 专科医院 传染病医院 Medical Service Special Hospital Infectious Disease Hospital
医疗保健服务 诊所 诊所 Medical Service Clinic Clinic
医疗保健服务 急救中心 急救中心 Medical Service Emergency Center Emergency Center
医疗保健服务 疾病预防机构 疾病预防 Medical Service Disease Prevention Institution Disease Prevention
医疗保健服务 医药保健销售店 医药保健相关 Medical Service Pharmacy Medicine Health Care Related
医疗保健服务 医药保健销售店 药房 Medical Service Pharmacy Pharmacy
医疗保健服务 医药保健销售店 医疗保健用品 Medical Service Pharmacy Medical Supplies
医疗保健服务 动物医疗场所 动物医疗场所 Medical Service Veterinary Hospital Veterinary Hospital
医疗保健服务 动物医疗场所 宠物诊所 Medical Service Veterinary Hospital Pet Clinic
医疗保健服务 动物医疗场所 兽医站 Medical Service Veterinary Hospital Veterinary Station
住宿服务 住宿服务相关 住宿服务相关 Accommodation Service Accommodation Service Related Accommodation Service Related
住宿服务 宾馆酒店 宾馆酒店 Accommodation Service Hotel Hotel
住宿服务 宾馆酒店 奢华酒店 Accommodation Service Hotel Luxury Hotel
住宿服务 宾馆酒店 五星级宾馆 Accommodation Service Hotel Five-star Hotel
住宿服务 宾馆酒店 四星级宾馆 Accommodation Service Hotel Four-star Hotel
住宿服务 宾馆酒店 三星级宾馆 Accommodation Service Hotel Three-star Hotel
住宿服务 宾馆酒店 经济型连锁酒店 Accommodation Service Hotel Economical Chain Hotel
住宿服务 旅馆招待所 旅馆招待所 Accommodation Service Hostel Hostel
住宿服务 旅馆招待所 青年旅舍 Accommodation Service Hostel Youth Hostel
风景名胜 风景名胜相关 旅游景点 Tourist Attraction Tourist Attraction Related Tourist Attraction
风景名胜 公园广场 公园广场 Tourist Attraction Park & Square Park & Square
风景名胜 公园广场 公园 Tourist Attraction Park & Square Park
风景名胜 公园广场 动物园 Tourist Attraction Park & Square Zoo
风景名胜 公园广场 植物园 Tourist Attraction Park & Square Botanical Garden
风景名胜 公园广场 水族馆 Tourist Attraction Park & Square Aquarium
风景名胜 公园广场 城市广场 Tourist Attraction Park & Square City Plaza
风景名胜 公园广场 公园内部设施 Tourist Attraction Park & Plaza Facilities within the park
风景名胜 风景名胜 风景名胜 Tourist Attraction Scenery Spot Scenery Spot
风景名胜 风景名胜 世界遗产 Tourist Attraction Scenery Spot World Heritage
风景名胜 风景名胜 国家级景点 Tourist Attraction Scenery Spot National View Spot
风景名胜 风景名胜 省级景点 Tourist Attraction Scenery Spot Provincial View Spot
风景名胜 风景名胜 纪念馆 Tourist Attraction Scenery Spot Memorial Hall
风景名胜 风景名胜 寺庙道观 Tourist Attraction Scenery Spot Buddhist & Taoist Temple
风景名胜 风景名胜 教堂 Tourist Attraction Scenery Spot Church
风景名胜 风景名胜 回教寺 Tourist Attraction Scenery Spot Mosque
风景名胜 风景名胜 海滩 Tourist Attraction Scenery Spot Beach
风景名胜 风景名胜 观景点 Tourist Attraction Scenery Spot View Point
商务住宅 商务住宅相关 商务住宅相关 Commercial House Commercial House Related Commercial House Related
商务住宅 产业园区 产业园区 Commercial House Industrial Park Industrial Park
商务住宅 楼宇 楼宇相关 Commercial House Building Building Related
商务住宅 楼宇 商务写字楼 Commercial House Building Business Office Building
商务住宅 楼宇 工业大厦建筑物 Commercial House Building Industrial Building
商务住宅 楼宇 商住两用楼宇 Commercial House Building Commercial-residential Building
商务住宅 住宅区 住宅区 Commercial House Residential Area Residential Area
商务住宅 住宅区 别墅 Commercial House Residential Area Villa
商务住宅 住宅区 住宅小区 Commercial House Residential Area Residential Quarter
商务住宅 住宅区 宿舍 Commercial House Residential Area Dormitory
商务住宅 住宅区 社区中心 Commercial House Residential Area Community Center
政府机构及社会团体 政府及社会团体相关 政府及社会团体相关 Governmental Organization & Social Group Governmental & Social Groups Related Governmental & Social Groups Related
政府机构及社会团体 政府机关 政府机关相关 Governmental Organization & Social Group Governmental Organization Governmental Organization Related
政府机构及社会团体 政府机关 国家级机关及事业单位 Governmental Organization & Social Group Governmental Organization State Level Organization & Institution
政府机构及社会团体 政府机关 省直辖市级政府及事业单位 Governmental Organization & Social Group Governmental Organization Provincial Level Government and Institution
政府机构及社会团体 政府机关 地市级政府及事业单位 Governmental Organization & Social Group Governmental Organization Prefecture Level Government and Institution
政府机构及社会团体 政府机关 区县级政府及事业单位 Governmental Organization & Social Group Governmental Organization District & County Level Government and Institution
政府机构及社会团体 政府机关 乡镇级政府及事业单位 Governmental Organization & Social Group Governmental Organization Town Level Government and Institution
政府机构及社会团体 政府机关 乡镇以下级政府及事业单位 Governmental Organization & Social Group Governmental Organization Below Town level Government and Institution
政府机构及社会团体 政府机关 外地政府办 Governmental Organization & Social Group Governmental Organization Non-local Government Representative Office
政府机构及社会团体 外国机构 外国机构相关 Governmental Organization & Social Group Foreign Organization Foreign Organization Related
政府机构及社会团体 外国机构 外国使领馆 Governmental Organization & Social Group Foreign Organization Foreign Embassy and Consulate
政府机构及社会团体 外国机构 国际组织办事处 Governmental Organization & Social Group Foreign Organization Representative Office of International Organization
政府机构及社会团体 民主党派 民主党派 Governmental Organization & Social Group Democratic Party Democratic Party
政府机构及社会团体 社会团体 社会团体相关 Governmental Organization & Social Group Social Group Social Group Related
政府机构及社会团体 社会团体 共青团 Governmental Organization & Social Group Social Group Communist Youth League
政府机构及社会团体 社会团体 少先队 Governmental Organization & Social Group Social Group Young Pioneer
政府机构及社会团体 社会团体 妇联 Governmental Organization & Social Group Social Group Women’s Federation
政府机构及社会团体 社会团体 残联 Governmental Organization & Social Group Social Group Disabled Persons’ Federation
政府机构及社会团体 社会团体 红十字会 Governmental Organization & Social Group Social Group Red Cross
政府机构及社会团体 社会团体 消费者协会 Governmental Organization & Social Group Social Group Consumers’ Association
政府机构及社会团体 社会团体 行业协会 Governmental Organization & Social Group Social Group Industry Association
政府机构及社会团体 社会团体 慈善机构 Governmental Organization & Social Group Social Group Charity Organizations
政府机构及社会团体 社会团体 教会 Governmental Organization & Social Group Social Group Church
政府机构及社会团体 公检法机构 公检法机关 Governmental Organization & Social Group Public Security Organization Public Security Organization
政府机构及社会团体 公检法机构 公安警察 Governmental Organization & Social Group Public Security Organization Police Station
政府机构及社会团体 公检法机构 检察院 Governmental Organization & Social Group Public Security Organization Procuratorate
政府机构及社会团体 公检法机构 法院 Governmental Organization & Social Group Public Security Organization Court
政府机构及社会团体 公检法机构 消防机关 Governmental Organization & Social Group Public Security Organization Fire Fighting Organization
政府机构及社会团体 公检法机构 公证鉴定机构 Governmental Organization & Social Group Public Security Organization Notarial Survey Organization
政府机构及社会团体 公检法机构 社会治安机构 Governmental Organization & Social Group Public Security Organization Social Security Organization
政府机构及社会团体 交通车辆管理 交通车辆管理相关 Governmental Organization & Social Group Traffic Vehicle Management Traffic Vehicle Management Related
政府机构及社会团体 交通车辆管理 交通管理机构 Governmental Organization & Social Group Traffic Vehicle Management Traffic Management Authority
政府机构及社会团体 交通车辆管理 车辆管理机构 Governmental Organization & Social Group Traffic Vehicle Management Vehicle Management Authority
政府机构及社会团体 交通车辆管理 验车场 Governmental Organization & Social Group Traffic Vehicle Management Vehicle Assessment Service
政府机构及社会团体 交通车辆管理 交通执法站 Governmental Organization & Social Group Traffic Vehicle Management Traffic Management Station
政府机构及社会团体 交通车辆管理 车辆通行证办理处 Governmental Organization & Social Group Traffic Vehicle Management Vehicle Pass Card Office
政府机构及社会团体 交通车辆管理 货车相关检查站 Governmental Organization & Social Group Traffic Vehicle Management Truck Related Checkpoints
政府机构及社会团体 工商税务机构 工商税务机构 Governmental Organization & Social Group Industrial and Commercial Taxation Institution Industrial and Commercial Taxation Institution
政府机构及社会团体 工商税务机构 工商部门 Governmental Organization & Social Group Industrial and Commercial Taxation Institution Administration for Industry & Commerce
政府机构及社会团体 工商税务机构 国税机关 Governmental Organization & Social Group Industrial and Commercial Taxation Institution State Tax Authority
政府机构及社会团体 工商税务机构 地税机关 Governmental Organization & Social Group Industrial and Commercial Taxation Institution Local Tax Authority
科教文化服务 科教文化场所 科教文化场所 Science/Culture & Education Service Science & Education Cultural Place Science & Education Cultural Place
科教文化服务 博物馆 博物馆 Science/Culture & Education Service Museum Museum
科教文化服务 博物馆 奥迪博物馆 Science/Culture & Education Service Museum Audi Museum
科教文化服务 博物馆 梅赛德斯-奔驰博物馆 Science/Culture & Education Service Museum Mercedes-Benz Museum
科教文化服务 展览馆 展览馆 Science/Culture & Education Service Exhibition Hall Exhibition Hall
科教文化服务 展览馆 室内展位 Science/Culture & Education Service Exhibition Hall Indoor Booth
科教文化服务 会展中心 会展中心 Science/Culture & Education Service Convention & Exhibition Center Convention & Exhibition Center
科教文化服务 美术馆 美术馆 Science/Culture & Education Service Art Gallery Art Gallery
科教文化服务 图书馆 图书馆 Science/Culture & Education Service Library Library
科教文化服务 科技馆 科技馆 Science/Culture & Education Service Science & Technology Museum Science & Technology Museum
科教文化服务 天文馆 天文馆 Science/Culture & Education Service Planetarium Planetarium
科教文化服务 文化宫 文化宫 Science/Culture & Education Service Cultural Palace Cultural Palace
科教文化服务 档案馆 档案馆 Science/Culture & Education Service Archives Hall Archives Hall
科教文化服务 文艺团体 文艺团体 Science/Culture & Education Service Arts Organization Arts Organization
科教文化服务 传媒机构 传媒机构 Science/Culture & Education Service Media Organization Media Organization
科教文化服务 传媒机构 电视台 Science/Culture & Education Service Media Organization TV Station
科教文化服务 传媒机构 电台 Science/Culture & Education Service Media Organization Radio Station
科教文化服务 传媒机构 报社 Science/Culture & Education Service Media Organization Newspaper Office
科教文化服务 传媒机构 杂志社 Science/Culture & Education Service Media Organization Journal Publisher
科教文化服务 传媒机构 出版社 Science/Culture & Education Service Media Organization Publishing House
科教文化服务 学校 学校 Science/Culture & Education Service School School
科教文化服务 学校 高等院校 Science/Culture & Education Service School University & College
科教文化服务 学校 中学 Science/Culture & Education Service School Middle School
科教文化服务 学校 小学 Science/Culture & Education Service School Elementary School
科教文化服务 学校 幼儿园 Science/Culture & Education Service School Kindergarten
科教文化服务 学校 成人教育 Science/Culture & Education Service School Adult Education
科教文化服务 学校 职业技术学校 Science/Culture & Education Service School Vocational Technical School
科教文化服务 学校 学校内部设施 Culture & Education School Facilities within the School
科教文化服务 科研机构 科研机构 Science/Culture & Education Service Research Institution Research Institution
科教文化服务 培训机构 培训机构 Science/Culture & Education Service Training Institution Training Institution
科教文化服务 驾校 驾校 Science/Culture & Education Service Driving School Driving School
交通设施服务 交通服务相关 交通服务相关 Transportation Service Transportation Service Related Transportation Service Related
交通设施服务 机场相关 机场相关 Transportation Service Airport Related Airport Related
交通设施服务 机场相关 候机室 Transportation Service Airport Related Departure Lounge
交通设施服务 机场相关 摆渡车站 Transportation Service Airport Related The Ferry Station
交通设施服务 机场相关 飞机场 Transportation Service Airport Related Airport
交通设施服务 机场相关 机场出发/到达 Transportation Service Airport Related Airport Departure/Arrival
交通设施服务 机场相关 直升机场 Transportation Service Airport Related Heliport
交通设施服务 机场相关 机场货运处 Transportation Service Airport Related Airport Freight Station
交通设施服务 火车站 火车站 Transportation Service Railway Station Railway Station
交通设施服务 火车站 候车室 Transportation Service Railway Station Waiting Room
交通设施服务 火车站 进站口/检票口 Transportation Service Railway Station Ticket Entrance
交通设施服务 火车站 出站口 Transportation Service Railway Station Exit
交通设施服务 火车站 站台 Transportation Service Railway Station Platform
交通设施服务 火车站 售票 Transportation Service Railway Station Sell Ticket
交通设施服务 火车站 退票 Transportation Service Railway Station Get a Refund for a Ticket
交通设施服务 火车站 改签 Transportation Service Railway Station Endorse the Ticket
交通设施服务 火车站 公安制证 Transportation Service Railway Station Public Security Accreditation
交通设施服务 火车站 票务相关 Transportation Service Railway Station Ticket Business Correlation
交通设施服务 火车站 货运火车站 Transportation Service Railway Station Freight Railway Station
交通设施服务 港口码头 港口码头 Transportation Service Port & Marina Port & Marina
交通设施服务 港口码头 客运港 Transportation Service Port & Marina Passenger Port
交通设施服务 港口码头 车渡口 Transportation Service Port & Marina Ferry Terminal for Vehicle
交通设施服务 港口码头 人渡口 Transportation Service Port & Marina Ferry Terminal
交通设施服务 港口码头 货运港口码头 Transportation Service Port & Marina Freight Ports
交通设施服务 长途汽车站 长途汽车站 Transportation Service Coach Station Coach Station
交通设施服务 地铁站 地铁站 Transportation Service Subway Station Subway Station
交通设施服务 地铁站 出入口 Transportation Service Subway Station Exit
交通设施服务 轻轨站 轻轨站 Transportation Service Light Rail Station Light Rail Station
交通设施服务 公交车站 公交车站相关 Transportation Service Bus Station Bus Station Related
交通设施服务 公交车站 旅游专线车站 Transportation Service Bus Station Tourist Routes Bus Station
交通设施服务 公交车站 普通公交站 Transportation Service Bus Station Common Bus Station
交通设施服务 公交车站 机场巴士 Transportation Service Bus Station Airport Bus
交通设施服务 班车站 班车站 Transportation Service Commuter Bus Station Commuter Bus Station
交通设施服务 停车场 停车场相关 Transportation Service Parking Lot Parking Lot Related
交通设施服务 停车场 换乘停车场 Transportation Service Parking Lot Park-and-Ride Place
交通设施服务 停车场 公共停车场 Transportation Service Parking Lot Public Parking Lot
交通设施服务 停车场 专用停车场 Transportation Service Parking Lot Reserved Parking Lot
交通设施服务 停车场 路边停车场 Transportation Service Parking Lot Roadside Parking Lot
交通设施服务 停车场 停车场入口 Transportation Service Parking Lot Parking Lot Entrance
交通设施服务 停车场 停车场出口 Transportation Service Parking Lot Parking Lot Exit
交通设施服务 停车场 停车场出入口 Transportation Service Parking Lot Parking Lot Entrance & Exit
交通设施服务 过境口岸 过境口岸 Transportation Service Border Crossing Border Crossing
交通设施服务 出租车 出租车 Transportation Service Taxi Taxi
交通设施服务 轮渡站 轮渡站 Transportation Service Ferry Station Ferry Station
交通设施服务 索道站 索道站 Transportation Service Ropeway Station Ropeway Station
金融保险服务 金融保险服务机构 金融保险机构 Finance & Insurance Service Finance & Insurance Service Institution Finance & Insurance Institution
金融保险服务 银行 银行 Finance & Insurance Service Bank Bank
金融保险服务 银行 中国人民银行 Finance & Insurance Service Bank The People’s Bank of China
金融保险服务 银行 国家开发银行 Finance & Insurance Service Bank China Development Bank
金融保险服务 银行 中国进出口银行 Finance & Insurance Service Bank The Export-Import Bank of China
金融保险服务 银行 中国银行 Finance & Insurance Service Bank Bank of China
金融保险服务 银行 中国工商银行 Finance & Insurance Service Bank ICBC
金融保险服务 银行 中国建设银行 Finance & Insurance Service Bank China Construction Bank
金融保险服务 银行 中国农业银行 Finance & Insurance Service Bank Agricultural Bank of China
金融保险服务 银行 交通银行 Finance & Insurance Service Bank Bank of Communications
金融保险服务 银行 招商银行 Finance & Insurance Service Bank China Merchants Bank
金融保险服务 银行 华夏银行 Finance & Insurance Service Bank Huaxia Bank
金融保险服务 银行 中信银行 Finance & Insurance Service Bank China CITIC Bank
金融保险服务 银行 中国民生银行 Finance & Insurance Service Bank China Minsheng Bank
金融保险服务 银行 中国光大银行 Finance & Insurance Service Bank China Everbright Bank
金融保险服务 银行 上海银行 Finance & Insurance Service Bank Bank of Shanghai
金融保险服务 银行 上海浦东发展银行 Finance & Insurance Service Bank Shanghai Pudong Development Bank
金融保险服务 银行 平安银行 Finance & Insurance Service Bank Ping An Bank
金融保险服务 银行 兴业银行 Finance & Insurance Service Bank Industrial Bank
金融保险服务 银行 北京银行 Finance & Insurance Service Bank Bank of Beijing
金融保险服务 银行 广发银行 Finance & Insurance Service Bank CGB
金融保险服务 银行 农村商业银行 Finance & Insurance Service Bank Rural Commercial Bank
金融保险服务 银行 香港恒生银行 Finance & Insurance Service Bank Hong Kong Hang Seng Bank
金融保险服务 银行 东亚银行 Finance & Insurance Service Bank Bank of East Asia
金融保险服务 银行 花旗银行 Finance & Insurance Service Bank Citibank
金融保险服务 银行 渣打银行 Finance & Insurance Service Bank Standard Chartered Bank
金融保险服务 银行 汇丰银行 Finance & Insurance Service Bank HSBC
金融保险服务 银行 荷兰银行 Finance & Insurance Service Bank ABN AMRO Bank
金融保险服务 银行 美国运通银行 Finance & Insurance Service Bank American Express Bank
金融保险服务 银行 瑞士友邦银行 Finance & Insurance Service Bank AIG Private Bank
金融保险服务 银行 美国银行 Finance & Insurance Service Bank Bank of America
金融保险服务 银行 蒙特利尔银行 Finance & Insurance Service Bank Bank of Montreal
金融保险服务 银行 纽约银行 Finance & Insurance Service Bank Bank of New York
金融保险服务 银行 苏格兰皇家银行 Finance & Insurance Service Bank The Royal Bank of Scotland
金融保险服务 银行 法国兴业银行 Finance & Insurance Service Bank Societe Generale Bank
金融保险服务 银行 德意志银行 Finance & Insurance Service Bank Deutsche Bank
金融保险服务 银行 日本三菱东京日联银行 Finance & Insurance Service Bank Bank of Tokyo-Mitsubishi UFJ
金融保险服务 银行 巴克莱银行 Finance & Insurance Service Bank Barclays Bank
金融保险服务 银行 摩根大通银行 Finance & Insurance Service Bank JPMorgan Chase Bank
金融保险服务 银行 中国邮政储蓄银行 Finance & Insurance Service Bank Postal Savings Bank of China
金融保险服务 银行 香港星展银行 Finance & Insurance Service Bank DBS
金融保险服务 银行 南洋商业银行 Finance & Insurance Service Bank Nanyang Commercial Bank
金融保险服务 银行 上海商业银行 Finance & Insurance Service Bank Shanghai Commercial Bank
金融保险服务 银行 永亨银行 Finance & Insurance Service Bank Wing Hang Bank
金融保险服务 银行 香港永隆银行 Finance & Insurance Service Bank Wing Lung Bank
金融保险服务 银行 创兴银行 Finance & Insurance Service Bank Chong Hing Bank
金融保险服务 银行 大新银行 Finance & Insurance Service Bank Dah Sing Bank
金融保险服务 银行 中信银行(国际) Finance & Insurance Service Bank China CITIC Bank International
金融保险服务 银行 大众银行(香港) Finance & Insurance Service Bank Public Bank (Hong Kong)
金融保险服务 银行 北京农商银行 Finance & Insurance Service Bank Beijing Rural Commercial Bank
金融保险服务 银行 上海农商银行 Finance & Insurance Service Bank Shanghai Rural Commercial Bank
金融保险服务 银行 广州农商银行 Finance & Insurance Service Bank Guangzhou Rural Commercial Bank
金融保险服务 银行 深圳农村商业银行 Finance & Insurance Service Bank Shenzhen Rural Commercial Bank
金融保险服务 银行相关 银行相关 Finance & Insurance Service Bank Related Bank Related
金融保险服务 自动提款机 自动提款机 Finance & Insurance Service ATM ATM
金融保险服务 自动提款机 中国银行ATM Finance & Insurance Service ATM Bank of China ATM
金融保险服务 自动提款机 中国工商银行ATM Finance & Insurance Service ATM ICBC ATM
金融保险服务 自动提款机 中国建设银行ATM Finance & Insurance Service ATM China Construction Bank ATM
金融保险服务 自动提款机 中国农业银行ATM Finance & Insurance Service ATM Agricultural Bank of China ATM
金融保险服务 自动提款机 交通银行ATM Finance & Insurance Service ATM Bank of Communications ATM
金融保险服务 自动提款机 招商银行ATM Finance & Insurance Service ATM China Merchants Bank ATM
金融保险服务 自动提款机 华夏银行ATM Finance & Insurance Service ATM Huaxia Bank ATM
金融保险服务 自动提款机 中信银行ATM Finance & Insurance Service ATM China CITIC Bank ATM
金融保险服务 自动提款机 中国民生银行ATM Finance & Insurance Service ATM China Minsheng Bank ATM
金融保险服务 自动提款机 中国光大银行ATM Finance & Insurance Service ATM China Everbright Bank ATM
金融保险服务 自动提款机 上海银行ATM Finance & Insurance Service ATM Bank of Shanghai ATM
金融保险服务 自动提款机 上海浦东发展银行ATM Finance & Insurance Service ATM Shanghai Pudong Development Bank ATM
金融保险服务 自动提款机 平安银行ATM Finance & Insurance Service ATM Ping An Bank ATM
金融保险服务 自动提款机 兴业银行ATM Finance & Insurance Service ATM Industrial Bank ATM
金融保险服务 自动提款机 北京银行ATM Finance & Insurance Service ATM Bank of Beijing ATM
金融保险服务 自动提款机 广发银行ATM Finance & Insurance Service ATM CGB ATM
金融保险服务 自动提款机 农村商业银行ATM Finance & Insurance Service ATM Rural Commercial Bank ATM
金融保险服务 自动提款机 香港恒生银行ATM Finance & Insurance Service ATM Hong Kong Hang Seng Bank ATM
金融保险服务 自动提款机 东亚银行ATM Finance & Insurance Service ATM Bank of East Asia ATM
金融保险服务 自动提款机 花旗银行ATM Finance & Insurance Service ATM Citibank ATM
金融保险服务 自动提款机 渣打银行ATM Finance & Insurance Service ATM Standard Chartered Bank ATM
金融保险服务 自动提款机 汇丰银行ATM Finance & Insurance Service ATM HSBC ATM
金融保险服务 自动提款机 荷兰银行ATM Finance & Insurance Service ATM ABN AMRO Bank ATM
金融保险服务 自动提款机 美国运通银行ATM Finance & Insurance Service ATM American Express Bank ATM
金融保险服务 自动提款机 瑞士友邦银行ATM Finance & Insurance Service ATM AIG Private Bank ATM
金融保险服务 自动提款机 美国银行ATM Finance & Insurance Service ATM Bank of America ATM
金融保险服务 自动提款机 蒙特利尔银行ATM Finance & Insurance Service ATM Bank of Montreal ATM
金融保险服务 自动提款机 纽约银行ATM Finance & Insurance Service ATM Bank of New York ATM
金融保险服务 自动提款机 苏格兰皇家银行ATM Finance & Insurance Service ATM The Royal Bank of Scotland ATM
金融保险服务 自动提款机 法国兴业银行ATM Finance & Insurance Service ATM Societe Generale Bank ATM
金融保险服务 自动提款机 德意志银行ATM Finance & Insurance Service ATM Deutsche Bank ATM
金融保险服务 自动提款机 日本三菱东京日联银行ATM Finance & Insurance Service ATM Bank of Tokyo-Mitsubishi UFJ ATM
金融保险服务 自动提款机 巴克莱银行ATM Finance & Insurance Service ATM Barclays Bank ATM
金融保险服务 自动提款机 摩根大通银行ATM Finance & Insurance Service ATM JPMorgan Chase Bank ATM
金融保险服务 自动提款机 中国邮政储蓄银行ATM Finance & Insurance Service ATM Postal Savings Bank of China ATM
金融保险服务 自动提款机 香港星展银行ATM Finance & Insurance Service ATM DBS ATM
金融保险服务 自动提款机 南洋商业银行ATM Finance & Insurance Service ATM Nanyang Commercial Bank ATM
金融保险服务 自动提款机 上海商业银行ATM Finance & Insurance Service ATM Shanghai Commercial Bank ATM
金融保险服务 自动提款机 永亨银行ATM Finance & Insurance Service ATM Wing Hang Bank ATM
金融保险服务 自动提款机 香港永隆银行ATM Finance & Insurance Service ATM Wing Lung Bank ATM
金融保险服务 自动提款机 创兴银行ATM Finance & Insurance Service ATM Chong Hing Bank ATM
金融保险服务 自动提款机 大新银行ATM Finance & Insurance Service ATM Dah Sing Bank ATM
金融保险服务 自动提款机 中信银行(国际)ATM Finance & Insurance Service ATM China CITIC Bank International ATM
金融保险服务 自动提款机 大众银行(香港)ATM Finance & Insurance Service ATM Public Bank (Hong Kong) ATM
金融保险服务 自动提款机 北京农商银行ATM Finance & Insurance Service ATM Beijing Rural Commercial Bank ATM
金融保险服务 自动提款机 上海农商银行ATM Finance & Insurance Service ATM Shanghai Rural Commercial Bank ATM
金融保险服务 自动提款机 广州农商银行ATM Finance & Insurance Service ATM Guangzhou Rural Commercial Bank ATM
金融保险服务 自动提款机 深圳农村商业银行ATM Finance & Insurance Service ATM Shenzhen Rural Commercial Bank ATM
金融保险服务 保险公司 保险公司 Finance & Insurance Service Insurance Company Insurance Company
金融保险服务 保险公司 中国人民保险公司 Finance & Insurance Service Insurance Company The People’s Insurance Company of China
金融保险服务 保险公司 中国人寿保险公司 Finance & Insurance Service Insurance Company China Life Insurance Company
金融保险服务 保险公司 中国平安保险公司 Finance & Insurance Service Insurance Company Ping An Insurance Company of China
金融保险服务 保险公司 中国再保险公司 Finance & Insurance Service Insurance Company China Reinsurance Company
金融保险服务 保险公司 中国太平洋保险 Finance & Insurance Service Insurance Company China Pacific Insurance Company
金融保险服务 保险公司 新华人寿保险公司 Finance & Insurance Service Insurance Company New China Life Insurance Company
金融保险服务 保险公司 华泰财产保险股份有限公司 Finance & Insurance Service Insurance Company Huatai Property Insurance Company Ltd.
金融保险服务 保险公司 泰康人寿保险公司 Finance & Insurance Service Insurance Company Taikang Life Insurance Company
金融保险服务 证券公司 证券公司 Finance & Insurance Service Securities Company Securities Company
金融保险服务 证券公司 证券营业厅 Finance & Insurance Service Securities Company Office of Securities Business
金融保险服务 财务公司 财务公司 Finance & Insurance Service Finance Company Finance Company
公司企业 公司企业 公司企业 Enterprises Enterprises Enterprises
公司企业 知名企业 知名企业 Enterprises Famous Enterprise Famous Enterprise
公司企业 公司 公司 Enterprises Company Company
公司企业 公司 广告装饰 Enterprises Company Advertisement and Decoration
公司企业 公司 建筑公司 Enterprises Company Construction Company
公司企业 公司 医药公司 Enterprises Company Medical Company
公司企业 公司 机械电子 Enterprises Company Machinery and Electronics
公司企业 公司 冶金化工 Enterprises Company Chemical and Metallurgy
公司企业 公司 网络科技 Enterprises Company Network Science and Technology
公司企业 公司 商业贸易 Enterprises Company Commercial Trade
公司企业 公司 电信公司 Enterprises Company Telecommunication Company
公司企业 公司 矿产公司 Enterprises Company Mining Company
公司企业 工厂 工厂 Enterprises Factory Factory
公司企业 农林牧渔基地 其它农林牧渔基地 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Other Farming,Forestry,Animal Husbandry and Fishery Base
公司企业 农林牧渔基地 渔场 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Fishing Farm
公司企业 农林牧渔基地 农场 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Farm
公司企业 农林牧渔基地 林场 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Forest Farm
公司企业 农林牧渔基地 牧场 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Pasture
公司企业 农林牧渔基地 家禽养殖基地 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Poultry Breeding Base
公司企业 农林牧渔基地 蔬菜基地 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Vegetable Planting Base
公司企业 农林牧渔基地 水果基地 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Fruit Cultivation Base
公司企业 农林牧渔基地 花卉苗圃基地 Enterprises Farming,Forestry,Animal Husbandry and Fishery Base Flower Nurserey Base
道路附属设施 道路附属设施 道路附属设施 Road Furniture Road Furniture Road Furniture
道路附属设施 警示信息 警示信息 Road Furniture Warning Sign Warning Sign
道路附属设施 警示信息 摄像头 Road Furniture Warning Sign Camera
道路附属设施 警示信息 测速设施 Road Furniture Warning Sign Speed Sensor
道路附属设施 警示信息 铁路道口 Road Furniture Warning Sign Railway Crossing
道路附属设施 警示信息 违章停车 Road Furniture Warning Sign Illegal Parking
道路附属设施 收费站 收费站 Road Furniture Toll Gate Toll Gate
道路附属设施 收费站 高速收费站 Road Furniture Toll Gate Expressway Toll Gate
道路附属设施 收费站 国省道收费站 Road Furniture Toll Gate National and Provincial Road Toll Gate
道路附属设施 收费站 桥洞收费站 Road Furniture Toll Gate Tunnel & Bridge Toll Gate
道路附属设施 服务区 高速服务区 Road Furniture Service Area Expressway Service Area
道路附属设施 服务区 高速加油站服务区 Road Furniture Service Area Expressway Filling Station Service Area
道路附属设施 服务区 高速停车区 Road Furniture Service Area Expressway Parking Area
道路附属设施 红绿灯 红绿灯 Road Furniture Traffic Light Traffic Light
道路附属设施 路牌信息 路牌信息 Road Furniture Signpost Signpost
地名地址信息 地名地址信息 地名地址信息 Place Name & Address Place Name & Address Place Name & Address
地名地址信息 普通地名 普通地名 Place Name & Address Normal Place Name Normal Place Name
地名地址信息 普通地名 国家名 Place Name & Address Normal Place Name Country Name
地名地址信息 普通地名 省级地名 Place Name & Address Normal Place Name Provincial Place Name
地名地址信息 普通地名 直辖市级地名 Place Name & Address Normal Place Name Municipal Place Name
地名地址信息 普通地名 地市级地名 Place Name & Address Normal Place Name Prefecture-level Place Name
地名地址信息 普通地名 区县级地名 Place Name & Address Normal Place Name District/County-level Place Name
地名地址信息 普通地名 乡镇级地名 Place Name & Address Normal Place Name Township-level Place Name
地名地址信息 普通地名 街道级地名 Place Name & Address Normal Place Name Subdistrict-level Place Name
地名地址信息 普通地名 村庄级地名 Place Name & Address Normal Place Name Village-level Place Name
地名地址信息 普通地名 村组级地名 Place Name & Address Normal Place Name Village Team-level Place Name
地名地址信息 自然地名 自然地名 Place Name & Address Natural Place Name Natural Place Name
地名地址信息 自然地名 海湾海峡 Place Name & Address Natural Place Name Gulf and Strait
地名地址信息 自然地名 岛屿 Place Name & Address Natural Place Name Island
地名地址信息 自然地名 Place Name & Address Natural Place Name Mountain
地名地址信息 自然地名 河流 Place Name & Address Natural Place Name River
地名地址信息 自然地名 湖泊 Place Name & Address Natural Place Name Lake
地名地址信息 交通地名 交通地名 Place Name & Address Transportation Place Name Transportation Place Name
地名地址信息 交通地名 道路名 Place Name & Address Transportation Place Name Road Name
地名地址信息 交通地名 路口名 Place Name & Address Transportation Place Name Name of Intersection
地名地址信息 交通地名 环岛名 Place Name & Address Transportation Place Name Name of Roundabout
地名地址信息 交通地名 高速路出口 Place Name & Address Transportation Place Name Expressway Exit
地名地址信息 交通地名 高速路入口 Place Name & Address Transportation Place Name Expressway Entrance
地名地址信息 交通地名 立交桥 Place Name & Address Transportation Place Name Motorway Interchange
地名地址信息 交通地名 Place Name & Address Transportation Place Name Bridge
地名地址信息 交通地名 城市快速路出口 Place Name & Address Transportation Place Name Urban Expressway Exit
地名地址信息 交通地名 城市快速路入口 Place Name & Address Transportation Place Name Urban Expressway Entrance
地名地址信息 交通地名 隧道 Place Name & Address Transportation Place Name Tunnel
地名地址信息 交通地名 铁路 Place Name & Address Transportation Place Name Railway
地名地址信息 门牌信息 门牌信息 Place Name & Address Address Sign Address Sign
地名地址信息 门牌信息 地名门牌 Place Name & Address Address Sign Placename Sign
地名地址信息 门牌信息 道路门牌 Place Name & Address Address Sign Road Name Sign
地名地址信息 门牌信息 楼栋号 Place Name & Address Address Sign Building Number
地名地址信息 市中心 城市中心 Place Name & Address City Center City Center
地名地址信息 标志性建筑物 标志性建筑物 Place Name & Address Landmark Buildings Landmark Buildings
地名地址信息 热点地名 热点地名 Place Name & Address The hot names The hot names
公共设施 公共设施 公共设施 Public Facility Public Facility Public Facility
公共设施 报刊亭 报刊亭 Public Facility Newsstand Newsstand
公共设施 公用电话 公用电话 Public Facility Public Phone Public Phone
公共设施 公共厕所 公共厕所 Public Facility Public Toilet Public Toilet
公共设施 公共厕所 男洗手间 Public Facility Public Toilet Male Toilet
公共设施 公共厕所 女洗手间 Public Facility Public Toilet Female Toilet
公共设施 公共厕所 残障洗手间/无障碍洗手间 Public Facility Public Toilet Wheelchair Accessible
公共设施 公共厕所 婴儿换洗间/哺乳室/母婴室 Public Facility Public Toilet Room of Mother and Infant
公共设施 紧急避难场所 紧急避难场所 Public Facility Emergency Shelter Emergency Shelter
事件活动 事件活动 事件活动 Incidents and Events Incidents and Events Incidents and Events
事件活动 公众活动 公众活动 Incidents and Events Public Event Public Event
事件活动 公众活动 节日庆典 Incidents and Events Public Event Festival Celebration
事件活动 公众活动 展会展览 Incidents and Events Public Event Convention & Exposition
事件活动 公众活动 体育赛事 Incidents and Events Public Event Sports Event
事件活动 公众活动 文艺演出 Incidents and Events Public Event Art Performance
事件活动 公众活动 大型会议 Incidents and Events Public Event Conference
事件活动 公众活动 运营活动 Incidents and Events Public Event Operating Activities
事件活动 公众活动 商场活动 Incidents and Events Public Event Marketplace Activities;)
事件活动 突发事件 突发事件 Incidents and Events Emergency Emergency;)
事件活动 突发事件 自然灾害 Incidents and Events Emergency Natural Disaster
事件活动 突发事件 事故灾难 Incidents and Events Emergency Accident
事件活动 突发事件 城市新闻 Incidents and Events Emergency City News
事件活动 突发事件 公共卫生事件 Incidents and Events Emergency Public Health Event
事件活动 突发事件 公共社会事件 Incidents and Events Emergency Public Social Event
室内设施 室内设施 室内设施 Indoor facilities Indoor facilities Indoor facilities
通行设施 通行设施 通行设施 Pass Facilities Pass Facilities Pass Facilities
通行设施 建筑物门 建筑物门 Pass Facilities Gate of Buildings Gate of Buildings
通行设施 建筑物门 建筑物正门 Pass Facilities Gate of Buildings Main Gate of Buildings
通行设施 临街院门 临街院门 Pass Facilities Gate of Street House Gate of Street House
通行设施 临街院门 临街院正门 Pass Facilities Gate of Street House Main Entrance of Street House Gate
通行设施 虚拟门 虚拟门 Pass Facilities Virtual Gate Virtual Gate

收集的内容范围纯主观,不定期更新。

数据访问层采用JPA集成MySQL

简介

JPA采用仓库模式实现数据持久化处理,它屏蔽底层处理细节,简化开发应用程序时对数据源处理的过程。数据访问层采用JPA,主要以Java实体类为核心,实体类封装数据字典映射数据表,结合仓库类实现数据的CRUD. 需要知道的是JPA是Java Persistence API的缩写。

MySQL是常见的开源免费关系型数据库,应用广泛支持良好,一般作为项目开发的首选。此次学习我们采用IDEA搭建Spring Data JPA + MySQL项目。

项目搭建

  1. 创建新项目
  1. 初始化项目,设置Group、Artifact、Package,项目采用Maven构建,Java版本采用v8
  1. 项目依赖选择:Spring Boot DevTools、Lombok、Spring Web、Thymeleaf、Spring Data JPA、MySQL Driver.
  1. 完成项目创建

项目配置

  1. 修改application.properties为application.yml
  1. 设置配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    server:
    port: 10016
    spring:
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_db?useTimezone=true&serverTimezone=GMT%2b8&characterEncoding=utf8
    username: testUser
    password: testPwdxxxxxx
    jpa:
    database: mysql
    show-sql: true
    generate-ddl: true

  1. pom依赖配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
    </dependency>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    <excludes>
    <exclude>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </exclude>
    </excludes>
    </configuration>
    </plugin>
    </plugins>
    </build>

项目编码

项目分层

在项目正式编码前,我们简单的定义下各个package,用于项目分层化分解。

config包:存放项目启动相关配置类;

controller包:存放spring mvc Controller类;

domain.entity包:存放数据表相关实体类,实体类用于映射数据表;

domain.enums包:存放枚举类型;

domain.model包:存放自定义模型,用于封装数据表以外的数据结构;

repository包:存放仓库类,提供数据的CRUD功能;

定义实体类

使用JPA作为数据访问层的第一步是封装定义数据实体类。在UserEntity实体类中,封装映射t_user表相关字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package org.banana.authserver.domain.entity;

import javax.persistence.*;
import java.util.Date;

/**
* @author YuanRui
* @since 2020-12-16 15:38:51
*/
@Table(name = "t_user")
@Entity
public class UserEntity {
private Integer id;
private String name;
private String password;
private Boolean disabled;
private Boolean expired;

/**
* 获取 编号
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
public Integer getId() {
return this.id;
}

/**
* 设置 编号
*/
public void setId(Integer id) {
this.id = id;
}

/**
* 获取 用户名
*/
@Basic
@Column(name = "name", nullable = true, length=255)
public String getName() {
return this.name;
}

/**
* 设置 用户名
*/
public void setName(String name) {
this.name = name;
}

/**
* 获取 密码
*/
@Basic
@Column(name = "password", nullable = true, length=255)
public String getPassword() {
return this.password;
}

/**
* 设置 密码
*/
public void setPassword(String password) {
this.password = password;
}

/**
* 获取 是否禁用
*/
@Basic
@Column(name = "disabled", nullable = false)
public Boolean getDisabled() {
return this.disabled;
}

/**
* 设置 是否禁用
*/
public void setDisabled(Boolean disabled) {
this.disabled = disabled;
}

/**
* 获取 是否过期
*/
@Basic
@Column(name = "expired", nullable = false)
public Boolean getExpired() {
return this.expired;
}

/**
* 设置 是否过期
*/
public void setExpired(Boolean expired) {
this.expired = expired;
}

}

创建仓库接口

创建UserRepository接口,使用@Repository注解,继承CrudRepository、JpaRepository、JpaSpecificationExecutor,实现对数据表t_user的CRUD.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.banana.authserver.repository;

import org.banana.authserver.domain.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

/**
* @author YuanRui
* @since 2020-12-16 15:33:08
*/
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Integer>, JpaRepository<UserEntity, Integer>, JpaSpecificationExecutor<UserEntity> {

}

创建控制器类

创建HomeController,使用@Controller注解,创建一个action方法: index. index方法内部调用仓库接口,获取所有用户列表,并将模型数据传递到页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package org.banana.authserver.controller;

import org.banana.authserver.domain.entity.UserEntity;
import org.banana.authserver.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.List;

/**
* @author yuanrui@live.cn
* @since 2020/12/16 15:47
*/
@Controller
public class HomeController {

@Autowired
UserRepository userRepository;

@GetMapping( value = { "/", "/index"})
public String index(Model model) {
List<UserEntity> all = userRepository.findAll();

List list = new ArrayList<String>();
for (UserEntity ent : all){
list.add(ent.getName());
}
String users = String.join(",", list);

model.addAttribute("users", users);

return "index";
}
}

在资源文件夹resources的templates中创建index.html文件,编辑代码:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>系统首页</title>
</head>
<body>
系统用户:[[${users}]]
</body>
</html>

Shift+F9调试项目,在浏览器中打开:http://localhost:10016/

MySQL脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`disabled` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否禁用',
`expired` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否过期',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'test', '123456', b'0', b'0');
INSERT INTO `t_user` VALUES (2, 'abc', '123456', b'0', b'0');

统一身份认证系统平台功能设计

系统设置

用户管理

用户属性:账户、密码、盐值、姓名、电话、角色ID、组织机构ID、数字证书(编号、路径)、密码更新时间、密码错误次数、账户有效期、是否启用、备注;
密码连续错误次数 > 5 为锁定状态;正确则置0;

角色管理

角色属性:角色ID、角色名称、权限项(集合)

权限项管理

权限项属性:权限ID、应用ID、对象名称、权限类型(菜单、按钮、API)、URL、关联权限项(多个)、备注、排序编号。

组织机构管理

组织机构属性:组织机构ID、名称、代码、上级ID、级别;

应用系统

应用系统属性:应用ID、系统名称、图标、系统令牌、加密算法;

安全参数

参数:密码强度、密码有效期、初次登录必须修改密码;
密码强度:低:无限制
中:长度>5; 至少2种字符组合
高:长度>7; 至少3种字符组合
密码有效期:无期限、3个月、6个月、12个月;
密码加密方式:使用SHA256哈希算法加密加密盐值+密码原文,数据库保存加密后的密文。
IP登录范围:未设置时允许所有IP登录。

日志管理

记录所有的接口日志 和 IP;
对非授权的接口访问视为攻击行为,并记入安全事件日志。

数据字典

数据字典属性:编号、字典分类、字典名称、字典值、是否启用、排序编号。

业务逻辑

统一权限系统接口基于OAuth2.0实现验证授权流程。该接口供内部或第三方登录访问授权。

加密算法采用RSA 2048位进行加密解密和签名,由统一权限系统创建公钥和私钥,私钥由统一权限系统持有,公钥由第三方应用持有。采用密码模式登录时,由第三方应用将密码原文用公钥进行加密,系统收到密文后采用对应的私钥进行解码,解密原文后再使用SHA256哈希算法加密加密盐值+密码原文于数据库中的密码进行比对。

登录完成后系统分配Access Token,Access Token采用JWT 格式,JWT包含头部、载荷、签名三部分。JWT采用统一权限系统发布的私钥进行签名,第三方应用接收到JWT之后使用公钥进行验证有效性。

JWT载荷JSON格式如下:

名称 英文全称 是否必须 含义
iss Issuer Identifier 统一权限系统URL,用于提供认证信息者的唯一标识。一般是一个https的url(不包含querystring和fragment部分)。
sub Subject Identifier iss提供的最终用户的标识,即用户名,在iss范围内唯一。它会被RP用来标识唯一的用户。最长为255个ASCII个字符。
name Name 用户显示名称。
aud Audience(s) 应用编号(AppId)
exp Expiration time 过期时间,超过此时间的Access Token会作废不再被验证通过。
iat Issued At Time JWT的构建的时间。
nonce Nonce 发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联Access Token和受信客户端本身的Session信息。
role Role 角色名称
isa Is Super Admin 是否超级管理员

JSON内容示例:

1
2
3
4
5
6
7
8
9
10
11
{
"sub": "SuperAdmin",
"name": "超级管理员",
"iss": "http://192.168.1.100",
"aud": "TIMS-Client-1",
"isa": true,
"nonce": "ABCAV32hkKG",
"role": "管理员",
"exp": 1598851053729,
"iat": 1598246196411
}

前后端分离系统权限控制流程

应用程序登录权限控制流程

接口定义

1.获取Authorization Code

请求地址: /oauth2/authorize

请求方法: GET

请求参数:

名称 必须 类型 备注
client_id long 申请应用时分配的应用ID
redirect_uri string 授权回调地址, 必须和申请应用是填写的一致(参数部分可不一致)
response_type string 描述获取授权的方式, Authorization Code方式授权, response_type=code
scope string 申请scope权限所需参数,可一次申请多个scope权限,用空格分隔。
state string 用于保持请求和回调的状态,授权请求成功后原样带回给第三方,该参数用于防止 CSRF攻击(跨站请求伪造攻击),强烈建议第三方带上该参数

返回值:

  • 成功响应

如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上codestate等参数,例子如下:

1
http://example.com/example?code=CODE&state=STATE

返回参数说明:

名称 必须 类型 备注
code string 用来换取access_token的授权码,有效期为5分钟且只能用一次
state string 如果请求时传递参数,会回传该参数
  • 失败响应

如果授权失败,授权服务器会将用户的浏览器重定向到redirect_uri,并带上errorerror_description, state等参数,例子如下:

1
http://example.com/example?error=ERROR&error_description=ERROR_DESCRIPTION&state=STATE

返回参数说明:

名称 必须 类型 备注
error int OAuth定义的错误码
error_description string 错误描述信息
state string 如果请求时传递参数,会回传该参数

2.获取Access Token

请求地址: /oauth2/access_token

请求方法: GET

请求参数:

名称 必须 类型 备注
client_id long 申请应用时分配的应用ID
redirect_uri string 授权回调地址, 必须和申请应用是填写的一致(参数部分可不一致)
client_secret string 申请应用时分配的系统令牌
grant_type string 固定为authorization_code
code string 第1小节中拿到的授权码

返回值:

  • 成功响应

如果请求成功,授权服务器会返回JSON格式的字符串:

  1. access_token: 要获取的Access Token
  2. token_type: token类别,固定为bearer(RFC6750 定义)
  3. expires_in: Access Token的有效期,以秒为单位。
  4. refresh_token: 用于刷新Access Token 的 Refresh Token,所有应用都会返回该参数(10年的有效期)
  5. scope: Access Token最终的访问范围,关于权限的具体信息参考scope权限列表
  6. openId: 用户统一标识,可以唯一标识一个用户.网站或应用可将此ID进行存储,便于用户下次登录时辨识其身份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{

"access_token": "access token value",

"token_type": "Bearer",

"expires_in": 360000,

"refresh_token": "refresh token value",

"scope": "scope value",

"openId":"OPENID"

}
  • 失败响应

如果请求失败,授权服务器会返回JSON格式的字符串:

  1. error:错误码,是一个int类型的数字 请参考OAuth定义的错误码
  2. error_description:一段可读的文字,用来帮助理解和解决发生的错误
1
2
3
4
5
6
7
{

"error": "error_code",

"error_description": "错误描述"

}

3.Refresh Token刷新接口

请求地址: /oauth2/refresh_token

请求方法: GET

请求参数:

名称 必须 类型 备注
client_id long 申请应用时分配的 App Id
redirect_uri string 授权回调地址, 必须和申请应用是填写的一致(参数部分可不一致)
client_secret string 申请应用时分配的 App Secret
grant_type string 固定为refresh_token
refresh_token string 请求授权成功时获取的刷新令牌

返回值数据:

  • 成功响应

如果请求成功,授权服务器会返回JSON格式的字符串:

  1. access_token: 要获取的Access Token
  2. expires_in: Access Token的有效期,以秒为单位, 请参考Access Token生命周期
  3. refresh_token: 用于刷新Access Token 的 Refresh Token,所有应用都会返回该参数(10年的有效期)
  4. scope: Access Token最终的访问范围,关于权限的具体信息参考scope权限列表
  5. openId: 用户统一标识,可以唯一标识一个用户.网站或应用可将此ID进行存储,便于用户下次登录时辨识其身份
1
2
3
4
5
6
7
8
9
10
11
12
13
{

"access_token": "access token value",

"expires_in": 360000,

"refresh_token": "refresh token value",

"scope": "scope value",

"openId":"2.0XXXXXXXXX"

}
  • 失败响应

如果请求失败,授权服务器会返回JSON格式的字符串:

  1. error:错误码,是一个int类型的数字 请参考OAuth定义的错误码
  2. error_description:一段人类可读的文字,用来帮助理解和解决发生的错误
1
2
3
4
5
6
7
{

"error": "error_code",

"error_description": "错误描述"

}

4.密码模式登录

请求地址: /oauth2/signin

请求方法: GET

请求参数:

名称 必须 类型 备注
client_id long 申请应用时分配的应用ID
client_secret string 申请应用时分配的系统令牌
grant_type string 固定为password
username string 用户名
password string 密码,密码采用RSA公钥加密

返回值:

  • 成功响应

如果请求成功,授权服务器会返回JSON格式的字符串:

  1. access_token: 要获取的Access Token
  2. expires_in: Access Token的有效期,以秒为单位。
  3. refresh_token: 用于刷新Access Token 的 Refresh Token,所有应用都会返回该参数(10年的有效期)
  4. scope: Access Token最终的访问范围,关于权限的具体信息参考scope权限列表
  5. openId: 用户统一标识,可以唯一标识一个用户.网站或应用可将此ID进行存储,便于用户下次登录时辨识其身份
1
2
3
4
5
6
7
8
9
10
11
12
13
{

"access_token": "access token value",

"expires_in": 360000,

"refresh_token": "refresh token value",

"scope": "scope value",

"openId":"OPENID"

}
  • 失败响应

如果请求失败,授权服务器会返回JSON格式的字符串:

  1. error:错误码,是一个int类型的数字 请参考OAuth定义的错误码
  2. error_description:一段可读的文字,用来帮助理解和解决发生的错误
1
2
3
4
5
6
7
{

"error": "error_code",

"error_description": "错误描述"

}

5. 获取用户信息

请求地址: /oauth2/account_profile

请求方法: GET

请求参数:

名称 必须 类型 备注
clientId long 申请应用时分配的APP ID
token string 用户授权得到的访问令牌(Access Token)

返回值:

  • 成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{

"result": "ok",

"description": "成功",

"data": {

"name": "用户编号",

"userName": "用户姓名",

"email": "电子邮箱",

"role": "角色名称,多个用英文逗号分隔"

},

"code": 0

}
  • 失败
1
2
3
4
5
6
7
8
9
{

"result": "error",

"description": "错误描述",

"code": "错误码"

}

6. 获取用户权限

请求地址: /oauth2/get_permission

请求方法: GET

请求参数:

名称 必须 类型 备注
clientId long 申请应用时分配的APP ID
token string 用户授权得到的访问令牌(Access Token)

返回值:

  • 成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{

"result": "ok",

"description": "成功",

"data": [{
"id": "权限编号",

"name": "用户编号",

"parentId": "父权限编号",

"url": "权限地址",

"icon": "图标",

"renderForm": "呈现形式(0:菜单 1:按钮)",

"openMode": "打开方式(0:内部,1:弹窗)"
}
]

"code": 0

}
  • 失败
1
2
3
4
5
6
7
8
9
{

"result": "error",

"description": "错误描述",

"code": "错误码"

}

7. 获取数据字典

请求地址: /oauth2/get_dict

请求方法: GET

请求参数:

名称 必须 类型 备注
clientId long 申请应用时分配的APP ID
token string 用户授权得到的访问令牌(Access Token)
categoryId string 字典分类

返回值:

  • 成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{

"result": "ok",

"description": "成功",

"data": [{
"key": "字典Key",

"value": "字典Value"
}
]

"code": 0

}
  • 失败
1
2
3
4
5
6
7
8
9
{

"result": "error",

"description": "错误描述",

"code": "错误码"

}

8. 获取组织机构

请求地址: /oauth2/get_org

请求方法: GET

请求参数:

名称 必须 类型 备注
token string 用户授权得到的访问令牌(Access Token)

返回值:

  • 成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{

"result": "ok",

"description": "成功",

"data": [{
"id": "组织机构编号",

"name": "组织机构名称",

"parentId": "组织机构父编号",

"remark": "备注"
}
]

"code": 0

}
  • 失败
1
2
3
4
5
6
7
8
9
{

"result": "error",

"description": "错误描述",

"code": "错误码"

}

9. 权限校验

请求地址: /oauth2/verify_permission

请求方法: GET

请求参数:

名称 必须 类型 备注
token string 用户授权得到的访问令牌(Access Token)
permissionId string 权限编号

返回值:

  • 成功
1
2
3
4
5
6
7
8
9
{

"result": "ok",

"description": "成功",

"code": 0

}
  • 失败
1
2
3
4
5
6
7
8
9
{

"result": "error",

"description": "错误描述",

"code": "错误码"

}

数据库设计

前言

排班是人力资源精细化控制的基础,一个好的排班管理不仅能调动人员的工作积极性,也能提高工作效率,提高劳动力生产力。

对于排班管理而言,需要考虑:时间、人员、地点、工作事项、工作设备和环境要求等几个要素。针对不同需求场景,包含的要素需要有所侧重,其中时间和人员是最为核心的要素,毕竟排班讲究的是合适的时间安排合适的人去做某某事情。当然还有可能包含合适的地点,但是在一些固定工作场所的前提下,地点相对时间、人员而言属性不是那么重要。

固定场所排班分析

假设,某交巡警支队后台视频监控部门排班管理,需要保障道路交通持续不断的安全运维,对工作人员要求按照早班、中班、夜班三个班次进行轮换上班上岗。针对这种场景,工作场所一般是固定的,每个员工的工作内容一般是固化下来的,每天只需要按部就班执行即可。那么在这里,主要包含时间、人员这两个要素。

该部门的排班表如下:

日期 班次 人员
2020-08-15 早班(8:00~16:00) 令狐冲 郭靖 杨过
2020-08-15 中班(16:00~24:00) 任盈盈 黄蓉 小龙女
2020-08-15 夜班(24:00~8:00) 乔峰 虚竹 段誉
2020-08-16 早班(8:00~16:00) 黄药师 一灯大师 周伯通
2020-08-16 中班(16:00~24:00) 令狐冲 郭靖 杨过
2020-08-16 夜班(24:00~8:00) 任盈盈 黄蓉 小龙女

从这个排班表中,我们可以抽象出:日期、班次(时段)、人员这三个属性。一般班次属性可单独抽象出来,班次包含:班次名称、开始时间、结束时间和作用范围。作用范围可以为工作日、周末、节假日等选项。

结合到排列组合来讲,我们可以将人员进行按班次进行分组管理,每个分组对应一个班次即班组。有了班次和人员分组之后,我们可以设置班次的起始人员分组,然后按照班次顺序依次和人员分组进行循环对应。这也是自动排班管理的一种简单实现方式。

变化场所排班分析

举例分析

通过上述分析,排班管理看上去做起来好像很容易?然而并没有那么简单,这里包含很多假定,班次时段是固定的,人员班组页面没有出现请假等情况。排班管理还需要考虑时间、人员、场所变化的情形,这个需要我们从变化的情景中找到合适的规律。下面我们根据一个时间和地点均存在变化的例子来分析排班。

某部门外勤某日排班表(2020年8月17日)如下:

部门 岗位类型 执勤地点 时段 人员
一大队 早晚高峰岗 四公里 7:00-10:00 令狐冲 郭靖 杨过
一大队 早晚高峰岗 五公里 7:00-10:00 任盈盈 黄蓉 小龙女
一大队 早晚高峰岗 六公里 7:00-10:00 乔峰 虚竹 段誉
一大队 路面巡逻岗 7:00-10:00 黄药师 一灯大师 周伯通
二大队 早晚高峰岗 茶园 7:00-9:30 令狐冲 郭靖 杨过
二大队 早晚高峰岗 长生桥 7:00-9:30 任盈盈 黄蓉 小龙女

站在支队领导的角度,支队对各所属大队提出每日执勤要求包含:部门、岗位类型、执勤地点、时段、人员数量。一个部门下有多个岗位类型,同一岗位类型有多个执勤地点,部门、岗位类型、执勤地点可以设置不同的时段和多个人员。每日的排班表,会对岗位类型和执勤地点进行适当的调整。大致上,周一到周五的排班表内容基本相同,周末有所变化,节假日需做针对性安排。

外勤的业务模式具有支队安排,大队上报人员的特点,由支队安排需要执勤的岗位、地点、时段,由大队管理员上报每天的执勤人员。支队以周为单位,安排周一至周天的每天勤务安排,可设置节假日和指定日期的勤务。

如何根据这些规则进行的合适的勤务安排呢?

勤务模板

勤务模板,勤务模板是需求落地通往实现的桥梁。模板的存在是对特定规则的一个抽象,需要我们抽象出模板的用途、分类、状态、规则等信息。就排班管理而言需要:模板名称、模板类型、模板状态、日期选项、时段规则等信息。注意这里的日期选项和时段规则是合集关系,一个日期选项可以包含多个时段规则,时段通俗的叫法也称班次。这里的日期选项可以归纳为工作日、周末、节假日、星期等范围选项。在人员安排时,可根据日期查找对应的日期选项,找到对应的时段规则,然后根据时段规则分配人员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
假设某单位有如下上班时间设置:
周一到周五每天八点到下午五点上班。
日期选项为:工作日,时段规则为:8:00-17:00

假设某单位有如下上班时间设置:
周一上午八点到十二点上班,下午休息。
周二到周五每天八点到到下午五点上班。
这里日期选项为:星期,星期包含:星期一、星期二、星期三、星期四、星期五、星期六、星期日。
规则:星期一 8:00-12:00 下午休息
星期二 8:00-17:00
星期三 8:00-17:00
星期四 8:00-17:00
星期五 8:00-17:00
星期六 休息
星期日 休息

勤务模板特征

按照星期来执行时段班次的编排,是一个常用的途径。星期排班有以下几个特点:

  1. 循环性,星期具有天然的循环滚动属性,总是一周接着一周,每周天数固定7天。
  2. 直观性,可横向比较(比如周一和周二),也可纵向比较(比如本周一和上周一)。
  3. 规则影响范围有限,一个周的排班规则设置好之后,修改指定星期时只影响未来,不影响过去。假设现在是周三,修改周四的规则表示修改明天的规则;修改周一的规则,表示修改下周的规则,对本周一不影响。
  4. 工作日容易实现,按照国家法律规定实行五天工作制,周一到周五为工作日,周末休息。工作日的排班一般通过周一到周五来实现,但还需要考虑法定节假日范围的影响。

星期+周末+节假日能够满足一年中所有日期场景。

根据每周设置执勤岗位。

根据节假日设置执勤岗位,同理可对指定日期进行勤务安排。

延伸,既然星期有连续性也可循环迭代,那是否还有其他日期选项可以供模板设置呢?根据按天循环勤务安排,也是属于一个备选方案。我们可以设置天数范围用于周期性循环,再设置一个起始日期作为生效的开始条件,即可模拟星期的循环性。按月天数范围一般不超过31天。同理可设置按年进行设置,天数范围不超过366天。

总结

总结,对于工作场所和班次固定的排班,可按工作日、周末、节假日设置相应的班次时间段。对于工作场所、日期和时段不固定的情况,推荐使用星期加节假日排班,按天数循环方案备选。星期的循环连续特性,能够满足大多数场景,当然也存在特殊情况。特殊情况应当特殊处理,比如设置特定日期的班次规则。需要指出的是,一般而言指定日期的设置优先级高于节假日,节假日的优先级高于星期设置,星期设置的优先级最低。

勤务模板管理可根据部门、工作场所、日期、时段的需要,配置不同类型的模板。

有了排班模板后,下一步就是根据将人员分配到日期上,同时满足对应的时段(班次)规则。另外再补充说明下,时段的范围需要考虑跨天的情景,单个时段的总时长不能超过24小时,多个时段的时长合计小于等于24小时。