最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

前端畢業(yè)設(shè)計(jì):Nodejs+Vue菜鳥(niǎo)驛站倉(cāng)庫(kù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

2022-10-03 16:33 作者:指南針畢業(yè)設(shè)計(jì)  | 我要投稿


項(xiàng)目編號(hào):BS-QD-004????????

前言:

當(dāng)前時(shí)代,全球的經(jīng)濟(jì)已經(jīng)從工業(yè)經(jīng)濟(jì)到知識(shí)經(jīng)濟(jì)的改變,過(guò)去專家說(shuō)知識(shí)經(jīng)濟(jì)的兩個(gè)首要屬性是信息化和全球化,要完成化和全球化,這時(shí)就需要穩(wěn)定的網(wǎng)絡(luò)和完備的數(shù)據(jù)庫(kù)。但時(shí)至今日中國(guó)的服務(wù)價(jià)值意識(shí)提高,人力成本開(kāi)始驟增,對(duì)于很多快遞企業(yè)來(lái)說(shuō)一個(gè)10元成本的單子,有5元是在最后一公里被消耗了。研究快遞驛站的智能物流貨架的應(yīng)用方案,隨著社會(huì)和科學(xué)技術(shù)的演變,倉(cāng)儲(chǔ)管理的方法也不斷優(yōu)化。從全部人工管理的方法,這樣不僅效率低,工作量大,并且準(zhǔn)確率差。尤其是當(dāng)今快遞行業(yè)飛速發(fā)展,貨流量大,人工管理更顯不足。為了提高倉(cāng)庫(kù)管理效率,減少倉(cāng)庫(kù)管理成本,特開(kāi)發(fā)菜鳥(niǎo)驛站庫(kù)存管理系統(tǒng)。

一,項(xiàng)目簡(jiǎn)介

本系統(tǒng)使用 Node.JS 語(yǔ)言開(kāi)發(fā),該編程語(yǔ)言簡(jiǎn)單易學(xué),能夠與多個(gè)框架完美結(jié)合,又具備面向?qū)ο?、與平臺(tái)無(wú)關(guān)、多線程等特點(diǎn),因此比較容易進(jìn)行開(kāi)發(fā)工作。開(kāi)發(fā)工具使用Visual Studio Code,它強(qiáng)大的整合能力能更好的對(duì)項(xiàng)目進(jìn)行管理,豐富的提示功能可以使開(kāi)發(fā)人員更加高效的進(jìn)行開(kāi)發(fā)工作。數(shù)據(jù)庫(kù)使用MySQL,其簡(jiǎn)單易用、開(kāi)源免費(fèi)、社區(qū)龐大而完善的特點(diǎn),對(duì)于初次嘗試人員非常友好。系統(tǒng)的架構(gòu)是B/S,也就是瀏覽器/服務(wù)器模型,客戶端完成主要的業(yè)務(wù),一些交互或發(fā)起請(qǐng)求在前端完成。對(duì)于用戶非常簡(jiǎn)單,通過(guò)一個(gè)瀏覽器就可以與系統(tǒng)進(jìn)行訪問(wèn)和交互。為了實(shí)現(xiàn)高效的開(kāi)發(fā)和后期維護(hù),系統(tǒng)采用了MVC架構(gòu),即數(shù)據(jù)模型層、視圖表現(xiàn)層、路由控制層,客戶通過(guò)視圖交互實(shí)現(xiàn)數(shù)據(jù)功能的使用效果,路由控制層主要處理前端傳過(guò)來(lái)的各種請(qǐng)求,通過(guò)路由和參數(shù)以及身份認(rèn)證來(lái)處理邏輯,并把最終的結(jié)果給到前端,數(shù)據(jù)模型層主要是對(duì)數(shù)據(jù)的增刪改查等操作,當(dāng)然主要依賴于路由控制層。如上的開(kāi)發(fā)工具和技術(shù)都能夠滿足開(kāi)發(fā)需求,故在技術(shù)上是可行的。隨著科學(xué)技術(shù)的不斷提高,計(jì)算機(jī)科學(xué)應(yīng)用也越來(lái)越普及,相比手工管理,使用計(jì)算機(jī)軟件對(duì)倉(cāng)儲(chǔ)信息進(jìn)行管理,無(wú)論從效率、科學(xué)性還是規(guī)范性方面都有著巨大的優(yōu)勢(shì),該軟件的開(kāi)發(fā)不會(huì)侵犯國(guó)家、集體和他人的利益,所以其具備社會(huì)公認(rèn)的可行性。系統(tǒng)開(kāi)發(fā)不需要高端設(shè)備,大部分技術(shù)開(kāi)源免費(fèi),哪怕開(kāi)發(fā)過(guò)程中發(fā)生重大失誤,改正即可,不會(huì)損耗材料,系統(tǒng)開(kāi)發(fā)出來(lái),可以無(wú)限備份投入使用,非常完全符合經(jīng)濟(jì)上的可行性。

