2、快速入门

文章目录

文章目录

  • 项目初始化
    • 开发工具
    • 代码初始化
    • 数据库初始化
    • 首次启动
  • 项目参数
    • Apollo配置
    • 项目配置
      • 系统配置
      • 分布式锁
      • 通知管理
      • 微信配置
      • 任务调度配置
      • 工作流配置
      • 数据库配置
      • 分布式主键
      • Redis
      • 消息队列
      • 单点配置
      • 服务目录
      • 文件存储
      • 门户集成
      • 网关集成
    • 组件配置
  • 项目菜单
  • 项目实践
    • 数据源管理
      • 独立事务
      • 分布式事务
    • 后端开发
      • 代码生成器
      • 编写DTO
      • 编写Mapper
      • 编写Service
      • 编写Controller
    • 前端开发
      • 目录划分
      • 命名规范
      • 列表页面示例
      • 明细页面示例
    • 项目集成
    • 项目集成

项目初始化

通过本指南快速上手lcp开发平台

开发工具

以下工具都可以从公司内部ftp上获取

  • Jdk 1.8
  • Redis 3.0+
  • Maven 3.3+,参考首页完成私有仓库配置
  • Tomcat 7+
  • Svn 1.8+
  • IntelliJ IDEA 2017+
  • Mysql server 5.6+
  • Navicat Premium 10+

代码初始化

从svn上下载项目开发模板

http://172.16.1.78:81/svn/06_源代码管理/S008_LCP平台/applicationTemplete

从首页地址获取并访问Maven私有仓库,查找并修改为最新稳定的extension版本号

<dependency>
    <groupId>com.fslgroupId>
    <artifactId>lcp.extensionartifactId>
    <type>wartype>
    <version>2.5-SNAPSHOTversion>
dependency>

<dependency>
    <groupId>com.fslgroupId>
    <artifactId>lcp.extensionartifactId>
    <classifier>classesclassifier>
    <scope>providedscope>
    <version>2.5-SNAPSHOTversion>
dependency>

<dependency>
	<groupId>com.fslgroupId>
	<artifactId>lcp.wrapperartifactId>
	<type>wartype>
	<version>2.1-SNAPSHOTversion>
dependency>

<dependency>
	<groupId>com.fslgroupId>
	<artifactId>lcp.wrapperartifactId>
	<classifier>classesclassifier>
	<scope>providedscope>
	<version>2.1-SNAPSHOTversion>
dependency>

2、快速入门_第1张图片

基于项目实际需求修改pom文件中的如下属性

<project>
    ……
    <artifactId>applicationTempleteartifactId>
    <version>1.0-RELEASEversion>
    ……
    <build>
        ……
        <finalName>applicationTempletefinalName>
        ……
    build>
project>

执行如下命令,完成项目首次打包

mvn clean package

数据库初始化

使用如下信息连接数据库

ip:172.16.20.118
port:3306
user:root
pwd:fswl@1234

平台使用Mysql数据库完成开发。登录数据库服务器,在my.cnf(或my.ini)完成以下配置

# 忽略大小写
lower_case_table_names=1
# 采用utf8mb4编码,utf8mb4才是真正的utf8编码,能够存储各类符号
character_set_server=utf8mb4
# 默认值为100,调整到500
max_connections=500

如果数据库开启了bin-log日志,则还需在my.cnf(或my.ini)添加以下配置

log_bin_trust_function_creators=1

使用utf8mb4字符集,创建名为applicationTemplete的数据库。数据库名称可按需求修改。

访问target\war\work\com.fsl\lcp.extension\WEB-INF\classes\db路径,按顺序执行脚本,初始化表结构与表数据

平台默认使用JNDI配置数据源。数据源的配置独立于项目配置。打开tomcat安装目录/conf/context.xml文件,添加如下配置。注意各参数应按需修改

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" name="jdbc/lcp_db" type="javax.sql.DataSource" url="jdbc:mysql://172.16.20.118:3306/applicationTemplete" username="root" password="fswl@1234"/>  

