基于spring boot和mongodb打造一套完整的权限架构(三)【抽象实现类和swagger的实现】

释放双眼,带上耳机,听听看~!

      在上一节我们已经引入了我们当前工程的所需要的所有的maven依赖,因此本章我们将开始集成swagger2、以及我们抽象实现类的编写,首先大家打开csdn这个工程建好自己相应的包的结构如下所示:

      

      common底下的包主要是用来存放相应的抽象实现类、配置文件、工具类等。

     
      **base:**主要用于存放抽象实现类,后续我们所有的dao、service、controller都将继承我们这里所编写的抽象实现类。

     
      **config:**主要用于存放我们的所有的配置文件的配置类,aop(切面)、init(初始化数据加载)、security(权限控制配置)、swagger(swagger配置类)、webmvc(mvc配置类)。

     
      **util:**主要用于存放我们编写的通用工具,common(全局通用工具类存放位置)、date(时间工具类存放位置)、dict(数据字典工具类存放位置)、json(json工具类存放位置)、node(节点工具类存放位置)、user(用户工具类存放位置)。

     sys底下的包主要是用来存放我们实现整个权限架构系统的dao、service、controller、entity的实现类。

      1、接着在我们的config的swagger目录底下创建SwaggerConfig.java文件,文件内容如下:


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
1package com.mongo.common.config.swagger;
2
3import com.google.common.base.Predicate;
4import org.springframework.beans.factory.annotation.Autowired;
5import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
6import org.springframework.context.annotation.Bean;
7import org.springframework.context.annotation.Configuration;
8import org.springframework.core.env.Environment;
9import org.springframework.web.bind.annotation.ResponseBody;
10import org.springframework.web.bind.annotation.RestController;
11import springfox.documentation.RequestHandler;
12import springfox.documentation.builders.ApiInfoBuilder;
13import springfox.documentation.service.ApiInfo;
14import springfox.documentation.spi.DocumentationType;
15import springfox.documentation.spring.web.plugins.Docket;
16import springfox.documentation.swagger2.annotations.EnableSwagger2;
17
18/*
19* 类描述:
20* @auther linzf
21* @create 2018/3/30 0030
22*/
23@Configuration
24@EnableSwagger2
25public class SwaggerConfig {
26
27    @Autowired
28    private Environment env;
29
30
31    @Bean
32    public Docket createRestApi() {
33        Predicate<RequestHandler> predicate = new Predicate<RequestHandler>() {
34            @Override
35            public boolean apply(RequestHandler input) {
36                // 除非是在开发环境中否则不开启swagger2
37                String active = env.getProperty("spring.profiles.active");
38                if(!active.equalsIgnoreCase("dev")){
39                    return false;
40                }
41                Class<?> declaringClass = input.declaringClass();
42                if (declaringClass == BasicErrorController.class)// 排除
43                    return false;
44                if(declaringClass.isAnnotationPresent(RestController.class)) // 被注解的类
45                    return true;
46                if(input.isAnnotatedWith(ResponseBody.class)) // 被注解的方法
47                    return true;
48                return false;
49            }
50        };
51        return new Docket(DocumentationType.SWAGGER_2)
52                .apiInfo(apiInfo())
53                .useDefaultResponseMessages(false)
54                .select()
55                .apis(predicate)
56                .build();
57    }
58
59    private ApiInfo apiInfo() {
60        return new ApiInfoBuilder()
61                .title("mongodb 接口测试专用页面!")//大标题
62                .version("1.0")//版本
63                .build();
64    }
65
66}
67
68

      2、接着我们在我们的common的base目录底下创建我们的抽象实现类

