基于javaweb的农产品溯源管理系统(java+ssm+jsp+layui+jquery+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的农产品溯源管理系统(java+SSM+JSP+LayUI+jQuery+mysql)
项目介绍
本项目分为前后台,分为普通用户、管理员、企业用户三种角色; 普通用户无需登录,可在前台直接进行溯源查询,管理员、企业用户可登录后台进行管理; 超级管理员角色包含以下功能: 登录,管理企业,设置管理员,增加管理员,删除管理员等功能。 用户角色包含以下功能: 用户首页,用户进行溯源查询,溯源结果等功能。 企业角色包含以下功能: 注册,登录,企业登录后主页,增删改查农产品列表,新增农产品,二维码列表查看,溯源列表,查看近期溯源人数,修改企业信息,查看溯源二维码等功能。
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本; 6.是否Maven项目:是;
技术栈
后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+CSS+JavaScript+LayUI+jQuery
使用说明
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中database.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入http://localhost:8080/ncpsy 登录 注:Tomcat中配置路径必须为/ncpsy 否则会有异常 管理员账号/密码:admin/admin 企业账号/密码:user/123456
订单链条管理控制层:
@RestController
@RequestMapping(“orderTbl”)
public class OrderTblController {
/**
服务对象
*/
@Resource
private OrderTblService orderTblService;
@Resource
private AnimalService animalService;
@Resource
private ProductService productService;
@Resource
private EntController entController;
@Resource
private EntService entService;
/**
通过主键查询单条数据
@param oid 主键
@return 单条数据
*/
@GetMapping(“selectOne”)
public OrderTbl selectOne(Integer oid) {
return this.orderTblService.queryById(oid);
/**
生成订单链条
@param gid 主键
@param type 货物类型
@return 订单链条
*/
@GetMapping(“ChainForm”)
public Result Chain_Form(Integer gid,Integer type){
Result result=new Result();
result.setDetail(null);
result.setSuccess(false);
Integer id;
if(type==0)//整猪
id=animalService.queryById(gid).getLastOid();
if(orderTblService.queryById(id)==null){
result.setMsg(“牲畜信息记录有误”);
return result;
else if(type==1)//切割后
id=productService.queryById(gid).getLastOid();
if(orderTblService.queryById(id)==null){
result.setMsg(“产品信息记录有误”);
return result;
else{
result.setMsg(“输入类型错误”);
return result;
OrderTbl tempOT=this.orderTblService.queryById(id);
List List_OT=new ArrayList();
List_OT.add(tempOT);
while(tempOT.getLastOid()!=null)
tempOT=this.orderTblService.queryById(tempOT.getLastOid());
List_OT.add(0,tempOT);
Iterator iterator= List_OT.listIterator();
while(iterator.hasNext())
System.out.println(iterator.next().getOid());
List chain=new ArrayList();
Iterator it=List_OT.listIterator();
while (it.hasNext())
ChainModel chainModel=new ChainModel();
OrderTbl orderTbl=(OrderTbl)it.next();
chainModel.setEid(orderTbl.getOutEid());
EntModel entModel1=entService.queryModelById(chainModel.getEid());
chainModel.setEname(entModel1.getEname());
chainModel.setEtype(entModel1.getEtype());
chainModel.setEid(orderTbl.getOutEid());
chainModel.setTime(orderTbl.getConfirmTime());
chain.add(chainModel);
if(!it.hasNext())
ChainModel temp=new ChainModel(chainModel);
temp.setEid(orderTbl.getInEid());
EntModel entModel2=entService.queryModelById(temp.getEid());
temp.setEtype(entModel2.getEtype());
temp.setEname(entModel2.getEname());
if(type==0)//整只
AnimalModel animalModel=animalService.queryModelById(orderTbl.getGid());
result.setInfo(animalModel);
else if(type==1)//切割
ProductModel productModel=productService.queryModelById(orderTbl.getGid());
result.setInfo(productModel);
chain.add(temp);
result.setDetail(chain);
result.setMsg(“链条合成成功”);
result.setSuccess(true);
return result;
@GetMapping(“insertOne”)
public OrderTbl insert(Integer oeid,Integer ieid,Integer lastoid,Integer gid,short gtype,String ctime,String plate,String info) {
OrderTbl orderTbl=new OrderTbl();
SimpleDateFormat format=new SimpleDateFormat(“yyyy-MM-dd”);
try {
// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如/02/29会被接受,并转换成/03/01
format.setLenient(false);
format.parse(ctime);
} catch (ParseException e) {
System.out.println(“时间输入格式错误”);
e.printStackTrace();
// e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
if(!lastoid.equals(0))
orderTbl.setLastOid(lastoid);
if (info!=null)
orderTbl.setInfo(info);
orderTbl.setGtype(gtype);
orderTbl.setInEid(ieid);
orderTbl.setGid(gid);
orderTbl.setOutEid(oeid);
orderTbl.setPlate(plate);
orderTbl.setConfirmTime(ctime);
return orderTblService.insert(orderTbl);
/**
通过主键删除数据
@param oid 主键
@return 是否成功
*/
@GetMapping(“deleteOne”)
public boolean deleteById(Integer oid) {
return this.orderTblService.deleteById(oid);
/**
修改数据
*/
//http://127.0.0.1:11451/orderTbl/updateOne?oid=1
@GetMapping(“updateOne”)
public OrderTbl update(Integer oid, Integer outEid, Integer inEid,Integer lastOid,Integer gid,Short gtype, String confirmTime,String plate,String info) {
OrderTbl orderTbl=new OrderTbl();
orderTbl.setOid(oid);
orderTbl.setOutEid(outEid);
orderTbl.setInEid(inEid);
orderTbl.setLastOid(lastOid);
orderTbl.setGid(gid);
orderTbl.setGtype(gtype);
orderTbl.setConfirmTime(confirmTime);
orderTbl.setPlate(plate);
orderTbl.setInfo(info);
return this.orderTblService.update(orderTbl);
管理员管理控制层:
/**
(AdminAcct)表控制层
*管理员账号
*/
@CrossOrigin
@RestController
@RequestMapping(“admin”)
public class AdminAcctController {
/**
服务对象
*/
@Resource
private AdminAcctService adminAcctService;
@Resource
private LicService licService;
@Resource
private EntService entService;
@Resource
private TypeTblService typeTblService;
/**
通过主键查询单条数据
@param id 主键
@return 单条数据
*/
public AdminAcct selectOne(Integer id) {
return this.adminAcctService.queryById(id);
/**
查询指定行数据
@param offset 查询起始位置
@param limit 查询条数
@return 对象列表
*/
public List queryAllByLimit(@Param(“offset”) int offset, @Param(“limit”) int limit) {
return this.adminAcctService.queryAllByLimit(offset, limit);
/**
通过主键删除数据
@param id 主键
@return 是否成功
*/
public boolean deleteById(Integer id) {
return this.adminAcctService.deleteById(id);
/**
修改数据
*/
public AdminAcct update(Integer id,String username,String pwd) {
AdminAcct adminAcct=new AdminAcct();
adminAcct.setId(id);
adminAcct.setUsername(username);
adminAcct.setPwd(pwd);
return this.adminAcctService.update(adminAcct);
//登录注册
/**
登录
@param username 用户名
@param password 密码
@return Result对象
*/
@GetMapping( “login”)
public Result login(String username, String password) {
BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
Result result=new Result();
result.setSuccess(false);
result.setDetail(null);
if (usernamenull||username"")
result.setMsg(“用户名不可为空”);
System.out.println(“用户名不可为空”);
return result;
if(password==“”||password==null)
result.setMsg(“密码不可为空”);
System.out.println(“密码不可为空”);
return result;
AdminAcct temp=new AdminAcct();
temp=this.adminAcctService.queryByUserName(username);
if(temp==null) {
System.out.println(“用户名不存在”);
result.setMsg(“用户名不存在”);
return result;
System.out.println(bCryptPasswordEncoder.encode(password));
boolean flag=password.equals(temp.getPwd());
// boolean flag=bCryptPasswordEncoder.matches(password,temp.getPwd());
if(flag)
temp.setPwd(“”);
System.out.println(“登录成功”);
result.setMsg(“登录成功”);
result.setSuccess(true);
if(temp.getToken()==null)
String uuid = UUID.randomUUID().toString().replaceAll(“-”,“”);
temp.setToken(uuid);
this.adminAcctService.update(temp);
result.setDetail(temp);
return result;
else
result.setMsg(“密码错误”);
System.out.println(“密码错误”);
return result;
/**
注册
@param username 用户名
@param password 密码
@return Result对象
*/
@PostMapping(“register”)
public Result register(String username,String password) {
BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
Result result=new Result();
AdminAcct temp=new AdminAcct();
result.setSuccess(false);
result.setDetail(null);
temp=this.adminAcctService.queryByUserName(username);
if (usernamenull||username"")
result.setMsg(“用户名不可为空”);
System.out.println(“用户名不可为空”);
return result;
if (temp!=null)
result.setMsg(“用户名重复”);
System.out.println(“用户名重复”);
return result;
temp=new AdminAcct();
temp.setUsername(username);
password=bCryptPasswordEncoder.encode(password);
temp.setPwd(password);
String uuid = UUID.randomUUID().toString().replaceAll(“-”,“”);
temp.setToken(uuid);
this.adminAcctService.insert(temp);
temp.setPwd(“”);
result.setDetail(temp);
result.setMsg(“注册成功”);
result.setSuccess(true);
System.out.println(“注册成功”);
return result;
//备案审核相关
/**
输出待审核列表
@param id 主键
@return
*/
public Result licOfAudit_list(Integer id){
Result result=new Result();
result.setSuccess(false);
if(adminAcctService.queryById(id)==null){
result.setMsg(“企业id错误”);
return result;
result.setDetail(licService.getModelByState(0));
result.setSuccess(true);
result.setMsg(“待审核证书获取成功”);
return result;
/**
@param lid
@param state
@return
*/
/**
审核证书
@param lid 证书id
@param state 证书状态
@return
*/
@PostMapping(“setLicState”)
public Result SetLicState(Integer lid,Integer state){
Result result=new Result();
result.setSuccess(false);
if(lid==null){
result.setMsg(“lid不可为空”);
return result;
Lic lic=licService.queryById(lid);
if(lic==null){
result.setMsg(“证书id错误”);
return result;
result.setSuccess(true);
result.setMsg(“证书通过成功”);
lic.setLicState(state);
result.setDetail(licService.update(lic));
return result;
/**
证书筛选
@param ename 企业名
@param lictype 证书类型
@param sernum 编号
@return
*/
@Transactional(readOnly = true)
@GetMapping(“licList”)
public Result Lic_Screen(String ename, Integer lictype, String sernum,Integer licstate){
Result result=new Result();
result.setSuccess(false);
List list=new ArrayList();
if(ename!=null){
list=entService.queryByEName(ename);
if(list.isEmpty()){
result.setMsg(“无该企业名的类似企业”);
System.out.println(“企业名错误”);
return result;
if (lictype!=null&&typeTblService.queryById(lictype)==null){
result.setMsg(“企业类型错误”);
System.out.println(“企业类型错误”);
return result;
List list_lic=new ArrayList();
if(!list.isEmpty()){
Iterator iterator=list.listIterator();
while (iterator.hasNext()) {
Lic lic = new Lic();
lic.setEid(((Ent)iterator.next()).getEid());
lic.setLicType(lictype);
lic.setSerNum(sernum);
lic.setLicState(licstate);
List temp=licService.queryAllModel(lic);
list_lic.addAll(temp);
else {
Lic lic = new Lic();
lic.setLicType(lictype);
lic.setSerNum(sernum);
lic.setLicState(licstate);
list_lic=licService.queryAllModel(lic);
if(list_lic.isEmpty()){
result.setMsg(“无此类证书”);
return result;
result.setMsg(“筛选成功”);
result.setSuccess(true);
result.setDetail(list_lic);
return result;
/**
删除证书
@param lid 证书编号
@return Result
*/
@PostMapping(“licdelete”)
public Result Lic_Delete(Integer lid){
Result result=new Result();
result.setSuccess(false);
if(licService.deleteById(lid)) {
result.setSuccess(true);
result.setMsg(“删除成功”);
return result;
else {
result.setMsg(“删除失败,证书不存在”);
return result;
/**@PostMapping(“”)
public Result lic_Pass(Integer lid){
Result result=new Result();
result.setSuccess(false);
Lic lic=licService.queryById(lid);
if(lic==null){
result.setMsg(“证书id错误”);
return result;
result.setSuccess(true);
result.setMsg(“证书通过成功”);
lic.setLicState((short)1);
result.setDetail(licService.update(lic));
return result;
@PostMapping(“LicNoPass”)
public Result lic_NoPass(Integer lid){
Result result=new Result();
result.setSuccess(false);
Lic lic=licService.queryById(lid);
if(lic==null){
result.setMsg(“证书id错误”);
return result;
result.setSuccess(true);
result.setMsg(“证书不通过成功”);
lic.setLicState((short)2);
result.setDetail(licService.update(lic));
return result;
*/
//企业信息相关
/**
企业信息筛选
@param username 用户名
@param ename 企业名
@param etype 企业类型
@param tel 电话
@param email 邮箱
@return
*/
@GetMapping(“userList”)
public Result Account_Screen(String username,String ename,Integer etype,String tel,String email){
Result result=new Result();
result.setSuccess(false);
String regEx = “^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$”;
Pattern pattern = pile(regEx);
Matcher matcher ;
/**if(email!=null) {
//邮箱格式验证
matcher=pattern.matcher(email);
if (!matcher.matches()) {
result.setMsg(“邮箱格式错误”);
System.out.println(“邮箱格式错误”);
return result;
}*/
//用户名格式验证
/**regEx=“-1{4,16}$”;
pattern=pile(regEx);
if(username!=null){
matcher=pattern.matcher(username);
if(!matcher.matches()){
result.setMsg(“用户名格式错误”);
System.out.println(“用户名格式错误”);
return result;
}*/
if (etype!=null&&typeTblService.queryById(etype)==null){
result.setMsg(“企业类型错误”);
System.out.println(“企业类型错误”);
return result;
Ent ent=new Ent();
ent.setTel(tel);
ent.setUsername(username);
ent.setEname(ename);
ent.setEmail(email);
ent.setEtype(etype);
List list=entService.queryAll(ent);
if (list.isEmpty()){
result.setMsg(“无此类信息”);
return result;
result.setDetail(entService.queryAll(ent));
result.setSuccess(true);
result.setMsg(“筛选成功”);
return result;
/**
修改企业信息
@param eid 企业id
@param etype 企业类型
@param tele 电话
@param ename 企业名字
@param email 邮箱
@return
*/
@PostMapping(“editEntDetail”)
public Result EditEnt(Integer eid,Integer etype,String tele,String ename,String email){
//邮箱格式验证
Result result=new Result();
result.setSuccess(false);
String regEx=“^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$”;
Pattern pattern=pile(regEx);
Matcher matcher;
if(email!=null) {
matcher=pattern.matcher(email);
if (!matcher.matches()) {
result.setMsg(“邮箱格式错误”);
System.out.println(“邮箱格式错误”);
return result;
Ent ent=new Ent();
ent.setEid(eid);
ent.setEtype(etype);
ent.setTel(tele);
ent.setEname(ename);
result.setSuccess(true);
result.setMsg(“修改成功”);
ent=entService.update(ent);
ent.setPwd(“”);
result.setDetail(ent);
return result;
/**
*重置企业账号token
@param eid 企业id
@return
*/
@PostMapping(“resetEntToken”)
public Result ResetEntToken(Integer eid){
Result result=new Result();
result.setSuccess(false);
if(eid==null){
result.setMsg(“eid不可为空”);
return result;
if(entService.queryById(eid)==null){
result.setMsg(“eid错误”);
return result;
Ent ent=entService.queryById(eid);
String token=UUID.randomUUID().toString().replaceAll(“-”,“”);
ent.setToken(token);
ent=entService.update(ent);
result.setMsg(“重置token成功”);
result.setSuccess(true);
result.setDetail(ent);
return result;
许可证管理控制层:
@RestController
@RequestMapping(“lic”)
public class LicController {
/**
服务对象
*/
@Resource
private LicService licService;
/**
通过主键查询单条数据
@param lid 主键
@return 单条数据
*/
@GetMapping(“selectOne”)
public Lic selectOne(Integer lid) {
return this.licService.queryById(lid);
/**
新增数据
*/
//http://127.0.0.1:11451/lic/insertOne?eid=101&serNum=1&licType=1&licState=1 error
//http://127.0.0.1:11451/lic/insertOne?eid=1&serNum=1&licType=1&licState=1
@GetMapping(“insertOne”)
public Lic insert(Integer eid, String serNum, Integer licType, Integer licState) {
Lic lic=new Lic();
lic.setEid(eid);
lic.setSerNum(serNum);
lic.setLicType(licType);
lic.setLicState(licState);
return this.licService.insert(lic);
/**
更新数据
@param lid 主键
@param eid 企业id
@param serNum
@param licType
@param licState
@return 单条数据
*/
//http://127.0.0.1:11451/lic/updateOne?lid=2&eid=3
@GetMapping(“updateOne”)
public Lic update(Integer lid, Integer eid, String serNum,Integer licType,Integer licState) {
Lic lic=new Lic();
lic.setLid(lid);
lic.setEid(eid);
lic.setSerNum(serNum);
lic.setLicType(licType);
lic.setLicState(licState);
return licService.update(lic);
/**
删除数据
@param lid 主键
@return 是否删除了数据的布尔值
*/
//http://127.0.0.1:11451/lic/deleteOne?lid=2
@GetMapping(“deleteOne”)
public boolean deleteById(Integer lid) {
return licService.deleteById(lid);
\w\d_ ↩︎