• 基于python的django框架博客论坛交流系统


    精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

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

    Java实战项目专栏

    Python实战项目专栏

    安卓实战项目专栏

    微信小程序实战项目专栏

    一、开发介绍

    1.1 开发环境

    • 开发语言:Python
    • 数据库:MySQL
    • 系统架构:B/S
    • 后端:Django
    • 前端:Vue+HTML+CSS+JavaScript+jQuery
    • 工具:PyCharm

    二、系统介绍

    2.1图片展示

    用户登陆页面
    在这里插入图片描述

    前端页面功能:首页、文章信息、系统公告、个人中心、后台管理、在线客服
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    管理员后台页面功能:
    首页,个人中心,博主管理、文章分类管理、文章信息管理、举报投诉管理、系统管理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    用户后台管理页面功能:
    注册、登录、首页、个人中心、文章信息管理、举报投诉管理、我的收藏管理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    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());
            }
        }
        
        
    }
    
    • 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

    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;
        }
    }
    
    • 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

    总结

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

    有问题评论区交流

    精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

    Java实战项目专栏

    Python实战项目专栏

    安卓实战项目专栏

    微信小程序实战专栏

  • 相关阅读:
    TS泛型的使用
    仿牌独立站如何通过PayPal.Me亲友付进行收款
    在字节跳动,一个更好的企业级SparkSQL Server这么做
    HTML5期末作业:明星网站设计与实现——明星薛之谦介绍网页设计7个页面HTML+CSS+JavaScript
    【Redis底层解析】字典类型
    Java设计模式很难吗,这篇带你熟悉设计模式
    上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例
    4800坐标反算
    编程题练习@9-7
    以解析csv数据为例,讨论string、char[]、stream 不同类型来源是否能进行高性能读取解析封装可能性
  • 原文地址:https://blog.csdn.net/BYSJLG/article/details/127756276