基于JAVA超市自助购物系统的设计与实现

简介: 基于JAVA超市自助购物系统的设计与实现

一、设计需求

基于RFID的自动识别技术,通过无线射频方式实时获得磁卡对超市物品的电子标签进行读取,然后将数据通过网络传输至服务器,在应用层开发一个管理系统,对超市物品信息、店内消费等各种行为进行管理和显示。系统需有登录注册功能,商品的信息管理,付款等功能。


拟解决的主要问题:


(1)使用RFID自动识别技术,对超市商品信息进行读取


(2) 将接受到的数据传输给服务器


(3)在应用层管理系统中对信息进行管理


(4) 管理员对整个后台系统的商品进行管理


二、设计需求总结

整个系统的设计:


(1). (管理员操作)超市每上架一个新产品时,就在软件端进行入库注册、注册时填入商品的名称、编号(可以使用UUID动态生成)、数量、价格、图片、数据都保存在软件端的数据库里。


(2). (管理员操作)开卡-入库:  上架的新产品入库注册之后,需要为这个产品办理一张电子标签卡,这个卡里存放着产品的编号;这个卡就放在产品货架上(与产品对应),如果后面这个产品的信息如果查询,就读取电子标签里的编号,到数据库里查询。


(3). (管理员操作)开卡和查询的数据传输:  设备端与软件端采用 TCP网络方式进行通信;设备端当做TCP客户端,软件端当做TCP服务器;当设备端查询产品的电子标签时,设备端读取编号之后,会通过约定的数据格式通过网络传递给软件端。 当软件端开卡注册时,也会用约定好的数据格式传递给设备端,如果设备端收到数据,开发板上的LED会点亮;这时把IC拿到RC522射频模块上刷一下即可;如果成功写入LED灯就会关闭。


(4). 软件端的设计:


有注册界面、登录界面;


主界面上显示店内有所有登记入库的商品信息,每个产品有图片进行显示、图片下面就显示产品的数量与价格;


管理员界面: 可以进行商品添加、设计价格、修改信息等。


查询页面: 输入产品的信息,可以查询产品的所有详细信息。


顾客可以选择购买的商品进行,然后点击支付。


软件端与硬件端的数据格式:  


(1). 开卡注册数据格式-字符串(软件--->设备):  register:86382684638434


(2). 设备查询上传的数据格式-字符串(设备--->软件): query: 86382684638434


商品的编号限制在16个字节内。


  这里的设备硬件部分采用STM32最小系统板当做刷卡器,完成对IC卡读写,如果不需要STM32也可以替换成其他扫码枪之类的都可以的:


RC522刷卡模块负责对卡进行读写。

ESP8266WIFI初始化工作在STA模式,连接到指定WIFI,与软件所在的电脑处于同一个局域网,方便连接软件端的服务器进行数据通信,每次设备开机将会自动连接到程序里设置好WIFI热点和服务器。

设备端上有一个LED灯,用来显示刷卡的状态—成功与否。

完整资料下载地址: https://download.csdn.net/download/xiaolong1126626497/20687551

image.png

image.png

image.png

三、相关硬件

3.1 STM32F103最小系统板

image.png

STM32F系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。


该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。


芯片集成定时器Timer,CAN,ADC,SPI,I2C,USB,UART等多种外设功能。


3.2 ESP8266串口WIFI

image.png

ESP8266 系列模组集成 Wi-Fi 芯片 ESP8266,设计紧凑、集成度高、RF 性能突出。通过 SRRC, FCC, CE 等多国无线电认证,适用于各类物联网应用场景。


性能卓越


ESP8266EX 芯片内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最⾼可达 160 MHz,⽀持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将⾼达 80% 的处理能⼒应用于编程和开发。


高度集成


ESP8266 芯片高度集成天线开关、射频巴伦、功率放大器、低噪声接收放大器、滤波器等射频模块。模组尺寸小巧,尤其适用于空间受限的产品设计。


认证齐全


RF 认证:SRRC、FCC、CE-RED、KCC、TELEC/MIC、IC 和 NCC 认证;


环保认证:RoHS、REACH;


可靠性认证:HTOL、HTSL、μHAST、TCT、ESD。


丰富的产品应用


