在线观看av毛片亚洲_伊人久久大香线蕉成人综合网_一级片黄色视频播放_日韩免费86av网址_亚洲av理论在线电影网_一区二区国产免费高清在线观看视频_亚洲国产精品久久99人人更爽_精品少妇人妻久久免费

首頁 > 文章中心 > 正文

小議實(shí)現(xiàn)網(wǎng)絡(luò)訂餐系統(tǒng)研究方案

前言:本站為你精心整理了小議實(shí)現(xiàn)網(wǎng)絡(luò)訂餐系統(tǒng)研究方案范文,希望能為你的創(chuàng)作提供參考價(jià)值,我們的客服老師可以幫助你提供個(gè)性化的參考范文,歡迎咨詢。

小議實(shí)現(xiàn)網(wǎng)絡(luò)訂餐系統(tǒng)研究方案

摘要本文對(duì)最新Web應(yīng)用開發(fā)框架RubyOnRails的工作原理做了簡單介紹,討論了構(gòu)建一個(gè)基于ROR的Web應(yīng)用的實(shí)現(xiàn)方法和所用到的技術(shù),并基于ROR開發(fā)了一個(gè)網(wǎng)絡(luò)訂餐系統(tǒng)

關(guān)鍵詞Rails;MVC;訂餐系統(tǒng);Web

1引言

ROR是RubyOnRails的英文簡稱,ROR是指使用Ruby語言實(shí)現(xiàn)的RailsWeb開發(fā)框架。

Ruby是一種功能強(qiáng)大的面向?qū)ο蟮?、解釋型的腳本語言。Ruby語言具有下面幾個(gè)特點(diǎn):語法簡單、純面向?qū)ο笳Z言、提供動(dòng)態(tài)對(duì)象能力、使用單繼承機(jī)制、操作符重載、迭代器和閉包、垃圾回收、錯(cuò)誤處理功能、擁有獨(dú)立于操作系統(tǒng)的線程機(jī)制、可移植性高。

RubyonRails是一個(gè)使用純Ruby語言編寫的、實(shí)現(xiàn)了MVC模型的、易于開發(fā)、配置和管理的Web應(yīng)用程序的框架。Rails的設(shè)計(jì)思想由一組關(guān)鍵的概念來驅(qū)動(dòng):低重復(fù)(DRY)、約定優(yōu)于配置、快速Web開發(fā)框架、對(duì)數(shù)據(jù)庫訪問的支持。

將(模型-視圖-控制器)MVC模型用于軟件設(shè)計(jì)中可以使應(yīng)用程序的構(gòu)造更加清晰。Rails是一個(gè)MVC框架。使用Rails開發(fā)應(yīng)用時(shí),每個(gè)代碼以及應(yīng)用程序的每個(gè)部分都遵循標(biāo)準(zhǔn)的方式。也就是說,是在一個(gè)被事先準(zhǔn)備好的框架內(nèi)開始應(yīng)用程序設(shè)計(jì)的。Rails應(yīng)用程序是由模塊化的、面向?qū)ο蟮哪_本語言Ruby寫成的,這些模塊之間的相互鏈接和關(guān)系驅(qū)動(dòng)著MVC模型的運(yùn)行。

ROR這些特點(diǎn)也使它逐步從一個(gè)開源和個(gè)人的Web開發(fā)框架走向主流,在諸多Web開發(fā)框架中以其鮮明的特色占據(jù)了一席之地。2007年12月6曰,ROR2.0,進(jìn)一步強(qiáng)化了對(duì)企業(yè)應(yīng)用的支持。

2系統(tǒng)分析與設(shè)計(jì)2.1功能描述

基于ROR在開發(fā)應(yīng)用上的諸多優(yōu)勢,本文使用ROR開發(fā)了一個(gè)小型的網(wǎng)絡(luò)訂餐系統(tǒng),根據(jù)客戶要求,該系統(tǒng)應(yīng)具備下列主要功能:

(1)向注冊的客戶提供可預(yù)訂商品的列表和詳細(xì)信息,供客戶選擇。這些信息的維護(hù)由系統(tǒng)管理員進(jìn)行。

(2)向客戶提供一個(gè)訂單提交、瀏覽和處理界面,實(shí)現(xiàn)購物車形式的訂餐功能。

(3)提供用戶資料的管理功能,包括增加、刪除和信息修改。

