# 功能描述

实现通用的数据增删改查等功能。 导入本包就具有通用查询及保存服务。 前后端通信格式:

提示

为了减少传输次数,可配置在保存同时将最新查询结果返回。

# 数据增删改查使用

# 第一步 引入包

<dependency>
    <groupId>sei-cloud</groupId>
    <artifactId>data</artifactId>
</dependency>
1
2
3
4

# 第二步 引入接口

@Resource
    CommonQuerySaveService commonQuerySaveService;
1
2

# 第三步 使用接口

/**
 * 通用数据查询保存服务
 * @author xiong
 */
public interface CommonQuerySaveService {

    /**
     * 通用数据保存
     * @param requestSave: JSON内容
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg save(@NonNull Object requestSave) throws Exception;

    /**
     * 通用数据查询
     * @param requestSave: JSON内容
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg query(@NonNull Object requestSave) throws Exception;

    /**
     * 导出资源
     * @param json: JSON内容
     * @return String
     * @throws SQLException 异常
     * @throws IOException 异常
     */
    String exportResource(JSONObject json) throws SQLException, IOException;

    /**
     * 导入资源
     * @param files: 资源文件
     * @param data: 附加数据
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg importResource(List<MultipartFile> files, Map<String, Object> data) throws Exception;

    /**
     * 专用于admin在前端数据源测试编写的SQL查询语句
     * @param requestQuery: 内容
     * @return ResMsg
     */
    ResMsg querySQL(@NonNull JSONObject requestQuery);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# Service接口

# 第一步 引入包

<dependency>
    <groupId>sei-cloud</groupId>
    <artifactId>data</artifactId>
</dependency>
1
2
3
4

# 第二步 引入接口

@Resource
    UserService userService;
1
2

# 第三步 使用接口

/**
 * 用户服务接口
 * @author xiong
 */
public interface UserService {

    /**
     * 获得角色菜单
     * @param rid: 角色
     * @param _PID: 父角色
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg getRoleMenu(String rid, String _PID) throws SQLException;

    /**
     * 获得用户菜单
     * @param from: 从哪个页面发起的请求
     * @param fieldCase: 结果字段是否转大小写:0:不转,1:转大写,2:转小写
     * @return List
     * @throws SQLException 异常
     */
    ResMsg getMenu(String from, int fieldCase) throws SQLException;

    /**
     * 设置用户菜单
     * @param json: 内容
     * @return ResMsg
     * @throws SQLException 异常
     * @throws IllegalArgumentException 异常
     */
    ResMsg setMenu(JSONObject json) throws SQLException, IllegalArgumentException;

    /**
     * 获得角色权限列表(用于对角色的权限设置)
     * @param json: 内容
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg getRolePrivilegeList(JSONObject json) throws Exception;

    /**
     * 用户更改口令
     * @param json: 内容
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg changePassword(JSONArray json) throws SQLException;

    /**
     * 用户信息
     * @param uid: 用户登录账号
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg getUserInfo(String uid) throws SQLException;

    /**
     * 保存用户信息
     * @param json: 用户信息
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg setUserInfo(JSONObject json) throws Exception;

    /**
     * 获得当前用户或指定用户的上级单位
     * @param json: json数据
     * 格式: {
     *     oid: 指定的oid,如果不设置则使用当前登录的oid
     * }
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg getParentOrg(JSONObject json) throws SQLException;

    /**
     * 注册单位及单位管理员
     * @param json: json数据
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg registerOrgAndUser(JSONObject json) throws Exception;

    /**
     * 修改注册单位审核未通过的单位和单位管理员信息
     * @param json: json数据
     * @return ResMsg
     * @throws Exception 异常
     */
    ResMsg registerEditOrgAndUser(JSONObject json) throws Exception;

    /**
     * 获得当前用户可委托的菜单及功能
     * @param json: json数据
     * @return ResMsg
     * @throws SQLException 异常
     */
    ResMsg getTrust(JSONObject json) throws SQLException;

    /**
     * 保存用户委托权限
     * @param json: json数据
     * @return ResMsg
     */
    ResMsg saveTrust(JSONObject json) throws SQLException;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

# Controller接口

数据查询与保存服务接口:

@Api(description = "数据查询与保存服务")
@RequestMapping(value = "/api/data/")
public class DataBusController {