ESP8266 模组既可以通过 ESP-AT 指令固件,为外部主机 MCU 提供 Wi-Fi 连接功能;也可以作为独立 Wi-Fi MCU 运行,用户通过基于 RTOS 的 SDK 开发带 Wi-Fi 连接功能的产品。用户可以轻松实现开箱即用的云连接、低功耗运行模式,以及包括 WPA3 在内的 Wi-Fi 安全支持等功能。


3.3 RC522无线射频模块

image.png

MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对“三表”应用推出的一款低 电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。


概述


MFRC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对“三表”应用推出的一款低 电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携 式手持设备研发的较好选择。


MF RC522 利用了先进的调制和解调概念,完全集成了在13.56MHz 下所有类型的被动非接触式通信方式和协议。支持 ISO14443A 的多层应用。其内部发送器部分可驱动读写器天线与ISO 14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理ISO14443A 兼容的应答器信号。数字部分处理ISO14443A 帧和错误检测(奇偶 &CRC)。此外,它还支持快速CRYPTO1 加密算法,用于验证MIFARE 系列产品。MFRC522 支持MIFARE?更高速的非接触式通信,双向数据传输速率高达424kbit/s。


作为13.56MHz 高集成度读写卡系列芯片家族的新成员,MF RC522 与MF RC500和 MF RC530 有不少相似之处,同时也具备诸多特点和差异。它与主机间的通信采用连线较少的串行通信,且可根据不同的用户需求,选取SPI、I2C 或串行UART(类似RS232)模式之一,有利于减少连线,缩小PCB 板体积,降低成本。


特性


◆高集成度的调制解调电路;


◆采用少量外部器件,即可将输出驱动级接至天线;


◆支持 ISO/IEC 14443 TypeA 和MIFARE®通信协议;


◆ 读写器模式中与 ISO 14443A/MIFARE®的通信距离高达50mm,取决于天线的长度和调谐。


◆支持 ISO 14443 212kbit/s 和424kbit/s 的更高传输速率的通信。


◆支持 MIFARE® Classic 加密;


◆支持的主机接口:


-10Mbit/s 的SPI 接口


-I2C 接口,快速模式的速率为400kbit/s,高速模式的速率为3400kbit/s


-串行UART,传输速率高达1228.8kbit/s,帧取决于RS232 接口,电压电平取决于提供的管脚电压


◆64 字节的发送和接收FIFO 缓冲区;


◆灵活的中断模式;


◆可编程定时器。


◆具备硬件掉电、软件掉电和发送器掉电 3 种节电模式,前两种模式雷同于MFRC500 和 CL RC400,其特有的“发送器掉电”则可关闭内部天线驱动器,即关闭RF 场;


◆内置温度传感器,以便在芯片温度过高时自动停止 RF 发射;


◆采用相互独立的多组电源供电,以避免模块间的相互干扰,提高工作的稳定性;


◆具备 CRC 和奇偶校验功能,CRC 协处理器的16 位长CRC 计算多项式固定为:x16+x12+x5+1,符合ISO/1EC14443 和CCTITT 协议;


◆内部振荡器,连接 27.12MHz 的晶体;


◆2.5~3.3V 的低电压低功耗设计;


◆工作温度范围-30~+85℃;


◆5mm×5mm×0.85mm 的超小体积。


应用场合


MF RC522 适用于各种基于ISO/IEC 14443A 标准并且要求低成本、小尺寸、高性能以及单电源的非接触式通信的应用场合。


▲三表;


▲板上单元;


▲公共交通终端;


▲便携式手持设备;


▲非接触式公用电话。


3.4 IC卡

image.png

IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card)、智慧卡(Intelligent card)、微电路卡(Microcircuit card)或微芯片卡等。它是将一个微电子芯片嵌入符合ISO 7816标准的卡基中,做成卡片形式。IC卡与读写器之间的通讯方式可以是接触式,也可以是非接触式。由于IC卡具有体积小便于携带、存储容量大、可靠性高、使用寿命长、保密性强安全性高等特点,IC卡的概念是在20世纪70年代初提出来的,法国的布尔公司于1976年首先创造出了IC卡产品,并将这项技术应用于金融、交通、医疗、身份证明等行业,它将微电子技术和计算机技术结合在一起,提高了人们工作、生活的现代化程度。


产品原理


