图形验证码
图形验证码主要代码:
路由:/Utilte
if (mCodeLeng < 4)
{//最小4位
mCodeLeng = 4;
}
string mCode = "";
byte[] mData = CheckCodeByPicHelp.f_GetCode(mCodeLeng, ref mCode); //生成图像验证码
if (mData != null)
{
RedisHelper redis = new RedisHelper(0); //记录会话状态
string mXWCodeStr = ""; //验证码字段
string mGUID = System.Guid.NewGuid().ToString(); //获取当前guid
mXWCodeStr = XWSuperClass.S_XWCheckCodeByPIC_QZ + mGUID; //规则 前缀 + GUID
redis.StringSet(mXWCodeStr, mCode, TimeSpan.FromSeconds(XWSuperClass.S_XWCheckCodeTimeOUT));
RCheckCodeByPic mRCheckCodeByPic = new RCheckCodeByPic()
{
codeid = mGUID,
checkcodepic = Convert.ToBase64String(mData)
};
return AjaxResult.Success(mRCheckCodeByPic, "获取验证码成功");
}
生成图像验证码:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using TIS.Utilte.Log;
namespace TIS.Utilte.CheckCode
{
/// <summary>
/// 图像验证码
/// </summary>
public class CheckCodeByPicHelp
{
/// <summary>
/// 生成code
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
private static string CreateValidateCode(int len)
{
// 设置允许出现的字符
string charStrs = "dsadfjlwepqsdfkfhdkasrxfownds34566451346";
Random random = new Random();
// 通过随机数生成code
string code = String.Empty;
for (int i = 0; i < len; i++)
{
code += charStrs[random.Next(charStrs.Length)];
}
return code;
}
/// <summary>
/// 生成code并提供两种方式存储 建议采用字节流存储
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
private static Byte[] GenerateCode(string code)
{
// 创建画板 设置宽度和高度
Bitmap bitmap = new Bitmap(code.Length * 23, 47);
// 创建画笔
Graphics graphics = Graphics.FromImage(bitmap);
// 给画布涂上背景
graphics.Clear(Color.White);
// 设置颜料板和调色刷
RectangleF rectangleF = new RectangleF(0, 0, bitmap.Width, bitmap.Height);
Color[] mColors = { Color.Red, Color.Yellow, Color.Blue, Color.Green,
Color.DarkBlue, Color.GreenYellow, Color.Black, Color.Purple };
Random random = new Random();
Color mCodeColor = mColors[random.Next(mColors.Length)];
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(rectangleF, mCodeColor, Color.DarkBlue, 1.2f, true);
// 设置需要画到图中文字的格式(字体,大小,是否加粗,斜体)
Font font = new Font("Consolas", 22, FontStyle.Bold | FontStyle.Italic);
// 将 文字画到面板上
graphics.DrawString(code, font, linearGradientBrush, 0, 0);
// 存储验证码
#region 存储法一 路径存储
//bitmap.Save("code.jpg");
#endregion
#region 存储法二 字节流存储
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] mData = stream.ToArray();
bitmap.Dispose();
graphics.Dispose();
return mData;
}
#endregion
}
/// <summary>
/// 生成图像验证码
/// </summary>
/// <param name="pCode"></param>
/// <returns></returns>
public static Byte[] f_GetCode(int pCodeLeng, ref string pCode)
{
string mCodeStr = CreateValidateCode(pCodeLeng); //生成一个验证码 abc4
byte[] mData = GenerateCode(mCodeStr); //获取图像验证码
if (mData != null)
{
pCode = mCodeStr; //获取验证码
}
return mData;
}
}
}
返回数据:
{
"s_ErrCode": 0,
"message": "获取验证码成功",
"data": {
"codeid": "11ecc80d-0f0b-49f5-8678-201f6768ce3e",
"checkcodepic": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHB......"
}
}
登录
string mCheckCodeId = pJsonValue["checkcode_id"].ToString(); //验证码id
string mCheckCode = pJsonValue["checkcode"].ToString(); //验证码
RedisHelper redis = new RedisHelper(0); //记录会话状态
string mXWCheckCodeIdKey = XWSuperClass.S_XWCheckCodeByPIC_QZ + mCheckCodeId; //获取会话id
string mGetCheckCodeStr = redis.StringGet(mXWCheckCodeIdKey); //获取checkcode
redis.KeyDelete(mXWCheckCodeIdKey); //验证成功后删除
if (string.IsNullOrEmpty(mGetCheckCodeStr))
{
return AjaxResult.Error("验证码错误", AjaxResult.ErrCode.CheckCodeErr);
}
if (mGetCheckCodeStr != mCheckCode)
{
return AjaxResult.Error("验证码错误", AjaxResult.ErrCode.CheckCodeErr);
}
mUserPwd = CodeHelp.f_GetMD5Hash32(mUserPwd);
///////////////////////////查询数据///////////////////////////
IQuery<xwtis_sys_user> m_q_sysuser = context.Query<xwtis_sys_user>(); //获取xwtis_sys_user表数据
var mGetSysUser = m_q_sysuser.Where(a => a.user_code == mUserName &&
a.user_status == "1").Select(a => new
{
a.iid,
a.user_code,
a.user_name,
a.user_pwd
}).FirstOrDefault();
if (mGetSysUser == null || mGetSysUser.user_pwd != mUserPwd)
{
return AjaxResult.Error("用户名或密码错误");
}
mUserId = mGetSysUser.iid.ToString(); //获取用户id
///////////////////////////返回数据///////////////////////////
TokenUserInfo mUserInfo = new TokenUserInfo();
mUserInfo.S_UserId = mUserId; //用户id
mUserInfo.S_UserCode = mGetSysUser.user_code; //用户编码
mUserInfo.S_UserName = mGetSysUser.user_name; //用户名称
string mGetTokenErr = ""; //获取Toke错误信息
string mToke = TokenHelp.f_GetToken(mUserInfo, ref mGetTokenErr); //获取登录Token
if (!string.IsNullOrEmpty(mGetTokenErr))
{
LogManager.WriteLog("登录异常 获取令牌异常 " + mGetTokenErr);
return AjaxResult.Error("登录异常 获取令牌异常", AjaxResult.ErrCode.Err);
}
string mXWSessionId = ""; //会话key
string mGUID = System.Guid.NewGuid().ToString(); //获取当前guid
mXWSessionId = XWSuperClass.S_XWSessionId_Qz + mGUID; //规则 前缀 + GUID
redis.StringSet(mXWSessionId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromSeconds(XWSuperClass.S_XWSessionTimeOUT));
RUserTokenInfo mRUserTokenInfo = new RUserTokenInfo()
{
user_id = mUserId, //用户名
token = mToke, //登录token
xwsessionid = mGUID //会话id
};
return AjaxResult.Success(mRUserTokenInfo, "登录成功");
调用示例
{
"header": {
"actionname": "Login"
},
"body": {
"user_name":"se",
"user_pwd":"测试",
"checkcode_id":"2403f6e6-b5b0-43c9-919f-d47c6bc5553b",
"checkcode":"h5s6"
}
}
返回示例
{
"s_ErrCode": 0,
"message": "登录成功",
"data": {
"user_id": "001",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.e......",
"xwsessionid": "4a57cdbd-3e91-4a05-ba65-aef5d5300c20"
}
}
刷新token
TokenUserInfo mUserInfo = new TokenUserInfo();
mUserInfo.S_UserId = pJsonValue["user_id"].ToString(); //用户编码
mUserInfo.S_UserName = pJsonValue["user_name"].ToString(); //用户名称
string mGetTokenErr = ""; //获取Toke错误信息
string mToke = TokenHelp.f_GetToken(mUserInfo, ref mGetTokenErr); //获取登录Token
if (!string.IsNullOrEmpty(mGetTokenErr))
{
LogManager.WriteLog("登录异常 获取令牌异常 " + mGetTokenErr);
return AjaxResult.Error("登录异常 获取令牌异常", AjaxResult.ErrCode.Err);
}
JObject mJObject = new JObject();
mJObject["token"] = mToke; //Token
return AjaxResult.Success(mJObject, "刷新token成功");
获取菜单和用户权限
if (f_IsArgeNullOrEmpty(pJsonValue, "user_id"))
{
return AjaxResult.Error("登录参数不正确", AjaxResult.ErrCode.Err);
}
int mUserId = -1; //用户id
string mInstitutionCode = ""; //机构编码
string mInstitutionName = ""; //机构名称
try
{
mUserId = Convert.ToInt32(pJsonValue["user_id"].ToString());
}
catch
{
return AjaxResult.Error("登录参数不正确", AjaxResult.ErrCode.Err);
}
List<string> mAidList = new List<string>(); //所有AID集合
MySqlContext context = new MySqlContext(new MySqlConnectionFactory(SuperConClass.S_MPIDBICPCConStr));
try
{
///////////////////////////获取用户机构和角色///////////////////////////
var mGetUserInstitution = context.JoinQuery<xwtis_sys_user_institution, xwtis_sys_institution>((user_institution, institution) => new object[]
{
JoinType.LeftJoin, user_institution.institution_code == institution.institution_code, /* 表 xwtis_sys_user_institution 和 xwtis_sys_institution 进行Left连接 */
})
.Select((user_institution, institution) => new
{
institution.institution_code,
institution.institution_name,
user_institution.user_iid
})
.Where(a => a.user_iid == mUserId)
.FirstOrDefault(); //默认只有一个机构
///////////////////////////获取菜单权限///////////////////////////
List<RActionClass> mNodes = new List<RActionClass>();
if (mGetUserInstitution != null)
{
mInstitutionCode = mGetUserInstitution.institution_code; //机构编码
mInstitutionName = mGetUserInstitution.institution_name; //机构名称
var mGetAction_menu = context.JoinQuery<xwtis_sys_user_institution, xwtis_sys_role_action, xwtis_sys_action>((user_institution, role_action, action) => new object[]
{
JoinType.LeftJoin, user_institution.role_iid == role_action.role_iid, /* 表 xwtis_sys_user_institution 和 xwtis_sys_role_action 进行Left连接 */
JoinType.LeftJoin, role_action.action_iid == action.iid /* 表 xwtis_sys_role_action 和 xwtis_sys_action 进行Left连接 */
})
.Select((user_institution, role_action, action) => new
{
user_id = user_institution.iid,
user_institution.institution_code,
action.actiontype,
action_id = action.aid,
action.paid,
action.path,
action.component,
action.redirect,
action.adescribe,
action.icopath,
action.isvisible,
action.sys_type,
action.sortid
})
.Where(a => a.user_id == mUserId && a.institution_code == mInstitutionCode
&& a.actiontype == "W" && a.isvisible == "Y")
.OrderBy(a => a.sortid).ToList();
//获取所有子项
foreach (var mMenuItem in mGetAction_menu)
{
if (!mAidList.Contains(mMenuItem.action_id.ToString()))
{//添加权限
mAidList.Add(mMenuItem.action_id.ToString());
}
mNodes.Add(new RActionClass()
{
id = mMenuItem.action_id.ToString(),
pid = mMenuItem.paid.ToString(),
path = mMenuItem.path,
component = mMenuItem.component,
redirect = mMenuItem.redirect,
name = mMenuItem.action_id.ToString(),
meta = new RMeta()
{
title = mMenuItem.adescribe,
icon = mMenuItem.icopath,
roles = new string[] { mUserId.ToString() }
}
});
}
}
///////////////////////////获取用户权限///////////////////////////
List<RActionUserClass> mNode_Users = new List<RActionUserClass>();
if (mGetUserInstitution != null)
{
mInstitutionCode = mGetUserInstitution.institution_code; //机构编码
mInstitutionName = mGetUserInstitution.institution_name; //机构名称
var mGetAction_User = context.JoinQuery<xwtis_sys_user_institution, xwtis_sys_role_action, xwtis_sys_action>((user_institution, role_action, action) => new object[]
{
JoinType.LeftJoin, user_institution.role_iid == role_action.role_iid, /* 表 xwtis_sys_user_institution 和 xwtis_sys_role_action 进行Left连接 */
JoinType.LeftJoin, role_action.action_iid == action.iid /* 表 xwtis_sys_role_action 和 xwtis_sys_action 进行Left连接 */
})
.Select((user_institution, role_action, action) => new
{
user_id = user_institution.iid,
user_institution.institution_code,
action.actiontype,
action_id = action.aid,
action.paid,
action.path,
action.component,
action.redirect,
action.adescribe,
action.icopath,
action.isvisible,
action.sys_type,
action.edit_type,
action.sortid
})
.Where(a => a.user_id == mUserId && a.institution_code == mInstitutionCode
&& a.actiontype == "A" && a.isvisible == "Y")
.OrderBy(a => a.sortid).OrderBy(a => a.sortid).ToList();
//获取所有子项
foreach (var mMenuItem in mGetAction_User)
{
RActionUserClass mRActionUserClass = new RActionUserClass();
mRActionUserClass.aid = mMenuItem.action_id.ToString();
mRActionUserClass.title = mMenuItem.adescribe;
switch (mMenuItem.edit_type)
{
case "1":
mRActionUserClass.edittype = RActionUserClass.EditType.显示;
break;
case "-1":
mRActionUserClass.edittype = RActionUserClass.EditType.隐藏;
break;
case "-2":
mRActionUserClass.edittype = RActionUserClass.EditType.不可编辑;
break;
}
mNode_Users.Add(mRActionUserClass);
if (mMenuItem.edit_type != "-1" && mMenuItem.edit_type != "-2")
{//隐藏和不可编辑到没有权限
if (!mAidList.Contains(mMenuItem.action_id.ToString()))
{
mAidList.Add(mMenuItem.action_id.ToString());
}
}
}
}
RedisHelper redis = new RedisHelper(0);
string mActionKey = XWSuperClass.S_XWActionList_QZ + mUserId.ToString();
string mAids = "";
foreach (string mAid in mAidList)
{
mAids += mAid + ",";
}
if (!string.IsNullOrEmpty(mAids))
{
mAids = mAids.Substring(0, mAids.Length - 1);
}
redis.StringSet(mActionKey, mAids); //权限记录
//生成对应树形对象
List<RActionClass> mActionClassList = ActionTreeClass.f_CreateMenu_Auto(mNodes);
RActions mRActions = new RActions();
mRActions.institution_code = mInstitutionCode; //机构编码
mRActions.institution_name = mInstitutionName; //机构名称
mRActions.actionmenu = mActionClassList; //菜单权限
mRActions.actionuser = mNode_Users; //按钮功能权限
return AjaxResult.Success(mRActions, "权限获取成功");
}
catch (Exception ex)
{
LogManager.WriteLog("获取权限异常:" + ex.Message);
return AjaxResult.Error("获取权限异常", AjaxResult.ErrCode.ServerErr);
}
finally
{
context.Dispose();
}