这周开始又转回了熟悉而又陌生的Unity开发,一年前从Unity转向cocos2dx,这一年里有不少曲折,也有不少的心酸,或许是因为“心”未定,又或许因为其他,有种使不上劲的感觉,曾经的傲气逐渐的被“驱散”,习惯了被训斥和教育。面的各种形形色色的技术,总是经不住诱惑,都想学习一遍,但又无奈精力有限,加上工作的压力,每天都搞的身心疲惫,总之这一年里对自己的评价用“失望”两个字来形容!但从这周开始又重回Unity开发,心里有一丝喜感,或许真的对它期待已久!昨晚看着游戏蛮牛上一些老大们写的关于Unity的技术分享的文章,直到一点还依然没有睡意,深深的陶醉了,迫于第二天要工作的压力才不得不依依不舍的关闭电脑睡觉。接到先前公司的老板的一个需求,他们用Unity做的应用软件,有一个需求:用二维码作为应用激活密钥,一个二维码能激活五台设备,当激活设备数目大于5该密钥失效。鉴于之前老板先前待我还可以,就当还个人情,帮他完成该需求。先前做过Unity的扫码的客户端,也有记录过相关文章(http://blog.csdn.net/dingxiaowei2013/article/details/25086835)。这里就简单记录一下开发流程。

一、数据库表的设计

canbeuse bool值标记该二维码密钥是否失效,当然我下面T-SQL写的逻辑是当该密钥失效直接删除该密钥信息,所以该字段就没多大意义,以备有需要时使用!

二、存储过程(T-SQL)设计

-------------------校验qrcode是否可用存储过程----------------------------------
alter PROCEDURE searchproc
@qrcodetext nvarchar(50),
@result bit output
AS
begin
declare @count int, @selectrows int
select * from dbo.QRCodeTB where qrcodetext = @qrcodetext;
set @selectrows = @@ROWCOUNT
if @selectrows > 0begin select @count = cast(usednum as int) from dbo.QRCodeTB where qrcodetext = @qrcodetext;if @count < 5 beginset @count = @count + 1update dbo.QRCodeTB set usednum = @count where qrcodetext = @qrcodetextset @result = 1endelsebegin--update dbo.QRCodeTB set canbeuse = 0 where qrcodetext = @qrcodetextdelete from dbo.QRCodeTB where qrcodetext = @qrcodetextset @result=0endend
elsebeginset @result = 0end
end
GO
-----------------------------执行验证-------------------------------------
declare @result bit
exec searchproc 'ED81D6FF-86A3-49C1-BF40-1A05521803DC',@result output;
select @resultselect * from dbo.QRCodeTB--------------------------------添加记录存储过程--------------------
alter PROCEDURE insertoneinfoproc
@num int,
@count int output
AS
begin
while @num > 0begininsert into dbo.QRCodeTB(qrcodetext,canbeuse,usednum) values(NEWID(),1,0)set @num = @num - 1endset @count = @@ROWCOUNT
end
go
declare @count int
exec insertoneinfoproc 1,@count output ;
select @count;
select * from dbo.QRCodeTB-------------------------添加数据--------------------------------------------------
insert into dbo.QRCodeTB(qrcodetext,canbeuse,usednum) values(NEWID(),1,0)
-------------------------查询数据------------------------------------------
select * from dbo.QRCodeTB
-------------------------清空数据表--------------------------------------
Truncate Table dbo.QRCodeTB

存储过程执行结果:

连续运行五次之后:


显示该密钥不可使用。貌似之前都一直没尝试过写T-QSL,这也算我第一次尝试写这么长的sql,在大神眼里这太小菜了哈!

web端设计

web采用的是.net一般处理程序

1.webconfig数据库信息配置

2.简单的sqlhelper类

using System.Configuration;
using System.Data;
using System.Data.SqlClient;namespace SQLHelper
{class SQLHelper{private static readonly string connectstr = ConfigurationManager.ConnectionStrings["SqlConnStr"].ConnectionString;public static SqlConnection CreateConnection(){SqlConnection conn = new SqlConnection(connectstr);conn.Open();return conn;}public static int ExecuteNonQuery(SqlConnection conn, string sql, params SqlParameter[] parameters){using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);return cmd.ExecuteNonQuery();}}public static int ExecuteNonQuery(string sql,params SqlParameter[] parameters){using (SqlConnection conn = CreateConnection()){using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);return cmd.ExecuteNonQuery();}}}public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] parameters){using (SqlConnection conn = CreateConnection()){using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.CommandType = type;cmd.Parameters.AddRange(parameters);return cmd.ExecuteNonQuery();}}}/// <summary>/// 执行带输入输出参数的存储过程/// </summary>/// <returns></returns>public static string ExecuteNonQuery(string procname,  int outputindex, params SqlParameter[] parameters){using (SqlConnection conn = CreateConnection()){using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = procname;cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.AddRange(parameters);int executeEffectNum = cmd.ExecuteNonQuery();return parameters[outputindex].Value.ToString(); //返回第一个输出参数}}}public static object ExecuteScalar(SqlConnection conn, string sql, params SqlParameter[] parameters){using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);return cmd.ExecuteScalar();}}public static object ExecuteScalar(string sql, params SqlParameter[] parameters){using (SqlConnection conn = CreateConnection()){return ExecuteScalar(conn, sql, parameters);}}public static DataTable ExecuteQuery(SqlConnection conn, string sql, params SqlParameter[] parameters){DataTable table = new DataTable();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);using (SqlDataReader reader = cmd.ExecuteReader()){table.Load(reader);}return table;}}public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters){using (SqlConnection conn = CreateConnection()){return ExecuteQuery(conn, sql, parameters);}}}
}