IC卡是集成电路卡,IC卡芯片具有写入数据和存储数据的能力,可对IC卡存储器中的内容进行判定。在卡上封装有符合ISO标准的芯片,有6~8个触点和外部设备进行通信,在IC卡上可以有彩色图案和说明性文字按ISO标准,IC卡的部分触点及其定义为:VCC:IC卡工作电源;GND:接地;VPP:存储器编程电源;CLK:有关信号的定时与同步;I/O:卡中串行数据的输入与输出;RST:复位信号。当IC卡插入IC卡读卡器后,各接点对应接通,IC卡上的超大规模集成电路就开始工作。


IC卡种类


根据卡中所镶嵌集成电路的不同,IC卡可分为存储卡、非接触式IC卡、光卡、非接触式智能IC卡、智能卡 。


存储卡


存储卡,也称记忆卡(Memory Card),卡内有具有存储功能的集成电路存储器,还有数据存储器(EEPROM)、工作存储器(RAM)或程序存储器(EPROM)。存储卡使用半导体存储器。存储器中所有存储单元的总和称为存储容量,存储卡的最大容量目前为512 KB。存储卡读出/写入一个字的时间称作读/写时间,读写器在接收地址和读命令时,即可将卡中的内容读出,读出时间约为几微秒,读写器在送来地址、要写数据和写命令时,即可进行写入,写入一个数据的时间比读出一个数据的时间长得多,一般需要5~10 ms。


非接触式IC卡


非接触式IC卡又称射频卡,是近几年发展起来的一项新技术,它将射频识别技术和IC卡技术结合在一起,解决了无源(卡中无电源)和免接触的技术问题。


非接触式IC卡与接触式IC卡相比有以下特点:


(1)可靠性高。由于读写之间无机械接触,避免了由于接触读写而产生的各种故障;且非接触式IC卡表面无裸露的芯片,无芯片脱落、静电击穿、弯曲损害等后顾之忧 。


(2)操作方便。无接触通信使读写器在10 cm的范围内就可以对卡片进行操作,且非接触式IC卡在使用时无方向性,卡片可以以任意方向掠过读写器表面完成操作,既方便又提高了速度 。


(3)防冲突。非接触式IC卡中有快速防冲突机制,能防止卡片之间出现数据干扰,读写器可以“同时”处理多张非接触式IC卡 。


(4)可以适应多种应用。非接触式Ic卡存储器结构的特点使其适于一卡多用,可以根据不同的应用设定不同的密码和访问条件 。


(5)加密性能好。非接触式IC卡的序号是唯一的,在出厂前已固化,其与读写器之间有双向验证机制;非接触式IC卡在处理前要与读写器进行3次相互认证。


四、硬件设备成品效果图

image.png

image.png

image.png

 程序需要修改的地方:

image.png

image.png

五、硬件设备端代码

image.png

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "RFID_RC522.h"
/*
相关的硬件连接引脚说明:
LED----PC13
KEY----PA0
ESPB266---PB10(TX)(ESP8266-RX)  和PB11(RX)(ESP8266-TX) 
RC522射频模块外部的接口:    
*1--SDA <----->PB5--片选脚
*2--SCK <----->PB4--时钟线
*3--MOSI<----->PA12--输出
*4--MISO<----->PA11--输入
*5--悬空
*6--GND <----->GND
*7--RST <----->PA8--复位脚
*8--VCC <----->VCC
*/
//u8 KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff}; //卡密码-初始密码--白卡的出厂密码--
//u8 MIMA_1[16]={88,88,88,88,88,88,0xff,0x07,0x80,0x29,88,88,88,88,88,88}; //扇区1的密码 格式(A密码 控制位  B密码 )
//u8 MIMA_2[16]={88,88,88,88,88,88};//扇区1的A密码
unsigned char SN[4]={88,88,88,88}; //默认卡号
char SendBuff[10];
/*
函数功能: 打印卡号
*/
void print_info(unsigned char *p,int cnt)
{
  int i;
  for(i=0;i<cnt;i++)
  {
    printf("0x%X ",p[i]);
  }
  printf("\r\n");
}
/*
函数功能: 读卡号--电子标签的卡号
返回值: 1成功 0失败
*/
int ReadCardNumber(void)
{
    unsigned char CT[2];//卡类型
  u8 status=1;
  status=RC522_PcdRequest(PICC_REQIDL ,CT);//(寻卡模式,卡类型),成功返回0
  if(status==MI_OK)//寻卡成功
  {
     status=MI_ERR;
     status=RC522_PcdAnticoll(SN);  //防冲撞,成功返回0,SN是读到卡号的地址
    printf("卡类型:");
    print_info(CT,2);//打印类型
    printf("卡号:");
      print_info(SN,4);//打印卡号 
        return 1;
  }
    return 0;
}
/*
函数功能: 主函数
*/
int main()
{
   u32 cnt=0;
   u8 key;
   LED_Init();
   KEY_Init();
   USART1_Init(115200);
   TIMER1_Init(72,20000); //超时时间20ms
   USART3_Init(115200);//串口-WIFI
   TIMER3_Init(72,20000); //超时时间20ms
   RC522_Init();     //RC522
   USART1_Printf("正在初始化WIFI请稍等.\n");
   if(ESP8266_Init())
   {
      USART1_Printf("ESP8266硬件检测错误.\n");  
   }
   else
   {
      USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","192.168.1.6",8080,0));
   }
   while(1)
   {    
        cnt++;
        delay_ms(10);
        if(cnt>=20)
        {
            cnt=0;
            LED1=!LED1;
        }
        //接收服务器下发的数据
        if(USART3_RX_FLAG)
        {
          USART3_RX_BUFFER[USART3_RX_CNT]='\0';
          USART1_Printf("%s",USART3_RX_BUFFER);
          USART3_RX_CNT=0;
          USART3_RX_FLAG=0;
        }
        //读取卡号
        if(ReadCardNumber())
        {
            sprintf(SendBuff,"%x%x%x%x\r\n",SN[0],SN[1],SN[2],SN[3]);
            ESP8266_ClientSendData((u8*)SendBuff,strlen(SendBuff)); 
        }
        //查看连接状态
        key=KEY_Scan(0);
        if(key) //发送AT
        {
            USARTx_StringSend(USART3,"AT+CIPSTATUS\r\n");  //查看状态信息
        }
   }
}