(4)提供用戶登錄和權(quán)限控制功能,將為普通用戶和系統(tǒng)管理員提供不同的界面。

(5)提供商品和訂單信息的查詢功能、統(tǒng)計(jì)功能和打印功能。

系統(tǒng)選用數(shù)據(jù)庫作為后臺(tái)數(shù)據(jù)庫,運(yùn)行環(huán)境為:Windows2000Server、Ruby1.8.4、Rails1.0、MySQL5.0。

2.2使用ROR實(shí)現(xiàn)訂餐系統(tǒng)的技術(shù)路線

1)將需求模塊化

設(shè)計(jì)中將以遞增式開發(fā)這個(gè)應(yīng)用程序,首先使用Rails立即創(chuàng)建具有一些功能的簡單應(yīng)用myMealOrder。

系統(tǒng)中開始只區(qū)分兩種不同的角色:買方和賣方。買方使用myMealOrder來瀏覽站點(diǎn)可以出售的商品,選擇商品并創(chuàng)建一個(gè)訂單。賣方使用myMealOrder來管理用于出售商品的列表,并等待處理訂單,然后將訂單發(fā)貨。

考慮到用戶需要選擇多項(xiàng)商品,系統(tǒng)中需要有地方保存用戶添加的產(chǎn)品列表的,所以在設(shè)計(jì)中添加了一個(gè)購物車。

2)使用Rails的“支架”

第一個(gè)任務(wù)是創(chuàng)建Web接口來管理系統(tǒng)中的商品信息---包括創(chuàng)建商品信息,編輯現(xiàn)有商品,查看已有的商品信息,刪除不需要的商品。為了實(shí)現(xiàn)以上功能,在數(shù)據(jù)庫中應(yīng)當(dāng)建立幾張表,使用Rails“支架”來自動(dòng)生成最初的代碼,這也是Rails具有敏捷性開發(fā)效率的一個(gè)原因。

Rails“支架”是為管理一個(gè)“模型”而自動(dòng)創(chuàng)建的一個(gè)框架。當(dāng)運(yùn)行“生成器”時(shí),告訴它需要“支架”來生成一個(gè)特殊的“模型”(由“支架”創(chuàng)建的),并且需要通過給定的“控制器”(也是由“支架”創(chuàng)建的)來訪問它。在Rails中,“模型”被自動(dòng)地映射到使用“模型”的類的名字的復(fù)數(shù)形式的數(shù)據(jù)庫表。在應(yīng)用程序中,根據(jù)需要要求有一個(gè)名為good的“模型”,所以Rails將它與叫g(shù)oods的表關(guān)聯(lián)起來。

Rails是如何找到這個(gè)表的呢?在config/database.yml中設(shè)置development條目時(shí),就已經(jīng)告訴Rails在哪兒找數(shù)據(jù)庫的表了。當(dāng)啟動(dòng)應(yīng)用程序時(shí),“模型”檢查數(shù)據(jù)庫內(nèi)的表,處理它要得到的列,然后創(chuàng)建數(shù)據(jù)庫表和Ruby對(duì)象之間的映射。通過“支架”表單“生成器”可以向“模型”要求有關(guān)表的字段信息,然后就使用它找到的字段來創(chuàng)建一個(gè)合適的html表單。

3)使用Rails的“控制器”

“控制器”處理來自瀏覽器的“請(qǐng)求”,一個(gè)應(yīng)用程序可以有多個(gè)“控制器”。對(duì)于本次設(shè)計(jì)的myMealOrder應(yīng)用程序來說,最終會(huì)有四個(gè)“控制器”,一個(gè)用于處理商品資料,一個(gè)用于處理定單信息,一個(gè)用于用戶資料,一個(gè)用于登錄管理。

4)在生成的源碼基礎(chǔ)上根據(jù)需要修改代碼

