2022年06月06日

图形验证码

图形验证码主要代码:

路由:/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();
}