首次启动

本地先行启动Redis。使用Idea打开项目并完成Tomcat配置。使用admin/Fslgz@1234!!登录,成功启动后的面如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vzASari-1586308930974)(.\pic\20190324-205613.png)]

项目参数

src\main\resources\profiles目录下,存储了项目四套环境参数配置,说明如下

名称 描述
dev 开发环境参数
sit 综测环境参数
uat 业测环境参数
prod 正式环境参数

Apollo配置

需要指定Apollo上应用程序编码与Apollo服务器地址。此配置放置在app.properties

app.id=lcp
apollo.meta=http://172.16.20.136:8080

项目配置

目前项目的所有配置统一由Apollo管理。

系统配置

系统级参数配置

# system
env.code = DEV
sys.code = TEMPLETE
sys.name = 模板
sys.log.dir = /lcp_logs
sys.webroot.url = http://localhost:8080/applicationTemplete/
sys.home.refresh.interval = 60

分布式锁

当前未启用

# redisson
#  multiple redis such as
#  redisson.server.url=\
#    127.0.0.1:6379,\
#    10.211.103.142:6379
# redisson.server.url=
# redissson.server.password=

通知管理

# mail notify
mail.smtp.host=mail.fslgz.com
mail.smtp.port=587
mail.smtp.username=lcpnotice
mail.smtp.password=lcp!@2019
mail.smtp.auth=true
mail.smtp.timeout=50000
#[email protected]

# sms notify
sms.corpid=105686
sms.loginname=system
sms.password=390323
sms.url=https://sms.mobset.com:843/SDK3/SMS

# dd nofity
dingtalk.corp.id=ding6b6ffebcd75ef63335c2f4657eb6378f
dingtalk.app.key=dinggkwxz61kgu7vvw8a
dingtalk.app.secret=VnA-wL-bqviMkIsw_Qn81TqH-Q7fqzCchOglmBjplbjeBZvdzH5MZ8e66vDNefo-
dingtalk.default.agentid=280426666

微信配置

# weixin
weixin.app.id = wxdaa8c45050e1968c
weixin.app.secret = cf958a9dd8882631b8c5b6beb2d19a64

任务调度配置

启动后自动执行任务调度

# job
job.autoStartup=true

工作流配置

# Activiti
activiti.dd.todo.open=N
activiti.dd.process.open = N

数据库配置

注意jndiName的配置需与tomcat中保持一致

# db
db.jndiName=java:comp/env/jdbc/lcp_db
# db.type property is used for activiti
db.type=mysql
#db.type=oracle
#db.type=mysql
#db.type=hana
mybatis.identity=JDBC
#mybatis.identity=SEQUENCE

分布式主键

在正式项目中需配置为分配的主键区间

# snow generate Id
snow.workerId=0
snow.datacenterId=0

Redis

默认未使用集群。可添加访问密码保证缓存不被其它应用干扰

# redis
redis.sentinel=\
  10.86.20.183:26379,\
  10.86.20.184:26379
# if redis.useSentinel is true, then redis.ip and redis.port is useless
# this value should always be true except local dev test
redis.useSentinel=false
redis.ip=localhost
redis.port=6379
redis.db=10
redis.password=
redis.queue.retry.times = 5

消息队列

# rabbitmq intergration
rabbit.mq.open=false
rabbit.mq.host=172.16.20.121
rabbit.mq.port=5672
rabbit.mq.username=fsl
rabbit.mq.password=fsl
rabbit.mq.exchange=exchange.topic.sit
rabbit.mq.queue=queue.ams.sit
rabbit.mq.queue.concurrency=10

单点配置

可删除默认配置,使用本地登录

# cas intergration
cas.service=http://localhost:8080/applicationTemplete/login/cas
cas.ssoserver.url=http://172.16.20.124:8080/cas
cas.ssoserver.loginurl=http://172.16.20.124:8080/cas/login
cas.ssoserver.logouturl=http://172.16.20.124:8080/cas/logout?service=http://localhost:8080/applicationTemplete