業(yè)務(wù)流程圖

編輯

系統(tǒng)數(shù)據(jù)流程圖

編輯



二,環(huán)境介紹

2.2相關(guān)技術(shù)和開(kāi)發(fā)環(huán)境

2.2.1 相關(guān)技術(shù)

(1)B/S結(jié)構(gòu)(Browser/Server結(jié)構(gòu))簡(jiǎn)介

B/S(Brower/Server,瀏覽器/服務(wù)器)模式又稱B/S結(jié)構(gòu),是Web興起后的一種網(wǎng)絡(luò)結(jié)構(gòu)模式。Web瀏覽器是客戶端最主要的應(yīng)用軟件。這種模式統(tǒng)一了客戶端,將系統(tǒng)功能實(shí)現(xiàn)的核心部分集中到服務(wù)器上,簡(jiǎn)化了系統(tǒng)的開(kāi)發(fā)、維護(hù)和使用;客戶機(jī)上只需要安裝一個(gè)瀏覽器,服務(wù)器上安裝SQL Server, Oracle, MySql等數(shù)據(jù)庫(kù);瀏覽器通過(guò)Web Server同數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互。Browser指的是Web瀏覽器,極少數(shù)事務(wù)邏輯在前端實(shí)現(xiàn),但主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。B/S架構(gòu)的系統(tǒng)無(wú)須特別安裝,只有Web瀏覽器即可。

其實(shí)就是我們前端現(xiàn)在做的一些事情,大部分的邏輯交給后臺(tái)來(lái)實(shí)現(xiàn),我們前端大部分是做一些數(shù)據(jù)渲染,請(qǐng)求等比較少的邏輯。通過(guò)三層結(jié)構(gòu)模型,大大減輕了客戶端的壓力,降低了開(kāi)發(fā)和維護(hù)的成本,也降低了客戶的總成本。

(2)Mysql簡(jiǎn)介

MySQL是Web世界中使用最廣泛的數(shù)據(jù)庫(kù)服務(wù)器。SQLite的特點(diǎn)是輕量級(jí)、可嵌入,但不能承受高并發(fā)訪問(wèn),適合桌面和移動(dòng)應(yīng)用。而MySQL是為服務(wù)器端設(shè)計(jì)的數(shù)據(jù)庫(kù),能承受高并發(fā)訪問(wèn),同時(shí)占用的內(nèi)存也遠(yuǎn)遠(yuǎn)大于SQLite。

此外,MySQL內(nèi)部有多種數(shù)據(jù)庫(kù)引擎,最常用的引擎是支持?jǐn)?shù)據(jù)庫(kù)事務(wù)的InnoDB。存儲(chǔ)引擎就是存儲(chǔ)數(shù)據(jù),建立索引,更新、查詢數(shù)據(jù)等技術(shù)的實(shí)現(xiàn)方式。存儲(chǔ)引擎是基于表的。mysql支持多種存儲(chǔ)引擎,而oracle、sqlserver等只有一種存儲(chǔ)引擎

即市場(chǎng)占有率最大的關(guān)系型數(shù)據(jù)庫(kù),類似于excel表格

DML:select、insert、update、delete

DDL:drop、create等


  1. MySQL數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)

?MySQL的主要優(yōu)勢(shì)如下:


1、速度: 系統(tǒng)運(yùn)行速度非???。


2、價(jià)格:MySQL對(duì)多數(shù)個(gè)人來(lái)說(shuō)是免費(fèi)使用的。


3、容易使用:相比于其他數(shù)據(jù)庫(kù)的設(shè)置和管理相比,相對(duì)于比較簡(jiǎn)單,容易學(xué)習(xí)。


4、可移植性: 跨平臺(tái)能力,可以適用于不同的系統(tǒng)平臺(tái)之下,例如:Windows 、Linux、Unix、MacOS等。


5、豐富的接口: 提供了用于C 、C++、Eiffel、Java、Perl、PHP、Python、Rudy和TCL 等語(yǔ)言的API。


6、支持查詢語(yǔ)言:MySQL可以利用標(biāo)準(zhǔn)SQL語(yǔ)法和支持ODBC(開(kāi)放式數(shù)據(jù)庫(kù)連接)的應(yīng)用程序。


7、安全性和連接性; 非常靈活的安全和校驗(yàn)機(jī)制,允許主機(jī)驗(yàn)證。連接到服務(wù)器時(shí),所有的密碼

