進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)_第1頁(yè)
進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)_第2頁(yè)
進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)_第3頁(yè)
進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)_第4頁(yè)
進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本科畢業(yè)論文進(jìn)銷(xiāo)存管理系統(tǒng)權(quán)限管理模塊的設(shè)計(jì)DesignandSimulationofIIRDigitalFilterLUOXiaoSupervisor:LIUPeng-junMarch2021摘要本篇論文主要是對(duì)進(jìn)銷(xiāo)存管理系統(tǒng),庫(kù)存管理和權(quán)限管理模塊的設(shè)計(jì)。使用SQLServer,C++Builder等程序?qū)镜南到y(tǒng)管理的變革,讓系統(tǒng)模塊的使用者更方便,更效率的管理進(jìn)銷(xiāo)存系統(tǒng)。關(guān)鍵詞:進(jìn)銷(xiāo)存管理系統(tǒng);庫(kù)存管理;權(quán)限管理模塊AbstractKeywords:MIS;C++Builder;informationsystem

目錄1前言 12系統(tǒng)的需求分析 22.1系統(tǒng)總體分析 22.2系統(tǒng)的根本功能模塊 22.3系統(tǒng)流程圖 53系統(tǒng)設(shè)計(jì) 63.1系統(tǒng)配置 63.2數(shù)據(jù)庫(kù)設(shè)計(jì) 63.2.1系統(tǒng)數(shù)據(jù)表及其用途 63.2.2創(chuàng)立數(shù)據(jù)庫(kù)及數(shù)據(jù)表 63.3系統(tǒng)模塊的具體設(shè)計(jì) 83.3.1系統(tǒng)主窗體的設(shè)計(jì) 83.3.2訪問(wèn)數(shù)據(jù)模塊的創(chuàng)立 83.3.3登錄功能的完成 93.4庫(kù)存查詢與權(quán)限管理模塊設(shè)計(jì) 164數(shù)據(jù)庫(kù)的平安性及管理 234.1數(shù)據(jù)庫(kù)的平安性 234.2備份和恢復(fù)數(shù)據(jù)庫(kù) 314.2.1數(shù)據(jù)庫(kù)的備份 314.2.2數(shù)據(jù)庫(kù)的恢復(fù) 325源代碼 34參考文獻(xiàn) 41致謝 421前言隨著我國(guó)社會(huì)主義市場(chǎng)經(jīng)濟(jì)體制確實(shí)立和開(kāi)展,商業(yè)流通領(lǐng)域進(jìn)入了一個(gè)空前的開(kāi)展階段,面臨商界的劇烈競(jìng)爭(zhēng),只有在多變的商品和顧客中挖掘并掌握市場(chǎng)需求,即淘汰“賣(mài)不出去的商品〞,購(gòu)進(jìn)“賣(mài)得快、利潤(rùn)高的商品〞的經(jīng)營(yíng)者才會(huì)獲利,企業(yè)也才能在競(jìng)爭(zhēng)中生存和開(kāi)展,如果能夠選擇一個(gè)好的管理系統(tǒng),把大量繁雜的、看似毫無(wú)關(guān)系的數(shù)據(jù),有機(jī)的結(jié)合起來(lái),形象的反映出市場(chǎng)的供求關(guān)系,就能夠?yàn)榈贸稣_的決策做出事半功倍的效果。在過(guò)去,銷(xiāo)售業(yè)的操作一般都靠人工操作,如靠人工登記卡片、填寫(xiě)表格資料,然后根據(jù)不同的分類(lèi)入帳,銷(xiāo)售額的日結(jié)算和每月的盤(pán)點(diǎn)都需花費(fèi)大量的人力和物力來(lái)完成。即使前幾年,有些商家開(kāi)場(chǎng)使用電腦管理,但也只是進(jìn)展一些簡(jiǎn)單的數(shù)據(jù)計(jì)算的操作。這是一項(xiàng)極其繁瑣的工作。通過(guò)人手工計(jì)算不僅容易出錯(cuò),而且不能夠及時(shí)把數(shù)據(jù)之間的關(guān)系形象化表現(xiàn)出來(lái),也就不能夠進(jìn)一步掌握市場(chǎng)的最新動(dòng)態(tài)。而通過(guò)本系統(tǒng)根本可解決以上問(wèn)題,并且能夠方便、靈活地對(duì)數(shù)據(jù)庫(kù)的資料進(jìn)展查詢、統(tǒng)計(jì)、打印等操作,所有這些對(duì)數(shù)據(jù)庫(kù)進(jìn)展的操作都受到管理級(jí)別的限制,確保數(shù)據(jù)的平安性。另外,本系統(tǒng)從實(shí)用性方面考慮,在聯(lián)機(jī)交換數(shù)據(jù)時(shí),盡量使數(shù)據(jù)在必要時(shí)才進(jìn)展傳遞,提高運(yùn)行速度。數(shù)據(jù)庫(kù)技術(shù)是一門(mén)歷史彌堅(jiān)的學(xué)科,不像其它的計(jì)算機(jī)技術(shù)會(huì)隨著時(shí)間的推移而變得越來(lái)越?jīng)]有聲息??紤]其原因,那么是因?yàn)樾畔⒌谋▽?duì)數(shù)據(jù)庫(kù)技術(shù)的要求只增不減。在互聯(lián)網(wǎng)日益開(kāi)展、壯大的背景下,在因特網(wǎng)熱潮不減的情況下,如何讓原來(lái)在單機(jī)中使用的數(shù)據(jù)庫(kù)可供多機(jī)使用,也成了必然的趨勢(shì)。企業(yè)要在競(jìng)爭(zhēng)中求得生存,就應(yīng)使自己的產(chǎn)品資料銷(xiāo)售、管理等方面科學(xué)化,讓更多的人知道自己的產(chǎn)品,這樣才能爭(zhēng)取到更多的銷(xiāo)售渠道。在實(shí)際應(yīng)用中,對(duì)于商品編碼的輸入可采用掃描儀的方式,比擬準(zhǔn)確、方便、快捷,但在本系統(tǒng)中,前臺(tái)銷(xiāo)售操作局部由于缺乏硬件條件,須人手工輸入商品編號(hào),但這對(duì)系統(tǒng)的模擬并無(wú)太大的影響。在實(shí)際的倉(cāng)庫(kù)進(jìn)銷(xiāo)存管理中,普遍使用多機(jī)操作共享同一個(gè)數(shù)據(jù)庫(kù)的管理系統(tǒng)。本論文將詳細(xì)介紹倉(cāng)庫(kù)進(jìn)銷(xiāo)存的模擬管理系統(tǒng)的開(kāi)發(fā)環(huán)境、需求分析、設(shè)計(jì)思想及其強(qiáng)大的功能,使用戶對(duì)本系統(tǒng)有一個(gè)清晰、完整的了解,詳細(xì)介紹了個(gè)別模塊的實(shí)現(xiàn)步驟,并附有參考文獻(xiàn)。

2系統(tǒng)的需求分析系統(tǒng)總體分析我們現(xiàn)已確定系統(tǒng)開(kāi)發(fā)的目標(biāo),系統(tǒng)需求規(guī)格。確定軟件系統(tǒng)的總體構(gòu)造,給出系統(tǒng)中各個(gè)組成模塊見(jiàn)的聯(lián)系。劃分功能模塊,將軟件功能需求分配給所有單元模塊。下一步工作就是在上述結(jié)果根底上,考慮怎樣實(shí)現(xiàn)這個(gè)軟件系統(tǒng)?!?〕系統(tǒng)的功能分析經(jīng)過(guò)我們市場(chǎng)調(diào)研、可行性和系統(tǒng)分析,我組現(xiàn)已總結(jié)出倉(cāng)庫(kù)管理系統(tǒng)的數(shù)據(jù)流程.該系統(tǒng)完成后將具備如下功能:(a)倉(cāng)庫(kù)各種信息的輸入,包括入庫(kù),出庫(kù),復(fù)原,需求信息的輸入等