服务目录

# ldap intergration
ldap.server.url=ldap://localhost:389/
ldap.conn.userDn=cn=Manager,dc=hand,dc=com
ldap.conn.password=secret
ldap.user.search.base=dc=hand,dc=com
ldap.user.search.filter=(uid={0})

文件存储

# FastDFS intergration
#fastdfs.connect_timeout_in_seconds = 5
#fastdfs.network_timeout_in_seconds = 30
#fastdfs.charset = UTF-8
#fastdfs.http_anti_steal_token = false
#fastdfs.http_secret_key = FastDFS1234567890
#fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 172.16.20.147:22122
fastdfs.nginx.url=http://172.16.20.148:6001/

门户集成

# portal address
portal.address=http://172.16.20.119/portal/
portal.token.url=http://172.16.20.119/portal/api/public/lcp/restful/get_token?clientId=82c15660e444467b9cb78578c6864b04&clientSecret=a4faf06c-7bab-4a99-a144-034358fafc9f

网关集成

gateway.num.retry = 1

组件配置

当前平台存在30个组件配置文件,清单如下

配置文件名称 模块名称 项目覆盖
Spring根容器注册对象
applicationContext.xml 公共对象注册
applicationContext-ext.xml 扩展对象注册
applicationContext-beans.xml 项目对象注册
Mvc子容器注册对象
appServlet/servlet-context.xml 公共对象注册
appServlet/controllers.xml 控制器对象注册
接口认证管理
applicationContext-gateway.xml 网关设置
oauth2Security-gateway.xml 网关安全设置
applicationContext-oauth2.xml OAuth2设置
oauth2Security.xml OAuth2安全认证
applicationContext-cxf.xml CXF设置
cxfSecurity.xml CXF安全认证
cxf-beans-demo.xml CXF使用样例
用户认证管理
applicationContext-security.xml 登录开关
casSecurity.xml 单点认证
standardSecurity.xml 标准认证
standardSecurity-LDAP.xml 基于目录服务的标准认证
通知管理
applicationContext-msg.xml 消息管理开关(始终指向Redis)
message/rabbitmq.xml RabbitMQ消息配置(废弃)
message/redis.xml Redis消息管理
applicationContext-nofify.xml 通知管理
applicationContext-mail.xml 邮件管理
applicationContext-rabbitmq.xml 队列管理
applicationContext-rabbitmq-customer.xml 消费者个性化配置
工作流
applicationContext-activiti.xml 工作流管理
appServlet/servlet-activiti.xml 工作流Web应用管理
其它模块
applicationContext-apollo.xml Apollo配置
applicationContext-db.xml 数据库连接
applicationContext-job.xml 调度管理
applicationContext-redis.xml 缓存配置
applicationContext-websocket.xml webSocket配置

项目菜单

最多支持四级菜单。项目标准菜单如下

