總結一下現在做的項目,由於混亂的項目經驗,我就全部重新寫了以前的一個項目,搭建的是簡單三層架構的模式,簡單三層是我第一個認識的架構層次的理念,也是影響非常深的,以前只是理論的學學什么設計模式,什么mvc,但是這些根本太遙遠,因為沒有編碼經驗,沒有項目經驗,永遠也無法體會架構之美,更有甚者,認為這些架構太復雜了,還要花時間,仍然是那種業務數據UI混合的模式,然后混雜大量的增刪改查,再加上大量的ctrl+c或者ctrl+v的代碼,以至於面向對象的東西,做了大半年除了封裝類,沒有什么跟面向對象有關系的了.....純屬面向過程+class的模式.那么什么是面向對象,這個問題,太難回答了,面向對象,簡單地說就是拿人的思維去解決問題.
人的思維是復雜的,因此,有了復雜的分工,因此我們在學習面向對象的時候更重要的是想象着,
人怎么做?
回歸正題:三層構架
三層構架,說到底就是一個簡單的分層概念,一個數據訪問層,業務邏輯層,和UI層,而我們經常見到的,
BLL就是業務邏輯層,DAL就是數據訪問層,czcraft網站就是所謂的UI層,而Model是什么呢?這和MVC的model又有什么區別?
model其實就是實體層,因為為了在BLL和DAL以及Ui層傳輸數據,我們要借助model這個實體層來傳輸數據,
比如我們注冊一個帳號信息,
我們可以把所有收集到的帳號信息,保存在一個member的實體類中,然后傳入給BLL處理.
BLL就是業務邏輯層,我們經常會遇到這樣一個現象:
一個asp.net WebForm界面,一個事件大量的代碼
這種代碼,如果一百個登錄是不是要復制一百份,當我們復制的第二次就要考慮怎么復用.
這時候我們想象,為什么要把這些業務寫到事件中?
我們首先要做的就是第一步分離,我們可以嘗試定義一個類的方式,這是第一步的分離,設計一個member類,里面封裝了,member的各種字段和方法,比如登錄,等等,
這是第一步的分離,這樣的好處就是可以復用方法,不用復制復制再次復制,但是這樣子邏輯和數據訪問仍然寫死在一個類中,如果我們要修改比如一個細節,
1.以前登陸都是明文,現在要加密,結果我們又要修改.
2.如果以前數據庫刪除一條會員信息,沒有做級聯刪除(比如關聯會員的其他信息,比如會員購買記錄的信息等),現在要增加,結果又是大量的修改.
為什么我們不分理出數據和操作,以及UI顯示?
我們分離出DAL,專門負責數據庫操作,不管業務邏輯,BLL只負責業務邏輯,
當然為了考慮多種數據庫的兼容設計,我們可以再加一層,IDAL接口層,
當然我們的數據庫操作類也最好設計成兼容多種數據庫的模式,
關於DAL,BLL,我就舉一個實例,比如會員信息,DAL的形式就是這樣,
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using czcraft.Model;
6: using System.Data;
7: using System.Data.SqlClient;
8: using System.Data.Common;
9: namespace czcraft.DAL
10: /*
11: * 作者: Sweet
12: * 創建時間: 2012/5/5 10:13:44
13: * 類說明: czcraft.DAL
14: */
15: {
16: ///<summary>
17: ///member表DAL
18: ///</summary>
19: public partial class memberDAL
20: {
21: DBO.DBOperator SqlHelper = DBO.DBOperator.instance();
22: /// <summary>
23: /// 增加member
24: /// </summary>
25: /// <param name="model">tableName實體</param>
26: /// <returns>執行狀態</returns>
27: public int AddNew(member model)
28: {
29: string sql="insert into member(username,password,Sex,nation,mobilephone,Telephone,Email,qq,Zipcode,Address,states,VCode,VTime) output inserted.Id values(@username,@password,@Sex,@nation,@mobilephone,@Telephone,@Email,@qq,@Zipcode,@Address,@states,@VCode,@VTime)";
30: int id=(int)SqlHelper.ExecuteScalar(sql
31: ,(DbParameter)new SqlParameter("username",model.username)
32: ,(DbParameter)new SqlParameter("password",model.password)
33: ,(DbParameter)new SqlParameter("Sex",model.Sex)
34: ,(DbParameter)new SqlParameter("nation",model.nation)
35: ,(DbParameter)new SqlParameter("mobilephone",model.mobilephone)
36: ,(DbParameter)new SqlParameter("Telephone",model.Telephone)
37: ,(DbParameter)new SqlParameter("Email",model.Email)
38: ,(DbParameter)new SqlParameter("qq",model.qq)
39: ,(DbParameter)new SqlParameter("Zipcode",model.Zipcode)
40: ,(DbParameter)new SqlParameter("Address",model.Address)
41: ,(DbParameter)new SqlParameter("states",model.states)
42: ,(DbParameter)new SqlParameter("VCode",model.VCode)
43: ,(DbParameter)new SqlParameter("VTime",model.VTime)
44: );
45: return id;
46: }
47: /// <summary>
48: /// 更新member實體
49: /// </summary>
50: /// <param name="model">tableName實體</param>
51: /// <returns>執行狀態</returns>
52: public bool Update(member model)
53: {
54: string sql="update member set username=@username,password=@password,Sex=@Sex,nation=@nation,mobilephone=@mobilephone,Telephone=@Telephone,Email=@Email,qq=@qq,Zipcode=@Zipcode,Address=@Address,states=@states where id=@id";
55: return SqlHelper.ExecuteNonQuery(sql
56: ,(DbParameter)new SqlParameter("Id",model.Id)
57: ,(DbParameter)new SqlParameter("username",model.username)
58: ,(DbParameter)new SqlParameter("password",model.password)
59: ,(DbParameter)new SqlParameter("Sex",model.Sex)
60: ,(DbParameter)new SqlParameter("nation",model.nation)
61: ,(DbParameter)new SqlParameter("mobilephone",model.mobilephone)
62: ,(DbParameter)new SqlParameter("Telephone",model.Telephone)
63: ,(DbParameter)new SqlParameter("Email",model.Email)
64: ,(DbParameter)new SqlParameter("qq",model.qq)
65: ,(DbParameter)new SqlParameter("Zipcode",model.Zipcode)
66: ,(DbParameter)new SqlParameter("Address",model.Address)
67: ,(DbParameter)new SqlParameter("states",model.states)
68: //,(DbParameter)new SqlParameter("VCode",model.VCode)
69: //,(DbParameter)new SqlParameter("VTime",model.VTime)
70: );
71: }
72: /// <summary>
73: /// 刪除member
74: /// </summary>
75: /// <param name="id">id</param>
76: /// <returns>執行狀態</returns>
77: public bool Delete(int id)
78: {
79: return SqlHelper.ExecuteNonQuery("delete from member where id=@id",
80: (DbParameter)new SqlParameter("id",id));
81: }
82: /// <summary>
83: /// 刪除member
84: /// </summary>
85: /// <param name="strID">strID,記得多個用,隔開</param>
86: /// <returns>執行狀態</returns>
87: public bool DeleteMoreID(string strID)
88: {
89: return SqlHelper.ExecuteNonQuery("delete from member where id in ("+strID+")");
90: }
91: /// <summary>
92: /// 將DataRow轉化為Model實體
93: /// </summary>
94: /// <param name="row">DataRow信息</param>
95: /// <returns>執行狀態</returns>
96: private static member ToModel(DataRow row)
97: {
98: member model=new member();
99: model.Id =row.IsNull("Id")?null:(System.Int32?)row["Id"];
100: model.username =row.IsNull("username")?null:(System.String)row["username"];
101: model.password =row.IsNull("password")?null:(System.String)row["password"];
102: model.Sex =row.IsNull("Sex")?null:(System.String)row["Sex"];
103: model.nation =row.IsNull("nation")?null:(System.String)row["nation"];
104: model.mobilephone =row.IsNull("mobilephone")?null:(System.String)row["mobilephone"];
105: model.Telephone =row.IsNull("Telephone")?null:(System.String)row["Telephone"];
106: model.Email =row.IsNull("Email")?null:(System.String)row["Email"];
107: model.qq =row.IsNull("qq")?null:(System.String)row["qq"];
108: model.Zipcode =row.IsNull("Zipcode")?null:(System.String)row["Zipcode"];
109: model.Address =row.IsNull("Address")?null:(System.String)row["Address"];
110: model.states =row.IsNull("states")?null:(System.String)row["states"];
111: model.VCode =row.IsNull("VCode")?null:(System.String)row["VCode"];
112: model.VTime =row.IsNull("VTime")?null:(System.DateTime?)row["VTime"];
113: return model;
114: }
115: /// <summary>
116: /// 根據id獲取tableName實體信息
117: /// </summary>
118: /// <param name="id">id</param>
119: /// <returns>執行狀態</returns>
120: public member Get(int id)
121: {
122: DataTable dt=SqlHelper.ExecuteDataTable("select * from member where id=@id",
123: (DbParameter)new SqlParameter("id",id));
124: if(dt.Rows.Count>1){
125: throw new Exception("more than 1 row was found");
126: }
127: if(dt.Rows.Count<=0){return null;}
128: DataRow row=dt.Rows[0];
129: member model=ToModel(row);
130: return model;
131: }
132: /// <summary>
133: /// 列出tableName所有的實體信息
134: /// </summary>
135: /// <returns>執行狀態</returns>
136: public IEnumerable<member> ListAll()
137: {
138: List<member> list=new List<member>();
139: DataTable dt=SqlHelper.ExecuteDataTable("select * from member");
140: foreach(DataRow row in dt.Rows){
141: list.Add(ToModel(row));
142: }
143: return list;
144: }
145:
146: /// <summary>
147: ///分頁獲取數據
148: /// </summary>
149: /// <param name="tableName">表名</param>
150: /// <param name="InnerJoin">內連接</param>
151: /// <param name="strGetFields">返回的列信息</param>
152: /// <param name="sortId">排序的列名</param>
153: /// <param name="PageSize">每頁記錄數</param>
154: /// <param name="PageIndex">頁數</param>
155: /// <param name="OrderType">排序類型排序類型, 非0 值則降序</param>
156: /// <param name="strWhere">查詢條件(注意: 不要加where) </param>
157: public IEnumerable<member> ListByPagination(string tableName,string InnerJoin,string strGetFields,string sortId,int PageSize,int PageIndex,string OrderType,string strWhere)
158: {
159: List<member> list=new List<member>();
160: DataTable dt=SqlHelper.ExecuteDataTable("exec[pagination] @tableName,@InnerJoin,@strGetFields,@sortId,@PageSize,@PageIndex,@doCount,@OrderType,@strWhere",(DbParameter)new SqlParameter("tableName",tableName),(DbParameter)new SqlParameter("@InnerJoin",InnerJoin),(DbParameter)new SqlParameter("@strGetFields",strGetFields),(DbParameter)new SqlParameter("@sortId",sortId),(DbParameter)new SqlParameter("@PageSize",PageSize),(DbParameter)new SqlParameter("@PageIndex",PageIndex),(DbParameter)new SqlParameter("@doCount","0"),(DbParameter)new SqlParameter("@OrderType",OrderType),(DbParameter)new SqlParameter("@strWhere",strWhere));
161: foreach(DataRow row in dt.Rows){
162: list.Add(ToModel(row));
163: }
164: return list;
165: }
166: /// <summary>
167: ///獲取表總記錄個數(不用加where)
168: /// <param name="strWhere">查詢條件(不用加where)</param>
169: /// <summary>
170: public int GetCount(string strWhere)
171: {
172: if(!string.IsNullOrEmpty(strWhere))
173: strWhere=" where "+strWhere;
174: return SqlHelper.ExecuteSelectFirstNum("select count(1) from member"+strWhere);
175: }
176: }
177: }
這里是用代碼生成器生成的,我自己寫的一個簡單的代碼生成器,為了學習代碼生成器,專門設計了一個簡單的,
這里注意,因為代碼生成器的原因,我們必須把自己寫的方法等,通過部分類的方式合並,所以,我們都要加上partial 關鍵字,這很重要
可以看到DAL主要涉及的都是純種的增刪改查操作,他不用管具體有沒有權限之類的,這些不是
他的活,為什么要他干?
接下來就是BLL層,業務邏輯層,我們經常碰到,前期不需要功能,后期增加進去,以前沒有權限判斷,以前沒有加密要求,以前的加密太簡單,現在要更改一種更好的方法,結果要修改好多東西,這樣就全部寫在業務邏輯層,他只負責業務邏輯的判斷,然后提供給UI數據,
1: /// <summary>
2: /// 判定查詢條件
3: /// </summary>
4: /// <param name="info"></param>
5: /// <returns></returns>
6: public static string ConfirmCondition(string info)
7: {
8: string condition = "";//查詢條件
9: if (Tools.IsNumber(info)) //如果是數字,則查詢id
10: {
11: condition = "id like '%" + info + "%'";
12: }
13: else condition = "username like '%" + info + "%'"; //查詢用戶名
14: return condition;
15: }
16: /// <summary>
17: /// 檢查用戶名和郵箱
18: /// </summary>
19: /// <param name="UserName">用戶名</param>
20: /// <param name="Email">郵箱</param>
21: /// <returns></returns>
22: public bool CheckUserNameAndEmail(string UserName,string Email)
23: {
24: memberDAL dal=new memberDAL ();
25: member info = dal.GetMemberInfo(UserName);
26: return Email==info.Email;
27: }
28: /// <summary>
29: /// 隨機生成一個6位的密碼
30: /// </summary>
31: /// <returns></returns>
32: public string CreateNewPwd()
33: {
34: string Pwd="";
35: Random ran=new Random (DateTime.Now.Second);
36: for (int i = 0; i < 6; i++)
37: {
38: Pwd += ran.Next(1, 10);
39: }
40: return Pwd;
41: }
42: /// <summary>
43: /// 修改密碼
44: /// </summary>
45: /// <param name="UserName">用戶名</param>
46: /// <param name="Pwd">密碼</param>
47: /// <returns></returns>
48: public bool UpdatePwd(string UserName, string Pwd)
49: {
50: return new memberDAL().UpdatePassword(UserName, Tools.GetMD5(Pwd));
51: }
52: /// <summary>
53: /// 修改密碼
54: /// </summary>
55: /// <param name="UserName">用戶名</param>
56: /// <param name="oldPwd">舊密碼</param>
57: /// <param name="newPwd">新密碼</param>
58: /// <returns></returns>
59: public bool UpdatePassword(string UserName, string oldPwd, string newPwd)
60: {
61: memberDAL dal = new memberDAL();
62: string Pwd = dal.GetPassword(UserName);
63: if (Pwd == Tools.GetMD5(oldPwd))
64: {
65: //加密並且更新
66: return dal.UpdatePassword(UserName, Tools.GetMD5(newPwd));
67: }
68: return false;
69: }
70: /// <summary>
71: /// 更新member實體
72: /// </summary>
73: /// <param name="model">member實體</param>
74: /// <param name="IsUserNameUpdate">是否采用用戶名更新</param>
75: /// <returns></returns>
76: public bool UpdateUserInfo(member model)
77: {
78: return new memberDAL().Update(model, true);
79: }
80: /// <summary>
81: /// 檢驗用戶名是否存在
82: /// </summary>
83: /// <param name="userName"></param>
84: /// <returns></returns>
85: public bool CheckExistUserName(string userName)
86: {
87: return new memberDAL().GetCount(string.Format(" username='{0}'", userName)) == 0;
88: }
89: /// <summary>
90: /// 驗證用戶信息
91: /// </summary>
92: /// <param name="UserName">用戶名</param>
93: /// <param name="GuidInfo">guid隨機碼</param>
94: public bool ActivationMemberNumber(string UserName, string GuidInfo)
95: {
96: memberDAL dal = new memberDAL();
97: //獲取過期時間
98: DateTime dt = dal.GetMemberVTime(UserName, GuidInfo);
99: //如果已經過期
100: if (dt < DateTime.Now)
101: {
102: return false;
103: }
104: else
105: {
106: //激活帳號
107: return dal.ActivationMemberStatus(UserName);
108: }
109: }
110: /// <summary>
111: /// 用戶登錄
112: /// </summary>
113: /// <param name="info">會員model</param>
114: /// <returns></returns>
115: public bool MemberLogin(member info)
116: {
117: info.password = Tools.GetMD5(info.password);
118: return new memberDAL().MemberLogin(info);
119: }
120: /// <summary>
121: /// 檢驗密碼是否正確
122: /// </summary>
123: /// <param name="UserName">用戶名</param>
124: /// <param name="Password">密碼</param>
125: /// <returns></returns>
126: public bool CheckPwd(string UserName, string Password)
127: {
128: //先不加密,以后全部都要加密
129: string Pwd = Tools.GetMD5(new memberDAL().GetPassword(UserName));
130: if (Password == Pwd)
131: {
132: return true;
133: }
134: else
135: return false;
136: }
137: /// <summary>
138: /// 返回驗證組件的數組格式(Validate)
139: /// </summary>
140: /// <param name="fieldId">字段</param>
141: /// <param name="Status">狀態</param>
142: /// <param name="errorMsg">錯誤消息(沒有則"")</param>
143: /// <returns></returns>
144: public string ReturnValueValidateAjax(string fieldId, bool Status, string errorMsg)
145: {
146:
147: if (string.IsNullOrEmpty(errorMsg))
148: {
149: return "[\"" + fieldId + "\",\"" + Status + "\"]";
150: }
151: return "[\"" + fieldId + "\",\"" + Status + "\",\""+errorMsg+"\"]";
152:
153: }
154:
155: /// <summary>
156: /// 返回給客戶端的json格式數據(用於根據用戶登錄狀態決定)
157: /// </summary>
158: /// <param name="info"></param>
159: /// <returns></returns>
160: public string ReturnJson(member info, out bool Status)
161: {
162: //登錄狀態
163: Status = MemberLogin(info);
164: //生成json格式數據
165: return WriteJsonForReturn(Status, info.username);
166:
167: }
168: /// <summary>
169: /// 記住帳號和密碼的枚舉
170: /// </summary>
171: public enum RememberType
172: {
173: /// <summary>
174: /// 記住帳號
175: /// </summary>
176: RememberName = 0,
177: /// <summary>
178: /// 同時記住帳號和密碼
179: /// </summary>
180: RememberNameAndPwd = 1,
181: /// <summary>
182: /// 不記住帳號密碼
183: /// </summary>
184: NoRemember = 2
185: }
186:
187: /// <summary>
188: /// 根據保存帳號密碼狀態判斷是保存帳號還是同時保存帳號和密碼
189: /// </summary>
190: /// <param name="IsSaveName">"1"代表保存,"0"代表不保存</param>
191: /// <param name="IsSavePwd">"1"代表保存,"0"代表不保存</param>
192: /// <returns></returns>
193: public RememberType GetRememberType(string IsSaveName, string IsSavePwd)
194: {
195: RememberType SaveType = RememberType.NoRemember;
196:
197: //保存帳號和密碼
198: if (IsSaveName.Equals("1") && IsSavePwd.Equals("1"))
199: {
200: SaveType = RememberType.RememberNameAndPwd;
201: }
202: //保存帳號
203: if (IsSaveName.Equals("1") && !IsSavePwd.Equals("1"))
204: {
205: SaveType = RememberType.RememberName;
206: }
207: else if (!IsSaveName.Equals("1"))
208: {
209: SaveType = RememberType.NoRemember;
210: }
211: return SaveType;
212: }
213: /// <summary>
214: /// 根據用戶名獲取用戶信息(返回json數據)
215: /// </summary>
216: /// <param name="UserName">用戶名</param>
217: /// <returns></returns>
218: public string GetMemberInfoByJson(string UserName)
219: {
220: bool Status = false;
221: member info = new memberDAL().GetMemberInfo(UserName);
222: if (info.Id.HasValue)
223: {
224: Status = true;
225: }
226: StringBuilder json = new StringBuilder();
227: StringWriter sw = new StringWriter(json);
228: using (JsonWriter jsonWriter = new JsonTextWriter(sw))
229: {
230: jsonWriter.Formatting = Formatting.Indented;
231: jsonWriter.WriteStartObject();
232: jsonWriter.WritePropertyName("Status");
233: jsonWriter.WriteValue(Status);
234: jsonWriter.WritePropertyName("Data");
235: jsonWriter.WriteStartArray();
236: jsonWriter.WriteStartObject();
237: jsonWriter.WritePropertyName("UserName");
238: jsonWriter.WriteValue(info.username);
239: jsonWriter.WritePropertyName("Sex");
240: jsonWriter.WriteValue(info.Sex);
241: jsonWriter.WritePropertyName("Nation");
242: jsonWriter.WriteValue(info.nation);
243: //mobilephone Telephone Email qq Zipcode Address
244: jsonWriter.WritePropertyName("MobilePhone");
245: jsonWriter.WriteValue(info.mobilephone);
246: jsonWriter.WritePropertyName("TelePhone");
247: jsonWriter.WriteValue(info.Telephone);
248: jsonWriter.WritePropertyName("Email");
249: jsonWriter.WriteValue(info.Email);
250: jsonWriter.WritePropertyName("QQ");
251: jsonWriter.WriteValue(info.qq);
252: jsonWriter.WritePropertyName("ZipCode");
253: jsonWriter.WriteValue(info.Zipcode);
254: //地址處理
255:
256: string[] strAddresss = GetSplitAddress(info.Address);
257: string Province = "";
258: string City = "";
259: string Country = "";
260: string Address = "";
261: if (strAddresss.Count() > 0)
262: {
263: Province = strAddresss[0];
264: City = strAddresss[1];
265: Country = strAddresss[2];
266: Address = strAddresss[3];
267:
268: }
269: jsonWriter.WritePropertyName("Province");
270: jsonWriter.WriteValue(Province);
271: jsonWriter.WritePropertyName("City");
272: jsonWriter.WriteValue(City);
273: jsonWriter.WritePropertyName("Country");
274: jsonWriter.WriteValue(Country);
275: jsonWriter.WritePropertyName("Address");
276: jsonWriter.WriteValue(Address);
277: jsonWriter.WriteEndObject();
278:
279: jsonWriter.WriteEndArray();
280: jsonWriter.WriteEndObject();
281: }
282: return json.ToString();
283: }
284: /// <summary>
285: /// 地址分割(將用戶信息表中的地址分割成 省(編號) 市(編號) 縣(編號) 家住址
286: /// </summary>
287: /// <param name="Address">地址</param>
288: /// <returns></returns>
289: public string[] GetSplitAddress(string Address)
290: {
291: string[] str = Address.Split('|');
292: return str;
293: }
294: /// <summary>
295: /// 檢查用戶登錄狀態,用於驗證自動登錄(並返回json格式)
296: /// </summary>
297: /// <returns></returns>
298: public string CheckLoginStatus(out bool Status)
299: {
300:
301: //登錄狀態
302: Status = true;
303: string UserName = Common.CookieHelper.GetCookieValue("UserName");
304: //如果cookies為空,直接返回
305: if (Tools.IsNullOrEmpty(UserName))
306: {
307: Status = false;
308: }
309: string Pwd = Common.CookieHelper.GetCookieValue("Pwd");
310: if (Tools.IsNullOrEmpty(Pwd))
311: {
312: Status = false;
313: }
314: else
315: {
316: //查找該用戶真實密碼,並進行md5加密
317: string password = new memberDAL().GetPassword(UserName);
318: //如果兩次密碼相同則可以自動登陸了
319: if (password!=Pwd)
320: {
321: Status = false;
322: }
323: }
324:
325: //生成json格式數據
326: return WriteJsonForReturn(Status, UserName);
327: }
328: /// <summary>
329: /// 為用戶登錄寫入json數據
330: /// </summary>
331: /// <param name="Status">登錄狀態</param>
332: /// <param name="UserName">用戶名</param>
333: /// <returns></returns>
334: public string WriteJsonForReturn(bool Status, string UserName)
335: {
336: StringBuilder json = new StringBuilder();
337: StringWriter sw = new StringWriter(json);
338: using (JsonWriter jsonWriter = new JsonTextWriter(sw))
339: {
340: jsonWriter.Formatting = Formatting.Indented;
341: jsonWriter.WriteStartObject();
342: jsonWriter.WritePropertyName("Status");
343: jsonWriter.WriteValue(Status);
344: jsonWriter.WritePropertyName("UserName");
345: jsonWriter.WriteValue(UserName);
346: jsonWriter.WriteEndObject();
347: }
348: return json.ToString();
349: }
350: /// <summary>
351: /// 記住用戶信息
352: /// </summary>
353: /// <param name="Type">記住用戶信息類別</param>
354: /// <returns></returns>
355: public bool RememberUserInfo(member info, RememberType type)
356: {
357: if (type == RememberType.RememberName)
358: {
359: //記住帳號7天
360: CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7));
361: }
362: else if (type == RememberType.RememberNameAndPwd)
363: {
364:
365: //md5哈希加密
366: string sercret = Tools.GetMD5(info.password);
367: //同時記住帳號和密碼7天
368: CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7));
369: CookieHelper.SetCookie("Pwd", sercret, DateTime.Now.AddDays(7));
370: }
371: else
372: {
373: return false;
374: }
375: return true;
376:
377: }
378:
379:
380: }
381: }
可以看到,這里沒有任何數據庫的操作,他只負責業務邏輯判斷,然后給UI提供數據.
而web的UI層,我們以前經常性碰到這樣的代碼,
1: /// <summary>
2: /// 網頁中間顯示的涵數condiction顯示條件,nums顯示行數
3: /// </summary>
4: /// <param name="condiction"></param>
5: /// <param name="nums"></param>
6: public void Show(string condiction, int nums)
7: {
8:
9: string sql = "";
10: //還要修改
11: string id = "";
12: string picturepath = "";
13: string name = "";
14: string appreciation = "";
15: string reward = "";
16: string title = "";
17: string time = "";
18: string ArticleHtmlUrl = "";
19: StringBuilder content = new StringBuilder();//高效率拼接字符串
20: if (condiction == "大師風采")
21: {
22: sql = "select top " + nums + " hit,id,name,appreciation,Reward,Picturepath from master where state='1' and state1='1' order by master.rank desc";
23: DataTable dt = cs.GetDataSet(sql).Tables[0];
24:
25:
26: for (int i = 0; i < dt.Rows.Count; i++)
27: {
28: id = dt.Rows[i]["id"].ToString();
29: picturepath = dt.Rows[i]["Picturepath"].ToString();
30: picturepath = GetPicturePath(picturepath);
31: name = dt.Rows[i]["name"].ToString();
32:
33: //appreciation = GetTile(dt.Rows[i]["appreciation"].ToString().Replace("<br>","\r\n"));
34: //reward = GetTile(dt.Rows[i]["Reward"].ToString().Replace("<br>", "\r\n"));
35: if (i == 0) {
36: content.Append("<div class='r_s_p m_border'>");
37: }
38: else
39: {
40: content.Append("<div class='r_s_p'>");
41: }
42: content.Append("<div class='gk_pic'><img src='" + picturepath + "' alt='" + dt.Rows[i]["name"].ToString() + "'/></div>");
43:
44: content.Append("<div class='master_p'>");
45:
46: content.Append("<p><strong><a href='Masterintro.aspx?id=" + id + "'>" + name + "</a></strong></p>");
47:
48: content.Append("<div class='honor'><ul>");
49:
50: content.Append("<li><a href='Masterintro.aspx?id=" + id + "'>" + appreciation + "</a></li>");
51:
52: content.Append("<li><a href='Masterintro.aspx?id=" + id + "'>" + reward + "</a></li>");
53: content.Append("</ul></div></div></div>");
54:
55: content.Append("<div class='master_border'> </div>");
56:
57: }
58:
59: Response.Write(content.ToString());
60: return;
61:
62: }
63:
64:
65:
66:
67: if (condiction == "業內新聞")
68: {
69: sql = "select top " + nums + " id,title,time,ArticleHtmlUrl from news order by time desc";
70: DataTable dt = cs.GetDataSet(sql).Tables[0];
71: //if (dt.Rows.Count == 0)
72: //{
73: // content.Append("<li><a href='#'>#</a><span class='time'>[##-##-##]</span></li>");
74: //}
75: for (int i = 0; i < dt.Rows.Count; i++)
76: {
77:
78: title = GetTile(dt.Rows[i]["title"].ToString());
79:
80: id = dt.Rows[i]["id"].ToString();
81:
82: time = ((DateTime)dt.Rows[i]["time"]).Date.ToShortDateString();
83:
84: ArticleHtmlUrl = dt.Rows[i]["ArticleHtmlUrl"].ToString();
85:
86: content.Append("<li><a href='NewsContent.aspx?id="+id+"'>" + title + "</a><span class='time'>[" + time + "]</span></li>");
87:
88: }
89: Response.Write(content.ToString());
90:
91: return;
92:
93: }
94: if (condiction == "工藝知識")
95: {
96:
97: sql = "select top " + nums + " id,title,time,ArticleHtmlUrl from craftknowledge order by time desc";
98:
99: DataTable dt = cs.GetDataSet(sql).Tables[0];
100:
101: //if (dt.Rows.Count == 0)
102: //{
103: // content.Append("<li><a href='#'>#</a><span class='time'>[##-##-##]</span></li>");
104: //}
105: for (int i = 0; i < dt.Rows.Count; i++)
106: {
107:
108: title = GetTile(dt.Rows[i]["title"].ToString());
109:
110: id = dt.Rows[i]["id"].ToString();
111:
112: time = ((DateTime)dt.Rows[i]["time"]).Date.ToShortDateString();
113:
114: ArticleHtmlUrl = dt.Rows[i]["ArticleHtmlUrl"].ToString();
115:
116: //Response.Write("<li><a href='craftknowledge_info.aspx?craft_id=" + id + "'>" + title + "</a><span class='time'>[" + time + "]</span></li>");
117:
118: content.Append("<li><a href='craftknowledge_info.aspx?id=" + id + "'>" + title + "</a><span class='time'>[" + time + "]</span></li>");
119:
120: }
121: Response.Write(content.ToString());
122: return;
123:
124: }
125:
126: if (condiction == "企業展示")
127: {
128: sql = "select top " + nums + " hit, id,name from company where state='1' and state1='1' order by company.rank desc";
129:
130: DataTable dt = cs.GetDataSet(sql).Tables[0];
131: //if (dt.Rows.Count == 0)
132: //{
133: // content.Append("<li><a href='#'>#</a></li>");
134: //}
135: for (int i = 0; i < dt.Rows.Count; i++)
136: {
137: id = dt.Rows[i]["id"].ToString();
138:
139: name = GetTile(dt.Rows[i]["name"].ToString());
140:
141:
142:
143: content.Append("<li><a href='company_introduce.aspx?id=" + id + "'>" + name + "</a></li>");
144:
145: }
146: Response.Write(content.ToString());
147: return;
148:
149: }
150: }
這種UI和數據混合的方式,如果界面一修改,改動大了,經常性碰到,這個界面太囧了......然后改整個版面,為什么我們不把數據和UI隔離開來,后台么?
只負責數據提供,通過JSON等傳輸,然后前台js/JQuery操作界面呢?
這樣前台就應該這樣,
1: <%@ Page Language="C#" MasterPageFile="~/InfoPage.master" AutoEventWireup="true"
2: CodeFile="MasterInfo.aspx.cs" Inherits="Master_MasterInfo" Title="大師信息" %>
3:
4: <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
5: <link href="../css/gs_ms.css" rel="stylesheet" type="text/css" />
6:
7: <script src="../Admin/scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
8:
9: <script src="../js/queryUrlParams.js" type="text/javascript"></script>
10:
11: <script src="MasterInfo.js" type="text/javascript"></script>
12:
13:
14: <script type="text/javascript">
15: //獲得大師id信息
16: var id=$.query.get("MasterId");
17: </script>
18:
19: </asp:Content>
20: <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
21: <div class="ms">
22: <div class="ms_top">
23: <div class="m_load">
24: <span><a href="../Default.aspx">首頁</a> > <a href="MasterList.aspx">大師風采</a> > 大師</span></div>
25: <div class="mst_c">
26: <ul class="mst_ul">
27: <li><a href="#" id="Master_Intro">
28: <p class="hide">
29: 大師簡介</p>
30: </a></li>
31: <li><a href="#" id="Master_Award">
32: <p class="hide">
33: 獲獎情況</p>
34: </a></li>
35: <li><a href="#" id="Master_Work">
36: <p class="hide">
37: 大師作品</p>
38: </a></li>
39: </ul>
40: <div class="mst_img">
41: <img src="../images/master_img.png" id="imgMaster" /></div>
42: <div class="mst_xx">
43: <table width="252" height="141" id="tbMasterInfo">
44: </table>
45: </div>
46: </div>
47: </div>
48: <div class="gs_nr" id="MasterContent">
49:
50: </div>
51: </div>
52: </asp:Content>
然后通過jquery操作,
1:
2: $(function(){
3: GetMasterInfo();
4: GetMasterIntro();
5: //綁定獲取大師簡介事件
6: $("#Master_Intro").click(function(){
7: GetMasterIntro();
8: });
9: $("#Master_Award").click(function(){
10: GetMasterReward();
11: });
12: $("#Master_Work").click(function(){
13: GetMasterWork();
14: });
15: });
16: //獲取大師基本信息
17: function GetMasterInfo(){
18: $.ajax({
19: url:"Data/MasterInfo.ashx?method=GetMasterInfo&MasterId="+id,
20: type:"post",
21: success:function(text){
22: var jsonData=$.parseJSON(text);
23: if(jsonData.Status){
24: var item='<tr><td width="51"> 姓名:</td>';
25: item+=' <td width="92">'+jsonData.Data[0].Name+'</td>';
26: item+='<td width="47">性別: </td>';
27: item+='<td width="42">'+jsonData.Data[0].Sex+'</td>';
28: item+=' </tr>';
29: item+='<tr> <td> 出生:</td>';
30: item+='<td>'+jsonData.Data[0].Birthday+'</td>';
31: item+='</tr>';
32: item+=' <tr><td colspan="4">藝術家分類:';
33: item+=jsonData.Data[0].TypeName;
34: item+='</td></tr>';
35:
36: $("#tbMasterInfo").empty();
37: $("#tbMasterInfo").append(item);
38: var src="../Admin/FileManage/GetImg.ashx?method=GetMasterPic&type=medium&fileName="+jsonData.Data[0].PicturePath;
39: $("#imgMaster").attr("src",src);
40: }
41: }
42: });
43:
44: }
45: //獲取大師簡介信息
46: function GetMasterIntro(){
47: $.ajax({
48: url:"Data/MasterInfo.ashx?method=GetMasterIntro&MasterId="+id,
49: type:"post",
50: success:function(text){
51: var jsonData=$.parseJSON(text);
52: if(jsonData.Status){
53: var item='<h4>大師簡介</h4>';
54: item+='<p>'+jsonData.Data[0].Introduction+'</p>';
55: $("#MasterContent").empty();
56: $("#MasterContent").append(item);
57: }
58: }
59: });
60: }
61: //獲取大師榮譽信息
62: function GetMasterReward(){
63: $.ajax({
64: url:"Data/MasterInfo.ashx?method=GetMasterReward&MasterId="+id,
65: type:"post",
66: success:function(text){
67: var jsonData=$.parseJSON(text);
68: var item='<h4>大師榮譽</h4>';
69: if(jsonData.Status){
70: item+='<ul class="gs_reward">';
71: item+=' <li>'+jsonData.Data[0].Reward+'</li></ul>';
72: item+=' <h4>獲獎情況</h4><ul class="gs_cup">';
73: $.each(jsonData.Data[0].CertPicList,function(key,value){
74: var img="../Admin/FileManage/GetImg.ashx?method=GetMasterCert&type=medium&fileName="+value.CertPic;
75: item+='<li><span class="c_pic_a">';
76: item+='<img src='+img+' alt='+value.CertName+' title='+value.CertName+'/></span><span class="a_title">'+value.CertName+'</span>';
77: item+='</li>';
78: });
79: item+='</ul>';
80:
81: }
82: else{
83: item+=' <h4>獲獎情況</h4>';
84: }
85: $("#MasterContent").empty();
86: $("#MasterContent").append(item);
87: }
88: });
89: }
90: //獲取大師產品信息
91: function GetMasterWork(){
92: $.ajax({
93: url:"Data/MasterInfo.ashx?method=GetMasterWork&MasterId="+id,
94: type:"post",
95: success:function(text){
96: var jsonData=$.parseJSON(text);
97: var item='';
98: if(jsonData.Status){
99: $.each(jsonData.Data,function(key,value){
100: item+='<h4>'+value.TypeName+'</h4>';
101: item+='<ul class="gs_pic">';
102: $.each(value.Product,function(PKey,PValue){
103: var img="../Admin/FileManage/GetImg.ashx?method=GetMainProductPic&type=medium&fileName="+PValue.Picturepath;
104: item+='<li>';
105: item+='<a href="../Product/Product.aspx?ProductId='+PValue.ProductId+'" class="c_pic_a"><img src="'+img+'" alt="'+PValue.Name+'" title="'+PValue.SimpleName+'"/></a>';
106: item+='<a href="../Product/Product.aspx?ProductId='+PValue.ProductId+'" class="a_title">'+PValue.SimpleName+'<br/><span class="rad2">¥'+PValue.Lsprice+'</span></a> ';
107: item+='</li>';
108: })
109: item+='</ul>';
110: item+='<div style="text-align:right"><a href="../Product/Master_MoreProduct.aspx?MasterId=' + id + '&&TypeId=' + value.TypeId + '">more>></a></div>';
111:
112: })
113:
114: }
115: else{
116: item+='沒有數據!';
117: }
118: $("#MasterContent").empty();
119: $("#MasterContent").append(item);
120: }
121: });
122: }
123:
這樣不管怎么改界面,我們的數據是不變的,哈哈!
還有最最最重要的,我們的代碼規范,命名規范,我的所有代碼全部自己強制性要求自己必須遵
守,所以才能一目了然,清晰,嚴謹,易於維護和開發!
今天的三層就總結到這里!
還有項目中比較重要的一些東西,下次在總結!