###一、起步
####目錄結構
項目主要的文件夾有:
framework—可能用到的框架、庫全都在這里
img—存放圖片,所有人均將圖片存放到這里
module_xxx—存放每個人的代碼
public_code—存放通用的代碼、樣式、頁面
GlobalModule.cs—攔截器,用來攔截請求和處理一些狀態,不用關心
index.html—系統的引導頁
sqlhelper.cs—數據庫的類,里面的連接字符串需要改成自己的

####代碼結構
1、劉添齊和王勝
css文件夾用來存放樣式,Master是模板頁,index.aspx是包含模板頁的aspx(新建的時候需要留意),dll文件夾用來存放數據庫代碼(css文件夾用來存放樣式,js夾文件用來存放js代碼,server文件夾用來存放服務端代碼(.ashx文件),dll文件夾用來存放數據庫代碼(用戶和管理員全都用一個dll文件夾),index.aspx是普通的aspx頁(不是包含模板頁的aspx),admin文件夾的目錄結構和外面的一樣,用來存放管理員代碼。
)。admin文件夾的結構和外面的一樣,用來存放管理員的代碼。在新建包含模板頁的aspx時要注意選擇外面的Master還是admin文件夾里面的Master。

2、趙開朗
css文件夾用來存放樣式,js夾文件用來存放js代碼,server文件夾用來存放服務端代碼(.ashx文件),dll文件夾用來存放數據庫代碼(用戶和管理員全都用一個dll文件夾),index.aspx是普通的aspx頁(不是包含模板頁的aspx),admin文件夾的目錄結構和外面的一樣,用來存放管理員代碼。

###二、狀態約定
####賬戶(銀行卡)狀態
state:
0:正常
1:掛失
2:緊急掛失
isDeleted:
0:正常
1:已刪除
accountType:
1:借記卡
2:信用卡
####業務開通狀態
state:
0:未開通業務
1:開通業務
####管理員狀態
type:
0:普通管理員
1:超級管理員
state:
0:正常
1:拉黑
isDeleted:
0:正常
1:已刪除
####用戶狀態
sex:
0:男
1:女
isDeleted
0:正常
1:已刪除
###三、數據庫編寫
####規定
數據庫的代碼存放到各自的dll文件夾中,用到哪些表就新建一個同名的類,不允許使用別人模塊里面的dll文件,如果兩個人都用到了userInfo表,那么兩個人的dll文件夾里面都有userInfo類。

每個類里面封裝數據庫的方法,都是public static,命名方式要見名知其意。

####返回類型
使用select語句則需要使用DataSet類型,update、delete、insert均使用int類型。
####示例
scmd.CommandText之前的代碼都是一樣的,直接copy就行,scmd.CommandText為sql語句,@是參數化查詢,用于防止sql注入,SqlParameter里面的兩個參數和函數的形參以及sql語句里面的@必須一樣,如果函數有兩個形參,那么就要有兩個scmd.Parameter.Add
1、返回DataSet類型

2、返回int類型

####如何使用數據庫返回的結果
在王勝、劉添齊的aspx.cs文件,趙開朗的ashx文件中:
~~~
int id=1;string password="123";
int result = module_qc.dll.admin.ModifyPassword(id, password);
if(result>0)//說明update成功
{
//正常業務邏輯
}
else
{
//錯誤處理的邏輯
}
~~~
~~~
int id=1;
DataSet ds=module_qc.dll.admin.GetAdminInfo(int id);
DataTable dt=ds.Tables[0];//取到結果集的table
if(dt.Rows.Count>0)//結果集的行數大于0,說明有數據
{
for(int i=0;i<dt.Rows.Count;i++)
{
System.Diagnostics.Debug.WriteLine(dt.Rows[i]["userName"]);
//取第i行的userName字段的值并打印到控制臺
}
}
else
{
//select語句沒有查詢到數據
}
~~~
####注意
只要操作含有isDeleted字段的表,sql語句里面都要加上"and isDeleted=0"。
###格外注意事項
為了保證數據的安全性和可用性,需要加強代碼的嚴謹性。比如:當管理員通過了用戶的銀行卡銷戶申請(也就是把數據庫的銀行卡isDeleted置為1),那么用戶接下來不能對這張卡做任何操作。再比如:當超級管理員刪除了一個管理員,那么管理員無論是刷新頁面還是做操作都會被告知“您已被刪除”,并跳轉到登錄頁面。
####攔截器
攔截器已經幫你們處理了一些操作,用戶被刪除、管理員被刪除或拉黑,這些都會自動給出提示信息進行錯誤操作,但是銀行卡的刪除和掛失并沒有且無法寫到攔截器里面幫我們自動處理。因此,對于銀行卡的操作要先判斷是否被刪除,是否被凍結,然后才是正常的業務邏輯,判斷是否被刪除、凍結的sql方法都存放在了sqlhelper里面,直接調用方法即可。
####銀行卡刪除和凍結的區別
銀行卡一旦被刪除,用戶不能對這張卡做任何操作,銀行卡被凍結,用戶只能進行只讀操作(比如能查看銀行卡的信息,但是不能修改信息)。
###操作Session
####王勝、劉添齊
在aspx.cs文件中直接通過Session["key"]去讀取Session,Session["key"]=value去設置Session,在讀取Session的時候要先判斷Session和要讀取的數據是否存在。
~~~
if(Session!=null&&Session["id"]!=null)
{
int id=Convert.ToInt32(Session["id"]);
}
~~~
####趙開朗
ashx文件中需要先實現Session的接口(在IHttpHandler后面加額外的代碼,如下)
~~~
public class admin_adminInfo_modifyPassword : IHttpHandler,System.Web.SessionState.IRequiresSessionState
~~~
通過HttpContext.Current.Session對Session進行操作,一樣的要先判斷Session和要讀取的數據是否存在
~~~
if(HttpContext.Current.Session!=null&&HttpContext.Current.Session["id"]!=null)
{
int id=Convert.ToInt32(HttpContext.Current.Session["id"]);
}
~~~
####項目中可能用到的Session
各個角色的主鍵id:id,
用戶的名字:userName,
管理員的名字:adminName,
超級管理員的名字:adminSName
####類型轉換
從數據庫中取出的數據(dt.Rows[i]["字段名"])以及從Session中取到的值都是object類型,可以通過類型轉換將它們轉換成我們期望的類型。
常用的類型轉換:xxx.ToString(),Convert.ToInt32(xxx)
###常用的代碼
####發送短信
~~~
//在最上面using Application.public_code”
在函數體中:
string phone="18829211660";
string content="你的內容"
string sms_url = "http://utf8.sms.webchinese.cn/?Uid=sunnychuan&Key=b4155b8baaab64d74d70&smsMob=" + phone + "&smsText=" + content;
string sms_code = phoneCode.GetHtmlFromUrl(sms_url);
if(sms_code==1){//短信發送成功}
else{//說明發送失敗了,可能是手機號不存在或者系統錯誤}
~~~
####接收前端的圖片并保存到本地
~~~
HttpPostedFile file=前端發送過來的文件;
string fileName = Path.GetFileName(file.FileName);
string hz = Path.GetExtension(file.FileName);
string newName="/img/qc_" + System.Guid.NewGuid().ToString()+hz;//重命名文件避免名字沖突,前面的"/img/qc_"是規定,用于區別四個人操作的圖片,如果劉添齊想保存圖片那么就改成"/img/ltq_"。
file.SaveAs(context.Request.MapPath(newName));//保存到項目的img文件夾下
int result=module_qc.dll.AddImg(newName);//將圖片的路徑存放到數據庫中。
~~~
###趙開朗需要留意
####異常處理
攔截器會攔截所有的ajax請求,以下的代碼必須要寫,這是規定
~~~
管理員所發出的所有請求:
if(res.code==200){//正常操作}
else if(res.code==401||res.code==402){alert(res.msg);window.location.href="/public_code/admin/login.html";}
else if(res.code==500){alert(res.msg)}
用戶所發出的所有請求:
if(res.code==200){}
else if(res.code==401){alert(res.msg);window.location.reload();}
else if(res.code==500){alert(res.msg)}
~~~
可能你也有自己的邏輯,比添加新聞失敗,刪除失敗等等,在ashx中返回code 300,前端去判斷code,這個code 300需要你自己在后端寫
~~~
//后端
JObject obj=new JObject();
if(result>0)
{
obj.Add("code",200);
obj.Add("data",null);
context.Response.Write(obj);
}
else
{
obj.Add("code",300);
obj.Add("msg","你的錯誤提示信息");
context.Response.Write(obj);
}
~~~
~~~
if(res.code==200){}
else if(res.code==300){你自己的錯誤處理邏輯}
else if(res.code==401){alert(res.msg);window.location.reload();}
else if(res.code==500){alert(res.msg)}
~~~
code 200與data,code 300與msg
####token
所有的ajax請求都要將token發送給后端,后端不用管這個token,代碼都是在攔截器里面的。
對于管理員來說,只有登錄了才能做各種管理的操作,在所有的請求中將token發送給后端
~~~
$.ajax({
data:{token:window.userInfo.token}
})
~~~
對于用戶來說,趙開朗的用戶模塊都是登錄和不登錄均可,當用戶未登錄的時候,userInfo.token是不存在的,因此
~~~
if(window.userInfo.isLogin==true){
$.ajax({//用戶登錄了,把token發送給后端
data:{token:window.userInfo.token}
})
}
else{
$.ajax({//用戶沒登錄,不用管token
data:{}
})
}
~~~
####后端
趙開朗的每個ashx文件都負責前端的一個ajax請求,所有ashx文件都要實現Session接口,哪怕你后端沒有用到Session也要寫
~~~
public class admin_adminInfo_modifyPassword : IHttpHandler,System.Web.SessionState.IRequiresSessionState
~~~
###通用樣式
####主題顏色
用戶:#0095d9
管理員:#ff494e
####button
用戶的button
~~~
<button class="btn btn-default">黑字白背景色</button>
<button class="btn btn-default blue-btn">白字藍背景色</button>
<button class="btn btn-default red-btn">白字紅背景色</button>
~~~
- html/css
- 不一樣的css3之Transform
- 不一樣的css3之Transition
- 不一樣的css3之Animation
- Less初學
- Sass初學
- 水平垂直居中那些事
- css優先級
- css基礎教學
- javascript
- 淺談javascript事件處理程序
- cookie,localStorage,sessionStorage的區別
- Ajax
- 說說JSON
- 數組常用的方法
- 字符串常用的方法
- 閉包之我的理解
- 常用DOM操作
- 扒一扒所謂的面向對象
- JS Blob對象
- ES6學習筆記(一)
- ES6學習筆記(二)
- 用ES6書寫React
- React+Redux實戰總結
- 基于Express搭建開發環境
- 其他
- github初學
- 輕松配置Webpack
- asp.net學習筆記
- ado.net
- 如何使用ajax進行前后端交互
- 銀行大廳自助服務系統需求分析
- 西電銀行開發手冊
- 接口
- ajax