Java项目:83 springboot知识管理系统

作者主页:源码空间codegym

简介:Java领域优质创作者、Java项目、学习资料、技术互助

文中获取源码

项目介绍

本知识管理系统有管理员和用户两个角色。

管理员功能有个人中心,用户管理,文章分类管理,文章信息管理,资料分类管理,资料下载管理,问答管理,论坛交流,留言板管理,系统管理等。

用户功能有个人中心,文章信息管理,资料下载管理,问答管理,我的收藏管理。

环境要求

1.运行环境:最好是java jdk1.8,我们在这个平台上运行的。其他版本理论上也可以。

2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;

3.tomcat环境:Tomcat7.x,8.X,9.x版本均可

4.硬件环境:windows7/8/10 4G内存以上;或者Mac OS;

5.是否Maven项目:是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven.项目

6.数据库:MySql5.7/8.0等版本均可;

技术栈

运行环境:jdk8 + tomcat9 + mysql5.7 + windows10

服务端技术:SpringBoot + MyBatis + Vue + Bootstrap + jQuery

使用说明

1.使用Navicati或者其它工具,在mysql中创建对应sq文件名称的数据库,并导入项目的sql文件;

2.使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目;

3.将项目中config-propertiesi配置文件中的数据库配置改为自己的配置,然后运行;

运行指导

idea导入源码空间站顶目教程说明(Vindows版)-ssm篇:

http://mtw.so/5MHvZq

源码地址:http://codegym.top

运行截图

文档截图

img

img

项目截图

1

2

3

4

5

6

7

8

package com.server.api.common;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.server.api.common.constants.ResultConstant;
import com.server.api.common.util.UploadUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

/**
 * @Description: 控制层接口的基类
 * @Author: wuming
 */
@Controller
@SuppressWarnings("all")
public abstract class BaseController<T extends IService, E extends BaseEntity> {

    @Autowired
    protected UploadUtil uploadUtil;

    @Value("${imgHost}")
    private String imgHost;

    protected T baseService;

    protected abstract void setBaseService(T sevice);


    /**
     * 根据实体类中条件进行全等查询
     *
     * @param params
     * @return mybatis-plus 分页对象
     * @throws Exception
     */
    @PostMapping(value = "/list/param")
    public ReturnMsg baseGetListPage(@RequestBody Map<String, Object> params) throws Exception {
        return pageByWrapper(params);
    }

    /**
     * 根据实体类中条件进行全等查询
     *
     * @param params
     * @return mybatis-plus 返回所有数据
     * @throws Exception
     */
    @PostMapping(value = "/list/all")
    public ReturnMsg baseGetListAll(@RequestBody Map<String, Object> params) throws Exception {
        QueryWrapper<E> wrapper = beforeGetListAll(params);
        return afterGetListAll(baseService.list());
    }

    /**
     * 根据id获取信息
     *
     * @param id
     * @return
     * @throws Exception
     */
    @GetMapping("/get/{id}")
    public ReturnMsg baseGetById(@PathVariable("id") Long id) throws Exception {
        beforeGetById(id);
        return afterGetById((E) baseService.getById(id));
    }

    /**
     * 保存或者修改信息方法
     *
     * @param entity 实体对象
     * @return 返回信息
     * @throws Exception
     */
    @PostMapping(value = "/save/update")
    public ReturnMsg baseSaveOrUpdate(@RequestBody E entity) throws Exception {
        beforeSaveOrUpdate(entity);
        boolean flag = baseService.saveOrUpdate(entity);
        if (ObjectUtil.isNotEmpty(entity.getId())) {
            return afterSaveOrUpdate(entity, flag, ResultConstant.UPDATE_DATA_FALL_MSG);
        } else {
            return afterSaveOrUpdate(entity, flag, ResultConstant.INSERT_DATA_FALL_MSG);
        }
    }

