zheng
交流 QQ 群:133107819、284280411、305155242🈵、528049386、157869467🈵、570766789🈵、601147566🈵、309985359🈵、336380857🈵、522723488、556447629、654558397🈵、392564561🈵、494594000🈵、494070275🈵、168267539🈵、652798487🈵、650979251🈵、622461564🈵、219381522🈵、487874426🈵、398342630🈵、205986087🈵、574153262🈵、606890936🈵、565434047🈵、680947971🈵、341884034🈵、562977817🈵、478962414🈵、679219230🈵、676766033🈵、621874750🈵、522903600🈵、524932879🈵、376261902🈵、481096887🈵、232104667🈵、637879277🈵、697575367🈵、702995203🈵、708665910🈵、697141239🈵、574057714🈵、631332162🈵、591739143🈵、731016871🈵、598738752🈵、748759166🈵、159816595(群内含各种工具、文档、视频教程下载)
前言
zheng项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位 J2EE 企业级开发解决方案。
项目介绍
基于 Spring+SpringMVC+Mybatis 分布式敏捷开发系统架构,提供整套公共微服务服务模块:内容管理、支付中心、用户管理(包括第三方)、微信平台、存储系统、配置中心、日志分析、任务和通知等,支持服务治理、监控和追踪,努力为中小型企业打造全方位 J2EE 企业级开发解决方案。
组织结构
zheng
├── zheng-common -- SSM 框架公共模块
├── zheng-admin -- 后台管理模板
├── zheng-ui -- 前台 thymeleaf 模板[端口:1000]
├── zheng-config -- 配置中心[端口:1001]
├── zheng-upms -- 用户权限管理系统
| ├── zheng-upms-common -- upms 系统公共模块
| ├── zheng-upms-dao -- 代码生成模块,无需开发
| ├── zheng-upms-client -- 集成 upms 依赖包,提供单点认证、授权、统一会话管理
| ├── zheng-upms-rpc-api -- rpc 接口包
| ├── zheng-upms-rpc-service -- rpc 服务提供者
| └── zheng-upms-server -- 用户权限系统及 SSO 服务端[端口:1111]
├── zheng-cms -- 内容管理系统
| ├── zheng-cms-common -- cms 系统公共模块
| ├── zheng-cms-dao -- 代码生成模块,无需开发
| ├── zheng-cms-rpc-api -- rpc 接口包
| ├── zheng-cms-rpc-service -- rpc 服务提供者
| ├── zheng-cms-search -- 搜索服务[端口:2221]
| ├── zheng-cms-admin -- 后台管理[端口:2222]
| ├── zheng-cms-job -- 消息队列、任务调度等[端口:2223]
| └── zheng-cms-web -- 网站前台[端口:2224]
├── zheng-pay -- 支付系统
| ├── zheng-pay-common -- pay 系统公共模块
| ├── zheng-pay-dao -- 代码生成模块,无需开发
| ├── zheng-pay-rpc-api -- rpc 接口包
| ├── zheng-pay-rpc-service -- rpc 服务提供者
| ├── zheng-pay-sdk -- 开发工具包
| ├── zheng-pay-admin -- 后台管理[端口:3331]
| └── zheng-pay-web -- 演示示例[端口:3332]
├── zheng-ucenter -- 用户系统(包括第三方登录)
| ├── zheng-ucenter-common -- ucenter 系统公共模块
| ├── zheng-ucenter-dao -- 代码生成模块,无需开发
| ├── zheng-ucenter-rpc-api -- rpc 接口包
| ├── zheng-ucenter-rpc-service -- rpc 服务提供者
| └── zheng-ucenter-web -- 网站前台[端口:4441]
├── zheng-wechat -- 微信系统
| ├── zheng-wechat-mp -- 微信公众号管理系统
| | ├── zheng-wechat-mp-dao -- 代码生成模块,无需开发
| | ├── zheng-wechat-mp-service -- 业务逻辑
| | └── zheng-wechat-mp-admin -- 后台管理[端口:5551]
| └── zheng-ucenter-app -- 微信小程序后台
├── zheng-api -- API 接口总线系统
| ├── zheng-api-common -- api 系统公共模块
| ├── zheng-api-rpc-api -- rpc 接口包
| ├── zheng-api-rpc-service -- rpc 服务提供者
| └── zheng-api-server -- api 系统服务端[端口:6666]
├── zheng-oss -- 对象存储系统
| ├── zheng-oss-sdk -- 开发工具包
| ├── zheng-oss-web -- 前台接口[端口:7771]
| └── zheng-oss-admin -- 后台管理[端口:7772]
├── zheng-message -- 实时通知系统
| ├── zheng-message-sdk -- 开发工具包
| ├── zheng-message-server -- 服务端[端口:8881,SocketIO 端口:8882]
| └── zheng-message-client -- 客户端
├── zheng-shop -- 电子商务系统
└── zheng-demo -- 示例模块(包含一些示例代码等)
├── zheng-demo-rpc-api -- rpc 接口包
├── zheng-demo-rpc-service -- rpc 服务提供者
└── zheng-demo-web -- 演示示例[端口:9999]
技术选型
后端技术:
前端技术:
| 技术 | 名称 | 官网 |
|---|---|---|
| jQuery | 函式库 | http://jquery.com/ |
| Bootstrap | 前端框架 | http://getbootstrap.com/ |
| Bootstrap-table | Bootstrap 数据表格 | http://bootstrap-table.wenzhixin.net.cn/ |
| Font-awesome | 字体图标 | http://fontawesome.io/ |
| material-design-iconic-font | 字体图标 | https://github.com/zavoloklom/material-design-iconic-font |
| Waves | 点击效果插件 | https://github.com/fians/Waves |
| zTree | 树插件 | http://www.treejs.cn/v3/ |
| Select2 | 选择框插件 | https://github.com/select2/select2 |
| jquery-confirm | 弹出窗口插件 | https://github.com/craftpip/jquery-confirm |
| jQuery EasyUI | 基于 jQuery 的 UI 插件集合体 | http://www.jeasyui.com |
| React | 界面构建框架 | https://github.com/facebook/react |
| Editor.md | Markdown 编辑器 | https://github.com/pandao/editor.md |
| zhengAdmin | 后台管理系统模板 | https://github.com/shuzheng/zhengAdmin |
| autoMail | 邮箱地址自动补全插件 | https://github.com/shuzheng/autoMail |
| zheng.jprogress.js | 加载进度条插件 | https://github.com/shuzheng/zheng.jprogress.js |
| zheng.jtotop.js | 返回顶部插件 | https://github.com/shuzheng/zheng.jtotop.js |
| socket.io.js | SocketIO 插件 | https://socket.io/ |
架构图

