C#实现计算题验证码

news2024/11/18 13:50:30

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core API

1、建立一个验证码控制器

新建两个方法Create和Check,Create用于创建验证码,Check用于验证它是否有效。

声明一个静态类变量存放列表,列表中存放包含令牌和验证码的对象。

        private static List<VCodeCalculateModel> _list = new List<VCodeCalculateModel>();

        /// <summary>
        /// 返回一个图形验证码和令牌.
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Create()
        {
            VCodeCalculateModel model = new VCodeCalculateModel();
            model.id = Guid.NewGuid().ToString();    // 生成令牌
            var codes = VCodeCalculateModel.GetVCode();
            var num1 = codes.Item1;
            var num2 = codes.Item2;
            var bool_operator = codes.Item3;
            if (bool_operator)
            {
                // 加法运算,生成验证码
                model.code = Convert.ToString(num1 + num2);
            }
            else
            {
                // 减法运算,生成验证码
                model.code = Convert.ToString(num1 - num2);
            }

            _list.Add(model);

             // 返回对象
             VCodeCalculateController_Create_Receive result = new VCodeCalculateController_Create_Receive();
            result.code = "0";
            result.data = new VCodeCalculateController_Create_Receive.Data();
            result.data.id = model.id;
            var image = VCodeCalculateModel.DrawImage(num1, num2, bool_operator);
            var base64 = Utils.BitmapToBase64Str(image);
            result.data.img = base64;
            var json = JsonConvert.SerializeObject(result);
            return json;
        }

        /// <summary>
        /// 检查验证码是否有效
        /// </summary>
        /// <param name="id">令牌.</param>
        /// <param name="code">验证码.</param>
        /// <returns></returns>
        [HttpGet]
        public string Check(string id, string code)
        {
            try
            {
                var index = _list.FindIndex(m =>
                {
                    if (m.id.Equals(id) && m.code.Equals(code))
                    {
                        return true;
                    }

                    return false;
                });

                ReceiveObject result = new ReceiveObject();
                if (index >= 0)
                {
                    _list.RemoveAt(index);
                    result.code = "0";
                    result.msg = "验证成功";
                    var json = JsonConvert.SerializeObject(result);
                    return json;
                }
                else
                {
                    result.code = "1";
                    result.msg = "验证失败";
                    var json = JsonConvert.SerializeObject(result);
                    return json;
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(exception: ex, message: ex.Message);
                ReceiveObject result = new ReceiveObject();
                result.code = "999999";
                result.msg = "系统异常";
                var json = JsonConvert.SerializeObject(result);
                return json;
            }
        }

2、建立一个验证码模型

验证码模型类包括:令牌和验证码属性。

再创建一个类存放Create方法返回的对象包括:令牌,验证码图片。

创建用于生成2个随机数和运算法的方法。

创建将2个随机数和运算法绘制成图片的方法。

        /// <summary>
        /// 令牌.
        /// </summary>
        public string id { get; set; }

        /// <summary>
        /// 验证码.
        /// </summary>
        public string code { get; set; }

        /// <summary>
        /// 计算数字列表.
        /// </summary>
        static readonly int[] list = new int[50]
        {
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
            21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
            31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
            41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        };

        /// <summary>
        /// 获取随机验证码.
        /// </summary>
        /// <returns>item1 - 第一个数字,item2 - 第二个数字,item3 - 运算符(true - 加法, false - 减法)</returns>
        public static Tuple<int, int, bool> GetVCode()
        {
            Random random = new Random();
            var index = random.Next(0, list.Length);
            int num1 = list[index];
            var index2 = random.Next(0, list.Length);
            int num2 = list[index2];
            bool bool_operator = random.Next(0, 2) == 1 ? true : false;
            return new Tuple<int, int, bool>(num1, num2, bool_operator);
        }

        /// <summary>
        /// 绘制验证码的图片.
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static Bitmap DrawImage(int num1, int num2, bool isAdd)
        {
            Color[] list_color =
            {
                Color.FromArgb(240, 230, 140),    // 黄褐色(亮)
                Color.FromArgb(138, 54, 15),    // 黄褐色(暗)
                Color.FromArgb(51, 161, 201),    // 蓝色(亮)
                Color.FromArgb(25, 25, 112),    // 蓝色(暗)
                Color.FromArgb(192, 192, 192),    // 灰白(亮)
                Color.FromArgb(128, 128, 105),    // 灰白(暗)
            };

            Random random = new Random();

            // 创建画板
            Bitmap bitmap = new Bitmap(150, 50);

            // 创建画笔
            Graphics grp = Graphics.FromImage(bitmap);
            grp.Clear(Color.White);    // 设置背景色为白色

            // 绘制噪点
            for (int i = 0; i < random.Next(60, 80); i++)
            {
                int x = random.Next(bitmap.Width);
                int y = random.Next(bitmap.Height);
                grp.DrawLine(new Pen(Color.LightGray, 1), x, y, x + 1, y);
            }

            // 绘制随机的线条
            grp.DrawLine(
                new Pen(list_color[random.Next(list_color.Length)], random.Next(3)),
                new Point(random.Next(bitmap.Width / 2), random.Next(bitmap.Height / 2)),
                new Point(bitmap.Width / 2 + random.Next(bitmap.Width / 2), bitmap.Height / 2 + random.Next(bitmap.Height / 2))
            );

            // 绘制验证码
            string code = string.Format("{0}{1}{2}", num1, isAdd ? "+" : "-", num2);
            for (int i = 0; i < code.Length; i++)
            {
                var item = code[i];
                grp.DrawString(item.ToString(),
                    new Font(FontFamily.GenericSansSerif, 25, FontStyle.Bold),
                    new SolidBrush(list_color[random.Next(list_color.Length)]),
                    x: (150 / 5) * i,
                    y: random.Next(5));
            }

            // 在验证码上绘制噪点
            for (int i = 0; i < random.Next(30, 50); i++)
            {
                int x = random.Next(bitmap.Width);
                int y = random.Next(bitmap.Height);
                grp.DrawLine(new Pen(list_color[random.Next(list_color.Length)], 1), x, y, x + 1, y);
            }

            // 绘制随机的线条
            grp.DrawLine(
                new Pen(list_color[random.Next(list_color.Length)], random.Next(3)),
                new Point(random.Next(bitmap.Width / 2), random.Next(bitmap.Height / 2)),
                new Point(bitmap.Width / 2 + random.Next(bitmap.Width / 2), bitmap.Height / 2 + random.Next(bitmap.Height / 2))
            );

            return bitmap;
        }

        /// <summary>
        /// VCodeCalculateController控制器中Create方法的返回对象.
        /// </summary>
        public class VCodeCalculateController_Create_Receive : ReceiveObject
        {
            public Data data { get; set; }

            public class Data
            {
                /// <summary>
                /// 令牌.
                /// </summary>
                public string id { get; set; }

                /// <summary>
                /// Base64的验证码图片.
                /// </summary>
                public string img { get; set; }
            }
        }

运行效果:


 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公众号运营:公众号互选广告操作流程指南

什么是公众号互选广告平台&#xff1f; 公众号互选平台&#xff0c;是广告主和流量主双向互选、自由达成内容合作的交易 平台&#xff0c;广告创意呈现在公众号文章内容中。 收入模式&#xff1a;按合作文章收费&#xff0c;合作价格由流量主自主决定。 操作配合&#xff1a;提…

1334179-85-9,BTTAA,是各种化学生物学实验中生物偶联所需

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ BTTAA试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;2-[4-({双[(1-叔丁基-1H-1,2,3-三唑-4-基)甲基]氨基}甲基)-1H-1,2,3-三唑-1-基]乙酸 英文名称&#xff1a;BTTAA CAS号&#xff1a;1334179-8…

Vue2 第一节 通用概念和前置知识

本篇将记录自己学习Vue的知识点总结 学习资源&#xff1a; B站 &#xff1a;尚硅谷Vue2.0Vue3.0全套教程 有个博主将这个视频总结成了笔记&#xff0c;之后的博客也会参考这个笔记 (126条消息) 【2022.3】尚硅谷Vue.js从入门到精通基础笔记&#xff08;理论实操知识点速查&…

Android 之 Paint API —— PathEffect (路径效果)

本节引言&#xff1a; 本节继续来学习Paint的API——PathEffect(路径效果)&#xff0c;我们把画笔的sytle设置为Stroke&#xff0c;可以 绘制一个个由线构成的图形&#xff0c;而这些线偶尔会显得单调是吧&#xff0c;比如你想把这些先改成虚线&#xff0c;又 或者想让路径的转…

我们聊聊性能测试的理解误区

有同学私信我&#xff0c;和他聊了聊关于性能测试的一些话题&#xff0c;发现他对性能测试的理解走入了一些误区。 在一些技术交流群&#xff0c;同样遇到过很多同学由于对性能测试理解上的误区导致的各种问题&#xff0c;比如&#xff1a; 注册用户数并发数&#xff0c;然后服…

Top命令

Top top - 12:46:01 up 2 days, 11:10, 3 users, load average: 0.56, 0.59, 0.45系统基本信息&#xff1a;显示了系统运行时间、登录用户数和平均负载&#xff08;load average&#xff09;情况。平均负载是系统在特定时间范围内的平均活跃进程数&#xff0c;可以用来衡量系…

自动驾驶之轨迹规划8——Apollo参考线和轨迹

1. abstract 本文主要讲解routing和planning模块中的reference line&#xff0c;我之前一直搞不明白这个reference line是如何生成的&#xff0c;有什么作用&#xff0c;和routing以及planning的关系。现在有了一些心得打算梳理一下&#xff1a; 决策规划模块负责生成车辆的行…

Go基础—反射,性能和灵活性的双刃剑

Go基础—反射&#xff0c;性能和灵活性的双刃剑 1 简介2 结构体成员赋值对比3 结构体成员搜索并赋值对比4 调用函数对比5 基准测试结果对比 1 简介 现在的一些流行设计思想需要建立在反射基础上&#xff0c;如控制反转&#xff08;Inversion Of Control&#xff0c;IOC&#x…

7.27 Qt

制作简易小闹钟 Timer.pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # dep…

替换字母题解

样例输入1&#xff1a; 5 4 abcab样例输出1&#xff1a; 1样例输入2&#xff1a; 5 3 abcab样例输出2&#xff1a; 2思路分析&#xff1a; 看到这种题&#xff0c;先想到 O ( 26 n ) O(26\times n) O(26n)的时间复杂度&#xff0c;枚举把字符串都变成每一个字母所需要的最…

ubuntu20.04 安装 docker engine

打开docker官网 点击上图中间的Linux&#xff0c;会是这样&#xff1a; 点击上图的左边栏的 Docker Engine,点击install, 点击 Ubuntu&#xff0c;会是这样&#xff1a; 把页面翻下来&#xff0c;先按照 Insstallation methods 中的 set up thre repository&#xff0c;执行这些…

平安私人银行受邀慈善服务高质量发展会议,分享慈善规划服务

近日&#xff0c;中华慈善总会家风传承与慈善信托委员会成立仪式&#xff0c;以及由中华慈善总会、中国银行业协会联合发起的“慈善顾问赋能计划”启动仪式在北京举行。平安私人银行受邀参会并分享慈善规划服务&#xff0c;平安私人银行慈善业务总监王英及平安私人银行客户、“…

[算法很美打卡] 多维数组篇 (打卡第二天)

文章目录 Z形打印边界为1的最大子方阵 Z形打印 package 每日算法学习打卡.算法打卡.七月份.七月二十七号;public class test1 {public static void main(String[] args) {int[][] matrix {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},};print(matrix);}static void print(int[…

基于信用博弈的数据价格动态评估模型

纯纯的&#xff0c;共享出来了 目录 摘要 2 数据价格动态评估模型 2.1 数据产品定价策略 摘要 传统数据交易平台中&#xff0c;定价完全由平台把控&#xff0c;数据所有者不明确数据潜在价值&#xff0c;网络买卖双方信用缺失&#xff0c;导致数据交易中的数据价格难以评估…

HCIA实验二

实验要求&#xff1a; 1.R2为ISP&#xff0c;只能配置IP 2.R1-R2之间为HDLC封装 3.R2-R3之间为PPP封装&#xff0c;pap认证&#xff0c;R2为主认证方 4.R2-R4之间为PPP封装&#xff0c;chap认证&#xff0c;R2为主认证方 5.R1、R2、R3构建MGRE&#xff0c;仅R1的IP地址固定…

自动发推技巧解析:让你的推文营销更容易上热门

作为一家企业在推特上发帖的目的就是能让更多人看到&#xff0c;也就是被算法拾取&#xff0c;从而推荐给更多的人&#xff0c;那么就需要首先了解推特的算法是怎么样的&#xff0c;才能利用好它进行推特自动发推群发&#xff0c;这里推特群推王给大家剖析一二: 上热门指什么&a…

day43-Feedback Ui Design(反馈ui设计)

50 天学习 50 个项目 - HTMLCSS and JavaScript day43-Feedback Ui Design&#xff08;反馈ui设计&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&q…

数据库分库分表备份

#!/bin/sh #调用系统函数库 . /etc/init.d/functions #Define variables BACKUPDIR/backup/sort/ MYSQLUSERroot MYSQLPASSWDRedHat123 MYSQLCMD"mysql -u$MYSQLUSER -p$MYSQLPASSWD" MYSQLDUMP"mysqldump -u$MYSQLUSER -p$MYSQLPASSWD -x -F -R" DATABASE…

ORB-SLAM3 单目运行EuRoC数据集

使用ORB-SLAM3运行EuRoC数据集&#xff0c;EuRoC数据集是无人家拍摄的&#xff0c;比较精确。 数据集测试 1&#xff09;从官网下载Euroc数据集&#xff0c;ASL格式&#xff0c;http://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasets &#xff08;2…

xrdp登录显示白屏且红色叉

如上图所示&#xff0c;xrdp登录出现了红色叉加白屏&#xff0c;这是因为不正常关闭导致&#xff0c;解决方法其实挺简单的 #进入/usr/tmp cd /usr/tmp #删除对应用户的kdecache-** 文件&#xff08;我这里使用的是kde桌面&#xff09;&#xff0c;例如删除ywj用户对应的文件 …