一级菜单 二级菜单 三级菜单 备注 原菜单
业务担当使用
业务办理 协同管理 我待办的流程 等待我办理的工作流节点信息 工作流/我的待办列表
业务办理 协同管理 抄送我的流程 抄送我知晓的工作流节点信息 工作流/我的抄送流程
业务办理 协同管理 我发起的流程 我完成发起的工作流节点信息 工作流/我发起的流程
业务办理 协同管理 我参与的流程 我完成办理的工作流节点信息 工作流/我参与的流程
业务办理 协同管理 自动转交配置 将规定时间内的所有流程任务转交其它人处理 工作流/自动转交配置
报表管理 报表管理 业务系统报表展示菜单
配置管理 配置管理 业务系统配置设置菜单
系统管理员使用
业务办理 协同管理 所有待办的流程 获取系统所有的待办节点信息 流程管理/待办事项(管理员)
业务办理 协同管理 所有的流程 获取系统所有的工作流节点信息
系统管理 账户管理 账户管理 管理系统的登录账户信息,为账户分配角色与权限 同运维管理/账户管理
系统管理 账户管理 角色管理 管理系统的角色信息 同运维管理/角色管理
系统管理 账户管理 默认角色配置 为岗位设定默认的角色 同运维管理/默认角色配置
系统管理 功能管理 功能分配 为角色分配系统功能 同系统管理/同运维管理/功能分配
系统管理 流程管理 职能主担配置 配置各部门职能主担人员 同运维管理/流程管理
系统管理 流程管理 职能主担报表 集中展示系统配置的所有部门职能主担 同运维管理/流程管理
运维部门使用
运维管理 组织管理 组织管理 管理公司信息 组织管理/公司管理
运维管理 组织管理 部门管理 管理公司内各层级部门信息 组织管理/组织管理
运维管理 组织管理 岗位管理 管理部门内各岗位信息 组织管理/岗位管理
运维管理 组织管理 员工管理 管理岗位内各员工信息 组织管理/员工管理
运维管理 账户管理 账户管理 管理系统的登录账户信息,为账户分配角色与权限 系统管理/账户管理/用户管理
运维管理 账户管理 登录配置 管理各账户的安全/密码/登录策略 系统管理/系统配置
运维管理 账户管理 角色管理 管理系统的角色信息 系统管理/账户管理/角色管理
运维管理 账户管理 默认角色配置 为岗位设定默认的角色
运维管理 功能管理 资源管理 管理系统内所有的请求地址资源,定义资源权限 系统管理/功能管理/资源管理
运维管理 功能管理 功能维护 管理系统内功能清单,为功能绑定地址资源 系统管理/功能管理/功能维护
运维管理 功能管理 功能分配 为角色分配系统功能 系统管理/功能管理/功能分配
运维管理 数据权限 数据资源管理 管理系统内所有的数据权限规则
运维管理 数据权限 数据资源分配 为账户分配数据权限
运维管理 参数管理 外观维护 管理系统标题与图标 系统管理/系统配置
运维管理 参数管理 首页配置 管理登录首页的仪表盘 系统管理/仪表盘配置
运维管理 参数管理 系统参数 管理系统参数信息 系统管理/配置维护
运维管理 参数管理 数据字典 管理系统数据字典信息 系统管理/代码维护
运维管理 参数管理 LOV定义 管理系统LOV信息 系统管理/LOV定义
运维管理 参数管理 流水号配置 管理系统流水号信息 系统管理/编码规则
运维管理 参数管理 快捷键配置 管理页面操作快捷键信息 系统管理/热键配置
运维管理 参数管理 多语言定义 管理系统多语言类型 系统管理/语言维护
运维管理 参数管理 多语言描述 管理系统各语言具体描述 系统管理/描述维护
运维管理 审批管理 流程设计 绘制系统工作流 流程管理/流程设计
运维管理 审批管理 流程部署 查询流程布署信息 流程管理/流程部署
运维管理 审批管理 流程监控 管理系统正在运行的工作流实例 流程管理/流程监控
运维管理 审批管理 流程异常日志 管理工作流异常日志 流程管理/报错日志
运维管理 审批管理 审批方式配置 配置流程节点的通过条件 流程管理/审批配置/审批方式
运维管理 审批管理 审批规则配置 配置接收流程节点待办任务的人员筛选规则 流程管理/审批配置/审批规则
运维管理 审批管理 职能主担配置 配置各部门职能主担人员
运维管理 审批管理 职能主担报表 集中展示系统配置的所有部门职能主担
运维管理 审批管理 审批权限配置 配置流程走向的判定条件 流程管理/审批配置/审批权限
运维管理 任务管理 任务调度 配置系统自动调度执行的计划任务 计划任务/任务明细
运维管理 任务管理 任务日志 管理系统任务的执行日志 计划任务/执行记录
运维管理 通知管理 通知模板 设定通知消息的正文格式
运维管理 通知管理 通知列表 管理所有的通知执行
运维管理 附件管理 文件管理 查询目前所有已上传的文件清单 附件管理/文件管理
运维管理 附件管理 上传测试 文件上传测试 附件管理/上传附件
运维管理 服务管理 服务发布 生产者将服务发布至消息总线 服务管理/服务注册
运维管理 服务管理 服务订阅 消费者在消息总线上订阅服务 服务管理/应用管理
运维管理 服务管理 调用日志 管理服务的调用日志 服务管理/调用记录
运维管理 集成管理 系统集成配置 将指定系统的菜单与待办集成至本系统(钉钉工作台)
运维管理 集成管理 微信集成配置 将指定系统的入口集成至本系统(微信工作台)
运维管理 日志管理 MQ消息日志 管理与MQ平台交互的日志信息
运维管理 日志管理 钉钉接口日志 管理与钉钉服务器交互的日志信息
运维管理 日志管理 RESTFul接口日志 管理与钉钉服务器交互的日志信息

