如何使用ssm实现题库管理系统的设计与实现

280 篇文章 0 订阅
87 篇文章 0 订阅

@TOC

ssm495题库管理系统的设计与实现+jsp

研究背景和来源

目前的管理类系统已各种各样,涉及到生活中的每一个部分。购物类、网站类、信息统计类、办公类、官网类等非常丰富。我国各类系统的发展已非常成熟,这些系统依靠网络和计算机技术不断完善发展为人们带来更好的生活体验。而管理类的系统更是多种多样,像比如出名的库存管理系统、人事管理系统等拥有的客户群体都非常大。

受我国教育理念的影响,每个家庭都非常注重学生的学习,而考试是验证学习成果的重要手段。我国人口众多,竞争压力也越来越大,随着国民经济水平的提升,越来越多的家庭都认识到学习的重要性。我国的教育水平还处在基础阶段,学校组织考试的主要途径是通过老师组卷,在教室组织考试,这种方式就造成老师的工作量巨大,对试卷的组成、试卷的批改以及成绩的统计都需要大量的时间。学生考试后老师的整理工作也非常复杂,老师想要为学生打分也需要手动整理、发布,造成老师的工作量巨大,工作压力增加。

1.2课题研究现状

目前学生考试的主要途径还是通过传统方式,也就是采用在学校由老师在教室发放试卷,学生做完上交的方式,这种方式对课程少、学生少的学校来说非常适合,但对课程种类多、学生多来说非常困难。对今后老师成绩的发布也需要大量时间的配合,信息不够及时,这种方法已非常落后。虽然现在对于计算机的有些科目也用上了在线的考试系统,但因为这些考试系统功能不够完善,满足不了更多的要求,信息更新也不及时,所以使用人员并不多,造成这类在线考试系统的白废。我国线上考试系统发展已形成一定的规模,在众多考试系统里主要针对的是试卷的各种资料管理。也会涉及到课程以及成绩,但都不够专业,不能实现更深层次的功能,满足不了用户的需求。特别对于试卷的种类非常少,只能负责单一科目的考试。

1.3课题开发的目的和意义

本系统的实现目的在于帮助学生的考试。和相关的管理系统相比,本系统针对性更强,向使用用户展示最为详细的试题信息,帮助管理员了解试题并进行在线试卷生成。本系统为免费的题库管理系统,为学校的学生考试提供辅助。本系统的核心在于内容,以丰富的试卷种类取胜,去繁留简,使本系统的用户更容易抓住重点,找到核心内容,减少用户烦躁心理。本系统的实现拥有更大的意义:

  1. 本系统功能简单、针对性强,使系统用户更为直观,操作也更为简单,只要有上网经验的用户都可以轻松掌握;
  2. 本系统采用多种试卷种类,演可以根据自己的需要选择试卷进行考试;
  3. 本系统中的试题信息都是由管理员、教师发布,可以做到及时、精准;
  4. 本系统中设有成绩管理功能,管理员、教师可以管理学生的成绩,学生也可以随时查询成绩。

1.4课题开发内容

本题库管理系统采用管理员、学生、教师界面进行设计。学生、教师的账号和密码可通过注册获得,管理员的账号和密码可由系统开发者在数据库中设置。管理员的主要功能为学生资料、教师资料的添加、修改,试题信息的添加和查询、试卷的生成,还可以查询学生的考试成绩、设置年级班级等。学生的主要功能为浏览试卷和在线考试以及查询考试成绩。教师的功能为设置试题、试卷、查看学生分数等。教师和管理员的功能类似,管理员属于上一级的领导可以管理教师的所有信息。

1.5论文结构安排

本篇论文分为摘要、目录、绪论、系统开发关键技术介绍、系统分析、系统设计和系统实现、系统测试、总结、致谢、参考文献。本篇论文的核心集中在系统设计和系统实现部分。绪论部分为基础调研,在系统分析中阐述系统的需求分析、可行性分析和数据流程图、用例图等。

2 系统开发关键技术介绍

2.1系统开发使用的关键技术

本系统在开发中选择SSM框架进行设计,语言采用JAVA,数据库采用Mysql,并在设计中加入Jsp技术,本系统的运行环境为Idea。

2.2 Jsp技术介绍