**       
在我们实现以下的抽象实现类的时候,我们首先要先实现以下的两个工具类,分别是util的common目录的CommonUtil.java和util的json目录的JsonHelper.java文件,二者的文件内容如下:
**


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
1package com.mongo.common.util.common;
2
3/*
4* 类描述:
5* @auther linzf
6* @create 2018/4/11 0011
7*/
8public class CommonUtil {
9
10    /**
11     * 将首字母变小写
12     * @param str
13     * @return
14     */
15    public static String toFirstCharLowerCase(String str){
16        char[]  columnCharArr = str.toCharArray();
17        StringBuffer sb = new StringBuffer();
18        for (int i = 0; i < columnCharArr.length; i++) {
19            char cur = columnCharArr[i];
20            if(i==0){
21                sb.append(Character.toLowerCase(cur));
22            }else{
23                sb.append(cur);
24            }
25        }
26        return sb.toString();
27    }
28}
29
30

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
1package com.mongo.common.util.json;
2
3
4
5import net.sf.json.JSONArray;
6import net.sf.json.JSONObject;
7
8import java.beans.IntrospectionException;
9import java.beans.Introspector;
10import java.beans.PropertyDescriptor;
11import java.math.BigDecimal;
12import java.math.BigInteger;
13import java.text.SimpleDateFormat;
14import java.util.*;
15
16/*
17* 类描述:json工具类
18* @auther linzf
19* @create 2017/8/23 0023
20*/
21public class JsonHelper {
22
23    private static SimpleDateFormat sdf = new SimpleDateFormat(
24            "yyyy-MM-dd HH:mm:ss");
25
26    // 将JSON转换成Map,其中valueClz为Map中value的Class,keyArray为Map的key
27    public static Map json2Map(Object[] keyArray, String json, Class valueClz) {
28        JSONObject jsonObject = JSONObject.fromObject(json);
29        Map classMap = new HashMap();
30        for (int i = 0; i < keyArray.length; i++) {
31            classMap.put(keyArray[i], valueClz);
32        }
33        return (Map) JSONObject.toBean(jsonObject, Map.class, classMap);
34    }
35
36    /***
37     * 将对象转换为传入类型的List
38     *
39     * @param object
40     * @param objectClass
41     * @return
42     */
43    public static <T> Collection<T> toList(Object object, Class<T> objectClass) {
44        JSONArray jsonArray = JSONArray.fromObject(object);
45        return JSONArray.toCollection(jsonArray, objectClass);
46    }
47
48    /**
49     * 功能描述:实现将一个object对象转换为json的string字符串
50     * @param obj
51     * @return
52     */
53    public static String object2json(Object obj) {
54        StringBuilder json = new StringBuilder();
55        if (obj == null) {
56            json.append("\"\"");
57        } else if (obj instanceof String || obj instanceof BigDecimal
58                || obj instanceof BigInteger) {
59            json.append("\"").append(string2json(obj.toString())).append("\"");
60        } else if (obj instanceof Boolean) {
61            json.append(Boolean.valueOf(obj.toString()));
62        } else if (obj instanceof Integer || obj instanceof Float
63                || obj instanceof Short || obj instanceof Double
64                || obj instanceof Long || obj instanceof Byte) {
65            json.append(obj.toString());
66        } else if (obj instanceof Date || obj instanceof java.sql.Date) {
67            json.append("\"").append(sdf.format(obj)).append("\"");
68        } else if (obj instanceof Object[]) {
69            json.append(array2json((Object[]) obj));
70        } else if (obj instanceof List) {
71            json.append(list2json((List<?>) obj));
72        } else if (obj instanceof Map) {
73            json.append(map2json((Map<?, ?>) obj));
74        } else if (obj instanceof Set) {
75            json.append(set2json((Set<?>) obj));
76        } else {
77            json.append(bean2json(obj));
78        }
79        return json.toString();
80    }
81
82    public static String list2json(List<?> list) {
83        StringBuilder json = new StringBuilder();
84        json.append("[");
85        if (list != null && list.size() > 0) {
86            for (Object obj : list) {
87                json.append(object2json(obj));
88                json.append(",");
89            }
90            json.setCharAt(json.length() - 1, ']');
91        } else {
92            json.append("]");
93        }
94        return json.toString();
95    }
96
97    public static String array2json(Object[] array) {
98        StringBuilder json = new StringBuilder();
99        json.append("[");
100        if (array != null && array.length > 0) {
101            for (Object obj : array) {
102                json.append(object2json(obj));
103                json.append(",");
104            }
105            json.setCharAt(json.length() - 1, ']');
106        } else {
107            json.append("]");
108        }
109        return json.toString();
110    }
111
112    public static String map2json(Map<?, ?> map) {
113        StringBuilder json = new StringBuilder();
114        json.append("{");
115        if (map != null && map.size() > 0) {
116            for (Object key : map.keySet()) {
117                json.append(object2json(key));
118                json.append(":");
119                json.append(object2json(map.get(key)));
120                json.append(",");
121            }
122            json.setCharAt(json.length() - 1, '}');
123        } else {
124            json.append("}");
125        }
126        return json.toString();
127    }
128
129    public static String set2json(Set<?> set) {
130        StringBuilder json = new StringBuilder();
131        json.append("[");
132        if (set != null && set.size() > 0) {
133            for (Object obj : set) {
134                json.append(object2json(obj));
135                json.append(",");
136            }
137            json.setCharAt(json.length() - 1, ']');
138        } else {
139            json.append("]");
140        }
141        return json.toString();
142    }
143
144    public static String string2json(String s) {
145        if (s == null)
146            return "";
147        StringBuilder sb = new StringBuilder();
148        for (int i = 0; i < s.length(); i++) {
149            char ch = s.charAt(i);
150            switch (ch) {
151                case '"':
152                    sb.append("\\\"");
153                    break;
154                case '\\':
155                    sb.append("\\\\");
156                    break;
157                case '\b':
158                    sb.append("\\b");
159                    break;
160                case '\f':
161                    sb.append("\\f");
162                    break;
163                case '\n':
164                    sb.append("\\n");
165                    break;
166                case '\r':
167                    sb.append("\\r");
168                    break;
169                case '\t':
170                    sb.append("\\t");
171                    break;
172                case '/':
173                    sb.append("\\/");
174                    break;
175                default:
176                    if (ch >= '\u0000' && ch <= '\u001F') {
177                        String ss = Integer.toHexString(ch);
178                        sb.append("\\u");
179                        for (int k = 0; k < 4 - ss.length(); k++) {
180                            sb.append('0');
181                        }
182                        sb.append(ss.toUpperCase());
183                    } else {
184                        sb.append(ch);
185                    }
186            }
187        }
188        return sb.toString();
189    }
190
191    public static String bean2json(Object bean) {
192        StringBuilder json = new StringBuilder();
193        json.append("{");
194        PropertyDescriptor[] props = null;
195        try {
196            props = Introspector.getBeanInfo(bean.getClass(), Object.class)
197                    .getPropertyDescriptors();
198        } catch (IntrospectionException e) {
199        }
200        if (props != null) {
201            for (int i = 0; i < props.length; i++) {
202                try {
203                    String name = object2json(props[i].getName());
204                    String value = object2json(props[i].getReadMethod().invoke(
205                            bean));
206                    json.append(name);
207                    json.append(":");
208                    json.append(value);
209                    json.append(",");
210                } catch (Throwable e) {
211                }
212            }
213            json.setCharAt(json.length() - 1, '}');
214        } else {
215            json.append("}");
216        }
217        return json.toString();
218    }
219
220
221}
222
223

       2.1、首先在我们的constant目录底下新建一个SystemStaticConst.java通用常量类,主要用于存放常用静态常量。