(b)倉(cāng)庫(kù)管理的各種信息查詢,修改和維護(hù)(c)設(shè)備采購(gòu)報(bào)表的生成在庫(kù)存管理中參加最高儲(chǔ)藏和最低儲(chǔ)藏字段(d)對(duì)倉(cāng)庫(kù)的物質(zhì)設(shè)備實(shí)現(xiàn)監(jiān)控和報(bào)警(e)企業(yè)各個(gè)部門(mén)的物質(zhì)需求管理,操作日志的管理(f)倉(cāng)庫(kù)管理系統(tǒng)的使用幫助本系統(tǒng)的以上功能會(huì)更適合倉(cāng)庫(kù)管理的開(kāi)展情況,將會(huì)給倉(cāng)庫(kù)管理帶來(lái)一種更為科學(xué)的效勞系統(tǒng),是倉(cāng)庫(kù)管理自動(dòng)化的一面新窗口。也將會(huì)是倉(cāng)庫(kù)管理員的好幫手?!?〕系統(tǒng)數(shù)據(jù)分析與描述(a)設(shè)備信息情況描述包括設(shè)備的編號(hào)、名稱、入庫(kù)時(shí)間、供給商、采購(gòu)員、價(jià)格等。(b)工作用戶權(quán)利描述密碼、權(quán)限級(jí)別〔數(shù)值〕。(c)一般用戶權(quán)利描述權(quán)限級(jí)別〔數(shù)值〕經(jīng)過(guò)對(duì)以上數(shù)據(jù)的分析與描述,現(xiàn)在可以知道設(shè)備的各種信息關(guān)系。然后更好的實(shí)現(xiàn)系統(tǒng).?!?〕實(shí)現(xiàn)本系統(tǒng)功能的方法首先要制作一個(gè)倉(cāng)庫(kù)設(shè)備信息的存儲(chǔ)庫(kù),以用來(lái)存儲(chǔ)設(shè)備信息。作為主題工作后臺(tái)。接下來(lái)將要再建立一個(gè)主表,也就是設(shè)備信息表,作為前臺(tái)功能展開(kāi),以完成各方面操作。最后新系統(tǒng)要在友好的界面中,到達(dá)用預(yù)期,并要在良好的可靠性、高速的效率、易使用的目的在平安性和穩(wěn)定性前提下,給用戶們提供各種方便的操作。系統(tǒng)的根本功能模塊一個(gè)進(jìn)銷(xiāo)存管理系統(tǒng)應(yīng)包含以下幾大功能模塊。進(jìn)銷(xiāo)存管理系統(tǒng)進(jìn)銷(xiāo)存管理系統(tǒng)資料管理采購(gòu)管理銷(xiāo)售管理庫(kù)存管理系統(tǒng)管理圖1進(jìn)銷(xiāo)存管理系統(tǒng)構(gòu)造圖〔1〕資料管理模塊企業(yè)經(jīng)營(yíng)的根底資料是一個(gè)企業(yè)最根本和最重要的信息。其中包括商品資料,供貨商資料和客戶資料,脫離了根底資料,進(jìn)銷(xiāo)存系統(tǒng)將無(wú)法運(yùn)行。資料管理用于維護(hù)這些根底資料,它包含的功能字模快為:資料管理資料管理商品資料維護(hù)供貨商資料維護(hù)客戶資料維護(hù)圖2資料管理模塊構(gòu)造圖其中商品資料維護(hù)用于維護(hù)企業(yè)經(jīng)營(yíng)商品的根本信息,內(nèi)容包括貨號(hào),條形碼,品名,拼音編碼,規(guī)格,單位,產(chǎn)地,類(lèi)別,銷(xiāo)售價(jià)1,銷(xiāo)售價(jià)2,最底售價(jià)等。其中拼音編碼是商品名稱的拼音簡(jiǎn)稱,目的是在程序中可以通過(guò)拼音碼方便的查到所需要的產(chǎn)品。供貨商資料維護(hù)用于維護(hù)企業(yè)供貨商的根本信息,內(nèi)容包括供貨商號(hào),拼音編碼,簡(jiǎn)稱,名稱,地址,,,,類(lèi)型,庫(kù)房地址,庫(kù)房,業(yè)務(wù)員,業(yè)務(wù)部門(mén)等??蛻糍Y料維護(hù)用于維護(hù)企業(yè)客戶的根本信息,內(nèi)容包括客戶編號(hào),拼音編碼,簡(jiǎn)稱,名稱,聯(lián)系人,地址,,,開(kāi)戶行,開(kāi)戶行,銀行帳號(hào),業(yè)務(wù)員,業(yè)務(wù)部門(mén),授信額度等?!?〕采購(gòu)管理模塊采購(gòu)管理用于管理企業(yè)的采購(gòu)業(yè)務(wù),我們所做的系統(tǒng)中它主要有進(jìn)貨單功能子模塊。進(jìn)貨單用于錄入企業(yè)的進(jìn)貨單,它分為主從兩張表,主表進(jìn)貨單內(nèi)容包括編號(hào),供貨商號(hào),進(jìn)貨日期,業(yè)務(wù)員,制單人,驗(yàn)收員,保管員,稅額,訂單號(hào)等,從表進(jìn)貨單明細(xì)內(nèi)容包括編號(hào),進(jìn)貨單號(hào),貨號(hào),進(jìn)貨數(shù)量,進(jìn)價(jià),稅價(jià)合計(jì),不含稅價(jià),稅額,倉(cāng)庫(kù),貨物質(zhì)量等。根據(jù)企業(yè)的規(guī)模和管理方法,可以直接做進(jìn)貨單而不用做采購(gòu)訂單,但對(duì)于較大規(guī)模的企業(yè),一般采購(gòu)部門(mén)和庫(kù)房部門(mén)是分開(kāi)的,由采購(gòu)部門(mén)填寫(xiě)采購(gòu)訂單,貨物運(yùn)輸?shù)綆?kù)房后由庫(kù)房驗(yàn)收人員填寫(xiě)進(jìn)貨單。填寫(xiě)進(jìn)貨單后商品的庫(kù)存才會(huì)增加并產(chǎn)生應(yīng)付款?!?〕銷(xiāo)售管理模塊銷(xiāo)售管理用于管理企業(yè)的銷(xiāo)售業(yè)務(wù),我們做的系統(tǒng)它主要包含銷(xiāo)售單功能子模塊。銷(xiāo)售單用于錄入企業(yè)的銷(xiāo)售單,主表銷(xiāo)售單內(nèi)容包括編號(hào),客戶編號(hào),銷(xiāo)售日期,業(yè)務(wù)員,制單人,保管員,稅價(jià)合計(jì),不含稅價(jià),稅額,訂單號(hào)等,從表銷(xiāo)售單明細(xì)內(nèi)容包括編號(hào),銷(xiāo)售單號(hào),貨號(hào),銷(xiāo)售數(shù)量,銷(xiāo)售價(jià),稅價(jià)合計(jì),不含稅價(jià),稅額,倉(cāng)庫(kù)等?!?〕庫(kù)存管理模塊庫(kù)存操作由倉(cāng)庫(kù)管理員執(zhí)行,就是把產(chǎn)品放入倉(cāng)庫(kù)或把產(chǎn)品從倉(cāng)庫(kù)中取出的操作,用專業(yè)術(shù)語(yǔ)來(lái)描述就是入庫(kù)和出庫(kù)。庫(kù)存操作管理模塊可以實(shí)現(xiàn)入庫(kù)管理、出庫(kù)管理和庫(kù)存盤(pán)店等功能。入庫(kù)可以分為采購(gòu)入庫(kù)、生產(chǎn)庫(kù)存、退貨入庫(kù)、退料入庫(kù)等情況。(a)采購(gòu)入庫(kù)指將從供給商處采購(gòu)的產(chǎn)品入庫(kù);(b)生產(chǎn)入庫(kù)指將企業(yè)自己生產(chǎn)的產(chǎn)品入庫(kù);(c)退貨入庫(kù)指售出的產(chǎn)品退貨后,將退貨產(chǎn)品入庫(kù);(d)退料入庫(kù)指用于本企業(yè)生產(chǎn)的原材料出庫(kù)后沒(méi)有完全使用,退回倉(cāng)庫(kù)。入庫(kù)操作需要記錄相關(guān)的產(chǎn)品信息、倉(cāng)庫(kù)信息、客戶信息、經(jīng)辦人、涉及金額和入庫(kù)時(shí)間等信息;〔5〕出庫(kù)操作可以分為銷(xiāo)售出庫(kù)、退貨出庫(kù)、用料出庫(kù)等情況。出庫(kù)操作需要記錄相關(guān)的產(chǎn)品信息、倉(cāng)庫(kù)信息、客戶信息、經(jīng)辦人、涉及金額和出庫(kù)時(shí)間等信息。庫(kù)存盤(pán)點(diǎn)是指對(duì)庫(kù)存產(chǎn)品進(jìn)展整理,糾正不準(zhǔn)確的庫(kù)存數(shù)據(jù)。由于人為操作等原因,系統(tǒng)中的庫(kù)存數(shù)據(jù)與實(shí)際數(shù)據(jù)之間可能會(huì)存在誤差。所以沒(méi)隔一段時(shí)間就需要對(duì)庫(kù)存進(jìn)展盤(pán)點(diǎn),從而保證庫(kù)存數(shù)據(jù)的準(zhǔn)確,庫(kù)存查詢用于查詢企業(yè)商品的庫(kù)存,可以查詢總庫(kù)存和分倉(cāng)庫(kù)庫(kù)存?!?〕系統(tǒng)管理模塊系統(tǒng)管理是每個(gè)系統(tǒng)都必須具備的功能,包括的功能子模塊如下:系統(tǒng)管理系統(tǒng)管理權(quán)限設(shè)置數(shù)據(jù)備份數(shù)據(jù)恢復(fù)圖3系統(tǒng)管理構(gòu)造圖權(quán)限設(shè)置用于設(shè)置各操作員使用系統(tǒng)操作的權(quán)限,為了方便設(shè)置,一般的應(yīng)用系統(tǒng)都可以將操作人員分組的,將通用的權(quán)限賦予整個(gè)組,個(gè)別的權(quán)限單獨(dú)賦予個(gè)人,這樣可以大大減少權(quán)限管理的工作量。數(shù)據(jù)備份用于備份系統(tǒng)數(shù)據(jù)庫(kù)。數(shù)據(jù)恢復(fù)用于恢復(fù)系統(tǒng)數(shù)據(jù)庫(kù)。系統(tǒng)流程圖供貨商供貨商庫(kù)存庫(kù)客戶應(yīng)付款應(yīng)收款進(jìn)貨單銷(xiāo)售單增加庫(kù)存減少庫(kù)存產(chǎn)生應(yīng)收款產(chǎn)生應(yīng)付款圖4進(jìn)銷(xiāo)存管理系統(tǒng)流程圖