scaffold工具所生成的Rails“支架”使用Ruby代碼來組裝應(yīng)用程序目錄樹。這個(gè)目錄樹表達(dá)了一個(gè)完整的應(yīng)用程序構(gòu)架—它的內(nèi)部已經(jīng)放置了Ruby代碼;這些都是源代碼,而不是簡單地對(duì)一些標(biāo)準(zhǔn)庫的調(diào)用。這意味著可以修改“支架”內(nèi)產(chǎn)生的代碼,“支架”是作為一個(gè)應(yīng)用程序的起點(diǎn),而不是應(yīng)用程序的終點(diǎn)。開發(fā)者也可以對(duì)“支架”進(jìn)行修改,開發(fā)者依賴于“支架”生成器來產(chǎn)生創(chuàng)建,更新,刪除的功能。然后在保留這個(gè)“動(dòng)作”時(shí)可以替換由生成器生成的行為。有時(shí)候當(dāng)需要一個(gè)快速接口時(shí),并且對(duì)界面要求不高,“支架”就足夠用了。

5)使用Rails的模型繼承

“模型”層是代碼與數(shù)據(jù)庫之間的守護(hù)者,應(yīng)用程序訪問數(shù)據(jù)庫時(shí)沒做任何事,或者將數(shù)據(jù)存回到數(shù)據(jù)庫時(shí)也沒有通過“模型”。那么就把所有的確認(rèn)工作放在模型里;不管數(shù)據(jù)的流向如何都不會(huì)有問題。如果在寫到數(shù)據(jù)庫之前,“模型”檢查它,就可以阻止損壞的數(shù)據(jù)到數(shù)據(jù)庫中。“模型”類的源代碼如下:(在app/models/good.rb內(nèi))

classGood<ActiveRecord::Base

End

看起來這什么都沒做,而數(shù)據(jù)庫映射、創(chuàng)建、更新、搜索等行為都被父類(ActiveRecord::Base,Rails的一部分)完成了。由于繼承的關(guān)系,Good類自然地繼承了所有父類的功能。

6)Rails的動(dòng)態(tài)載入

在編輯完Good.rb文件后并沒有重啟應(yīng)用程序來測試所做的修改——在開發(fā)模式中,Rails會(huì)注意到被修改的文件并重新加載它到應(yīng)用程序中。

7)創(chuàng)建購物車模型

當(dāng)用戶瀏覽訂餐系統(tǒng)的在線分類目錄時(shí),他選擇要購買的商品,系統(tǒng)約定每個(gè)被選擇的產(chǎn)品應(yīng)該被添加到客戶的虛擬購物車中,在有些時(shí)候,顧客會(huì)需要很多東西,并且他會(huì)給訂餐站點(diǎn)付款,為他購物車內(nèi)的商品付款。這意味著應(yīng)用程序?qū)⑿枰3炙蓄櫩瓦x購到購物車內(nèi)的每個(gè)商品。

8)使用session功能

在瀏覽器與應(yīng)用程序之間的協(xié)議是無狀態(tài)的——沒有內(nèi)建的記憶。當(dāng)應(yīng)用程序接受來自瀏覽器的一個(gè)請(qǐng)求時(shí),就如同是第一次被訪問一樣,為了保存客戶已放入購物車中的商品信息,系統(tǒng)在Http“頭”上加上一些有狀態(tài)的事物。應(yīng)用程序內(nèi)的某一層會(huì)試著對(duì)引入的請(qǐng)求,匹配它持有的本地“會(huì)話”數(shù)據(jù)部分。如果“會(huì)話”數(shù)據(jù)的特定部分匹配來自特定瀏覽器的全部請(qǐng)求,系統(tǒng)會(huì)保存使用“會(huì)話”數(shù)據(jù)瀏覽器的顧客買下的所有商品的軌跡。

9)定義數(shù)據(jù)表之間的關(guān)聯(lián)

訂單是一組商品項(xiàng)目,與購買交易的細(xì)節(jié)。假定系統(tǒng)中已經(jīng)有了商品項(xiàng)目,當(dāng)創(chuàng)建新訂單時(shí),它必然要和一個(gè)或多個(gè)商品項(xiàng)目聯(lián)系在一起。在數(shù)據(jù)庫中,這意味著系統(tǒng)需要從line_items(存放購物車中商品的信息)表到orders(訂單)表增加一個(gè)外鍵引用,所以在line_items表中定義外鍵:Constraintfk_items_goodforeignkey(good_id)referencesgood(id),constraintfk_items_orderforeignkey(order_id)referencesorders(id),這告訴數(shù)據(jù)庫外鍵的情況,因?yàn)樵S多數(shù)據(jù)庫都將檢查外鍵約束,以保持代碼的正確性。

10)定義模型之間的關(guān)系

