目录
一、系统包含的技术:
后端:ssm + springboot
前端:vue + ElementUI
开发工具:IDEA WebStorm
数据库:MySQL
JDK版本:jdk1.8+
二、模块设计思路
欢迎页面、社团类型管理、社团信息管理、用户信息管理、留言管理、入团申请管理、社团活动管理、社团成员管理、社团费用管理
欢迎页面:
社团类型管理:
社团信息管理:
用户信息管理:
留言管理:
三、项目运行截图
入团申请管理:
社团活动管理:
社团成员管理:
社团费用管理:
四、项目代码分析
JWT:
package com.cys.jwt;
import com.cys.model.UserInfo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
public class JwtUtil {
//过期时间设置
public static final long EXPIRE = 1000 * 60 * 30 ;//30分钟
//生成密码
public static final String APP_SECRET = "kappy";
/**
* 生成token 方法
* @param user
* @return
*/
public static String getJwtToken(UserInfo user){
String JwtToken = Jwts.builder()
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.claim("username", user.getUsername())
.claim("type", user.getType())
.claim("id", user.getId())
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();
return JwtToken;
}
/**
* 判断token是否存在与有效
* @param jwtToken
* @return
*/
public static boolean checkToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 判断token是否存在与有效
* @param request
* @return
*/
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 获取用户id
*/
public static Integer getUserId(String token){
Jws<Claims> claimsJws =
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (Integer) claims.get("id");
}
/**
* 获取用户type
*/
public static Integer getUserType(String token){
Jws<Claims> claimsJws =
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (Integer) claims.get("type");
}
/**
* 根据token获取xm
* @return
*/
public static String getMemberIdByJwtToken(String token) {
// String jwtToken = request.getHeader("token");
Jws<Claims> claimsJws =
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (String)claims.get("username");
}
public static void main(String[] args) {
// 生成token
UserInfo info=new UserInfo();
info.setId(1);
info.setType(1); //代表管理员
info.setUsername("admin");
String token = getJwtToken(info);
System.out.println(token);
// String
//验证是否存在与有效
boolean b = checkToken(token);
System.out.println(b);
// //获取对象 用户名信息
// String username= getMemberIdByJwtToken(token);
// System.out.println(username);
Integer id= getUserId(token);
System.out.println(id);
}
}
社团活动管理:
@Api(tags = {"社团活动管理"})
@RestController
@RequestMapping("/activity")
public class ActivityController {
private Logger log = LoggerFactory.getLogger(getClass());
@Resource
private IActivityService activityService;
@Resource
private ITeamService teamService;
/**
* 高级分页查询接口
*/
@RequestMapping("/queryActivityInfoList")
public JsonObject queryApplyInfoList(String name,
String tel,
@RequestParam(defaultValue = "1")int page,
@RequestParam(defaultValue = "15")int limit,
HttpServletRequest request){
//通过header 获取token
String token = request.getHeader("token");
//通过token获取角色类型和用户id
Integer type = JwtUtil.getUserType(token);
Integer userId = null;
if (type==0){
//如果是一个社团的管理员
//获取当前用户据id
userId = JwtUtil.getUserId(token);
}
//创建返回结果集对象
JsonObject jsonObject=new JsonObject();
PageInfo<Activity> PageInfo = activityService.queryList(page, limit, name,tel,userId);
jsonObject.setCode(20000);
jsonObject.setTotal(PageInfo.getTotal());
jsonObject.setData(PageInfo.getList());
return jsonObject;
}
@RequestMapping("/updateStatusById")
public R updateStatusById(int id){
int status=1;//默认只要审核就通过
boolean b = activityService.updateStatus(status,id);
if (b){
return R.ok();
}
return R.fail("失败");
}
@ApiOperation(value = "新增社团活动管理")
@RequestMapping("/addInfo")
public R add(@RequestBody Activity activity,
HttpServletRequest request){
//通过header 获取token
String token = request.getHeader("token");
//获取用户id
Integer userId = JwtUtil.getUserId(token);
//根据用户id 获取用户所在社团信息
Team team = teamService.queryTeamInfoByUserId(userId);
activity.setTeamId(team.getId());
activity.setCreateTime(new Date());
activity.setUserId(userId);
activity.setStatus(0);
int num= activityService.add(activity);
if (num>0){
return R.ok();
}
return R.fail("失败");
}
@ApiOperation(value = "删除社团活动管理")
@RequestMapping("/deleteById")
public R delete( Long id){
int num= activityService.delete(id);
if (num>0){
return R.ok();
}
return R.fail("失败");
}
@ApiOperation(value = "更新社团活动管理")
@RequestMapping("/updateInfo")
public R update(@RequestBody Activity activity){
int num= activityService.updateData(activity);
if (num>0){
return R.ok();
}
return R.fail("失败");
}
/**
* ***********
* 前端页面的接口方法
*/
@RequestMapping("/findByTeamId")
public Map findByTeamId(int id){
Activity act = activityService.findByTeamId(id);
Map map= new HashMap();
map.put("code",20000);
map.put("data",act);
return map;
}
}
跨域
package com.cys.cors;
import com.cys.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.rmi.registry.Registry;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
// @Override
// public void addCorsMappings(CorsRegistry registry){
// registry.addMapping("/**")
// .allowCredentials(true)
// .allowedOrigins("*")
// .allowedMethods(new String[]{"GET","POST","PUT","DELETE"})
// .allowedHeaders("*");
@Bean
public WebMvcConfigurer corsConfigs(){
return new WebMvcConfigurer(){
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
// .allowCredentials(true)
.allowedOrigins("*")
.maxAge(3600L);
}
};
}
private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); //允许所有域名访问
corsConfiguration.addAllowedHeader("*"); //允许所有请求头
corsConfiguration.addAllowedMethod("*"); //允许所有的请求类型
corsConfiguration.setMaxAge(3600L);
corsConfiguration.setAllowCredentials(true); //允许请求携带验证信息(cookie)
return corsConfiguration;
}
/**
* 注册拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration =
registry.addInterceptor(new LoginInterceptor());
//添加拦截内容
registration.addPathPatterns("/**");
//添加不拦截内容
registration.excludePathPatterns("/users/loginIn",
"users/queryuserInfo","team/queryTeamAll",
"activity/findByTeamId");
}
}
五、项目优化升级
开发建议: 尽量基于SpringBoot框架搭建项目,非常好用,还可以加消息队列
数据库设计: 参考已有的类似项目设计数据库,深入挖掘自己选题要解决什么问题,即设计什么数据表
后端:
java
spring(依赖注入框架,帮助你管理 Java 对象,集成一些其他的内容)
springmvc(web 框架,提供接口访问、restful接口等能力)
mybatis(Java 操作数据库的框架,持久层框架,对 jdbc 的封装)
mybatis-plus(对 mybatis 的增强,不用写 sql 也能实现增删改查)
springboot(快速启动 / 快速集成项目。不用自己管理 spring 配置,不用自己整合各种框架)
junit 单元测试库
mysql
部署:服务器 / 容器(平台)
六、结语
感谢大家的阅读,愿我们的未来一片光明。