3.二维码生成

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SQLHelper;
using System.Data;
using System.Data.SqlClient;
using ThoughtWorks.QRCode.Codec;
using System.IO;
using System.Text;namespace WebApplication
{public partial class CreateQRCode : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}/// <summary>/// 创建一个二维码密钥/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void CraeteQRCodeBtn_Click(object sender, EventArgs e){string path = Server.MapPath("~/images" + "//qrpngfile");string name = "QRCode";//创建文件夹Directory.CreateDirectory(path);string sql = "select top 1 qrcodetext from dbo.QRCodeTB";string qrcode = SQLHelper.SQLHelper.ExecuteScalar(sql).ToString();if (!string.IsNullOrEmpty(qrcode) && !createImage(qrcode, path, name)){Label1.Text = name + "已经存在";}}/// <summary>/// 向数据库添加一条二维码记录/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void CreateUIDBtn_Click(object sender, EventArgs e){int num = 1;SqlParameter[] paras ={  new SqlParameter("@num",SqlDbType.Int,1){Value=1},   new SqlParameter("@count", SqlDbType.Int),};paras[1].Direction = ParameterDirection.Output;this.Label1.Text = "开始执行";int rowseffect = SQLHelper.SQLHelper.ExecuteNonQuery("insertoneinfoproc", CommandType.StoredProcedure, paras);if (rowseffect > 0)this.Label1.Text = "插入成功";elsethis.Label1.Text = "插入失败";}#region 生成二维码/// <summary>/// 生成二维码/// </summary>/// <param name="path">地址</param>/// <param name="name">图片名称</param>/// <returns>bool</returns>public bool createImage(string value, string path, string name){QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();//设置背景颜色//qrCodeEncoder.QRCodeBackgroundColor = Color.FromArgb(255, 255, 0);//设置前景色//qrCodeEncoder.QRCodeForegroundColor = Color.GreenYellow;//编码格式qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置每个二维码像素点的大小qrCodeEncoder.QRCodeScale = 4;//QR码版本//QR码所允许规格系列为21×21模块(版本1)~177×177模块(版本40)qrCodeEncoder.QRCodeVersion = 8;//纠错等级//level L : 最大 7% 的错误能够被纠正; //level M : 最大 15% 的错误能够被纠正;  //level Q : 最大 25% 的错误能够被纠正;  //level H : 最大 30% 的错误能够被纠正;qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//自定义的二维码数据String data = value;//Response.Write(data);//画图System.Drawing.Bitmap image = qrCodeEncoder.Encode(data);System.IO.MemoryStream MStream = new System.IO.MemoryStream();image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);//Response.ClearContent();Response.ContentType = "image/Png";//写图片到页面Response.BinaryWrite(MStream.ToArray());path = path + "\\" + name + ".png";if (!File.Exists(path)){FileStream fs = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite);BinaryWriter bw = new BinaryWriter(fs, UTF8Encoding.UTF8);byte[] by = MStream.ToArray();for (int i = 0; i < MStream.ToArray().Length; i++)bw.Write(by[i]);fs.Close();return true;}elsereturn false;}#endregion}
}

4.二维码验证

这里采用的是get请求方式,方便测试,安全起见最好用post请求

using System.Data;
using System.Data.SqlClient;
using System.Web;namespace WebApplication
{/// <summary>/// CheckCode 的摘要说明/// </summary>public class CheckCode : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/plain";//context.Request.Form["codetext"];//poststring codetext = context.Request.QueryString["codetext"];  //getif (codetext != null){SqlParameter[] parameters = {new SqlParameter("@qrcodetext", SqlDbType.NVarChar,50),new SqlParameter("@result", SqlDbType.Bit),};parameters[0].Value = codetext;parameters[1].Direction = ParameterDirection.Output;int outputindex = 1;string resNum = SQLHelper.SQLHelper.ExecuteNonQuery("searchproc", outputindex, parameters);context.Response.Write(resNum);}else{context.Response.Write("没有输入二维码信息");}}public bool IsReusable{get{return false;}}}
}

web验证

创建密钥二维码:
点击生成密钥二维码
服务器端密钥验证:

当密钥使用五次之后,返回给客户端的是false结果,也就是密钥已失效,同事服务器做的就是从数据库表中删除带密钥信息!

关于Unity扫码客户端的就不记录了,之前有过相关记载,就主要用到www提交表单,还有扫码插件制作(请看下面相关连接有记载),其他就没啥了。天色已晚,承诺某人今天早点睡的,貌似又食言了,sorry!貌似这两周都睡的比较晚,明天周末了,好好补一觉!

