天天看點

基于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
基于JAVA超市自助購物系統的設計與實作
基于JAVA超市自助購物系統的設計與實作
基于JAVA超市自助購物系統的設計與實作
三、相關硬體 3.1 STM32F103最小系統闆
基于JAVA超市自助購物系統的設計與實作

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

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

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無線射頻子產品

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

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卡

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

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

四、硬體裝置成品效果圖

基于JAVA超市自助購物系統的設計與實作
基于JAVA超市自助購物系統的設計與實作
基于JAVA超市自助購物系統的設計與實作
 程式需要修改的地方:
基于JAVA超市自助購物系統的設計與實作
基于JAVA超市自助購物系統的設計與實作
 五、硬體裝置端代碼
基于JAVA超市自助購物系統的設計與實作

#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端效果圖

完整資料下載下傳位址: 

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

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

七、JAVA端的代碼

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