六、JAVA端效果图

完整资料下载地址: https://download.csdn.net/download/xiaolong1126626497/20687551

配套资料齐全,视频讲解代码,部署环境。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

七、JAVA端的代码

image.png

package com.controller;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;
import com.common.bean.MySessionContext;
import com.common.bean.ResultData;
import com.common.bean.WebSocketProductHolder;
import com.entity.Product;
import com.mapper.ProductMapper;
@RestController()
@RequestMapping("/product")
public class ProductController {
  @Autowired
  private ProductMapper pm;
  @PostMapping("update.action")
  ResultData update(String token,@RequestBody Product update) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     pm.update( update );
     return ResultData.success();
  }
  @PostMapping("byid.action")
  ResultData getById(String token,@RequestBody Product query) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     return ResultData.success().setData( pm.getById( query.getId() ) );
  }
  @PostMapping("delete.action")
  ResultData deletePro(String token,@RequestBody Product delpro) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     pm.deletePro( delpro );
     return ResultData.success();
  }
  @PostMapping("query.action")
  ResultData query(String token,@RequestBody Product query) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     return ResultData.success().setData( pm.query( query ) );
  }
  @PostMapping("all.action")
  ResultData getAll(String token) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     return ResultData.success().setData( pm.getAll() );
  }
  @PostMapping("add.action")
  ResultData addUser(String token,@RequestBody Product pro) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     pm.add( pro );
     try {
       //把商品的编号通过TCP长连接传给STM32,写入rfid卡。
      WebSocketProductHolder.register(pro.getId()+"");
    } catch (IOException e) {
       System.out.println("注册失败!");
    }
     return ResultData.success();
  }
}
package com.controller;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/upload")
public class UpLoadController {
  @PostMapping("/uploadImg")
    public String uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest rq){
        //获取上传文件名,包含后缀
        String originalFilename = file.getOriginalFilename();
        //获取后缀
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        //保存的文件名
        String dFileName = UUID.randomUUID()+substring;
        //保存路径
        //springboot 默认情况下只能加载 resource文件夹下静态资源文件
        String path = "D:\\uploadimg\\";
        //生成保存文件
        File uploadFile = new File(path+dFileName);
        System.out.println(uploadFile);
        //将上传文件保存到路径
        try {
            file.transferTo(uploadFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return uploadFile.getName();
    }
}
package com.controller;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
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.RestController;
import com.common.bean.MySessionContext;
import com.common.bean.ResultData;
import com.entity.User;
import com.mapper.UserMapper;
@RestController()
@RequestMapping("/user")
public class UserController {
  @Autowired
  private UserMapper um;
  @PostMapping("changepswd.action")
  ResultData changePswd(String token,@RequestBody Map<String,String> map) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     User uu = (User) ss.getAttribute("login_user");
     if( uu == null )  return ResultData.fail("请先登录!");
     String password = map.get("password");
     String newpassword = map.get("password2");
     int num = um.updatePassword(uu.getId(), password, newpassword);
     if( num > 0) return ResultData.success();
      return ResultData.fail("原始密码错误");
  }
  @PostMapping("adduser.action")
  ResultData addUser(String token,@RequestBody User user) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     User uu = (User) ss.getAttribute("login_user");
     System.out.println( uu );
     if( uu == null )  return ResultData.fail("请先登录!");
     if( !("admin".equalsIgnoreCase(uu.getRole()) ||
            "root".equals( uu.getRole() )    )  )   {
       return ResultData.fail("请用管理员账号登录再添加");
     }
     um.addUser(user);
     return ResultData.success();
  }
  @PostMapping("delete.action")
  ResultData deleteUser(String token,@RequestBody User user) {
     System.out.println( user);
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     User uu = (User) ss.getAttribute("login_user");
     if( uu == null )  return ResultData.fail("请先登录!");
     if("admin".equalsIgnoreCase(user.getRole()) || "root".equals( user.getRole() ))  return ResultData.fail("无法删除管理员用户!");
     if( !("admin".equalsIgnoreCase(uu.getRole()) ||
            "root".equals( uu.getRole() )    )  )   {
       return ResultData.fail("请用管理员账号登录再删除");
     }
     um.deleteUser(user);
    return ResultData.success();
  }
  @PostMapping("getall.action")
  ResultData getAll(String token) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
    List<User> list = um.getAll();
    for(User u:list) {
      u.setPassword(null);
    }
    return ResultData.success().setData( list );
  }
  @PostMapping("logout.action")
  ResultData getAllUser(String token) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss != null ) {
       ss.invalidate();
     }
    return  ResultData.success();
  }
  @PostMapping("login.action")
  ResultData login(@RequestBody User user,HttpSession ss) {
    User rs = um.Login( user );
    if(rs != null ) {
      rs.setPassword( null );
      ss.setAttribute("login_user", rs );
      MySessionContext.AddSession( ss );
      return  ResultData.success().setData( rs ).setToken(ss.getId() );
    }else {
      return ResultData.fail("用户名或密码错误!");
    }
  }
}
package com.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;
import com.common.bean.MySessionContext;
import com.common.bean.ResultData;
import com.entity.Order;
import com.mapper.OrderMapper;
@RestController()
@RequestMapping("/order")
public class OrderController {
  @Autowired
  private OrderMapper ordermapper;
  @PostMapping("calc.action")
  ResultData update(String token,@RequestBody  List<Order> list) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     for( Order od : list ) {
       ordermapper.add( od );
     }
     return ResultData.success();
  }
  @PostMapping("query.action")
  ResultData query(String token,@RequestBody  Map<String,Long> map) {
     HttpSession ss = MySessionContext.getSession(  token );
     if( ss == null ) {
       return ResultData.fail("请先登录!");
     }
     long t1 = map.get("start");
     long t2 = map.get("end");
     Date d1 = new Date();d1.setTime(t1);
     Date d2 = new Date();d2.setTime(t2);
     String start = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format( d1 );
     String end = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format( d2 );
     List<Order> list = ordermapper.query(start, end);
     return ResultData.success().setData( list );
  }
}



目录
相关文章
|
1月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
186 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
5天前
|
数据可视化 JavaScript Java
2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!
"LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台,内置RBAC权限管理、工作流引擎、数据可视化、三方登录等核心模块,助力开发者快速构建企业级中后台管理系统"
68 17
|
6天前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
48 17
|
1月前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
131 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
1月前
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
87 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
16天前
|
监控 前端开发 Java
构建高效Java后端与前端交互的定时任务调度系统
通过以上步骤,我们构建了一个高效的Java后端与前端交互的定时任务调度系统。该系统使用Spring Boot作为后端框架,Quartz作为任务调度器,并通过前端界面实现用户交互。此系统可以应用于各种需要定时任务调度的业务场景,如数据同步、报告生成和系统监控等。
38 9
|
1月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
140 5
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
17天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
142 60
【Java并发】【线程池】带你从0-1入门线程池
|
6天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
58 23

热门文章

最新文章