Jsp是一个用来开发前台界面的JAVA框架技术,体积非常的小,所以运行效率非常的高,可以直接通过虚拟设定的 DOM进行各种JAVA计算,因为操作过程中相当于是一个预处理,所以并没有真实的DOM,也可以称作为一个虚拟的DOM。Jsp还可以进行双向的数据绑定,这样操作起来更加的简单,使用户可以不用管DOM对象,直接去操作业务逻辑就可以了,可以应用的场景非常的多,而且开发成本也非常的低。目前的市场后已经有很多成熟稳定的框架组件,可以直接拿来使用,对于初学者来说非常的方便。

2.3 Idea介绍

Idea是公认的最好用JAVA开发工具之一,常见最多的都是用来跟Eclipse进行比较,Eclipse可以说是最简单的,但是在兼容方面,代码设计方面明显不足。而Idea就是在Eclipse基础上进行了整合升级,更加智能。Idea最大的创新就是有智能代码助手,可以实现代码提示,还能进行代码重构,代码审查,非常适合新手的使用。Idea的宗旨就是实现智能编码,使编码更加的简单,所以在Idea上有很多其他软件所没有的特色功能,比如进行智能选取,不需要开发者在手动操作,还有各种丰富的导航模式可供选择,可以直接导入就能使用,不需要开发者在重新建立,还有历史记录功能,在误删误操作的情况下,通过这个功能就可以直接恢复。而且Idea相比Eclipse调试也更简单,通过Eclipse调试的时候需要选定表达式,否则就没办法查看它的值,而通过Idea则不需要进行任何操作,Idea会自动理解你所需要的表达式,然后给你建议参考值。而且在编码方面更加智能,会自动跳出需要的变量和参数,然后建议你最优选择。所以说相比Eclipse来说,用Idea开发更加的简单方便,更适合新用户的开发使用。

2.4 Mysql数据库介绍

数据库主要就是用来存储和管理系统数据的,按照数据结构来进行组织和存储的,数据库都有自己独立的接口来进行创建,访问,管理等,也可以直接用文件的形式进行数据存储,但是读写速度比较慢,效率不高,所以一般都是采用专门的数据库软件来进行数据库存储和管理,这样可以更加科学有效的实现数据的存储,也更加的安全。而Mysql就是一个关系型数据库管理系统,可以把各种不同的数据库存储到不同的表结构中 ,这样可以提高查找效率。

3 系统分析

3.1系统可行性分析

可行性分析主要是先进行初步调查,然后从各个方面进行系统可行性研究,比如系统需要做什么,采用什么技术,进行各种分析研究,然后得到一个可行性的方案。然后在对方案进行各个功能模块的设计,进行系统设计分析,研究系统设计可行性。所以要从多方面进行考虑,而本文主要从技术上,经济上,操作上,法律上进行研究分析。

3.2系统需求分析

上报给学校,学校再给学生发布成绩。这种方式步骤多,一旦中间有一步出错会给学生的成绩造成问题,而且学生想要了解更详细的考试内容非常不容易。而本题库管理系统提供试卷详情,由学生自己了解,然后进行选择,在线考试,成绩结果用户也可以快速在系统里获知,利用本系统也可以帮助老师审阅学生成绩,本题库管理系统前景非常好。

3.2.1技术可行性

随着技术的快速发展,各种软件开发技术也在不停的更新,不断的发展,大家都在选择适合自己水平的,能达到开发需求的软件技术和开发环境。所以根据我的开发需求,然后决定开发本系统采用Java语言SSM框架来完成,开发出来的系统可以满足功能需求,而且操作界面美观,符合目前的审美,最重要的是开发相对简单,可以自动生成所需要的框架结构。前端框架采用Jsp,数据库Mysql,体积更小,存储速度快,可以满足本次开发的需求。

3.2.2经济可行性

经济可行性分析主要是对前期投资进行分析,对系统维护费用分析,对开发完成后取得的经济收益进行分析。因为本系统完全是自己开发的,作为毕业设计用途的,只需要基础的设施就行,需要电脑硬件,开发软件等,不需要额外的投入,完全满足开发需求。而系统开发完成后可以方便用户使用,还能带来一定的经济效益,所以开发本系统在经济上是可行的。

3.2.3运行可行性分析