模块依赖

模块介绍
zheng-common
Spring+SpringMVC+Mybatis 框架集成公共模块,包括公共配置、MybatisGenerator 扩展插件、通用 BaseService、工具类等。
zheng-admin
基于 bootstrap 实现的响应式 Material Design 风格的通用后台管理系统,zheng项目所有后台系统都是使用该模块界面作为前端展示。
zheng-ui
各个子系统前台 thymeleaf 模板,前端资源模块,使用 nginx 代理,实现动静分离。
zheng-upms
本系统是基于 RBAC 授权和基于用户授权的细粒度权限控制通用平台,并提供单点登录、会话管理和日志管理。接入的系统可自由定义组织、角色、权限、资源等。用户权限=所拥有角色权限合集+用户加权限-用户减权限,优先级:用户减权限>用户加权限>角色权限
zheng-oss
文件存储系统,提供四种方案:
- 阿里云 OSS
- 腾讯云 COS
- 七牛云
- 本地分布式存储

zheng-api
服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统的交互接口、对外开放接口、开发加密接口、接口文档等服务,可在该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图:

zheng-cms
内容管理系统:支持多标签、多类目、强大评论的内容管理,有基本单页展示,菜单管理,系统设置等功能。
zheng-pay
一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的纯粹的支付平台。
统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。

