【摘要】 本系統(tǒng)主要是由RFID自動(dòng)識(shí)別技術(shù),通過無線射頻方式對(duì)寵物的電子標(biāo)簽進(jìn)行讀取,獲取寵物的基本信息和在店內(nèi)的所有消費(fèi),然后將數(shù)據(jù)通過網(wǎng)絡(luò)傳輸至服務(wù)器。在應(yīng)用層開發(fā)一個(gè)管理系統(tǒng),對(duì)寵物信息、店內(nèi)消費(fèi)等各種行為進(jìn)行管理。同時(shí)系統(tǒng)需有登錄注冊(cè)功能,寵物信息管理,店內(nèi)消費(fèi)管理等功能。
一、設(shè)計(jì)需求
本系統(tǒng)主要是由RFID自動(dòng)識(shí)別技術(shù),通過無線射頻方式對(duì)寵物的電子標(biāo)簽進(jìn)行讀取,獲取寵物的基本信息和在店內(nèi)的所有消費(fèi),然后將數(shù)據(jù)通過網(wǎng)絡(luò)傳輸至服務(wù)器。在應(yīng)用層開發(fā)一個(gè)管理系統(tǒng),對(duì)寵物信息、店內(nèi)消費(fèi)等各種行為進(jìn)行管理。同時(shí)系統(tǒng)需有登錄注冊(cè)功能,寵物信息管理,店內(nèi)消費(fèi)管理等功能。
寵物店管理系統(tǒng)主要分為以下模塊:
1.RFID模塊:由天線和射頻電路組成,通過自動(dòng)識(shí)別電子標(biāo)簽,采集數(shù)據(jù),采用RFID封裝技術(shù)將其封裝,并傳輸給服務(wù)器。
2.電子標(biāo)簽?zāi)K:接收外部信號(hào)和發(fā)送信號(hào)
3.店鋪管理模塊:管理員可以對(duì)店鋪商品進(jìn)行增刪改操作,修改、刪除顧客寵物信息以及店內(nèi)消費(fèi)行為。
4.登錄注冊(cè)模塊:新用戶可以進(jìn)行注冊(cè)和登錄5.用戶管理模塊:對(duì)注冊(cè)用戶進(jìn)行管理
二、設(shè)計(jì)需求總結(jié)
整個(gè)系統(tǒng)的設(shè)計(jì):
(1). 寵物店每來一個(gè)新的寵物,就在軟件端進(jìn)行注冊(cè)、注冊(cè)時(shí)填入寵物的名稱,寵物的類型,主人的電話號(hào)碼、選擇一張寵物的圖片方便后面展示(圖片可以預(yù)存幾張貓、狗即可)、如果寵物后面在店里有消費(fèi)也會(huì)記錄包含時(shí)間,這些數(shù)據(jù)都保存在軟件端的數(shù)據(jù)庫里。
(2). 開卡: 新寵物注冊(cè)之后,需要為這個(gè)寵物辦理一張電子標(biāo)簽卡,這個(gè)卡里存放著這個(gè)寵物主人的電話號(hào)碼,后面要查詢這個(gè)寵物的信息,就讀取整個(gè)電子標(biāo)簽里的電話號(hào)碼,到數(shù)據(jù)庫里查詢。
(3). 開卡和查詢的數(shù)據(jù)傳輸: 設(shè)備端與軟件端采用 TCP網(wǎng)絡(luò)方式進(jìn)行通信;設(shè)備端當(dāng)做TCP客戶端,軟件端當(dāng)做TCP服務(wù)器;當(dāng)設(shè)備端查詢寵物的電子標(biāo)簽時(shí),設(shè)備端讀取電話號(hào)碼之后,會(huì)通過約定的數(shù)據(jù)格式通過網(wǎng)絡(luò)傳遞給軟件端。 當(dāng)軟件端開卡注冊(cè)時(shí),也會(huì)用約定好的數(shù)據(jù)格式傳遞給設(shè)備端,如果設(shè)備端收到數(shù)據(jù),開發(fā)板上的LED會(huì)點(diǎn)亮;這時(shí)把IC拿到RC522射頻模塊上刷一下即可;如果成功寫入LED燈就會(huì)關(guān)閉。
(4). 軟件端的設(shè)計(jì)(這個(gè)軟件是給店家用的,功能都是針對(duì)店家這邊方向開發(fā)):
有注冊(cè)界面、登錄界面;
主界面上顯示店內(nèi)有所有注冊(cè)過的寵物信息,每個(gè)寵物有圖片進(jìn)行顯示、寵物圖片下面就顯示寵物的名稱;
商品界面: 展示一些狗糧、貓糧、藥劑、一些寵物周邊物品。 用于演示消費(fèi)功能。 可以預(yù)定幾個(gè)商品即可。 用戶可以自己動(dòng)態(tài)添加修改。
管理員界面: 可以對(duì)店內(nèi)的商品進(jìn)行添加、設(shè)計(jì)價(jià)格、修改寵物的信息等。
查詢頁面: 輸入寵物信息可以查詢這個(gè)寵物在店里的所有詳細(xì)信息。
設(shè)備硬件部分:
這里的硬件刷卡部分采用的使用STM32開發(fā)的,更加靈活方便,完成對(duì)IC卡讀寫通過網(wǎng)絡(luò)與JAVA服務(wù)器通信,也可以換成掃碼槍之類的其他設(shè)備。
\1. RC522刷卡模塊負(fù)責(zé)對(duì)卡進(jìn)行讀寫。
\2. ESP8266WIFI初始化工作在STA模式,連接到指定WIFI,與軟件所在的電腦處于同一個(gè)局域網(wǎng),方便連接軟件端的服務(wù)器進(jìn)行數(shù)據(jù)通信,每次設(shè)備開機(jī)將會(huì)自動(dòng)連接到程序里設(shè)置好WIFI熱點(diǎn)和服務(wù)器。
\3. 設(shè)備端上有一個(gè)LED燈,用來顯示刷卡的狀態(tài)—成功與否。
三、硬件設(shè)備效果圖與部分核心代碼
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatbWAVWxFAAXGe2iJnNo324.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatbaAX1J3AAVhox7dcIc692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatbeAGIIJAAQ5a1lSmMk012.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函數(shù)功能: ESP8266命令發(fā)送函數(shù)
函數(shù)返回值:0表示成功 1表示失敗
*/
u8 ESP8266_SendCmd(char *cmd)
{
u8 i,j;
for(i=0;i<10;i++) //檢測(cè)的次數(shù)--發(fā)送指令的次數(shù)
{
USARTx_StringSend(USART3,cmd);
for(j=0;j<100;j++) //等待的時(shí)間
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"OK"))
{
return 0;
}
}
}
}
return 1;
}
/*
函數(shù)功能: ESP8266硬件初始化檢測(cè)函數(shù)
函數(shù)返回值:0表示成功 1表示失敗
*/
u8 ESP8266_Init(void)
{
//退出透?jìng)髂J? USARTx_StringSend(USART3,"+++");
delay_ms(50);
return ESP8266_SendCmd("AT\r\n");
}
/*
函數(shù)功能: 一鍵配置WIFI為AP+TCP服務(wù)器模式
函數(shù)參數(shù):
char *ssid 創(chuàng)建的熱點(diǎn)名稱
char *pass 創(chuàng)建的熱點(diǎn)密碼 (最少8位)
u16 port 創(chuàng)建的服務(wù)器端口號(hào)
函數(shù)返回值: 0表示成功 其他值表示對(duì)應(yīng)錯(cuò)誤值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{
char *p;
u8 i;
char ESP8266_SendCMD[100]; //組合發(fā)送過程中的命令
/*1. 測(cè)試硬件*/
if(ESP8266_SendCmd("AT\r\n"))return 1;
/*2. 關(guān)閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
/*3. 設(shè)置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
/*4. 復(fù)位*/
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 關(guān)閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
/*6. 設(shè)置WIFI的AP模式參數(shù)*/
sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
/*7. 開啟多連接*/
if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
/*8. 設(shè)置服務(wù)器端口號(hào)*/
sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
/*9. 查詢本地IP地址*/
if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
//提取IP地址
p=strstr((char*)USART3_RX_BUFFER,"APIP");
if(p)
{
p+=6;
for(i=0;*p!='"';i++)
{
ESP8266_IP_ADDR[i]=*p++;
}
ESP8266_IP_ADDR[i]='\0';
}
//提取MAC地址
p=strstr((char*)USART3_RX_BUFFER,"APMAC");
if(p)
{
p+=7;
for(i=0;*p!='"';i++)
{
ESP8266_MAC_ADDR[i]=*p++;
}
ESP8266_MAC_ADDR[i]='\0';
}
//打印總體信息
USART1_Printf("當(dāng)前WIFI模式:AP+TCP服務(wù)器\n");
USART1_Printf("當(dāng)前WIFI熱點(diǎn)名稱:%s\n",ssid);
USART1_Printf("當(dāng)前WIFI熱點(diǎn)密碼:%s\n",pass);
USART1_Printf("當(dāng)前TCP服務(wù)器端口號(hào):%d\n",port);
USART1_Printf("當(dāng)前TCP服務(wù)器IP地址:%s\n",ESP8266_IP_ADDR);
USART1_Printf("當(dāng)前TCP服務(wù)器MAC地址:%s\n",ESP8266_MAC_ADDR);
return 0;
}
/*
函數(shù)功能: TCP服務(wù)器模式下的發(fā)送函數(shù)
發(fā)送指令:
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100]; //組合發(fā)送過程中的命令
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,">"))
{
//繼續(xù)發(fā)送數(shù)據(jù)
USARTx_DataSend(USART3,data,len);
//等待數(shù)據(jù)發(fā)送成功
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
/*
函數(shù)功能: 配置WIFI為STA模式+TCP客戶端模式
函數(shù)參數(shù):
char *ssid 創(chuàng)建的熱點(diǎn)名稱
char *pass 創(chuàng)建的熱點(diǎn)密碼 (最少8位)
char *p 將要連接的服務(wù)器IP地址
u16 port 將要連接的服務(wù)器端口號(hào)
u8 flag 1表示開啟透?jìng)髂J?0表示關(guān)閉透?jìng)髂J?函數(shù)返回值:0表示成功 其他值表示對(duì)應(yīng)的錯(cuò)誤
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
char ESP8266_SendCMD[100]; //組合發(fā)送過程中的命令
//退出透?jìng)髂J? //USARTx_StringSend(USART3,"+++");
//delay_ms(50);
/*1. 測(cè)試硬件*/
if(ESP8266_SendCmd("AT\r\n"))return 1;
/*2. 關(guān)閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
/*3. 設(shè)置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
/*4. 復(fù)位*/
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 關(guān)閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
/*6. 配置將要連接的WIFI熱點(diǎn)信息*/
sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
/*7. 設(shè)置單連接*/
if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
/*8. 配置要連接的TCP服務(wù)器信息*/
sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
/*9. 開啟透?jìng)髂J?/
if(flag)
{
if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9; //開啟
if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10; //開始透?jìng)? if(!(strstr((char*)USART3_RX_BUFFER,">")))
{
return 11;
}
//如果想要退出發(fā)送: "+++"
}
//打印總體信息
USART1_Printf("當(dāng)前WIFI模式:STA+TCP客戶端\n");
USART1_Printf("當(dāng)前連接的WIFI熱點(diǎn)名稱:%s\n",ssid);
USART1_Printf("當(dāng)前連接的WIFI熱點(diǎn)密碼:%s\n",pass);
USART1_Printf("當(dāng)前連接的TCP服務(wù)器端口號(hào):%d\n",port);
USART1_Printf("當(dāng)前連接的TCP服務(wù)器IP地址:%s\n",ip);
return 0;
}
/*
函數(shù)功能: TCP客戶端模式下的發(fā)送函數(shù)
發(fā)送指令:
*/
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100]; //組合發(fā)送過程中的命令
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,">"))
{
//繼續(xù)發(fā)送數(shù)據(jù)
USARTx_DataSend(USART3,data,len);
//等待數(shù)據(jù)發(fā)送成功
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
四、JAVA端效果圖與部分代碼示例
如果需要資料包可以去這里下載: https://download.csdn.net/download/xiaolong1126626497/20687600
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatbeAdK4XAAD_JAI1bro158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatbeAaaI1AACWxq8FxYM891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatbmAPcQJAAPULquVbxg887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatbqAG1UlAAQME4KZUvo003.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatbuAVEGvAASTiOzAEvo374.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatbyAGrPmAAdbeIvKdk0171.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatb2ASkhXAAuuvtIKufY746.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatb6AAPEvAAZvNBAy0I4666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatb-ASm0rAAcKkgsfK50141.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatcCAGWZsAAeM6UQMxRM501.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatcGAK1BeAAiVuPWjvQ4848.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatcKAPdbJAA1Mp0Has0A035.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatcSAYWO8ABG9vtPr8eE065.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatcWAa2puAA7yiJHIHeQ793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E0/poYBAGMatcaAOtQ1ABBJ1DP59Ns547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/68/79/pYYBAGMatceAAxlSABAIei4f6_A270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
![img](https://file.elecfans.com//web2/M00/67/E1/poYBAGMatciAe6ZnAAwYHcJh-NY017.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70)
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 map) {
HttpSession ss = MySessionContext.getSession( token );
if( ss == null ) {
return ResultData.fail("請(qǐng)先登錄!");
}
User uu = (User) ss.getAttribute("login_user");
if( uu == null ) return ResultData.fail("請(qǐng)先登錄!");
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("原始密碼錯(cuò)誤");
}
@PostMapping("adduser.action")
ResultData addUser(String token,@RequestBody User user) {
HttpSession ss = MySessionContext.getSession( token );
if( ss == null ) {
return ResultData.fail("請(qǐng)先登錄!");
}
User uu = (User) ss.getAttribute("login_user");
System.out.println( uu );
if( uu == null ) return ResultData.fail("請(qǐng)先登錄!");
if( !("admin".equalsIgnoreCase(uu.getRole()) ||
"root".equals( uu.getRole() ) ) ) {
return ResultData.fail("請(qǐng)用管理員賬號(hào)登錄再添加");
}
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("請(qǐng)先登錄!");
}
User uu = (User) ss.getAttribute("login_user");
if( uu == null ) return ResultData.fail("請(qǐng)先登錄!");
if("admin".equalsIgnoreCase(user.getRole()) || "root".equals( user.getRole() )) return ResultData.fail("無法刪除管理員用戶!");
if( !("admin".equalsIgnoreCase(uu.getRole()) ||
"root".equals( uu.getRole() ) ) ) {
return ResultData.fail("請(qǐng)用管理員賬號(hào)登錄再刪除");
}
um.deleteUser(user);
return ResultData.success();
}
@PostMapping("getall.action")
ResultData getAll(String token) {
HttpSession ss = MySessionContext.getSession( token );
if( ss == null ) {
return ResultData.fail("請(qǐng)先登錄!");
}
List 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("用戶名或密碼錯(cuò)誤!");
}
}
}
,string>
package com.common.wx;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import com.common.bean.WebSocketProductHolder;
public class WebSocketServerService extends TextWebSocketHandler{
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
WebSocketProductHolder.setSession( session );
}
}
package com.common.bean;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import com.alibaba.fastjson.JSONObject;
import com.entity.Product;
import com.mapper.ProductMapper;
@Component
public class WebSocketProductHolder implements ApplicationContextAware{
private volatile static WebSocketSession oneSession;
private volatile static Socket client;
public WebSocketProductHolder() {
initServer();
}
public static void setSession(WebSocketSession ss) {
oneSession = ss;
}
private static void initServer() {
new Thread() {
public void run() {
ServerSocket ss = null;
try {
ss = new ServerSocket(9988);
System.out.println("初始化");
while(true) {
client = ss.accept();
byte [] b = new byte[128];
try {
while(true) {
int num = client.getInputStream().read(b);//數(shù)據(jù)少,一次讀完就阻塞。
if(num != -1 ) {
String cmd = new String(b,0,num);
parseCMD( cmd);
}
}
}catch (Exception e) {
System.out.println("連接斷開...");
}
}
}catch (Exception e) {
}
}
}.start();
}
public static void register(String cardid)throws IOException {
if(cardid!=null && cardid.length() >0 &&
client!=null && client.isConnected()) {
client.getOutputStream().write(("register:"+cardid+"\r\n").getBytes());
}
}
private static void parseCMD(String cmd) {
if(cmd.startsWith("query")) {
try {
String cardid = cmd.split(":")[1].trim();
if( oneSession != null ) {
oneSession.sendMessage( new TextMessage( cardid ) );
}
}catch (Exception e) {
System.out.println("數(shù)據(jù)錯(cuò)誤:"+cmd);
}
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
initServer();
}
}
商品名稱商品價(jià)格商品數(shù)量商品分類商品描述商品圖片提交
查詢
當(dāng)前共 {{datalist.length}} 件商品
商品編號(hào)商品名稱商品分類商品價(jià)格商品數(shù)量商品圖片操作
{{item.name}}
{{item.sortname}}
{{item.price|priceText}}
{{item.num}}
詳情刪除修改返回商品編號(hào)
{{detail.id}}
商品名稱
{{detail.name}}
商品價(jià)格
{{detail.price|priceText}}
商品數(shù)量
{{detail.num}}
商品分類
{{detail.sortname}}
商品描述
{{detail.detail}}
商品圖片
商品名稱商品價(jià)格商品數(shù)量商品分類商品描述商品圖片提交
-
嵌入式
+關(guān)注
關(guān)注
5093文章
19178瀏覽量
307712 -
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357597 -
JAVA
+關(guān)注
關(guān)注
19文章
2975瀏覽量
105156
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
RIFD技術(shù)在寵物管理上的應(yīng)用方案
![RIFD技術(shù)在<b class='flag-5'>寵物</b><b class='flag-5'>管理</b>上的應(yīng)用方案](https://file.elecfans.com/web1/M00/3E/7A/o4YBAFowgsGAHeApAAEZMdYWAao192.png)
機(jī)智云技術(shù)在寵物管理系統(tǒng)中的應(yīng)用
機(jī)智云技術(shù)在寵物管理系統(tǒng)中的應(yīng)用
怎么實(shí)現(xiàn)基于java的土地檔案管理系統(tǒng)設(shè)計(jì)?
如何利用Java swing mysql去實(shí)現(xiàn)一種電影票訂票管理系統(tǒng)呢
基于Web遠(yuǎn)程文件管理系統(tǒng)的java實(shí)現(xiàn)
RFID寵物狗防疫管理系統(tǒng)如何制作
使用Java實(shí)現(xiàn)的學(xué)生管理系統(tǒng)詳細(xì)資料說明
![使用<b class='flag-5'>Java</b><b class='flag-5'>實(shí)現(xiàn)</b>的學(xué)生<b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>詳細(xì)資料說明](https://file.elecfans.com/web1/M00/AF/D3/o4YBAF3nHzmACAteAAFqGfdMjOw976.png)
RFID寵物狗防疫管理如何來實(shí)現(xiàn)
使用Java實(shí)現(xiàn)超市貨物管理系統(tǒng)的資料合集免費(fèi)下載
![使用<b class='flag-5'>Java</b><b class='flag-5'>實(shí)現(xiàn)</b>超市貨物<b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>的資料合集免費(fèi)下載](https://file.elecfans.com/web1/M00/BD/58/o4YBAF7Q2EOAFGiuAAVwW4RJdVg750.png)
基于機(jī)智云技術(shù)的智能寵物管理系統(tǒng)
![基于機(jī)智云技術(shù)的智能<b class='flag-5'>寵物</b><b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>](https://file.elecfans.com/web1/M00/E3/64/pIYBAGA_Pp6AEN07AAATLy2tmQA738.jpg)
基于機(jī)智云寵物管理系統(tǒng)總體設(shè)計(jì)
【IoT畢設(shè)】機(jī)智云物聯(lián)網(wǎng)平臺(tái)+STM32單片機(jī)+智能寵物屋實(shí)現(xiàn)
![【IoT畢設(shè)】機(jī)智云物聯(lián)網(wǎng)平臺(tái)+<b class='flag-5'>STM32</b>單片機(jī)+智能<b class='flag-5'>寵物</b>屋<b class='flag-5'>實(shí)現(xiàn)</b>](https://file.elecfans.com/web2/M00/66/5E/pYYBAGMMol-Aef4hAABC6MbTRnM536.png)
物聯(lián)網(wǎng)智能寵物管理系統(tǒng)
![物聯(lián)網(wǎng)智能<b class='flag-5'>寵物</b><b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
評(píng)論