开发本系统过程中已经充分考虑了使用者的感受,界面美观,而且有功能导航栏,方便用户很好的掌握,而且还有各种提示符,哪怕对计算机操作不熟练的也能使用本系统。所以综合考虑,本系统在运行方面是可行的。

3.2.4法律可行性

开发本系统过程中参阅的相关资料都是在学校图书馆参阅的,均为正规渠道,而且开发均是本人独立开发的,均是自己的知识储备,全是自己原创的,不存在知识产权,所以才法律上是可行的。

3.3系统功能分析

本系统采用功能针对性强、文字描述精确的方式进行设计。本题库管理系统是关于试卷管理的系统,在设计功能时只取用最基础的功能,目的是提供最精准的服务。本系统包括学生和管理员、教师三部分。

管理员负责学生管理、教师管理、年级班级管理、分数管理、试卷管理、试题管理和考试管理。管理员用例图如下图3.1所示:

图3.1管理员用例图

学生负责查看试卷、在线考试、查询成绩。学生用例图如下图3.2所示:

图3.2学生用例图

教师负责学生管理、年级班级查看、分数管理、试卷管理、试题管理和考试管理等。教师用例图如下图3.3所示:

图3.3教师用例图

3.4系统性能分析

系统性能方面包括系统的框架、系统的开发理念、系统的开发界面原则、系统开发标准、系统开发流程、系统开发安全性、系统运行稳定性等。具体性能分析如下:

  1. 本系统是面向所有人群而开发的管理平台,所以采用的框架模式为B/s,B/s模式是借助浏览器进行系统访问的平台,所有信息可以共享;
  2. 系统在设计中采用结构化方式,首先将功能分为大的方面,再由大方面分为小方面,最后分为小细节再整合成完整的系统;
  3. 系统在界面设计时采用Jsp技术,可以使界面更丰富,元素更多;
  4. 系统的操作流程采用简单的思路,使使用用户可以快速掌握本系统;
  5. 系统的运行速度要快,所有操作可以快速反映;
  6. 在系统开发时要注意系统的资源占用,以最少占用为标准进行设计;
  7. 采用发展的眼光看待问题,把系统的生命周期延长到最大;
  8. 调查所有使用用户的需求尽可能的满足。

3.5业务流程分析

业务流程涉及到系统的每个部分,调查系统在运行中数据会流动的每个环节,以学生登录开始到在线考试进行业务流程分析。确保所有信息的流入、流出以及数据的完整性和处理问题的方法。本系统的流程为学生首先进行登录,登录后可以浏览试卷信息,选择试卷可以在线考试,考试完成可以查看成绩。管理员负责添加年级班级信息和试题信息、管理学生信息,生成试卷、查询成绩等。教师也可以管理试卷、试卷、分数等信息。系统中的所有数据都需要管理员审核。本系统的业务流程图如下图3.4所示:

图3.4系统业务流程图

4 系统设计

4.1系统功能结构设计

本系统的功能界面设计为三个,学生中心界面和管理员中心界面、教师中心界面。根据不同用户的不同需求分开设计功能。学生中心界面的功能为个人资料、考试功能、分数功能等,管理员中心界面的功能为系统用户、年级班级、考试、分数信息等。教师中心界面的功能为考试功能,分数功能、试题功能等。本系统的功能结构图如下图4.1所示:

图4.1系统功能结构图

4.2系统数据库设计

数据库就是数据的存储仓库,按照计算机的格式进行数据存入。为了使数据库具有独立性,防止因为系统崩溃而数据有损的问题在数据库建立时都采用单独的数据库。数据库具有共享性和单独性,在系统运行时会自动和相对应的数据进行通讯连接。本题库管理系统采用Mysql数据库设计,身份验证为Root,密码为123456。

4.2.1 ER图设计

根据分析所得本系统中主要的数据为管理员、学生、班级信息、分数信息、试卷信息等。所以本节针对这些数据画出数据ER图。

(1)管理员实体的属性为用户名和密码。管理员实体ER图如下图4.2所示:

图4.2管理员实体ER图

(2)学生实体的属性为编号、姓名、班级、专业等。学生实体ER图如下图4.3所示:

图4.3学生实体ER图

(3)试卷信息实体的属性包括标题、编号、题目、分数等。试卷信息实体ER图如下图4.4所示:

图4.4试卷信息实体ER图