    /**
     * 据ID删除数据
     *
     * @param id 主键编号
     * @return 实体对象
     * @throws Exception
     */
    @GetMapping(value = "/remove/{id}")
    public ReturnMsg baseRemoveById(@PathVariable("id") Long id) throws Exception {
        beforeRemoveById(id);
        boolean flag = baseService.removeById(id);
        return afterRemoveById(flag, id);
    }

    /**
     * 根据ID集合进行删除
     *
     * @param idList 主键id的List集合
     * @return
     * @throws Exception
     */
    @PostMapping("/remove")
    public ReturnMsg baseRemoveByIds(@RequestBody List<Long> idList) throws Exception {
        beforeRemoveByIds(idList);
        boolean flag = baseService.removeByIds(idList);
        return afterRemoveByIds(flag, idList);
    }

    /**
     * 分页
     *
     * @param params
     * @return
     */
    protected ReturnMsg pageByWrapper(Map<String, Object> params) {
        QueryWrapper<E> wrapper = beforeGetListPage(params);
        if (StrUtil.isEmptyIfStr(params.get(ResultConstant.CURRENT))) {
            params.put(ResultConstant.CURRENT, ResultConstant.DEFAULT_CURRENT);
        }
        if (StrUtil.isEmptyIfStr(params.get(ResultConstant.PAGE_SIZE))) {
            params.put(ResultConstant.PAGE_SIZE, ResultConstant.DEFAULT_PAGE_SIZE);
        }
        Page<E> selectPageList = (Page<E>) baseService.page(new Page(
                Long.parseLong(params.get(ResultConstant.CURRENT).toString())
                , Long.parseLong(params.get(ResultConstant.PAGE_SIZE).toString())), wrapper);
        return afterGetListPage(selectPageList, params);
    }

    /**
     * 分页前对wrapper的处理
     *
     * @param params
     * @return
     */
    private QueryWrapper<E> beforeGetListPage(Map<String, Object> params) {
        return beforeGetListPage(params, null);
    }

    /**
     * 重载分页前对wrapper的处理
     *
     * @param params
     * @param sqlWrapper
     * @return
     */
    protected QueryWrapper<E> beforeGetListPage(Map<String, Object> params, QueryWrapper<E> sqlWrapper) {
        if (null == sqlWrapper) {
            sqlWrapper = new QueryWrapper<>();
        }
        return sqlWrapper;
    }

    /**
     * 分页处理完后的数据响应
     *
     * @param obj
     * @return
     */
    protected ReturnMsg afterGetListPage(Object obj, Map<String, Object> params) {
        return ReturnMsg.ok(obj);
    }

    /**
     * 查询所有数据前对wrapper的处理
     *
     * @param params
     * @return
     */
    protected QueryWrapper<E> beforeGetListAll(Map<String, Object> params) {
        return null;
    }

    /**
     * 查询所有数据后对wrapper的处理
     *
     * @param params
     * @return
     */
    protected ReturnMsg afterGetListAll(Object obj) {
        return ReturnMsg.ok(obj);
    }

    /**
     * 查看单个数据前操作
     *
     * @param id
     */
    protected void beforeGetById(Long id) {

    }

    /**
     * 查看单个数据后操作
     *
     * @param entity
     */
    protected ReturnMsg afterGetById(E entity) {
        return entity != null ? ReturnMsg.ok(entity)
                : ReturnMsg.error(ResultConstant.SELECT_DATA_FALL_MSG);
    }

    /**
     * 保存修改前的操作
     *
     * @param entity
     * @return
     */
    protected void beforeSaveOrUpdate(E entity) throws Exception {

    }

    /**
     * 保存修改后的操作
     *
     * @param entity
     * @return
     */
    protected ReturnMsg afterSaveOrUpdate(E entity, boolean flag, String msg) {
        return flag ? ReturnMsg.ok(entity)
                : ReturnMsg.error(msg);
    }

    /**
     * 单个删除前的操作
     *
     * @param entity
     * @return
     */
    protected void beforeRemoveById(Long id) {
    }

