本基于微信小程序的学生实习考勤打卡系统分为学生微信端和管理员服务端。学生微信端包括首页、公告信息、我的等功能。管理员服务端包括了首页、个人中心、学生管理、实习单位管理、实习打卡管理、考研申报管理、找工作申报管理、系统管理等进行管理。系统总体功能结构图如下所示:
四.数据设计
开发一个系统也需要提前设计数据库。这里的数据库是相关数据的集合,存储在一起的这些数据也是按照一定的组织方式进行的。目前,数据库能够服务于多种应用程序,则是源于它存储方式最佳,具备数据冗余率低的优势。虽然数据库为程序提供信息存储服务,但它与程序之间也可以保持较高的独立性。总而言之,数据库经历了很长一段时间的发展,从最初的不为人知,到现在的人尽皆知,其相关技术也越发成熟,同时也拥有着坚实的理论基础。本系统主要实体属性图如下所示:
五.部分效果展示
5.1用户微信端实现效果
用户登录通过账号、密码页面,进入到系统小程序主界面,进入到操作界面,进行相对应操作,如下图所示。
学生登录系统后,可以对首页、公告信息、我的等功能进行详细操作,如下图所示。
找工作申报,在找工作申报页面学生可以申报自己的工作信息,然后等待管理员审核回复,并可以查看自己的找工作申报信息,包括学生姓名、学号、头像、班级、年级、专业、公司名称、公司地址、出发日期、结束日期、申报时间、备注、行程、审核回复等,如下图所示。
实习打卡管理,在实习打卡管理页面学生可以填写打卡信息,包括了学号、学生姓名、头像、班级、年级、专业、单位名称、单位地址、打卡类型、打卡时间、备注等信息,如下图所示。
我的,在我的页面可以查看实习打卡、考研申报、找工作申报等详细信息进行操作,如下图所示。
5.2后台管理端实现效果
管理员登录,管理员通过登录页面输入用户名、密码,选择角色并点击登录操作,如下图所示。
管理员登录系统后,可以对首页、个人中心、学生管理、实习单位管理、实习打卡管理、考研申报管理、找工作申报管理、系统管理等功能进行相应操作,如下图所示。
六.部分功能代码
/\*\*
\* 权限(Token)验证
\*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
public static final String LOGIN\_TOKEN\_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String servletPath = request.getServletPath();
if("/dictionary/page".equals(request.getServletPath()) || "/file/upload".equals(request.getServletPath()) || "/yonghu/register".equals(request.getServletPath()) ){//请求路径是字典表或者文件上传 直接放行
return true;
}
//支持跨域请求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
//从header中获取token
String token = request.getHeader(LOGIN\_TOKEN\_KEY);
/\*\*
\* 不需要验证权限的方法直接放过
\*/
if(annotation!=null) {
return true;
}
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
# 总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
**很多人担心学了容易忘,这里教你一个方法,那就是重复学习。**
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
![](https://img-blog.csdnimg.cn/img_convert/b338a9c3881df7facacbd85c9d8ef9bd.webp?x-oss-process=image/format,png)
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
[外链图片转存中...(img-69qNoxL7-1719267515400)]
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。