项目实践

数据源管理

平台默认已包含单数据源配置。如需连接更多数据源则需修改 applicationContext-db.xml,添加如下配置。

  • dataSource,数据源连接配置
  • sqlSessionFactory,数据源工厂配置
  • mapperScannerConfigurer,数据映射配置
  • transactionManager,事务管理配置

独立事务

一段代码只能使用一个事务管理器。当存在同时操作两个数据源的时候,默认情况下,发生异常时只能回滚一个数据源的事务。示例配置如下,注意需添加多个数据库配置。


<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
	<property name="jndiName" value="${db.jndiName}"/>
bean>
<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
	<property name="jndiName" value="${db.jndiName2}"/>
bean>


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	
	<property name="mapperLocations" value="classpath*:com/hand/hap/**/*Mapper.xml"/>
	<property name="plugins">
		<array>
			<bean class="com.hand.hap.core.interceptor.RequestContextInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.MultiLanguageInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.SecurityTokenInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.OvnInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.AuditInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.DataPermissionInterceptor"/>
			<bean class="com.github.pagehelper.PageHelper"/>
			<bean class="com.hand.hap.core.interceptor.CacheJoinInterceptor">
				<property name="cacheJoinType" ref="cacheJoinType">property>
			bean>
		array>
	property>
	<property name="configLocation" value="classpath:mybatis-configuration.xml"/>
bean>
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource2"/>
	
	<property name="mapperLocations" value="classpath*:com/hand/test/**/*Mapper.xml"/>
	<property name="plugins">
		<array>
			<bean class="com.hand.hap.core.interceptor.RequestContextInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.MultiLanguageInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.SecurityTokenInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.OvnInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.AuditInterceptor"/>
			<bean class="com.hand.hap.core.interceptor.DataPermissionInterceptor"/>
			<bean class="com.github.pagehelper.PageHelper"/>
			<bean class="com.hand.hap.core.interceptor.CacheJoinInterceptor">
				<property name="cacheJoinType" ref="cacheJoinType">property>
			bean>
		array>
	property>
	<property name="configLocation" value="classpath:mybatis-configuration.xml"/>
bean>


<bean id="mapperScannerConfigurer" class="com.hand.hap.mybatis.spring.MapperScannerConfigurer">
	
	<property name="basePackage" value="com.hand.hap.**.mapper"/>
	<property name="processPropertyPlaceHolders" value="true"/>
	<property name="propertiesMap">
		<map>
			<entry key="mappers" value="com.hand.hap.mybatis.common.Mapper"/>
			<entry key="IDENTITY" value="${mybatis.identity}"/>
			<entry key="dataBaseType" value="${db.type}"/>
			<entry key="seqFormat" value="{3}_s.nextVal"/>
			<entry key="enableMethodAnnotation" value="true"/>
		map>
	property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
