基于浏览器扩展插件的信创无感迁移方法、系统及介质与流程

文档序号:32052612发布日期:2022-11-04 18:47阅读:331来源:国知局
基于浏览器扩展插件的信创无感迁移方法、系统及介质与流程

1.本发明涉及浏览器扩展插件领域,尤其涉及一种基于浏览器扩展插件的信创无感迁移方法、系统及介质。


背景技术:

2.智能机具标准架构协议(protocol for intelligence terminal standards architecture),一种智能终端的标准体系架构,又称pisa协议,是linux系统下金融驱动服务规范,是目前金融自助信创领域应用最为广泛的外设接入标准。信创领域的chromium浏览器是一种广泛使用的开源浏览器,其提供了一种扩展插件机制,即extension,用来增强浏览器功能。通过使用chromium提供的接口,即api,extension可以访问网络,修改浏览行为,以及操作网页内容、触发网络通信等。
3.对于金融自助业务系统而言,要实现金融自助系统的自助可控,就必须基于自助安全的cpu、主板和操作系统,开发或者迁移信创环境的自助业务系统。如图1所示,各类业务组件最终都需要通过通用型通道js组件调用外设;js组件需要通过c#外设服务window.bridge.sendmessage方法来实现具体外设调用;外设服务对下加载定制逻辑处理库;该逻辑处理库根据不同的业务请求情况,分别组合调用第三方及系统api接口,或者组合调用密码键盘、二代证等组合外设中间件接口,从而最终实现外设调用。而在整个windows框架中定制浏览器采用c#的.net框架编写,使用internet explore作为浏览器核心,采用ocx控件外设中间形式,并采用基于windows message消息机制的wosa-xfs的sp标准。因.net框架和ie浏览器、ocx控件、wosa-xfs等一系列组件对windows系统存在强依赖性,因此整个windows前端应用系统完全不具备跨系统复用的可能。
4.为减少业务前端系统的重复开发和重复测试,减少前端业务开发成本和开发周期,保护对客户体验的统一性,我们必须复用windows平台上的业务逻辑代码,前端业务的代码需要基本保持不变。为实现这一需求,设计一套跨系统平台的前端业务系统平台,可将前端业务代码原封不动迁移过去的100%完全适配的容器。


技术实现要素:

