瀏覽代碼

Merge pull request #9 from hs-web/2.2-SNAPSHOT

2.2 snapshot
zhōuhào 8 年之前
父節點
當前提交
7b0be195a7
共有 17 個文件被更改,包括 374 次插入137 次删除
  1. 6 12
      doc/1.安装使用.md
  2. 16 52
      doc/2.API.md
  3. 4 0
      doc/README.md
  4. 160 0
      doc/create-crud.md
  5. 48 0
      doc/use-crud.md
  6. 37 60
      hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/datasource/DataSource.java
  7. 6 0
      hsweb-web-controller/src/main/java/org/hsweb/web/controller/AopAccessLoggerResolverAutoConfiguration.java
  8. 5 4
      hsweb-web-core/src/main/java/org/hsweb/web/core/logger/Slf4jAccessLoggerPersisting.java
  9. 0 1
      hsweb-web-dao/hsweb-web-dao-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/datasource/DataSourceMapper.xml
  10. 32 0
      hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/DynamicDataSourceAutoConfiguration.java
  11. 28 0
      hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDataSource.java
  12. 25 0
      hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDefaultDataSource.java
  13. 1 1
      hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/form/FormServiceImpl.java
  14. 5 4
      hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/module/ModuleMetaServiceImpl.java
  15. 1 1
      hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/user/UserServiceImpl.java
  16. 0 1
      hsweb-web-starter/src/main/java/org/hsweb/web/starter/SystemInitialize.java
  17. 0 1
      hsweb-web-starter/src/main/resources/org/hsweb/start/scripts/install/install.groovy

+ 6 - 12
doc/1.安装使用.md

@@ -1,8 +1,8 @@
 # 使用hsweb
 项目java8开发,使用maven进行管理.
 
-## 使用
-配置pom.xml
+## 1.配置maven pom.xml
+引入私服
 ```xml
  <!--统一依赖管理-->
  <dependencyManagement>
@@ -34,16 +34,10 @@
 <!--设置了dependencyManagement,可以不指定版本号-->
 <dependency>
         <groupId>org.hsweb</groupId>
-        <artifactId>hsweb-web-controller</artifactId>
+        <artifactId>hsweb-web-start</artifactId>
 </dependency>
+```
 