    @ApiOperation(value = "数据保存服务(公共接口)",response = ResMsg.class)
    @RequestMapping(value = "/public/save",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg publicSave(@RequestBody Object json) throws Exception;

    @ApiOperation(value = "数据查询服务(公共接口)",response = ResMsg.class)
    @RequestMapping(value = "/public/query",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg publicQuery(@RequestBody JSONObject json) throws Exception;

    @ApiOperation(value = "SQL编辑器查询服务",response = ResMsg.class)
    @RequestMapping(value = "/querySQL",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg querySQL(@RequestBody JSONObject json);

    @ApiOperation(value = "清除所有缓存服务",response = ResMsg.class)
    @RequestMapping(value = "/removeAllCache",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg removeAllCache();

    @ApiOperation(value = "获得所有表名称服务",response = ResMsg.class)
    @RequestMapping(value = "/getAllTablesName",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getAllTablesName() throws SQLException;

    @ApiOperation(value = "获得指定表中所有字段名服务",response = ResMsg.class)
    @RequestMapping(value = "/getTableAllFieldsName",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getTableAllFieldsName(@RequestBody JSONObject json) throws Exception;

    @ApiOperation(value = "获得所有表名及所有字段名服务",response = ResMsg.class)
    @RequestMapping(value = "/getAllTableAllFieldsName",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getAllTableAllFieldsName() throws SQLException;

    @ApiOperation(value = "获得指定模块的表、视图和自定义SQL",response = ResMsg.class)
    @RequestMapping(value = "/getModuleInfo",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getModuleInfo(@RequestBody JSONObject json) throws SQLException;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

用户服务接口:

@Api(description = "用户服务")
@RequestMapping(value = "/api/user/")
public class UserController {

    @ApiOperation(value = "获得用户菜单",response = ResMsg.class)
    @RequestMapping(value = "/public/getMenu",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getMenu(@RequestBody JSONObject json) throws Exception;

    @ApiOperation(value = "获得用户信息",response = ResMsg.class)
    @RequestMapping(value = "/public/getUserInfo",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg getUserInfo(@RequestBody JSONObject json) throws Exception;

    @ApiOperation(value = "保存用户信息",response = ResMsg.class)
    @RequestMapping(value = "/public/saveUserInfo",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg saveUserInfo(@RequestBody Object json) throws Exception;

    @ApiOperation(value = "设置用户菜单",response = ResMsg.class)
    @RequestMapping(value = "/setMenu",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg setMenu(@RequestBody JSONObject json) throws Exception;

    @ApiOperation(value = "更改口令",response = ResMsg.class)
    @RequestMapping(value = "/changePassword",method = {RequestMethod.POST},produces = { MediaType.APPLICATION_JSON_VALUE })
    public @ResponseBody ResMsg changePassword(@RequestBody JSONArray json) throws Exception;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 扩展事件

# 用户菜单定制化

  1. 抽象类定义
public abstract class UserExtEvent {

    /**
     * 设置菜单业务扩展信息
     * @param resMsg: 返回前端的数据(已经包含了sessionUser)
     */
    public void userMenuExtInfo(ResMsg resMsg) {

    }

}
1
2
3
4
5
6
7
8
9
10
11
  1. 使用方式 新建一个自己的类并集成UserExtEvent类,覆盖userMenuExtInfo方法。 例如:
public class MyUserExtEvent extends UserExtEvent {

    /**
     * 设置菜单业务扩展信息
     * @param resMsg: 返回前端的数据(已经包含了sessionUser)
     */
    public void userMenuExtInfo(ResMsg resMsg) {
        //TODO 修改 resMsg 对象内的值
    }

}
1
2
3
4
5
6
7
8
9
10
11

# 数据解析和增/删/改/查的定制化

本组件在 增/删/改/查 时定义了不同的事件,用户可通过继承不同的类并覆盖默认方法达到定制化效果。

  • DataParseEvent 抽象类实现对前端传回的JSON格式解析转换为SQL实体前后的定制化
  • DataPrivilegeEvent 抽象类实现自定义权限
  • DataQueryEvent 抽象类实现对查询定制化,包括将SQL实体转换为SQL语句以及执行前后的定制化
  • DataSaveEvent 抽象类实现对数据增/删/改时的定制化

# JSON解析转换事件

/**
 * 接收到前端JSON请求并将它转换为实体前后的事件
 */
public abstract class DataParseEvent {
    /** 执行顺序 */
    private int order;

    /**
     * 将前端JSON解析为SQL保存实体前调用
     * @param request: 前端参数(JSONObject 或 JSONArray)
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则继续后续操作,否则终止并将 resMsg 信息返回前端
     */
    public boolean beforeParseSave(Object request, ResMsg resMsg) {
        return true;
    }

    /**
     * 将前端JSON解析为SQL保存实体后调用
     * @param request: 前端参数(JSONObject 或 JSONArray)
     * @param sqlSaveEntry: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则继续后续操作,否则终止并将 resMsg 信息返回前端
     */
    public boolean afterParseSave(Object request, DataSaveEntity sqlSaveEntry, ResMsg resMsg) {
        return true;
    }

    /**
     * 将前端JSON解析为SQL查询实体前调用
     * @param request: 前端参数(JSONObject 或 JSONArray)
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则继续后续操作,否则终止并将 resMsg 信息返回前端
     */
    public boolean beforeParseQuery(Object request, ResMsg resMsg) {
        return true;
    }

    /**
     * 将前端JSON解析为SQL查询实体前调用
     * @param request: 前端参数(JSONObject 或 JSONArray)
     * @param resMsg: 终止时返回前端的结果
     * @param sqlQueryEntry: SQL查询实体
     * @return 返回true则继续后续操作,否则终止并将 resMsg 信息返回前端
     */
    public boolean afterParseQuery(Object request, DataQueryEntity sqlQueryEntry, ResMsg resMsg) {
        return true;
    }

    /**
     * 获得当前类的排序
     * @return int
     */
    public int getOrder() {
        return order;
    }

    /**
     * 设置当前类的排序
     * @param order: 排序
     */
    public void setOrder(int order) {
        this.order = order;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

# 权限检查事件

/**
 * 权限检查事件
 * 提示:
 * 		通过 PrivilegeServiceImpl.getInstance() 获得系统权限操作服务
 * 		通过 SQLServiceImpl.getInstance() 获得系统SQL操作服务
 */
public abstract class DataPrivilegeEvent {
    /** 执行顺序 */
    private int order;

    /**
     * 检查权限
     * @param sqlvo: SQL对象
     * @return 返回true执行后续检查,false终止操作并抛出无权限提示
     */
    public abstract boolean checkQueryPrivilege(SQLVo sqlvo);

    /**
     * 检查权限(覆盖默认的权限检查)
     * @param dataEntity: DataEntity实体
     * @return PrivilegeVo
     */
    public abstract PrivilegeVo getPrivilege(DataEntity dataEntity);

    /**
     * 获得当前类的排序
     * @return int
     */
    public int getOrder() {
        return order;
    }

    /**
     * 设置当前类的排序
     * @param order: 排序
     */
    public void setOrder(int order) {
        this.order = order;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 查询转换及执行前后事件

/**
 * 查询转换及执行前后事件
 * 提示: 通过 SqlServiceImpl.getInstance() 获得数据操作服务
 */
public abstract class DataQueryEvent {
    /** 执行顺序 */
    private int order;

    /**
     * SQL查询实体转换为SQL语句前调用
     * @param request: 前端参数
     * @param dataQueryEntity: SQL查询实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则进行转换,否则终止
     */
    public boolean beforeConvert(JSONObject request, DataQueryEntity dataQueryEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * SQL查询实体转换为SQL语句后调用
     * @param request: 前端参数
     * @param dataQueryEntity: SQL查询实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true进行下一步查询操作,否则终止
     */
    public boolean afterConvert(JSONObject request, DataQueryEntity dataQueryEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 查询前调用
     * @param request: 前端参数
     * @param dataQueryEntity: SQL查询实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行查询,否则终止
     */
    public boolean beforeQuery(JSONObject request, DataQueryEntity dataQueryEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 查询后调用(可通过sqlQueryEntry.getResMsg()获得查询结果)
     * @param request: 前端参数
     * @param dataQueryEntity: SQL查询实体
     * @param resMsg: 终止时返回前端的结果
     */
    public void afterQuery(JSONObject request, DataQueryEntity dataQueryEntity, ResMsg resMsg) {

    }

    /**
     * 获得当前类的执行排序
     * @return int
     */
    public int getOrder() {
        return order;
    }

    /**
     * 设置当前类的执行排序
     * @param order: 执行排序
     */
    public void setOrder(int order) {
        this.order = order;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 保存转换及执行前后事件

/**
 * 保存转换及执行前后事件
 * 提示: 通过 SqlServiceImpl.getInstance() 获得数据操作服务
 */
public abstract class DataSaveEvent {

    /** 表名,多个表名使用逗号分隔 */
    private String tableName;

    /** 执行顺序 */
    private int order;

    /**
     * 设置表名和执行顺序
     * 例如:
     * public void registerTable() {
     *     setTableName("表名"); //必须设置,标明对该表的操作,例如设置为sys_user,则只有对sys_user表操作时才调用本类
     *     setOrder(1);	//可以不设置,默认为0,当有多个类时设置该类在执行链中的顺序
     *     //上面是2条语句,可以调用1条语句执行,即: setTableAndOrder("表名", 执行顺序);
     * }
     */
    public abstract void registerTable();

    /**
     * 设置挂载的表及调用顺序
     * @param tableName: 挂载的表(例如挂载到sys_user表,则只有对sys_user表操作时才调用本类)。
     * @param order: 调用顺序
     */
    public void setTableAndOrder(@NonNull String tableName, int order){
        this.tableName = tableName;
        this.order = order;
    }

    /**
     * SQL保存实体转换为SQL语句前调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: 保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则进行转换,否则终止
     */
    public boolean beforeConvert(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * SQL保存实体转换为SQL语句后调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则进行下一步保存操作,否则终止
     */
    public boolean afterConvert(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 数据保存前调用(包括INSERT, UPDATE, DELETE时都会调用),与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行保存操作,否则终止
     */
    public boolean beforeSave(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 数据保存后调用(包括INSERT, UPDATE, DELETE时都会调用),与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     */
    public void afterSave(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {

    }

    /**
     * 数据插入(INSERT)前调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: 保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行插入,否则终止
     */
    public boolean beforeInsert(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 数据插入(INSERT)后调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: 保存实体
     * @param resMsg: 终止时返回前端的结果
     */
    public void afterInsert(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {

    }

    /**
     * 数据修改(UPDATE)前调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行修改,否则终止
     */
    public boolean beforeUpdate(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 数据修改(UPDATE)后调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     */
    public void afterUpdate(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {

    }

    /**
     * 数据删除(DELETE)前调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行删除,否则终止
     */
    public boolean beforeDelete(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
        return true;
    }

    /**
     * 数据删除(DELETE)后调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: SQL保存实体
     * @param resMsg: 终止时返回前端的结果
     */
    public void afterDelete(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {

    }

    /**
     * 获得当前操作表名称
     * @return String
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 设置当前操作表名称
     * @param tableName: 表名称
     */
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    /**
     * 获得当前类的执行排序
     * @return int
     */
    public int getOrder() {
        return order;
    }

    /**
     * 设置当前类的执行排序
     * @param order: 执行排序
     */
    public void setOrder(int order) {
        this.order = order;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

###日志操作事件

/**
 * 更改操作日志
 */
public abstract class DBLogEvent {
    /** 执行顺序 */
    private int order;

    /**
     * 获得当前类的执行排序
     * @return int
     */
    public int getOrder() {
        return order;
    }

    /**
     * 设置当前类的执行排序
     * @param order: 执行排序
     */
    public void setOrder(int order) {
        this.order = order;
    }

    /**
     * 日志保存前回调, 常用于更改保存前的日志
     * @param message: 日志内容
     * message格式:
     * {
     *     _UUID: 主键,唯一序列号
     *     _TYPE: 日志类型
     *     _TIME: 操作时间
     *     _IP: 用户IP
     *     _SEQUENCE: 前端请求时的唯一序列号
     *     _UID: 用户ID
     *     _NAME: 用户姓名
     *     _MID: 模块编号
     *     _TABLENAME: 操作的表名称
     *     _ACTION: 操作类型,add:新增, edit:编辑, del: 删除
     *     _INFO: 操作的具体内容
     *     _OTHER: 附加信息
     * }
     * @return boolean
     * 注意: 返回false将忽略本次日志,即: 不保存到日志数据库
     */
    public boolean beforeSave(Map message) {
        return true;
    }

    /**
     * 日志保存后的回调, 常用于处理保存后的其它操作
     * @param message: 日志内容
     * message格式:
     * {
     *     _UUID: 主键,唯一序列号
     *     _TYPE: 日志类型
     *     _TIME: 操作时间
     *     _IP: 用户IP
     *     _SEQUENCE: 前端请求时的唯一序列号
     *     _UID: 用户ID
     *     _NAME: 用户姓名
     *     _MID: 模块编号
     *     _TABLENAME: 操作的表名称
     *     _ACTION: 操作类型,add:新增, edit:编辑, del: 删除
     *     _INFO: 操作的具体内容
     *     _OTHER: 附加信息
     * }
     * @param databaseType: 数据库类型
     */
    public void afterSave(Map message, DbType databaseType) {

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

# 例1: 插入后事件

例如针对yw_demo进行插入新数据有干其它事情。

public class Test extends DataSaveEvent {
	@Override
	public void registerTable() {
        // 设置为只有操作 yw_demo 表时才调用本类
		this.setTableAndOrder("yw_demo", 0);
	}

    /**
     * 数据插入(INSERT)后调用,与tableName值有关,只有操作的表与tableName值相等才会调用
     * @param requestSave: 前端参数(JSONObject 或 JSONArray)
     * @param dataSaveEntity: 保存实体
     * @param resMsg: 终止时返回前端的结果
     */
    @Override
	public void afterInsert(Object requestSave, DataSaveEntity dataSaveEntity, ResMsg resMsg) {
		//TODO 需要干的事情
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 例2: 查询前更改查询条件

public class Test extends DataQueryEvent {
	@Override
	public void registerTable() {
		this.setTableAndOrder(null, 0);
	}
    
    /**
     * 查询前调用,与tableName值有关,只有前端配置为table或views并且操作与tableName值相等才会调用(前端配置为source或sql时无效)
     * @param request: 前端参数
     * @param dataQueryEntity: SQL查询实体
     * @param resMsg: 终止时返回前端的结果
     * @return 返回true则执行查询,否则终止
     */
    public boolean beforeQuery(JSONObject request, DataQueryEntity dataQueryEntity, ResMsg resMsg) {
        //TODO 更改 SQLQueryEntry 实体内容

        //方式1:设置sqlQueryEntry实体的SQL为null,则执行查询时会自动转换
        dataQueryEntity.setDoSQL(null);

        //方式2:如果不使用上步则可使用下句手动调用转换语句重新生成SQL
        try {
            super.getCommonQuerySaveService().convert2SQL(sqlQueryEntry);
        }catch (Exception e) {
            Constants.logger.error(e.getMessage(), e);
        }
        return true;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 例3: 更改(定制化)操作日志

public class MyLog extends DBLogEvent{

    /**
     * 不是必须的,如果有多个,可通过构造函数设置执行的顺序
     */
    public MyLog() {
        this.setOrder(0);
    }
    
    /**
     * 日志保存前回调
     * @param message: 日志内容
     * message格式:
     * {
     *     _UUID: 主键,唯一序列号
     *     _TYPE: 日志类型
     *     _TIME: 操作时间
     *     _IP: 用户IP
     *     _SEQUENCE: 前端请求时的唯一序列号
     *     _UID: 用户ID
     *     _NAME: 用户姓名
     *     _MID: 模块编号
     *     _TABLE: 操作的表名称
     *     _KEY: 操作的表的主键字段值
     *     _DIFF: 差异数据
     *     格式:
     *     {
     *          字段名: {
     *              _T: 标题
     *              _O: 原始数据
     *              _V: 新数据
     *          }
     *     }
     *     _ACTION: 操作类型,add:新增, edit:编辑, del: 删除
     *     _INFO: 操作的具体内容
     *     _OTHER: 附加信息
     * }
     * @return
     */
    public boolean beforeSave(Map message) {
        // TODO 更改 message 的内容
        return true;
    }

    /**
     * 日志保存后回调
     * @param message: 日志内容
     * message格式:
     * {
     *     _UUID: 主键,唯一序列号
     *     _TYPE: 日志类型
     *     _TIME: 操作时间
     *     _IP: 用户IP
     *     _SEQUENCE: 前端请求时的唯一序列号
     *     _UID: 用户ID
     *     _NAME: 用户姓名
     *     _MID: 模块编号
     *     _TABLE: 操作的表名称
     *     _KEY: 操作的表的主键字段值
     *     _DIFF: 差异数据
     *     格式:
     *     {
     *          字段名: {
     *              _T: 标题
     *              _O: 原始数据
     *              _V: 新数据
     *          }
     *     }
     *     _ACTION: 操作类型,add:新增, edit:编辑, del: 删除
     *     _INFO: 操作的具体内容
     *     _OTHER: 附加信息
     * }
     * @param databaseType: 数据库类型
     */
    public void afterSave(Map message, DbType databaseType) {

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78