SpringBoot网上小说阅读平台

💖🔥作者主页计算机毕业设计老哥🔥 💖

有问题可以主页问我

一、开发介绍

1.1 开发环境

  • 开发语言:Java
  • 数据库:MySQL
  • 系统架构:B/S
  • 后端:SpringBoot(Spring+SpringMVC+Mybatis)
  • 前端:Vue
  • 工具:IDEA或者Eclipse,JDK1.8,Maven

二、系统介绍

2.1图片展示

注册登录页面:

登陆.png

前端页面功能:首页、小说信息、交流论坛、公告资讯、个人中心、后台管理

首页.png

小说信息.png

公告资讯.png
交流论坛.png
收藏.png

管理员后台页面:
功能:首页、个人中心、会员管理、小说分类管理、小说信息管理、小说评分管理、交流论坛、系统管理

管理员会员管理.png

管理员交流论坛.png
管理员小说分类.png
管理员小说评分.png
管理员小说信息.png

三、部分代码设计

3.1.Mybatis-Plus工具类-部分代码如下:

/**
 * Mybatis-Plus工具类
 */
public class MPUtil {
    public static final char UNDERLINE = '_';

    
    //mybatis plus allEQ 表达式转换
        public static Map allEQMapPre(Object bean,String pre) {
           Map<String, Object> map =BeanUtil.beanToMap(bean);
          return camelToUnderlineMap(map,pre);
       }

        //mybatis plus allEQ 表达式转换
        public static Map allEQMap(Object bean) {
           Map<String, Object> map =BeanUtil.beanToMap(bean);
           return camelToUnderlineMap(map,"");
       }

        public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) {
               Map<String, Object> map =BeanUtil.beanToMap(bean);
               Map result = camelToUnderlineMap(map,pre);
             
            return genLike(wrapper,result);
        }
    
        public static Wrapper allLike(Wrapper wrapper,Object bean) {
              Map result = BeanUtil.beanToMap(bean, true, true);             
            return genLike(wrapper,result);
        }
    
    
        public static Wrapper genLike( Wrapper wrapper,Map param) {
            Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
            int i=0;
            while (it.hasNext()) {
                if(i>0) wrapper.and();
                Map.Entry<String, Object> entry = it.next();
                String key = entry.getKey();
                String value = (String) entry.getValue();
                wrapper.like(key, value);
                i++;
            }
            return wrapper;
        }
        
        public static Wrapper likeOrEq(Wrapper wrapper,Object bean) {
              Map result = BeanUtil.beanToMap(bean, true, true);             
            return genLikeOrEq(wrapper,result);
        }
        
        public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) {
            Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
            int i=0;
            while (it.hasNext()) {
                if(i>0) wrapper.and();
                Map.Entry<String, Object> entry = it.next();
                String key = entry.getKey();
                if(entry.getValue().toString().contains("%")) {
                    wrapper.like(key, entry.getValue().toString().replace("%", ""));
                } else {
                    wrapper.eq(key, entry.getValue());
                }
                i++;
            }
            return wrapper;
        }
        
        public static Wrapper allEq(Wrapper wrapper,Object bean) {
              Map result = BeanUtil.beanToMap(bean, true, true);             
            return genEq(wrapper,result);
        }
    
    
        public static Wrapper genEq( Wrapper wrapper,Map param) {
            Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
            int i=0;
            while (it.hasNext()) {
                if(i>0) wrapper.and();
                Map.Entry<String, Object> entry = it.next();
                String key = entry.getKey();
                wrapper.eq(key, entry.getValue());
                i++;
            }
            return wrapper;
        }
    
    
        public static Wrapper between(Wrapper wrapper,Map<String, Object> params) {
            for(String key : params.keySet()) {
                String columnName = "";
                if(key.endsWith("_start")) {
                    columnName = key.substring(0, key.indexOf("_start"));
                    if(StringUtils.isNotBlank(params.get(key).toString())) {
                        wrapper.ge(columnName, params.get(key));
                    }
                }
                if(key.endsWith("_end")) {
                    columnName = key.substring(0, key.indexOf("_end"));
                    if(StringUtils.isNotBlank(params.get(key).toString())) {
                        wrapper.le(columnName, params.get(key));
                    }
                }
            }
            return wrapper;
        }
    
        public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) {
            String order = "";
            if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) {
                order = params.get("order").toString();
            }
            if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) {
                if(order.equalsIgnoreCase("desc")) {
                    wrapper.orderDesc(Arrays.asList(params.get("sort")));
                } else {
                    wrapper.orderAsc(Arrays.asList(params.get("sort")));
                }
            }
            return wrapper;
        }
    
    
    /**
     * 驼峰格式字符串转换为下划线格式字符串
     * 
     * @param param
     * @return
     */
    public static String camelToUnderline(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append(UNDERLINE);
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static void main(String[] ages) {
        System.out.println(camelToUnderline("ABCddfANM"));
    }
    
    public static Map camelToUnderlineMap(Map param, String pre) {

        Map<String, Object> newMap = new HashMap<String, Object>();
        Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = it.next();
            String key = entry.getKey();
            String newKey = camelToUnderline(key);
            if (pre.endsWith(".")) {
                newMap.put(pre + newKey, entry.getValue());
            } else if (StringUtils.isEmpty(pre)) {
                newMap.put(newKey, entry.getValue());
            } else {

                newMap.put(pre + "." + newKey, entry.getValue());
            }
        }
        return newMap;
    }
}

