密碼修改
目錄
密碼修改
前言
專案結構(不是全部,只列出總綱和自己需要操作的部分)
1.Model的創建
2.做DB層的操作,創建介面,
3.介面的實作(implement)
4.接下來是Dal層的構建
5.Bl層的操作
6.Controller層代碼構建
7.單元測驗
前言
剛開始作業,第一次接觸專案,給大家分享的同時記錄下來,有錯誤的話希望指出,接下來也會持續更新,這里是用的c#語言,開發工具是visual studio 2019,資料庫工具是navicat,單元測驗工具是postman,這里要實作的是在這個專案中添加修改密碼功能,
專案結構(不是全部,只列出總綱和自己需要操作的部分)
Web.BL
Web.Dal
Web.Entities
- Models
- ViewModels
Web.Tools
WebMvc
- Controllers
WebMvcDB
- DB
- DBImplement
- DBServices
1.Model的創建
這個功能需要傳進去的物件有三個,分別為
- UserAccount(資料庫內的用戶)
- UserPassword(需要修改的密碼)
- UserOldePassword(資料庫內的原密碼)
Model所在位置在上面結構中,分為ViewModel和Model
ViewModel針對的前后臺互動的輸入輸出model,xxxxxRequestModel,xxxxResponseModel分別代表輸入 輸出
Model是mvc和mvcdb傳輸用的 ,xxxxInModel和xxxxOutModel代表輸入輸出
這里修改密碼是不需要輸出的,更改的是資料庫里內容,那么我們需要兩個輸入Model,分別命名為ChangePasswordRequestModel和ChangePasswordInModel
下面代碼using是有不少多余的,因為我只截取了自己的代碼出來,
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace Web.Entities.ViewModels
{
/// <summary>
/// 密碼變更需要的輸入引數
/// </summary>
public class ChangePasswordRequestModel
{
public ChangePasswordRequest ChangePasswordRequest { get; set; }
}
public class ChangePasswordRequest
{
/// <summary>
/// 用戶名
/// </summary>
[MaxLength(30)]
public string UserAccount { get; set; } //這樣的稱為屬性
/// <summary>
/// 新密碼(傳到資料庫里)
/// </summary>
[MaxLength(20)]
public string UserPassword { get; set; }
/// <summary>
/// 舊密碼(資料庫里)
/// </summary>
[MaxLength(20)]
public string OldUserPassword { get; set; }
}
}
namespace Web.Entities.Models
{
public class ChangePasswordInModel
{
/// <summary>
/// 用戶名
/// </summary>
public string UserAccount { get; set; }
/// <summary>
/// 新密碼(傳到資料庫里)
/// </summary>
public string UserPassword { get; set; }
/// <summary>
/// 舊密碼(資料庫里)
/// </summary>
public string OldUserPassword { get; set; }
}
}
2.做DB層的操作,創建介面,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Web.Entities.Models;
using Web.Entities.ViewModels;
namespace WebMvcDB.DB.DBServices
{
public interface IUserInfoDao
{
/// <summary>
/// 密碼更新
/// </summary>
/// <param name="input">用戶資訊</param>
public Boolean ChangePassword(ChangePasswordInModel input);
}
}
3.介面的實作(implement)
public Boolean ChangePassword(ChangePasswordInModel input)
{
//資料庫的鏈接呼叫
WFContext wfContext = new WFContext();
//tbUserInfoMsts是我資料庫里的表
IQueryable<TbUserInfoMst> tbUserInfoMsts
= wfContext.TbUserInfoMsts.AsQueryable();
List<TbUserInfoMst> tbUserInfoMstList
= new List<TbUserInfoMst>();
// 改變密碼前的check
tbUserInfoMstList = tbUserInfoMsts.Where
(m=>m.UserAccount.Equals(input.UserAccount)&&
m.UserPassword.Equals(input.OldUserPassword)&&
m.IsDel == 0).ToList();
TbUserInfoMst userInfoMst = new TbUserInfoMst();
if (!Util.IsEmpty(tbUserInfoMstList) && tbUserInfoMstList.Count != 0)
{
userInfoMst = tbUserInfoMstList.First();
}
else
{
return false;
}
/*
密碼的更新操作,這里做了新舊密碼相同時才更新,
但是實際應用時這個check拋給前臺也可以
*/
if (input.UserPassword != input.OldUserPassword)
{
userInfoMst.UserPassword = input.UserPassword;
wfContext.Attach(userInfoMst);
wfContext.SaveChanges();
}
return true;
}
4.接下來是Dal層的構建(這里會呼叫所需的Implement)
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Text;
using Web.Entities.Models;
using Web.Entities.ViewModels;
using WebMvcDB.DB.DBImplement;
using WebMvcDB.DB.DBServices;
namespace Web.Dal
{
public class HomeDal : BaseDal
{
/// <summary>
/// 密碼修改
/// </summary>
/// <param name="input">用戶資訊</param>
/// <returns></returns>
public static WebReturn ChangePassword(ChangePasswordRequest input)
//WebReturn 是專案物體層(Entities)網頁回傳用的一個類
{
//這里是把IUserInfoDao介面實體化
IUserInfoDao tUserInfoDao = new TUserInfoImplement();
// 密碼修改
Boolean flag = tUserInfoDao.
ChangePassword(CastModel<ChangePasswordInModel>(input));
return Success(flag);
}
}
}
5.Bl層的操作(呼叫Dal層)
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using Web.Dal;
using Web.Entities.Models;
using Web.Entities.ViewModels;
namespace Web.BL
{
public class HomeBl : BaseBl
{
/// <summary>
/// 密碼更新
/// </summary>
/// <param name="input">UserAccount,UserPassword,UserOldPassword</param>
/// <returns>布爾型別結果</returns>
public static Boolean ChangePassword(ChangePasswordRequest input)
//這里用Boolean定義是因為回傳值是Boolean
{
/*
定義的WebReturn引數changePassword是
呼叫的Dal層里面的HomeDal的方法里輸入的引數
*/
WebReturn changePassword = HomeDal.ChangePassword(input);
/*
JsonConvert.DeserializeObject<T>(string value)
是轉換為反序列的obj型別的方法,直接呼叫即可
*/
return JsonConvert.DeserializeObject<Boolean>(changePassword.Data.ToString());
}
}
}
6.Controller層代碼構建,這一層定義方法,并呼叫Bl層
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Web.BL;
using Web.Entities;
using Web.Entities.Models;
using Web.Entities.ViewModels;
using Web.Entities.ViewModels.Base;
using Web.Tools;
namespace WebMvc.Controllers
{
[ApiController]
[Route("api/[controller]/[action]")]
public class HomeController : BaseController
{
public HomeController(IWebHostEnvironment env, IHttpContextAccessor ctx) : base(env, ctx)
{
}
/// <summary>
/// 密碼更新操作
/// </summary>
/// <param name="ChangePassword"></param>
/// <returns></returns>
[HttpPost] //[***]是特性的寫法,這里是指在post請求下執行
public async Task<ActionResult<ResponseRootModel>> ChangePassword([FromBody] ChangePasswordRequestModel ChangePassword)
上面這個方法
{
try
{
//此行可參考<a>https://www.cnblogs.com/dudu/p/task-yield.html<a>
await Task.Yield();
/*
ChangePassword.ChangePasswordRequest等同于
ChangePasswordRequestModel.ChangePasswordRequest,這里呼叫的viewmodel里的方法
*/
ChangePasswordRequest requestDataSet = ChangePassword.ChangePasswordRequest;
//報錯時資訊存放變數
ResponseHeaderModel headerModel = new ResponseHeaderModel();
/*
輸入檢查空值,這里注意Util.IsEmpty()不能用于
***.count(),用***.count()==0判斷,.count()是元素個數的計量,
如果用null判斷會出錯
*/
if (requestDataSet == null || Util.IsEmpty(requestDataSet.UserAccount) ||
Util.IsEmpty(requestDataSet.UserPassword) || Util.IsEmpty(requestDataSet.OldUserPassword))
{
// 這里是錯誤資訊顯示,回傳的是implement里面的flase
headerModel.MessageId = "SV_100001";
SetHeader(headerModel);
return Error();
}
// Booleanタイプ結果を取得
Boolean flg = HomeBl.ChangePassword(requestDataSet);
if (!flg)
{
headerModel.MessageId = "SV_200004";
SetHeader(headerModel);
return Error();
}
// 這里注意,成功執行回傳的是空值,如果希望回傳布林值,可以用return Success(flg);
return Success();
}
catch (Exception e)
{
string errorMessage = "出錯";
LogsHelper.WriteBothLog(NLog.LogLevel.Error, LogType.Web, new LogInfoModel("ERROR-0002", errorMessage), "", new Exception(errorMessage, e));
throw e;
}
}
}
}
7.單元測驗
走到這里的時候我們的單元內容已經結束,下面是對結果的其中一個測驗,我用的是postman進行單元測驗,安裝部分我就略過了,有需要也可以私聊我,
postman send,這里測驗的是資料庫里的
UseAccount = test3; UserPassword = Testsucceed; UserOldPassword = succeed

執行測驗前資料庫Test3密碼為succeed

修改后的密碼為testsucceed

到這里這個功能就在專案中添加進去了,感謝觀看,希望和各位多多交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/376066.html
標籤:其他
上一篇:YOLOV3代碼主干部分代碼決議
