总结一下现在做的项目,由于混乱的项目经验,我就全部重新写了以前的一个项目,搭建的是简单三层架构的模式,简单三层是我第一个认识的架构层次的理念,也是影响非常深的,以前只是理论的学学什么设计模式,什么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'>&nbsp;</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:       

这样不管怎么改界面,我们的数据是不变的,哈哈!

还有最最最重要的,我们的代码规范,命名规范,我的所有代码全部自己强制性要求自己必须遵

守,所以才能一目了然,清晰,严谨,易于维护和开发!

今天的三层就总结到这里!

还有项目中比较重要的一些东西,下次在总结!

转载于:https://www.cnblogs.com/mysweet/archive/2012/05/07/2486771.html

一步一步asp.net_三层构架的学习相关推荐

  1. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  2. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!

    一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...

  4. jQuery 1.3 for Asp.Net、 CSLA.Net 3.6 for Windows 及 MOSS/WSS 一步一步从入门到精通三个系列的目录...

    jQuery for Asp.Net 一步一步从入门到精通(附 jQuery API 彩色大图) CSLA.Net 3.6 for Windows (C# 2008)一步一步从入门到精通 MOSS/W ...

  5. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序

    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序 这本教程中将帮助你创建一个小型的asp.net mvc示例. 在本教程中,我们将创建自己的 Model , View 和Contro ...

  6. (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...

  7. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  8. (转)一步一步Asp.Net MVC系列_权限管理之权限控制

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/08/05/2623687.html 在权限管理中一个很重要的就是关于权限的拦截验证问题,特别是我们在 ...

  9. 一步一步学Linq to sql(十):分层构架的例子

    项目介绍 这节将要把<一步一步学Linq to sql(三):增删改>中留言簿的例子修改为使用WCF的多层构架.我们将会建立以下项目: l         A,网站项目 WebSite:留 ...

最新文章

  1. Objective-C自动生成文档工具:appledoc
  2. c++两个vector合并_这才是真正的 Git:分支合并
  3. 2021年最后几天,使用SSM实现网上购物商城系统
  4. 随笔(2018.9.2.)
  5. Angular7 ng-zorro-antd 制作右键菜单
  6. html5 自动生成迷宫,HTML5 Canvas随机迷宫生成动画
  7. JavaScript | 创建对象并通过JavaScript函数在表中显示其内容
  8. LeetCode 1275. 找出井字棋的获胜者(位运算)
  9. 安卓小程序 自定义下拉刷新_支付宝小程序设计设计指南
  10. kettle etl 入门第一篇
  11. shiro中ini配置文件
  12. SES 之全局搜索小记
  13. My sql 常用函数
  14. Atitit 学历的类型大总结 目录 1. 学历的分类 2 1.1. 按照组织性质,分类为立法系统 政府系统 司法系统 部落级别 企业级别商业系统 宗教系统 个人级别 2 1.2. 按照地域性质,
  15. java 进度条插件_java进度条控件如何使用?
  16. suse11 升级glibc版本
  17. finclip小程序运行机制与微信小程序运行机制
  18. 第二章——Swift语言
  19. CSS3有趣的渐变色
  20. hdu 1116 Play on Words

热门文章

  1. PowerDesigner 正向工程 和 逆向工程 说明
  2. linux dip 命令详解
  3. Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
  4. power bi tutorial within Unilever
  5. 苹果的工作官方检索地址
  6. 有一个能够统一的方式来画uml图的软件
  7. 2018.8.5 复习笔记
  8. solaris 10 安装oracle 10g
  9. linux下Eclipse+CDT开发环境配置与使用
  10. Java中ListE对象赋值问题(引用传递和值传递)