系統(tǒng)中需要告訴Rails一個(gè)訂單有很多商品項(xiàng)目,并且一個(gè)商品項(xiàng)目屬于一個(gè)定單。在app/models目錄下新創(chuàng)建的order.rb(訂單模型)文件,添加一個(gè)對(duì)has_many()的調(diào)用。然后在line_item.rb(購物車信息模型)文件中添加belongs_to()方法的調(diào)用。

11)代碼重用

假設(shè)已經(jīng)有了一個(gè)有效的購物車,再創(chuàng)建一個(gè)新的order對(duì)象用來填充view。注意這個(gè)order還沒有保存到數(shù)據(jù)庫—它只是用view來組裝checkout(訂單信息表單)表單??梢栽赾heckout頁增加購物車內(nèi)容的匯總。因?yàn)橐呀?jīng)有了購物車顯示頁面的代碼,接下來就可以使用Rails的componets來重用購物車的顯示代碼。

2.3網(wǎng)上訂餐系統(tǒng)的具體實(shí)現(xiàn)

1)創(chuàng)建數(shù)據(jù)庫和表

首先在Mysql下創(chuàng)建了數(shù)據(jù)庫mydatabase,接著建立orders表,如圖1所示。

圖1建立orders表

在這里,Rails使用一種命名習(xí)慣,表名都使用復(fù)數(shù)形式。Rails可以識(shí)別這些復(fù)數(shù)表名和控制器、模型、視圖之間的關(guān)系。Id屬于系統(tǒng)在表中查找數(shù)據(jù)所必須的主鍵,是整型,非空且自增的,user_name是用戶的名字,email是用戶的email地址,pay_type是用戶付款的方式,shipped_at是餐廳送出商品的時(shí)間,也就是交易完成的時(shí)間。

接下來修改config目錄下面的database.yml文件,實(shí)現(xiàn)系統(tǒng)功能時(shí)所要修改配置的地方僅此一處。修改后的結(jié)果如下所示:

development:

adapter:mysql

database:mydatabase

username:root

password:root

socket:/path/to/your/mysql.sock

其中development代表當(dāng)前是處于開發(fā)模式中,database:mydatabase代表要連接的數(shù)據(jù)庫名,username和password分別為連接數(shù)據(jù)庫時(shí)所用到的用戶名和密碼?,F(xiàn)在可以測試一下,打開命令行窗口輸入rubyscript/server命令,然后打開瀏覽器,在地址欄中輸入http://localhost:3000/order如圖2所示。

圖2listingorders的顯示結(jié)果

在這里每條記錄的修改、刪除和詳細(xì)信息的顯示功能都有了,而且擁有了新增記錄的功能。同理可以建立如下的幾張表和對(duì)應(yīng)的控制器。經(jīng)過分析,系統(tǒng)現(xiàn)在需要一張商品表,一張用戶表。商品表用來存放網(wǎng)站所擁有的商品,用戶表用來存放本網(wǎng)站的合法使用用戶。按照同樣的步驟創(chuàng)建goods和users表。

goods表中存放原來選擇的食物列表,在設(shè)計(jì)中沒有使用blob類型的字段來存放真正的圖片,如果這樣做數(shù)據(jù)庫的規(guī)模會(huì)非常龐大,隨著圖片上傳的數(shù)量增大,數(shù)據(jù)庫的性能就可能會(huì)直線下降。在表中image_url中存放的是圖片的url地址,這個(gè)字段給ROR提供了一個(gè)圖片地址的映射。當(dāng)視圖文件使用ERB和HTML語言填充頁面時(shí),獲取圖片是通過對(duì)image_url的引用來實(shí)現(xiàn)的。

2)生成應(yīng)用模板

Rails提供了很多的幫助方法和工具,scaffold工具就提供了生成Controller(控制器)、Model(模型)和View(視圖)的功能。

打開命令行窗口,進(jìn)入應(yīng)用程序目錄,在其中輸入rubyscript/generatescaffold控制器名,就會(huì)在views/控制器名目錄下生成views模板,包括new.rhtml、list.rhtml、show.rhtml、edit.rhtml和_form.rhtml五個(gè)視圖文件,分別為數(shù)據(jù)庫表的增刪改查頁面。系統(tǒng)中所用到的模板包括user、order和good三個(gè),為了區(qū)分管理員和用戶的頁面,把good的list視圖又劃分為list_admin.rhtml和list_user.rhtml,然后對(duì)這些視圖文件進(jìn)行編輯修改,來定制自己的模板,_form.rhtml中是定制提取表中數(shù)據(jù)列的格式。