zheng-ucenter
通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。
zheng-wechat-mp
微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理、消息群发等基础功能外,还有二维码推广、营销活动、微网站、会员卡、优惠券等。
zheng-wechat-app
微信小程序后台
zheng-message
基于 Netty 实现 SocketIO 的实时推送系统。支持命名空间、二进制数据、SSL、ACK 等功能。
环境搭建(QQ 群内有“zheng 环境搭建和系统部署文档.doc”)
开发工具:
- MySql: 数据库
- jetty: 开发服务器
- Tomcat: 应用服务器
- SVN|Git: 版本管理
- Nginx: 反向代理服务器
- Varnish: HTTP 加速器
- IntelliJ IDEA: 开发 IDE
- PowerDesigner: 建模工具
- Navicat for MySQL: 数据库客户端
开发环境:
- Jdk7+
- Mysql5.5+
- Redis
- Zookeeper
- ActiveMQ
- Dubbo-admin
- Dubbo-monitor
工具安装
环境搭建和系统部署文档(作者:小兵,QQ 群共享提供下载)
资源下载
- JDK7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
- Maven http://maven.apache.org/download.cgi
- Redis https://redis.io/download
- ActiveMQ http://activemq.apache.org/download-archives.html
- ZooKeeper http://www.apache.org/dyn/closer.cgi/zookeeper/
- Dubbo http://dubbo.io/Download-zh.htm
- Elastic Stack https://www.elastic.co/downloads
- Nginx http://nginx.org/en/download.html
- Jenkins http://updates.jenkins-ci.org/download/war/
- dubbo-admin-2.5.3 http://download.csdn.net/detail/shuzheng5201314/9733652
- dubbo-admin-2.5.4-SNAPSHOT-jdk8 http://download.csdn.net/detail/shuzheng5201314/9733657
- 更多资源请加 QQ 群
开发指南:
- 1、本机安装 Jdk7、Mysql、Redis、Zookeeper、ActiveMQ 并启动相关服务,使用默认配置默认端口即可
- 2、克隆源代码到本地并打开,推荐使用 IntelliJ IDEA,本地编译并安装到本地 maven 仓库
修改本地 Host
127.0.0.1 ui.zhangshuzheng.cn
127.0.0.1 upms.zhangshuzheng.cn
127.0.0.1 cms.zhangshuzheng.cn
127.0.0.1 pay.zhangshuzheng.cn
127.0.0.1 ucenter.zhangshuzheng.cn
127.0.0.1 wechat.zhangshuzheng.cn
127.0.0.1 api.zhangshuzheng.cn
127.0.0.1 oss.zhangshuzheng.cn
127.0.0.1 config.zhangshuzheng.cn
127.0.0.1 zkserver
127.0.0.1 rdserver
127.0.0.1 dbserver
127.0.0.1 mqserver
编译流程
maven 编译安装 zheng/pom.xml 文件即可
启动顺序(后台)
准备工作
新建 zheng 数据库,导入 project-datamodel 文件夹下的 zheng.sql
修改各 dao 模块和 rpc-service 模块的 redis.properties、jdbc.properties、generator.properties 数据库连接等配置信息,其中 master.redis.password、master.jdbc.password、slave.jdbc.password、generator.jdbc.password 密码值使用了 AES 加密,请使用 com.zheng.common.util.AESUtil 工具类修改这些值
启动 Zookeeper、Redis、ActiveMQ、Nginx(配置文件参考 project-tools/nginx 下的*.conf 文件)
zheng-upms
- 首先启动 zheng-upms-rpc-service(直接运行 src 目录下的 ZhengUpmsRpcServiceApplication#main 方法启动) => zheng-upms-server(jetty),然后按需启动对应子系统 xxx 的 zheng-xxx-rpc-service(main 方法) => zheng-xxx-webapp(jetty)

访问 http://upms.zhangshuzheng.cn:1111/,子系统菜单已经配置到 zheng-upms 权限中,不用直接访问子系统,默认帐号密码:admin/123456
登录成功后,可在右上角切换已注册系统访问
zheng-cms
zheng-cms-admin:启动 ActiveMQ-启动 => 启动 zheng-rpc-service => 启动 zheng-cms-admin
zheng-cms-web:启动 nginx 代理 zheng-ui 静态资源,配置文件可参考 nginx.conf
zheng-oss
首先启动 zheng-oss-web 服务
开发阶段,如果 zheng-oss-web 没有公网域名,推荐使用
ngrok内网穿透工具,为开发环境提供公网域名,实现上传回调启动 nginx 代理 zheng-ui 静态资源
开发演示(QQ 群内有“zheng 十分钟视频:从检出到启动.wmv”)
创建数据表(建议使用 PowerDesigner)
直接运行对应项目 dao 模块中的 generator.main(),可自动生成单表的 CRUD 功能和对应的 model、example、mapper、service 代码
生成的 model 和 example 均已实现 Serializable 接口,支持分布式
已包含抽象类 BaseServiceImpl,只需要继承抽象类并传入泛型参数,即可默认实现 mapper 接口所有方法,特殊需求直接扩展即可
BaseServiceImpl 默认已实现四种根据条件分页接口
selectByExampleWithBLOBsForStartPage()
selectByExampleForStartPage()
selectByExampleWithBLOBsForOffsetPage()
selectByExampleForOffsetPage()
BaseServiceImpl 方法根据读写操作自动切换主从数据源,继承的扩展接口,可手动通过
DynamicDataSource.setDataSource(DataSourceEnum.XXX.getName())指定数据源
启动流程:优先 rcp-service 服务提供者,再启动其他 webapp
扩展流程:可扩展和拆分 rpc-api 和 rpc-service 模块,可按微服务拆分或场景拆分
部署方式(QQ 群内有“zheng 十分钟视频:从打包到 linux 服务器部署.wmv”)
war 包项目:使用 tomcat 等 web 容器启动
rpc-service 服务提供者 jar 包:将打包后的 zheng-xxx-rpc-service-assembly.tar.gz 文件解压,使用 bin 目录的管理脚本运行即可,支持优雅停机。
框架规范约定
约定优于配置(convention over configuration),此框架约定了很多编程规范,下面一一列举:
- service 类,需要在叫名`service`的包下,并以`Service`结尾,如`CmsArticleServiceImpl`
- controller 类,需要在以`controller`结尾的包下,类名以 Controller 结尾,如`CmsArticleController.java`,并继承`BaseController`
- spring task 类,需要在叫名`task`的包下,并以`Task`结尾,如`TestTask.java`
- mapper.xml,需要在名叫`mapper`的包下,并以`Mapper.xml`结尾,如`CmsArticleMapper.xml`
- mapper 接口,需要在名叫`mapper`的包下,并以`Mapper`结尾,如`CmsArticleMapper.java`
- model 实体类,需要在名叫`model`的包下,命名规则为数据表转驼峰规则,如`CmsArticle.java`
- spring 配置文件,命名规则为`applicationContext-*.xml`
- 类名:首字母大写驼峰规则;方法名:首字母小写驼峰规则;常量:全大写;变量:首字母小写驼峰规则,尽量非缩写
- springmvc 配置加到对应模块的`springMVC-servlet.xml`文件里
- 配置文件放到`src/main/resources`目录下
- 静态资源文件放到`src/main/webapp/resources`目录下
- jsp 文件,需要在`/WEB-INF/jsp`目录下
- `RequestMapping`和返回物理试图路径的 url 尽量写全路径,如:`@RequestMapping("/manage")`、`return "/manage/index"`
- `RequestMapping`指定 method
- 模块命名为`项目`-`子项目`-`业务`,如`zheng-cms-admin`
- 数据表命名为:`子系统`_`表`,如`cms_article`
- 更多规范,参考[[阿里巴巴 Java 开发手册] http://git.oschina.net/shuzheng/zheng/attach_files
演示地址
演示地址: http://upms.zhangshuzheng.cn/
预览图

数据模型

拓扑图

开发进度

参与开发
首先谢谢大家支持,如果你希望参与开发,欢迎通过Github上 fork 本项目,并 Pull Request 您的 commit。
常见问题
Eclipse 下,dubbo 找不到 dubbo.xsd 报错,不影响使用,如果要解决,可参考 http://blog.csdn.net/gjldwz/article/details/50555922
报 zheng-xxx.jar 包找不到,请按照文档编译顺序,将源代码编译并安装到本地 maven 仓库
zheng-cms-admin 启动卡住:因为没有启动 activemq
zheng-upms-server 访问报 session 不存在:因为没有启动 redis 服务
界面没有样式:因为 zheng-admin 没有编译安装到本地仓库
linux 下执行 rpc-service 脚本报“bin/bash^M 坏的解释器”,使用 sed -i 's/\r$//' filename 删除脚本中\r 字符