都采用加密形式,從而保證了密碼安全。并且由于MySQL時(shí)網(wǎng)絡(luò)化的,因此可以在因特網(wǎng)網(wǎng)上的任何地方訪問(wèn),提高數(shù)據(jù)共享效率。

(4)HTML簡(jiǎn)介

HTML 是用來(lái)描述網(wǎng)頁(yè)的一種語(yǔ)言。

HTML 指的是超文本標(biāo)記語(yǔ)言 (Hyper?Text?Markup?Language)

HTML 不是一種編程語(yǔ)言,而是一種標(biāo)記語(yǔ)言?(markup language)

標(biāo)記語(yǔ)言是一套標(biāo)記標(biāo)簽?(markup tag)

HTML 使用標(biāo)記標(biāo)簽來(lái)描述網(wǎng)頁(yè)

HTML 標(biāo)簽

HTML 標(biāo)記標(biāo)簽通常被稱為 HTML 標(biāo)簽 (HTML tag)。

HTML 標(biāo)簽是由尖括號(hào)包圍的關(guān)鍵詞,比如 <html>

HTML 標(biāo)簽通常是成對(duì)出現(xiàn)的,比如 <b> 和 </b>

標(biāo)簽對(duì)中的第一個(gè)標(biāo)簽是開(kāi)始標(biāo)簽,第二個(gè)標(biāo)簽是結(jié)束標(biāo)簽

開(kāi)始和結(jié)束標(biāo)簽也被稱為開(kāi)放標(biāo)簽和閉合標(biāo)簽

HTML 文檔 = 網(wǎng)頁(yè)

HTML 文檔描述網(wǎng)頁(yè)

HTML 文檔包含 HTML 標(biāo)簽和純文本

HTML 文檔也被稱為網(wǎng)頁(yè)

(5)Node.js簡(jiǎn)介

Node.js是基于google公司旗下的產(chǎn)品Chrome瀏覽器,其中使用的V8引擎就來(lái)自于此。由于瀏覽器的特殊性,引擎最顯著的特點(diǎn)就是事件驅(qū)動(dòng)、異步的I/O模式,在不斷的優(yōu)化下,非常的高效和輕量

(6)Visual Studio Code簡(jiǎn)介

相比于Visual Studio的重量級(jí)產(chǎn)品不同,Visual Studio Code可謂非常的輕量級(jí),它誕生于2015年4月30日的開(kāi)發(fā)者大會(huì)上,并且跨平臺(tái)的特性,以及針對(duì)現(xiàn)代web應(yīng)用和云平臺(tái)的源代碼編輯器。軟件只有幾十兆,因?yàn)椴唤壎ㄈ魏蔚牟寮?,但是因?yàn)閾碛袕?qiáng)大的插件系統(tǒng)和插件商城,所以開(kāi)發(fā)者可以有選擇的使用各種插件,提高效率,對(duì)于內(nèi)置支持的Javascript和TypeScript,并且可以通過(guò)擴(kuò)展來(lái)支持其他語(yǔ)言,比如C++、C、JAVA、Python等語(yǔ)言。

(7)Nginx簡(jiǎn)介