bean>
<bean id="mapperScannerConfigurer2" class="com.hand.hap.mybatis.spring.MapperScannerConfigurer">
	
	<property name="basePackage" value="com.hand.test.**.mapper"/>
	<property name="processPropertyPlaceHolders" value="true"/>
	<property name="propertiesMap">
		<map>
			<entry key="mappers" value="com.hand.hap.mybatis.common.Mapper"/>
			<entry key="IDENTITY" value="${mybatis.identity2}"/>
			<entry key="dataBaseType" value="${db.type2}"/>
			<entry key="seqFormat" value="{3}_s.nextVal"/>
			<entry key="enableMethodAnnotation" value="true"/>
		map>
	property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/>
bean>


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
bean>
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource2"/>
bean>

分布式事务

代码使用分布式事务,所有数据源的事务都将统一管理

首先在pom里添加如下依赖

<dependency>
   <groupId>com.atomikosgroupId>
   <artifactId>transactions-jdbcartifactId>
   <version>4.0.2version>
dependency>
<dependency>
   <groupId>javax.transactiongroupId>
   <artifactId>jtaartifactId>
   <version>1.1version>
dependency>

分布式事务使用独立的数据源连接配置与事务管理配置,数据源工厂配置与数据映射配置和之前保持一致



<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" abstract="true">
  <property name="poolSize" value="10" />
  <property name="minPoolSize" value="10"/>
  <property name="maxPoolSize" value="30"/>
  <property name="borrowConnectionTimeout" value="60"/>
  <property name="reapTimeout" value="20"/>
  
  <property name="maxIdleTime" value="60"/>
  <property name="maintenanceInterval" value="60" />
  <property name="loginTimeout" value="60"/>
  <property name="logWriter" value="60"/>
 
bean>


<bean id="dataSource" parent="abstractXADataSource">
  
  <property name="uniqueResourceName" value="oracle/sitestone" />
  
  <property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource"/>
  <property name="xaProperties">
	  <props>
		  <prop key="URL">jdbc:oracle:thin:@10.211.107.202:1521:xeprop>
		  <prop key="user">hap_devprop>
		  <prop key="password">hap_devprop>
	  props>
  property>
bean>


<bean id="dataSource2" parent="abstractXADataSource">
  
  <property name="uniqueResourceName" value="mysql/sitesttwo" />
  <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
  <property name="xaProperties">
	  <props>
		  <prop key="url">jdbc:mysql://10.211.107.202:3306/hap_devprop>
		  <prop key="user">hap_devprop>
		  <prop key="password">hap_devprop>
	  props>
  property>
bean>


<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
	<property name="forceShutdown" value="true"/>
bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
	<property name="transactionTimeout" value="300"/>
bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
	<property name="transactionManager" ref="atomikosTransactionManager"/>
	<property name="userTransaction" ref="atomikosUserTransaction"/>
bean>

后端开发

代码生成器

访问如下地址,填写必要参数后,系统将自动生成对应业务的Html,Controller,Service,ServiceImp,Mapper,MapperXml,Dto。注意,在正式项目中,主键策略一率选择雪花Id。

http://localhost:8080/applicationTemplete/generator/generator.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgOS1L6m-1586308930975)(.\pic\20190315-152620.png)]

编写DTO

DTO类

  • DTO 类不需要提供任何实现,所以属于供应方的服务接口层。创建在 项目模块xxx..dto 包下。
  • 每一个 DTO 类即为一个实体类,对应数据库中的一个具体表。
  • 名称与表名称相同,表名中 _ 替换为驼峰命名法,首字母大写,且忽略前缀。如:UserRole 对应表为 sys_user_role
  • LCP 依赖 java bean 命名规范。请严格遵循规范定义属性,getter,setter等.
  • @Table(name = "table_name") 指定 DTO 对应数据库中表的名称。
  • 每一个 DTO 对应数据库中的一个具体表,一般都需要继承 ExtensionBaseDto 类。

