作者主页:源码空间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
运行截图
文档截图
项目截图
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;
}
}