5.本发明提供了一种基于浏览器扩展插件的信创无感迁移方法、系统及介质,通过浏览器插件即浏览器扩展层、前端定制服务、中间件服务,确保上层应用可以从windows端零改动迁移到国产linux系统中,保持代码功能和产品性能的完全一致性,真正实现了代码级无感迁移。
6.第一方面,本发明提供了一种基于浏览器扩展插件的信创无感迁移方法,包括:
7.浏览器扩展层将浏览器外设接口调用转换成websocket通信报文发送前端定制服务层;其中,接口类型包括同步外设接口、异步外设接口、本地api接口;
8.前端定制服务层对websocket通信报文进行解析,根据解析结果执行对应的接口调用策略;所述接口调用策略包括同步调用策略、异步调用策略、本地api调用策略;
9.若执行本地api调用策略,则前端定制服务层调用本地api接口并获取执行结果;若执行同步调用策略或者异步调用策略,则调用中间件服务层进行响应;中间服务层通过调用设备sp服务层完成响应,设备sp服务层将执行结果返回至中间件服务层,进而中间服务层将执行结果发送至前端定制服务层;
10.前端定制服务层将执行结果返回浏览器扩展层,浏览器扩展层将执行结果传送至浏览器页面。
11.进一步地,所述浏览器扩展层将浏览器调用外设接口调用请求转换成websocket通信报文发送前端定制服务层,具体包括:
12.浏览器业务流程中调用外设接口,并将外设接口转成统一通用型外设调用接口;
13.浏览器扩展扩展层重构实现统一通用型外设调用接口,并将接口转换成websocket通信报文,并发送给前端定制服务层。
14.进一步地,所述前端定制服务层对websocket通信报文进行解析,根据解析结果执行对应的接口调用策略,具体包括:
15.前端定制服务层中定制websocket服务加载逻辑处理库,并且调用逻辑处理库的插件初始化函数,将回调函数指针作为初始化函数的输入参数传入;
16.前端定制服务层中定制websocket服务将收到的websocket通信报文进行解析,转换为对逻辑处理库的任务发送接口的调用;
17.逻辑处理库接收调用请求后,通过查询本库内的本地方法map,若查询到本地方法,则采用本地api调用策略;若未查询到,则将接口调用转换为http报文调用,执行同步调用策略或者异步调用策略。
18.进一步地,本地api调用策略执行过程包括:
19.前端定制服务层中的逻辑处理库对第三方sdk或系统接口进行加载调用;
20.前端定制服务层的逻辑处理库将sdk或系统接口的调用结果转换为回调函数输入参数,回调到定制websocket服务,通过websocket通信返回给浏览器扩展层。
21.进一步地,同步调用策略执行过程包括:
22.中间件服务层根据输入参数中的devid和funcname判定,将http报文转换输入到devid对应模块的任务队列,并添加全局递增的repid参数;
23.devid对应模块进程从输入任务队列中获取任务,开线程处理,对入参的异步标志进行判定,当其值为0,调用设备sp服务层的同步接口;
24.设备sp服务层通过u口或串口完成对设备模块的调用,向中间件服务层返回执行结果和输出参数;
25.中间件服务层将设备sp服务层的执行结果和输出参数添加到输出队列,保存前面传入的repid参数;
26.中间件服务层从输出队列获取任务,转换为http所需json报文;
27.中间件服务层通过http服务,将任务执行结果返回给前端定制层中的逻辑处理库。
28.进一步地,异步调用策略执行过程包括:
29.中间件服务层根据输入参数中的devid和funcname判定,将http报文转换输入到devid对应模块的任务队列,并添加全局递增的repid参数;
30.每个模块进程中循环从输入任务队列中获取任务,开启线程处理,根据入参中的同异步标志参数进行判定,当其值为1,则调用设备sp服务层的异步接口,若调用失败,则设备sp服务层在接口执行过程中产生的过程事件和执行完成的异步完成事件,通过定制socket通信上传到中间件服务层;否则设备sp服务层通过u口或串口完成对设备模块的调用;
31.中间件服务层将事件名称和参数添加到输出队列,并且固定repid为-1;
32.中间件服务层从输出队列获取job,判定repid为-1时,则将该job转换为websocket报文;
33.中间件服务层通过websocket服务,将任务执行结果和过程事件返回给前端定制服务层中的逻辑处理库。
34.进一步地,所述前端定制服务层将执行结果返回浏览器扩展层;浏览器扩展层将执行结果传送至浏览器页面,具体包括:
35.前端定制服务层的websocket服务对回调函数进行处理:将输入参数转换为websocket报文,将此报文作为输入参数,执行方法method参数固定为执行js方法,并发送给websocket客户端;
36.在浏览器扩展层中将接收到的websocket报文根据method参数进行分类处理;
37.在浏览器扩展层中,若method参数为执行js方法时,则直接对参数进行js执行,即在script区域执行全局消息回应方法,将结果传达到浏览器页面;否则根据不同的method参数,在浏览器扩展层直接实现,将结果传达到浏览器页面。
38.第二方面,本发明提供了一种基于浏览器扩展插件的信创无感迁移系统,包括:
39.前端应用模块、前端定制服务层模块、中间件服务层模块、设备sp服务层模块;
40.所述前端应用模块用于前端应用浏览器启动,加载浏览器扩展层;浏览器扩展层将各业务组件的所有外设调用请求通过websocket通信模块发送前端定制服务层;浏览器扩展层将执行结果传送至前端应用浏览器页面;
41.所述前端定制服务层模块用于将前端定制服务层接收到的调用请求进行接口解析,采用接口调用策略获取执行结果,并将执行结果返回浏览器扩展层;其中所述接口类型包括同步外设接口、异步外设接口、本地api接口;所述接口调用策略包括同步调用策略、异步调用策略、本地api调用策略;
42.所述中间件服务层模块用于根据前端定制服务层解析结果采用同步调用策略或者异步调用策略调用进行响应;并调用设备sp服务层完成响应,并将返回至中间件服务层的响应执行结果发送至前端定制服务层;
43.所述设备sp服务层模块用于通过sp的api接口收到的应用层指令,将应用指令转化为sp执行指令,通过u口和串口完成设备具体操作,并返回执行结果的服务程序至中间件服务层。
44.进一步地,所述前端定制服务层与所述中间件服务层采用本机http通信完成同步、异步接口调用和同步结果返回,采用本机websocket通信完成异步执行结果、过程事件的消息传输;所述浏览器扩展层与所述前端定制服务层采用本机websocket通信完成消息传递。
45.第三方面,本发明提供了一种计算机可读存储介质,其存储有计算机程序,所述计
算机程序被处理器执行时实现如上述基于浏览器扩展插件的信创无感迁移方法的步骤。
46.有益效果
47.本发明提供了一种基于浏览器扩展插件的信创无感迁移方法、系统及介质,利用浏览器插件的高嵌入性和linux服务高扩展性,实现了应用代码不做任何改造,即可实现前端应用系统的信创迁移,极大的缩短了信创迁移时间、减少了信创迁移工作量和工作难度,真正实现了信创无感迁移。
附图说明
48.图1是本发明实施案例提供的原windows系统架构图;
49.图2是本发明实施案例提供的跨系统前端业务平台整体示意图;
50.图3是本发明实施例提供的同步外设接口时序图;
51.图4是本发明实施例提供的异步外设接口时序图;
52.图5是本发明实施例提供的本地api接口调用时序图;
53.图6是本发明提供的实施示例时序图。
具体实施方式
54.针对如何在前端应用零改动的情况下实现前端应用的信创迁移,且还可使两个进程间的消息通信具备快速、稳定、高解耦的特点。下面结合实施例针对同步外设接口、异步外设接口、本地api接口的实现方法做进一步的说明。
55.本发明主要基于chromium浏览器进行阐述,但是其他常见浏览器,如chrome、firefox也能支持。本方案中的自循环网络通信也就是本机网络通信采用的通信ip为固定的127.0.01,数据从本机发送协议栈直接传输到接收协议栈,用于两个进程间的消息通信。本实施例使用两个本机websocket通信和http通信:浏览器扩展层与前端定制服务层采用本机websocket通信完成所有消息传递;而前端定制服务层与中间件服务层之间采取本机http通信完成同、异步接口调用和同步结果返回,采用本机websocket通信完成异步执行结果、过程事件的消息传输。
56.本发明包括浏览器扩展层、前端定制服务层、中间件服务层、设备sp服务层。
57.浏览器扩展层:浏览器扩展层负责将浏览器外设调用(包括但不限于同步调用、异步调用、本地api调用)请求,通过window全局对象转换为浏览器扩展层的通道函数调用,同时在浏览器扩展层对原外设调用通道接口进行了函数重构,在此重构函数中将外设接口调用转换为websocket通信报文,发给前端定制服务层进行实现。最后通过websocket通信接收响应函数将定制服务执行结果转换为js执行参数,通过执行js命令回调到浏览器扩展层。
58.前端定制服务层:前端定制服务层分为两部分,其中websocket服务作为进程和通信主体,完成websocket通信、报文到接口调用转换。逻辑处理库作为逻辑处理主体,向上提供了两类方法,一类是前台定制服务日志记录的接口,这类接口功能和设计都比较单一;另外一类就是功能化消息接口,如插件初始化接口、插件消息发送接口。逻辑处理库的插件消息发送接口会将所有外设调用转为http通信报文,接口执行结果或过程事件通过此http或者另外的websocket通信返回。
59.中间件服务层:外设服务作为处理所有自助设备外设模块的调用处理服务,采取独立通信服务进程、各模块子服务进程、全局双端队列等方式实现了多并发、高解耦等功能特性,完成了包括但不限于密码键盘、读卡器、凭条打印机等模块在内的功能接口提供,并且提供了与定制服务层中的通信的http、websocket服务及报文处理转换等功能。
60.设备sp服务层:通过sp的api接口收到的应用层指令,将应用指令转化为sp执行命令,通过u口和串口完成设备具体操作;并根据中间件服务层中同步调用、异步调用方式差异,针对性返回执行结果、过程事件。
61.实施例1
62.如图2、3所示,当接口为同步外设接口时,采用同步调用策略的具体实现步骤如下:
63.步骤1:浏览器启动时,加载浏览器扩展层,如extension.js。
64.步骤2:浏览器业务流程中调用外设同步接口,如二代证读取模块的模块状态查询;并将外设接口调用转成统一通用型外设调用接口。
65.步骤3:浏览器扩展层重构实现统一通用型外设调用接口,并将接口转换成websocket通信报文。
66.步骤4:进行websocket消息发送:发送失败,则执行步骤16;否则执行步骤5。
67.步骤5:前端定制服务层中定制websocket服务加载逻辑处理库,并且调用逻辑处理库的插件初始化函数,将回调函数指针作为初始化函数的输入参数传入。
68.步骤6:前端定制服务层中定制websocket服务将收到的通信报文进行解析,转换为对逻辑处理库的任务发送接口的调用,若调用失败则调用回调函数即执行步骤14,否则执行步骤7。
69.步骤7:前端定制服务层中的逻辑处理库接收调用请求后,通过查询本库内的本地方法map(stl关联容器):若未查询到,则将接口调用转换为http报文调用,http发送失败则接口直接返回失败;否则进行步骤8。
70.步骤8:中间件服务层根据输入参数中的devid和funcname判定,将http报文转换输入到devid对应模块的任务队列,并添加全局递增的repid参数;若参数不合法则直接执行步骤13,否则执行步骤9。
71.步骤9:devid对应模块进程从输入任务队列中获取任务,开线程处理,对输入参数的异步标志进行判定,当异步标志的值为0,调用设备sp服务层的同步接口,若调用失败直接执行步骤11,若调用成功进行步骤10。
72.步骤10:设备sp服务层通过u口或串口完成对设备模块的调用,向中间件服务层返回执行结果和输出参数。
73.步骤11:中间件服务层将设备sp服务层的执行结果和输出参数添加到输出队列,若执行失败则只返回执行结果,并保存步骤8传入的repid参数。
74.步骤12:中间件服务层从输出队列获取任务,转换为http所需json报文。
75.步骤13:中间件服务层通过http服务,将任务执行结果返回给前端定制服务层中的逻辑处理库。
76.步骤14:前端定制服务层中的逻辑处理库将http报文转换为回调函数的输入参数,参数重组为func("+retdata+")形式,进行回调函数调用。
77.步骤15:前端定制服务层中的定制websocket服务对回调函数进行处理:将输入参数转换为websocket报文,将此报文作为输入参数,执行方法method参数固定为执行js方法(如runjs),并发送给websocket客户端。
78.步骤16:在浏览器扩展层中将接收到的websocket报文根据method参数进行分类处理。
79.步骤17:在浏览器扩展层中,method参数为执行js方法(如runjs)时,则直接对参数进行js执行,即在script区域执行全局消息回应方法,将结果传达到前端应用浏览器页面。
80.实施例2
81.如图2、4所示,当接口为异步外设接口时,采用异步调用策略的具体实现步骤如下:
82.步骤1:浏览器启动时,加载浏览器扩展层,如extension.js。
83.步骤2:浏览器业务流程中调用外设异步接口,如二代证读取模块的插证读证;并将外设接口调用转成统一通用型外设调用接口。
84.步骤3:浏览器扩展层重构实现统一通用型外设调用接口,并将接口转换成websocket通信报文。
85.步骤4:进行websocket消息发送:若发送失败,则执行步骤16;否则执行步骤5。
86.步骤5:前端定制服务层中的定制websocket服务加载逻辑处理库,并且调用逻辑处理库的插件初始化函数,将回调函数指针作为初始化函数的输入参数传入。
87.步骤6:前端定制服务层中的定制逻辑处理库建立与中间件服务层的websocket长链接,供中间件服务层异步完成事件和过程事件上送。
88.步骤7:前端定制服务层中的websocket服务将收到的通信报文进行解析,转换为对逻辑处理库的任务发送接口的调用,若调用失败则调用回调函数即执行步骤14,否则执行步骤8。
89.步骤8:前端定制服务层中的逻辑处理库接收调用请求后,通过查询本库内的本地方法map(stl关联容器),若未查询到,则将接口调用转换为http报文调用。若http发送失败则接口直接返回失败,否则进行步骤9。
90.步骤9:中间件服务层根据输入参数中的devid和funcname判定,将http报文转换输入到devid对应模块的任务队列,并添加全局递增的repid参数;若参数不合法则直接执行步骤13,否则执行步骤10。
91.步骤10:每个模块进程中循环从输入任务队列中获取任务,开启线程处理,根据输入参数中的同异步标志参数进行判定,当其值为1,则调用sp的异步接口,调用失败的直接执行步骤12,否则进行步骤11。
92.步骤11:设备sp服务层通过u或串口完成对设备模块的调用。
93.步骤12:设备sp服务层在接口执行过程中产生的过程事件(如证件插入事件cardinsert)和执行完成的异步完成事件,通过定制socket通信上传到中间件服务层。
94.步骤13:中间件服务层将事件名称和参数添加到输出队列,并且固定repid为-1。
95.步骤14:中间件服务层从输出队列获取任务,判定repid为-1时,则将该任务转换为websocket报文。
96.步骤15:中间件服务层通过websocket通信服务,将任务执行结果和过程事件返回给前端定制服务层中的逻辑处理库。
97.步骤16:前端定制服务层中的逻辑处理库将websocket报文转换为回调的输入参数,输入参数重组为eventname"("+retdata+");"形式,并调用回调函数。
98.步骤17:前端定制服务层中的定制websocket通信对回调函数进行实现:将输入参数转换为websocket报文,将此报文作为输入参数,执行方法method参数固定为执行js方法(如runjs),并发送给客户端。
99.步骤18:在浏览器扩展层将接收到的websocket报文根据method参数进行分类处理。
100.步骤19:在浏览器扩展层中,method参数为js方法的执行函数(如runjs),则直接执行页面预先定义好的eventname函数,将异步完成结果或者过程事件传达到浏览器页面。
101.实施例3
102.如图2、5所示,当接口为本地api接口时,采用本地api调用策略的具体实现步骤如下:
103.步骤1:浏览器启动时,加载浏览器扩展层,如extension.js。
104.步骤2:浏览器业务流程中调用外设本地api接口,如输入法软键盘、pdf显示等接口,并将外设接口调用转成统一通用型外设调用接口。
105.步骤3:浏览器扩展层对本地方法进行分类,若js层有可实现的方法(如pdf显示、返回首页等),执行步骤13,否则执行步骤4。
106.步骤4:对依赖第三方插件的接口,在浏览器扩展层重构实现通用外设调用接口,并将其转换成websocket通信报文。
107.步骤5:浏览器扩展层发送websocket通信报文,若发送失败,则执行步骤13;否则执行步骤5。
108.步骤6:前端定制服务层中的定制websocket服务加载逻辑处理库,调用插件初始化函数,将回调函数指针作为初始化函数的输入参数传入逻辑处理库。
109.步骤7:前端定制服务层中的逻辑处理库接收调用请求后,通过查询本库内的本地方法map(stl关联容器),查询到该方法后,进行步骤8,否则自动进入到通用同、异步接口调用流程。
110.步骤8:前端定制服务层中的逻辑处理库对第三方sdk或系统接口进行加载调用。
111.步骤9:前端定制服务层中的逻辑处理库将步骤8的调用结果转换为回调函数的输入参数,输入参数重组为类似func("+retdata+")形式,进行回调函数调用。
112.步骤10:前端定制服务层中的定制websocket通信对回调函数进行实现:将输入参数转换为websocket报文,将此报文作为输入参数,执行方法method参数固定为执行js方法(如runjs),并发送给客户端。
113.步骤11:在浏览器扩展层中将接收到的websocket报文根据method参数进行分类处理。
114.步骤12:在浏览器扩展层中,method参数为执行js方法时,则直接对参数进行js执行,也就是在script区域执行全局消息回应方法,将结果传达到页面;否则根据不同的method参数,在浏览器扩展层中直接实现,将结果传达到页面。
115.实施例4
116.本实施例提供了一种基于浏览器扩展插件的信创无感迁移系统,包括:
117.前端应用模块、前端定制服务层模块、中间件服务层模块、设备sp服务层模块;
118.所述前端应用模块用于前端应用浏览器启动,加载浏览器扩展层;浏览器扩展层将各业务组件的所有外设调用请求通过websocket通信模块发送前端定制服务层;浏览器扩展层将执行结果传达至前端应用浏览器页面;
119.所述前端定制服务层模块用于将前端定制服务层接收到的调用请求进行接口解析,采用接口调用策略获取执行结果,并将执行结果返回浏览器扩展层;其中所述接口包括同步外设接口、异步外设接口、本地api接口;所述接口调用策略包括同步接口调用策略、异步接口调用策略、本地api接口调用策略;
120.所述中间件服务层模块用于根据前端定制服务层解析结果采用同步调用策略或者异步调用策略进行响应;并调用设备sp服务层完成响应,并将返回至中间件服务层的响应执行结果发送至前端定制服务层;
121.所述设备sp服务层模块用于通过sp的api接口收到的应用层指令,将应用指令转化为sp执行指令,通过u口和串口完成设备具体操作,并返回执行结果的服务程序至中间件服务层。
122.本实施例中的同步调用策略、异步调用策略、本地api调用策略分别与实施例1、实施例2、实施例3相同,由此不再进行赘述。
123.实施例5
124.本发明提供的一种可读存储介质,存储了计算机程序,所述计算机程序被处理器调用以执行:所述基于浏览器扩展插件的信创无感迁移方法的步骤。
125.具体各个步骤的实现过程请参照前述方法描述,本发明在此不再赘述。
126.应当理解,在本发明实施例中,所称处理器可以是中央处理单元(central processing unit,cpu),该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field-programmable gatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。存储器可以包括只读存储器和随机存取存储器,并向处理器提供指令和数据。存储器的一部分还可以包括非易失性随机存取存储器。例如,存储器还可以存储设备类型的信息。
127.所述可读存储介质为计算机可读存储介质,其可以是前述任一实施例所述的控制器的内部存储单元,例如控制器的硬盘或内存。所述可读存储介质也可以是所述控制器的外部存储设备,例如所述控制器上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。进一步地,所述可读存储介质还可以既包括所述控制器的内部存储单元也包括外部存储设备。所述可读存储介质用于存储所述计算机程序以及所述控制器所需的其他程序和数据。所述可读存储介质还可以用于暂时地存储已经输出或者将要输出的数据。
128.基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在
一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的可读存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccess memory)、磁碟或者光盘等各种可以存储程序代码的介质。
129.如图6所示,本发明能够适用所有业务逻辑采用html+js实现的前端业务系统的信创改造需求,且其支撑前端服务和中间件服务采用c++和python混合方式,能在全系windows系统、linux系统上运行。采用多端输入队列、单端输出队列的方案,对输入命令执行、输出结果发送进行排队和线程化处理,以实现整体方案的并发响应支持:即每个外设模块根据模块名创建独立的进程和输入队列,确保不同模块的指令可以并发调用。而同一个模块的不同命令采用不同repid进行区分,并且通过中间件库将对sp的调用均转换为异步调用,以去除sp管理器的单通道束缚;而异步事件则直接通过唯一的事件名称进行区分。利用浏览器插件的高嵌入性和linux服务高扩展性,实现了应用代码不做任何改造,即可实现前端应用系统的信创迁移,极大的缩短了信创迁移时间、减少了信创迁移工作量和工作难度,真正实现了信创无感迁移。基于pisa(windows下兼容wosa-xfs)规范完成对外设的调用,能够兼容多个设备厂商;可以完成对政务、税务、交通等领域外设的兼容,并且适用于windows和linux等多种操作系统。
130.以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1