1
2
3
4
5
6
7
8
9
10
11
12
13
1package com.mongo.common.base.constant;
2/**
3 * Created by Administrator on 2017/8/7 0007.
4 */
5public class SystemStaticConst {
6
7    public final static String RESULT = "success";
8    public final static boolean SUCCESS = true;
9    public final static boolean FAIL = false;
10    public final static String MSG = "msg";
11
12}
13

     **  2.2、接着编写我们的通用实体类、通用实体类主要包含Pagination(分页实体类)、QueryBase(查询实体类)、QueryField(实体Bean上注解查询的类)、QueryType(实体上查询的枚举类型)。**

         
2.2.1、
Pagination:主要是对页面的分页进行封装,代码如下:


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
1package com.mongo.common.base.entity;
2
3import java.util.List;
4
5public class Pagination<T> {
6
7    public Pagination(){
8        super();
9    }
10
11    public Pagination(Integer currentPage,Integer totalPage,Integer totalNumber){
12        this.currentPage = currentPage;
13        this.totalPage = totalPage;
14        this.totalNumber = totalNumber;
15    }
16
17    /**
18     * 每页显示条数
19     */
20    private Integer pageSize = 8;
21
22    /**
23     * 当前页
24     */
25    private Integer currentPage = 1;
26
27    /**
28     * 总页数
29     */
30    private Integer totalPage = 1;
31
32    /**
33     * 查询到的总数据量
34     */
35    private Integer totalNumber = 0;
36
37    /**
38     * 数据集
39     */
40    private List items;
41
42    public Integer getPageSize() {
43        return pageSize;
44    }
45
46    public void setPageSize(Integer pageSize) {
47        this.pageSize = pageSize;
48    }
49
50    public Integer getCurrentPage() {
51        return currentPage;
52    }
53
54    public void setCurrentPage(Integer currentPage) {
55        this.currentPage = currentPage;
56    }
57
58    public Integer getTotalPage() {
59        return totalPage;
60    }
61
62    public void setTotalPage(Integer totalPage) {
63        this.totalPage = totalPage;
64    }
65
66    public Integer getTotalNumber() {
67        return totalNumber;
68    }
69
70    public void setTotalNumber(Integer totalNumber) {
71        this.totalNumber = totalNumber;
72    }
73
74    public List getItems() {
75        return items;
76    }
77
78    public void setItems(List items) {
79        this.items = items;
80    }
81
82    /**
83     * 处理查询后的结果数据
84     *
85     * @param items 查询结果集
86     */
87    public void build(List items) {
88        this.setItems(items);
89        int count =  this.getTotalNumber();
90        int divisor = count / this.getPageSize();
91        int remainder = count % this.getPageSize();
92        this.setTotalPage(remainder == 0 ? divisor == 0 ? 1 : divisor : divisor + 1);
93    }
94}
95
96

     
  2.2.2、QueryBase:实现对查询实体的封装,代码如下:


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
1package com.mongo.common.base.entity;
2
3public class QueryBase {
4
5    /**
6     * 页数
7     */
8    protected int page;
9
10    /**
11     * 获取一页行数
12     * */
13    protected int limit;
14
15
16    public int getPage() {
17        return page;
18    }
19
20    public void setPage(int page) {
21        this.page = page;
22    }
23
24    public int getLimit() {
25        return limit;
26    }
27
28    public void setLimit(int limit) {
29        this.limit = limit;
30    }
31}
32
33

     
  2.2.3、QueryType:查询类型的媒介类,主要用于确定那些字段需要在查询的时候使用到,也许在这里大家可能还不是很明白,等到下一章我们开始编写具体的业务实现的时候,大家就会明白该枚举的作用。


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
1package com.mongo.common.base.entity;
2
3/**
4 * Created by Administrator on 2018/3/30 0030.
5 */
6
7import org.springframework.data.mongodb.core.query.Criteria;
8import org.springframework.util.StringUtils;
9
10import java.lang.reflect.Field;
11import java.util.List;
12
13/**
14 * <p>
15 * 查询类型的媒介类<br/>
16 * 目前有支持三种类型:<br/>
17 * 1. equals:相等
18 * 2. like:mongodb的like查询
19 * 3. in:用于列表的in类型查询
20 * </p>
21 *
22 */
23public enum QueryType {
24    EQUALS {
25        @Override
26        public Criteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {
27            if (check(queryFieldAnnotation, field, value)) {
28                String queryField = getQueryFieldName(queryFieldAnnotation, field);
29                return Criteria.where(queryField).is(value.toString());
30            }
31            return new Criteria();
32        }
33    },
34    LIKE {
35        @Override
36        public Criteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {
37            if (check(queryFieldAnnotation, field, value)) {
38                String queryField = getQueryFieldName(queryFieldAnnotation, field);
39                return Criteria.where(queryField).regex(value.toString());
40            }
41            return new Criteria();
42        }
43    },
44    IN {
45        @Override
46        public Criteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {
47            if (check(queryFieldAnnotation, field, value)) {
48                if (value instanceof List) {
49                    String queryField = getQueryFieldName(queryFieldAnnotation, field);
50                    // 此处必须转型为List,否则会在in外面多一层[]
51                    return Criteria.where(queryField).in((List<?>)value);
52                }
53            }
54            return new Criteria();
55        }
56    };
57
58    private static boolean check(QueryField queryField, Field field, Object value) {
59        return !(queryField == null || field == null || value == null);
60    }
61
62    public abstract Criteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value);
63
64    /**
65     * 如果实体bean的字段上QueryField注解没有设置attribute属性时,默认为该字段的名称
66     *
67     * @param queryField
68     * @param field
69     * @return
70     */
71    private static String getQueryFieldName(QueryField queryField, Field field) {
72        String queryFieldValue = queryField.attribute();
73        if (!StringUtils.hasText(queryFieldValue)) {
74            queryFieldValue = field.getName();
75        }
76        return queryFieldValue;
77    }
78}
79

     
 