-<dependency>
-    <groupId>org.hsweb</groupId>
-    <artifactId>hsweb-web-service-simple</artifactId>
-</dependency>
+完整配置,可参照 [demo](https://github.com/hs-web/hsweb-demo/blob/master/pom.xml)
 
-<dependency>
-    <groupId>org.hsweb</groupId>
-    <artifactId>hsweb-web-dao-mybatis</artifactId>
-</dependency>
-```
+[查看api](2.API.md)

+ 16 - 52
doc/2.API.md

@@ -1,53 +1,17 @@
-# hsweb 常用api
+## 开发
+1. [创建通用crud](./create-crud.md)
+2. [使用通用crud](./use-crud.md)
 
-## CRUD
-[如何创建通用crud](./create-crud.md)
-
-查询:
-```java
-    
-    import static MyBean.Property.*; //属性名
-    myService.createQuery()
-        .where(name,"admin")
-        .or(name,"root")
-        .list(); //list(), list(0,10), single(),total();
-    //or
-    myService.createQuery().fromBean(myBean)
-        .where(name)
-        .or(name)
-        .list(); 
-    
-    // 复杂查询条件
-    // 等同sql  where name is not null and (name like '李%' or name like '周%') and age >0
-    // 参数全部预编译,不用担心注入
-     myService.createQuery()
-        .where().notNull(name)
-        .nest().or().like$(name,"李").or().like$(name,"周").end()
-        .and().gt(age,10).list();
-     
-    //自定义sql条件
-    
-    myService.createQuery()
-        .where()
-        .and().sql("name !=''")
-        .or().sql("age < #{age}",{age:10})// 使用预编译方式
-        .or().sql("age = #{[0]}",Arrays.asList(20))//获取集合参数
-        .or().sql("age > ? and (age <?)",60,100)//使用参数列表方式
-        .list(); 
-```
-
-修改,支持和query一致的条件
-```java
-    import static MyBean.Property.*;
-    myService.createUpdate()
-        .set(status,1)
-        .where(id,"data-id").exec();
-    // or
-    myService.createUpdate(myBean).fromBean().where(id).exec();
-```
-
-删除,支持和query一致的条件
-```java
-    import static MyBean.Property.*;
-    myService.createDelete().where(id,"data-id").exec();
-```
+## 使用
+1. [权限管理](): 权限资源-角色-用户.
+2. [配置管理](): kv结构,自定义配置.可通过此功能配置数据字典.
+3. [脚本管理](): 动态脚本,支持javascript,groovy,java动态编译执行.
+4. [表单管理](): 动态表单,可视化设计表单,自动生成数据库以及系统权限.无需重启直接生效.
+5. [模块设置](): 配合动态表单实现表格页,查询条件自定义.
+6. [数据库维护](): 在线维护数据库,修改表结构,执行sql.
+7. [数据源管理](): 配置多数据源.
+8. [代码生成器](): 在线生成代码,打包下载.可自定义模板.
+9. [定时任务](): 配置定时任务,使用动态脚本编写任务内容.
+10. [系统监控](): 监控系统资源使用情况.
+11. [缓存监控](): 监控缓存情况.
+12. [访问日志](): 记录用户每次操作情况

+ 4 - 0
doc/README.md

@@ -0,0 +1,4 @@
+# hsweb-framework
+
+1. [安装使用](1.安装使用.md)
+2. [API](2.API.md)

+ 160 - 0
doc/create-crud.md

@@ -0,0 +1,160 @@
+# 创建通用增删改查功能
+
+## 1. 实体
+目前hsweb只有一种实体:PO。统一继承 `GenericPo`
+
+新建实体`org.hsweb.demo.bean.test.MyTest`如下:
+```java
+    public class MyTest extends GenericPo{
+        private String name;
+        
+        private int age;
+        
+        //由于查询使用动态参数,使用此方式定义属性名。方便统一维护
+        public interface Property extends GenericPo.Property{
+            String name = "name";
+            String age  = "age";
+        }
+    }
+```
+
+建立数据库表(hsweb暂未使用jpa等方式自动建表):
+
+方式1: 编辑`resources/scripts/initialize.groovy` (此脚本在项目首次运行时执行) 并加入
+```groovy
+database.createOrAlter("s_test")
+        .addColumn().name("u_id").alias("id").comment("ID").jdbcType(JDBCType.VARCHAR).length(32).primaryKey().commit()
+        .addColumn().name("age").alias("age").comment("年龄").jdbcType(JDBCType.DECIMAL).length(16,0).commit()
+        .addColumn().name("name").alias("name").comment("姓名").jdbcType(JDBCType.VARCHAR).length(128).commit()
+        .comment("测试").commit();
+```
+
+方式2: 如果系统已经初始化,则需要手动建立表结构,或者使用更新版本的方式进行初始化:
+假设当前版本为 1.0.0, 升级为 1.0.1,则新建文件 ``resources/scripts/upgrade/1.0.1.groovy`` 并加入方式1中的脚本内容.
+在启动后,更新版本时会自动执行此脚本.
+
+## 2. dao 接口 
+
+定义接口 ``org.hsweb.demo.dao.test.MyTestMapper``
+
+(增删改查 继承GenericMapper即可)
+```java
+    public interface MyTestMapper extends GenericMapper<MyTest, String> {
+    }
+```
+## 3.mybatis dao实现
+mybatis 采用配置文件(xml)的方式
+
+新建xml配置`resources/org/hsweb/demo/mappers/test/MyTestMapper`如下:
+```xml
+<?xml version="1.0" encoding="UTF-8" ?>
+    <!DOCTYPE mapper
+            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+            "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
+    <mapper namespace="org.hsweb.demo.dao.test.MyTestMapper">
+        <resultMap id="TestResultMap" type="org.hsweb.demo.bean.test.MyTest">
+            <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR"/>
+            <result property="name" column="name" javaType="String" jdbcType="VARCHAR"/>
+            <result property="age" column="age" javaType="int" jdbcType="INTEGER"/>
+        </resultMap>
+    
+        <!--用于动态生成sql所需的配置-->
+        <sql id="config">
+            <!--动态sql使用resultMapId对应的配置,来生成sql-->
+            <bind name="resultMapId" value="'TestResultMap'"/>
+            <bind name="tableName" value="'s_test'"/>
+        </sql>
+        <insert id="insert" parameterType="org.hsweb.web.bean.common.InsertParam">
+            <include refid="config"/>
+            <include refid="BasicMapper.buildInsertSql"/>
+        </insert>
+    
+        <delete id="delete" parameterType="org.hsweb.web.bean.common.DeleteParam">
+            <include refid="config"/>
+            <include refid="BasicMapper.buildDeleteSql"/>
+        </delete>
+    
+        <update id="update" parameterType="org.hsweb.web.bean.common.UpdateParam">
+            <include refid="config"/>
+            <include refid="BasicMapper.buildUpdateSql"/>
+        </update>
+    
+        <select id="selectByPk" parameterType="string" resultMap="TestResultMap">
+            select * from s_test where u_id=#{id}
+        </select>
+    
+        <select id="select" parameterType="org.hsweb.web.bean.common.QueryParam" resultMap="TestResultMap">
+            <include refid="config"/>
+            <include refid="BasicMapper.buildSelectSql"/>
+        </select>
+    
+        <select id="total" parameterType="org.hsweb.web.bean.common.QueryParam" resultType="int">
+            <include refid="config"/>
+            <include refid="BasicMapper.buildTotalSql"/>
+        </select>
+    </mapper>
+```
+
+## 4. service 接口
+
+定义service接口 ``org.hsweb.demo.service.test.MyTestService``
+
+(增删改查 GenericService)
+```java
+public interface MyTestService extends GenericService<MyTest, String> {
+}
+```
+
+## 5. service 实现
+
+定义service实现类 ``org.hsweb.demo.service.test.impl.SimpleMyTestService``
+
+继承 AbstractServiceImpl
+```java
+@Service("testService")
+public class SimpleMyTestService extends AbstractServiceImpl<MyTest, String> implements MyTestService {
+    @Autowired
+    private MyTestMapper myTestMapper;
+    
+    //AbstractServiceImpl 使用GenericMapper的实现类进行CRUD操作
+    @Override
+    protected MyTestMapper getMapper() {
+        return myTestMapper;
+    }
+}
+```
+
+## 6. controller
+
+定义Controller ``org.hsweb.demo.controller.test.MyTestController``
+
+```java
+@RestController
+@RequestMapping("/myTest")
+@Authorize(module = "myTest") //权限验证
+@AccessLogger("测试模块")   //访问日志描述
+public class MyTestController extends GenericController<MyTest, String> {
+
+    @Autowired
+    MyTestService myTestService;
+    
+    @Override
+    protected MyTestService getService() {
+        return myTestService;
+    }
+}
+```
+
+## 7. 添加权限
+
+1、启动并登录系统,进入系统管理-权限管理模块加入对应的权限,重新登录即可使用了。
+2、或者参照初始化表的方式,以脚本的方式进行初始化,如:
+
+```groovy
+def module= [u_id: 'myTest', name: '测试', uri: 'admin/myTest/list.html', icon: '', parent_id: '-1', remark: '', status: 1, optional: '[{"id":"M","text":"菜单可见","checked":true},{"id":"import","text":"导入excel","checked":true},{"id":"export","text":"导出excel","checked":true},{"id":"R","text":"查询","checked":true},{"id":"C","text":"新增","checked":true},{"id":"U","text":"修改","checked":true},{"id":"D","text":"删除","checked":false}]', sort_index: 1];
+database.getTable("s_modules").createInsert().value(module).exec();
+```
+
+## 8. 感觉太麻烦?
+
+**使用在线代码生成器,一键生成上诉全部代码!**

+ 48 - 0
doc/use-crud.md

@@ -0,0 +1,48 @@
+
+# 1.查询:
+```java
+    
+    import static MyBean.Property.*; //属性名
+    myService.createQuery()
+        .where(name,"admin")
+        .or(name,"root")
+        .list(); //list(), list(0,10), single(),total();
+    //or
+    myService.createQuery().fromBean(myBean)
+        .where(name)
+        .or(name)
+        .list(); 
+    
+    // 复杂查询条件
+    // 等同sql  where name is not null and (name like '李%' or name like '周%') and age >0
+    // 参数全部预编译,不用担心注入
+     myService.createQuery()
+        .where().notNull(name)
+        .nest().or().like$(name,"李").or().like$(name,"周").end()
+        .and().gt(age,10).list();
+     
+    //自定义sql条件
+    myService.createQuery()
+        .where()
+        .and().sql("name !=''")
+        .or().sql("age < #{age}",{age:10})// 使用预编译方式
+        .or().sql("age = #{[0]}",Arrays.asList(20))//获取集合参数
+        .or().sql("age > ? and (age <?)",60,100)//使用参数列表方式
+        .list(); 
+```
+
+# 2.修改,支持和query一致的条件
+```java
+    import static MyBean.Property.*;
+    myService.createUpdate()
+        .set(status,1)
+        .where(id,"data-id").exec();
+    // or
+    myService.createUpdate(myBean).fromBean().where(id).exec();
+```
+
+# 3.删除,支持和query一致的条件
+```java
+    import static MyBean.Property.*;
+    myService.createDelete().where(id,"data-id").exec();
+```

+ 37 - 60
hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/datasource/DataSource.java

@@ -26,22 +26,19 @@ import org.hsweb.web.bean.po.GenericPo;
 public class DataSource extends GenericPo<String> {
     //数据源名称
     @NotBlank
-    private String name;
-    //驱动
-    @NotBlank
-    private String driver;
+    private String         name;
     //url
     @NotBlank
-    private String url;
+    private String         url;
     //用户名
     @NotBlank
-    private String username;
+    private String         username;
     //测试sql
-    private String testSql;
+    private String         testSql;
     //密码
-    private String password;
+    private String         password;
     //是否启用
-    private int enabled;
+    private int            enabled;
     //创建日期
     private java.util.Date createDate;
 
@@ -125,13 +122,6 @@ public class DataSource extends GenericPo<String> {
         this.createDate = createDate;
     }
 
-    public String getDriver() {
-        return driver;
-    }
-
-    public void setDriver(String driver) {
-        this.driver = driver;
-    }
 
     public String getUrl() {
         return url;
@@ -151,52 +141,39 @@ public class DataSource extends GenericPo<String> {
 
     public int getHash() {
         StringBuilder builder = new StringBuilder();
-        builder.append(driver).append(url).append(username).append(password).append(enabled);
+        builder.append(url).append(username).append(password).append(enabled);
         return builder.toString().hashCode();
     }
 
 
-
-public interface Property extends GenericPo.Property{
-	/**
-	 *
-	 * @see DataSource#name
-	 */
-	String name="name";
-	/**
-	 *
-	 * @see DataSource#driver
-	 */
-	String driver="driver";
-	/**
-	 *
-	 * @see DataSource#url
-	 */
-	String url="url";
-	/**
-	 *
-	 * @see DataSource#username
-	 */
-	String username="username";
-	/**
-	 *
-	 * @see DataSource#testSql
-	 */
-	String testSql="testSql";
-	/**
-	 *
-	 * @see DataSource#password
-	 */
-	String password="password";
-	/**
-	 *
-	 * @see DataSource#enabled
-	 */
-	String enabled="enabled";
-	/**
-	 *
-	 * @see DataSource#createDate
-	 */
-	String createDate="createDate";
-	}
+    public interface Property extends GenericPo.Property {
+        /**
+         * @see DataSource#name
+         */
+        String name       = "name";
+        /**
+         * @see DataSource#url
+         */
+        String url        = "url";
+        /**
+         * @see DataSource#username
+         */
+        String username   = "username";
+        /**
+         * @see DataSource#testSql
+         */
+        String testSql    = "testSql";
+        /**
+         * @see DataSource#password
+         */
+        String password   = "password";
+        /**
+         * @see DataSource#enabled
+         */
+        String enabled    = "enabled";
+        /**
+         * @see DataSource#createDate
+         */
+        String createDate = "createDate";
+    }
 }

+ 6 - 0
hsweb-web-controller/src/main/java/org/hsweb/web/controller/AopAccessLoggerResolverAutoConfiguration.java

@@ -8,6 +8,7 @@ import org.hsweb.web.bean.po.logger.LoggerInfo;
 import org.hsweb.web.bean.po.user.User;
 import org.hsweb.web.core.exception.BusinessException;
 import org.hsweb.web.core.logger.AccessLoggerPersisting;
+import org.hsweb.web.core.logger.Slf4jAccessLoggerPersisting;
 import org.hsweb.web.core.message.FastJsonHttpMessageConverter;
 import org.hsweb.web.core.message.ResponseMessage;
 import org.hsweb.web.core.utils.WebUtil;
@@ -29,6 +30,11 @@ public class AopAccessLoggerResolverAutoConfiguration {
         return new AopAccessLoggerResolverConfiguration();
     }
 
+    @Bean
+    public Slf4jAccessLoggerPersisting slf4jAccessLoggerPersisting() {
+        return new Slf4jAccessLoggerPersisting();
+    }
+
     @Aspect
     @Order(Ordered.HIGHEST_PRECEDENCE)
     static class AopAccessLoggerResolverConfiguration extends org.hsweb.web.core.logger.AopAccessLoggerResolver {

+ 5 - 4
hsweb-web-core/src/main/java/org/hsweb/web/core/logger/Slf4jAccessLoggerPersisting.java

@@ -15,9 +15,10 @@ public class Slf4jAccessLoggerPersisting implements AccessLoggerPersisting {
 
     @Override
     public void save(LoggerInfo loggerInfo) {
-        if (fastJsonHttpMessageConverter == null)
-            logger.info(JSON.toJSONString(loggerInfo));
-        else
-            logger.info(fastJsonHttpMessageConverter.converter(loggerInfo));
+        if (logger.isInfoEnabled())
+            if (fastJsonHttpMessageConverter == null)
+                logger.info(JSON.toJSONString(loggerInfo));
+            else
+                logger.info(fastJsonHttpMessageConverter.converter(loggerInfo));
     }
 }

+ 0 - 1
hsweb-web-dao/hsweb-web-dao-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/datasource/DataSourceMapper.xml

@@ -6,7 +6,6 @@
     <resultMap id="DataSourceResultMap" type="org.hsweb.web.bean.po.datasource.DataSource">
         <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR"/>
         <result property="name" column="name" javaType="String" jdbcType="VARCHAR"/>
-        <result property="driver" column="driver" javaType="String" jdbcType="VARCHAR"/>
         <result property="url" column="url" javaType="String" jdbcType="VARCHAR"/>
         <result property="username" column="username" javaType="String" jdbcType="VARCHAR"/>
         <result property="password" column="password" javaType="String" jdbcType="VARCHAR"/>

+ 32 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/DynamicDataSourceAutoConfiguration.java

@@ -21,9 +21,13 @@ import com.atomikos.icatch.config.UserTransactionServiceImp;
 import com.atomikos.icatch.jta.UserTransactionImp;
 import com.atomikos.icatch.jta.UserTransactionManager;
 import com.atomikos.jdbc.AtomikosDataSourceBean;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
 import org.hsweb.commons.StringUtils;
 import org.hsweb.web.core.datasource.DataSourceHolder;
 import org.hsweb.web.core.datasource.DynamicDataSource;
+import org.hsweb.web.core.exception.AuthorizeForbiddenException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -112,4 +116,32 @@ public class DynamicDataSourceAutoConfiguration {
         return new DynamicDataSourceSqlExecutorService();
     }
 
+    @Bean
+    public AnnotationDataSourceChangeConfiguration annotationDataSourceChangeConfiguration() {
+        return new AnnotationDataSourceChangeConfiguration();
+    }
+
+    @Aspect
+    public static class AnnotationDataSourceChangeConfiguration {
+        @Around(value = "@annotation(dataSource)")
+        public Object useDatasource(ProceedingJoinPoint pjp, UseDataSource dataSource) throws Throwable {
+            try {
+                DynamicDataSource.use(dataSource.value());
+                return pjp.proceed();
+            } finally {
+                DynamicDataSource.useDefault(false);
+            }
+        }
+
+        @Around(value = "@annotation(dataSource)")
+        public Object useDefaultDatasource(ProceedingJoinPoint pjp, UseDefaultDataSource dataSource) throws Throwable {
+            try {
+                DynamicDataSource.useDefault(dataSource.value());
+                return pjp.proceed();
+            } finally {
+                if (dataSource.value())
+                    DynamicDataSource.useLast();
+            }
+        }
+    }
 }

+ 28 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDataSource.java

@@ -0,0 +1,28 @@
+package org.hsweb.web.datasource.dynamic;
+
+import org.hsweb.web.bean.po.datasource.DataSource;
+import org.hsweb.web.core.datasource.DynamicDataSource;
+
+import java.lang.annotation.*;
+
+/**
+ * 通过注解,动态切换数据源。在动态数据源启用时才生效
+ *
+ * @author zhouhao
+ * @since 2.2
+ */
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface UseDataSource {
+    /**
+     * 数据源ID{@link DataSource#getId()},通过{@link DynamicDataSource}进行数据源切换。
+     * <br>
+     * 如果数据源id不存在,将使用默认的数据源
+     *
+     * @return 数据源ID
+     * @see DynamicDataSource#use(String)
+     */
+    String value();
+
+}

+ 25 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDefaultDataSource.java

@@ -0,0 +1,25 @@
+package org.hsweb.web.datasource.dynamic;
+
+import org.hsweb.web.core.datasource.DynamicDataSource;
+
+import java.lang.annotation.*;
+
+/**
+ * 通过注解,切换数据源为默认数据源
+ *
+ * @author zhouhao
+ * @see DynamicDataSource#useDefault(boolean)
+ * @since 2.2
+ */
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface UseDefaultDataSource {
+
+    /**
+     * 方法执行后是否切换到上次使用的数据源
+     *
+     * @return 是否自动切换为之前的数据源
+     */
+    boolean value() default true;
+}

+ 1 - 1
hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/form/FormServiceImpl.java

@@ -100,7 +100,7 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
         data.setUpdateDate(new Date());
         data.setVersion(old.getVersion());
         data.setRevision(old.getRevision() + 1);
-        return createUpdate(data).excludes(Property.createDate, Property.release, Property.version, Property.version)
+        return createUpdate(data).excludes(Property.using, Property.createDate, Property.release, Property.version)
                 .fromBean().where(Property.id).exec();
     }
 

+ 5 - 4
hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/module/ModuleMetaServiceImpl.java

@@ -57,12 +57,13 @@ public class ModuleMetaServiceImpl extends AbstractServiceImpl<ModuleMeta, Strin
         return createQuery()
                 //(id = ? or key = ? or module_id = ? )
                 .nest(id, key).or(Property.key, key).or(moduleId, key).end()
-                //and (role_id like ? or .....)
+                //and ((role_id like ? or .....) or (role_id is null or role_id =''))
                 //遍历roleId,使用 like %% 并将值转为 ,value, 格式进行查询
                 //如果有条件,应该写sql函数,将数据库中的值转为结果集和参数进行对比
-                .nest().each(roleId, roleIds, query -> query::$like$, roleIdValueMapper).end()
-                //and (role_id is null or role_id ='')
-                .nest().isNull(roleId).or().isEmpty(roleId).end()
+                .nest()
+                    .nest().each(roleId, roleIds, query -> query::$like$, roleIdValueMapper).end()
+                    .orNest().isNull(roleId).or().isEmpty(roleId).end()
+                .end()
                 .getParam();
     }
 

+ 1 - 1
hsweb-web-service/hsweb-web-service-simple/src/main/java/org/hsweb/web/service/impl/user/UserServiceImpl.java

@@ -82,7 +82,7 @@ public class UserServiceImpl extends AbstractServiceImpl<User, String> implement
             data.setPassword(MD5.encode(data.getPassword()));
             userMapper.updatePassword(data);
         }
-        int i = createUpdate(data).excludes(Property.status, Property.password, Property.createDate).exec();
+        int i = createUpdate(data).excludes(Property.status, Property.password, Property.createDate).fromBean().where(Property.id).exec();
         if (data.getUserRoles() != null) {
             //删除所有
             userRoleMapper.deleteByUserId(data.getId());

+ 0 - 1
hsweb-web-starter/src/main/java/org/hsweb/web/starter/SystemInitialize.java

@@ -141,7 +141,6 @@ public class SystemInitialize implements InitializingBean {
             } else if (frameworkCompare < 0) {
                 tryUpgradeFramework();
                 sync = true;
-                syncSystemVersion();
             } else {
                 if (logger.isInfoEnabled())
                     logger.info("framework : {}", installedVersion.getFrameworkVersion());

+ 0 - 1
hsweb-web-starter/src/main/resources/org/hsweb/start/scripts/install/install.groovy

@@ -114,7 +114,6 @@ database.createOrAlter("s_role")
 database.createOrAlter("s_data_source")
         .addColumn().name("u_id").jdbcType(JDBCType.VARCHAR).length(32).notNull().primaryKey().comment("id").commit()
         .addColumn().name("name").jdbcType(JDBCType.VARCHAR).length(64).notNull().comment("数据源名称").commit()
-        .addColumn().name("driver").jdbcType(JDBCType.VARCHAR).length(128).notNull().comment("驱动").commit()
         .addColumn().name("url").jdbcType(JDBCType.VARCHAR).length(512).notNull().comment("url").commit()
         .addColumn().name("username").jdbcType(JDBCType.VARCHAR).length(128).notNull().comment("用户名").commit()
         .addColumn().name("password").jdbcType(JDBCType.VARCHAR).length(128).notNull().comment("密码").commit()