赞
踩
摘 要:随着市场经济的迅速发展伴随着人民生活条件的极大提高,人们渐渐开始养宠物使得丰富他们的空暇时间,而宠物的看病就医以及常规护理就成为了当前庞大养宠人士的迫切所需,于是宠物医院便应运而生。每个宠物医院都应该拥有一个专业信息系统,必须满足操作流程便捷和功能完备等基本条件,才能使客户安心满意的处理自己宠物的健康问题。
本系统大体分为医生和系统管理员两个方面。面向医生用户提供在线注册并登录、查看就诊记录、查看美容造型记录等功能,面向系统管理员用户提供所有医生信息、权限、岗位管理等功能,当宠物医院配套本系统并逐渐稳定后,能够极大的提升医生和各岗位员工在相同工时下的效率,也满足了现如今各宠物医院在信息管理上的需求。
关键词:Spring;MySQL;宠物医院
近年来,由于市场经济的迅速发展也伴随着人民生活条件的极大提高。在闲暇时间,人们渐渐开始养宠物使得丰富他们的空暇时间。在越来越重视宠物猫、宠物犬的趋势下,对宠物的健康居民生存水平的关注度也逐渐提高,其中宠物医院就占有重要的一环。每个宠物医院都应该拥有一个专业信息系统,适用于具有齐全功能和便利操作过程的宠物医院系统,对医生及院方保存并处理多种宠物的不同医疗信息进行集中化管理,可以更好的实现业务升级以满足消费者对爱宠服务的不同要求。
作为行业先驱,波奇宠物最早开始投入到宠物信息软件的建设中,并以中大型宠物医院的客户为主体。在当前形势下,波奇宠物软件已经涵盖了全国一千多家线下宠物医院。据统计,2021年的宠物医院数量已经达到12000多家,相比于去年的宠物医院市场增长了近12%,在目标客户的整体架构中,减去一些零散的大型连锁宠物医院,这些医院都使用自己内部的信息系统,其余客户中的50%-80%都是波奇宠物公司的主要客户来源,行业前景不容小觑。
波奇宠物公司领先于行业,带头进行宠物医院信息系统的研发工作,当时国内大部分的宠物医院并没有线上信息系统,大多数记录信息都是使用传统的书面编写,这样管理数据的方式不仅十分低下,而且十分耗费人力资源,部分小型宠物医疗机构会使用Office工具来进行数据存储和管理,比如Excel,但是当面对数据量剧增的情况时,也会耗费大量的人力资源。部分规模稍大的医院,在数据统计管理方面也没有一个真正高效的长期规划,由此催生出了巨大的市场机遇,波奇宠物公司在历经半年研发与不断的版本迭代之后,正式上线了波奇宠物医院数据化系统,最开始推广到小型医院试运作,逐步演进到中大型医院为主要客户,系统也不断更新迭代,最终涵盖了宠物食物、宠物用药管理、内部员工管理、库存管理等多条产业链布局,逐步打造成为了中国宠物行业领先的信息系统。
波奇宠物预计到2025年规模扩散到到全国2000家宠物医院,客户医院的服务质量提升首当其冲。按区域密度布局安插专业的项目开发和项目实施,方便各宠物医院的全体员工能快速上手并熟练掌握此信息系统,并且此后负责系统的日常维护以及新型功能开发等各种需求。中小规模的宠物医院相对来讲缺乏优势,因为一众大医院掌握了业内的人才来源市场以及最优的行业咨询人力,优势也显露在管理能力和经济能力等要素之上,因此,行业内市场快速的被规模稍大的宠物连锁医院所占据,而中小规模医院想要脱颖而出就体现在了飞速发展的信息系统之上。
MySQL作为首个众多数据库中为数不多的开源数据库,其核心引擎默认为InnoDB存储引擎,且具有行级锁加锁、外键、MVCC等MyIsam引擎不具备的功能,支持事务ACID原则,本系统基于MySQL8.0和数据管理软件Navicat实现对信息系统数据的统一管理。
IntelliJ IDEA简称IDEA,是由JetBrain公司研发的高度集成化的Java开发环境,作为现如今开发Java的最热门软件,IDEA提供了快速构建语句、智能提示、自动补全等功能,并集成SVN、Git等版本控制工具,提供丰富多样的插件市场,这种高度智能、高度定制化的工具极大提高了程序员开发效率,并降低了一定程度上Java学习和使用的门槛。本系统采用的是IDEA 2021.2.3版本,该版本重新设计了Maven配置,并且开始支持远程开发。
MyBatis作为数据、实体之间的映射器,作用在MVC架构中的持久层,为驱动连接的数据表中指定的字段和实体类对象创建映射关系。MyBatis的内部对jdbc进行了高度二次封装,应用原生的connection加载数据库连接和创建statement对象的功能,对sql数据进行了MyBatis式的封装操作,使sql从传统的JDBC式封装后的冗杂代码中脱离出来,同时也能极大程度防止sql注入等问题。并且可以使用xml或注解的方式将要执行的各种statement连接起来(本系统使用xml形式),然后操作实体java对象的各个属性,与数据库的对应字段做连接映射,最终通过映射好的resultMap等形式把执行sql语句得到的结果封装并返回。
Spring框架是Java应用可以分层使用的框架,开源且作用于全栈,并在足够轻量级的使用之下,涵盖了功能强大的面向切面和自动注入依赖关系等功能[2]。Spring在其基础上衍生出了SpringBoot等框架,其根本意义也是对Spring的二次扩展,提供了脚手架式的快速开发。本系统后端主要就是基于Spring框架以及其扩展框架来实现的。
Vue框架是可以快速构筑前端功能模块的渐进式框架。它是建立于原生HTML5、CSS3的基础,使得开发者可以对前端页面开发快速上手。提供了脚手架式开发和快速入门级别的API,还可以通过全局配置文件更好的导入其他前端框架。前端引入了Element框架作为页面的主题结构,结合axios框架实现和后台接口的访问,从而进行前后端数据的交互。
分析本系统在开发需要花费的人力、财力以及对代码的编写、优化等能力,目的就是通过最小的代价并且在短时间内确保所有问题都能够解决,保证开发宠物医院信息系统的顺利。
本系统使用了MySQL关系式数据库为基础数据库,并搭配了Redis内存数据库作为缓存管理和验证码使用,将二者结合以管理全部数据,Vue 配合其他框架用来实现前端页面,后端则采用SpringMVC、Spring、MyBatis,使用简单且学习成本低,它的灵活和扩展性有口皆碑。Java版本使用 Jdk1.8.0。其次,本人也参加了相关知识的专业培训,可熟练使用 Idea、Ecplise、VSCODE等常用的开发软件。因此,本系统的技术上是可行的。
本系统硬件设备是在原来的服务器并且连通局域网之后的基础上,把尽可能多的功能点展示在首页上,通过大量的SQL语句和业务逻辑的优化处理,增强了系统同时查询的并发量,突破了时间以及地域等方面的种种限制。其次,该系统所需的工具和框架没都是免费且开源的,没有额外的硬件和软件投入,因此该系统的开发成本低,还可以大大提高数据管理效率。
此系统运作在本地Windows操作系统上,其他操作环境也使用,也无需其他环境和软件的额外安装,本身提供高度可视化的数据预览和页面的快速切换,专门定制化了不同状态码对应的错误界面,有了这些亮点的加持,操作变得行云流水。
对于系统所管理的海量复杂数据,还应该单独考虑针对角色绑定的权限。因此,本系统根据业务需求大体分为医生层面和系统管理员层面。
医生通过侧边栏能够查看到自己权限所及的功能点,将几种最常使用的数据作为新模块单独处理。在用户管理界面,医生可以查看到本医院所有岗位的员工信息。在病例管理界面,作为全宠物医院系统的核心要点,为医生和管理员用户提供全部宠物病例数据的展示,并且可以定制展示的列内容。
本系统提供了最基本的用户注册登录模块。任何人都可以注册并登录,但是普通用户仅拥有主页的查看权限,无法对其他内容做出修改。用户的权限需要系统管理员通过岗位管理来给以及存在数据库的用户数据手动添加,如果给了普通用户医生岗位,他才能拥有对医生的权限,否则只有主界面一栏,基于了医生岗位的用户同时拥有个人中心模块,涵盖了基本信息的设置并修改,也涵盖重新上传头像、修改用户手机号、修改邮箱等等。
系统管理员属于一众角色中的最高权限持有者,且系统管理员的账号不能被删除。登录系统后,拥有所有数据的管理权限,通过侧边栏可以快速定位到对医生、病例、造型等数据的管理页面。系统管理具备的数据操作权限也包括基础的增删改查、批量删除、Excel格式的导入和导出等功能。
管理员还可以通过本系统的公告管理,来对所有人发起公告或通知,还支持公告的撤回。发出公告后,所有岗位角色在登录本系统后即可在公告通知栏中查看到新发布的公告信息,在极大的增加了宠物医院各员工之间的沟通效率。
本系统采用两个主模块作为核心来展开不同的数据权限并对应不同的实际功能点,图3-1表示了系统的基本组成结构。
图3-1 系统结构图
系统管理员下放权限给各级员工。一般来说,非admin用户只涵盖数据的查询和全部展示权限,对于此处的医生用户,系统管理员则根据职责分配部分数据的添加权限和本人已添加数据的修改权限。
在表设计阶段就应该对多表链接有一个总体的把握,比如用户表中的医生在添加病例信息时,病例表就有相关字段doctor来存储负责该宠物病例的主治医生id,美容造型信息表也是如此。但是,在这个系统中,多表链接并没有采用数据库外键,主要是考虑到工作量和性能原因,所以通过给两两相互链接的表添加额外的中间表,用来存储其主键字段的对应关系,从而把这个问题引入到了代码层面来考虑。图4-1即为医院系统涉及数据字段的ER图。
图4-1 数据库信息E-R图
用户信息表主要存储在本系统上注册的所有用户的详细数据,涉及到用户的多方面,其中有固定到系统数据库方面的身份认证信息和自定义信息,包括:昵称、系统登录名、系统登录密码等信息,在左侧用户管理栏即可查看用户表的相关数据信息,删除并不是真正的数据删除,而是sys_user数据表字段del_flag来控制。用户user表结构如表4-2所示。
表4-2 用户信息表(sys_user)
字段名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
userId | 用户的主键ID | bigint | 主键 | 0 |
userName | 登录时的用户名 | varchar | 无 | 30 |
password | 登录时的密码 | varchar | 无 | 100 |
nickName | 登录后显示的昵称 | varchar | 无 | 30 |
本系统两大模块的细分数据就在岗位信息表中,详细存储了宠物医院各岗位的基本描述信息以及所拥有的各项基本权限,岗位id还作为其他表的关联外键作用在根据医生岗位和美容师岗位查询关联用户表数据上。岗位post表的基本数据如表4-3所示。
表4-3 岗位信息表(sys_post)
字段名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
postId | 岗位的主键ID | bigint | 主键 | 0 |
postCode | 岗位对应编码 | varchar | 无 | 64 |
postName | 岗位名称 | varchar | 无 | 50 |
createBy | 创建人 | varchar | 无 | 64 |
createTime | 创建时间 | datetime | 无 | 0 |
每条病例数据都涵盖了就诊宠物、医生、宠物饲养人三者的简要数据,为建立多表链接打基础,case病例表详细字段如表4-4所示。
表4-4 病例信息表(pet_case)
字段名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
id | 病例表主键id | bigint | 主键 | 0 |
evaluation | 医嘱文本信息 | varchar | 无 | 255 |
doctor | 关联的主治医生 | bigint | 无 | 0 |
cpTime | 宠物的治疗时间 | datetime | 无 | 0 |
petName | 宠物的名称 | varchar | 无 | 20 |
petType | 宠物种类 | varchar | 无 | 20 |
age | 年龄 | int | 无 | 0 |
detail | 病情描述文本信息 | varchar | 无 | 255 |
phone | 主人手机号 | bigint | 无 | 0 |
masterName | 主人姓名 | varchar | 无 | 20 |
美容造型信息表是面向造型管理的记录数据表,表结构如表4-5所示。
表4-5 美容造型信息表(pet_model)
字段名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
id | 美容造型主键id | bigint | 主键 | 0 |
masterName | 主人姓名 | varchar | 无 | 20 |
petName | 宠物的名称 | varchar | 无 | 20 |
doctor | 关联的主治医生 | bigint | 无 | 0 |
petShape | 美容造型项目 | varchar | 无 | 20 |
cpTime | 美容造型处理时间 | varchar | 无 | 0 |
角色信息表主要用来保存本系统不同角色的基本信息,主系统的核心就是用角色来区分不同的权限,角色表的字段有:角色ID、角色名称、角色权限标识符、删除标识符、备注、角色状态等角色相关信息。角色role表基本数据如表4-6所示。
表4-6 角色信息表(sys_role)
字段名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
roleId | 角色的主键id | bigint | 主键 | 0 |
roleKey | 角色权限标识符 | int | 无 | 100 |
roleName | 角色名称 | varchar | 无 | 30 |
status | 角色状态 | char | 无 | 1 |
delFlag | 删除标识符 | char | 无 | 1 |
remark | 备注文本信息 | varchar | 无 | 255 |
菜单信息表主要是保存所有已注册且申请Vue路由资源的所有菜单列表,通过parentId字段来进行子父级菜单关系的展示。主要表字段有:菜单id、菜单名、作为父级的菜单主id、路由地址、菜单的类型、菜单权限标识、菜单的Icon地址等。菜单menu表如表4-7所示。
表4-7 菜单信息表(sys_menu)
列名 | 注释说明 | 数据类型 | 键类型 | 长度(字节) |
menuId | 菜单主键id | bigint | 主键 | 0 |
menuName | 菜单名 | varchar | 无 | 50 |
status | 菜单状态 | char | 无 | 1 |
parentId | 父菜单id | bigint | 无 | 0 |
path | router地址 | varchar | 无 | 200 |
menuType | 菜单的类型标识 | char | 无 | 1 |
perms | 权限标识 | varchar | 无 | 100 |
icon | el图标名称 | varchar | 无 | 10 |
登录背景选用一只可爱的宠物猫作为背景,不仅起标识该医院的作用,更给访问者一种眼前一亮的感觉。图 5-1为登录界面展示。
首先需要填写登录名,登录密码和验证码。点击登录之后会根据输入的验证码和redis中存放的验证码正确答案对比,如果失败会提示验证码错误,验证码正确之后将用户填好的登录名和登录密码作为访问接口的参数访问后端控制层,控制层再调用对应方法到业务层最终到MySQL数据库中查询sys_user表中的数据并比对,如果填写的登录账号和密码都准确无误,且经过校验通过,即可在正确响应时间内跳转到系统主页面,不然就会跳出提示框dialog提示:当前用户输入的用户名称不存在或者密码错误,无法通过请重试。
图5-1 登录界面
宠物医院系统的用户注册功能,为新入职的医院员工创建系统账号,图 5-2为注册界面展示。
注册功能需要根据校验定义的规则输入用户名、密码、二次确认密码、算数验证码,填写完成之后,没有必填项为空的情况,再点击注册Button,系统会根据当前用户填写的验证码信息到redis中做正确判断,验证码正确通过之后,根据当前用户所填写的用户名,先检索MySQL数据库中的sys_user表中的user_name字段是否有重复一致的数据,如果没有,则表示这个用户名之前没有人用过,校验密码长度并与规定的比对,并且保证确认密码和首次密码的两次输入结果相同,如果以上都通过,则提示注册成功,随后在正确响应时间内自动跳转到真实系统主界面,图5-3展示了注册成功界面。
图5-2 注册界面
图5-3 注册成功界面
首页展示宠物医院岗位人员数量的柱状图,且根据数据变动而实时变化,首页还显示管理员或所有医生在该系统中添加的宠物病例的宠物类型分布饼状图,直观的了解到该医院治疗的宠物类型分布。图 5-4 表示了系统首页的基本概况。
首页的制作是基于Vue的组件式模块开发,柱状图、饼状图等模型都作为了vue的组件注册在index.js中,将他们注册到全局路由中,再引入主页的index.vue中加以展示,图中的数据是通过前端发起request请求传递url到后端对应的接口,接口再层层递进到数据层通过mybatis访问数据库,然后把从MySQL中查到的数据封装成echarts图表所需的数据格式返回给前端,从而完成首页echarts图表的信息展示。
图5-4 首页界面
管理员在用户一栏可以查看到已注册用户的可选项数据,包括新增用户,修改、删除用户数据,也支持批量删除功能,通过mybatis提供的分页插件pageHelper进行大批量数据的截取分页,还可以给数据查询添加已有字段的条件,支持用户名称、手机号码、精确到日的日期等条件的查询功能。其主要代码如下。
//父类BaseController中的分页方法,用来初始化分页参数
startPage();
//调用业务层方法传递查询参数对象,返回所有的user对象的list
List<SysUser> list = userService.selectUserList(user);
//使用TableDataInfo类的对象对查到的list数据做封装处理后返回给前端
return getDataTable(list);
图 5-5 用户管理
给管理员针对所有数据信息都添加Excel模式的导入导出功能,这里在手动点击添加的基础上,更快速的实现数据的大批量添加或更新操作。代码层面实现该功能需要在实体类中的属性字段添加@Excel注解并在注解中定义参数name,指的是模板中的excel显示的列名称。导出功能的主要代码如下。
//导出功能先去查询得到当前系统所有的用户数据列表
List<SysUser> list = userService.selectUserList(user);
//定义实体类泛型的工具类ExcelUtil对象,传入实体类的类对象
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
//使用工具类定义的exportExcel方法将list数据源中的数据导入到excel表单
return util.exportExcel(response,list, "用户数据");
如图 5-6 所示数据导入功能。
图 5-6 数据导入
本系统提供公告功能方便管理员角色对普通用户角色发布公告消息,消息分为公告和通知两大类型,分别用不同的颜色来表示紧急程度,还可以对已经发出的公告进行修改或撤回操作,当普通用户角色登录系统,点击通知公告菜单一栏时,查看到系统管理员在对应日期发布的对应不同级别的公告通知,并且除系统管理员之外的所有用户只有查看的基本权限。图 5-7 表示公告页数据展示情况。
图5-7 系统公告
医生角色在输入用户名、密码和算术验证码并点击登录且通过数据校验之后跳转到医院系统首页。图 5-8 所示医生用户首页。该系统面向医生用户的主要的模块有用户数据查询、岗位数据查询、病例管理、美容管理、个人中心等。
图 5-8 医生用户首页
医生用户拥有对病例数据的基本功能权限。在点击新建按钮时,跳出Element组件的对话框dialog和众多text文本框,这里其实是在用户点击新增按钮时触发时间给el-dialog的visible属性设置为true,所以就弹出了设计好的新增按钮,当必填项数据填写好后,点击提交,会先进行字段的校验操作,如果校验通过[7],将当前医生用户填写的数据封装成一个病例实体类pet_case的对象传到后端然后执行sql插入语句,把新增数据持久化到MySQL数据库中。
当点击修改按钮时,click点击事件会接收当前修改所指向的行对象,然后再通过该对象的id向后端发起查询数据的请求,然后封装一个固定返回格式的对象,从而直接解析对象返回的数据到el-dialog的文本框中,实现修改功能数据的回显操作。然后指向修改操作,当修改完成后,点击确定后会判断当前el-dialog填写数据的form数据的id是否存在,如果遍历数据库查找,并不存在该id对应的用户数据,说明是新增操作,执行新增数据的相关逻辑。如果此id已经存在,说明是修改操作,要执行修改相关逻辑,此时在mybatis中编写的sql其实是将除id之外的所有的数据都重新set一遍,然后就实现了数据的修改功能。每次修改之后会主动将dialog组件的visible赋为false,关闭弹出框之后,刷新当前数据列表,图 5-9 表示病例管理详情数据。
图 5-9 病例管理详情
当点击删除按钮时,绑定的数据id将发送至后台,petCaseMapper.deletePetCaseById(id) 将 id 传入即可实现删除功能;当选中部分数据然后点击上面的批量删除时,前端会将所有的 id 传入后台,此时后台通过一个ids数组来接收批量删除的所有id数据,然后在mybatis中通过foreach标签实现对ids数组的批量删除操作。
医生用户还提供对宠物美容造型数据的管理权限,图 5-10 表示新增美容造型的弹出框。宠物造型数据统一存放在数据库的pet_model表中,而美容类型则通过系统的数据字典功能来维护。造型数据对应的美容师可以是医生也可以是美容师岗位,这里通过多表联查找出所有岗位为医生或美容师的用户数据,并把他们的名字回传到美容师的下拉框中,其中,美容类型和美容师为必填。
图5-10 美容造型数据添加页面
医生用户或其他用户可以通过点击右上角头像来进入个人中心来对个人的用户数据进行管理,图 5-11 表示个人中心页面。支持修改昵称、手机号、邮箱、性别、密码等数据。修改成功后的数据会在左侧的个人信息卡片中完全展示。
图5-11 个人中心页面
根据创建测试案例的功能设计了测试计划,模拟出医生用户、宠物造型、宠物病例三大模块在特定环境下呈现的诸多情况,并与预期结果作比较分析,即采取黑盒测试法。
对于持有岗位为主治医生的用户进行涵盖个人中心模块、美容造型模块、病例模块和登录模块的使用测试。医生相关测试结果如表6-1所示。
表6-1 医生功能测试表
编号 | 测试过程描述 | 测试结论概述 | 最终结果 |
PH_doc1 | 直接通过url访问系统主网站 | 未登录对应Cookie不存在,拒绝访问并刷新至登录页 | 与预期相符 |
PH_doc2 | 正确填写登录信息和验证码,点击登录 | 登录功能无异常,验证码有效 | 与预期相符 |
PH_doc3 | 点击左侧病例管理栏,查看本人的病例数据 | 能够根据登录人信息,正确检索到其管理的数据 | 与预期相符 |
PH_doc4 | 点击左侧造型管理栏,添加一条造型信息并关联自己 | 数据多表链接无异常,添加后在列表中立马看到新数据 | 与预期相符 |
PH_doc5 | 右上角点击头像进入个人中心,修改本人信息 | 本人数据正常显示,且修改后立即生效 | 与预期相符 |
对于持有超级管理员角色的系统用户进行涵盖病例模块、岗位模块、菜单模块的使用测试。测试结果如表6-2所示。
表6-2 管理员功能测试表
编号 | 测试过程描述 | 测试结论描述 | 最终结果 |
PH_adm1 | 登录后左侧呈现系统全部菜单栏 | admin最高权限生效 | 与预期相符 |
PH_adm2 | 进入病例模块,选中列表首列方框并点击删除 | 批量删除功能无异常,删除后自动刷新病例列表 | 与预期相符 |
PH_adm3 | 进入用户模块,赋予Doctor1角色为普通用户 | 赋权生效,且根据创建的角色在赋权时有不同选择项 | 与预期相符 |
PH_adm4 | 点击通知公告栏,发布程度为正常的红色加粗体文本信息 | 公告创建无异常,且根据程度等级列表项呈不同颜色 | 与预期相符 |
PH_adm5 | 点击菜单栏,修改病例管理可见状态为隐藏 | 菜单状态修改生效,刷新后病例一栏消失 | 与预期相符 |
分别结合医院的不同角色对应实际业务进行功能点测试,基本符合预期,但仍然发现3个开发层面的bug,其中一个是因为部分浏览器的兼容问题导致出现的情况,还有一个是查询时当显示多条数据时分页插件失去作用,原因是当查询显示数据时,没有调用分页查询数据列表的接口,导致数据传到前端时没有做分页处理,这里通过前端的ElementUI框架和Pagination分页插件实现了前端的分页效果,而后端分页是通过PageHelper结合持久层和sql内存级分页实现的。最后一个未通过用例是医生在病例管理功能页面查不到自己管理的病例数据,解决这个问题,需要在病例数据管理页面加载时做一个权限的判断,如果目前登录的用户非系统管理员[11],就把当前登录用户的id封装到对象中,带上此对象作为查询条件去数据库中查询对应id的病例数据,然后封装到JSON中,最后前端解析该数据显示到病例数据管理页面中,此时的数据就是当前登录用户医生所创建的病例数据。
在多轮测试之后,分析其中的问题,很多都是因为前期做需求分析时没有把所有的条件都分析到位,导致在系统设计编写代码时缺少部分业务逻辑的实现,导致最终呈现的结果和预期结果有出入,所以测试步骤不容小觑,在大范围的测试过程中一定要兼备各种数据情况的考量,这样才能最有效的达到测试最终的目的。
想要完整版本的可以点赞私聊加关注私聊作者获取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。