版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章應(yīng)用程序架構(gòu)9.1應(yīng)用程序架構(gòu)9.2校園在線超市系統(tǒng)多層架構(gòu)實(shí)現(xiàn)
【本章提要】
本章介紹了企業(yè)級(jí)應(yīng)用多層設(shè)計(jì)的模式,闡述了應(yīng)用分層的好處。并以校園在線超市用戶注冊(cè)模塊為例,詳細(xì)介紹了系統(tǒng)分層架構(gòu)的實(shí)現(xiàn)過(guò)程。
【學(xué)習(xí)目標(biāo)】
·理解從兩層架構(gòu)發(fā)展成多層架構(gòu)。
·掌握將多層體系架構(gòu)的理念融入到Web應(yīng)用項(xiàng)目的設(shè)計(jì)和實(shí)施方法。
9.1.1將應(yīng)用分層的好處
在大型公司里往往運(yùn)行著大規(guī)模的軟件系統(tǒng),開(kāi)發(fā)人員和分析師們專注于不同的應(yīng)用層級(jí)。這確實(shí)是必須的,因?yàn)椴豢赡茏岄_(kāi)發(fā)人員都理解某個(gè)層級(jí)所有的運(yùn)行細(xì)節(jié),若那樣,則系統(tǒng)實(shí)在是太龐大了。
9.1應(yīng)用程序架構(gòu)想象一下某個(gè)保險(xiǎn)公司里的應(yīng)用程序必須完成的所有功能。從最簡(jiǎn)化的流程來(lái)說(shuō),保險(xiǎn)公司要能接收新的保險(xiǎn)單,評(píng)估與保險(xiǎn)單相關(guān)的風(fēng)險(xiǎn),向投保者開(kāi)出賬單,打印保險(xiǎn)單然后將它郵寄出去,處理保險(xiǎn)單的索賠,更新保險(xiǎn)單,如果過(guò)期(或者沒(méi)有支付費(fèi)用)則取消保險(xiǎn)單,等等。這一巨大的流程顯然不僅僅是一個(gè)桌面應(yīng)用程序所能處理的。
無(wú)論用戶是不是想這么做,Web應(yīng)用還是分層的好。如果用戶是用SQLServer數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的,那么數(shù)據(jù)庫(kù)本身就已經(jīng)是一個(gè)從Web服務(wù)器上分離出來(lái)的層了(即使物理上它們是在同一臺(tái)計(jì)算機(jī)里)。作為一個(gè)面向?qū)ο蟮钠脚_(tái),ASP.NET使得這種分層操作更加容易了。應(yīng)用程序分層使得整個(gè)開(kāi)發(fā)更加容易,因?yàn)榉謱訉⒛承┨囟康牟僮鞣庋b成一個(gè)個(gè)獨(dú)立的模塊,它們可以單獨(dú)維護(hù)和修改,同時(shí)也分散了維護(hù)的工作量。
例如,一個(gè)簡(jiǎn)單的在線零售程序采用了分層的思想,如圖9-1所示。
從圖中可以看出物理硬件分層與應(yīng)用程序分層的結(jié)合。實(shí)際上有三個(gè)分層運(yùn)行于一個(gè)Web服務(wù)器上,第一層是Web站點(diǎn)的用戶界面層(UserInterface),它由業(yè)務(wù)規(guī)則層支持,業(yè)務(wù)規(guī)則層(BusinessRulesLayer)決定什么樣的數(shù)據(jù)將被提供給用戶界面層,業(yè)務(wù)規(guī)則層與數(shù)據(jù)訪問(wèn)層交互,而數(shù)據(jù)訪問(wèn)層則通過(guò)一個(gè)事務(wù)通道程序來(lái)獲取所需要的數(shù)據(jù),其他的客戶服務(wù)和倉(cāng)庫(kù)系統(tǒng)也通過(guò)事務(wù)通道程序來(lái)獲得所需的數(shù)據(jù)。
圖9-1在線零售應(yīng)用程序的分層每一層都僅僅關(guān)注于自身的功能實(shí)現(xiàn),如業(yè)務(wù)規(guī)則層不需要知道任何關(guān)于數(shù)據(jù)存儲(chǔ)方面的信息,它只需要了解由數(shù)據(jù)訪問(wèn)層提供的接口即可。事實(shí)上,業(yè)務(wù)規(guī)則層完全不必關(guān)心使用什么樣的數(shù)據(jù)庫(kù),或者是否存在一個(gè)數(shù)據(jù)庫(kù)。它只需要了解有一個(gè)數(shù)據(jù)訪問(wèn)層能用于交互,以及它可以通過(guò)一個(gè)公共的接口來(lái)交互數(shù)據(jù)即可。
盡管整個(gè)系統(tǒng)的完善需要集成測(cè)試,但是如果各層之間一致認(rèn)同的接口沒(méi)有發(fā)生改變,則我們可以在不干擾其他層的情況下改變?nèi)魏我粚拥膬?nèi)部結(jié)構(gòu)。9.1.2n級(jí)架構(gòu)
任何關(guān)于應(yīng)用程序架構(gòu)的討論中,如果沒(méi)有提到經(jīng)典的n級(jí)架構(gòu),那么就是不完整的?!皀”代表任何數(shù)字,適用于描述我們所創(chuàng)建的應(yīng)用程序。層(layer)或級(jí)(tier)的數(shù)目,由應(yīng)用程序塊的需求和結(jié)構(gòu)來(lái)決定。
一般而言,甚至最基本的Web應(yīng)用程序都能夠被分離成三層:用戶界面層(UI)、業(yè)務(wù)規(guī)則層(BusinessRulesLayer)以及數(shù)據(jù)層(DataLayer)。用戶界面層就是用戶能夠見(jiàn)到的HTML和Web控件,業(yè)務(wù)規(guī)則層則承擔(dān)著應(yīng)用程序最重要的角色,而數(shù)據(jù)層則是數(shù)據(jù)庫(kù)或者其他數(shù)據(jù)訪問(wèn)代碼,這取決于應(yīng)用程序的結(jié)構(gòu)。如果需要,可以將應(yīng)用程序分得更細(xì):用戶可以擁有用戶界面(.aspx頁(yè)面)、作為用戶界面“粘合劑”而被頁(yè)面繼承的類或局部類、業(yè)務(wù)規(guī)則層(業(yè)務(wù)規(guī)則類)、數(shù)據(jù)訪問(wèn)層(數(shù)據(jù)訪問(wèn)類)以及數(shù)據(jù)層本身(數(shù)據(jù)庫(kù))。
假如由于某種原因,決定將SQLServer數(shù)據(jù)庫(kù)替換為Oracle數(shù)據(jù)庫(kù),則如果沒(méi)有將應(yīng)用程序分層,而且把數(shù)據(jù)訪問(wèn)代碼放在.aspx頁(yè)面里,那么用戶將不得不冒著把事情搞砸的風(fēng)險(xiǎn),檢查所有頁(yè)面。這顯然不是一種有效的代碼管理方式。實(shí)際上,每個(gè)頁(yè)面間操作數(shù)據(jù)的方式都不同。如果把所有的數(shù)據(jù)訪問(wèn)代碼都放在單個(gè)層里,如一個(gè)擁有操作數(shù)據(jù)方法的類,這樣就可以在不破壞業(yè)務(wù)規(guī)則或者用戶界面的情況下對(duì)代碼進(jìn)行修改。
另一種很常見(jiàn)的情況是,假設(shè)在電子商務(wù)程序中,業(yè)務(wù)規(guī)則要求改變稅款的計(jì)算方式,數(shù)據(jù)庫(kù)沒(méi)有變化,站點(diǎn)本身也不需要變化,僅僅是邏輯改變了,那就意味著只需要改變業(yè)務(wù)規(guī)則層中的類即可。再者,如果邏輯將創(chuàng)建在頁(yè)面中或者是由某些數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的計(jì)算所組成的,那么這項(xiàng)修改操作將變得十分困難。在一個(gè)極端的例子里,稅率可能經(jīng)常改變,那么就不能將稅率硬編碼到代碼中。一般的解決方式是將稅率存儲(chǔ)在數(shù)據(jù)庫(kù)中,并創(chuàng)建用戶易于操作的相關(guān)工具。
9.2.1系統(tǒng)架構(gòu)設(shè)計(jì)
微軟
.NET平臺(tái)可以方便快速地開(kāi)發(fā)和部署多層架構(gòu)應(yīng)用程序。在校園在線超市系統(tǒng)中,其架構(gòu)在邏輯上劃分成數(shù)據(jù)實(shí)體層(DML)、數(shù)據(jù)訪問(wèn)層(DAL)、業(yè)務(wù)邏輯層(BLL)和應(yīng)用層(UI)四層,如圖9-2所示。9.2校園在線超市系統(tǒng)多層架構(gòu)實(shí)現(xiàn)
圖9-2系統(tǒng)分層架構(gòu)設(shè)計(jì)從圖中看出,這種分層結(jié)構(gòu)易于理解,同時(shí)也使應(yīng)用程序的維護(hù)和修改變得更加容易。假定我們要為MicrosoftAccess數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)新的數(shù)據(jù)訪問(wèn)層,則只需要改變數(shù)據(jù)訪問(wèn)層代碼即可。通過(guò)用戶界面進(jìn)行的輸入和輸出數(shù)據(jù)的過(guò)程,實(shí)際上是在創(chuàng)建業(yè)務(wù)邏輯層的各種對(duì)象。例如,在應(yīng)用程序中添加一個(gè)新的商品時(shí),只需要?jiǎng)?chuàng)建一個(gè)商品對(duì)象,而不需要了解任何關(guān)于數(shù)據(jù)庫(kù)中的具體細(xì)節(jié)。下面以“用戶注冊(cè)模塊”為例,說(shuō)明校園在線超市系統(tǒng)的多層實(shí)現(xiàn)過(guò)程。為了區(qū)分校園在線超市兩層實(shí)現(xiàn)的定義,這里將解決方案命名為“NetShop”,在數(shù)據(jù)庫(kù)設(shè)計(jì)和命名上也做一些改進(jìn)。9.2.2數(shù)據(jù)實(shí)體層實(shí)現(xiàn)
數(shù)據(jù)實(shí)體層(DML,DataModelLayer)主要功能是實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)實(shí)體和實(shí)體關(guān)系表到應(yīng)用程序?qū)ο蟮挠成?。?shù)據(jù)庫(kù)中有名為“Users”的實(shí)體表,用來(lái)存儲(chǔ)注冊(cè)用戶的相關(guān)信息。打開(kāi)VS2005,創(chuàng)建一個(gè)新網(wǎng)站,新建名為“Model”的文件夾,命名空間為“NetShop.Model”,在該文件夾下添加類庫(kù)文件User.cs,創(chuàng)建用戶類。相應(yīng)代碼編寫如下:
usingSystem;
namespaceNetShop.Model
{
//<summary>
//實(shí)體類Users(屬性說(shuō)明自動(dòng)提取數(shù)據(jù)庫(kù)字段的描述信息)
//</summary>
[Serializable]
publicclassUsers
{
publicUsers()
{}
#regionModel
privateint_s_id; //用戶ID
privatestring_s_name; //用戶名稱
privatestring_s_password; //用戶密碼
privatestring_s_qq; //用戶QQ
privatestring_s_email; //Email
privatestring_s_phone; //聯(lián)系電話
privatestring_s_address; //通信地址
privatestring_s_sex;//性別
privatestring_s_idcard; //身份證號(hào)
privateDateTime?_s_date; //出生日期
privatestring_s_answer; //密碼答案
privatestring_s_question; //密碼問(wèn)題
privateint_s_type; //用戶類型
privatestring_s_photo; //用戶圖片
privateint?_s_adminid;
//<summary>
//用戶ID
//</summary>
publicints_id
{
set{_s_id=value;}
get{return_s_id;}
}
//<summary>
//用戶名稱
//</summary>
publicstrings_name
{
set{_s_name=value;}
get{return_s_name;}
}
//<summary>
//用戶密碼
//</summary>
publicstrings_password
{
set{_s_password=value;}
get{return_s_password;}
}
//<summary>
//用戶QQ
//</summary>
publicstrings_qq
{
set{_s_qq=value;}
get{return_s_qq;}
}
//<summary>
//</summary>
publicstrings_email
{
set{_s_email=value;}
get{return_s_email;}
}
//<summary>
//聯(lián)系電話
//</summary>
publicstrings_phone
{
set{_s_phone=value;}
get{return_s_phone;}
}
//<summary>
//通信地址
//</summary>
publicstrings_address
{
set{_s_address=value;}
get{return_s_address;}
}
//<summary>
//性別
//</summary>
publicstrings_sex
{
set{_s_sex=value;}
get{return_s_sex;}
}
//<summary>
//身份證號(hào)
//</summary>
publicstrings_idcard
{
set{_s_idcard=value;}
get{return_s_idcard;}
}
//<summary>
//出生日期
//</summary>
publicDateTimes_date//這里的?表示該屬性可以為空
{
set{_s_date=value;}
get{return_s_date;}
}
//<summary>
//密碼答案
//</summary>
publicstrings_answer
{
set{_s_answer=value;}
get{return_s_answer;}
}
//<summary>
//密碼問(wèn)題
//</summary>
publicstrings_question
{
set{_s_question=value;}
get{return_s_question;}
}
//<summary>
//用戶類型
//</summary>
publicint?s_type
{
set{_s_type=value;}
get{return_s_type;}
}
//<summary>
//用戶圖片
//</summary>
publicstrings_photo
{
set{_s_photo=value;}
get{return_s_photo;}
}
//<summary>
//
//</summary>
publicint?s_adminid
{
set{_s_adminid=value;}
get{return_s_adminid;}
}
#endregionModel
}
}9.2.3數(shù)據(jù)訪問(wèn)層實(shí)現(xiàn)
當(dāng)用戶注冊(cè)時(shí),會(huì)向Users表插入一條記錄。在本系統(tǒng)中,數(shù)據(jù)訪問(wèn)層(IDAL,DataAccessLayer)的實(shí)現(xiàn)分成以下三個(gè)步驟:
·定義對(duì)象接口類。
·實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)接口類。
·定義數(shù)據(jù)工廠類創(chuàng)建對(duì)象接口。
1.定義對(duì)象接口類
在解決方案中創(chuàng)建文件夾“IDAL”,并定義此文件夾下命名空間為“NetShop.IDAL”、名為IUsers的接口。這樣做是為了讓數(shù)據(jù)訪問(wèn)層易于替換并支持其他數(shù)據(jù)庫(kù),使用接口來(lái)強(qiáng)制自己實(shí)現(xiàn)整個(gè)數(shù)據(jù)訪問(wèn)類的結(jié)構(gòu)。代碼如下:
usingSystem;
usingSystem.Data;
namespaceNetShop.IDAL
{
//<summary>
//接口層IUsers的摘要說(shuō)明
//</summary>
publicinterfaceIUsers
{
#region成員方法
//<summary>
//得到最大ID
//</summary>
intGetMaxId();
//<summary>
//是否存在該記錄
//</summary>
boolExists(ints_id);
//<summary>
//增加一條數(shù)據(jù)
//</summary>
intAdd(NetShop.Model.Usersmodel);
//<summary>
//更新一條數(shù)據(jù)
//</summary>
boolUpdate(NetShop.Model.Usersmodel);
//<summary>
//刪除一條數(shù)據(jù)
//</summary>
boolDelete(ints_id);
//<summary>
//得到一個(gè)對(duì)象實(shí)體
//</summary>
NetShop.Model.UsersGetModel(ints_id);
//<summary>
//獲得數(shù)據(jù)列表
//</summary>
DataSetGetList(stringstrWhere);
//<summary>
//獲得前幾行數(shù)據(jù)
//</summary>
DataSetGetList(intTop,stringstrWhere,stringfiledOrder);
//<summary>
//獲得數(shù)據(jù)列表
//</summary>
intGetUser(stringstrWhere);
//<summary>
//修改基本信息
//</summary>
//<paramname="model"></param>
//<returns></returns>
boolUpdatajiben(NetShop.Model.Usersmodel);
//<summary>
//修改問(wèn)題答案
//</summary>
//<paramname="model"></param>
//<returns></returns>
boolUpdataQuestion(NetShop.Model.Usersmodel);
//<summary>
//修改密碼
//</summary>
//<paramname="model"></param>
//<returns></returns>
boolUpdatapassword(NetShop.Model.Usersmodel);
#endregion成員方法
}
}從上述代碼上看,接口沒(méi)有任何實(shí)現(xiàn)代碼,它的根本目的在于讓我們知道實(shí)現(xiàn)它的類應(yīng)該具有的結(jié)構(gòu)。這種方式對(duì)問(wèn)題的理解更加直觀,但是在業(yè)務(wù)邏輯層上要求能夠訪問(wèn)接口實(shí)現(xiàn)類中的所有方法。要實(shí)現(xiàn)這個(gè)目的,可以根據(jù)web.config文件中的配置,結(jié)合反射來(lái)加載數(shù)據(jù)訪問(wèn)類并將其緩存。在數(shù)據(jù)工廠中,DataAccess類中CreateUsers的靜態(tài)方法實(shí)現(xiàn)了這個(gè)功能。
2.實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)接口類
在解決方案中,創(chuàng)建名為“SQLServerDAL”的文件夾,命名空間名為NetShop.SQLServerDAL,在此中建立名為“Users.cs”的類,實(shí)現(xiàn)IUsers接口。代碼如下:
usingSystem;
usingSystem.Data;
usingSystem.Text;
usingSystem.Data.SqlClient;
usingNetShop.IDAL;
usingNetShop.DBUtility;//請(qǐng)先添加引用
namespaceNetShop.SQLServerDAL
{
//<summary>
//數(shù)據(jù)訪問(wèn)類Users
//</summary>
publicclassUsers:IUsers
{
publicUsers(){}
#region成員方法
//<summary>
//增加一條數(shù)據(jù)
//</summary>
publicintAdd(NetShop.Model.Usersmodel)
{
StringBuilderstrSql=newStringBuilder();
strSql.Append("insertintoNetShop_Users(");
strSql.Append("s_name,s_password,s_qq,s_email,s_phone,s_address,
s_sex,s_idcard,s_date,s_answer,s_question,s_type,s_photo,s_adminid)");
strSql.Append("values(");
strSql.Append("@s_name,@s_password,@s_qq,@s_email,@s_phone,
@s_address,@s_sex,@s_idcard,@s_date,@s_answer,@s_question,@s_type,
@s_photo,@s_adminid)");
strSql.Append(";select@@IDENTITY");
SqlParameter[]parameters={
newSqlParameter("@s_name",SqlDbType.VarChar,16),
newSqlParameter("@s_password",SqlDbType.VarChar,24),
newSqlParameter("@s_qq",SqlDbType.VarChar,12),
newSqlParameter("@s_email",SqlDbType.VarChar,30),
newSqlParameter("@s_phone",SqlDbType.VarChar,15),
newSqlParameter("@s_address",SqlDbType.VarChar,100),
newSqlParameter("@s_sex",SqlDbType.VarChar,2),
newSqlParameter("@s_idcard",SqlDbType.VarChar,20),
newSqlParameter("@s_date",SqlDbType.DateTime),
newSqlParameter("@s_answer",SqlDbType.VarChar,100),
newSqlParameter("@s_question",SqlDbType.VarChar,100),
newSqlParameter("@s_type",SqlDbType.Int,4),
newSqlParameter("@s_photo",SqlDbType.VarChar,100),
newSqlParameter("@s_adminid",SqlDbType.Int,4)};
parameters[0].Value=model.s_name;
parameters[1].Value=model.s_password;
parameters[2].Value=model.s_qq;
parameters[3].Value=model.s_email;
parameters[4].Value=model.s_phone;
parameters[5].Value=model.s_address;
parameters[6].Value=model.s_sex;
parameters[7].Value=model.s_idcard;
parameters[8].Value=model.s_date;
parameters[9].Value=model.s_answer;
parameters[10].Value=model.s_question;
parameters[11].Value=model.s_type;
parameters[12].Value=model.s_photo;
parameters[13].Value=model.s_adminid;
objectobj=DbHelperSQL.GetSingle(strSql.ToString(),parameters);
if(obj==null)
{
return1;
}
else
{
returnConvert.ToInt32(obj);
}
}
}
3.定義數(shù)據(jù)工廠類創(chuàng)建對(duì)象接口
在解決方案中,創(chuàng)建名為“DALFactory”的文件夾,命名空間名為NetShop.DALFactory,在此中建立名為“DataAccess.cs”的類來(lái)定義數(shù)據(jù)工廠,以實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)。代碼如下:
usingSystem;
usingSystem.Reflection;
usingSystem.Configuration;
namespaceNetShop.DALFactory
{
//<summary>
//AbstractFactorypatterntocreatetheDAL
//</summary>
publicsealedclassDataAccess
{
privatestaticreadonlystringAssemblyPath=ConfigurationManager.AppSettings["DAL"];
//<summary>
//創(chuàng)建Users數(shù)據(jù)層接口
//</summary>
publicstaticNetShop.IDAL.IUsersCreateUsers()
{
stringClassNamespace=AssemblyPath+".Users";
objectobjType=CreateObject(AssemblyPath,ClassNamespace);
return(NetShop.IDAL.IUsers)objType;
}
}
}9.2.4業(yè)務(wù)邏輯層實(shí)現(xiàn)
為了實(shí)現(xiàn)對(duì)用戶注冊(cè)信息的插入,業(yè)務(wù)邏輯層(BLL,BusinessLogicLayer)需要調(diào)用來(lái)自數(shù)據(jù)訪問(wèn)層的方法,并將相關(guān)值作為參數(shù)傳遞給它。BLL命名空間下的USers類中的Add方法實(shí)現(xiàn)了這一過(guò)程。代碼如下所示:
usingNetShop.IDAL;
usingNetShop.DBUtility;
usingSystem.Text;
namespaceNetShop.BLL
{
//<summary>
//業(yè)務(wù)邏輯類Users的摘要說(shuō)明
//</summary>
publicclassUsers
{
//定義訪問(wèn)用戶對(duì)象的接口變量IUsers
privatereadonlyIUsersdal=DataAccess.CreateUsers();
publicUsers()
{}
#region成員方法
//<summary>
//增加一條數(shù)據(jù)
//</summary>
publicintAdd(NetShop.Model.Usersmodel)
{
returndal.Add(model);
}
}
}
這個(gè)方法完成了許多完全適合于業(yè)務(wù)邏輯層,并且不希望留給用戶界面層或數(shù)據(jù)訪問(wèn)層的工作。9.2.5用戶接口層實(shí)現(xiàn)
通過(guò)對(duì)業(yè)務(wù)邏輯進(jìn)行封裝后,用戶接口層(UI,UserInterface)的設(shè)計(jì)就主要在頁(yè)面設(shè)計(jì)和參數(shù)的傳遞了。用戶接口層上可以在不知道應(yīng)用程序其他部分細(xì)節(jié)的情況下調(diào)用業(yè)務(wù)邏輯層的方法來(lái)實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)邏輯,達(dá)到應(yīng)用層和業(yè)務(wù)邏輯層的協(xié)同工作。其部分代碼
如下:
publicpartialclassUiControl_user_add:System.Web.UI.UserControl
{
NetShop.BLL.Usersus=newNetShop.BLL.Users();
NetShop.Model.Usersuser=newNetShop.Model.Users();
stringimage="UpFiles/UserImages/none.gif";
protectedvoidBtnSubmit_Click(objectsender,EventArgse)
{
if(upImage())
{
user.s_name=tb_user_nam.Text.Trim();
user.s_password=Util.getpwd(tb_password.Text.Trim().ToString());
user.s_qq=tb_password.Text.Trim();
user.s_email=tb_email.Text.Trim();
user.s_phone=tb_phto.Text.Trim();
user.s_address=tb_adrees.Text.Trim();
user.s_sex=tb_sex.SelectedValue.ToString();
user.s_idcard=tb_user_id.Text.Trim();
user.s_date=DateTime.Now;
user.s_photo=image;
if(us.Add(user)>0)
JavaScript.alert("注冊(cè)成功");
else
JavaScript.alert("注冊(cè)失敗");
}
else
{
JavaScript.alert("頭像上傳失敗");
}
}
privateboolupImage()
{
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)孕婦裝行業(yè)競(jìng)爭(zhēng)格局及發(fā)展?jié)摿ρ芯繄?bào)告
- 2024-2030年中國(guó)城市公共汽車客運(yùn)行業(yè)運(yùn)營(yíng)模式及發(fā)展規(guī)劃分析報(bào)告
- 2024-2030年中國(guó)地板椅項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國(guó)圖書(shū)零售連鎖行業(yè)運(yùn)行狀況及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)回收自控系統(tǒng)項(xiàng)目申請(qǐng)報(bào)告
- 2024-2030年中國(guó)啤酒行業(yè)市場(chǎng)營(yíng)銷模式及投資前景展望報(bào)告
- 2024-2030年中國(guó)原青花素行業(yè)需求規(guī)模及投資價(jià)值調(diào)研報(bào)告
- 2024年版權(quán)購(gòu)買合同購(gòu)買價(jià)格及版權(quán)范圍
- 2024年桶裝水品牌形象設(shè)計(jì)與宣傳推廣服務(wù)協(xié)議3篇
- 茂名職業(yè)技術(shù)學(xué)院《電子競(jìng)技用戶分析》2023-2024學(xué)年第一學(xué)期期末試卷
- NB-T31030-2012陸地和海上風(fēng)電場(chǎng)工程地質(zhì)勘察規(guī)范
- 感悟考古智慧樹(shù)知到期末考試答案章節(jié)答案2024年北京大學(xué)
- 溝通的藝術(shù)智慧樹(shù)知到期末考試答案章節(jié)答案2024年湖南師范大學(xué)
- DB32-T 4757-2024 連棟塑料薄膜溫室建造技術(shù)規(guī)范
- 建筑信息模型技術(shù)員理論知識(shí)考試題庫(kù)
- 中國(guó)越劇?唱腔智慧樹(shù)知到期末考試答案2024年
- 信用卡中心委外催收 投標(biāo)方案(技術(shù)方案)
- 汽車品牌文化(吉林聯(lián)盟)智慧樹(shù)知到期末考試答案2024年
- 海洋學(xué)海上實(shí)踐教學(xué)智慧樹(shù)知到期末考試答案2024年
- JTJ034-2000 公路路面基層施工技術(shù)規(guī)范
- 2024年國(guó)家糧食和物資儲(chǔ)備局垂直管理系事業(yè)單位招聘筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論