Nginx是支持多線程的方式的,只是我們主流的方式還是多進(jìn)程的方式,也是nginx的默認(rèn)方式。


  master進(jìn)程主要用來(lái)管理worker進(jìn)程,包含:接收來(lái)自外界的信號(hào),向各worker進(jìn)程發(fā)送信號(hào),監(jiān)控worker進(jìn)程的運(yùn)行狀態(tài),當(dāng)worker進(jìn)程退出后(異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的worker進(jìn)程。


  worker進(jìn)程則是處理基本的網(wǎng)絡(luò)事件。多個(gè)worker進(jìn)程之間是對(duì)等的,他們同等競(jìng)爭(zhēng)來(lái)自客戶端的請(qǐng)求,各進(jìn)程互相之間是獨(dú)立的。一個(gè)請(qǐng)求,只可能在一個(gè)worker進(jìn)程中處理,一個(gè)worker進(jìn)程,不可能處理其它進(jìn)程的請(qǐng)求。

2.2.2 系統(tǒng)的開(kāi)發(fā)環(huán)境

系統(tǒng)設(shè)計(jì)平臺(tái):Microsoft Windows 10

數(shù)據(jù)庫(kù)設(shè)計(jì)工具:MySQL

程序設(shè)計(jì)工具:Visual studio code




三,系統(tǒng)展示

4.2.1 注冊(cè)界面

注冊(cè)界面是管理系統(tǒng)最重要的環(huán)節(jié),只有注冊(cè)才能有能力訪問(wèn)管理后臺(tái)系統(tǒng),以及進(jìn)一步的操作,這樣也就規(guī)避了不同人員在沒(méi)有權(quán)限下,操作管理后臺(tái)。

沒(méi)有權(quán)限操作數(shù)據(jù),會(huì)對(duì)整個(gè)數(shù)據(jù)造成破壞,產(chǎn)生不可挽回的影響。


具體代碼如下:


let { name, password, password2, phone, username } = ctx.request.body;

let adminUserList = await query('select * from admin_user');

let time = dayjs().format('YYYY-MM-DD HH:mm:ss')

if (adminUserList.some(item => item.username === username)) {

?? ctx.body = {

code: -1,

data: null,

message: ?'該用戶已經(jīng)注冊(cè)'

};

?} else {

? try {

??? let str = `INSERT INTO admin_user(username, password, name, phone, time) VALUES('${username}', '${password}', '${name}', '${phone}', '${time}')`;

??? console.log(str);

??? await query(str);

??? ctx.response.redirect('/login');

?} catch(err) {

??? console.log(err);

?? ctx.response.redirect('/register');

?}

}


注冊(cè)操作需要的信息有:用戶名(登錄名)、用戶密碼、確認(rèn)密碼、真實(shí)姓名、用戶手機(jī)號(hào)。具體操作頁(yè)面如4-1所示:

編輯

4.2.2 登錄界面

管理員登錄是驗(yàn)證用戶身份最主要的手段,后臺(tái)系統(tǒng)通過(guò)token保存用戶身份,前端把token放到瀏覽器storage中存儲(chǔ),每次請(qǐng)求帶上token數(shù)據(jù)。整體的實(shí)現(xiàn)也非常簡(jiǎn)單,通過(guò)輸入用戶名和密碼,前端發(fā)起http請(qǐng)求,給到后端,后端拿到用戶名和密碼,進(jìn)一步判斷是否與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致,如果通過(guò)驗(yàn)證則跳到首頁(yè),否則就會(huì)返回給客戶端相應(yīng)的錯(cuò)誤。通過(guò)認(rèn)證后,用戶就會(huì)與之創(chuàng)建連接,就可以完成之后的后續(xù)操作了。

具體實(shí)現(xiàn)代碼如下所示:


let adminUserList = await query(`

SELECT id, username, name, phone

FROM admin_use

WHERE username='${username}' && password='${password}'

`);

?if (adminUserList.length > 0) {

?? let token = jwt.sign({ ...adminUserList[0] }, secret);

?? ctx.body = {

??? code: 1,

????? data: {

??????? token,

?????? ???? username: username

????? },

?message: '登錄成功'

}


具體的功能頁(yè)面如下圖4-2所示:


編輯

圖4-2 登錄界面


4.2.3 入庫(kù)界面

每為確保公司貨貨物進(jìn)出入庫(kù)能得到管制,確保倉(cāng)庫(kù)庫(kù)存數(shù)據(jù)的準(zhǔn)確,必須規(guī)范好商品的出入庫(kù)

流程。最重要的就是入庫(kù)管理,通過(guò)點(diǎn)擊頂部的商品入庫(kù)跳到對(duì)應(yīng)頁(yè)面

具體代碼如下:

操作界面如圖4-3:

? router.post('/instock', async function (ctx, next) {

??? let { token } = ctx.request.header;

??? let { name, phone, goodsName } = ctx.request.body;

??? try {

????? let userInfo = jwt.verify(token, secret);

????? let time = dayjs().format('YYYY-MM-DD HH:mm:ss');

????? console.log(name, phone, goodsName, userInfo);

????? // 1. 先用手機(jī)號(hào)查customer表,是否有此用戶

????? let customerList = await query(`select id, phone from customer`);

????? let curCustomer = customerList.find(item => item.phone == phone);

????? let customerId;

?????

????? if (!curCustomer) {

??????? // 先加一下這個(gè)用戶

??????? customerId = customerList.length + 1;

??????? await query(`insert into customer(id, name, phone, time) values(${customerId}, '${name}', '${phone}', '${time}')`);

????? } else {

??????? customerId = curCustomer.id;

????? }

?????

????? // 2. 找一個(gè)空的貨架單元

????? // 把所有庫(kù)存的倉(cāng)庫(kù)都找出來(lái)

????? let storehouseGoodsList = await query(`select storehouse_id from storehouse_goods where is_out<>1`);

????? let storehouseList = await query(`select id from storehouse`);

????? let emptyStoreId = '';

????? if (storehouseGoodsList.length > 0) {

?????? ?let emptyStoreList = storehouseList.filter(item => !storehouseGoodsList.some(it => it.storehouse_id === item.id))

??????? if (emptyStoreList.length === 0) throw new Error('沒(méi)有空余的貨架,請(qǐng)出庫(kù)以騰出空位!');

??????? emptyStoreId = emptyStoreList[0].id;

????? } else {

? ??????emptyStoreId = storehouseList[0].id;

????? }

?????

????? // 寫入出庫(kù)

????? let goodsList = await query(`select id from goods`);

????? let goodsId = goodsList.length + 1;

????? await query(`insert into goods(id, name, customer_id, admin_id) values(${goodsId}, '${goodsName}', ${customerId}, ${userInfo.id})`);

????? await query(`insert into storehouse_goods(goods_id, storehouse_id, is_out, instock_time) values(${goodsId}, ${emptyStoreId}, 0 ,'${time}');`);

????? ctx.body = {

??????? code: 1,

??????? data: null,

??????? message: '商品入庫(kù)成功!'

????? }


??? } catch(err) {

????? console.log(err);

????? ctx.response.redirect('/login');

??? }


? });


編輯

圖4-3 商品入庫(kù)?

4.2.4 出庫(kù)界面

倉(cāng)當(dāng)客戶收到取件碼后,通過(guò)掃碼就可以獲得對(duì)應(yīng)的庫(kù)存id(因?yàn)闆](méi)有具體的物理設(shè)備,此操作通過(guò)查詢步驟,給出庫(kù)存id),通過(guò)檢驗(yàn)身份信息,此功能通過(guò)點(diǎn)擊頂部的商品出庫(kù)跳到對(duì)應(yīng)的頁(yè)面完成