(4)班级实体的属性包括编号、名称、发布时间。班级实体的ER图如下图4.5所示:

图4.5班级实体ER图

(5)类别信息实体的属性包括编号和名称。类别信息实体ER图如下图4.6所示:

 

图4.6分类信息实体的ER图

(6)年级信息包括标题、内容、添加时间等。年级信息ER图如下图4.7所示:

图4.7年级信息ER图

(7)分数信息包括试卷编号、试卷名称等。分类ER图如下图4.8所示:

图4.8分数信息ER图

(8)本系统的关系ER图如下图4.9所示:

图4.9系统关系ER图

4.2.2数据库表设计

本系统针对学校的考试而设计,所以本系统的数据库表围绕试卷而建立。本系统的数据库表包括年级班级信息表、试卷信息表、管理员信息表等。本系统的数据库表结构如下图4.1-4.10所示:

表4.1 config

表4.2 exampaper

表4.3 examquestion

表4.4 examrecord

表4.5 fenshuxinxi

表4.6 jiaoshi

表4.7 nianjibanji

表4.8 token

表4.9 users

表4.10 xuesheng

5 系统实现

5.1管理员功能界面的实现

管理员是系统里的最高权限,负责系统里的所有信息的管理、审核。包括学生信息、试卷信息、分数信息等。

5.1.1用户登录界面的实现

本功能设计的目的是帮助系统检验身份,保证系统的安全。在用户登录功能界面里的元素包括按钮、列表框、文字、图片等。用户输入框、密码输入框、权限列表框都居中展示。用户登录界面的实现界面如下图5.1所示:

图5.1用户登录界面的实现效果

5.1.2个人中心管理功能的实现界面

在个人中心管理功能里,管理员可以设置新的管理员,可以查询已有的管理员和修改当前登录的登录密码。设置多个管理员可以让更多的工作人员参与进来。添加管理员功能的实现界面如下图5.2所示:

图5.2添加管理员功能的实现界面

修改密码的实现界面如下图5.3所示:

图5.3修改密码的实现界面

5.1.3教师信息管理功能的实现界面

管理员登录后在教师信息管理功能里可以发布新的教师和删除不使用的教师账号以及修改错误的教师账号,管理员查询教师信息的实现界面如下图5.4所示:

图5.4管理员查询教师信息的功能实现界面

5.1.4学生信息管理功能的实现界面

管理员在本功能里可以查询学生资料,可以审核学生的注册信息,帮助学生使用本系统,当学生不使用后管理员可以及时的删除学生信息防止系统内容的外泄。管理员查询学生信息功能的实现界面如下图5.5所示:

图5.5管理员查询学生信息功能的实现界面

5.1.5试题管理功能的实现界面

试题管理功能里可以管理选择题、填写题、判断题等。管理员添加试题信息功能的实现界面如下图5.6所示:

图5.6管理员添加试题信息功能的实现界面

5.1.6试卷管理功能的实现界面

管理员可以添加试卷和管理试卷。管理员查询试卷信息功能的实现界面如下图5.7所示:

图5.7管理员查询试卷信息功能的实现界面

5.1.7分数管理功能的实现界面

管理员也可以对学生的成绩进行查看和删除,以此来审核用户的成绩。管理员查询学生分数功能的实现界面如下图5.8所示:

图5.8管理员查询学生分数功能的实现界面

5.1.8年级班级管理功能的实现界面

管理员可以设置和编辑年级班级信息。实现界面如下图5.9所示:

图5.9添加年级班级功能的实现界面

5.1.9考试管理功能的实现界面

管理员可以查询考试记录,实现界面如下图5.10所示:

图5.10查询考试记录的实现界面

5.2学生功能的界面详细实现

5.2.1个人资料管理功能的实现界面

用户可以修改自己的个人资料使其保证正确性。用户修改个人资料管理功能的实现界面如下图5.11所示:

图5.11用户修改个人资料管理功能的实现界面

5.2.2在线考试功能的实现界面

在本功能里,学生可以填写答案完成考试。在线考试功能的实现界面如下图5.12所示:

图5.12在线考试功能的实现界面

5.2.3分数管理功能的实现界面

学生可以查询考试的成绩。分数管理功能的实现界面如下图5.13所示:

图5.13学生查看分数的功能实现界面

5.2.4错题查看功能的实现界面

