主頁 > 後端開發 > 基于JAVA超市自助購物系統的設計與實作

基于JAVA超市自助購物系統的設計與實作

2021-08-06 07:37:58 後端開發

一、設計需求

基于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也可以替換成其他掃碼槍之類的都可以的:

  1. RC522刷卡模塊負責對卡進行讀寫,
  2. ESP8266WIFI初始化作業在STA模式,連接到指定WIFI,與軟體所在的電腦處于同一個局域網,方便連接軟體端的服務器進行資料通信,每次設備開機將會自動連接到程式里設定好WIFI熱點和服務器,
  3. 設備端上有一個LED燈,用來顯示刷卡的狀態—成功與否,

完整資料下載地址: https://download.csdn.net/download/xiaolong1126626497/20687551

三、相關硬體

3.1 STM32F103最小系統板

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

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無線射頻模塊

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卡

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次相互認證,

四、硬體設備成品效果圖

程式需要修改的地方:

五、硬體設備端代碼

#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

配套資料齊全,視頻講解代碼,部署環境,

七、JAVA端的代碼

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 );
	}

}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292029.html

標籤:java

上一篇:JavaScript實作飛機大戰,你來你也行!

下一篇:爬蟲學習—疫情篇

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more