3)商品管理的實(shí)現(xiàn)

圖3是管理員登錄時(shí)的界面。

圖3商品管理頁面

商品管理使用的Good_controller.rb中的部分代碼如下:

classGoodController<ApplicationController

//聲明GoodController繼承//ApplicationController

before_filter:authorize

model:cart//聲明包含cart模型類

attr_reader:name//聲明name屬性為可讀

defindex

@good=Good.avaliable_items

end

defshow_admin//顯示詳細(xì)信息

@good=Good.find(params[:id])

end

defshow_user

@good=Good.find(params[:id])

end

defnew//新建商品項(xiàng)

@good=Good.new

end

defcreate//生成商品記錄

@good=Good.new(params[:good])

if@good.save

flash[:notice]=''''食物記錄已成功創(chuàng)建.''''

redirect_to:action=>''''list_admin''''

else

render:action=>''''new''''

end

end

defedit//編輯商品信息

@good=Good.find(params[:id])

end

defupdate//修改已選中的數(shù)據(jù)

@good=Good.find(params[:id])

if@good.update_attributes(params[:good])

flash[:notice]=''''食物記錄已成功更新.''''

redirect_to:action=>''''show_admin'''',:id=>@good

else

render:action=>''''edit''''

end

end

defdestroy//刪除數(shù)據(jù)

……

4)訂單管理和查詢

管理頁面中的訂單查詢功能分為精確查找和模糊查找,精確查找是使用提交訂單的用戶名和送餐日期進(jìn)行復(fù)合查詢。模糊查找只使用用戶名進(jìn)行查詢。

訂單管理頁面提供該管理員有關(guān)訂單的詳細(xì)信息,送貨時(shí)間顯示完成交易的最終時(shí)間,沒有時(shí)間戳的訂單表示沒有送出商品,管理員只能對(duì)訂單進(jìn)行刪除操作,用戶在結(jié)帳頁面中提交的訂單信息最終會(huì)匯集這里。管理員可以對(duì)待發(fā)送商品的訂單進(jìn)行送貨操作,這時(shí)會(huì)在訂單的送貨時(shí)間列中加上一個(gè)時(shí)間戳。

5)購物車的實(shí)現(xiàn)(略)

3結(jié)論

網(wǎng)絡(luò)訂餐系統(tǒng)的開發(fā)證明,使用ROR來開發(fā)一個(gè)中小型的Web應(yīng)用是非??焖俸捅憬莸?,它和J2EEWeb應(yīng)用開發(fā)框架相比,開發(fā)復(fù)雜程序大大減低,也不用處處使用xml語法來對(duì)應(yīng)用進(jìn)行配置;但ROR基于許多約定和習(xí)慣來生成框架,而且對(duì)數(shù)據(jù)庫設(shè)計(jì)有一些特殊的要求,一旦要在不符合約定和習(xí)慣的舊有系統(tǒng)上進(jìn)行更新設(shè)計(jì),會(huì)使其快速開發(fā)的效率受較大的影響,這是需要ROR后續(xù)版本開發(fā)注意的方面。

參考文獻(xiàn)

[1]宋華,王佐成,汪林林.基于RoR框架的辦公自動(dòng)化系統(tǒng)的設(shè)計(jì)研究,微型電腦應(yīng)用,2007年11期

[2]陳鏘.RubyonRails與Struts在應(yīng)用中的對(duì)比.科技資訊.2007年6期

[3]高昂.面向企業(yè)的RubyonRails.軟件世界.2007年23期

宜兰县| 会昌县| 汕头市| 柳州市| 鄯善县| 临安市| 井研县| 舒城县| 潮安县| 定结县| 工布江达县| 乌拉特中旗| 怀来县| 寿宁县| 当阳市| 营山县| 凤冈县| 灵台县| 乌鲁木齐县| 星座| 西乌| 礼泉县| 正宁县| 腾冲县| 东兴市| 徐水县| 亚东县| 韶山市| 临朐县| 闸北区| 五家渠市| 本溪市| 平南县| 五莲县| 商南县| 罗山县| 河北区| 项城市| 金秀| 桦南县| 钦州市|