学生可以查看自己的错题信息,实现界面如下图5.14所示:

图5.14查看错题信息的实现界面

5.2.5试卷查看功能的实现界面

学生可以查看所有的试卷并选择试卷进行在线考试,实现界面如下图5.15所示:

图5.15试卷查看功能的实现界面

5.2.6考试记录查看功能的实现界面

考试完成后可以查看所有的考试记录,实现界面如下图5.16所示:

图5.16查看考试记录的功能实现界面

5.3教师功能的实现界面

教师的功能为修改个人资料和管理试卷、试题、分数、考试、学生信息。教师功能的实现界面如下图5.17所示:

图5.17教师功能的实现界面

6 系统测试

系统测试

MD5Util.java
package com.utils;

import cn.hutool.crypto.digest.DigestUtil;

public class MD5Util {
    
	/**
	 * @param text明文
	 * @param key密钥
	 * @return 密文
	 */
	// 带秘钥加密
	public static String md5(String text) {
		// 加密后的字符串
		String md5str = DigestUtil.md5Hex(text);
		return md5str;
	}

}

CommonController.java
package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
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.RestController;

import com.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
/**
 * 通用接口
 */
@RestController
public class CommonController{
	@Autowired
	private CommonService commonService;

    private static AipFace client = null;
    
    @Autowired
    private ConfigService configService;    
	/**
	 * 获取table表中的column列表(联动接口)
	 * @param table
	 * @param column
	 * @return
	 */
	@RequestMapping("/option/{tableName}/{columnName}")
	@IgnoreAuth
	public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		if(StringUtils.isNotBlank(level)) {
			params.put("level", level);
		}
		if(StringUtils.isNotBlank(parent)) {
			params.put("parent", parent);
		}
		List<String> data = commonService.getOption(params);
		return R.ok().put("data", data);
	}
	
	/**
	 * 根据table中的column获取单条记录
	 * @param table
	 * @param column
	 * @return
	 */
	@RequestMapping("/follow/{tableName}/{columnName}")
	@IgnoreAuth
	public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		params.put("columnValue", columnValue);
		Map<String, Object> result = commonService.getFollowByOption(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 修改table表的sfsh状态
	 * @param table
	 * @param map
	 * @return
	 */
	@RequestMapping("/sh/{tableName}")
	public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
		map.put("table", tableName);
		commonService.sh(map);
		return R.ok();
	}
	
	/**
	 * 获取需要提醒的记录数
	 * @param tableName
	 * @param columnName
	 * @param type 1:数字 2:日期
	 * @param map
	 * @return
	 */
	@RequestMapping("/remind/{tableName}/{columnName}/{type}")
	@IgnoreAuth
	public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("table", tableName);
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		int count = commonService.remindCount(map);
		return R.ok().put("count", count);
	}
	
	/**
	 * 单列求和
	 */
	@RequestMapping("/cal/{tableName}/{columnName}")
	@IgnoreAuth
	public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		Map<String, Object> result = commonService.selectCal(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 分组统计
	 */
	@RequestMapping("/group/{tableName}/{columnName}")
	@IgnoreAuth
	public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		List<Map<String, Object>> result = commonService.selectGroup(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
	
	/**
	 * (按值统计)
	 */
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
	@IgnoreAuth
	public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		List<Map<String, Object>> result = commonService.selectValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}

	/**
 	 * (按值统计)时间统计类型
 	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")
	public R valueDay(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		params.put("timeStatType", timeStatType);
		List<Map<String, Object>> result = commonService.selectTimeStatValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
	
    /**
     * 人脸比对
     * 
     * @param face1 人脸1
     * @param face2 人脸2
     * @return
     */
    @RequestMapping("/matchFace")
    @IgnoreAuth
    public R matchFace(String face1, String face2,HttpServletRequest request) {
        if(client==null) {
            /*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
            String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
            String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
            String token = BaiduUtil.getAuth(APIKey, SecretKey);
            if(token==null) {
                return R.error("请在配置管理中正确配置APIKey和SecretKey");
            }
            client = new AipFace(null, APIKey, SecretKey);
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
        }
        JSONObject res = null;
        try {
            File file1 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face1);
            File file2 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face2);
            String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
            String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
            MatchRequest req1 = new MatchRequest(img1, "BASE64");
            MatchRequest req2 = new MatchRequest(img2, "BASE64");
            ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
            requests.add(req1);
            requests.add(req2);
            res = client.match(requests);
            System.out.println(res.get("result"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return R.error("文件不存在");
        } catch (IOException e) {
            e.printStackTrace();
        } 
        return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
    }
}

MPUtil.java
package com.utils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.bean.BeanUtil;

import com.baomidou.mybatisplus.mapper.Wrapper;

/**
 * Mybatis-Plus工具类
 */
public class MPUtil {
	public static final char UNDERLINE = '_';

	
	//mybatis plus allEQ 表达式转换
		public static Map allEQMapPre(Object bean,String pre) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		  return camelToUnderlineMap(map,pre);
	   }

		//mybatis plus allEQ 表达式转换
		public static Map allEQMap(Object bean) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		   return camelToUnderlineMap(map,"");
	   }

		public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) {
			   Map<String, Object> map =BeanUtil.beanToMap(bean);
			   Map result = camelToUnderlineMap(map,pre);
			 
			return genLike(wrapper,result);
		}
	
		public static Wrapper allLike(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLike(wrapper,result);
		}
	
	
		public static Wrapper genLike( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				String value = (String) entry.getValue();
				wrapper.like(key, value);
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper likeOrEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLikeOrEq(wrapper,result);
		}
		
		public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				if(entry.getValue().toString().contains("%")) {
					wrapper.like(key, entry.getValue().toString().replace("%", ""));
				} else {
					wrapper.eq(key, entry.getValue());
				}
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper allEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genEq(wrapper,result);
		}
	
	
		public static Wrapper genEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				wrapper.eq(key, entry.getValue());
				i++;
			}
			return wrapper;
		}
	
	
		public static Wrapper between(Wrapper wrapper,Map<String, Object> params) {
			for(String key : params.keySet()) {
				String columnName = "";
				if(key.endsWith("_start")) {
					columnName = key.substring(0, key.indexOf("_start"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.ge(columnName, params.get(key));
					}
				}
				if(key.endsWith("_end")) {
					columnName = key.substring(0, key.indexOf("_end"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.le(columnName, params.get(key));
					}
				}
			}
			return wrapper;
		}
	
		public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) {
			String order = "";
			if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) {
				order = params.get("order").toString();
			}
			if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) {
				if(order.equalsIgnoreCase("desc")) {
					wrapper.orderDesc(Arrays.asList(params.get("sort")));
				} else {
					wrapper.orderAsc(Arrays.asList(params.get("sort")));
				}
			}
			return wrapper;
		}
	
	
	/**
	 * 驼峰格式字符串转换为下划线格式字符串
	 * 
	 * @param param
	 * @return
	 */
	public static String camelToUnderline(String param) {
		if (param == null || "".equals(param.trim())) {
			return "";
		}
		int len = param.length();
		StringBuilder sb = new StringBuilder(len);
		for (int i = 0; i < len; i++) {
			char c = param.charAt(i);
			if (Character.isUpperCase(c)) {
				sb.append(UNDERLINE);
				sb.append(Character.toLowerCase(c));
			} else {
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static void main(String[] ages) {
		System.out.println(camelToUnderline("ABCddfANM"));
	}
	
	public static Map camelToUnderlineMap(Map param, String pre) {

		Map<String, Object> newMap = new HashMap<String, Object>();
		Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			String key = entry.getKey();
			String newKey = camelToUnderline(key);
			if (pre.endsWith(".")) {
				newMap.put(pre + newKey, entry.getValue());
			} else if (StringUtils.isEmpty(pre)) {
				newMap.put(newKey, entry.getValue());
			} else {

				newMap.put(pre + "." + newKey, entry.getValue());
			}
		}
		return newMap;
	}
}

dmuploader.min.js
/*
 * dmuploader.min.js - Jquery File Uploader - 0.1
 * http://www.daniel.com.uy/projects/jquery-file-uploader/
 * 
 * Copyright (c) 2013 Daniel Morales
 * Dual licensed under the MIT and GPL licenses.
 * http://www.daniel.com.uy/doc/license/
 */
(function(c){var b="dmUploader";var d={url:document.URL,method:"POST",extraData:{},maxFileSize:0,allowedTypes:"*",extFilter:null,dataType:null,fileName:"file",onInit:function(){},onFallbackMode:function(){message},onNewFile:function(g,f){},onBeforeUpload:function(f){},onComplete:function(){},onUploadProgress:function(g,f){},onUploadSuccess:function(g,f){},onUploadError:function(g,f){},onFileTypeError:function(f){},onFileSizeError:function(f){},onFileExtError:function(f){}};var a=function(g,f){this.element=c(g);this.settings=c.extend({},d,f);if(!this.checkBrowser()){return false}this.init();return true};a.prototype.checkBrowser=function(){if(window.FormData===undefined){this.settings.onFallbackMode.call(this.element,"Browser doesn't support From API");return false}if(this.element.find("input[type=file]").length>0){return true}if(!this.checkEvent("drop",this.element)||!this.checkEvent("dragstart",this.element)){this.settings.onFallbackMode.call(this.element,"Browser doesn't support Ajax Drag and Drop");return false}return true};a.prototype.checkEvent=function(f,h){var h=h||document.createElement("div");var f="on"+f;var g=f in h;if(!g){if(!h.setAttribute){h=document.createElement("div")}if(h.setAttribute&&h.removeAttribute){h.setAttribute(f,"");g=typeof h[f]=="function";if(typeof h[f]!="undefined"){h[f]=undefined}h.removeAttribute(f)}}h=null;return g};a.prototype.init=function(){var f=this;f.queue=new Array();f.queuePos=-1;f.queueRunning=false;f.element.on("drop",function(g){g.preventDefault();var h=g.originalEvent.dataTransfer.files;f.queueFiles(h)});f.element.find("input[type=file]").on("change",function(g){var h=g.target.files;f.queueFiles(h);c(this).val("")});this.settings.onInit.call(this.element)};a.prototype.queueFiles=function(m){var g=this.queue.length;for(var k=0;k<m.length;k++){var h=m[k];if((this.settings.maxFileSize>0)&&(h.size>this.settings.maxFileSize)){this.settings.onFileSizeError.call(this.element,h);continue}if((this.settings.allowedTypes!="*")&&!h.type.match(this.settings.allowedTypes)){this.settings.onFileTypeError.call(this.element,h);continue}if(this.settings.extFilter!=null){var n=this.settings.extFilter.toLowerCase().split(";");var l=h.name.toLowerCase().split(".").pop();if(c.inArray(l,n)<0){this.settings.onFileExtError.call(this.element,h);continue}}this.queue.push(h);var f=this.queue.length-1;this.settings.onNewFile.call(this.element,f,h)}if(this.queueRunning){return false}if(this.queue.length==g){return false}this.processQueue();return true};a.prototype.processQueue=function(){var h=this;h.queuePos++;if(h.queuePos>=h.queue.length){h.settings.onComplete.call(h.element);h.queuePos=(h.queue.length-1);h.queueRunning=false;return}var g=h.queue[h.queuePos];var f=new FormData();f.append(h.settings.fileName,g);c.each(h.settings.extraData,function(i,j){f.append(i,j)});h.settings.onBeforeUpload.call(h.element,h.queuePos);h.queueRunning=true;c.ajax({url:h.settings.url,type:h.settings.method,dataType:h.settings.dataType,data:f,cache:false,contentType:false,processData:false,forceSync:false,xhr:function(){var i=c.ajaxSettings.xhr();if(i.upload){i.upload.addEventListener("progress",function(m){var l=0;var j=m.loaded||m.position;var k=m.total||e.totalSize;if(m.lengthComputable){l=Math.ceil(j/k*100)}h.settings.onUploadProgress.call(h.element,h.queuePos,l)},false)}return i},success:function(j,i,k){h.settings.onUploadSuccess.call(h.element,h.queuePos,j)},error:function(k,i,j){h.settings.onUploadError.call(h.element,h.queuePos,j)},complete:function(i,j){h.processQueue()}})};c.fn.dmUploader=function(f){return this.each(function(){if(!c.data(this,b)){c.data(this,b,new a(this,f))}})};c(document).on("dragenter",function(f){f.stopPropagation();f.preventDefault()});c(document).on("dragover",function(f){f.stopPropagation();f.preventDefault()});c(document).on("drop",function(f){f.stopPropagation();f.preventDefault()})})(jQuery);

声明

本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值