l
文章目录
-
-
- 一、 引言
- 二 、开放平台之管理平台
- 三 、技术架构
- 四 、编码规范
- 五、 编码顺序
- 六、 功能实现
-
- 6.1 客户管理
-
- 6.1.1 环境搭建,创建Maven项目(打包方式为war)及导入依赖
- 6.1.2 数据库配置文件
- 6.1.3 spring和mybatis相关配置文件
- 6.1.4 springMVC的配置文件
- 6.1.5 web.xml的配置
- 6.1.6 客户表的创建及pojo的创建
- 6.1.7 客户管理的Mapper
- 6.1.8 客户管理的service
- 6.1.9 创建CustomerController并测试Controller添加客户信息
- 6.1.10 index首页展示
- 6.1.11 编写customer.html页面
- 6.1.12 Customer的添加
- 6.1.13 删除客户信息
- 6.1.14 按条件查询
- 6.2 应用管理
- 6.3 登录功能
- 6.4 实现不同用户登录看到不同菜单 RBAC 基于角色的权限访问控制
-
一、 引言
1.1 开放平台介绍
开放平台(Open Platform) 在软件行业和网络中,开放平台是指软件系统通过公开其应用程序编程接口(API)或函数(function)来使外部的程序可以增加该软件系统的功能或使用该软件系统的资源,而不需要更改该软件系统的源代码。在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为就叫做Open API,提供开放API的平台本身就被称为开放平台。
1.2 开放平台的使用场景
企业要调用别人的长板,通过API技术,互相调用、与行业形成链接。在借助他人长板的同时,也把自己的长板贡献给他人,就是互相赋能。
开放平台的作用简单地说就是通过第三方的力量来扩展自己的生态和能力,因为光凭自己做的软件并不能覆盖所有的场景,例如阿里、京东可以提供标准化的应用软件,可能满足于一些小的卖家使用,但是数百万形形色色的卖家对于个性化要求的软件,并不是一个公司的力量可以满足的,所以就把这些需求开放给众多的第三方开发者。
开放平台使用广泛、几乎所有的互联网公司都有自己的开放平台,知名的如京东的宙斯(JD Open Platform), 淘宝开放平台(Taobao Open Platform),百度的数据开放平台(https://open.baidu.com),大公司的开放平台都是一个完整的生态链,有很多第三方开发者(ISV),专门根据大的平台开放的接口,来开发出一些通用的软件,比如“E店宝”,依赖于淘宝、天猫、京东、拼多多等大型电商开放的接口,开发出的电商ERP的管理软件,通过这个 ERP 可以直接执行淘宝,京东等电商对外提供的功能,如查看订单,退货,上架产品等等
开放平台项目 |
---|
![]() |
二 、开放平台之管理平台
2.1 管理平台介绍
管理平台主要是对开放平台中的一些数据进行综合性管理,如客户管理,应用管理,充值管理,api 路由管理,网关参数管理,用户 Token 管理,日志搜索,权限管理,实现对服务的限流,熔断等动态配置,通过管理平台可以查看生成的数据,也可以通过管理平台将修改的数据同步到开放平台的网关系统中来实现实时更新功能
管理平台部分功能展示 |
---|
![]() |
2.2 客户管理
2.2.1 介绍
客户指的是注册了开放平台并通过平台来获取相应数据的人,如我们的淘宝账号可以通过淘宝的开放平台提供的 API 来实现对淘宝的一些功能的调用,如订单管理,商品管理等
客户主要包含的主要信息包括 用户名,密码,公司名称,账户余额,公司地址,账户状态等
客户管理主要是针对在开放平台上注册的用户进行管理, 可以对用户的账号密码,企业名称,账户余额等内容进行管理,并且可以代用户进行注册,编辑删除账户等操作
2.2.2 功能展示
客户管理功能展示 |
---|
![]() |
2.2.2 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
username | String | 用户名 |
password | String | 密码 |
nickname | String | 公司名称 |
address | String | 地址 |
money | int | 余额(毫) |
state | int | 状态 1 正常,0 停用 |
2.3 应用管理
2.3.1 介绍
应用指的是客户在我们的平台创建的应用,一个客户可以创建多个应用,比如 抖音,今日头条,火山视频都是字节跳动的产品,它们都使用了微信分享和登陆这些开放功能,那么在微信的开放平台中,字节跳动就是一个客户,而抖音,今日头条都是字节跳动下面不同的应用,他们需要分别在微信开放平台创建出来才可以使用微信开放的功能
应用主要包含的主要信息为所属客户,应用名称,应用的 key,应用的秘钥(签名用),应用接收信息的回调 URL,应用对开放平台中接口的免费调用次数,应用描述等,关联功能客户管理
应用管理中主要包含创建应用,展示应用的相关信息,编辑修改应用,以及批量删除等操作,让管理人员可以随时通过对应用的信息修改来实现动态实时的限制
2.3.2 功能展示
应用管理功能展示 |
---|
![]() |
2.3.3 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
corpName | String | 关联企业名称,冗余减少查询 |
appName | String | 应用名称 |
appKey | String | 应用唯一标示 KEY |
AppSecret | String | 应用签名秘钥 |
redirectUrl | String | 应用回调用 URL |
linit | int | 免费接口日调用限制次数 |
description | String | 应用介绍 |
cusId | int | 关联客户 id |
state | int | 状态 |
2.4 路由管理
2.4.1 介绍
在开放平台中,因为开放的服务的数量不确定,有的服务可能今年开放的,有的服务可能是明年新开发后开放的,有的服务可能过来一段时间后下线了,这一切都可能是随时变化的,因为如果每个服务都单独开发一套接口来让客户调用的话就变得非常繁琐,无法实现动态的调整,就像一个公司会有很多部门,每个部门都会招聘人,如果每个部门的招聘信息上面都写对应部门的人的话,就会变得很麻烦,我们需要在公司前台那里给每个部分留一个面试官,会浪费人员,最合适的办法是我们只要都留公司前台地址就行,我们只需要告诉前台每个部门的对接人信息就行,来面试的人员只要说明自己来面试哪个部门即可,前台会根据部门来找到对接人然后通知对接人即可,那么个前台就是统一的入口,她记录的对接人的信息就属于路由信息,我们只需要和前台沟通随时变更对接人信息即可,以后多了新部门只要和前台说新部门的信息即可
路由主要包含的主要信息为 路由的标识,对应的真正服务 id,对应服务的地址,描述信息,服务状态,幂等性,是否收费等
路由管理主要是对路由信息的添加,修改,启用,停用,幂等性状态修改, 是否收费等进行相关管理
2.4.2 功能展示
路由管理功能展示 |
---|
![]() |
2.4.3 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
gatewayApiName | String | 路由名称标识 |
insideApiUrl | String | 服务接口地址 |
serviceId | String | 服务名称 |
description | String | 介绍信息 |
state | int | 状态 1 有效,0 无效 |
idempotents | int | 幂等性 1 幂等 0 非幂等 |
needfee | int | 是否收费 1 收费 0 免费 |
2.5 系统参数管理
2.5.1 介绍
我们的所有的服务在请求之前会要求我们必须传递某些名字的参数,就像我们去一家公司面试的时候不管面试的是什么部门都要带简历一样,这些参数我们成为系统参数
系统参数包含的主要信息是 参数名称,参数描述,参数状态
系统参数管理主要是针对我们网关中请求时候需要的系统参数进行管理,可以动态添加或者修改删除参数,修改后同步到网关中,网关即可实现动态参数校验的功能
2.5.2 功能展示
系统参数管理功能展示 |
---|
![]() |
2.5.3 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
name | String | 参数名 |
description | String | 参数介绍 |
state | int | 状态 1 启用,0 禁用 |
2.6 Token 管理
2.6.1 介绍
我们在访问功能的时候需要用登陆,单体项目的时候我们可以使用 session 来记录数据,但是在分布式系统中,session 共享比较复杂,所以我们会使用其他方式来记录这些状态,我们会在用户首次登陆的时候给他生成一个 token,下次用户带着 token 来我们进行校验即可
令牌在数据库中主要的信息为客户 id,token 内容,开始时间,过期时间等信息,关联客户信息
Token 管理主要是管理用户登录后生成的 token数据,修改有效期,删除等
2.6.2 功能展示
Token 管理功能展示 |
---|
![]() |
2.6.3 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
userId | int | 客户 id |
access_token | String | token 内容 |
startTime | DateTime | 开始时间 |
expireTime | DateTime | 结束时间 |
2.7 充值管理
2.7.1 介绍
开放平台中部分接口的访问是需要收费的,因为用户需要先充值才可以使用
充值的数据信息主要是客户id,订单号,充值金额,日期,付费方式,状态等信息
充值管理主要是查看用户的充值记录,并且可以在自动充值出现问题的时候手动为用户充值
2.7.2 功能展示
充值管理功能展示 |
---|
![]() |
2.7.3 数据库结构
列名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
cusId | int | 客户 id |
createtime | DateTime | 创建订单时间 |
updateTime | DateTime | 更新时间 |
state | int | 状态,0未支付,1 已支付,2 已取消 |
paymenttype | int | 支付类型 0 银联,1 微信,2支付宝 |
三 、技术架构
我们的项目是一个管理平台,大部分的管理平台都是对内提供功能或者给用户提供部分可选功能,所以相对起来比较简单,大部分使用的是SSM单体架构,我们当前的项目也是采取的SSM架构
3.1 架构技术点
技术名称 | 针对的功能 | 介绍 | 版本 |
---|---|---|---|
SpringMVC | 控制层 | 主要用作于接收用户请求,封装参数,返回数据 | 5.1.x |
Spring | 对象管理 | 主要对我们项目需要的对象进行生命周期管理 | 5.1.x |
Mybatis | 持久层 | 主要是用于我们和数据库进行交互 | 3.5.x |
Quartz | 定时任务 | 比如定时备份数据 | 1.5.x |
LayUI | 前端展示 | 用于显示页面数据,传递数据到控制层 | 2.5.x |
3.2 所需工具
工具名称 | 功能 | 介绍 |
---|---|---|
Intellij Idea | 代码开发 | 开发集成编辑器 |
Maven | 项目管理 | 项目构建管理工具 |
Maven Helper | 快速运行maven操作 | 一款IDEA插件,可以自定义执行maven指令 |
MySQL | 持久化数据 | 免费开源的数据库 |
Tomcat | 运行容器 | 基于Java Servlet规范的容器 |
VS Code | 文本编辑 | 免费开源的文本编辑器 |
四 、编码规范
本规范主要是针对开发中我们的一些基本内容进行规范约束定义,包含项目的包名,对应的文件位置等
名称 | 规范 |
---|---|
包名 | com.qianfeng.openapi.web.master |
控制层包名 | controller |
服务层包名 | servcie/impl |
数据层包名 | mapper |
工具类包名 | utils |
数据库对象包名 | pojo |
view对象包名 | bean |
mapper xml | resouces目录下与接口包名对应的目录 |
spring配置文件 | resouces下spring目录 |
mybatis配置文件 | resouces下mybatis目录 |
其他配置文件 | resouces下conf目录 |
变量名 | 驼峰命名 |
状态码 | 接口中定义常量 |
其他规范 | 具体情况具体定义 |
五、 编码顺序
在我们的实际开发中,我们会遇到选择的问题,就是到底是先写controller还是service还是dao,其实先写谁都可以,这个取决于我们自己的角度,如果你先想我们的项目有什么业务,那么我们一般会先写service,另外一个方面,我们分析出数据库的表结构后,可以先写数据库相关的操作,也就是我们的dao,也可以先想一下我们会和前端做什么交互,先写controller,这个完全取决于我们的角度,当然如果不是前后端分离的项目,页面是我们写的,我们也可以按照需求先把页面写出来
六、 功能实现
6.1 客户管理
6.1.1 环境搭建,创建Maven项目(打包方式为war)及导入依赖
项目相关依赖
<dependencies>
<!--webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mybatis整合spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
<!--aspectj-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
6.1.2 数据库配置文件
在resources文件夹下创建一个conf文件夹,存放jdbc.properties文件
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///open_demo?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123
6.1.3 spring和mybatis相关配置文件
在resources文件夹下创建一个spring文件夹,存放spring相关文件,例如spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描servcie-->
<context:component-scan base-package="com.qianfeng.openapi.web.master.service"/>
</beans>
在resources文件夹下创建一个mybatis文件夹,存放mybatis主配置文件,例如mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--MyBatis配置-->
<configuration>
<settings>
<!--打印查询SQL语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--pagehelper插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--配置数据库方言-->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
创建spring和mybatis整合的配置文件,spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置文件参数化(参数占位符)-->
<context:property-placeholder location="classpath:conf/jdbc.properties" />
<!--与DruidDataSource集成(二选一)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--基本配置-->
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 工厂bean:生成SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 注入dao-mapper文件信息 ,如果映射文件和dao接口 同包且同名,则此配置可省略-->
<property name="mapperLocations" value="classpath:com/qianfeng/openapi/web/master/mapper/*.xml"/>
<!--加载mybatis主配置文件-->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<!--别名-->
<property name="typeAliasesPackage" value="com.qianfeng.openapi.web.master.pojo"/>
</bean>
<!-- mapperScannerConfigurer -->
<bean id="mapperScannerConfigurer9" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qianfeng.openapi.web.master.mapper"/>
<!-- 如果工厂中只有一个SqlSessionFactory的bean,此配置可省略 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
创建spring和事务整合的配置文件,spring-transaction.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1. 引入一个事务管理器,其中依赖DataSource,借以获得连接,进而控制事务逻辑 -->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txManager" transaction-manager="tx">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<!-- 剩余所有方法 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.qianfeng.openapi.web.master.service..*.*(..))" id="pc"/>
<!-- 组织切面 -->
<aop:advisor advice-ref="txManager" pointcut-ref="pc"/>
</aop:config>
</beans>
6.1.4 springMVC的配置文件
在spring文件夹下创建springmvc的主配置文件,springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描controller-->
<context:component-scan base-package="com.qianfeng.openapi.web.master.controller"/>
<!--配置各种适配器-->
<mvc:annotation-driven/>
<!--放行静态资源 -->
<mvc:default-servlet-handler/>
</beans>
6.1.5 web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--放行html文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 局部参数:声明配置文件位置 -->