來源:https://blog.csdn.net/Yuhang_Zhou/article/details/140614304
驗證碼輔助類
驗證碼輔助類
using System.Drawing; using System.Drawing.Imaging; namespace XCGApp { /// <summary> /// 驗證碼輔助類 /// </summary> public class ValidateCodeUtil { /// <summary> /// 驗證碼長度 /// </summary> public int CodeLen { get; set; } /// <summary> /// 驗證碼 /// </summary> public string VCode { get; private set; } /// <summary> /// 驗證碼圖像 /// </summary> public Bitmap VCodeImg { get; private set; } private int fineness = 70;//圖片清晰度 數值越大越清晰 private int imgWidth = 48;//圖片寬度 private int imgHeight = 24;//圖片高度 private int fontSize = 14;//字體大小 private string fontFamily = "Microsoft YaHei";//字體名稱 /// <summary> /// 生成驗證碼 /// </summary> public string CreateVCode(int codeLen = 4) { CodeLen = codeLen; string vCode = ""; Random random = new Random(); for (int i = 0; i < CodeLen; i++) { int n = random.Next(10); vCode += n.ToString(); } VCode = vCode; return vCode; } /// <summary> /// 驗證碼圖像Byte /// </summary> /// <returns></returns> public byte[] GetCodeImgByte() { VCodeImg = new Bitmap(imgWidth, imgHeight); //生成像素點 DrawPixel(VCodeImg); //繪制驗證碼圖像 DrewVCode(VCodeImg, VCode); //Bitmap轉byte[] byte[] imgByte = BitmapToByte(VCodeImg); return imgByte; } /// <summary> /// 驗證碼圖像Byte /// </summary> /// <returns></returns> public byte[] GetCodeImgByte(string code) { VCodeImg = new Bitmap(imgWidth, imgHeight); //生成像素點 DrawPixel(VCodeImg); //繪制驗證碼圖像 DrewVCode(VCodeImg, code); //Bitmap轉byte[] byte[] imgByte = BitmapToByte(VCodeImg); return imgByte; } /// <summary> /// 生成像素點 /// </summary> private void DrawPixel(Bitmap bitmap) { Random random = new Random(); for (int i = 0; i < bitmap.Width; i++) { for (int j = 0; j < bitmap.Height; j++) { if (random.Next(90) <= fineness) bitmap.SetPixel(i, j, Color.LightGray); } } } /// <summary> /// 繪制驗證碼圖像 /// </summary> /// <param name="bitmap"></param> private void DrewVCode(Bitmap bitmap, string vCode) { Graphics g = Graphics.FromImage(bitmap); Font font = new Font(fontFamily, fontSize, FontStyle.Regular); g.DrawString(vCode, font, Brushes.Black, 0, 0); } /// <summary> /// Bitmap轉byte[] /// </summary> private byte[] BitmapToByte(Bitmap bitmap) { MemoryStream ms = new MemoryStream(); bitmap.Save(ms, ImageFormat.Bmp); byte[] imgByte = ms.GetBuffer(); return imgByte; } } }
api接口
[HttpGet] public ActionResult ShowCode(string key) { var codeObj = RedisUtil.GetRedis().Get(key); if (codeObj == null) { ApiResult res = new ApiResult() { Code = "-1", Message = "驗證碼失效,請刷新重試。" }; return Json(res); } else { string vCode = codeObj.ToString(); //生成驗證碼圖像Byte ValidateCodeUtil validateCode = new ValidateCodeUtil(); byte[] imgByte = validateCode.GetCodeImgByte(vCode); return File(imgByte, "image/jpeg"); } }
api接口生成驗證碼
[HttpPost] public ApiResult GenerateValidateNo([FromBody]VCDto dto) { ApiResult res = new ApiResult() { Code = "-1", Message = "請求失敗" }; try { if (!string.IsNullOrEmpty(dto.OldKey)) { //移除舊驗證碼 RedisUtil.GetRedis().Remove(dto.OldKey); } //驗證碼的RedisKey var guid = Guid.NewGuid().ToString().Replace("-", ""); //生成驗證碼 ValidateCodeUtil validateCode = new ValidateCodeUtil(); string vCode = validateCode.CreateVCode(); //保存進Redis,1分鐘有效。 RedisUtil.GetRedis().Insert(guid, vCode, DateTime.Now.AddMinutes(1)); res.Code = ""; res.Message = "OK"; res.Data = guid; return res; } catch (Exception e) { res.Message = "驗證碼生成異常:" + e.Message; return res; } }
vue前端<img id="imgvcode" ref="imgvcode" src="" @click="GetVerifyCode()" />
mounted() { this.GetVerifyCode(); }, methods: { GetVerifyCode() { let vcSrc = that.$refs.imgvcode.src; var q = vcSrc.match(new RegExp('[?&]' + 'key' + '=([^&#]*)')); let oldKey = (q && q[1]) || ''; let para = { "OldKey": oldKey }; PostRequestAPI("Test/GenerateValidateNo", para).then((res) => { if (res.Code == "") { that.form.validateCodeKey = res.Data; that.$refs.imgvcode.src = '/Test/ShowCode?key=' + res.Data; } else { alert(res.Message); } }); }, }
浙公網安備 33010602011771號