3.2.校验工具类-部分代码如下:

/**
 * hibernate-validator校验工具类
 */
public class ValidatorUtils {
    private static Validator validator;

    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    /**
     * 校验对象
     * @param object        待校验对象
     * @param groups        待校验的组
     * @throws EIException  校验不通过,则报EIException异常
     */
    public static void validateEntity(Object object, Class<?>... groups)
            throws EIException {
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
        if (!constraintViolations.isEmpty()) {
            ConstraintViolation<Object> constraint = (ConstraintViolation<Object>)constraintViolations.iterator().next();
            throw new EIException(constraint.getMessage());
        }
    }
    
    
}

3.3.查询参数工具类-部分代码如下:

/**
 * 查询参数
 */
public class Query<T> extends LinkedHashMap<String, Object> {
    private static final long serialVersionUID = 1L;
    /**
     * mybatis-plus分页参数
     */
    private Page<T> page;
    /**
     * 当前页码
     */
    private int currPage = 1;
    /**
     * 每页条数
     */
    private int limit = 10;

    public Query(JQPageInfo pageInfo) {
        //分页参数
        if(pageInfo.getPage()!= null){
            currPage = pageInfo.getPage();
        }
        if(pageInfo.getLimit()!= null){
            limit = pageInfo.getLimit();
        }

    
        //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
        String sidx = SQLFilter.sqlInject(pageInfo.getSidx());
        String order = SQLFilter.sqlInject(pageInfo.getOrder());
        

        //mybatis-plus分页
        this.page = new Page<>(currPage, limit);

        //排序
        if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){
            this.page.setOrderByField(sidx);
            this.page.setAsc("ASC".equalsIgnoreCase(order));
        }
    }
    
    
    public Query(Map<String, Object> params){
        this.putAll(params);

        //分页参数
        if(params.get("page") != null){
            currPage = Integer.parseInt((String)params.get("page"));
        }
        if(params.get("limit") != null){
            limit = Integer.parseInt((String)params.get("limit"));
        }

        this.put("offset", (currPage - 1) * limit);
        this.put("page", currPage);
        this.put("limit", limit);

        //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
        String sidx = SQLFilter.sqlInject((String)params.get("sidx"));
        String order = SQLFilter.sqlInject((String)params.get("order"));
        this.put("sidx", sidx);
        this.put("order", order);

        //mybatis-plus分页
        this.page = new Page<>(currPage, limit);

        //排序
        if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)){
            this.page.setOrderByField(sidx);
            this.page.setAsc("ASC".equalsIgnoreCase(order));
        }

    }

    public Page<T> getPage() {
        return page;
    }

    public int getCurrPage() {
        return currPage;
    }

    public int getLimit() {
        return limit;
    }
}

总结

大家可以帮忙点赞、收藏、关注、评论啦

有问题可以在评论区交流,或者下方主页联系问我

💖🔥作者主页计算机毕业设计老哥🔥 💖

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容