相關(guān)代碼如下:

具體操作頁(yè)面如圖4-4:


? router.post('/outstock', async function (ctx, next) {

??? let { token } = ctx.request.header;

??? let { val } = ctx.request.body;

??? try {

????? let userInfo = jwt.verify(token, secret);

????? let sgList = await query(`select id, goods_id, is_out from storehouse_goods where id=${val}`);

????? if (sgList.length === 0) throw new Error('庫(kù)存id無(wú)效');

????? if (sgList[0].is_out === 1) throw new Error('該商品已經(jīng)出庫(kù)');

????? let time = dayjs().format('YYYY-MM-DD HH:mm:ss');

????? await query(`UPDATE storehouse_goods SET is_out=1, outstock_time='${time}' where id=${val}`);


????? ctx.body = {

??????? code: 1,

??????? data: null,

??????? message: '出庫(kù)成功'

????? }

??? } catch(err) {

????? ctx.body = {

??????? code: -1,

??????? data: null,

??????? message: err.message

????? }

??? }

? });

編輯

圖4-4 商品出庫(kù)界面


4.2.5 查詢界面

相關(guān)代碼如下:

具體操作頁(yè)面如圖4-5所示:

? router.get('/queryorder', async function (ctx, next) {

??? let { token } = ctx.request.header;

??? let { value } = ctx.request.query;


??? try {

????? let userInfo = jwt.verify(token, secret);

????? let reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;

????? let arr = [];

?????

????? // , G.is_out, G.instock_time, G.outstock_time

????? // 如果是手機(jī)號(hào)

????? if (reg_tel.test(value)) {

??????? let customerList = await query(`SELECT id FROM customer WHERE phone='${value}'`);

???

??????? if (customerList.length === 0) throw new Error('沒(méi)有這個(gè)手機(jī)號(hào)的記錄');

??????? // 找到這個(gè)商品

??????? let goodsList = await query(`SELECT G.id, G.name AS 'good_name', A.name AS 'admin_name', C.name AS 'customer_name' FROM goods G, admin_user A, customer C WHERE G.customer_id=${customerList[0].id} AND C.id=${customerList[0].id} AND A.id=G.admin_id`);

???????

??????? if (goodsList.length > 0) {

????????? for (let i=0; i<goodsList.length; i++) {

??????????? let _item = { ...goodsList[i] };

???????????

??????????? let sgList = await query(`SELECT * FROM storehouse_goods WHERE goods_id=${_item.id}`);

??????????? if (sgList.length === 0) throw new Error('沒(méi)有找到此庫(kù)存');

??????????? let storeList = await query(`SELECT * FROM storehouse WHERE id=${sgList[0].storehouse_id}`);

??????????? if (storeList.length === 0) throw new Error('沒(méi)有找到此倉(cāng)庫(kù)');

??????????? // 找這個(gè)倉(cāng)庫(kù)


??????????? _item.store_id = storeList[0].id;

??????????? _item.store_code = storeList[0].name;

??????????? _item.sg_id = sgList[0].id;

??????????? _item.is_out = sgList[0].is_out;

??????????? _item.instock_time = sgList[0].instock_time;

??????????? _item.outstock_time = sgList[0].outstock_time;


??????????? arr.push(_item);

????????? }

?????????

??????? }

??????? console.log(goodsList);

????? } else {

??????? // 使用取件碼查詢

??????? // 1. 查詢庫(kù)存表是否有這個(gè)倉(cāng)庫(kù)

??????? let storeList = await query(`SELECT id, name FROM storehouse WHERE name='${value}'`);

??????? if (storeList.length === 0) throw new Error(`${value}這個(gè)取件碼無(wú)效`);

??????? // 2. 找到這個(gè)庫(kù)存

??????? let sgList = await query(`SELECT * FROM storehouse_goods WHERE storehouse_id=${storeList[0].id}`);

??????? if (sgList.length === 0) throw new Error(`沒(méi)有找到這個(gè)庫(kù)存`);

??????? // 3. 找到這個(gè)商品

??????? let goodsList = await query(`SELECT G.id, G.name AS 'good_name', A.name AS 'admin_name', C.name AS 'customer_name' FROM goods G, admin_user A, customer C WHERE G.id=${sgList[0].id} AND C.id=G.customer_id AND A.id=G.admin_id`);

??????? if (goodsList.length > 0) {

????????? arr.push(goodsList[0]);

????????? arr[0].store_id = storeList[0].id;

????????? arr[0].store_code = storeList[0].name;

????????? arr[0].sg_id = sgList[0].id;

????????? arr[0].is_out = sgList[0].is_out;

????????? arr[0].instock_time = sgList[0].instock_time;

????????? arr[0].outstock_time = sgList[0].outstock_time;

??????? }

????? }


????? ctx.body = {

??????? code: arr.length > 0? 1: -1,

??????? data: arr,

??????? message: arr.length > 0? 'query ok': '沒(méi)有找到指定的庫(kù)存'

????? }

?????

??? } catch(err) {

????? ctx.body = {

??????? code: -1,

??????? data: null,

??????? message: err.message

????? }

??? }

? })

編輯

圖4-5 庫(kù)存查詢頁(yè)面



4.2.6 庫(kù)存異常界面

在常規(guī)的快遞庫(kù)存管理過(guò)程中,不可避免的會(huì)遇到快遞長(zhǎng)期無(wú)人領(lǐng)取,一方面有可能是客戶工作繁忙等原因,也有可能是因?yàn)槟承┰蚩蛻魶](méi)有收到通知短信,導(dǎo)致庫(kù)存長(zhǎng)期被占用。這里有兩個(gè)問(wèn)題:第一、因?yàn)閹?kù)存被占用,不能存放其他快遞;第二、客戶沒(méi)有接收到快遞,降低用戶體驗(yàn),并且有可能造成用戶的經(jīng)濟(jì)損失。基于以上原因,特設(shè)庫(kù)存異常功能,解決此類問(wèn)題,相關(guān)代碼如下:


????? let arr = [];

????? let timeWhere = '';

????? switch (val) {

??????? case '1': // 超時(shí)一周

????????? timeWhere = `instock_time < '${ dayjs(dayjs() - 7*24*60*60*1000).format('YYYY-MM-DD HH:mm:ss') }'`;

????????? break;

??????? case '2': // 超時(shí)3周

????????? timeWhere = `instock_time < '${ dayjs(dayjs() - 3*7*24*60*60*1000).format('YYYY-MM-DD HH:mm:ss') }'`;

????????? break;

??????? case '3': // 超時(shí)一個(gè)月

????????? timeWhere = `instock_time < '${ dayjs(dayjs() - 30*24*60*60*1000).format('YYYY-MM-DD HH:mm:ss') }'`;

????????? break;

??????? case '4': // 超時(shí)三個(gè)月

????????? timeWhere = `instock_time < '${ dayjs(dayjs() - 90*24*60*60*1000).format('YYYY-MM-DD HH:mm:ss') }'`;

????????? break;

??????? case '5': // 超時(shí)一年

????????? timeWhere = `instock_time < '${ dayjs(dayjs() - 365*24*60*60*1000).format('YYYY-MM-DD HH:mm:ss') }'`;

????????? break;

????? }

????? let sgList = await query(`select * from storehouse_goods where is_out<>1 and ${timeWhere}`);

????? for (let i=0; i<sgList.length; i++) {

??????? let item = { ...sgList[i], instock_time: dayjs(sgList[i].instock_time).format('YYYY-MM-DD HH:mm:ss') };

??????? let storeList = await query(`select id, name from storehouse where id=${item.storehouse_id}`);

??????? let goodsList = await query(`select G.id, G.name AS 'good_name', A.name AS 'admin_name', C.name AS 'customer_name' from goods G, admin_user A, customer C where G.id=${item.goods_id} AND C.id=G.customer_id AND A.id=G.admin_id`);

??????? if (goodsList.length > 0) {

????????? item.store_id = storeList[0].id;

????????? item.store_code = storeList[0].name;

????????? item.admin_name = goodsList[0].admin_name;

????????? item.customer_name = goodsList[0].customer_name;

????????? item.good_name = goodsList[0].good_name;

??????? }

??????? arr.push(item);

????? }