3系統(tǒng)設(shè)計(jì)系統(tǒng)配置系統(tǒng)的使用環(huán)境:硬件環(huán)境:Pentium=4\*ROMANIV或同檔次以上微機(jī);32MB以上內(nèi)存或更高;4.2G以上硬盤(pán);打印機(jī)一臺(tái)。軟件環(huán)境:中文WINDOWS/2000操作系統(tǒng)。數(shù)據(jù)庫(kù)設(shè)計(jì)系統(tǒng)數(shù)據(jù)表及其用途表1系統(tǒng)數(shù)據(jù)表數(shù)據(jù)表名稱數(shù)據(jù)表用途用戶清單保存系統(tǒng)使用者的信息權(quán)限清單保存系統(tǒng)使用者的權(quán)限信息商品清單保存企業(yè)經(jīng)營(yíng)商品的資料信息供貨商清單保存企業(yè)供貨商的信息客戶清單保存企業(yè)客戶的資料信息倉(cāng)庫(kù)清單保存企業(yè)庫(kù)房的分類(lèi)信息業(yè)務(wù)員清單保存企業(yè)的業(yè)務(wù)員信息進(jìn)貨單進(jìn)貨單主表進(jìn)貨單明細(xì)進(jìn)貨單從表進(jìn)貨單歷史保存進(jìn)貨單歷史進(jìn)貨單明細(xì)歷史保存進(jìn)貨單明細(xì)歷史銷(xiāo)售單銷(xiāo)售單主表銷(xiāo)售單明細(xì)銷(xiāo)售單從表銷(xiāo)售單歷史保存銷(xiāo)售單歷史銷(xiāo)售單明細(xì)歷史保存銷(xiāo)售單明細(xì)歷史庫(kù)存單保存企業(yè)商品庫(kù)存的數(shù)量、金額等應(yīng)付款、應(yīng)收款保存企業(yè)應(yīng)付款明細(xì)、應(yīng)收款明細(xì)創(chuàng)立數(shù)據(jù)庫(kù)及數(shù)據(jù)表數(shù)據(jù)庫(kù)的創(chuàng)立比擬簡(jiǎn)單。翻開(kāi)SQLServer2000企業(yè)管理器,新建一個(gè)數(shù)據(jù)庫(kù),名稱為jxc。表的創(chuàng)立有兩種方式:第一個(gè)是利用SQLServer2000的查詢分析器翻開(kāi)建庫(kù)的腳本,直接運(yùn)行它,系統(tǒng)的相關(guān)元素就可以自動(dòng)建立起來(lái)。第二個(gè)是進(jìn)入新建的數(shù)據(jù)庫(kù)jxc,利用設(shè)計(jì)表這一功能來(lái)創(chuàng)立表。數(shù)據(jù)表的創(chuàng)立如下:CREATTABLE[dbo].[商品清單]〔[貨號(hào)][char](14)NOTNULLPrimaryKey,[條碼][char](14)NULL,[品名][varchar](80)NULL,[規(guī)格][varchar](40)NULL,[單位][char](6)NOTNULL,[產(chǎn)地][varchar](50)NULL,[類(lèi)別][char](20)NULL,[進(jìn)貨價(jià)][decimal](9)NULLdefault(0),[銷(xiāo)售價(jià)1][decimal](9)NULLdefault(0),[銷(xiāo)售價(jià)2][decimal](9)NULLdefault(0),CREATTABLE[dbo].[庫(kù)存庫(kù)]〔[貨號(hào)][char](14)NOTNULL,[倉(cāng)庫(kù)][varchar](20)NOTNULL,[庫(kù)存數(shù)量][decial](28,6)NOTNULL,[庫(kù)存金額][decial](28,6)NOTNULL,[庫(kù)存單價(jià)][decial](28,6)NOTNULL,[最新進(jìn)價(jià)][decial](28,6)NOTNULL,CREATTABLE[dbo].[權(quán)限清單]〔[權(quán)限序號(hào)][int]IDENTIYY(1,1)NOTNULL,[用戶編號(hào)][char](6)NULL,[部門(mén)][char](20)NULL,[權(quán)限名稱][char](6)NOTNULL系統(tǒng)模塊的具體設(shè)計(jì)系統(tǒng)主窗體的設(shè)計(jì)利用系統(tǒng)默認(rèn)生成的窗體作為主窗體,并為其添加一個(gè)主菜單〔MainMenu〕控件,布局如圖:圖5進(jìn)銷(xiāo)存管理系統(tǒng)主界面訪問(wèn)數(shù)據(jù)模塊的創(chuàng)立因?yàn)楦鱾€(gè)窗體均需要對(duì)數(shù)據(jù)庫(kù)進(jìn)展訪問(wèn),我們可以把與數(shù)據(jù)庫(kù)進(jìn)展連接的控件放置到一個(gè)數(shù)據(jù)訪問(wèn)模塊中,這樣所有的窗體都可以共享來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。〔1〕在ODBC中添加一個(gè)驅(qū)動(dòng)程序?yàn)镾QLServer的系統(tǒng)DNS數(shù)據(jù)源指向前面創(chuàng)的jxc數(shù)據(jù)庫(kù),名稱為“jxclink〞。〔2〕在C++Bilder的BDEAdministrator工具中新建一個(gè)BDE數(shù)據(jù)源,名稱為“jxclink〞,Type屬性為“SQLServer〞,ODBCDNS屬性為〞jxclink〞?!?〕在C++Builder中選擇Module菜單命令,生成一個(gè)數(shù)據(jù)模塊并保存為“〞文件?!?〕為數(shù)據(jù)模塊添加一個(gè)Database控件,控件的屬性設(shè)置如下所示,這樣在其他窗體中就可以直接使用Query和Table控件來(lái)訪問(wèn)數(shù)據(jù)了。表2數(shù)據(jù)庫(kù)表控件名屬性取值Database1NameDatabase1Database1AliasNamejxclinkDatabase1DatabaseNamedbDatabase1LoginPromptfalse登錄功能的完成用戶在輸入“用戶號(hào)〞和“密碼〞之后,系統(tǒng)對(duì)用戶的輸入進(jìn)展確認(rèn),并記錄登錄用戶的姓名和用戶號(hào),供系統(tǒng)使用〔權(quán)限管理、制單人指定等〕。設(shè)計(jì)步驟如下:登錄界面如圖6:圖6管理員登錄模塊界面〔1〕選擇NewForm菜單命令,新建一個(gè)窗體,將其N(xiāo)ame屬性改為“fmLogin〞,并為其添加以下控件:為fmMain和fmLogin兩個(gè)窗體〔Main.h和Login.h〕分別添加如下兩個(gè)公有變量。Public://UserdeclarationsAnsiStringm_szUserCode;//此變量?jī)蓚€(gè)窗體都有AnsiStringm_szUserName;//此變量?jī)蓚€(gè)窗體都有AnsiStringm_szPassWord;//此變量為fmLogin窗體特有為fmMain窗體的Create事件的響應(yīng)函數(shù)中添加如下代碼,完成顯示登錄窗體的功能,需要注意的是在fmMain窗體的cpp文件中要有“〞的包含語(yǔ)句。Void_fastcallTfmMain::FormCreat(Tobject*Sender)TfmLogin*pForm=newTfmLogin(Application);PForm->ShowModal();If(pForm->m_szUserCode.IsEmpty())//取消了,退出程序{Application->terminate();else{m_szUserCode=pForm->m_szUserCode;m_szUserName=pForm->m_szUserName;deletepForm;〔2〕將jxc.cpp文件中的下面兩行代碼的順序交換,否那么運(yùn)行會(huì)出現(xiàn)錯(cuò)誤,我們必須首先建立數(shù)據(jù)訪問(wèn)模塊才能使用它。Application->CreateForm(_classid(TfmMain,&fmMain);Application->CreateForm(_classid(TdataModule1),&DataModule1);(3)為fmLogin窗體添加如下事件響應(yīng)函數(shù)代碼,完成密碼認(rèn)證功能。void__fastcallTfmLogin::edUserCodeExit(TObject*Sender)if(edUserCode->Text.IsEmpty())return;TQuery*pQuery=newTQuery(NULL);pQuery->DatabaseName="db";AnsiStringsql;sql="select姓名,密碼from用戶清單where用戶編號(hào)='"+edUserCode->Text+"'";pQuery->SQL->Add(sql);pQuery->Open();TField*pField=pQuery->FieldByName("姓名");if(pField->IsNull)//不存在該用戶edUserCode->Text="";edUserName->Text="";edPassword->Text="";edUserCode->SetFocus();else//顯示用戶名edUserName->Text=pField->AsString;m_szUserCode=edUserCode->Text;m_szUserName=pField->AsString;m_szPassword=pQuery->FieldByName("密碼")->AsString;//釋放空間deletepQuery;void__fastcallTfmLogin::edUserCodeKeyPress(TObject*Sender,char&Key)if(Key==13)edPassword->SetFocus();void__fastcallTfmLogin::btLoginClick(TObject*Sender)if(!m_szUserName.IsEmpty()&&m_szPassword==edPassword->Text)//密碼正確this->Close();else//密碼錯(cuò)誤edPassword->Text="";edPassword->SetFocus();void__fastcallTfmLogin::btExitClick(TObject*Sender)m_szUserCode="";m_szUserName="";m_szPassword="";this->Close();void__fastcallTfmLogin::edPasswordKeyPress(TObject*Sender,char&Key)if(Key==13)btLoginClick(NULL);至此,我已經(jīng)完成了用戶登錄的功能。系統(tǒng)首先要求用戶輸入用戶號(hào)和密碼,并與用戶清單中的信息進(jìn)展比照,認(rèn)證通過(guò)后在可以進(jìn)入系統(tǒng)。Login.h文件原代碼如下:#ifndefloginH#defineloginH#include<Classes.hpp>#include<Controls.hpp>#include<StdCtrls.hpp>#include<Forms.hpp>#include<DB.hpp>#include<DBTables.hpp>classTfmLogin:publicTForm__published: //IDE-managedComponentsTLabel*Label1;TLabel*Label2;TLabel*Label3;TEdit*edUserCode;TEdit*edUserName;TEdit*edPassword;TButton*btLogin;TButton*btExit;TLabel*Label4;void__fastcalledUserCodeExit(TObject*Sender);void__fastcalledUserCodeKeyPress(TObject*Sender,char&Key);void__fastcallbtLoginClick(TObject*Sender);void__fastcallbtExitClick(TObject*Sender);void__fastcalledPasswordKeyPress(TObject*Sender,char&Key);private: //Userdeclarationspublic: //Userdeclarations__fastcallTfmLogin(TComponent*Owner);AnsiStringm_szUserCode;AnsiStringm_szUserName;AnsiStringm_szPassword;externPACKAGETfmLogin*fmLogin;#endifLogin.cpp文件原代碼如下:#include<vcl.h>#pragmahdrstop#include"login.h"#pragmapackage(smart_init)#pragmaresource"*.dfm"TfmLogin*fmLogin;__fastcallTfmLogin::TfmLogin(TComponent*Owner):TForm(Owner)void__fastcallTfmLogin::edUserCodeExit(TObject*Sender)if(edUserCode->Text.IsEmpty())return;TQuery*pQuery=newTQuery(NULL);pQuery->DatabaseName="db";AnsiStringsql;sql="select姓名,密碼from用戶清單where用戶編號(hào)='"+edUserCode->Text+"'";pQuery->SQL->Add(sql);pQuery->Open();TField*pField=pQuery->FieldByName("姓名");if(pField->IsNull)//不存在該用戶edUserCode->Text="";edUserName->Text="";edPassword->Text="";edUserCode->SetFocus();else//顯示用戶名edUserName->Text=pField->AsString;m_szUserCode=edUserCode->Text;m_szUserName=pField->AsString;m_szPassword=pQuery->FieldByName("密碼")->AsString;//釋放空間deletepQuery;void__fastcallTfmLogin::edUserCodeKeyPress(TObject*Sender,char&Key)if(Key==13)edPassword->SetFocus();void__fastcallTfmLogin::btLoginClick(TObject*Sender)if(!m_szUserName.IsEmpty()&&m_szPassword==edPassword->Text)//密碼正確this->Close();else//密碼錯(cuò)誤edPassword->Text="";edPassword->SetFocus();void__fastcallTfmLogin::btExitClick(TObject*Sender)m_szUserCode="";m_szUserName="";m_szPassword="";this->Close();void__fastcallTfmLogin::edPasswordKeyPress(TObject*Sender,char&Key)if(Key==13)btLoginClick(NULL);庫(kù)存查詢與權(quán)限管理模塊設(shè)計(jì)庫(kù)存查詢功能用于查詢商品的庫(kù)存信息,只能查詢,不可以修改?!?〕選擇New/Form菜單命令,新建一個(gè)窗體,將其N(xiāo)ame屬性改為“fmStoreQuery〞,并為其添加如下圖的控件。選擇Project/Options…菜單命令,將fmStoreQuery窗體從自動(dòng)創(chuàng)立的窗體列表中刪除?!?〕窗體中的DBGrid控件,Query控件和DateSource控件的屬性設(shè)置和選擇倉(cāng)庫(kù)窗體一致.Query控件的SQL屬性設(shè)置為“selecta.貨號(hào),b.品名,拼音編碼,單位,倉(cāng)庫(kù),庫(kù)存數(shù)量,庫(kù)存單價(jià),庫(kù)存金額from庫(kù)存庫(kù)asa,商品清單asbwherea.貨號(hào)=b.貨號(hào)〞。圖7庫(kù)存查詢及權(quán)限管理模塊圖〔3〕為窗體添加如下查詢代碼,完成庫(kù)存查詢功能。Void_fastcallTfmstoreQuery::FormCreate(Tobject*Sender)//初始化倉(cāng)庫(kù)下拉選項(xiàng)TQuery*pQuery=newTquery(NULL);PQuery->DatebaseName=〞db〞;PQuery->SQL->Clear();PQuery->SQL->Add(“select倉(cāng)庫(kù)名from倉(cāng)庫(kù)清單“);PQuery->Open();While(!pQuery->Eof)cbostore->Items->Add(pQuery->FieldByName(“倉(cāng)庫(kù)名“)->AsString);pQuery->Next();pQuery->Close();deletepQuery;cboStore->Text=“〞;edGoodcode->TextedGoodPY->Text="";void__fastcallTfmStoreQuery::btQueryClick(TObject*Sender)Query1->Filtered=false;//設(shè)置Query控件的filter屬性可以起到查詢條件的作用AnsiStringszCon;if(edGoodCode->Text.Length()>0)szCon="貨號(hào)='"+edGoodCode->Text+"'";if(edGoodPY->Text.Length()>0)if(szCon.Length()>0)szCon+="and拼音編碼like'%"+edGoodPY->Text+"%'";elseszCon="拼音編碼like'%"+edGoodPY->Text+"%'";if(cboStore->Text.Length()>0)if(szCon.Length()>0)szCon+="and倉(cāng)庫(kù)='"+cboStore->Text+"'";elseszCon="倉(cāng)庫(kù)='"+cboStore->Text+"'";Query1->Filter=szCon;Query1->Filtered=true;權(quán)限管理是每一個(gè)應(yīng)用系統(tǒng)必須具備的功能,以下為完成權(quán)限管理功能的過(guò)程?!?〕選擇New/Form菜單命令,新建一個(gè)窗體,將其N(xiāo)ame屬性該為“fmRightManage〞,并為其添加如下圖的控件。選擇Project/Options…菜單命令,將fmRightManage窗體從自動(dòng)創(chuàng)立的窗體列表中刪除。圖8權(quán)限管理模塊界面圖〔2〕各控件屬性設(shè)置如表所示:表3權(quán)限管理數(shù)據(jù)信息表控件類(lèi)型對(duì)象名屬性取值〔說(shuō)明〕QueryQuery1DatabaseNamedbTableTable1DatabaseNamedbTableTable1TableName用戶清單TableTable1ActivetrueDataSourceDataSource1DataSetTable1DataSourceDataSource1AutoEditfalseDBGridDBGrid1DataSourceDataSource1DBGridDBGrid1Options\dgEditingfalseDBGridDBGrid1Options\dgRowSelecttrueCheckListBoxCheckListBox1Items權(quán)限管理窗體〔3〕完成窗體的設(shè)計(jì)后,為窗體添加如下代碼,實(shí)現(xiàn)設(shè)置權(quán)限的功能。void__fastcallTfmRightManage::FormClose(TObject*Sender,TCloseAction&Action)//刪除窗體并回收空間Action=caFree;void__fastcallTfmRightManage::Table1AfterScroll(TDataSet*DataSet)//先去除所有的權(quán)限標(biāo)志for(inti=0;i<CheckListBox1->Items->Count;i++)CheckListBox1->Checked[i]=false;//根據(jù)選擇的用戶設(shè)置權(quán)限標(biāo)志Query1->Close();Query1->SQL->Clear();Query1->SQL->Add("select權(quán)限名稱from權(quán)限清單where用戶編號(hào)='"+Table1->FieldByName("用戶編號(hào)")->AsString+"'");Query1->Open();while(!Query1->Eof)AnsiStringszFunName=Query1->FieldByName("權(quán)限名稱")->AsString;CheckListBox1->Checked[CheckListBox1->Items->IndexOf(szFunName)]=true;Query1->Next();//選擇或去除功能權(quán)限,修改數(shù)據(jù)庫(kù)權(quán)限清單表void__fastcallTfmRightManage::CheckListBox1ClickCheck(TObject*Sender)//沒(méi)有選擇用戶,退出函數(shù)if(!Table1->FieldByName("用戶編號(hào)"))return;//循環(huán)判斷Query1->Close();Query1->SQL->Clear();AnsiStringsql;//不管沒(méi)有選中,先全部刪除,再根據(jù)選擇的情況插入sql="deletefrom權(quán)限清單where用戶編號(hào)='";sql+=Table1->FieldByName("用戶編號(hào)")->AsString+"'";Query1->SQL->Add(sql);for(inti=0;i<CheckListBox1->Items->Count;i++)if(CheckListBox1->Checked[i])//選中權(quán)限,權(quán)限清單中插入一條sql="insertinto權(quán)限清單(用戶編號(hào),權(quán)限名稱)values('";sql+=Table1->FieldByName("用戶編號(hào)")->AsString+"','";sql+=CheckListBox1->Items->Strings[i]+"')";Query1->SQL->Add(sql);Query1->ExecSQL();Query1->Close();到此我們完成了權(quán)限管理的功能,在主窗體中添加權(quán)限管理菜單的響應(yīng)函數(shù)即可運(yùn)行程序查看結(jié)果,如下圖。選擇一個(gè)用戶可以對(duì)其進(jìn)展權(quán)限設(shè)置,賦予的權(quán)限在功能模塊左邊打勾即可。上面我們只是完成了權(quán)限設(shè)置的功能,程序中還要控制用戶登錄系統(tǒng)后將該用戶不具備的功能菜單變成灰色的不可操作菜單,從而控制用戶的操作權(quán)限?!?〕在fmMain主窗體的Create事件響應(yīng)函數(shù)中添加如下代碼,屏蔽用戶不可操作的功能菜單。void__fastcallTfmMain::FormCreate(TObject*Sender)TfmLogin*pForm=newTfmLogin(Application);pForm->ShowModal();if(pForm->m_szUserCode.IsEmpty())//取消了,退出程序Application->Terminate();elsem_szUserCode=pForm->m_szUserCode;m_szUserName=pForm->m_szUserName;StatusBar1->Panels->Items[1]->Text=m_szUserName;deletepForm;//設(shè)置功能菜單的狀態(tài),屏蔽用戶不可操作的功能//如果是系統(tǒng)管理員登錄,那么不設(shè)置if(m_szUserCode="1")return;TQuery*pQuery=newTQuery(NULL);pQuery->DatabaseName="db";pQuery->SQL->Add("select權(quán)限名稱from權(quán)限清單where用戶編號(hào)='"+m_szUserCode+"'");pQuery->Open();TStringList*plst=newTStringList();while(!pQuery->Eof)plst->Add(pQuery->FieldByName("權(quán)限名稱")->AsString);pQuery->Next();for(intj=0;j<MainMenu1->Items->Count;j++)TMenuItem*pItem=MainMenu1->Items->Items[j];for(inti=0;i<pItem->Count;i++)TMenuItem*pSubItem=pItem->Items[i];if(pSubItem->Count==0&&plst->IndexOf(pSubItem->Caption)<=0)pSubItem->Enabled=false;deletepQuery;deleteplst;自此我們根本完成了這個(gè)制作,我們可以運(yùn)行程序進(jìn)展各種操作,檢查程序的穩(wěn)定性,也可以嘗試增加其他功能。我們可以使用其他用戶來(lái)登錄,比方使用一同學(xué)來(lái)登錄,按照前面賦予該同學(xué)的權(quán)限,登錄后系統(tǒng)如下圖,該同學(xué)沒(méi)有操作權(quán)限的功能被屏蔽了。

