目录
- 1 项目介绍
- 2 项目截图
- 3 核心代码
- 3.1 Controller
- 3.2 Service
- 3.3 Dao
- 3.4 spring-mybatis.xml
- 3.5 spring-mvc.xml
- 3.5 login.jsp
- 4 数据库表设计
- 5 文档参考
- 6 计算机毕设选题推荐
- 7 源码获取
1 项目介绍
博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+粉丝,超300w访问量,专注于大学生项目实战开发、讲解和答疑辅导,对于专业性数据证明一切!
主要项目:javaweb、ssm、springboot、vue、小程序、python、安卓、uniapp等设计与开发,万套源码成品可供选择学习。
👇🏻👇🏻文末获取源码
JavaWeb美食推荐管理系统(源码+数据库+文档)
项目描述
网络的快速发展从根本上更改了世界各组织的管理方式,自二十世纪九十年代开始,我国的政府、企事业等单位就设想可以通过互联网系统来进行管理信息。由于以前存在各方面的原因,比如网络普及度低、用户不接受、互联网的相关法律法规也不够完善、开发技术也不够成熟等,阻碍了互联网在各大机构中的发展速度。进入二十一世纪以后,我国经济有了快速的发展,限制机构管理的各个难题逐一被解决,国内各大机构都加入到了电子信息化的管理模式中来。
以往的美食推荐管理系统相关信息管理,都是工作人员手工统计。这种方式不但时效性低,而且需要查找和变更的时候很不方便。随着科学的进步,技术的成熟,计算机信息化也日新月异的发展,社会也已经深刻的认识,计算机功能非常的强大,计算机已经进入了人类社会发展的各个领域,并且发挥着十分重要的作用。本系统利用网络沟通、计算机信息存储管理,有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上,能够得到极大地提高,延伸至服务水平也会有好的收获,有了网络,在线美食推荐管理系统的各方面的管理更加科学和系统,更加规范和简便。
运行环境
jdk8+mysql5.7+IntelliJ IDEA+tomcat8+maven3
项目技术(必填)
jsp+html+css+js+jquery+Spring+SpringMvc+Mybatis
2 项目截图
JavaWeb美食推荐管理系统
3 核心代码
3.1 Controller
package com.controller;import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
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.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;/*** 登录相关*/
@RequestMapping("users")
@RestController
public class UserController{@Autowiredprivate UserService userService;@Autowiredprivate TokenService tokenService;/*** 登录*/@IgnoreAuth@PostMapping(value = "/login")public R login(String username, String password, String captcha, HttpServletRequest request) {UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));if(user==null || !user.getPassword().equals(password)) {return R.error("账号或密码不正确");}String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());return R.ok().put("token", token);}/*** 注册*/@IgnoreAuth@PostMapping(value = "/register")public R register(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {return R.error("用户已存在");}userService.insert(user);return R.ok();}/*** 退出*/@GetMapping(value = "logout")public R logout(HttpServletRequest request) {request.getSession().invalidate();return R.ok("退出成功");}/*** 密码重置*/@IgnoreAuth@RequestMapping(value = "/resetPass")public R resetPass(String username, HttpServletRequest request){UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));if(user==null) {return R.error("账号不存在");}user.setPassword("123456");userService.update(user,null);return R.ok("密码已重置为:123456");}/*** 列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params,UserEntity user){EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));return R.ok().put("data", page);}/*** 列表*/@RequestMapping("/list")public R list( UserEntity user){EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();ew.allEq(MPUtil.allEQMapPre( user, "user")); return R.ok().put("data", userService.selectListView(ew));}/*** 信息*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") String id){UserEntity user = userService.selectById(id);return R.ok().put("data", user);}/*** 获取用户的session用户信息*/@RequestMapping("/session")public R getCurrUser(HttpServletRequest request){Integer id = (Integer)request.getSession().getAttribute("userId");UserEntity user = userService.selectById(id);return R.ok().put("data", user);}/*** 保存*/@PostMapping("/save")public R save(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {return R.error("用户已存在");}userService.insert(user);return R.ok();}/*** 修改*/@RequestMapping("/update")public R update(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {return R.error("用户名已存在。");}userService.updateById(user);//全部更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Long[] ids){userService.deleteBatchIds(Arrays.asList(ids));return R.ok();}
}
3.2 Service
/*** 系统用户*/
public interface UserService extends IService<UserEntity> {PageUtils queryPage(Map<String, Object> params);List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);PageUtils queryPage(Map<String, Object> params,Wrapper<UserEntity> wrapper);}
3.3 Dao
/*** 用户*/
public interface UserDao extends BaseMapper<UserEntity> {List<UserEntity> selectListView(@Param("ew") Wrapper<UserEntity> wrapper);List<UserEntity> selectListView(Pagination page,@Param("ew") Wrapper<UserEntity> wrapper);}
3.4 spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 配置数据源 --><bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_url}"/><property name="username" value="${jdbc_username}"/><property name="password" value="${jdbc_password}"/><!-- 初始化连接大小 --><property name="initialSize" value="0"/><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20"/><!-- 连接池最大空闲 --><property name="maxIdle" value="20"/><!-- 连接池最小空闲 --><property name="minIdle" value="0"/><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000"/><property name="validationQuery" value="${validationQuery}"/><property name="testOnBorrow" value="false"/><property name="testOnReturn" value="false"/><property name="testWhileIdle" value="true"/><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000"/><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000"/><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true"/><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800"/><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true"/><!-- 监控数据库 --><property name="filters" value="mergeStat"/></bean><!-- Spring整合Mybatis,更多查看文档:http://mp.baomidou.com --><bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 自动扫描Mapping.xml文件 --><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/><property name="typeAliasesPackage" value="com..model.*"/><property name="typeEnumsPackage" value="com.model.enums"/><property name="plugins"><array><!-- 分页插件配置 --><bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean></array></property><!-- 全局配置注入 --><property name="globalConfig" ref="globalConfig" /></bean><bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"><!--AUTO->`0`("数据库ID自增")INPUT->`1`(用户输入ID")ID_WORKER->`2`("全局唯一ID")UUID->`3`("全局唯一ID")--><property name="idType" value="2" /><!--MYSQL->`mysql`ORACLE->`oracle`DB2->`db2`H2->`h2`HSQL->`hsql`SQLITE->`sqlite`POSTGRE->`postgresql`SQLSERVER2005->`sqlserver2005`SQLSERVER->`sqlserver`--><!-- Oracle需要添加该项 --><!-- <property name="dbType" value="oracle" /> --><!-- 全局表为下划线命名设置 true --><!-- <property name="dbColumnUnderline" value="true" /> --><property name="metaObjectHandler"><bean class="com.config.MyMetaObjectHandler" /></property></bean><!-- MyBatis 动态扫描 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.dao"/></bean><!-- 配置事务管理 --><bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 事务管理 属性 --><tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED"/><tx:method name="append*" propagation="REQUIRED"/><tx:method name="save*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="modify*" propagation="REQUIRED"/><tx:method name="edit*" propagation="REQUIRED"/><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="remove*" propagation="REQUIRED"/><tx:method name="repair" propagation="REQUIRED"/><tx:method name="get*" propagation="REQUIRED" read-only="true"/><tx:method name="find*" propagation="REQUIRED" read-only="true"/><tx:method name="load*" propagation="REQUIRED" read-only="true"/><tx:method name="search*" propagation="REQUIRED" read-only="true"/><tx:method name="datagrid*" propagation="REQUIRED" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice><!-- 配置切面 --><aop:config><aop:pointcut id="transactionPointcut" expression="execution(* com.service..*.*(..))"/><aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/></aop:config></beans>
3.5 spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><mvc:default-servlet-handler/><!-- Controller包(自动注入) --><context:component-scan base-package="com.controller"/><!-- FastJson注入 --><mvc:annotation-driven><!-- <mvc:message-converters register-defaults="true">避免IE执行AJAX时,返回JSON出现下载文件FastJson<bean id="fastJsonHttpMessageConverter"class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list>这里顺序不能反,一定先写text/html,不然ie下出现下载提示<value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property><property name="features"><array value-type="com.alibaba.fastjson.serializer.SerializerFeature">避免循环引用<value>DisableCircularReferenceDetect</value>是否输出值为null的字段<value>WriteMapNullValue</value>数值字段如果为null,输出为0,而非null<value>WriteNullNumberAsZero</value>字符类型字段如果为null,输出为"",而非null <value>WriteNullStringAsEmpty</value>List字段如果为null,输出为[],而非null<value>WriteNullListAsEmpty</value>Boolean字段如果为null,输出为false,而非null<value>WriteNullBooleanAsFalse</value></array></property></bean></mvc:message-converters> --></mvc:annotation-driven><!-- 静态资源配置 --><mvc:resources mapping="/resources/**" location="/resources/"/><!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 拦截器配置 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/upload"/><bean class="com.interceptor.AuthorizationInterceptor"/></mvc:interceptor></mvc:interceptors><!-- 上传限制 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 上传文件大小限制为31M,31*1024*1024 --><property name="maxUploadSize" value="32505856"/></bean></beans>
3.5 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>登陆</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content=""><!-- Le styles -->
<script type="text/javascript"src="${pageContext.request.contextPath}/resources/assets2/js/jquery.min.js"></script><!-- <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/assets2/css/style.css"> -->
<link rel="stylesheet"href="${pageContext.request.contextPath}/resources/assets2/css/loader-style.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/resources/assets2/css/bootstrap.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/resources/assets2/css/signin.css"><!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
<!-- Fav and touch icons -->
<link rel="shortcut icon"href="${pageContext.request.contextPath}/resources/assets2/ico/minus.png">
</head>
<style>html {width: 100%;height: 100%;}body {background-image: url(http://codegen.caihongy.cn/20210205/f4f80f5323bf4b1992cb9fddd10b0b25.jpg) !important;height: 100vh;background-position: center center;background-size: cover;background-repeat: no-repeat;overflow: hidden !important;width: 100%;height: 100%;}.container {padding: 0;margin: 0;display: flex;height: 100%;width: 100%;justify-content: center;align-items: center;}#login-wrapper {display: flex;flex-direction: column;position: inherit;height: auto;width: 400px;margin: 0;padding: 20px 0px 20px 0;border-radius: 32px;border-width: 0;border-style: solid;border-color: rgba(0,0,0,.3);background-color: rgba(255, 255, 255, 1);box-shadow: 0 0 0px rgba(78, 115, 223, 1);}#login-wrapper h1 {line-height: 60px;width: 100%;color: rgba(78, 115, 223, 1);font-size: 20px;margin: 0px 0px ;padding: 0 10px;border-radius: 0;border-width: 0;border-style: solid;border-color: rgba(0,0,0,.3);background-color: rgba(30, 144, 255, 0);box-shadow: 0 0 6px rgba(30, 144, 255, 0);text-align: center;}#loginForm .form-group-l-r {display: flex;flex-wrap: wrap;}#loginForm .form-group {display: flex;align-items: center;flex-wrap: wrap;height: auto;width: 80%;margin: 0 auto;padding: 0 0 10px 0;border-radius: 0;border-width: 0;border-style: solid;border-color: rgba(0,0,0,1);background-color: #fff;box-shadow: 0 0 6px rgba(255,0,0,0);}#loginForm .form-group .label {width: 72px;line-height: 44px;margin: 0;color: rgba(78, 115, 223, 1);font-size: 16px;padding: 0;border-radius: 0;border-width: 0;border-style: solid;border-color: rgba(0,0,0,0);background-color: transparent;box-shadow: 0 0 6px rgba(255,0,0,0);text-align: left;}#loginForm .form-group .form-control-i {width: 100%;height: 44px;margin: 0;color: rgba(78, 115, 223, 1);font-size: 14px;padding: 0 10px;border-radius: 8px;border-width: 1px;border-style: solid;border-color: rgba(78, 115, 223, 1);background-color: #fff;box-shadow: 0 0 0px rgba(30, 144, 255, .5);text-align: left;}#loginForm .form-group .form-control-i:focus {outline: 0 none;}#loginForm .form-group-r {display: flex;align-items: center;width: 80%;height: 44px;margin: 0 auto;padding: 0;border-radius: 0;border-width: 0;border-style: solid;border-color: rgba(0,0,0,1);background-color: #fff;box-shadow: 0 0 6px rgba(255,0,0,0);}#loginForm .form-group-r .checkbox {margin: 0 10px 0 0;padding: 0;display: flex;align-items: center;}#loginForm .form-group-r .checkbox label {color: #606266;font-size: 14px;margin: 0;margin-top: -1px;}#loginForm .form-group-r .checkbox.active label {color: rgba(78, 115, 223, 1);font-size: 14px;}#loginForm .form-group-r .checkbox input {margin: 0;margin-right: 4px;}#loginForm button.pull-right {outline: none;width: 100%;height: 44px;margin: 10px 3% 10px 7%;color: #fff;font-size: 16px;padding: 0 10px;border-radius: 32px 32px 32px 32px;border-width: 0;border-style: solid;border-color: #ccc;background-color: rgba(78, 115, 223, 1);box-shadow: 0 0 0px rgba(255, 0, 0, .5);}#loginForm a.btn-register {display: inline-block;width: 100%;height: 44px;margin: 10px 3% 10px 6%;color: #fff;font-size: 16px;padding: 10px;border-radius: 32px 32px 32px 32px;border-width: 0;border-style: solid;border-color: #ccc;background-color: rgba(76, 141, 174, 1);box-shadow: 0 0 6px rgba(30, 144, 255, .5);display: flex;justify-content: center;align-items: center;text-decoration: none;}#loginForm .codes {display: none;}#loginForm .codes input {width: calc(100% - 84px);height: 44px;margin: 0;color: #1e90ff;font-size: 14px;padding: 0 10px;border-radius: 0;border-width: 1px;border-style: solid;border-color: #1e90ff;background-color: #fff;box-shadow: 0 0 6px rgba(30, 144, 255, 0);outline: none;}#loginForm .codes .nums {width: 84px;height: 44px;margin: 0;color: $template2.back.login.code.nums.color;font-size: $template2.back.login.code.nums.fontSize;padding: 0;border-radius: 0;border-width: 1px 1px 1px 0;border-style: solid;border-color: #1e90ff;background-color: #f5f5f5;box-shadow: 0 0 6px rgba(30, 144, 255, 0);outline: none;}
</style>
<body><!-- Preloader --><!-- <div id="preloader"><div id="status"> </div></div> --><div class="container"><div class="" id="login-wrapper"><h1>登陆</h1><form id="loginForm" action="" method="post"><div class="form-group"><label class="label">用户名</label> <input type="text" id="username" name="username" placeholder="用户名"class="form-control-i" required></div><div class="form-group"><label class="label">密码</label> <input type="password" name="password" placeholder="密码"class="form-control-i" required></div><div class="form-group codes"><input style="flex: 1;" type="text" id="code" placeholder="请输入验证码"><div class="nums" id="nums" style="display: flex;justify-content: center;align-items: center;" onclick="randomString()"></div></div><div class="form-group-l-r"><button class="btn btn btn-primary pull-right" type="submit" onclick="login()">登 录</button><a class="btn-register" href="modules/yonghu/register.jsp">用户注册</a></div> </form><!-- <div class="row"><div class="col-md-4 col-md-offset-4"><div class="account-box"></div></div></div> --></div></div><!-- END OF PAPER WRAP --><!-- MAIN EFFECT --><!--<script type="text/javascript" src="${pageContext.request.contextPath}/resources/assets2/js/preloader.js"></script>--><script type="text/javascript"src="${pageContext.request.contextPath}/resources/assets2/js/bootstrap.js"></script><!--<script type="text/javascript" src="${pageContext.request.contextPath}/resources/assets2/js/app.js"></script>--><!--<script type="text/javascript" src="${pageContext.request.contextPath}/resources/assets2/js/load.js"></script>--><!--<script type="text/javascript" src="${pageContext.request.contextPath}/resources/assets2/js/main.js"></script>--><script type="text/javascript"src="${pageContext.request.contextPath}/resources/js/jquery.form.js"></script><!--<script src="http://maps.googleapis.com/maps/api/js?sensor=false" type="text/javascript"></script> --><!--<script type="text/javascript" src="${pageContext.request.contextPath}/resources/assets2/js/map/gmap3.js"></script> --><script type="text/javascript"><%@ include file="utils/menu.jsp"%><%@ include file="utils/baseUrl.jsp"%>var role = "";var accountTableName = "";var codes = [{num: 1,color: '#000',rotate: '10deg',size: '16px'}, {num: 2,color: '#000',rotate: '10deg',size: '16px'}, {num: 3,color: '#000',rotate: '10deg',size: '16px'}, {num: 4,color: '#000',rotate: '10deg',size: '16px'}]//渲染角色选择function setRoleOption() {var box = document.createElement('div');box.setAttribute('class', 'form-group-r');for (var i = 0; i < menus.length; i++) {//console.log(menu[i].roleName)var div = document.createElement('div');div.setAttribute('class', 'checkbox');var label = document.createElement('label');//label.innerHTML = menus[i].roleName;var checkbox = document.createElement('input');checkbox.setAttribute('type', 'radio');checkbox.setAttribute('name', 'chk');checkbox.setAttribute('value', menus[i].roleName);var attr = "checkRole(" + "\'" + menus[i].roleName + "\',\'"+ menus[i].tableName + "\')";checkbox.setAttribute('onclick', attr);//label.setAttribute('class','checkbox inline');label.innerHTML = menus[i].roleName;div.appendChild(checkbox);div.appendChild(label);box.appendChild(div);}$('form .form-group-l-r').before(box);}function checkRole(roleName, tableName) { role = roleName;$('#loginForm').attr('action', baseUrl + tableName + '/login');accountTableName = tableName;}$('#login-wrapper').on('change', 'input[type=radio]', function () {$('#login-wrapper .form-group-r .checkbox').removeClass('active');$(this).parent().addClass('active');});function login() {if(false) {var arr = []for(var i = 0;i<codes.length;i++) {arr.push(codes[i].num)}if(arr.join('').toLowerCase() != $('#code').val().toLowerCase()) {alert("请输入正确的验证码");randomString()window.location.href="${pageContext.request.contextPath}/jsp/login.jsp";}}$("#loginForm").ajaxForm(function(res) {if (role == "" || role == null) {alert("请选择角色后再登录");} else {if (res.code == 0) {alert("登录成功");var username = $('#username').val();window.sessionStorage.setItem('accountTableName',accountTableName)window.sessionStorage.setItem('username',username);window.sessionStorage.setItem('token',res.token);window.sessionStorage.setItem('role',role);window.location.href = "${pageContext.request.contextPath}/index.jsp";} else {alert(res.msg);}}});}function ready() {setRoleOption();//$('form').attr('action',baseUrl + 'users/login');}document.addEventListener("DOMContentLoaded", ready);function randomString() {var len = 4;var chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k','l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G','H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R','S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2','3', '4', '5', '6', '7', '8', '9']var colors = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']var sizes = ['14', '15', '16', '17', '18']var output = []for (var i = 0; i < len; i++) {// 随机验证码var key = Math.floor(Math.random() * chars.length)codes[i].num = chars[key]// 随机验证码颜色var code = '#'for (var j = 0; j < 6; j++) {var key = Math.floor(Math.random() * colors.length)code += colors[key]}codes[i].color = code// 随机验证码方向var rotate = Math.floor(Math.random() * 360)var plus = Math.floor(Math.random() * 2)if (plus == 1) rotate = '-' + rotatecodes[i].rotate = 'rotate(' + rotate + 'deg)'// 随机验证码字体大小var size = Math.floor(Math.random() * sizes.length)codes[i].size = sizes[size] + 'px'}var str = ''for(var i = 0;i<codes.length;i++) {str += '<span style="color:' + codes[i].color + ';transform:' + codes[i].rotate + ';fontSize:' + codes[i].size + ';padding: 0 3px;display:inline-block">'+codes[i].num+'</span>'}$('#nums').html('').append(str);}randomString();</script></body></html>
4 数据库表设计
用户注册实体图如图所示:
数据库表的设计,如下表:
5 文档参考
6 计算机毕设选题推荐
最新计算机软件毕业设计选题大全:整理中…
7 源码获取
👇🏻获取联系方式在文章末尾 如果想入行提升技术的可以看我专栏其他内容: