feat: 文传易匿名临时文件传输站初始版本
- 后端 .NET 8 + FreeSql + 阿里云 OSS,支持共享/私密/标签三种文件模式 - 前端 Vue3 + Vite + TDesign,上传/取件/管理三页 - 取件码/二维码/海报合成(含保存二维码为图片) - deploy/ 部署文档与一键 FTP 发布脚本 - appsettings.json 含真实凭据,已 gitignore 不入库
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
using WenChuanyi.Api.Models;
|
||||
|
||||
namespace WenChuanyi.Api.Services;
|
||||
|
||||
/// <summary>取件码/管理码生成与查重(冲突自动重生成)</summary>
|
||||
public class CodeGeneratorService
|
||||
{
|
||||
// 排除易混淆 0/O/1/I/l
|
||||
private const string AdminChars = "ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";
|
||||
|
||||
private readonly IFreeSql _fsql;
|
||||
|
||||
public CodeGeneratorService(IFreeSql fsql) => _fsql = fsql;
|
||||
|
||||
/// <summary>生成 length 位纯数字取件码(全局唯一)</summary>
|
||||
public async Task<string> GeneratePickCodeAsync(int length)
|
||||
{
|
||||
for (var i = 0; i < 30; i++)
|
||||
{
|
||||
var code = GenerateDigits(length);
|
||||
var exists = await _fsql.Select<FileItem>().Where(f => f.PickCode == code).AnyAsync();
|
||||
if (!exists)
|
||||
{
|
||||
return code;
|
||||
}
|
||||
}
|
||||
throw new InvalidOperationException("取件码生成冲突次数过多,请重试");
|
||||
}
|
||||
|
||||
/// <summary>生成 8 位字母数字管理码(全局唯一)</summary>
|
||||
public async Task<string> GenerateAdminCodeAsync()
|
||||
{
|
||||
for (var i = 0; i < 30; i++)
|
||||
{
|
||||
var code = new string(Enumerable.Range(0, 8)
|
||||
.Select(_ => AdminChars[Random.Shared.Next(AdminChars.Length)]).ToArray());
|
||||
var exists = await _fsql.Select<FileItem>().Where(f => f.AdminCode == code).AnyAsync();
|
||||
if (!exists)
|
||||
{
|
||||
return code;
|
||||
}
|
||||
}
|
||||
throw new InvalidOperationException("管理码生成冲突次数过多,请重试");
|
||||
}
|
||||
|
||||
private static string GenerateDigits(int length)
|
||||
{
|
||||
var first = Random.Shared.Next(1, 10); // 首位非 0
|
||||
var sb = new System.Text.StringBuilder();
|
||||
sb.Append(first);
|
||||
for (var i = 1; i < length; i++)
|
||||
{
|
||||
sb.Append(Random.Shared.Next(0, 10));
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user