• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于云計(jì)算以HJO為架構(gòu)的企業(yè)共享型移動(dòng)通訊錄

    2015-12-25 09:08羅偉雄時(shí)東曉曾紀(jì)霞劉嵐郭柏喬
    軟件 2015年7期
    關(guān)鍵詞:云計(jì)算

    羅偉雄++時(shí)東曉++曾紀(jì)霞++劉嵐++郭柏喬

    摘要:為了讓企業(yè)能夠把所有員工的通訊錄信息進(jìn)行統(tǒng)一管理,實(shí)現(xiàn)數(shù)據(jù)的高度共享,讓每個(gè)用戶都能自主、自動(dòng)、及時(shí)地維護(hù)自己在云端的通訊錄信息,以提高數(shù)據(jù)的時(shí)效性、準(zhǔn)確性、可靠性和可用性,減輕企業(yè)對(duì)員工通訊錄的維護(hù)工作量,降低維護(hù)成本。于此提出并已成功開(kāi)發(fā)了以云計(jì)算技術(shù)為基礎(chǔ),以HJO(HTTP+JSON+OAuth)為架構(gòu)的企業(yè)共享型移動(dòng)通訊錄,并在客戶中試用得到了好評(píng)。系統(tǒng)利用智能移動(dòng)終端使用和攜帶方便的特點(diǎn),使系統(tǒng)突破了時(shí)間和地點(diǎn)的限制,充分顯現(xiàn)移動(dòng)應(yīng)用方便、快捷等特色。

    關(guān)鍵詞:云計(jì)算;共享型;移動(dòng)通訊錄;HTTP;JSON;OAuth

    中圖分類(lèi)號(hào):TP311

    文獻(xiàn)標(biāo)識(shí)碼:A

    DOI: 10.3969/j.issn.1003-6970.2015.07.019

    0 引言

    當(dāng)今的通訊錄可以涵蓋多項(xiàng)內(nèi)容,如:姓名、單位電話、移動(dòng)電話、電子郵件、QQ等等],其準(zhǔn)確性非常重要。而作為企業(yè)使用的通訊錄更要求它具有良好的共享能力。傳統(tǒng)的紙質(zhì)通訊錄成本高,攜帶不方便,查找速度慢,難以更新維護(hù)。而電子版通訊錄大致分為遠(yuǎn)程通訊錄和本地通訊錄。遠(yuǎn)程通訊錄就是把通訊錄信息存放在云端服務(wù)器,比較典型的有Gmail、騰訊等提供的電子郵件系統(tǒng)中的通訊錄,金山、百度等提供的云盤(pán)通訊錄,這類(lèi)通訊錄往往是一種數(shù)據(jù)同步工具,用于把個(gè)人手機(jī)和電腦上的通訊錄備份到云端,當(dāng)需要時(shí)再?gòu)脑贫税褦?shù)據(jù)恢復(fù)到手機(jī)或電腦的本地通訊錄中。而手機(jī)通訊錄、Outlook、Foxmail等郵件客戶端上的地址簿等則屬于本地通訊錄,這類(lèi)通信錄的信息都是存放在本地的設(shè)備上。以上這些通訊錄以私有化的居多,共享能力有限,而且大多要管理員維護(hù),用戶自行更新操作繁瑣,其更新效率和準(zhǔn)確性也不盡如人意。

    而隨著智能移動(dòng)終端功能的增強(qiáng)和價(jià)格的下降,其普及率越來(lái)越高,據(jù)統(tǒng)計(jì)2014年中國(guó)智能手機(jī)用戶已超過(guò)5億。如果電子通訊錄能以智能移動(dòng)設(shè)備為平臺(tái),并結(jié)合云計(jì)算技術(shù),那將會(huì)很好地解決上面的問(wèn)題,同時(shí)也給用戶帶來(lái)更好的使用體驗(yàn)?;谝陨系沫h(huán)境和需求,筆者設(shè)計(jì)和開(kāi)發(fā)了一套以云計(jì)算技術(shù)為基礎(chǔ),以HJO(HTTP+JSON+OAuth)為架構(gòu)的企業(yè)共享型云通訊錄,并已投入使用。系統(tǒng)通過(guò)把通訊錄信息云化,實(shí)現(xiàn)了數(shù)據(jù)的共享,消除用戶對(duì)數(shù)據(jù)訪問(wèn)的地理局限性;通過(guò)運(yùn)用HJO架構(gòu),減輕了數(shù)據(jù)的傳輸量,為Web應(yīng)用、桌面應(yīng)用和移動(dòng)應(yīng)用提供了統(tǒng)一的接口,簡(jiǎn)化了應(yīng)用的開(kāi)發(fā)。通過(guò)該系統(tǒng)用戶可以便捷地使用智能移動(dòng)終端設(shè)備來(lái)查詢?cè)贫说耐ㄓ嶄浶畔ⅲ⒛茏灾鞯鼐S護(hù)自己的通訊錄,保證了信息的準(zhǔn)確性和共享能力,同時(shí)還降低了管理員的維護(hù)工作量。利用來(lái)電提示功能,用戶不需要維護(hù)手機(jī)本身的通訊錄,也能對(duì)同事的來(lái)電一目了然;使用離線數(shù)據(jù)同步技術(shù)方便了用戶離線使用,節(jié)省了通訊流量。這些都給用戶帶來(lái)了更好的使用體驗(yàn)。

    1 總體架構(gòu)

    本系統(tǒng)以云計(jì)算技術(shù)為基礎(chǔ),以HJO(HTTP+JSON+OAuth)的架構(gòu)來(lái)進(jìn)行系統(tǒng)設(shè)計(jì)。系統(tǒng)分為三個(gè)部分,分別是云端數(shù)據(jù)、客戶端和管理端。其中云端數(shù)據(jù)分為數(shù)據(jù)存儲(chǔ)層、數(shù)據(jù)處理層和數(shù)據(jù)訪問(wèn)層。該部分主要使用云計(jì)算技術(shù)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和處理,消除用戶對(duì)數(shù)據(jù)訪問(wèn)的地理局限性。

    (1)數(shù)據(jù)存儲(chǔ)層。這里可以選擇通用的關(guān)系型數(shù)據(jù)庫(kù)作為數(shù)據(jù)持久化,如Oracle、MS SQL Server、MySQL等等。

    (2)數(shù)據(jù)處理層。這是數(shù)據(jù)的邏輯處理器,主要負(fù)責(zé)數(shù)據(jù)的存取操作,對(duì)上層提供統(tǒng)一的數(shù)據(jù)訪問(wèn)接口,屏蔽下層數(shù)據(jù)庫(kù)的存取操作差異。任何對(duì)數(shù)據(jù)庫(kù)的操作都必須通過(guò)該層的接口實(shí)現(xiàn)。

    (3)數(shù)據(jù)訪問(wèn)層。這是面向UI應(yīng)用的接口層.實(shí)現(xiàn)對(duì)不同種類(lèi)的UI應(yīng)用提供統(tǒng)一的接口調(diào)用方式。

    云端的這三個(gè)層次結(jié)構(gòu)可以有效地消除底層數(shù)據(jù)庫(kù)對(duì)上層應(yīng)用的影響,以適應(yīng)不同企業(yè)對(duì)數(shù)據(jù)存儲(chǔ)的要求。同時(shí)也為各種不同的應(yīng)用模式提供統(tǒng)一的調(diào)用方式,提高了系統(tǒng)的擴(kuò)展能力。

    (4)客戶端。這是提供給用戶訪問(wèn)云端數(shù)據(jù)的操作界面。根據(jù)設(shè)備的不同又分為智能終端App應(yīng)用和Web網(wǎng)站應(yīng)用。智能終端App應(yīng)用使用的是Native App原生系統(tǒng)的開(kāi)發(fā)模式。原因是系統(tǒng)需要讀取設(shè)備的某些硬件信息,因此不適合使用基于網(wǎng)頁(yè)的Web App開(kāi)發(fā)模式。Web網(wǎng)站應(yīng)用模式是為了讓系統(tǒng)有更好的擴(kuò)展性和延伸性。例如用戶可以通過(guò)電腦或智能終端的瀏覽器使用本系統(tǒng)。另外筆者已經(jīng)把Web網(wǎng)站應(yīng)用接人微信平臺(tái),通過(guò)微信,用戶便可使用該系統(tǒng),這樣有效提高了系統(tǒng)的使用率。

    (5)管理端。這是提供給管理員對(duì)云端數(shù)據(jù)進(jìn)行統(tǒng)一管理的操作界面。這里主要以Web訪問(wèn)方式為主。

    整個(gè)系統(tǒng)的架構(gòu)如圖1所示。

    2 實(shí)現(xiàn)方法

    2.1 數(shù)據(jù)存儲(chǔ)層

    這里選擇MS SQL Server 2008作為數(shù)據(jù)庫(kù)。該數(shù)據(jù)庫(kù)可以將結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化文檔的數(shù)據(jù)(例如圖像和音樂(lè))直接存儲(chǔ)到數(shù)據(jù)庫(kù)中,并提供一系列豐富的集成服務(wù),可以對(duì)數(shù)據(jù)進(jìn)行查詢、搜索、同步、報(bào)告和分析等操作,另外數(shù)據(jù)可以存儲(chǔ)在服務(wù)器、PC機(jī)、移動(dòng)設(shè)備等各種設(shè)備上。

    系統(tǒng)共設(shè)計(jì)了9張數(shù)據(jù)表,用于存放用戶、部門(mén)、電話和日志等信息。

    Departments部門(mén)信息表

    該表用于保存企業(yè)的組織和部門(mén)架構(gòu)信息。其中OID為系統(tǒng)分配的部門(mén)編號(hào);ParentID記錄其直屬上級(jí)部門(mén)的OID值,如果沒(méi)有上級(jí)部門(mén)則此字段值為0;DepartmentID是由各企業(yè)自行編制的編號(hào),主要目的是用于與其他系統(tǒng)同步信息。整個(gè)表的結(jié)構(gòu)如表1所示。

    Users用戶信息表

    該表用于保存用戶的基本信息,每個(gè)用戶占用一行。其中DepartmentID記錄用戶所在部門(mén)的部門(mén)編號(hào),取自于Departments表的OID值。另外考慮到各個(gè)企業(yè)都有自己的中央認(rèn)證系統(tǒng),因此本系統(tǒng)在用戶登錄認(rèn)證方面直接調(diào)用第三方的用戶認(rèn)證接口,所以在用戶信息表中沒(méi)有設(shè)計(jì)用戶密碼字段。整個(gè)表的結(jié)構(gòu)如表2所示。endprint

    Telephones電話號(hào)碼表

    該表用于保存用戶的電話號(hào)碼信息,每個(gè)電話號(hào)碼占用一行,每個(gè)用戶可以有多條記錄。其中PhoneType標(biāo)識(shí)該記錄的電話號(hào)碼是手機(jī)還是固定電話,如果為手機(jī)則填m,如果為固定電話則填t。整個(gè)表的結(jié)構(gòu)如表3所示。

    SimCard手機(jī)Sim卡信息表

    該表用于記錄用戶的Sim卡信息,以便判斷用戶是否更換了手機(jī)卡。其中UserOID表示用戶的系統(tǒng)編號(hào),取之于Users表的OID值。整個(gè)表的結(jié)構(gòu)如表4所示。

    Managers管理員信息表

    該表用于記錄系統(tǒng)管理員信息。其中保存的密碼信息必須進(jìn)行加密存儲(chǔ)。整個(gè)表的結(jié)構(gòu)如表5所示。

    DataChangelnfo數(shù)據(jù)修改信息

    該表用于存放數(shù)據(jù)修改信息。其中TableName表示被修改的表名稱,RecordOID表示所修改的記錄的OID值,Action表示修改動(dòng)作,插入用i表示,更新用u表示,刪除用d表示。整個(gè)表的結(jié)構(gòu)如表6所示。

    DepartmentsLog部門(mén)信息修改日志表

    該表用于記錄部門(mén)信息的修改日志,即記錄某條記錄被修改前的原始信息,以便追蹤數(shù)據(jù)的修改歷史,并在發(fā)生錯(cuò)誤時(shí)能恢復(fù)原始數(shù)據(jù)。其中Action表示記錄的操作類(lèi)型,插入用i表示,更新用u表示,刪除用d表示。整個(gè)表的結(jié)構(gòu)如表7所示。

    UsersLog用戶信息修改日志表

    該表用于記錄用戶信息的修改日志,作用與DepartmentsLog類(lèi)似。整個(gè)表的結(jié)構(gòu)如表8所示。

    TelephonesLog電話號(hào)碼修改日志表

    該表用于記錄電話號(hào)碼信息的修改日志,作用同樣類(lèi)似于表DepartmentsLog。整個(gè)表的結(jié)構(gòu)如表9所示。

    另外,客戶端系統(tǒng)是通過(guò)讀取DataChangelnfo表的信息來(lái)感知需要同步的數(shù)據(jù)并下載對(duì)應(yīng)的信息。各數(shù)據(jù)表的修改信息是通過(guò)各表的Insert、Update和Delete觸發(fā)器來(lái)收集的。這樣做的優(yōu)點(diǎn)是處理起來(lái)比較簡(jiǎn)單,簡(jiǎn)化了上層應(yīng)用的開(kāi)發(fā)。由于這里三個(gè)觸發(fā)器要完成的任務(wù)都是記錄哪個(gè)表的哪個(gè)記錄進(jìn)行了哪項(xiàng)操作,因此這里把三個(gè)觸發(fā)器的代碼寫(xiě)在一起。接下來(lái)就是判斷當(dāng)前是觸發(fā)了Insert、Update還是Delete操作。邏輯上的判斷是:如果存在inserted表,但不存在deleted表,則此時(shí)為Insert操作;如果同時(shí)存在inserted表和deleted表,則此時(shí)為Update操作;如果不存在inserted表,但存在deleted表,則此時(shí)為Delete操作。然后,如果是Update或Delete操作,則要先刪除該記錄的舊的修改信息,因?yàn)橛脩糁恍柘螺d該記錄的最終版本,因此舊的修改信息就可以刪除掉。最后是把原始的記錄登記在對(duì)應(yīng)的日志表中,然后在DataChangelnfo表中登記該記錄當(dāng)前的操作類(lèi)型。其核心代碼如下。

    判斷當(dāng)前是何種操作

    IF EXISTS(SELECT l FROM inserted) AND NOT EXISTS(SELECT l FROM deleted)

    BEGIN

    SET CIAction 2'i'

    SELECT ClOID 2 0ID FROM INSERTED

    END

    ELSE IF EXISTS(SELECT l FROM inserted) AND EXISTS(SELECT l FROM deleted)

    BEGIN

    SET CIAction='u'

    SELECT @OID=0ID FROM INSERTED

    END

    ELSE IF NOT EXISTS(SELECT l FROM inserted) AND EXISTS(SELECT l FROM deleted)

    BEGIN

    SET @Action ='d'

    SELECT @OID=0ID FROM DELETED

    END

    一如果是Update或Delete操作,則刪除舊的修改日志

    IF @Action<>il

    BEGIN

    INSERT INTO TelephonesLog

    ([Action], OID, UsersOID, PhoneType, PhoneNumber)

    SELECT @Action, OID, UsersOID, PhoneType, PhoneNumber FROM DELETED

    DELETE FROM DataChangelnfo

    WHERE TableName=@TableName

    AND RecordOID=@OID

    END

    ——記錄當(dāng)前的修改的日志

    INSERT INTO DataChangelnfo

    (TableName, RecordOID, [Action])

    VALUES

    (@TableName,@OID,@Action)

    2.2 數(shù)據(jù)處理層

    由于不同的數(shù)據(jù)庫(kù)其存取操作存在一定的差異,考慮到不同的企業(yè)所使用的數(shù)據(jù)庫(kù)不盡相同,為了提高系統(tǒng)的適應(yīng)能力,筆者首先設(shè)計(jì)了一套函數(shù)接口,然后因應(yīng)不同的數(shù)據(jù)庫(kù)再編寫(xiě)對(duì)應(yīng)的操作類(lèi),而這些類(lèi)繼承上面的接口。這樣就可以為數(shù)據(jù)訪問(wèn)層提供統(tǒng)一的接口函數(shù),同時(shí)又屏蔽了數(shù)據(jù)存儲(chǔ)層的操作差異。

    例如用戶管理模塊。系統(tǒng)首先設(shè)計(jì)了類(lèi)庫(kù)DBControllerlnterface,里面聲明了IUsersController接口,該接口包含了對(duì)用戶數(shù)據(jù)操作的所有函數(shù)聲明。如下面的代碼所示。endprint

    name space AddressBo ok.DB Controllerlnterface

    {

    ///

    ///用戶管理接口

    ///

    public interface IUsersController

    {

    ,//

    ///根據(jù)賬號(hào)獲取用戶ID和姓名

    ///

    ///賬號(hào)< /param>

    ///用戶ID

    ///姓名

    ///

    bool GetUserlnfo(string account, out int userOID, out string userName);

    ///

    ///根據(jù)手機(jī)號(hào)碼獲取用戶ID

    ///

    ///手機(jī)號(hào)碼

    ///用戶ID

    ///

    bool GetUserlnfo(string phoneNumber, out int userOID);

    ///

    ///檢查是否存在某個(gè)賬號(hào)

    ///

    ///賬號(hào)< /param>

    ///

    bo ol IsExistAccount(string account);

    ///

    ///檢查是否存在某個(gè)用戶ID

    ///

    ///用戶ID

    ///

    bool IsExistUserOID(int userOID);

    ///

    ///增加用戶

    ///

    ///賬號(hào)

    ///姓名

    ///部門(mén)編號(hào)

    ///

    int Insert(string account, string userName, int departmentID);

    ///

    ///修改鳧戶

    ///

    ///用戶ID

    ///部門(mén)編號(hào)

    ///

    int Update(int oID, string userName, int departmentID);

    ///

    /// Anil除用戶

    ///

    ///用戶 ID

    ///

    int Delete(int oID);

    ///

    ///獲取所有用戶的基本信息

    ///

    ///

    DataTable GetAllUsers();

    ///

    ///獲取某個(gè)部門(mén)的用戶基本信息

    ///

    ///部門(mén)編號(hào)

    ///分頁(yè)索引

    ///分頁(yè)大小

    ///總記錄數(shù)

    ///

    DataTable GetDepartmentUsers(int departmentID, int pageldx, int pageSize, out int recordCount);

    }

    }

    接著系統(tǒng)創(chuàng)建了類(lèi)庫(kù)SQLDBController,這是實(shí)現(xiàn)對(duì)SQL Server數(shù)據(jù)庫(kù)操作的,里面實(shí)現(xiàn)了UsersController類(lèi),該類(lèi)繼承上面的IUsersController接口并實(shí)現(xiàn)其方法。其核心代碼如下。

    name space Addres sBo ok. SQLDB Co ntroller

    {

    public class UsersController: IUsersController

    {

    public bool GetUserlnfo(string account, out int userOID, out string userName)

    {

    using (AddressBookEntities db=new AddressBookEntities(》

    {

    var data= (from record in db.Users

    where record.Account==account

    select record).FirstOrDefault();

    if (data!=null)

    {

    userOID=data.OID;

    userName=data.UserName;

    return true;

    }

    else

    {

    userOID=0:

    userName=string.Empty;

    return false;

    }

    }

    }

    //其它對(duì)IUsersController接口函數(shù)的具體實(shí)現(xiàn)

    }

    }

    這里使用了ADO.NET實(shí)體數(shù)據(jù)模型來(lái)連接數(shù)據(jù)庫(kù)。通過(guò)該模型可以很方便的與底層數(shù)據(jù)庫(kù)進(jìn)行強(qiáng)類(lèi)型的數(shù)據(jù)互操作,既方便了系統(tǒng)的設(shè)計(jì)也提高了數(shù)據(jù)庫(kù)操作的安全性。另外對(duì)于查詢到的數(shù)據(jù)集合,需要轉(zhuǎn)換為DataTable類(lèi)型對(duì)象,目的是便于數(shù)據(jù)訪問(wèn)層將其轉(zhuǎn)換為JSON數(shù)據(jù)格式,因此這里使用了另一個(gè)自定義函數(shù)ConvertToDataTable。該函數(shù)是根據(jù)數(shù)據(jù)集創(chuàng)建數(shù)據(jù)表,然后再進(jìn)行數(shù)據(jù)填充。轉(zhuǎn)換時(shí)有一個(gè)需要注意的地方就是,通過(guò)ADO.NET實(shí)體數(shù)據(jù)模型查詢到的數(shù)據(jù)集是包含外鍵關(guān)聯(lián)表信息的,而且是作為一個(gè)獨(dú)立的字段存在,而在這里該值是不需要的,因此進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),需要先檢測(cè)數(shù)據(jù)的類(lèi)型是否為System.Data.EntityKey或System.Data.EntityState,如果是則丟棄該信息。其核心代碼如下。

    public class Common

    {

    public static DataTable ConvertToDataTable(IEnumerable varlist)

    {

    DataTable table=new DataTable();

    ff字段名稱

    Propertylnfo[] oProps= null;

    if (varlist==null) return table;

    foreach(T rec in varlist)

    {

    if (oProps==null)

    {

    oProps=《Type)rec.GetType(》.GetProperties();

    foreach (Propertylnfo piin oProps)

    {

    Type colType=pi.PropertyType;

    //去除外鍵關(guān)聯(lián)表

    if (colType.FullName.Co ntains("AddressBo ok.SQLDBHelper"))co ntinue;

    if《colType.FullName=="System.Data.EntityKey") II (colType.FullName=="System.Data.EntityState"》

    continue;

    if《colType.IsGenericType) && (colType.GetGenericTypeDefinitio n() ==typeof(Nullable<》》

    {

    colType=colType.GetGenericArguments() [0];

    }

    table.Columns.Add(new DataColumn(pi.Name, colType》;

    }

    }

    DataRow row= table.NewRow();

    foreach (Propertylnfo piin oProps)

    {

    //去除外鍵關(guān)聯(lián)表

    if (pi.PropertyType.FullName.Co ntains(”AddressBo ok. SQLDBHelper.”))co ntinue;

    if《pi.PropertyType.FullName="System.Data.EntityKey")||(pi.PropertyType.FullName=="System.Data.EntityState"》

    co ntinue:

    row[pi.Name]=pi.GetValue(rec, null)==null? DBNull.Value: pi.GetValue(rec, null);

    }

    table.Rows.Add(row);

    }

    return table:

    }

    }

    類(lèi)似的,再創(chuàng)建對(duì)Oracle數(shù)據(jù)庫(kù)操作的OracleDBController類(lèi)庫(kù),里面同樣實(shí)現(xiàn)了UsersController類(lèi),同樣該類(lèi)也繼承IUsersController接口并實(shí)現(xiàn)其方法。要注意的是,如果使用ADO.NET實(shí)體數(shù)據(jù)模型來(lái)連接Oracle數(shù)據(jù)庫(kù),需要先安裝Oracle Data Provider for .NET (ODP.NET)驅(qū)動(dòng)程序。其他的操作和代碼與操作SQL Server數(shù)據(jù)庫(kù)的類(lèi)似,這里就不再贅述。

    這三個(gè)類(lèi)庫(kù)以及類(lèi)和接口的繼承關(guān)系如圖2所示。這樣數(shù)據(jù)訪問(wèn)層只要聲明IUsersController接口變量,就可實(shí)現(xiàn)對(duì)SQL Server和Oracle數(shù)據(jù)庫(kù)的存取操作,而不需要考慮具體的底層數(shù)據(jù)庫(kù)的類(lèi)型。同樣如果需要使用其它數(shù)據(jù)庫(kù)也可以按相同的方式進(jìn)行編寫(xiě)。

    2.3 數(shù)據(jù)訪問(wèn)層

    為了統(tǒng)一各種UI應(yīng)用的調(diào)用方式,該層采用了HJO(HTTP協(xié)議+JSON格式+OAuth2.0認(rèn)證)架構(gòu)模式。

    HTTP協(xié)議(HypertextTransfer Protocol)是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn),它是無(wú)狀態(tài)的應(yīng)用層協(xié)議,由于其簡(jiǎn)捷、快速的方式,因此特別適合于分布式超媒體信息系統(tǒng)的應(yīng)用。因此,本系統(tǒng)可以直接把該層部署在IIS服務(wù)器上,使用Windows Server的Web服務(wù),這樣即方便了系統(tǒng)的開(kāi)發(fā),也方便了系統(tǒng)的部署,同時(shí)由于HTTP協(xié)議是使用標(biāo)準(zhǔn)的80端口,因此也無(wú)需對(duì)網(wǎng)絡(luò)防火墻進(jìn)行特殊的配置。

    JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它較XML有更高的傳輸效率,同一個(gè)數(shù)據(jù)使用JSON格式傳輸?shù)臄?shù)據(jù)量要比XML格式小很多。例如一條用戶信息,使用JSON格式表示如下,只需166個(gè)字符。

    [

    {

    "Account":"moc".

    "UserName":"Micheal O'Ciardubhain".

    "DepartmentID":41,

    "DepartmentName":”應(yīng)用外語(yǔ)系”,

    "PhoneType":"m",

    "PhoneNumber":"1 8926549871".

    "OID":1003,

    "UserOID":5015

    }

    ]

    而同樣的記錄使用XML格式來(lái)表示,如下所示,卻需要330個(gè)字符,所占用的空間是JSON格式的兩倍。

    <?xml version="1.0"standalone="yes"?>

    moc

    Mic heal O'Ciardubhain

    4 1

    應(yīng)用外語(yǔ)系m1892654 987 1

    1003

    5015

    對(duì)當(dāng)前的移動(dòng)應(yīng)用來(lái)說(shuō),用戶對(duì)數(shù)據(jù)傳輸所占帶寬還是比較敏感的,而通過(guò)使用JSON格式,可以有效減少數(shù)據(jù)傳輸量,節(jié)省用戶帶寬。因此當(dāng)前特別適合使用JSON來(lái)作為移動(dòng)應(yīng)用的數(shù)據(jù)傳輸格式。

    OAuth(Open Authorization)是一個(gè)開(kāi)放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問(wèn)該用戶在某一網(wǎng)站上存儲(chǔ)的私密資源(如照片,視頻,聯(lián)系人列表),而無(wú)需將用戶名和密碼提供給第三方應(yīng)用。而OAuth2.0是OAuth協(xié)議的下一版本,它關(guān)注客戶端開(kāi)發(fā)者的簡(jiǎn)易性,同時(shí)為Web應(yīng)用、桌面應(yīng)用、手機(jī)和起居室設(shè)備提供專(zhuān)門(mén)的認(rèn)證流程。

    OAuthl.0的認(rèn)證流程如下:

    (1)客戶端向服務(wù)器端請(qǐng)求臨時(shí)令牌(Temp Token);

    (2)客戶端使用返回的Temp Token向服務(wù)器端請(qǐng)求認(rèn)證令牌(Auth Token);

    (3)客戶端使用返回的Auth Token向服務(wù)器端獲取訪問(wèn)令牌(Access Token);

    (4)客戶端使用返回的Access Token訪問(wèn)服務(wù)器上的接口。

    相比之下OAuth2.0的認(rèn)證流程簡(jiǎn)化如下:

    (1)客戶端向服務(wù)器端請(qǐng)求授權(quán)碼(Auth Code);

    (2)客戶端使用返回的Auth Code向服務(wù)器端請(qǐng)求訪問(wèn)令牌(Access Token);

    (3)客戶端使用返回的Access Token訪問(wèn)服務(wù)器上的接口。

    通過(guò)上面的流程可以看到,OAuth2.0節(jié)省了OAuthl.0中獲取臨時(shí)令牌的環(huán)節(jié),另外出于安全考慮OAuth2.0中的授權(quán)碼是有有效期的。另外OAuthl.0中每個(gè)令牌都需要加密,而OAuth2.0則通過(guò)使用https協(xié)議簡(jiǎn)化了這一步驟,這樣服務(wù)器端和客戶端代碼都得到了簡(jiǎn)化,而且安全性更高。此外OAuth2.0考慮到客戶端的多樣性,因此對(duì)獲取訪問(wèn)令牌提供了多種途徑,如授權(quán)碼、客戶端私有證書(shū)、資源擁有者密碼證書(shū)、斷言證書(shū)等等。因此本系統(tǒng)選擇使用OAuth2.0作為認(rèn)證方式。endprint

    通過(guò)上面的架構(gòu),即可把數(shù)據(jù)處理層提供的函數(shù)調(diào)用轉(zhuǎn)換為HTIP調(diào)用,這樣不管是傳統(tǒng)的Web網(wǎng)站還是新興的移動(dòng)應(yīng)用,都可以方便、安全地使用這些接口。

    下面以用戶管理模塊為例進(jìn)行詳細(xì)的說(shuō)明。

    系統(tǒng)首先設(shè)計(jì)了Credential類(lèi),用于實(shí)現(xiàn)OAuth2.0認(rèn)證。該類(lèi)主要包括檢查請(qǐng)求的鏈接是否使用HTTPS協(xié)議,產(chǎn)生Access Token值,校驗(yàn)Access Token值等功能,關(guān)鍵的地方是產(chǎn)生Access Token值。為了防止重現(xiàn)攻擊,Access Token必須具有有效期,因此該值包含時(shí)間信息;另外系統(tǒng)還對(duì)Access Token進(jìn)行了數(shù)字簽名,目的是防止信息被非法篡改和假冒。其核心代碼如下。

    public static string GetAccessToken(string authKey)

    {

    if (authKey!=Config.Security.AuthKey) return string.Empty;

    string rndString=FSMCrypt.FSMHash.GetRando mString(Config. Security.Rando mStringSize);

    string hash= FSMCrypt.FSMHash.MD5(rndString, Config.Security.SALT);

    string now=DateTime.Now.ToString();

    string sourceString=string.Format(“{0};{1};{2}”,rndString,now, hash);

    using (FSMCrypt.FSMEncryption crypt= new FSMCrypt.FSMEncryption(》

    {

    return

    HttpUtility.UrlE nco de(c rypt.Enc rypt2(F SMCrypt.Enc ryptio nAlgo rithm.TripleDes,sourceString。

    Config.Security.KEY, Config.Security.IV false, false》;

    }

    }

    接著系統(tǒng)使用ASP.NET頁(yè)面作為接收服務(wù)請(qǐng)求的通道,這樣做的好處是可以更好地兼容桌面開(kāi)發(fā)和移動(dòng)應(yīng)用開(kāi)發(fā)。按照OAuth2.0的流程,每個(gè)頁(yè)面的服務(wù)流程都是相同的,因此系統(tǒng)抽象出BasePage類(lèi),作為所有服務(wù)頁(yè)面的基類(lèi)。在BasePage類(lèi)的Page_Lo ad事件中系統(tǒng)先檢查當(dāng)前是否使用HTTPS鏈接,然后再檢查Access Token是否合法,都通過(guò)后再執(zhí)行抽象方法Analyze。每個(gè)繼承BasePage類(lèi)的服務(wù)頁(yè)面都需要實(shí)現(xiàn)Analyze方法,這是每個(gè)服務(wù)頁(yè)面具體的服務(wù)功能。BasePage類(lèi)的Page_Load事件的代碼如下。

    protected virtual void Page_Load(object sender, EventArgs e)

    {

    if (lAllowConnect(》

    return;

    else

    Analyze();

    }

    其中AllowConnect函數(shù)就是用于檢測(cè)當(dāng)前請(qǐng)求是否使用了HTTPS鏈接,以及對(duì)Access Token進(jìn)行合法性校驗(yàn)的。

    前面的數(shù)據(jù)處理層因應(yīng)不同的數(shù)據(jù)庫(kù)設(shè)計(jì)了不同的數(shù)據(jù)處理模塊,而對(duì)于服務(wù)頁(yè)面就要根據(jù)相應(yīng)的配置參數(shù)對(duì)接口進(jìn)行實(shí)例化。為此在該層,系統(tǒng)實(shí)現(xiàn)了DB ControllerFactory工廠類(lèi),該類(lèi)會(huì)自動(dòng)根據(jù)配置參數(shù)產(chǎn)生相應(yīng)的數(shù)據(jù)控制對(duì)象實(shí)例。例如要實(shí)例化上面的IUsersController接口,DBControllerFactory類(lèi)會(huì)執(zhí)行CreateUsersController函數(shù),該函數(shù)會(huì)根據(jù)配置參數(shù)生成SQLDBController.UsersController實(shí)例或OracleDB Controller.UsersController實(shí)例。其核心代碼如下。

    public class DBControllerFactory

    {

    public static IUsersController CreateUsersController()

    {

    //獲取配置是數(shù)據(jù)庫(kù)類(lèi)型

    Config.DBStyle dbStyle=Config.GetDBStyle();

    //根據(jù)配置參數(shù)返回相應(yīng)的對(duì)象實(shí)例

    switch (dbStyle)

    {

    case Config.DBStyle.SQLSERVER:

    return new SQLDBController.UsersController();

    case Config.DBStyle.ORACLE:

    return new OracleDB Co ntroller.UsersCo ntroller();

    default:

    return null;

    }

    }

    }

    而服務(wù)頁(yè)面對(duì)接口進(jìn)行實(shí)例化時(shí),只需調(diào)用DBControllerFactory類(lèi)的相應(yīng)方法即可。例如要實(shí)例化IUsersController接口,其代碼如下。

    IUsersController users Co ntroller= DB Co ntrollerFactory.CreateUsersController();endprint

    這樣不管使用哪類(lèi)數(shù)據(jù)庫(kù),都無(wú)需修改任何代碼,只要修改配置參數(shù)即可,有效提高了系統(tǒng)的適應(yīng)能力和可擴(kuò)展能力。

    2.4 客戶端

    2.4.1 智能終端App應(yīng)用

    智能終端App應(yīng)用使用了離線數(shù)據(jù)同步技術(shù),實(shí)現(xiàn)了App的離線使用和數(shù)據(jù)的自動(dòng)同步。這里采用了SQLite數(shù)據(jù)庫(kù)作為離線數(shù)據(jù)的存儲(chǔ)服務(wù)。SQLite是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有輕量級(jí)、單一文件存儲(chǔ)、跨平臺(tái)、可移植的特性,非常適合嵌入式系統(tǒng)。而且iOS、Android和Windows Phone系統(tǒng)中都有相應(yīng)的類(lèi)庫(kù)支持,使用起來(lái)非常方便。

    作為離線存儲(chǔ),客戶端只需要保存部門(mén)信息、用戶信息、電話號(hào)碼信息和數(shù)據(jù)修改信息即可,對(duì)應(yīng)的就是Departments、Users、Telephones和DataChangelnfo這四個(gè)表,其他表的修改日志無(wú)需存儲(chǔ)。這四個(gè)表的結(jié)構(gòu)與數(shù)據(jù)存儲(chǔ)層中的表結(jié)構(gòu)相同,這里就不再贅述。

    智能終端App的主要功能如圖3所示。

    (1)登錄??紤]到各個(gè)企業(yè)基本上都有自己的中央認(rèn)證系統(tǒng),因此這里可以使用企業(yè)自己的認(rèn)證接口。另外,為了免除用戶每次都要輸入認(rèn)證信息,系統(tǒng)還實(shí)現(xiàn)了自動(dòng)登錄功能。在首次登錄時(shí)可以選擇下次是否自動(dòng)登錄,若已選擇,則第一次登錄成功后,系統(tǒng)會(huì)把用戶的相關(guān)信息保存到本地,下次打開(kāi)客戶端時(shí),系統(tǒng)會(huì)先檢查本地是否存有用戶信息,若有則再檢查賬號(hào)是否異常,如果正常則進(jìn)入系統(tǒng),否則跳轉(zhuǎn)到登錄界面等待用戶登錄。其登錄的流程如圖4所示。

    其中“檢查賬號(hào)是否異?!钡哪康氖谴_認(rèn)服務(wù)端沒(méi)有暫停或刪除該賬號(hào)。另外除了登錄之外,在用戶使用其他功能之前,系統(tǒng)都會(huì)進(jìn)行賬號(hào)異常檢查,以提高服務(wù)端對(duì)賬號(hào)的控制能力。

    (2)瀏覽通訊錄。用戶可以按組織架構(gòu)來(lái)查閱用戶信息。對(duì)查詢到的信息可以直接撥打電話或發(fā)送短信。為了留給用戶更多的控制權(quán),用戶點(diǎn)擊撥打電話或發(fā)送短信時(shí),系統(tǒng)只是打開(kāi)撥號(hào)軟件或短信發(fā)送軟件,然后自動(dòng)輸入接收者的電話號(hào)碼,并沒(méi)有撥打電話或發(fā)送短信,這樣用戶可以根據(jù)需要進(jìn)行調(diào)整,例如是否使用IP撥號(hào)等等。

    (3)查詢通訊錄。用戶可以按電話、姓名、賬號(hào)或部門(mén)等條件來(lái)快速搜索用戶信息。同樣對(duì)搜索到的信息可以直接撥打電話或發(fā)送短信。為了減少用戶的輸入量,在輸入查詢條件時(shí),系統(tǒng)支持自動(dòng)完成功能。例如輸入王字,則會(huì)自動(dòng)列出所有姓王的列表讓用戶選擇。另外系統(tǒng)還支持模糊查詢,例如輸入8632,則系統(tǒng)會(huì)查詢所有電話號(hào)碼以8632開(kāi)頭的信息。

    (4)個(gè)人通訊錄。通過(guò)該功能用戶可以增、刪、改自己的通訊錄。修改后,數(shù)據(jù)會(huì)自動(dòng)同步到云端,然后其他用戶會(huì)自動(dòng)下載此更新信息。為方便用戶在更換手機(jī)卡后及時(shí)更新通訊錄,系統(tǒng)實(shí)現(xiàn)了自動(dòng)檢測(cè)功能。當(dāng)發(fā)現(xiàn)手機(jī)卡更換后會(huì)及時(shí)提醒用戶,如圖5所示。另外考慮到當(dāng)下有不少用戶有多臺(tái)手機(jī)多個(gè)聯(lián)系電話,因此本系統(tǒng)對(duì)用戶的聯(lián)系方式?jīng)]有數(shù)量上的限制,不論有多少個(gè)聯(lián)系電話都可以添加進(jìn)去。

    (5)來(lái)電提示。來(lái)電提示是本系統(tǒng)的一大特色。當(dāng)有來(lái)電時(shí)系統(tǒng)會(huì)查詢來(lái)電者的信息,如果來(lái)電號(hào)碼只對(duì)應(yīng)一個(gè)人,則顯示其姓名和所在部門(mén),如若對(duì)應(yīng)多個(gè)人(如來(lái)電號(hào)碼是某個(gè)辦公室的公共電話)則只顯示電話號(hào)碼對(duì)應(yīng)的部門(mén)名稱。如圖6所示。如果用戶沒(méi)有接通來(lái)電,系統(tǒng)還會(huì)記錄來(lái)電者的信息,以便查看漏接的電話是哪個(gè)部門(mén)的哪位同事在哪個(gè)時(shí)間打來(lái)的

    對(duì)于來(lái)電號(hào)碼的查詢需要注意以下問(wèn)題。如果是同城的電話號(hào)碼,用戶在系統(tǒng)中登記固定電話時(shí),一般是不會(huì)登記長(zhǎng)途區(qū)號(hào)的,這是一種普遍的習(xí)慣,但是來(lái)電號(hào)碼中卻是包含長(zhǎng)途區(qū)號(hào)的。另外我國(guó)的長(zhǎng)途區(qū)號(hào)有3位、4位和5位,例如北京是010,深圳是0755,由于位數(shù)的不統(tǒng)一,因此處理起來(lái)比較繁瑣。但是有一點(diǎn)相同的是,長(zhǎng)途區(qū)號(hào)都是以0開(kāi)頭的。而對(duì)于手機(jī)來(lái)電,只會(huì)直接顯示11位的號(hào)碼,即使是長(zhǎng)途,也不會(huì)在前面加0。因此可以斷言,對(duì)于國(guó)內(nèi)的電話,如果來(lái)電號(hào)碼是以0開(kāi)頭的,則必定是固話,否則就是手機(jī)號(hào)碼。為此檢查來(lái)電的邏輯如下:首先查詢系統(tǒng)中是否存在該完整的來(lái)電號(hào)碼,如果有則顯示對(duì)應(yīng)信息,否則檢查該號(hào)碼是否以0開(kāi)頭,如果不是則退出,否則先去掉前3位再檢查,如果依然無(wú)果則去掉前4位再檢查,如此重復(fù),直至找到此號(hào)碼或剩下的號(hào)碼長(zhǎng)度小于3位為止。剩下的號(hào)碼長(zhǎng)度小于3位的原因是,我國(guó)的電話號(hào)碼是沒(méi)有小于3位的。在Android系統(tǒng)下的核心代碼如下所示。

    //查詢電話號(hào)碼信息

    String info=usersTelephoneViewController.getUserInfo(phoneNumber);

    //找不到該電話號(hào)碼信息

    if (info.isEmpty(》{

    //判斷是否為固話

    if (phoneNumber.startsWith(“0”)){

    //去掉長(zhǎng)途區(qū)號(hào)再找

    String number= phoneNumber.substring(3);

    while《info=usersTelephoneViewController.getUserInfo(number》.isEmpty()

    && (number.length()>3》{

    number= number.substring(l);

    }

    }

    }

    if (linfo.isEmpty(》

    popWindow(info+“\r\n”+phoneNumber);

    } else{

    removeWindow();

    }

    (6)參數(shù)設(shè)置。包括設(shè)置是否啟用來(lái)電提示,設(shè)置軟件和通訊錄更新方式等等。這樣用戶可以選擇在哪種聯(lián)網(wǎng)狀態(tài)下才檢查軟件和通訊錄更新,以避免消耗用戶的上網(wǎng)流量。endprint

    (7)自動(dòng)同步通訊錄。在設(shè)定的聯(lián)網(wǎng)狀態(tài)下,系統(tǒng)會(huì)啟用后臺(tái)線程,對(duì)比本地通訊錄與云端的數(shù)據(jù)是否有差異,如有差異,則自動(dòng)下載差異的數(shù)據(jù)并更新本地信息。由于差異的數(shù)據(jù)通常不多,因此同步所消耗的流量也是非常有限的。另外此過(guò)程是自動(dòng)的,對(duì)于用戶完全透明,不需要人工干預(yù)。

    前面已提到,數(shù)據(jù)更新的信息是在數(shù)據(jù)庫(kù)的觸發(fā)器中記錄的,因此客戶端只需通過(guò)對(duì)比本地的數(shù)據(jù)版本號(hào)和服務(wù)器端的數(shù)據(jù)版本號(hào)即可獲知是否有數(shù)據(jù)需要更新。這里取DataChangelnfo表中字段OID的值作為數(shù)據(jù)版本號(hào),只要客戶端的數(shù)據(jù)版本號(hào)小于服務(wù)器端的數(shù)據(jù)版本號(hào),則客戶端就會(huì)讀取DataChangelnfo表中所有大于客戶端數(shù)據(jù)版本號(hào)的記錄,然后根據(jù)所記錄的操作類(lèi)型再?gòu)膶?duì)應(yīng)的數(shù)據(jù)表中獲取更新信息或刪除本地的某條記錄,這樣就實(shí)現(xiàn)了差異數(shù)據(jù)的更新操作。

    (8)系統(tǒng)更新。與自動(dòng)同步通訊錄相同,在設(shè)定的聯(lián)網(wǎng)狀態(tài)下,后臺(tái)線程會(huì)檢查系統(tǒng)是否有新版本,若有則提示用戶進(jìn)行更新??蛻舳塑浖加邪姹咎?hào),只要對(duì)比本地的軟件版本號(hào)和服務(wù)器發(fā)布的版本號(hào)即可獲知是否有更新。

    2.4.2 Web網(wǎng)站應(yīng)用

    Web網(wǎng)站應(yīng)用以網(wǎng)頁(yè)的形式給用戶提供服務(wù),其擴(kuò)展性非常好。例如可以嵌入各企業(yè)的門(mén)戶平臺(tái),可以接人微信平臺(tái)等等。但由于Web方式無(wú)法獲取某些設(shè)備信息,所以此模式下無(wú)法實(shí)現(xiàn)手機(jī)卡檢測(cè)、來(lái)電提示等特殊功能。另外Web方式只能實(shí)時(shí)獲取數(shù)據(jù),因此無(wú)法離線使用。除此之外,其他的功能與智能終端App應(yīng)用方式相同。另外由于該Web網(wǎng)站要同時(shí)兼容PC模式和移動(dòng)模式,因此在開(kāi)發(fā)時(shí)需要在頁(yè)面中添加聲明,否則在移動(dòng)設(shè)備上使用時(shí)會(huì)出現(xiàn)頁(yè)面很小,不能自適應(yīng)屏幕大小等問(wèn)題。

    2.5 管理端

    管理端也是以網(wǎng)頁(yè)形式提供服務(wù)。主要是供管理員對(duì)通訊錄信息進(jìn)行增、刪、改等操作,也就是通過(guò)調(diào)用數(shù)據(jù)訪問(wèn)層的接口函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)信息的處理。同樣為了讓系統(tǒng)同時(shí)兼容PC模式和移動(dòng)模式,也需要在頁(yè)面中添加上面的聲明語(yǔ)句。

    3 結(jié)論

    目前,筆者已經(jīng)成功研發(fā)了這套以云計(jì)算技術(shù)為基礎(chǔ),以HJO(HTTP+JSON+OAuth)為架構(gòu)的企業(yè)共享型移動(dòng)通訊錄,并已獲得國(guó)家軟件著作權(quán)授權(quán)。系統(tǒng)在筆者單位使用后受到了用戶的好評(píng)。

    本系統(tǒng)實(shí)現(xiàn)了通訊錄信息的高度共享和自主管理的能力。用戶能在不同的地點(diǎn)使用各種終端(如手機(jī)、平板電腦、PC機(jī)等)獲取云端的數(shù)據(jù)信息。借助移動(dòng)終端隨身攜帶的特點(diǎn),結(jié)合云計(jì)算技術(shù),系統(tǒng)突破了時(shí)間和地域的限制,讓每個(gè)用戶能夠隨時(shí)隨地地維護(hù)自己的信息,充分顯現(xiàn)移動(dòng)應(yīng)用的便捷性,另外還提高了數(shù)據(jù)的時(shí)效性、準(zhǔn)確性、可靠性和可用性,減輕了企業(yè)對(duì)員工通訊錄信息的維護(hù)工作量,降低了維護(hù)成本,提高了維護(hù)的效率。利用來(lái)電提示功能,用戶不需要維護(hù)手機(jī)本身的通訊錄,也能對(duì)同事的來(lái)電一目了然;使用離線數(shù)據(jù)同步技術(shù)方便了用戶離線使用,節(jié)省了通訊流量,這些都給使用者帶來(lái)了更好的用戶體驗(yàn)。由于系統(tǒng)使用了HJO架構(gòu),因此具有良好的擴(kuò)展能力,后續(xù)該系統(tǒng)可以擴(kuò)展為多企業(yè)的數(shù)據(jù)共享,甚至是以行業(yè)或地區(qū)為基礎(chǔ)的數(shù)據(jù)共享。例如餐飲業(yè),系統(tǒng)可以匯集各商家的聯(lián)系方式,同時(shí)商家也可自行維護(hù)自己的信息,用戶通過(guò)本系統(tǒng)即可以迅速查找所需餐廳的聯(lián)系方式,這樣即方便商家推廣也方便了用戶的使用。

    猜你喜歡
    云計(jì)算
    談云計(jì)算與信息資源共享管理
    基于MapReduce的故障診斷方法
    實(shí)驗(yàn)云:理論教學(xué)與實(shí)驗(yàn)教學(xué)深度融合的助推器
    欧美精品高潮呻吟av久久| av国产精品久久久久影院| 久久99一区二区三区| 亚洲经典国产精华液单| 五月开心婷婷网| 免费在线观看完整版高清| 久久精品熟女亚洲av麻豆精品| 在线观看人妻少妇| 亚洲国产欧美日韩在线播放| 啦啦啦啦在线视频资源| 香蕉精品网在线| 久久久国产欧美日韩av| 欧美97在线视频| 精品国产一区二区三区久久久樱花| 视频在线观看一区二区三区| 久久影院123| 最近2019中文字幕mv第一页| 宅男免费午夜| 交换朋友夫妻互换小说| √禁漫天堂资源中文www| 一区二区三区乱码不卡18| 国产一级毛片在线| 国产在线视频一区二区| 大香蕉久久成人网| 看免费av毛片| 亚洲美女搞黄在线观看| av有码第一页| 日本vs欧美在线观看视频| 亚洲精品久久午夜乱码| 天天躁夜夜躁狠狠躁躁| 色网站视频免费| 一区二区av电影网| 国产在视频线精品| 夜夜爽夜夜爽视频| 天天躁夜夜躁狠狠久久av| 欧美精品国产亚洲| 亚洲欧美日韩另类电影网站| 欧美+日韩+精品| 亚洲精品,欧美精品| 伦理电影免费视频| 97精品久久久久久久久久精品| 亚洲国产精品专区欧美| 精品久久久精品久久久| 亚洲第一av免费看| 中文字幕人妻丝袜制服| 亚洲美女视频黄频| 国产成人91sexporn| 久久精品国产亚洲av天美| 最近2019中文字幕mv第一页| 欧美精品亚洲一区二区| 久久久久网色| 性色avwww在线观看| 亚洲欧美日韩卡通动漫| 大片免费播放器 马上看| av不卡在线播放| 日韩免费高清中文字幕av| 黄色视频在线播放观看不卡| 久久人人爽人人片av| 国产69精品久久久久777片| 免费黄网站久久成人精品| 精品亚洲成国产av| 成年动漫av网址| 久久精品国产亚洲av涩爱| av.在线天堂| 国产麻豆69| 久久人人爽av亚洲精品天堂| 美国免费a级毛片| 日日啪夜夜爽| 亚洲精品aⅴ在线观看| 一边亲一边摸免费视频| 韩国高清视频一区二区三区| 国产一区二区激情短视频 | 成人毛片a级毛片在线播放| 中文精品一卡2卡3卡4更新| 女性被躁到高潮视频| 久久国产精品男人的天堂亚洲 | 亚洲精品成人av观看孕妇| 欧美变态另类bdsm刘玥| av免费观看日本| 久久久精品94久久精品| 久久 成人 亚洲| 国产精品国产三级国产av玫瑰| 丝袜人妻中文字幕| 亚洲av日韩在线播放| 久久99一区二区三区| 狠狠婷婷综合久久久久久88av| 天堂中文最新版在线下载| 男女边摸边吃奶| av播播在线观看一区| 亚洲伊人久久精品综合| 国产精品免费大片| 日本av手机在线免费观看| 王馨瑶露胸无遮挡在线观看| 人妻人人澡人人爽人人| 亚洲欧美一区二区三区国产| 热re99久久精品国产66热6| 亚洲精品一区蜜桃| 久久久欧美国产精品| 亚洲人成77777在线视频| 国产精品 国内视频| 伦理电影免费视频| 9热在线视频观看99| 狠狠精品人妻久久久久久综合| 晚上一个人看的免费电影| 丝袜在线中文字幕| 日韩制服丝袜自拍偷拍| 少妇精品久久久久久久| www.av在线官网国产| 国产一区二区三区综合在线观看 | 日本爱情动作片www.在线观看| 男人爽女人下面视频在线观看| 婷婷色av中文字幕| 久久婷婷青草| 国产精品.久久久| 国产福利在线免费观看视频| 一区二区av电影网| 天堂8中文在线网| 97人妻天天添夜夜摸| 99久久人妻综合| 日韩成人伦理影院| 大话2 男鬼变身卡| 极品人妻少妇av视频| 热re99久久国产66热| 天堂俺去俺来也www色官网| 亚洲成人一二三区av| 亚洲精品国产av蜜桃| 日日啪夜夜爽| 日韩成人伦理影院| 中文天堂在线官网| 久久久久久人人人人人| 大香蕉97超碰在线| 99热这里只有是精品在线观看| 一区二区三区四区激情视频| av免费观看日本| 我的女老师完整版在线观看| 久久久国产一区二区| 国产精品久久久久久av不卡| 国产成人aa在线观看| 久久精品国产亚洲av天美| 国产一区二区三区综合在线观看 | 91精品国产国语对白视频| 国产黄色视频一区二区在线观看| tube8黄色片| 黄色配什么色好看| 视频在线观看一区二区三区| 18禁裸乳无遮挡动漫免费视频| 天美传媒精品一区二区| 亚洲人与动物交配视频| 成人黄色视频免费在线看| 亚洲av.av天堂| 18禁裸乳无遮挡动漫免费视频| 激情五月婷婷亚洲| 热re99久久国产66热| 国产 精品1| 婷婷色av中文字幕| 午夜福利乱码中文字幕| 免费看不卡的av| 国产有黄有色有爽视频| 五月伊人婷婷丁香| 欧美少妇被猛烈插入视频| 亚洲av免费高清在线观看| 青春草国产在线视频| 免费少妇av软件| 成人亚洲欧美一区二区av| 久久婷婷青草| 中文字幕人妻丝袜制服| 99香蕉大伊视频| 桃花免费在线播放| 午夜福利视频精品| 超碰97精品在线观看| 18禁动态无遮挡网站| 日韩视频在线欧美| 伦理电影大哥的女人| 你懂的网址亚洲精品在线观看| 一边摸一边做爽爽视频免费| 天堂俺去俺来也www色官网| 在线观看一区二区三区激情| 美女脱内裤让男人舔精品视频| 中国三级夫妇交换| 嫩草影院入口| 黄色 视频免费看| 久久久a久久爽久久v久久| av视频免费观看在线观看| 久久久久久久久久久免费av| 国产一区二区三区av在线| 成人18禁高潮啪啪吃奶动态图| 免费日韩欧美在线观看| 亚洲少妇的诱惑av| videosex国产| 日韩不卡一区二区三区视频在线| 搡老乐熟女国产| 一区二区三区四区激情视频| 久久人妻熟女aⅴ| 男女边摸边吃奶| 人人妻人人澡人人看| 一边亲一边摸免费视频| 婷婷色综合www| 三上悠亚av全集在线观看| 一区二区日韩欧美中文字幕 | 在线天堂中文资源库| 亚洲精品久久久久久婷婷小说| 高清av免费在线| 久久国内精品自在自线图片| 亚洲伊人色综图| 91精品三级在线观看| 亚洲精品,欧美精品| √禁漫天堂资源中文www| 亚洲国产精品成人久久小说| 日日啪夜夜爽| 成人免费观看视频高清| av免费观看日本| 成人漫画全彩无遮挡| 久久精品久久久久久久性| 亚洲成色77777| 爱豆传媒免费全集在线观看| 夜夜骑夜夜射夜夜干| 国产高清三级在线| 在线天堂中文资源库| 街头女战士在线观看网站| 精品第一国产精品| 9热在线视频观看99| 熟妇人妻不卡中文字幕| 99国产精品免费福利视频| 国产精品无大码| 一级a做视频免费观看| 在现免费观看毛片| 免费少妇av软件| 高清黄色对白视频在线免费看| 寂寞人妻少妇视频99o| 日本黄色日本黄色录像| 亚洲av欧美aⅴ国产| 亚洲一级一片aⅴ在线观看| 亚洲 欧美一区二区三区| 51国产日韩欧美| 日日啪夜夜爽| 精品卡一卡二卡四卡免费| 建设人人有责人人尽责人人享有的| 亚洲精品中文字幕在线视频| 深夜精品福利| 亚洲欧美精品自产自拍| 又粗又硬又长又爽又黄的视频| 国产免费一区二区三区四区乱码| 亚洲少妇的诱惑av| 国产免费福利视频在线观看| 日韩大片免费观看网站| 欧美成人午夜免费资源| 亚洲成人一二三区av| 欧美+日韩+精品| 国产熟女午夜一区二区三区| 观看美女的网站| 麻豆精品久久久久久蜜桃| 丝瓜视频免费看黄片| 在线天堂最新版资源| 亚洲国产av影院在线观看| 国产成人免费无遮挡视频| 自线自在国产av| 国产白丝娇喘喷水9色精品| 又大又黄又爽视频免费| 国产成人a∨麻豆精品| 久久久久久久国产电影| 九草在线视频观看| 哪个播放器可以免费观看大片| 综合色丁香网| 亚洲中文av在线| 亚洲美女黄色视频免费看| av免费在线看不卡| 亚洲国产色片| 韩国高清视频一区二区三区| 日本91视频免费播放| 精品熟女少妇av免费看| 欧美xxⅹ黑人| 搡女人真爽免费视频火全软件| 精品少妇内射三级| 99久久人妻综合| 性高湖久久久久久久久免费观看| 中文欧美无线码| 黄片播放在线免费| 国产精品一二三区在线看| 人妻 亚洲 视频| 成人手机av| 国产精品女同一区二区软件| 亚洲国产色片| 日本欧美视频一区| 色94色欧美一区二区| 精品一区二区三区四区五区乱码 | 制服诱惑二区| 亚洲欧美一区二区三区国产| 久久99一区二区三区| 美女内射精品一级片tv| 亚洲精品美女久久久久99蜜臀 | 欧美激情极品国产一区二区三区 | 国产一区二区激情短视频 | 妹子高潮喷水视频| 91午夜精品亚洲一区二区三区| 精品卡一卡二卡四卡免费| 免费看光身美女| 日本猛色少妇xxxxx猛交久久| 老女人水多毛片| av福利片在线| 欧美丝袜亚洲另类| 交换朋友夫妻互换小说| 亚洲情色 制服丝袜| 热99国产精品久久久久久7| 久久久国产欧美日韩av| 久久鲁丝午夜福利片| 国产极品粉嫩免费观看在线| 99九九在线精品视频| 久久久a久久爽久久v久久| 男的添女的下面高潮视频| 男女高潮啪啪啪动态图| 久久久精品区二区三区| 亚洲经典国产精华液单| 最近中文字幕高清免费大全6| 国产午夜精品一二区理论片| √禁漫天堂资源中文www| 免费黄频网站在线观看国产| 久久这里只有精品19| 黄色 视频免费看| 只有这里有精品99| 亚洲人与动物交配视频| 1024视频免费在线观看| av女优亚洲男人天堂| 国产av码专区亚洲av| 亚洲,一卡二卡三卡| 亚洲成av片中文字幕在线观看 | 免费大片18禁| 国产成人一区二区在线| 欧美精品av麻豆av| 欧美变态另类bdsm刘玥| 多毛熟女@视频| 久久狼人影院| 一级片'在线观看视频| 亚洲国产精品国产精品| 精品一区二区三区四区五区乱码 | 伊人亚洲综合成人网| 一本大道久久a久久精品| 国产白丝娇喘喷水9色精品| av国产精品久久久久影院| a级片在线免费高清观看视频| 有码 亚洲区| 国产精品久久久av美女十八| 自拍欧美九色日韩亚洲蝌蚪91| 日日啪夜夜爽| 一本—道久久a久久精品蜜桃钙片| 中文字幕亚洲精品专区| 亚洲欧洲国产日韩| 韩国精品一区二区三区 | 亚洲国产看品久久| 大码成人一级视频| 夜夜爽夜夜爽视频| 精品久久国产蜜桃| 两个人免费观看高清视频| 九色成人免费人妻av| 又黄又爽又刺激的免费视频.| 色婷婷av一区二区三区视频| 十八禁高潮呻吟视频| 亚洲欧洲国产日韩| 黑人巨大精品欧美一区二区蜜桃 | 国产xxxxx性猛交| 亚洲一级一片aⅴ在线观看| 久久精品国产鲁丝片午夜精品| 99热国产这里只有精品6| 国产成人欧美| av福利片在线| 久久久久久人妻| 99热国产这里只有精品6| 999精品在线视频| 久久久久久久久久久久大奶| 免费观看无遮挡的男女| 国产日韩欧美在线精品| 你懂的网址亚洲精品在线观看| 中文精品一卡2卡3卡4更新| 曰老女人黄片| 精品少妇黑人巨大在线播放| av又黄又爽大尺度在线免费看| 三级国产精品片| 美女脱内裤让男人舔精品视频| 丰满迷人的少妇在线观看| 久久久国产欧美日韩av| 亚洲精品色激情综合| 91成人精品电影| 日韩大片免费观看网站| 在线观看一区二区三区激情| 有码 亚洲区| 青春草视频在线免费观看| 九色成人免费人妻av| 男女无遮挡免费网站观看| 亚洲综合色网址| 国产日韩欧美在线精品| 欧美国产精品一级二级三级| 两个人免费观看高清视频| 亚洲精品国产色婷婷电影| 国产午夜精品一二区理论片| 欧美日韩视频高清一区二区三区二| kizo精华| 日本av手机在线免费观看| 深夜精品福利| 国产成人a∨麻豆精品| 久久久久久久久久久免费av| 婷婷色综合www| 免费女性裸体啪啪无遮挡网站| 国产亚洲精品久久久com| 天堂中文最新版在线下载| www日本在线高清视频| 大香蕉久久网| 国产成人a∨麻豆精品| 国产一区二区激情短视频 | 91aial.com中文字幕在线观看| 日韩一区二区三区影片| 亚洲av国产av综合av卡| 免费黄色在线免费观看| 国产精品国产三级专区第一集| 黄色视频在线播放观看不卡| 男女边摸边吃奶| 狂野欧美激情性bbbbbb| 一级片免费观看大全| 制服诱惑二区| 丝袜在线中文字幕| av福利片在线| 丝袜在线中文字幕| 99热国产这里只有精品6| 国产精品蜜桃在线观看| 99国产精品免费福利视频| 久久这里只有精品19| 高清欧美精品videossex| 18禁动态无遮挡网站| 欧美激情极品国产一区二区三区 | 伦理电影免费视频| 热re99久久精品国产66热6| 久久国产精品大桥未久av| 啦啦啦在线观看免费高清www| 久热久热在线精品观看| 国产成人精品在线电影| 久久久久久久精品精品| 国产亚洲av片在线观看秒播厂| 男人操女人黄网站| 亚洲精品456在线播放app| 亚洲美女黄色视频免费看| 超碰97精品在线观看| 日韩人妻精品一区2区三区| 国产成人aa在线观看| 男女免费视频国产| 亚洲欧美日韩另类电影网站| 天天躁夜夜躁狠狠久久av| 日韩 亚洲 欧美在线| 高清黄色对白视频在线免费看| 国产精品嫩草影院av在线观看| 久久久久久久久久人人人人人人| 人妻人人澡人人爽人人| 交换朋友夫妻互换小说| a 毛片基地| 91午夜精品亚洲一区二区三区| 在线观看免费高清a一片| 岛国毛片在线播放| 亚洲精品av麻豆狂野| 亚洲经典国产精华液单| 午夜91福利影院| 99精国产麻豆久久婷婷| 精品少妇内射三级| 熟女电影av网| 精品久久久精品久久久| 中文字幕另类日韩欧美亚洲嫩草| 丝袜美足系列| 免费观看在线日韩| 国产精品一区www在线观看| 亚洲欧美一区二区三区黑人 | 国产精品一二三区在线看| 日本av免费视频播放| 亚洲精品一区蜜桃| 亚洲美女视频黄频| 国产深夜福利视频在线观看| 亚洲国产欧美在线一区| 国产无遮挡羞羞视频在线观看| 精品国产乱码久久久久久小说| 国产亚洲av片在线观看秒播厂| 一边亲一边摸免费视频| 一本一本久久a久久精品综合妖精 国产伦在线观看视频一区 | 成人漫画全彩无遮挡| 岛国毛片在线播放| www日本在线高清视频| 午夜日本视频在线| 中文字幕制服av| 最近最新中文字幕免费大全7| 亚洲丝袜综合中文字幕| 91在线精品国自产拍蜜月| 午夜福利,免费看| 国国产精品蜜臀av免费| 欧美97在线视频| 亚洲成国产人片在线观看| 18禁动态无遮挡网站| 欧美日韩视频精品一区| 少妇 在线观看| 成人毛片a级毛片在线播放| 欧美 亚洲 国产 日韩一| 欧美日韩一区二区视频在线观看视频在线| 毛片一级片免费看久久久久| 黄色配什么色好看| 人人妻人人添人人爽欧美一区卜| 成年动漫av网址| 亚洲国产欧美在线一区| 国产免费又黄又爽又色| 久久久久视频综合| 丝瓜视频免费看黄片| 免费播放大片免费观看视频在线观看| 久热久热在线精品观看| 最黄视频免费看| 久热久热在线精品观看| 日本av免费视频播放| 蜜桃国产av成人99| 在线观看免费日韩欧美大片| 三级国产精品片| 亚洲av国产av综合av卡| 国产日韩欧美视频二区| 亚洲av国产av综合av卡| 麻豆乱淫一区二区| 1024视频免费在线观看| 99热全是精品| 国产精品国产三级专区第一集| 国产一级毛片在线| 精品午夜福利在线看| 尾随美女入室| 一本大道久久a久久精品| freevideosex欧美| 黑人巨大精品欧美一区二区蜜桃 | 国产探花极品一区二区| 丰满少妇做爰视频| 亚洲国产精品一区二区三区在线| 999精品在线视频| 成人国产av品久久久| 国产乱来视频区| 国产国语露脸激情在线看| 26uuu在线亚洲综合色| 久久久a久久爽久久v久久| 一级片'在线观看视频| 日本黄色日本黄色录像| 99久国产av精品国产电影| 国产一区二区三区av在线| 在线观看人妻少妇| 成人18禁高潮啪啪吃奶动态图| a级片在线免费高清观看视频| 亚洲欧洲精品一区二区精品久久久 | 啦啦啦视频在线资源免费观看| av有码第一页| 成人无遮挡网站| 国产av码专区亚洲av| 色婷婷久久久亚洲欧美| 亚洲欧美精品自产自拍| 亚洲国产色片| av网站免费在线观看视频| 亚洲精品成人av观看孕妇| 蜜臀久久99精品久久宅男| 欧美3d第一页| 69精品国产乱码久久久| 亚洲精品国产av蜜桃| 一区二区av电影网| 涩涩av久久男人的天堂| 亚洲成国产人片在线观看| h视频一区二区三区| 国产亚洲最大av| 亚洲,欧美精品.| 日本爱情动作片www.在线观看| 久久久久国产网址| 高清不卡的av网站| 精品国产一区二区三区久久久樱花| 欧美日韩国产mv在线观看视频| 全区人妻精品视频| 国产精品熟女久久久久浪| 一级,二级,三级黄色视频| 韩国av在线不卡| 久久99蜜桃精品久久| 国产欧美日韩一区二区三区在线| 精品一区二区免费观看| 亚洲图色成人| 国产精品国产三级国产av玫瑰| 男人添女人高潮全过程视频| 国产男人的电影天堂91| 熟女av电影| 亚洲av电影在线观看一区二区三区| 捣出白浆h1v1| 国产1区2区3区精品| 国产精品.久久久| 一级毛片我不卡| 天天影视国产精品| 在线观看三级黄色| av视频免费观看在线观看| 中国国产av一级| 国产一区二区激情短视频 | 国产黄色免费在线视频| 欧美成人精品欧美一级黄| 亚洲欧美成人综合另类久久久| 欧美精品高潮呻吟av久久| 高清av免费在线| 考比视频在线观看| 欧美精品av麻豆av| www.av在线官网国产| 久久午夜福利片| 最近最新中文字幕大全免费视频 | 国产精品麻豆人妻色哟哟久久| 精品久久蜜臀av无| 夜夜爽夜夜爽视频| 国产精品一区二区在线不卡| 国产一区二区三区综合在线观看 | 五月开心婷婷网| 最近手机中文字幕大全| 欧美日韩视频精品一区| 成年女人在线观看亚洲视频| 9191精品国产免费久久| 日本与韩国留学比较| 成年动漫av网址| 丰满少妇做爰视频| 国产一区二区三区av在线| 午夜免费观看性视频| 午夜91福利影院| 69精品国产乱码久久久| 国产av一区二区精品久久|