相关连接:

C#/.NET存储过程:http://www.cnblogs.com/clhed/articles/1269415.html

扫描二维码客户端:http://blog.csdn.net/dingxiaowei2013/article/details/25086835

Unity跟服务器交互(表单提交):http://blog.csdn.net/dingxiaowei2013/article/details/17115489

Unity客户端效果:

==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:375151422         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================

二维码作激活码(密钥)功能开发相关推荐

  1. 陪玩源码,根据用户需求和功能开发搭建

    根据用户需求确定开发功能 陪玩源码的开发会涉及到很多功能模块,根据市场定位和用户需求的不同,功能模块的开发自然也是不同的,其中像游戏约单.多人语音聊天室等功能是比较受现代年轻人喜爱的,在开发时就可以着 ...

  2. 让离线程序也需要输入校验码(激活码)才可使用(python实现)

    我遇到个需求:需要给离线程序加一道锁,防门外汉的那种.因为离线程序遇到高手,肯定是会被破解的.像IntelliJ全家桶这样超大型软件,都无法防止用户的暴力破解.何况我这小打小闹的玩意.所以,目的就是防 ...

  3. 二维数组作数据源填充到repeater

    上效果图 前台代码: <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate&g ...

  4. 语音朗读html的源码,网页中文本朗读功能开发实现分享

    网页中文本朗读功能开发实现分享 前几天完成了一个需求,在网页中完成鼠标指向哪里,就用语音读出所指的文本.如果是按钮.链接.文本输入框,则还还要给出是什么的提醒.同时针对大段的文本,不能整段的去读,要按 ...

  5. E3000Y影像二维扫描枪(配YoKo引擎开发板)的串口调试

    实现E3000Y影像二维扫描枪串口调试 概述 一.E3000Y影像二维扫描枪 二.YoKo引擎开发板 三.E3000Y识读引擎 四.串口调试控制方式步骤 1.模块安装步骤 2.串口调试步骤 3.扫描二 ...

  6. 视频直播源码中主播印象功能开发

    1.在视频直播源码中当用户或主播点击添加印象后进入主播印象界面,首先根据上个页面传值判断自己是否是主播,然后显示不同的标题 mineL = [[UILabel alloc]initWithFrame: ...

  7. 二维码:未来会真正流行起来吗?

    2019独角兽企业重金招聘Python工程师标准>>> 条形码的出现,改变了世界的物流.零售等行业.作为这一技术的进化,二维码的地位却稍显尴尬.它会真正流行起来吗? 二维码忽然又&q ...

  8. 活码二维码免费平台有哪些呢?

    活码二维码又叫动态二维码,动态二维码是将用户的数据都存放在公有云上,而运营云服务需要一定维护成本,目前市面上绝大多数的动态二维码品牌都需要付费的. 二维彩虹二维码生成器可以制作动态二维码和静态二维码两 ...

  9. Java自定义生成二维码(兼容你所有的需求)

    1.概述 作为Java开发人员,说到生成二维码就会想到zxing开源二维码图像处理库,不可否认的是zxing确实很强大,但是实际需求中会遇到各种各样的需求是zxing满足不了的,于是就有了想法自己扩展 ...

最新文章

  1. 疯狂的消化之旅|消化系统简介
  2. 第三届福建省大学生智能车竞赛
  3. Android异步处理三:Handler+Looper+MessageQueue深入详解
  4. python把矩阵存为文件_python 读取文件并把矩阵转成numpy的两种方法
  5. 学会阅读Java字节码
  6. Nginx PHP支持
  7. 再也不学AJAX了!(二)使用AJAX
  8. Flask-SQLAlchemy的基本使用
  9. 5G常见缩略语大全!
  10. 创建好centos7虚拟机之后连xshell连不上虚机
  11. Pycharm 字体大小及背景颜色的设置
  12. 高性能JavaScript-JS脚本加载与执行对性能的影响
  13. C#解析单层html的中的文本,然后拼接起来
  14. ImageMagick 安装 window10与错误总结
  15. STM32_GPIO口
  16. python3 模拟键盘_python3 模拟鼠标和键盘操作
  17. .md文件简单的转化为pdf文件
  18. EXECL日期相减计算工龄
  19. oracle apex 日志,Oracle Apex 调试技巧
  20. 我有一个梦想,希望每一位提到算法的人,不再立即紧皱眉头

热门文章

  1. CoEEB 2023
  2. 计算机硬盘数据线功能,电脑的硬盘如何接线?(电脑硬盘数据线)
  3. 【 Ubuntu20.04 下载搜狗输入法 — 附搜狗官方安装操作指南】
  4. 测试32:chemistry
  5. 名编辑电子杂志大师教程 | 添加功能按钮
  6. 蓝牙耳机-------------蓝牙音频延迟全解析
  7. 将视频转成jpg图片
  8. 微信小程序日记、微信小程序个人空间、个人日记
  9. Axure RP Pro 6.5 Axure RP Pro 7.0注册码
  10. UESTC 1599 wtmsb【优先队列+排序】