DTO属性

  • 所有属性均为private属性。
  • 每一个属性需要生成对应的 gettersetter 方法。
  • 字段名称应根据驼峰命名规则从数据库列名转换过来
    • 例如:数据库列名为 USER_NAME,则字段名为 userName
    • 特殊字段名称,可以在字段在添加@Column(name = "xxx") 注解,指定数据库列名
  • 非数据库字段,需要用@Transient 标注
    • javax.persistence.Transient
  • 属性的的类型与字段的 type 对应
    • 不使用基本类型,全部使用基本类型的包装类,如 Long 对应数据库中的 INTEGER,而不是使用 long
    • 数字类型主键统一采用 Long
    • 金额、数量 等精度严格浮点类型采用 BigDecimal
      • 注意 BigDecimal 在计算、比较方面的特殊性
  • 所有的主键字段都需要用@Id标注
    • 对于自增张、序列(SEQUENCE)类型的主键,需要添加注解@GeneratedValue
    • 序列命名规范:表名_S
      • 例如:表 SYS_USER 对应的序列为 SYS_USER_S

编写Mapper

Mapper接口

  • Mapper 接口类即为传统意义上的 DAO,但与 interface 不同,Mapper 本身就是对数据访问的具体实现,所以属于供应方的服务实现层。创建在 项目模块xxx..mapper 包下。
  • 每一个 Mapper 接口类封装了对数据库表的操作,每一个 Mapper 对应一个 DTO 类,所以命名为 DTO 类名 + Mapper。如:UserRoleMapper 对应表为 UserRole 类。
  • 基础的 CRUD 操作不需要再次实现,通过继承 ExtensionMapper 类实现。其中 T 为 对应 DTO 的泛型。
  • 复杂的数据库操作需要定义具体的接口方法。

Mapper脚本

  • Mapper.xml 是数据库的的具体映射,与 Mapper 接口同级,创建在 项目模块 resources 目录的 xxx..mapper 包下。
  • Mapper.xml,与 Mapper 接口对应。所以命名 Mapper 接口类相同。
  • 对于基本的 CRUD 不需要进行配置,所以也就不需要创建对应的 Mapper.xml 文件。
  • 对于自定义的数据库方法,需要创建对应的 Mapper.xml 文件。
  • Mapper.xml 中的操作 id 对应 Mapper 接口类的方法名。

编写Service

Service接口

  • Service 接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在 项目模块xxx..service 包下。
  • 接口(interface)统一以大写字母 I 做为命名前缀
  • 每一个 Service 对应一个 DTO 类,所以命名为I + DTO 类名 + Service。如:IUserRoleService 对应表为 UserRole 类。
  • Service 里的每一个方法需要加上IRequest对象作为参数。
  • Service 接口,如无特殊例外,需要继承IExtensionBaseServiceProxySelf 接口
    • T 为 Service 本身

Service实现类

  • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在 项目模块xxx..service.impl 包下。
  • 每一个 Service 实现类对应一个 Service 接口类,所以命名为 Service 接口类名(去掉I前缀) + Impl。如:UserRoleServiceImpl 对应 IUserRoleService 类。
  • 实现类,如无特殊情况,需要用@Service标注,以自动扫描注册
  • 实现类可以通过继承ExtensionBaseServiceImpl 来获得标准的 CRUD 操作支持
    • 需要 Service 接口类 继承 IExtensionBaseService

编写Controller

  • Controller 负责对 Model 和 View 的处理,创建在 项目模块 的 xxx..controllers 包下。
  • 每一个 Controller 是对一个具体的 DTO 资源进行处理的,所以命名为 DTO 类名 + Controller。如: UserRoleController 对应 UserRole 类。
  • 需要通过 @Controller 指定该类为一个 Controller 类。
  • 需要在每一个 Controller 中通过 @Autowired 注入 Service。

前端开发

目录划分

按照web目录规范,前端文件存放在如下目录

  webapp
    ├─lib
    │  ├─asserts
    │  ├─bootstrap-3.3.7
    │  ├─dashboard
    │  ├─font-awesome-4.6.3
    │  ├─form-builder
    │  ├─jquery-ui
    │  ├─kendoui
    │  ├─polyfill
    │  └─websocket
    ├─resources
    │  ├─css
    │  ├─diagram-viewer
    │  ├─editor-app
    │  ├─font
    │  ├─images
    │  ├─js
    │  ├─upload
    └─WEB-INF
        ├─web.xml
        └─view