具體操作界面如圖4-6所示:


編輯

圖4-6 庫(kù)存異常界面



4.2.7 客戶信息

有些場(chǎng)景我們需要查找客戶信息,比如某一快遞異常,找客戶的手機(jī)號(hào),給客戶發(fā)消息,這時(shí)就需要客戶信息功能界面,可以模糊查詢。


具體代碼如下:


queryWhere = `where name like '%${val}%'`;

let arr = await query(`select * from customer ${queryWhere}`);

arr = arr.map(item => ({ ...item, time: dayjs(item.time).format('YYYY-MM-DD HH-mm-ss') }));


具體界面如圖4-7所示:


編輯


圖4-7 客戶信息界面





四,項(xiàng)目總結(jié)

5.1測(cè)試的目的

系統(tǒng)測(cè)試(System Testing),系統(tǒng)測(cè)試是把已經(jīng)完成的硬件、軟件、外設(shè)、網(wǎng)絡(luò)等所有組成部分結(jié)合在一起,對(duì)整個(gè)系統(tǒng)進(jìn)行單元測(cè)試和總體測(cè)試,通過(guò)與系統(tǒng)的需求做比較,找到所開(kāi)發(fā)的系統(tǒng)與用戶需求之間的差別,進(jìn)而優(yōu)化系統(tǒng)的手段。目前無(wú)論大企業(yè)還是中小企業(yè),都再利用互聯(lián)網(wǎng)進(jìn)行信息的管理和分享,所以一個(gè)軟件系統(tǒng)進(jìn)行系統(tǒng)的測(cè)試和總結(jié),是必要的和必需的,而且通過(guò)測(cè)試工作的進(jìn)行,可以反映出最初沒(méi)有考慮到的細(xì)節(jié)或流程,也有查漏補(bǔ)缺的功能,進(jìn)而提高軟件的質(zhì)量。

5.2測(cè)試的方法

5.2.1 白盒測(cè)試

白盒測(cè)試又被稱為:結(jié)構(gòu)測(cè)試或者叫做邏輯驅(qū)動(dòng)測(cè)試,這是一種需要基于代碼的測(cè)試,白盒是一種形象的比喻,系統(tǒng)程序就像透明盒子一樣,是可以看見(jiàn)的,也就是我們可以系統(tǒng)的各個(gè)模塊是如何運(yùn)行和調(diào)用的。比如:大部分公司首先會(huì)進(jìn)行白盒測(cè)試,也就是按功能模塊系統(tǒng)的對(duì)子模塊進(jìn)行系統(tǒng)的測(cè)試,包括運(yùn)行的異常和文本域或模擬用戶行為創(chuàng)建并不符合系統(tǒng)的輸入,從而建立全面準(zhǔn)確并具有說(shuō)服力了的測(cè)試用例。雖然白盒測(cè)試有很多優(yōu)點(diǎn),但也有幾個(gè)無(wú)法規(guī)避的問(wèn)題,一個(gè)系統(tǒng)程序運(yùn)行會(huì)有很多條類似于tree結(jié)構(gòu)的不同路徑,不可能測(cè)試所有的情況,也為程序不穩(wěn)定埋下了伏筆。

5.2.2 黑盒測(cè)試

黑盒測(cè)試通常也成為數(shù)據(jù)驅(qū)動(dòng)的測(cè)試方法,黑盒顧名思義就是,把系統(tǒng)程序看作看不見(jiàn)的黑盒子,完全不用考慮系統(tǒng)的流程,數(shù)據(jù)的流動(dòng),以及各個(gè)字段的類型。在完全不考慮程序本身的前提下,更多從用戶使用情況或用戶體驗(yàn)出發(fā),測(cè)試每個(gè)模塊是否可以正常穩(wěn)定運(yùn)行,按照程序需求文檔,逐條驗(yàn)證是否可以輸入數(shù)據(jù)而產(chǎn)生預(yù)期的正確結(jié)果,白盒測(cè)試著眼于內(nèi)部,而黑盒子著眼于外部,當(dāng)然這里有一個(gè)弊端,就是黑盒測(cè)試不能系統(tǒng)功能是否設(shè)計(jì)合理等細(xì)節(jié)問(wèn)題。

5.2.3 灰盒測(cè)試