2.2.4、QueryField:用于实体Bean的属性上的注解,注解有两个属性可以设置,type表示查询类似,默认为equals,此块也是等到下一章具体使用的时候再和大家详细介绍,代码如下所示:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1package com.mongo.common.base.entity;
2
3import java.lang.annotation.ElementType;
4import java.lang.annotation.Retention;
5import java.lang.annotation.RetentionPolicy;
6import java.lang.annotation.Target;
7
8/**
9 * <p>
10 * 用于实体Bean的属性上的注解,注解有两个属性可以设置,type表示查询类似,默认为equals<br/>
11 * attribute表示要查询的属性,默认为空串,在使用时如果为空串,则默认为实体Bean字段的名称
12 * </p>
13 *
14 */
15@Target(ElementType.FIELD)
16@Retention(RetentionPolicy.RUNTIME)
17public @interface QueryField {
18    QueryType type() default QueryType.EQUALS;
19    String attribute() default "";
20}
21
22

       2.3、接着再我们的base的dao目录底下编写我们的dao层的数据库抽象实现类(MongodbBaseService),代码如下所示:


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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
1package com.mongo.common.base.dao;
2
3
4import com.mongo.common.base.entity.Pagination;
5import com.mongo.common.base.entity.QueryBase;
6import com.mongo.common.base.entity.QueryField;
7import com.mongo.common.util.common.CommonUtil;
8import org.springframework.beans.factory.annotation.Autowired;
9import org.springframework.beans.factory.annotation.Qualifier;
10import org.springframework.data.mongodb.core.MongoTemplate;
11import org.springframework.data.mongodb.core.query.Criteria;
12import org.springframework.data.mongodb.core.query.Query;
13import org.springframework.data.mongodb.core.query.Update;
14
15import java.lang.reflect.Field;
16import java.lang.reflect.ParameterizedType;
17import java.util.List;
18
19/*
20* 类描述:
21* @auther linzf
22* @create 2018/3/30 0030
23*/
24public abstract class MongodbBaseDao<T,Q extends QueryBase>{
25
26    @Autowired
27    @Qualifier("mongoTemplate")
28    protected MongoTemplate mongoTemplate;
29
30    //保存一个对象到mongodb
31    public T save(T bean) {
32        mongoTemplate.save(bean);
33        return bean;
34    }
35
36    // 根据id删除对象
37    public void deleteById(T t) {
38        mongoTemplate.remove(t);
39    }
40
41    // 根据对象的属性删除
42    public void deleteByCondition(T t) {
43        Query query = buildBaseQuery(t);
44        mongoTemplate.remove(query, getEntityClass());
45    }
46
47    // 通过条件查询更新数据
48    public void update(Query query, Update update) {
49        mongoTemplate.updateMulti(query, update, this.getEntityClass());
50    }
51
52    // 根据id进行更新
53    public void updateById(String id, T t) {
54        Query query = new Query();
55        query.addCriteria(Criteria.where("id").is(id));
56        Update update = buildBaseUpdate(t);
57        update(query, update);
58    }
59
60    // 通过条件查询实体(集合)
61    public List<T> find(Query query) {
62        return mongoTemplate.find(query, this.getEntityClass());
63    }
64
65    public List<T> findByCondition(T t) {
66        Query query = buildBaseQuery(t);
67        return mongoTemplate.find(query, getEntityClass());
68    }
69
70    // 通过一定的条件查询一个实体
71    public T findOne(Query query) {
72        return mongoTemplate.findOne(query, this.getEntityClass());
73    }
74
75
76    // 通过ID获取记录
77    public T get(String id) {
78        return mongoTemplate.findById(id, this.getEntityClass());
79    }
80
81    // 通过ID获取记录,并且指定了集合名(表的意思)
82    public T get(String id, String collectionName) {
83        return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
84    }
85
86    /**
87     * 通过条件查询,查询分页结果
88     */
89    public Pagination<T> findByPage(Q q) {
90        Query query = buildBaseQuery(q);
91        //获取总条数
92        long totalCount = this.mongoTemplate.count(query, this.getEntityClass());
93        //总页数
94        int totalPage = (int) (totalCount/q.getLimit());
95        int skip = (q.getPage()-1)*q.getLimit();
96        Pagination<T> page = new Pagination(q.getPage(), totalPage, (int)totalCount);
97        query.skip(skip);// skip相当于从那条记录开始
98        query.limit(q.getLimit());// 从skip开始,取多少条记录
99        List<T> data = this.find(query);
100        page.build(data);//获取数据
101        return page;
102    }
103
104    /**
105     * 根据注解构建Query查询条件
106     * @param q
107     * @return
108     */
109    public Query buildBaseQuery(Q q){
110        Query query = new Query();
111
112        Field[] fields = q.getClass().getDeclaredFields();
113        for (Field field : fields) {
114            field.setAccessible(true);
115            try {
116                Object value = field.get(q);
117                if (value != null&&!value.equals("")) {
118                    QueryField queryField = field.getAnnotation(QueryField.class);
119                    if (queryField != null) {
120                        if(value instanceof String){
121                            query.addCriteria(queryField.type().buildCriteria(queryField, field, value));
122                        }else{
123                            query.addCriteria(queryField.type().buildCriteria(queryField, field, value));
124                        }
125                    }
126                }
127            } catch (IllegalArgumentException e) {
128                e.printStackTrace();
129            } catch (IllegalAccessException e) {
130                e.printStackTrace();
131            }
132        }
133        return query;
134    }
135
136    // 根据vo构建查询条件Query
137    private Query buildBaseQuery(T t) {
138        Query query = new Query();
139
140        Field[] fields = t.getClass().getDeclaredFields();
141        for (Field field : fields) {
142            field.setAccessible(true);
143            try {
144                Object value = field.get(t);
145                if (value != null) {
146                    QueryField queryField = field.getAnnotation(QueryField.class);
147                    if (queryField != null) {
148                        query.addCriteria(queryField.type().buildCriteria(queryField, field, value));
149                    }
150                }
151            } catch (IllegalArgumentException e) {
152                e.printStackTrace();
153            } catch (IllegalAccessException e) {
154                e.printStackTrace();
155            }
156        }
157        return query;
158    }
159
160    private Update buildBaseUpdate(T t) {
161        Update update = new Update();
162
163        Field[] fields = t.getClass().getDeclaredFields();
164        for (Field field : fields) {
165            field.setAccessible(true);
166            try {
167                Object value = field.get(t);
168                if (value != null) {
169                    update.set(field.getName(), value);
170                }
171            } catch (Exception e) {
172                e.printStackTrace();
173            }
174        }
175        return update;
176    }
177
178    // 获取需要操作的实体类class
179    @SuppressWarnings("unchecked")
180    protected Class<T> getEntityClass() {
181        return ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
182    }
183
184    protected  String getCollection(){
185        String [] collections = getEntityClass().toString().split("\\.");
186        return CommonUtil.toFirstCharLowerCase(collections[collections.length-1]);
187    }
188
189    public MongoTemplate getMongoTemplate() {
190        return mongoTemplate;
191    }
192}
193

       **2.4、接着再我们的base的service目录底下编写我们的service层的业务抽象实现类(**MongodbBaseDao
),代码如下所示:


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
1package com.mongo.common.base.service;
2
3
4import com.mongo.common.base.dao.MongodbBaseDao;
5import com.mongo.common.base.entity.Pagination;
6import com.mongo.common.base.entity.QueryBase;
7import org.springframework.data.mongodb.core.query.Query;
8import org.springframework.data.mongodb.core.query.Update;
9
10import java.util.List;
11
12public abstract class MongodbBaseService<T,Q extends QueryBase> {
13
14    protected abstract MongodbBaseDao<T,Q> getDao();
15
16    //保存一个对象到mongodb
17    public T save(T bean) {
18        getDao().save(bean);
19        return bean;
20    }
21
22    // 根据id删除对象
23    public void deleteById(T t) {
24        getDao().deleteById(t);
25    }
26
27    /**
28     * 功能描述:批量删除数据
29     * @param entityList
30     * @return
31     */
32    public boolean removeBath(List<T> entityList) throws Exception{
33        for(T t:entityList){
34            deleteById(t);
35        }
36        return true;
37    }
38
39    // 根据对象的属性删除
40    public void deleteByCondition(T t) {
41        getDao().deleteByCondition(t);
42    }
43
44    // 通过条件查询更新数据
45    public void update(Query query, Update update){
46        getDao().update(query,update);
47    }
48
49    // 根据id进行更新
50    public void updateById(String id, T t){
51        getDao().updateById(id,t);
52    }
53
54    // 通过条件查询实体(集合)
55    public List<T> find(Query query) {
56        return getDao().find(query);
57    }
58
59    public List<T> findByCondition(T t){
60        return getDao().findByCondition(t);
61    }
62
63    public T findOne(Query query){
64        return getDao().findOne(query);
65    }
66
67    // 通过ID获取记录
68    public T get(String id){
69        return getDao().get(id);
70    }
71
72    // 通过ID获取记录,并且指定了集合名(表的意思)
73    public T get(String id, String collectionName){
74        return getDao().get(id,collectionName);
75    }
76
77
78    /**
79     * 通过条件查询,查询分页结果
80     */
81    public Pagination<T> findByPage(Q q){
82        return getDao().findByPage(q);
83    }
84
85}
86
87

      **  2.5、接着再我们的base的controller目录底下编写我们的controller层的抽象实现类(**MongodbBaseController
),代码如下所示:


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
1package com.mongo.common.base.controller;
2
3
4import com.mongo.common.base.constant.SystemStaticConst;
5import com.mongo.common.base.entity.QueryBase;
6import com.mongo.common.base.service.MongodbBaseService;
7import com.mongo.common.util.common.CommonUtil;
8import com.mongo.common.util.json.JsonHelper;
9import org.springframework.http.MediaType;
10import org.springframework.ui.Model;
11import org.springframework.web.bind.annotation.RequestMapping;
12import org.springframework.web.bind.annotation.RequestMethod;
13import org.springframework.web.bind.annotation.ResponseBody;
14
15import java.lang.reflect.ParameterizedType;
16import java.util.HashMap;
17import java.util.List;
18import java.util.Map;
19import java.util.regex.Matcher;
20import java.util.regex.Pattern;
21
22public abstract class MongodbBaseController<T,Q extends QueryBase> {
23
24    protected abstract MongodbBaseService<T,Q> getService();
25
26    /**添加页面路径*/
27    public final static String ADDPAGE = "/add";
28    /**修改页面路径*/
29    public final static String UPDATEPAGE = "/update";
30
31    /**
32     * Controller基路径
33     * */
34    protected String basePath;
35
36    /**抽象方法,获取页面基路径
37     * @throws Exception */
38    protected String getPageBaseRoot() throws Exception{
39        if(basePath==null){
40            basePath = this.getClass().getName();
41            Pattern p=Pattern.compile(".[a-z|A-z]+.controller.[a-z|A-z]+Controller");
42            Matcher m=p.matcher(basePath);
43            if(m.find()){
44                basePath = m.group();
45                basePath = basePath.substring(1, basePath.length()-10);
46                basePath = basePath.replace(".", "/");
47                basePath = basePath.replace("/controller/", "/");
48                basePath = CommonUtil.toFirstCharLowerCase(basePath);
49                basePath = basePath.substring(0,basePath.lastIndexOf("/")+1)+CommonUtil.toFirstCharLowerCase(basePath.substring(basePath.lastIndexOf("/")+1));
50            }
51            else{
52                throw new Exception("获取页面基路径失败");
53            }
54        }
55        return basePath;
56    }
57
58    /**
59     * 功能描述:直接跳转到更新数据的页面
60     * @param id
61     * @return
62     */
63    @RequestMapping(value = "/updatePage",method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
64    public String updatePage(String id,Model model) throws Exception{
65        T entity = getService().get(id);
66        model.addAttribute("entity",entity);
67        return getPageBaseRoot()+UPDATEPAGE;
68    }
69
70    /** 跳转到添加对象页面
71     * @throws Exception */
72    @RequestMapping(value="/addPage")
73    public String addPage() throws Exception{
74        return getPageBaseRoot()+ADDPAGE;
75    }
76
77    /**
78     * 功能描述:保存数据字典数据
79     * @param entity
80     * @return
81     */
82    @RequestMapping(value = "/save",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
83    @ResponseBody
84    public Map<String,Object> save(T entity) throws Exception{
85        entity = getService().save(entity);
86        Map<String,Object> result = new HashMap<String, Object>();
87        if(entity!=null){
88            result.put(SystemStaticConst.RESULT,SystemStaticConst.SUCCESS);
89            result.put(SystemStaticConst.MSG,"增加数据成功!");
90            result.put("entity",entity);
91        }else{
92            result.put(SystemStaticConst.RESULT,SystemStaticConst.FAIL);
93            result.put(SystemStaticConst.MSG,"增加数据失败!");
94        }
95        return result;
96    }
97
98
99    /**
100     * 功能描述:更新数据字典数据
101     * @param entity
102     * @return
103     */
104    @RequestMapping(value = "/update",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
105    @ResponseBody
106    public Map<String,Object> update(String id,T entity)  throws Exception{
107        Map<String,Object> result = new HashMap<String, Object>();
108        try{
109            getService().updateById(id,entity);
110            result.put(SystemStaticConst.RESULT,SystemStaticConst.SUCCESS);
111            result.put(SystemStaticConst.MSG,"更新数据成功!");
112            result.put("entity",entity);
113        }catch(Exception e){
114            result.put(SystemStaticConst.RESULT,SystemStaticConst.FAIL);
115            result.put(SystemStaticConst.MSG,"更新数据失败!");
116        }
117        return result;
118    }
119
120    /**
121     * 功能描述:实现根据ID来删除数据
122     * @param entity
123     * @return
124     */
125    @RequestMapping(value = "/remove",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
126    @ResponseBody
127    public Map<String,Object> remove(T entity) throws Exception{
128        Map<String,Object> result = new HashMap<String, Object>();
129        getService().deleteById(entity);
130        result.put(SystemStaticConst.RESULT,SystemStaticConst.SUCCESS);
131        result.put(SystemStaticConst.MSG,"删除数据成功!");
132        return result;
133    }
134
135    /**
136     * 功能描述:实现批量删除数据字典的记录
137     * @param json
138     * @return
139     */
140    @RequestMapping(value = "/removeBath",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
141    @ResponseBody
142    public Map<String,Object> removeBath(String json) throws Exception{
143        Map<String,Object> result = new HashMap<String, Object>();
144        getService().removeBath((List<T>) JsonHelper.toList(json,(Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
145        result.put(SystemStaticConst.RESULT,SystemStaticConst.SUCCESS);
146        result.put(SystemStaticConst.MSG,"删除数据成功!");
147        return result;
148    }
149
150    /**
151     * 功能描述:判断当前的字典元素是否已经存在
152     * @param entity
153     * @return
154     */
155    @RequestMapping(value = "/isExist",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
156    @ResponseBody
157    public Map<String,Object> isExist(T entity){
158        Map<String,Object> result = new HashMap<String, Object>();
159        if(getService().findByCondition(entity).size()>0){
160            result.put("valid",false);
161        }else{
162            result.put("valid",true);
163        }
164        return result;
165    }
166
167
168
169}
170
171

      到此我们完成了我们的swagger和抽象实现类的实现,到本章为止大家虽然可以运行起来项目,可是是看不到实际的效果的,在下一章我们将集成我们的security实现用户的登陆功能。

       到此为止的GitHub项目地址:https://github.com/185594-5-27/csdn/tree/master-base-3

上一篇文章地址:基于spring boot和mongodb打造一套完整的权限架构(二)【MAVEN依赖以及相应配置】

下一篇文章地址:基于spring boot和mongodb打造一套完整的权限架构(四)【完全集成security】

QQ交流群:578746866

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索