资源文件按照类型划分为两个目录:libresources

  • lib目录存放kendoui的所有文件
  • resources目录存放程序通用的资源文件

功能文件存放在view目录下

  • 目录的命名规则为[模块代码]/[功能项代码]
  • 例如:用户管理的功能代码是SYS001,那么用户管理相关的界面文件都存放在src/main/webapp/WEB-INF/view/sys/sys001/

命名规范

界面文件,按照如下格式:[模块代码]/[业务对象]/query

  • 例如:用户查询界面: sys_user_query.html

系统中url地址,按照以下格式命名:[contextPath]/[模块代码]/[业务对象]/[操作类型]。对于常见的几种操作类型定义如下

  • 查询:[模块代码]/[业务对象]/query
  • 提交:[模块代码]/[业务对象]/submit
  • 删除:[模块代码]/[业务对象]/remove

PC客户端,使用JQuery,KendoUI,Bootstrap,Fort Awesome等框架进行开发。移动端,使用VUE,MUI等框架进行开发。访问首页地址,可获取以上所有框架的帮助文档。

列表页面示例

2、快速入门_第2张图片


<#include "../include/header.html">

	
    
    
<@spring.message "hap.query"/> <@spring.message "hap.reset"/> <@spring.message "hap.new"/> <@spring.message "hap.save"/> <@spring.message "hap.delete"/> <@spring.message "hap.exportexcel"/>
// 表格

明细页面示例

2、快速入门_第3张图片

<#include "../include/header.html">


新增 <@spring.message "hap.delete"/>
删除 提交

项目集成

一般来讲,各个业务项目,还需要在以下方面和平台进行集成

  • 基础数据:基于MQ,从MDM同步组织,部门,岗位,员工,工作信息,数据字典数据
  • 员工账户:基于MQ,从门户同步账户数据
  • 单点登录:基于CAS,完成单点登录集成
  • 使用菜单:基于约定的对接方式,完成菜单集成
  • 任务管理:基于约定的对接方式,完成任务集成
  • 文件管理:基于FASTDFS,完成上传文件的统一存储
  • 接口管理:基于RESTFul或者SOAP规则,完成接口集成

ata(“kendoGrid”).selectedDataItems();
if (!costtypeDatas.length) {
kendo.ui.showInfoDialog({
message: ‘请选择要删除的费用激励!’
})
} else {
kendo.ui.showConfirmDialog({
message: ‘确认删除吗?’
}).done(function (e) {
if (e.button == “OK”) {
// … 这里进行删除操作
}

        })
    }
    Hap.unblockUI();


}

function submit() {
    Hap.blockUI();
    // ... 数据校验及提交数据
    Hap.unblockUI();
}

function removeActive() {
    Hap.blockUI();
    //  var budgetDatas = $("#budgetGrid").data("kendoGrid").selectedDataItems();怎么选择数据源,model中的

    kendo.ui.showConfirmDialog({
        message: '确认删除吗?'
    }).done(function (e) {
        //  var applyNo = viewModel.model.applyNo;
        if (e.button == "OK") {
            // ... 删除数据
        }
    })

    Hap.unblockUI();
}
```

项目集成

一般来讲,各个业务项目,还需要在以下方面和平台进行集成

  • 基础数据:基于MQ,从MDM同步组织,部门,岗位,员工,工作信息,数据字典数据
  • 员工账户:基于MQ,从门户同步账户数据
  • 单点登录:基于CAS,完成单点登录集成
  • 使用菜单:基于约定的对接方式,完成菜单集成
  • 任务管理:基于约定的对接方式,完成任务集成
  • 文件管理:基于FASTDFS,完成上传文件的统一存储
  • 接口管理:基于RESTFul或者SOAP规则,完成接口集成

参考对应的章节,了解上述各项的技术要求

你可能感兴趣的:(FSL研发体系文档)