Commit fc72457a by huangpu

Merge remote-tracking branch 'origin/master'

parents 17f052e9 d44f0999
# Guns V2.2 # Guns V2.3
新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl! 新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl!
在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xml的配置方式,利用springboot + javabean方式配置spring,极大简化了pom.xml配置和spring配置. 在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xml的配置方式,利用springboot + javabean方式配置spring,极大简化了pom.xml配置和spring配置.
...@@ -13,17 +13,15 @@ Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模 ...@@ -13,17 +13,15 @@ Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模
## 技术讨论 ## 技术讨论
如果对项目有任何疑问或者建议,欢迎加入Guns技术交流群:254550081(加之前请先看一遍readme文档) 如果对项目有任何疑问或者建议,欢迎加入Guns技术交流群:254550081(加之前请先看一遍readme文档)
## V2.2更新日志 ## V2.3更新日志
1. 菜单树由最多二级菜单拓展为三级菜单 1. 增加多数据源支持
2. 用户管理页面新增部门树,方便查询部门人员信息 2. 增加富文本编辑器支持
3. 完善系统的session机制,增加session失效时间的跳转 3. 数据库字段增加注释
4. 完善Guns代码生成功能,新增Dao和Service,并且所有的生成都是可选的 4. 数据字典不单单是查询功能,可以动态绑定到业务中当做枚举值使用
5. 删除信息增加提示框 5. 上传图片增加进度条显示
6. 删除父菜单可以删除所有子菜单 6. 增加上线发布流程文档(上线发布流程.md)
7. 新增对页面的js验证,所用框架为bootstrap validator 7. 解决页面点击查询,左侧菜单高亮会消失bug
8. 完善druid监控,新增Web应用监控,URI监控,session监控 8. 解决个人信息无法提交的bug
9. 修复新增含有0值的字典,查询会出现多条的bug
10. 修复没有角色的用户登录报错的bug
### 如果不喜欢SpringBoot? ### 如果不喜欢SpringBoot?
如果您不喜欢用SpringBoot,或者您是一个spring初学者,您可以切换到[Guns V1.0(点击这里)](http://git.oschina.net/naan1993/guns/tree/v1.0/)分支, 如果您不喜欢用SpringBoot,或者您是一个spring初学者,您可以切换到[Guns V1.0(点击这里)](http://git.oschina.net/naan1993/guns/tree/v1.0/)分支,
......
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<shiro.version>1.4.0</shiro.version> <shiro.version>1.4.0</shiro.version>
<mybatisplus-spring-boot-starter.version>1.0.3</mybatisplus-spring-boot-starter.version> <mybatisplus-spring-boot-starter.version>1.0.4</mybatisplus-spring-boot-starter.version>
<mybatis-plus.version>2.1-gamma</mybatis-plus.version>
<fastjson.version>1.2.31</fastjson.version> <fastjson.version>1.2.31</fastjson.version>
<commons.io.version>2.5</commons.io.version> <commons.io.version>2.5</commons.io.version>
<velocity.version>1.7</velocity.version> <velocity.version>1.7</velocity.version>
...@@ -109,6 +110,11 @@ ...@@ -109,6 +110,11 @@
<!--其他依赖--> <!--其他依赖-->
<dependency> <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>${fastjson.version}</version> <version>${fastjson.version}</version>
......
...@@ -46,6 +46,7 @@ public enum BizExceptionEnum { ...@@ -46,6 +46,7 @@ public enum BizExceptionEnum {
/** /**
* 错误的请求 * 错误的请求
*/ */
DICT_MUST_BE_NUMBER(400,"字典的值必须为数字"),
REQUEST_NULL(400, "请求有错误"), REQUEST_NULL(400, "请求有错误"),
SESSION_TIMEOUT(400, "会话超时"), SESSION_TIMEOUT(400, "会话超时"),
SERVER_ERROR(500, "服务器异常"); SERVER_ERROR(500, "服务器异常");
......
...@@ -22,7 +22,6 @@ public class FastjsonConfig { ...@@ -22,7 +22,6 @@ public class FastjsonConfig {
FastJsonConfig fastJsonConfig = new FastJsonConfig(); FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures( fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat, SerializerFeature.PrettyFormat,
SerializerFeature.WriteClassName,
SerializerFeature.WriteMapNullValue SerializerFeature.WriteMapNullValue
); );
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
......
...@@ -27,6 +27,8 @@ public class BeetlProperties { ...@@ -27,6 +27,8 @@ public class BeetlProperties {
private String resourceTagsuffix; private String resourceTagsuffix;
private String resourceAutoCheck;
@Value("${spring.mvc.view.prefix}") @Value("${spring.mvc.view.prefix}")
private String prefix; private String prefix;
...@@ -49,6 +51,9 @@ public class BeetlProperties { ...@@ -49,6 +51,9 @@ public class BeetlProperties {
if(ToolUtil.isNotEmpty(resourceTagsuffix)){ if(ToolUtil.isNotEmpty(resourceTagsuffix)){
properties.setProperty("RESOURCE.tagSuffix",resourceTagsuffix); properties.setProperty("RESOURCE.tagSuffix",resourceTagsuffix);
} }
if(ToolUtil.isNotEmpty(resourceAutoCheck)){
properties.setProperty("RESOURCE.autoCheck",resourceAutoCheck);
}
return properties; return properties;
} }
...@@ -87,4 +92,12 @@ public class BeetlProperties { ...@@ -87,4 +92,12 @@ public class BeetlProperties {
public void setResourceTagsuffix(String resourceTagsuffix) { public void setResourceTagsuffix(String resourceTagsuffix) {
this.resourceTagsuffix = resourceTagsuffix; this.resourceTagsuffix = resourceTagsuffix;
} }
public String getResourceAutoCheck() {
return resourceAutoCheck;
}
public void setResourceAutoCheck(String resourceAutoCheck) {
this.resourceAutoCheck = resourceAutoCheck;
}
} }
...@@ -52,7 +52,11 @@ public class DictServiceImpl implements IDictService { ...@@ -52,7 +52,11 @@ public class DictServiceImpl implements IDictService {
Dict itemDict = new Dict(); Dict itemDict = new Dict();
itemDict.setPid(dict.getId()); itemDict.setPid(dict.getId());
itemDict.setName(name); itemDict.setName(name);
try {
itemDict.setNum(Integer.valueOf(num)); itemDict.setNum(Integer.valueOf(num));
}catch (NumberFormatException e){
throw new BussinessException(BizExceptionEnum.DICT_MUST_BE_NUMBER);
}
this.dictMapper.insert(itemDict); this.dictMapper.insert(itemDict);
} }
} }
......
...@@ -22,6 +22,7 @@ beetl: ...@@ -22,6 +22,7 @@ beetl:
delimiter-statement-end: null delimiter-statement-end: null
resource-tagroot: common/tags #自定义标签文件Root目录和后缀 resource-tagroot: common/tags #自定义标签文件Root目录和后缀
resource-tagsuffix: tag resource-tagsuffix: tag
resource-auto-check: true #是否检测文件变化,开发用true合适,但线上要改为false
################### spring配置 ################### ################### spring配置 ###################
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
@for(title in titles){ @for(title in titles){
@if(tool.isEmpty(title.children)){ @if(tool.isEmpty(title.children)){
<li> <li>
<a class="J_menuItem" href="${ctxPath}${title.url}"> <a class="J_menuItem" href="${ctxPath}${title.url}" name="tabMenuItem">
<i class="fa ${title.icon}"></i> <i class="fa ${title.icon}"></i>
<span class="nav-label">${title.name}</span> <span class="nav-label">${title.name}</span>
</a> </a>
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
@for(subTitle in title.children){ @for(subTitle in title.children){
@if(tool.isEmpty(subTitle.children)){ @if(tool.isEmpty(subTitle.children)){
<li> <li>
<a class="J_menuItem" href="${ctxPath}${subTitle.url}">${subTitle.name}</a> <a class="J_menuItem" href="${ctxPath}${subTitle.url}" name="tabMenuItem">${subTitle.name}</a>
</li> </li>
@}else{ @}else{
<li> <li>
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
<ul class="nav nav-third-level"> <ul class="nav nav-third-level">
@for(thirdTitle in subTitle.children){ @for(thirdTitle in subTitle.children){
<li> <li>
<a class="J_menuItem" href="${ctxPath}${thirdTitle.url}">${thirdTitle.name}</a> <a class="J_menuItem" href="${ctxPath}${thirdTitle.url}" name="tabMenuItem">${thirdTitle.name}</a>
</li> </li>
@} @}
</ul> </ul>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">${name}</label> <label class="col-sm-3 control-label">${name}</label>
<div class="col-sm-9"> <div class="col-sm-9">
<select class="form-control" id="${id}"> <select class="form-control" id="${id}" name="${id}">
${tagBody!} ${tagBody!}
</select> </select>
@if(isNotEmpty(hidden)){ @if(isNotEmpty(hidden)){
......
...@@ -7890,3 +7890,8 @@ body.skin-3 { ...@@ -7890,3 +7890,8 @@ body.skin-3 {
font-size: 12px font-size: 12px
} }
} }
.tab-menu-selected {
background-color: #293846 !important;
color: white !important;
}
\ No newline at end of file
...@@ -169,6 +169,7 @@ $(function () { ...@@ -169,6 +169,7 @@ $(function () {
if ($(this).parents('.J_menuTab').next('.J_menuTab').size()) { if ($(this).parents('.J_menuTab').next('.J_menuTab').size()) {
var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id'); var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id');
highLightMenuItem(activeId); //高亮对应的tab菜单
$(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active'); $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active');
$('.J_mainContent .J_iframe').each(function () { $('.J_mainContent .J_iframe').each(function () {
...@@ -218,6 +219,7 @@ $(function () { ...@@ -218,6 +219,7 @@ $(function () {
return false; return false;
} }
}); });
highLightMenuItem(activeId);//高亮对应的tab菜单
} }
} }
// 当前元素不处于活动状态 // 当前元素不处于活动状态
...@@ -260,6 +262,7 @@ $(function () { ...@@ -260,6 +262,7 @@ $(function () {
function activeTab() { function activeTab() {
if (!$(this).hasClass('active')) { if (!$(this).hasClass('active')) {
var currentId = $(this).data('id'); var currentId = $(this).data('id');
highLightMenuItem(currentId); //高亮对应的tab菜单
// 显示tab对应的内容区 // 显示tab对应的内容区
$('.J_mainContent .J_iframe').each(function () { $('.J_mainContent .J_iframe').each(function () {
if ($(this).data('id') == currentId) { if ($(this).data('id') == currentId) {
......
...@@ -7,7 +7,6 @@ $(document).ready(function () { ...@@ -7,7 +7,6 @@ $(document).ready(function () {
// MetsiMenu // MetsiMenu
$('#side-menu').metisMenu(); $('#side-menu').metisMenu();
// 打开右侧边栏 // 打开右侧边栏
$('.right-sidebar-toggle').click(function () { $('.right-sidebar-toggle').click(function () {
$('#right-sidebar').toggleClass('sidebar-open'); $('#right-sidebar').toggleClass('sidebar-open');
...@@ -95,6 +94,12 @@ $(document).ready(function () { ...@@ -95,6 +94,12 @@ $(document).ready(function () {
} }
}); });
//点击菜单的时候高亮显示菜单
$("a[name='tabMenuItem']").click(function(){
clearTabMenuItem();
$(this).addClass("tab-menu-selected");
});
$('.nav-close').click(NavToggle); $('.nav-close').click(NavToggle);
//ios浏览器兼容性处理 //ios浏览器兼容性处理
...@@ -111,6 +116,17 @@ $(window).bind("load resize", function () { ...@@ -111,6 +116,17 @@ $(window).bind("load resize", function () {
} }
}); });
function clearTabMenuItem(){
$("a[name='tabMenuItem']").each(function(){
$(this).removeClass("tab-menu-selected");
});
}
function highLightMenuItem(hrefVal){
clearTabMenuItem();
$("a[href='" + hrefVal + "']").addClass("tab-menu-selected");
}
function NavToggle() { function NavToggle() {
$('.navbar-minimalize').trigger('click'); $('.navbar-minimalize').trigger('click');
} }
......
# 上线发布流程
# 上线发布流程
项目如果要发布到生产环境,步骤如下:
## 修改application.yml相关配置
1.开启验证码验证:
```
guns.kaptcha-open=true
```
2.开启session超时验证:
```
guns.session-open=true
```
并根据需求配置这两个参数的大小:session-invalidate-time 和 session-validation-interval.
3.服务器端口根据上线需要进行修改:
```
server.port=xxxx
```
4.beetl文件检测要改为false:
```
beetl.resource-auto-check=false
```
5.激活的相关的profile
```
spring.profiles.active=produce
```
6.关闭开发者工具
```
spring.devtools.restart.enabled=false
```
## 打包
guns支持多种启动方式(详情见readme),根据启动方式下面介绍两种打包方式:
1.打成jar包启动,执行maven命令:
```
clean package -Dmaven.test.skip=true
```
然后放到linxu中执行后台运行命令
```
nohup java -jar xxx.jar >out.txt 2>&1 &
```
2.打成war包启动,首先修改pom中packaging改为war,然后执行1的打包命令,直接放入服务器tomcat的webapp文件夹即可
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment