1)系統使用者管理:使用者的密碼以md5散列值的形式儲存在資料庫中,密碼不能明文儲存。
2)客戶資料管理:使用NPOI實作從Excel檔案中批量導入客戶資料,還可以将客戶資料導出到Excel檔案中。
3)客戶資料的查詢支援按照拼音檢索。為了提高檢索速度,在使用者表中添加一個“姓名拼音”字段,在使用者增加,修改時,計算姓名對應的拼音。
4)客戶資料的檢索支援符合檢索,也就是根據使用者姓名、地區、購買日期、分店等資訊進行多條件符合檢索。
5)常見問題管理:将使用者常見的問題、回答儲存在系統中,并且可以動态的對常見問題進行增删改查。常見問題以樹狀資料儲存在資料庫中,這樣就可以支援常見問題的無限級分類
6)三層架構,重難點
7)筆試題讓敲代碼,是以現在所有的代碼都必須手寫。能手寫代碼才證明思路清晰。
8)使用SqlHelper+App.config+帶參數的sql語句實作登入功能
MD5是一種雜湊演算法,不是一種加密算法。任何長度的任意内容都可以使用MD5計算出散列值。主要作用是驗明真身。
MD5一般是長度為32位的16進制字元串。MD5算法不可逆。
系統明文密碼有哪些缺點? 個人資訊洩露
計算使用者輸入的密碼MD5值,與資料庫存儲的MD5值進行比較,如果相等則認為密碼正确。
應用:使用檔案的MD5值來檢驗檔案是否被篡改過。
MD5算法是不可逆的。
原理:計算完畢會傳回一個位元組數組,就是将128位除以8,是以就是16個位元組,再把每個byte轉化成兩位的16進制表示,最後看到的就是32位的字元串了。
對字元串進行MD5計算
SqlHelper的封裝
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _49_ado.net複習
{
/// <summary>
/// 資料庫操作輔助類
/// </summary>
class SqlHelper
{
//私有:本類,隻讀,目前 配置管理器類ConfigurationManager
private static readonly string connString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
/// <summary>
/// 執行增删改操作
/// </summary>
/// <param name="sql">要執行的sql語句或者存儲過程</param>
/// <param name="type">類型</param>
/// <param name="pms">資料庫參數</param>
/// <returns></returns>
public static int ExecuteNoQuery(string sql, CommandType type, params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand comm = new SqlCommand(sql, conn))
{
//要執行的sql的類型
comm.CommandType = type;
if (pms != null)
{
comm.Parameters.AddRange(pms);
}
conn.Open();
//隻傳回受影響的行數
return comm.ExecuteNonQuery();
}
}
}
public static object ExecuteScalsr(string sql, CommandType type, params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand comm = new SqlCommand(sql, conn))
{
//指令類型是sql還是存儲過程
comm.CommandType = type;
if (pms != null)
{
//往指令對象中添加請求參數
comm.Parameters.AddRange(pms);
}
conn.Open();
return comm.ExecuteScalar();
}
}
}
public static SqlDataReader ExecuteDataReader(string sql, CommandType type, params SqlParameter[] pms)
{
//如果連接配接關閉了,就讀取不到資料了。(查詢資料和讀取資料,必須使用同一個連接配接)
SqlConnection conn = new SqlConnection(connString);
using (SqlCommand comm = new SqlCommand(sql, conn))
{
comm.CommandType = type;
if (pms != null)
{
comm.Parameters.AddRange(pms);
}
try
{
//判斷連接配接狀況
if (conn.State == ConnectionState.Closed)
{
//如果連接配接狀态是關閉的,就進行打開
conn.Open();
}
//讀取完畢後,關閉連接配接
return comm.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception)
{
//如果出現異常,就進行捕獲
//一旦出現異常,因為連接配接是打開的,需要手動釋放資源
conn.Close();
conn.Dispose();
//捕獲目前程式運作出現的異常
throw;
}
}
}
//傳回DataTable
public static DataTable ExecuteDataTable(String sql, CommandType type, params SqlParameter[] pms)
{
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connString))
{
adapter.SelectCommand.CommandType = type;
if (pms != null)
{
adapter.SelectCommand.Parameters.AddRange(pms);
}
//執行查詢操作,擷取資料
adapter.Fill(dt);
}
return dt;
}
}
}
//登入按鈕業務邏輯
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _49_ado.net複習
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{
//MD5了解: 為什麼要使用? 同一内容的MD5不會改變,根據這一特性進行對比
//資料庫中存明文密碼的缺點是什麼?
//為什麼要使用MD5算法?
//MD5算法不可逆,有些内容的MD5值可能相同。
//建立一個MD5對象,調用方法來建立MD5值。ComputerHash(數組)
//計算某一個檔案的MD5值,計算某一個字元串的MD5值
}
/// <summary>
/// 登入的業務邏輯處理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// 代碼已經能夠成功執行了
private void button1_Click(object sender, EventArgs e)
{
string useName = tb1.Text.Trim();
string password = tb2.Text;
string sql = "select count(*) from UserTable where [email protected] and [email protected]";
//這一塊的代碼不太熟練啊
SqlParameter[] pms = new SqlParameter[] {
//數組裡面存放的是每一個SqlParameter對象:sql參數對象;數組元素之間使用逗号分割
new SqlParameter("@uid",SqlDbType.NVarChar,50) { Value= useName},
new SqlParameter("@pwd",SqlDbType.NVarChar,50) { Value=password}
};
//記住這種寫法,一定要多敲代碼
SqlParameter[] pms1 = new SqlParameter[] {
new SqlParameter ("@uid",SqlDbType.NVarChar,50) {//這個值從哪裡來?
Value =useName
},
new SqlParameter("@pwd",SqlDbType.NVarChar,50) {Value=password }
};
//能夠查詢到資料
int r = (int)SqlHelper.ExecuteScalsr(sql, CommandType.Text, pms);
if (r > 0)
{
MessageBox.Show("登入成功!");
}
else
{
MessageBox.Show("登入失敗!");
}
}
}
}