    /**
     * 单个删除后的操作
     *
     * @param entity
     * @return
     */
    protected ReturnMsg afterRemoveById(boolean flag, Long id) {
        return flag ? ReturnMsg.ok()
                : ReturnMsg.error(ResultConstant.DEFAULT_FAIL_MSG);
    }

    /**
     * 根据ID集合进行删除前操作
     *
     * @param entity
     * @return
     */
    protected void beforeRemoveByIds(List<Long> idList) {
    }

    /**
     * 根据ID集合进行删除后操作
     *
     * @param entity
     * @return
     */
    protected ReturnMsg afterRemoveByIds(boolean flag, List<Long> list) {
        return flag ? ReturnMsg.ok()
                : ReturnMsg.error(ResultConstant.DELETE_DATA_FALL_MSG);
    }

    /**
     * 单点图片文件上传
     *
     * @param filename 文件对象
     * @param id       修改的表的主键编号
     * @param realPath 保存的文件夹名称
     * @param clazz    实体类的class
     * @return
     * @throws IOException
     */
    public boolean baseUpLoad(MultipartFile filename, Long id, String realPath, Class<E> clazz) throws IOException {
        // 1.保存文件
        String uploadFileName = uploadUtil.Upload(filename, realPath);
        boolean flag = false;
        try {
            E e = clazz.newInstance();
            e.setId(id);
            E o = (E) baseService.getBaseMapper().selectById(id);
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                if (method.getName().endsWith("Img") && method.getName().startsWith("set")) {
                    method.invoke(e, imgHost + uploadFileName);
                }
            }
            // 2.修改数据库,服务器访问图片路径
            flag = baseService.updateById(e);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508887.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel 数据-分列的三个经常用法

Case 1 &#xff1a;有时候数据导出时如果没有电子表格的话&#xff0c;只能导出本地文件&#xff0c;如下图情况&#xff1a; 可以使用数据-分列处理数据&#xff1a; 原来是因为SAP导出数据没有完成的原因&#xff0c;或者关闭Excel重新打开试一下。 重新打开后可以输入了 C…

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…

C++初阶:5.STL简介(了解)

STL简介&#xff08;了解&#xff09; 一.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 二. STL的版本 原始版本 Alexander Stepan…

绝地求生:Anti-ESP推进对于PUBG哪些影响?

大家好&#xff0c;我是闲游盒。近期&#xff0c;PUBG开发团队开发信介绍了反作弊团队讨论的新话题 - ESP&#xff08;Extra Sensory Perception&#xff09;。在详细看完开发信以后&#xff0c;今天跟大家简单聊聊关于Anti-ESP。 ESP是一种非法软件&#xff0c;允许玩家在游戏…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它&#xff0c;因为我不常用访达的搜索窗口&#xff0c;更多的是想快速打开访达文件夹窗口&#xff0c;可以通过第三方软件定义访达的快…

计算机视觉新巅峰,微软牛津联合提出MVSplat登顶3D重建

开篇&#xff1a;探索稀疏多视图图像的3D场景重建与新视角合成的挑战 3D场景重建和新视角合成是计算机视觉领域的一项基础挑战&#xff0c;尤其是当输入图像非常稀疏&#xff08;例如&#xff0c;只有两张&#xff09;时。尽管利用神经场景表示&#xff0c;例如场景表示网络&a…

鸿蒙OS开发教学:【编程之重器-装饰器】

HarmonyOS 有19种装饰器 必须【2】 绘制一个页面&#xff0c;这两个肯定会用到 EntryComponent 可选【17】 StatePropLinkObjectLinkWatchStylesStoragePropStorageLinkProvideConsumeObservedBuilderBuilderParamLocalStoragePropLocalStorageLinkExtendConcurrent 如果…

C# 排序的多种实现方式(经典)

一、 对数组进行排序 最常见的排序是对一个数组排序&#xff0c;比如&#xff1a; int[] aArray new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; 1、利用冒泡排序进行排序&#xff1a; &#xff08;即每个值都和它后面的数值比较&#xff0c;每次拿出最小值&#xff09; s…

JavaEE初阶-线程3

文章目录 一、线程安全问题-内存可见性二、等待通知2.1 wait()方法2.2 notify()方法 一、线程安全问题-内存可见性 import java.util.Scanner;public class Demo27 {private static int count0;//下面这段代码会出现内存的可见性问题//将从内存中读取count值的操作称为load 判…

MySQL常见故障案例与优化介绍

前言 MySQL故障排查的意义在于及时识别并解决数据库系统中的问题&#xff0c;确保数据的完整性和可靠性&#xff1b;而性能优化则旨在提高数据库系统的效率和响应速度&#xff0c;从而提升用户体验和系统整体性能。这两方面的工作都对于保证数据库系统稳定运行、提升业务效率和…

总结:微信小程序中跨组件的通信、状态管理的方案

在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…

【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令

【经验分享】Ubuntu下如何解决问题arm-linux-gcc&#xff1a;未找到命令 前言问题分析解决方法 前言 在编译过程中发现一个问题&#xff0c;明明之前安装了gcc-4.6版本&#xff0c;版本信息都是正常显示的&#xff0c;刚安装上去的时候也是可以用的。但不知道什么原因突然不能…

【LDLTS】拉普拉斯深能级瞬态光谱

Laplace deep level transient spectroscopy&#xff08;拉普拉斯深能级瞬态光谱&#xff0c;简称LDLTS&#xff09;是一种用于分析和表征半导体材料中深层能级缺陷的技术。它是传统能级瞬态光谱&#xff08;DLTS&#xff09;方法的扩展和改进&#xff0c;特别适用于解决传统DL…

穿山甲广告平台SDK接入效果怎么样?

广告收入是大多数开发者的应用变现收入来源&#xff0c;如何进行流流量变现是从应用设计之初就需要开发者思考的问题。 穿山甲广告平台作为国内第三方广告变现平台&#xff0c;是不少开发者选择的对接平台。 穿山甲广告平台的广告类型较多&#xff0c;有信息流&#xff0c;ba…

Chatgpt掘金之旅—有爱AI商业实战篇|文案写作|(三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、前言 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&…

如何借助Idea创建多模块的SpringBoot项目

目录 1.1、前言1.2、开发环境1.3、项目多模块结构1.4、新建父工程1.5、创建子模块1.6、编辑父工程的pom.xml文件 1.1、前言 springmvc项目&#xff0c;一般会把项目分成多个包:controler、service、dao、utl等&#xff0c;但是随着项目的复杂性提高&#xff0c;想复用其他一个模…

Linux系统-------------mysql主从复制和读写分离

目录 前言 为什么要主从复制&#xff1f; 主从复制谁复制谁&#xff1f; 数据放在什么地方&#xff1f; 一、mysql支持的复制类型 1.1STATEMENT&#xff1a;基于语句的复制 1.2ROW&#xff1a;基于行的复制 1.3MIXED&#xff1a;混合类型的复制 二、主从复制的工作过程 三个重…

LINUX笔记温习

目录 DAY1 DAY2 day3&#xff1a; day4 day5 day6 day7 day8 day9 day10 day11 day12 day13 day14 day15 20day DAY1 1、多层级文件夹创建要带-p&#xff1b; 2、创建多文件&#xff0c;要先到该目录下才能创建(第一个目录必须存在才能有效建立)&#xff1b; D…

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…

SAMBA服务

文章目录 什么是SAMBASAMBA的发展历史与名称的由来SAMBA常见的应用 SAMBA服务器基础配置配置共享资源Windows挂载共享Linux挂载共享 什么是SAMBA 下图来自百度百科 SAMBA的发展历史与名称的由来 Samba是一款开源的文件共享软件&#xff0c;它基于SMB&#xff08;Server Messa…