C#生成二维码及序列号持久化实例_c#二维码登录
using System;
using System.IO;
using System.Windows.Forms;
using QRCoder;
namespace QrCodeGenerator
{
[Serializable]
public class QrData
{
public int Year { get; set; }
public int SerialNumber { get; set; }
}
public partial class MainForm : Form
{
private QrData qrData;
private const string DataFilePath = "qr_data.bin";
public MainForm()
{
InitializeComponent();
InitializeControls();
LoadQrData();
UpdateQrCode();
}
private void InitializeControls()
{
// 按钮设置
generateButton.Text = "生成二维码";
generateButton.Dock = DockStyle.Bottom;
generateButton.Click += GenerateButton_Click;
// 二维码显示区域
qrPictureBox.SizeMode = PictureBoxSizeMode.Zoom;
qrPictureBox.Dock = DockStyle.Fill;
// 数据标签
qrLabel.Dock = DockStyle.Top;
qrLabel.TextAlign = ContentAlignment.MiddleCenter;
qrLabel.Font = new Font("Arial", 12, FontStyle.Bold);
// 布局容器
var container = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.TopDown,
AutoScroll = true
};
container.Controls.Add(qrLabel);
container.Controls.Add(qrPictureBox);
container.Controls.Add(generateButton);
Controls.Add(container);
}
private void LoadQrData()
{
if (File.Exists(DataFilePath))
{
using (FileStream fs = new FileStream(DataFilePath, FileMode.Open))
{
var formatter = new BinaryFormatter();
qrData = (QrData)formatter.Deserialize(fs);
}
}
else
{
qrData = new QrData
{
Year = DateTime.Now.Year % 100,
SerialNumber = 0
};
}
}
private void SaveQrData()
{
using (FileStream fs = new FileStream(DataFilePath, FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(fs, qrData);
}
}
private void GenerateButton_Click(object sender, EventArgs e)
{
// 流水号递增处理
qrData.SerialNumber++;
if (qrData.SerialNumber > 999999)
{
qrData.Year++;
qrData.SerialNumber = 0;
}
// 生成新数据
string qrDataStr = #34;HZKSFPD{qrData.Year:D2}{qrData.SerialNumber:D6}";
qrPictureBox.Image = GenerateQrCode(qrDataStr);
qrLabel.Text = qrDataStr;
// 持久化数据
SaveQrData();
}
private Bitmap GenerateQrCode(string data)
{
var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
var qrCode = new QRCode(qrCodeData);
return qrCode.GetGraphic(20);
}
}
}
使用说明
1. 需要安装QRCoder NuGet包:Install-Package QRCoder
2. 窗体自动初始化包含:
顶部显示二维码数据的标签
中间显示二维码图片的图片框
底部生成按钮
3. 数据存储机制:
使用二进制文件持久化年份和流水号
自动处理年份进位(当流水号超过999999时)
4. 生成逻辑:
流水号始终保持6位数字(自动补零)
年份使用当前系统时间的后两位
生成的二维码数据格式严格符合要求
扩展建议:
1. 可添加数据验证机制防止非法输入
2. 可增加数据备份功能
3. 可添加配置文件支持自定义前缀
4. 可实现多线程生成避免界面卡顿
5. 可添加生成记录查询功能
该实现完全满足以下要求:
数据唯一性保障
自动增量机制
持久化存储
界面实时更新
二维码格式规范