4數(shù)據(jù)庫(kù)的平安性及管理數(shù)據(jù)庫(kù)的平安性平安性管理是數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)重要組成局部。平安性就是確保只有授權(quán)的用戶才能使用數(shù)據(jù)庫(kù)中的數(shù)據(jù)和執(zhí)行相應(yīng)的操作,它包括兩方面的內(nèi)容,一是用戶能否登錄系統(tǒng)和如何登錄的管理,二是用戶能否使用數(shù)據(jù)庫(kù)中的對(duì)象和執(zhí)行相應(yīng)的操作管理。MicrosoftSQLServer2000系統(tǒng)提供了一套完整的平安機(jī)制,這些機(jī)制包括選擇認(rèn)證模式和認(rèn)證進(jìn)程.登錄賬戶管理.數(shù)據(jù)庫(kù)用戶賬戶管理.角色管理.許可管理等內(nèi)容。用戶在使用MicrosoftSQLServer系統(tǒng)前,必須通過(guò)系統(tǒng)的認(rèn)證進(jìn)程。認(rèn)證模式就是設(shè)置系統(tǒng)的認(rèn)證進(jìn)程的方式。認(rèn)證進(jìn)程就是指當(dāng)用戶訪問(wèn)數(shù)據(jù)庫(kù)時(shí),系統(tǒng)對(duì)用戶的賬戶和口令確實(shí)認(rèn)過(guò)程。認(rèn)證內(nèi)容包括確認(rèn)用戶的賬戶是否有效,是否能訪問(wèn)系統(tǒng),能訪問(wèn)系統(tǒng)中的哪些數(shù)據(jù)等。認(rèn)證模式就是指系統(tǒng)選擇何種認(rèn)證進(jìn)程確認(rèn)用戶是否為合法的方式。用戶必須使用一個(gè)Login賬戶,才能連接到SOLSever系統(tǒng)中。SOLSever系統(tǒng)通過(guò)Windows認(rèn)證進(jìn)程來(lái)確認(rèn)用戶的身份。使用Windows認(rèn)證進(jìn)程時(shí),由Windows系統(tǒng)確認(rèn)用戶的Login賬戶,這些Windows系統(tǒng)的Login賬戶可以直接訪問(wèn)SOLSever系統(tǒng)的數(shù)據(jù),不必提供SOLSever的Login賬戶和口令。在SOLSever系統(tǒng)中,把網(wǎng)絡(luò)協(xié)議Namedpipes和TCP/IP稱為信任協(xié)議。如果在一個(gè)網(wǎng)絡(luò)環(huán)境中,連接客戶機(jī)和效勞器的所有通訊協(xié)議都是信任連接協(xié)議,那么應(yīng)該采用Windows認(rèn)證模式。在Windows認(rèn)證模式下,系統(tǒng)只是采用Windows認(rèn)證進(jìn)程來(lái)確認(rèn)用戶的身份,那些通過(guò)非信任連接協(xié)議連接效勞器的客戶機(jī)不能訪問(wèn)SOLSever系統(tǒng)。Windows認(rèn)證進(jìn)程具有以下優(yōu)點(diǎn):提供了更多的功能,例如平安確認(rèn)和口令加密,審計(jì),口令失效,最小口令長(zhǎng)度和賬戶鎖定。允許用戶迅速訪問(wèn)SOLSever系統(tǒng),而不必使用另外一個(gè)登錄賬戶和口令。SOLSever系統(tǒng)通過(guò)以下方式處理Windows認(rèn)證模式中的Login賬戶:〔1〕當(dāng)用戶連接SOLSever系統(tǒng)時(shí),客戶機(jī)翻開(kāi)一個(gè)到SOLSever系統(tǒng)的信任連接。該信任連接傳送Windows組或用戶的Login賬戶到SOLSever系統(tǒng)中。因?yàn)榭蛻魴C(jī)翻開(kāi)了一個(gè)信任連接,所以SOLSever系統(tǒng)已經(jīng)確認(rèn)該用戶的Login賬戶有效。〔2〕如果SOLSever系統(tǒng)在syslogins系統(tǒng)表中的SOLSever用戶列表中找到該用戶的Login賬戶,那么就承受這次認(rèn)證連接。這時(shí),SOLSever系統(tǒng)不需要重新驗(yàn)證口令是否有效,因?yàn)閃indows系統(tǒng)已經(jīng)驗(yàn)證該用戶的口令是否有效的?!?〕在這種情況下,該用戶的Login賬戶即可以是Windows的用戶賬戶,也可以是Windows的組賬戶。當(dāng)然,這些賬戶都是作為SOLSever系統(tǒng)的Login賬戶已經(jīng)定義了?!?〕如果多個(gè)SOLSever系統(tǒng)在一個(gè)域中或在一組信任域中,那么只要登錄到其中一個(gè)域就可以訪問(wèn)全部的SOLSever系統(tǒng)。為了訪問(wèn)SOLSever系統(tǒng),用戶必須提供正確的Login賬戶。這些Login賬戶既可以是Windows系統(tǒng)的Login賬戶,也可以是SOLSever系統(tǒng)的Login賬戶。Login賬戶是基于效勞器使用的戶名。在SOLSever系統(tǒng)中,既可以基于Windows組或用戶賬戶創(chuàng)立Login賬戶,也可以創(chuàng)立SOLSever自己的賬戶。Login賬戶的信息是系統(tǒng)級(jí)信息,存儲(chǔ)在master數(shù)據(jù)庫(kù)的syslogins系統(tǒng)表中。SOLSever有一個(gè)默認(rèn)的Login賬戶sa。Sa是系統(tǒng)管理員的簡(jiǎn)稱,是一個(gè)特殊的Login賬戶。Sa賬戶在SOLSever系統(tǒng)中擁有全部的權(quán)限,即可以執(zhí)行所有操作。另外,Sa賬戶是不能被刪除的。所有的Windows管理員Administrator擁有SOLSever系統(tǒng)的全部的權(quán)限,其對(duì)應(yīng)的SOLSever系統(tǒng)中的Login賬戶分別是BUILTIN\Administrator和域名\Administrator。圖8庫(kù)存查詢模塊圖我們可以通過(guò)兩種方式增加Login賬戶:基于Windows組成用戶賬戶創(chuàng)立Login賬戶和創(chuàng)立新的SOLSever系統(tǒng)的Login賬戶。我們可以使用系統(tǒng)存儲(chǔ)過(guò)程sp_grantlogin或SOLSeverEnterpriseManager工具允許Windows用戶賬戶或組賬戶連接到SOLSever系統(tǒng)上。只有系統(tǒng)管理員或平安管理員才可以執(zhí)行系統(tǒng)存儲(chǔ)過(guò)程sp_grantlogin。系統(tǒng)存儲(chǔ)過(guò)程sp_grantlogin的語(yǔ)法形式如下:sp_grantlogin‘domainName\login’在上面的語(yǔ)法中,Login參數(shù)是將要增加的Windows用戶賬戶或組賬戶。Windows用戶賬戶或組賬戶必須使用Windows域名限定。域名和用戶名或組名合起來(lái)的長(zhǎng)度不能超過(guò)128個(gè)字符。在以下的程序清單中,把sales域中的tom用戶添加到了SOLSever系統(tǒng)中。添加之后,只要tom用戶登錄到Windows系統(tǒng)之后,就可以直接訪問(wèn)SOLSever系統(tǒng)中的數(shù)據(jù)。除了sp_grantlogin系統(tǒng)存儲(chǔ)過(guò)程之外,還有兩個(gè)系統(tǒng)存儲(chǔ)過(guò)程用來(lái)管理Login賬戶:sp_revokelogin和sp_denylogin.其中系統(tǒng)存儲(chǔ)過(guò)程sp_revokelogin從SOLSever中刪除Windows組或用戶賬戶,系統(tǒng)存儲(chǔ)過(guò)程sp_denylogin制止Windows組或用戶連接到SOLSever中。我們可以使用SOLSeverEnterpriseManager工具把Windows的組或用戶賬戶添加到SOLSever系統(tǒng)中?!?〕創(chuàng)立Windows用戶賬戶。在Windowsxp中增加一個(gè)用戶JXC.〔2〕授權(quán)Windows用戶訪問(wèn)SQLServer。在SQLServer企業(yè)管理器的主窗口中,翻開(kāi)制定的效勞器節(jié)點(diǎn)。翻開(kāi)平安性節(jié)點(diǎn),右擊登錄節(jié)點(diǎn),從彈出的快捷式菜單中選擇新建登錄命令。這時(shí),翻開(kāi)SQLServer登錄屬性--新建登錄對(duì)話框,如下圖,該對(duì)話框有三個(gè)選項(xiàng)卡,即常規(guī)選項(xiàng)卡,效勞器角色選項(xiàng)卡,數(shù)據(jù)庫(kù)訪問(wèn)選項(xiàng)卡。圖9SQLServer登錄屬性界面圖I〔3〕在常規(guī)選項(xiàng)卡中,選擇Windows身份驗(yàn)證,然后從域下拉框中選擇相應(yīng)的域名。接下來(lái),單擊名稱文本框右邊的無(wú)線電按鈕,那么出現(xiàn)選擇Windows賬戶對(duì)話框,如下圖:圖10SQLServer登錄屬性界面圖II〔4〕在所示的對(duì)話框中,從名稱列表中選中WinSQL賬戶。單擊添加按鈕,那么可以把WinSQL賬戶添加到添加名稱文本框中。然后,單擊確定按鈕,那么可以把該賬戶添加到General選項(xiàng)卡中的Name文本框中。圖11SQLServer登錄屬性界面圖III〔5〕選擇GrantAccess單項(xiàng)選擇按鈕,表示授權(quán)該Windows的用戶賬戶訪問(wèn)SQLServer。還應(yīng)該為該賬戶指定一個(gè)默認(rèn)的數(shù)據(jù)庫(kù)和使用的語(yǔ)言,這些操作可以通過(guò)Database下拉框和Language下拉框完成。SeverRoles選項(xiàng)卡如下所示。在該選項(xiàng)卡中,列出了系統(tǒng)中所有的固定的效勞器角色。在每一個(gè)固定效勞器角色的左側(cè),有一個(gè)復(fù)選框。選中某個(gè)復(fù)選框,就表示新創(chuàng)立的Login賬戶是該效勞器角色的成員。這里,將新建的Login賬戶添加到了SystemAdministrators固定的效勞器角色中。使用Properties按鈕可顯示指定角色的詳細(xì)描述信息。圖12SQLServer登錄屬性界面圖ⅣDatabaseAccess選項(xiàng)卡如以下圖所示。在該選項(xiàng)卡中,上面的列表框列出了當(dāng)前系統(tǒng)的數(shù)據(jù)庫(kù)。單擊數(shù)據(jù)庫(kù)左側(cè)的復(fù)選框,表示該賬戶可以訪問(wèn)該數(shù)據(jù)庫(kù),并且指定一個(gè)該賬戶在該數(shù)據(jù)庫(kù)中對(duì)應(yīng)的用戶名。默認(rèn)情況下,login帳戶與數(shù)據(jù)庫(kù)用戶的名稱是一樣的。下面的列表框列出了數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)角色。可以指定該賬戶所屬的數(shù)據(jù)庫(kù)角色。這里,指定新建的login賬戶可以訪問(wèn)Northwind數(shù)據(jù)庫(kù),在該數(shù)據(jù)庫(kù)中的user賬戶是WinSQL,且添加到了db_owner固定的數(shù)據(jù)庫(kù)角色中?!?〕單擊NewLogin對(duì)話框中確實(shí)定按鈕,那么完成login賬戶的創(chuàng)立操作。在創(chuàng)立基于Windows賬戶的SQLServer的login賬戶時(shí),應(yīng)該注意下面一些問(wèn)題:首先對(duì)于一個(gè)Windows組賬戶來(lái)說(shuō),SQLServer只有一個(gè)login賬戶與其對(duì)應(yīng)。因此刪除Windows組賬戶的某個(gè)成員賬戶并不影響SQLServer中的login賬戶。其次,刪除Windows的某個(gè)組賬戶或用戶賬戶,并不把它們從SQLServer系統(tǒng)中刪除。如果希望刪除Windows的某個(gè)組賬戶或用戶賬胡,應(yīng)該首先把它從Windows刪除,然后再把它從SQLServer中刪除。還有作為Windows某個(gè)組賬戶成員的用戶賬戶,既可以作為成員訪問(wèn)SQLServer系統(tǒng),也可以通過(guò)單獨(dú)授權(quán)訪問(wèn)SQLServer系統(tǒng)。我們還可以使用sp_addlogin系統(tǒng)存儲(chǔ)過(guò)程或SQLServerEnterpriseManager或向?qū)?chuàng)立一個(gè)SQLServer的login賬戶。只有系統(tǒng)管理員或平安管理員才可以執(zhí)行sp_addlogin系統(tǒng)存儲(chǔ)的過(guò)程。我們前面說(shuō)過(guò),login賬戶信息存儲(chǔ)在系統(tǒng)表syslogins中。sp_addlogin系統(tǒng)存儲(chǔ)過(guò)程就是在master數(shù)據(jù)庫(kù)的系統(tǒng)表syslogins中添加一條記錄。當(dāng)執(zhí)行了系統(tǒng)存儲(chǔ)過(guò)程sp_addlogin之后,用戶就可以使用該賬戶登錄到SQLServer系統(tǒng)中。SQLServer的login賬戶最長(zhǎng)是128個(gè)字符。通過(guò)使用sp_password系統(tǒng)存儲(chǔ)過(guò)程,用戶可以在任意時(shí)刻改變自己的賬戶口令。另外,系統(tǒng)管理員通過(guò)使用sp_password系統(tǒng)存儲(chǔ)過(guò)程,用NULL作為老口令,也可以改變?nèi)我庥脩糍~戶的口令。圖13SQLServer登錄屬性界面圖Ⅴ每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)用來(lái)記錄數(shù)據(jù)庫(kù)user賬戶信息的sysusers系統(tǒng)表。在sysusers系統(tǒng)表中,每一行數(shù)據(jù)要么是一個(gè)Windows用戶賬戶,Windows組賬戶,SQLServer的login賬戶或SQLServer角色。user賬戶是基于數(shù)據(jù)庫(kù)使用的名稱,與login賬戶是相對(duì)應(yīng)的。為了訪問(wèn)數(shù)據(jù)庫(kù),一個(gè)login賬戶可以使用一個(gè)特定的用戶賬戶或一個(gè)默認(rèn)的用戶賬戶。為了在數(shù)據(jù)庫(kù)中增加用戶賬戶,可以使用SQLServerEnterpriseManager或sp_grantdbacess系統(tǒng)存儲(chǔ)過(guò)程。只有數(shù)據(jù)庫(kù)所有者或數(shù)據(jù)庫(kù)訪問(wèn)管理員可以執(zhí)行添加user賬戶的操作。sp_grantdbacess系統(tǒng)存儲(chǔ)過(guò)程的語(yǔ)法形式如下:sp_grantdbacess‘loginName’,’userName’在上面的語(yǔ)法形式中,參數(shù)loginName是將要成為數(shù)據(jù)庫(kù)user賬戶的login賬戶名稱。該login賬戶可以是Windows用戶賬戶,Windows組賬戶或SQLServer的login賬戶。參數(shù)userName是一個(gè)可選的數(shù)據(jù)庫(kù)中user賬戶名。如果沒(méi)有使用參數(shù)userName,那么user賬戶名稱與login賬戶名稱一樣。除此之外,sp_revokedbacess系統(tǒng)存儲(chǔ)過(guò)程可以從當(dāng)前的數(shù)據(jù)庫(kù)中刪除指定的user賬戶。sp_revokedbacess系統(tǒng)存儲(chǔ)過(guò)程的語(yǔ)法形式為:sp_revokedbacess‘userName’。就像創(chuàng)立login賬戶一樣,也可以使用SQLServerEnterpriseManager創(chuàng)立數(shù)據(jù)庫(kù)user賬戶?!?〕在SQLServerEnterpriseManager主窗口中翻開(kāi)指定的效勞器組再翻開(kāi)指定的效勞器再選擇一個(gè)將增加用戶的數(shù)據(jù)庫(kù),例如Northwind.〔2〕右擊Northwind數(shù)據(jù)庫(kù),從彈出的菜單中選擇NewDatabaseUser命令,那么出現(xiàn)DatabaseUserPropertiesNewUser對(duì)話框?!?〕在上面的對(duì)話框中,可以選擇可以訪問(wèn)該數(shù)據(jù)庫(kù)的login賬戶,指定該賬戶在該數(shù)據(jù)庫(kù)中使用的User賬戶名稱和該用戶所屬的數(shù)據(jù)庫(kù)角色等信息。單擊確定按鈕,完成數(shù)據(jù)庫(kù)用戶的創(chuàng)立。通常User賬戶名稱和login賬戶名稱一樣。當(dāng)然也可以修改數(shù)據(jù)庫(kù)User賬戶名稱,使其與login賬戶具有完全不同的名稱。無(wú)論數(shù)據(jù)庫(kù)User賬戶名稱與login賬戶名稱是否一樣,只要他們具有對(duì)應(yīng)關(guān)系,那么都指同一個(gè)用戶。在SQLServer系統(tǒng)的每一個(gè)數(shù)據(jù)庫(kù)中,都可以有兩個(gè)默認(rèn)User賬戶:dbo和guest。Dbo用戶表示是數(shù)據(jù)庫(kù)所有者,擁有在數(shù)據(jù)庫(kù)中執(zhí)行所有的操作權(quán)限。Guest用戶是一個(gè)特殊的用戶賬戶,它可以與任意的在該數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)User賬戶的login賬戶相對(duì)應(yīng)。sa賬戶和sysadmin角色的成員都自動(dòng)映射成數(shù)據(jù)庫(kù)的一個(gè)特殊用戶,該特殊用戶就是dbo。系統(tǒng)管理員所創(chuàng)立的任何對(duì)象都自動(dòng)地屬于dbo用戶。dbo用戶不能從數(shù)據(jù)庫(kù)中刪除。Guest用戶賬戶允許那些沒(méi)有User賬戶的login賬戶訪問(wèn)該數(shù)據(jù)庫(kù)??梢园袵uest賬戶看成是任意其他login賬戶的User賬戶。除了master數(shù)據(jù)庫(kù)和tempdb數(shù)據(jù)庫(kù)中的Guest用戶賬戶不能被刪除之外,其他數(shù)據(jù)庫(kù)中的Guest用戶賬戶都可以被刪除和創(chuàng)立。對(duì)某個(gè)賬戶而言,它訪問(wèn)某個(gè)數(shù)據(jù)庫(kù)的方法是:如果某個(gè)login賬戶在當(dāng)前數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的User賬戶,那么該login賬戶以User賬戶的身份訪問(wèn)該數(shù)據(jù)庫(kù);如果該login賬戶在當(dāng)前數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)的User賬戶,那么它以Guest賬戶的身份訪問(wèn)數(shù)據(jù)庫(kù);如果該數(shù)據(jù)庫(kù)中也沒(méi)有Guest賬戶,那么該login賬戶不能訪問(wèn)該數(shù)據(jù)庫(kù)。角色一詞,最早用于電影戲劇中的人物。我們現(xiàn)在來(lái)看看SQLServer系統(tǒng)中的角色。在SQLServer系統(tǒng)中,角色提供了一種把用戶匯成一個(gè)單元,以便進(jìn)展許可管理的方法。角色包含了許多成員,這些成員都繼承了角色所擁有的許可。SQLServer系統(tǒng)提供了許多用于日常管理工作的固定的效勞器角色和固定的數(shù)據(jù)庫(kù)角色,簡(jiǎn)化了對(duì)日常管理工作的用戶的許可管理。用戶還可以創(chuàng)立自己的數(shù)據(jù)庫(kù)角色,以便管理企業(yè)中同一類(lèi)雇員所執(zhí)行的工作。當(dāng)雇員改變工作時(shí),只需把其作為某個(gè)角色的成員即可。如果該雇員從該指定工作位置調(diào)走,那么可以簡(jiǎn)單地把其從角色中刪除。這樣,就不必對(duì)該員工反復(fù)進(jìn)展授予許可和收回許可。角色不僅可以把User賬戶作為成員,而且還可以把其他用戶定義的角色作為成員。許可是用來(lái)授權(quán)用戶可以使用數(shù)據(jù)庫(kù)中的數(shù)據(jù)和執(zhí)行數(shù)據(jù)庫(kù)的操作。在SQLServer系統(tǒng)中,許可有三種類(lèi)型:語(yǔ)句許可,對(duì)象許可和預(yù)定義許可。管理許可就是指管理對(duì)User賬戶授予許可,收回許可和否認(rèn)許可等操作。這是確保數(shù)據(jù)庫(kù)中的數(shù)據(jù)不受侵害的重要措施,也平安管理的重要組成局部。SQLServer的平安性是通過(guò)賬戶策略和許可來(lái)實(shí)現(xiàn)的,應(yīng)根據(jù)實(shí)際應(yīng)用情況,綜合考慮應(yīng)該如何方案SQLServer的平安性。規(guī)劃SQLServer的平安性包括確定如何使用默認(rèn)的login賬戶,如何使用Guest賬戶,確定public角色的許可,管理用戶定義的角色的許可,使dbo擁有所有的對(duì)象等。在MicrosoftSQLServer2000系統(tǒng)中,sa是SQLServer自身的login賬戶,且該賬戶擁有所有操作的許可。該賬戶是不能被刪除的。但是,實(shí)際上,很少使用sa賬戶。由于所有的用戶都知道sa賬戶,因此為了平安起見(jiàn),系統(tǒng)安裝完畢之后,應(yīng)為sa賬戶賦予一個(gè)口令,然后將其保存起來(lái)。Windows的Administrators組的成員自動(dòng)映射成SQLServer系統(tǒng)的sysadmin角色的成員,因此Administrators組的成員都可以執(zhí)行SQLServer系統(tǒng)的所有操作。但是,這種設(shè)置是可以改變的??梢园袮dministrators組從sysadmin角色中刪除。如果某個(gè)數(shù)據(jù)庫(kù)中有Guest賬戶,那么任意可以登錄SQLServer系統(tǒng)的用戶都可以訪問(wèn)該數(shù)據(jù)庫(kù),并且具有該賬戶所有的許可。因此,有關(guān)Guest賬戶的設(shè)置,應(yīng)該考慮兩方面的內(nèi)容,即:是否在數(shù)據(jù)庫(kù)中創(chuàng)立Guest賬戶;如果有Guest賬戶,那么為該賬戶授予哪些許可。public角色是一個(gè)特殊的數(shù)據(jù)庫(kù)角色。數(shù)據(jù)庫(kù)中的任何User賬戶和角色都自動(dòng)成為public角色的成員,因此public角色所擁有的許可,數(shù)據(jù)庫(kù)中的任何用戶都擁有。因此,應(yīng)該著重考慮如何為public角色授予許可。如果系統(tǒng)提供的固定角色不能滿足用戶的需要,那么應(yīng)該創(chuàng)立用戶自定義的角色。這是實(shí)際上平安管理的一項(xiàng)內(nèi)容。這種內(nèi)容包括:創(chuàng)立哪些用戶定義的角色;這些角色包括哪些成員;如何管理這些角色的許可,等。使dbo用戶擁有所有的對(duì)象,可以方便平安性管理。備份和恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)的備份備份就是制作數(shù)據(jù)庫(kù)構(gòu)造和數(shù)據(jù)的拷貝,以便在數(shù)據(jù)庫(kù)遭到破壞的時(shí)候能夠修復(fù)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的破壞是難以預(yù)測(cè)的,因此必須采取能夠恢復(fù)數(shù)據(jù)庫(kù)的措施。通常,造成數(shù)據(jù)喪失的常見(jiàn)原因包括:誤執(zhí)行了刪除操作、破壞性病毒、自然災(zāi)害、盜竊等。在SQLServer系統(tǒng)中,備份是動(dòng)態(tài)的,也就是說(shuō),在進(jìn)展數(shù)據(jù)庫(kù)備份的時(shí)候,允許用戶繼續(xù)進(jìn)展操作。當(dāng)備份數(shù)據(jù)時(shí),SQLServer執(zhí)行以下操作:(a)檢查點(diǎn)機(jī)制檢查數(shù)據(jù)庫(kù),記錄最早的事務(wù)日志記錄和日志序列號(hào)。(b)通過(guò)直接閱讀磁盤(pán),把全部的數(shù)據(jù)頁(yè)寫(xiě)進(jìn)備份介質(zhì)中。(c)從捕捉到的序列號(hào)到日志末尾,寫(xiě)全部的事務(wù)日志記錄。在SQLServer企業(yè)管理器的主窗口中,翻開(kāi)指定的效勞器組、指定的效勞器,翻開(kāi)Management節(jié)點(diǎn),右擊Backup選項(xiàng),從彈出的菜單中選擇BackupaDatabase,那么出現(xiàn)SQLServerBackup對(duì)話框,如下圖:該對(duì)話框有兩個(gè)選項(xiàng)卡:General和Options選項(xiàng)卡。圖14SQLServer數(shù)據(jù)庫(kù)備份圖I〔1〕在常規(guī)選項(xiàng)卡中,從上到下有五個(gè)區(qū)域:第一區(qū)域用于選擇要備份的數(shù)據(jù)庫(kù)??梢栽跀?shù)據(jù)庫(kù)下拉列表框中選擇將要備份的數(shù)據(jù)庫(kù)名稱,名稱文本框用于輸入備份的名稱,描述文本框用于輸入這次備份的描述性信息。這里選擇的數(shù)據(jù)庫(kù)是jxc。在第二區(qū)域中,可以選擇備份的類(lèi)型。數(shù)據(jù)庫(kù)-完全單項(xiàng)選擇按鈕表示執(zhí)行數(shù)據(jù)庫(kù)完全備份,這時(shí)備份數(shù)據(jù)庫(kù)的所有文件和日志文件。我選擇完全備份。在目的區(qū)域,可以指定將要使用的備份介質(zhì)。在重寫(xiě)區(qū)域,可以指定備份的行為。追加到媒體表示這次備份附加在備份介質(zhì)上原有內(nèi)容之后,即仍然保存原有的備份內(nèi)容。重寫(xiě)現(xiàn)有媒體表示這次備份操作將覆蓋備份介質(zhì)上原有的內(nèi)容,即不保存原有的內(nèi)容?!?〕在選項(xiàng)選項(xiàng)卡中,內(nèi)容可分為Options區(qū)域和媒體集標(biāo)簽區(qū)域。選項(xiàng)區(qū)域中,選中完成后驗(yàn)證備份表示在備份完成之后,系統(tǒng)驗(yàn)證備份的內(nèi)容是否正確在完成對(duì)各個(gè)選項(xiàng)的設(shè)置之后,在對(duì)話框中,單擊[確定]按鈕就開(kāi)場(chǎng)執(zhí)行備份操作。圖SQLServer數(shù)據(jù)庫(kù)備份圖II數(shù)據(jù)庫(kù)的恢復(fù)在進(jìn)展數(shù)據(jù)庫(kù)恢復(fù)時(shí),系統(tǒng)首先進(jìn)展一些平安性檢查,這些平安性包括:(a)指定的數(shù)據(jù)庫(kù)是否存在(b)數(shù)據(jù)庫(kù)文件是否變化(c)數(shù)據(jù)庫(kù)文件是否兼容(d)重建數(shù)據(jù)庫(kù)及其相關(guān)的文件針對(duì)不同的數(shù)據(jù)庫(kù)備份類(lèi)型,可以采用不同的數(shù)據(jù)庫(kù)恢復(fù)方法。當(dāng)使用完全數(shù)據(jù)庫(kù)備份恢復(fù)數(shù)據(jù)庫(kù)時(shí),系統(tǒng)將自動(dòng)重建原來(lái)的數(shù)據(jù)庫(kù)文件,并且把這些文件放在備份數(shù)據(jù)庫(kù)時(shí)的這些文件所在的位置,這種進(jìn)程是系統(tǒng)自動(dòng)提供的,因此,用戶在執(zhí)行數(shù)據(jù)庫(kù)恢復(fù)工作時(shí),不需要重新建立數(shù)據(jù)庫(kù)模式構(gòu)造。5源代碼源代碼:StoryQuery.cpp文件代碼:#include<vcl.h>#pragmahdrstop#include"StoreQuery.h"#pragmapackage(smart_init)#pragmaresource"*.dfm"TfmStoreQuery*fmStoreQuery;void__fastcallTfmStoreQuery::TfmStoreQuery(TComponent*Owner):TForm(Owner)void__fastcallTfmStoreQuery::FormCreate(TObject*Sender)//初始化倉(cāng)庫(kù)下拉選項(xiàng)TQuery*pQuery=newTQuery(NULL);pQuery->DatabaseName="db";pQuery->SQL->Clear();pQuery->SQL->Add("select倉(cāng)庫(kù)名from倉(cāng)庫(kù)清單");pQuery->Open();while(!pQuery->Eof)cboStore->Items->Add(pQuery->FieldByName("倉(cāng)庫(kù)名")->AsString);pQuery->Next();pQuery->Close();deletepQuery;cboStore->Text="";edGoodCode->Text="";edGoodPY->Text="";void__fastcallTfmStoreQuery::btQueryClick(TObject*Sender)Query1->Filtered=false;//設(shè)置Query控件的filter屬性可以起到查詢條件的作用AnsiStringszCon;if(edGoodCode->Text.Length()>0)szCon="貨號(hào)='"+edGoodCode->Text+"'";if(edGoodPY->Text.Length()>0)if(szCon.Length()>0)szCon+="and拼音編碼like'%"+edGoodPY->Text+"%'";elseszCon="拼音編碼like'%"+edGoodPY->Text+"%'";if(cboStore->Text.Length()>0)if(szCon.Length()>0)szCon+="and倉(cāng)庫(kù)='"+cboStore->Text+"'";elseszCon="倉(cāng)庫(kù)='"+cboStore->Text+"'";Query1->Filter=szCon;Query1->Filtered=true;void__fastcallTfmStoreQuery::FormClose(TObject*Sender,TCloseAction&Action)//刪除窗體并回收空間Action=caFree;文件代碼:#include<vcl.h>#pragmahdrstop#include"Right.h"#pragmapackage(smart_init)#pragmaresource"*.dfm"TfmRightManage*fmRightManage;__fastcallTfmRightManage::TfmRightManage(TComponent*Owner):TForm(Owner)void__fastcallTfmRightManage::FormClose(TObject*Sender,TCloseAction&Action)//刪除窗體并回收空間Action=caFree;void__fastcallTfmRightManage::Table1AfterScroll(TDataSet*DataSet)//先去除所有的權(quán)限標(biāo)志for(inti=0;i<CheckListBox1->Items->Count;i++)CheckListBox1->Checked[i]=false;//根據(jù)選擇的用戶設(shè)置權(quán)限標(biāo)志Query1->Close();Query1->SQL->Clear();Query1->SQL->Add("select權(quán)限名稱from權(quán)限清單where用戶編號(hào)='"+Table1->FieldByName("用戶編號(hào)")->AsString+"'");Query1->Open();while(!Query1->Eof)AnsiStringszFunName=Query1->FieldByName("權(quán)限名稱")->AsString;CheckListBox1->Checked[CheckListBox1->Items->IndexOf(szFunName)]=true;Query1->Next();//選擇或去除功能權(quán)限,修改數(shù)據(jù)庫(kù)權(quán)限清單表void__fastcallTfmRightManage::CheckListBox1ClickCheck(TObject*Sender)//沒(méi)有選擇用戶,退出函數(shù)if(!Table1->FieldByName("用戶編號(hào)"))return;//循環(huán)判斷Query1->Close();Query1->SQL->Clear();AnsiStringsql;//不管沒(méi)有選中,先全部刪除,再根據(jù)選擇的情況插入sql="deletefrom權(quán)限清單where用戶編號(hào)='";sql+=Table1->FieldByName("用戶編號(hào)")->AsString+"'";Query1->SQL->Add(sql);for(inti=0;i<CheckListBox1->Items->Count;i++)if(CheckListBox1->Check

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論