白盒測(cè)試和黑盒測(cè)試都有各自的優(yōu)缺點(diǎn),而灰盒測(cè)試介于黑盒測(cè)試和白盒測(cè)試之間,綜合了各自的優(yōu)點(diǎn),有又規(guī)避了其中的缺點(diǎn),不僅像白盒測(cè)試那樣測(cè)試系統(tǒng)程序內(nèi)部的功能邏輯,還會(huì)重點(diǎn)關(guān)注輸入、輸出的準(zhǔn)確性。比如某個(gè)程序段運(yùn)行時(shí),通過(guò)外部的異常表現(xiàn),轉(zhuǎn)而進(jìn)入程序內(nèi)部,結(jié)合程序內(nèi)部邏輯結(jié)構(gòu)綜合分析,這樣就可以全面的診斷和測(cè)試系統(tǒng)程序。

5.2.4 靜態(tài)測(cè)試

靜態(tài)測(cè)試是比較獨(dú)特,不像其他測(cè)試方法,需要運(yùn)行被測(cè)試的系統(tǒng)程序,靜態(tài)測(cè)試通過(guò)系統(tǒng)的分析程序結(jié)構(gòu),語(yǔ)法,接口規(guī)范,過(guò)程來(lái)檢查程序的手段。

5.2.5 動(dòng)態(tài)測(cè)試

動(dòng)態(tài)測(cè)試是運(yùn)行被測(cè)試的系統(tǒng)程序,分析程序運(yùn)行的結(jié)果和預(yù)期達(dá)到的結(jié)果的差異,并總結(jié)出具體的程序性能指標(biāo),正確率等。


5.3測(cè)試用例

5.3.1 系統(tǒng)登錄功能測(cè)試

系統(tǒng)的測(cè)試是甲方驗(yàn)收的重要的依據(jù),通過(guò)輸入所需信息查看是否和預(yù)期一樣。是否可以完整成功運(yùn)行整個(gè)系統(tǒng)。如表5-1所示


圖5-1 測(cè)試用例



名稱


功能


操作


期望結(jié)果


實(shí)際結(jié)果


測(cè)試狀態(tài)


用戶注冊(cè)


注冊(cè)管理員


輸入用戶名:wxs;


密碼:12345678;


確認(rèn)密碼:12345678


真實(shí)名字:王先生


手機(jī)號(hào):18201107931


注冊(cè)成功


編輯


與期望相同


用戶登錄


管理員登錄


用戶名:wxs;


密碼:12345678


登錄成功


編輯


與期望相同


查詢庫(kù)存


庫(kù)存列表


輸入用戶手機(jī)號(hào):,查詢它的商品快遞


查詢成功


編輯


與期望相同


商品入庫(kù)


商品入庫(kù)


收件人姓名:李先生;


收件人手機(jī)號(hào):18435250911;


商品名稱:小米手環(huán)S1


入庫(kù)成功


編輯


與期望相同


商品出庫(kù)


商品出庫(kù)


輸入庫(kù)存id:6


出庫(kù)成功


編輯


與期望相同


庫(kù)存異常


查詢異常庫(kù)存


選擇超時(shí)一年未取的選項(xiàng)


查詢成功


編輯


與期望相同


客戶信息


客戶信息


輸入用戶姓名


查詢成功


編輯


與期望相同




5.4測(cè)試總結(jié)

時(shí)間不知不覺(jué)程序已經(jīng)測(cè)試完成,雖然功能總體來(lái)說(shuō)比較簡(jiǎn)單,但是通過(guò)自己的雙手一步一步的完成此論文,非常的激動(dòng)。系統(tǒng)總體達(dá)到了總目標(biāo),編碼結(jié)果和測(cè)試結(jié)果完成預(yù)期規(guī)劃,此次測(cè)試從系統(tǒng)的各個(gè)環(huán)節(jié)進(jìn)行了全面測(cè)試,基本達(dá)到系統(tǒng)獨(dú)立應(yīng)用的能力,基本功能已經(jīng)實(shí)現(xiàn)。

通過(guò)測(cè)試,功能更加齊全和穩(wěn)定,在測(cè)試中不斷會(huì)有bug產(chǎn)生,通過(guò)不斷的尋找解決方法,最終完成預(yù)期效果。




前端畢業(yè)設(shè)計(jì):Nodejs+Vue菜鳥(niǎo)驛站倉(cāng)庫(kù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
临海市| 英吉沙县| 曲靖市| 文水县| 丹巴县| 吐鲁番市| 汉阴县| 北碚区| 宿迁市| 栖霞市| 东乌| 昌邑市| 东阿县| 淮北市| 孟连| 嘉祥县| 阿坝| 聊城市| 长乐市| 那坡县| 什邡市| 沙湾县| 洛扎县| 武清区| 奈曼旗| 湖州市| 蕲春县| 乐业县| 普定县| 桐庐县| 枣阳市| 桐乡市| 嵊州市| 安丘市| 石家庄市| 安多县| 新源县| 明水县| 监利县| 襄樊市| 柳河县|