This commit is contained in:
zpc 2025-08-01 13:57:31 +08:00
parent 2bb4f8f362
commit bbc74af9a2
45 changed files with 1763 additions and 25 deletions

View File

@ -18,6 +18,10 @@ namespace Infrastructure.Attribute
/// </summary>
public bool IsSaveResponseData { get; set; } = true;
/// <summary>
/// 内容
/// </summary>
public string MessageKey { get; set; }
public LogAttribute() { }
public LogAttribute(string name)

View File

@ -0,0 +1,47 @@
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using System.Text;
using System.Threading.Tasks;
namespace ZR.Infrastructure.Helper;
public static class LogMessageRegistry
{
public static readonly Dictionary<string, Func<ResultExecutedContext, string>> Templates
= new Dictionary<string, Func<ResultExecutedContext, string>>
{
["giftclaim:status"] = ctx =>
{
if (ctx.HttpContext.Request.Query.TryGetValue("id", out var idStr) &&
ctx.HttpContext.Request.Query.TryGetValue("status", out var statusStr))
{
var id = int.Parse(idStr);
int status = int.Parse(statusStr);
if (id > 0)
{
return $"礼品审核状态修改礼品兑换ID{id},修改时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},修改状态为:{(status == 1 ? "" : "")}";
}
}
return "";
}
};
/// <summary>
/// 获取日志消息模板
/// </summary>
/// <param name="key"></param>
/// <param name="client"></param>
/// <returns></returns>
public static string GetMessage(string key, ResultExecutedContext client)
{
if (!Templates.TryGetValue(key, out var func))
{
return "";
}
return func(client);
}
}

View File

@ -16,11 +16,11 @@ namespace Infrastructure
Console.WriteLine(content);
Console.ForegroundColor = ConsoleColor.Blue;
//Console.WriteLine("🎉源码地址: https://gitee.com/izory/ZrAdminNetCore");
Console.WriteLine("📖官方文档http://www.izhaorui.cn");
Console.WriteLine("💰打赏作者http://www.izhaorui.cn/vip");
Console.WriteLine("📱移动端体验http://demo.izhaorui.cn/h5");
Console.WriteLine($"Swagger地址{url}/swagger/index.html");
Console.WriteLine($"初始化种子数据地址:{url}/common/InitSeedData");
//Console.WriteLine("📖官方文档http://www.izhaorui.cn");
//Console.WriteLine("💰打赏作者http://www.izhaorui.cn/vip");
//Console.WriteLine("📱移动端体验http://demo.izhaorui.cn/h5");
//Console.WriteLine($"Swagger地址{url}/swagger/index.html");
//Console.WriteLine($"初始化种子数据地址:{url}/common/InitSeedData");
}
}
}

View File

@ -0,0 +1,154 @@
using Microsoft.AspNetCore.Mvc;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
using System.Threading.Tasks;
//创建时间2025-07-30
namespace ZR.Admin.WebApi.Controllers.Business
{
/// <summary>
/// 礼品申领表
/// </summary>
[Route("business/GiftClaim")]
public class GiftClaimController : BaseController
{
/// <summary>
/// 礼品申领表接口
/// </summary>
private readonly IGiftClaimService _GiftClaimService;
public GiftClaimController(IGiftClaimService GiftClaimService)
{
_GiftClaimService = GiftClaimService;
}
/// <summary>
/// 查询礼品申领表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "giftclaim:list")]
public IActionResult QueryGiftClaim([FromQuery] GiftClaimQueryDto parm)
{
var response = _GiftClaimService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询礼品申领表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("statistics")]
public IActionResult getGiftClaimStatistics()
{
var nowDate = DateTime.Now.Date;
var nowCount = _GiftClaimService.AsQueryable().Count();
var shenheCount = _GiftClaimService.AsQueryable().Where(it => it.Status == 0).Count();
var shenheCount1 = _GiftClaimService.AsQueryable().Where(it => it.Status == 1).Count();
var shenheCount2 = _GiftClaimService.AsQueryable().Where(it => it.Status == 2).Count();
return SUCCESS(new { nowCount, shenheCount, shenheCount1, shenheCount2 });
}
/// <summary>
/// 查询礼品申领表详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "giftclaim:query")]
public IActionResult GetGiftClaim(int Id)
{
var response = _GiftClaimService.GetInfo(Id);
var info = response.Adapt<GiftClaimDto>();
return SUCCESS(info);
}
/// <summary>
/// 添加礼品申领表
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "giftclaim:add")]
[Log(Title = "礼品申领记录", BusinessType = BusinessType.INSERT)]
public IActionResult AddGiftClaim([FromBody] GiftClaimDto parm)
{
var modal = parm.Adapt<GiftClaim>().ToCreate(HttpContext);
var response = _GiftClaimService.AddGiftClaim(modal);
return SUCCESS(response);
}
/// <summary>
/// 更新礼品申领表
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "giftclaim:edit")]
[Log(Title = "礼品申领记录", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateGiftClaim([FromBody] GiftClaimDto parm)
{
var modal = parm.Adapt<GiftClaim>().ToUpdate(HttpContext);
var response = _GiftClaimService.UpdateGiftClaim(modal);
return ToResponse(response);
}
/// <summary>
/// 更新礼品申领表
/// </summary>
/// <returns></returns>
[HttpPost("editStatus")]
[ActionPermissionFilter(Permission = "giftclaim:editStatus")]
[Log(Title = "礼品申领记录", BusinessType = BusinessType.UPDATE, MessageKey = "giftclaim:status")]
public async Task<IActionResult> UpdateGiftClaimStatus([FromQuery] int id, [FromQuery] int status)
{
var model = await _GiftClaimService.AsQueryable().FirstAsync(it => it.Id == id);
if (model == null)
{
return ToResponse(ResultCode.FAIL, "礼品申领数据不存在");
}
model.Status = status;
model.ReviewAt = DateTime.Now;
var response = await _GiftClaimService.UpdateAsync(model);
return ToResponse(new ApiResult(response ? 200 : 500, ""));
}
/// <summary>
/// 删除礼品申领表
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "giftclaim:delete")]
[Log(Title = "礼品申领表", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteGiftClaim([FromRoute] string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
return ToResponse(_GiftClaimService.Delete(idArr));
}
/// <summary>
/// 导出礼品申领表
/// </summary>
/// <returns></returns>
[Log(Title = "礼品申领记录", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "giftclaim:export")]
public IActionResult Export([FromQuery] GiftClaimQueryDto parm)
{
var list = _GiftClaimService.ExportList(parm).Result;
if (list == null || list.Count <= 0)
{
return ToResponse(ResultCode.FAIL, "没有要导出的数据");
}
var result = ExportExcelMini(list, "礼品申领记录", "礼品申领记录");
return ExportExcel(result.Item2, result.Item1);
}
}
}

View File

@ -0,0 +1,116 @@
using Microsoft.AspNetCore.Mvc;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
using ZR.Service.Business;
//创建时间2025-07-30
namespace ZR.Admin.WebApi.Controllers.Business
{
/// <summary>
/// 礼品小程序
/// </summary>
[Route("business/GiftConfig")]
public class GiftConfigController : BaseController
{
/// <summary>
/// 礼品小程序接口
/// </summary>
private readonly IGiftConfigService _GiftConfigService;
public GiftConfigController(IGiftConfigService GiftConfigService)
{
_GiftConfigService = GiftConfigService;
}
/// <summary>
/// 查询礼品小程序列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "giftconfig:list")]
public IActionResult QueryGiftConfig([FromQuery] GiftConfigQueryDto parm)
{
var response = _GiftConfigService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询礼品小程序详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "giftconfig:query")]
public IActionResult GetGiftConfig(int? Id)
{
var t = _GiftConfigService.Count(it => true);
GiftConfigDto info = new GiftConfigDto();
if (t > 0)
{
var response = _GiftConfigService.GetFirst(it => true);
info = response.Adapt<GiftConfigDto>();
}
else
{
var tt = _GiftConfigService.AddGiftConfig(new GiftConfig()
{
HomeImage = "",
Extend = "",
Extend1 = "",
});
info = tt.Adapt<GiftConfigDto>();
}
return SUCCESS(info);
}
/// <summary>
/// 添加礼品小程序
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "giftconfig:add")]
[Log(Title = "礼品小程序", BusinessType = BusinessType.INSERT)]
public IActionResult AddGiftConfig([FromBody] GiftConfigDto parm)
{
var modal = parm.Adapt<GiftConfig>().ToCreate(HttpContext);
var response = _GiftConfigService.AddGiftConfig(modal);
return SUCCESS(response);
}
/// <summary>
/// 更新礼品小程序
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "giftconfig:edit")]
[Log(Title = "礼品小程序", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateGiftConfig([FromBody] GiftConfigDto parm)
{
var modal = parm.Adapt<GiftConfig>().ToUpdate(HttpContext);
var response = _GiftConfigService.UpdateGiftConfig(modal);
return ToResponse(response);
}
/// <summary>
/// 删除礼品小程序
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "giftconfig:delete")]
[Log(Title = "礼品小程序", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteGiftConfig([FromRoute] string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
return ToResponse(_GiftConfigService.Delete(idArr, "删除礼品小程序"));
}
}
}

View File

@ -0,0 +1,121 @@
using Microsoft.AspNetCore.Mvc;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
//创建时间2025-07-30
namespace ZR.Admin.WebApi.Controllers.Business
{
/// <summary>
/// 微信用户表
/// </summary>
[Route("business/GiftUser")]
public class GiftUserController : BaseController
{
/// <summary>
/// 微信用户表接口
/// </summary>
private readonly IGiftUserService _GiftUserService;
public GiftUserController(IGiftUserService GiftUserService)
{
_GiftUserService = GiftUserService;
}
/// <summary>
/// 查询微信用户表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "giftuser:list")]
public IActionResult QueryGiftUser([FromQuery] GiftUserQueryDto parm)
{
var response = _GiftUserService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询微信用户表详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "giftuser:query")]
public IActionResult GetGiftUser(int Id)
{
var response = _GiftUserService.GetInfo(Id);
var info = response.Adapt<GiftUserDto>();
return SUCCESS(info);
}
/// <summary>
/// 添加微信用户表
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "giftuser:add")]
[Log(Title = "微信用户表", BusinessType = BusinessType.INSERT)]
public IActionResult AddGiftUser([FromBody] GiftUserDto parm)
{
parm.CreateTime= DateTime.Now;
parm.UpdateTime= DateTime.Now;
var modal = parm.Adapt<GiftUser>().ToCreate(HttpContext);
var response = _GiftUserService.AddGiftUser(modal);
return SUCCESS(response);
}
/// <summary>
/// 更新微信用户表
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "giftuser:edit")]
[Log(Title = "微信用户表", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateGiftUser([FromBody] GiftUserDto parm)
{
parm.UpdateTime = DateTime.Now;
var modal = parm.Adapt<GiftUser>().ToUpdate(HttpContext);
var response = _GiftUserService.UpdateGiftUser(modal);
return ToResponse(response);
}
/// <summary>
/// 删除微信用户表
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "giftuser:delete")]
[Log(Title = "微信用户表", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteGiftUser([FromRoute]string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
return ToResponse(_GiftUserService.Delete(idArr));
}
/// <summary>
/// 导出微信用户表
/// </summary>
/// <returns></returns>
[Log(Title = "微信用户表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "giftuser:export")]
public IActionResult Export([FromQuery] GiftUserQueryDto parm)
{
var list = _GiftUserService.ExportList(parm).Result;
if (list == null || list.Count <= 0)
{
return ToResponse(ResultCode.FAIL, "没有要导出的数据");
}
var result = ExportExcelMini(list, "微信用户表", "微信用户表");
return ExportExcel(result.Item2, result.Item1);
}
}
}

View File

@ -1,10 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using MiniExcelLibs;
using ZR.Infrastructure.IPTools;
using ZR.Model.Dto;
using ZR.Model.System;
using ZR.Service.Business.IBusinessService;
using ZR.ServiceCore.Resources;
namespace ZR.Admin.WebApi.Controllers
@ -22,7 +25,10 @@ namespace ZR.Admin.WebApi.Controllers
private IWebHostEnvironment WebHostEnvironment;
private ISysFileService SysFileService;
private readonly IStringLocalizer<SharedResource> _localizer;
/// <summary>
/// 礼品小程序接口
/// </summary>
private readonly IGiftConfigService _GiftConfigService;
/// <summary>
///
/// </summary>
@ -34,12 +40,14 @@ namespace ZR.Admin.WebApi.Controllers
IStringLocalizer<SharedResource> stringLocalizer,
IOptions<OptionsSetting> options,
IWebHostEnvironment webHostEnvironment,
ISysFileService fileService)
ISysFileService fileService,
IGiftConfigService GiftConfigService)
{
WebHostEnvironment = webHostEnvironment;
SysFileService = fileService;
OptionsSetting = options.Value;
_localizer = stringLocalizer;
_GiftConfigService = GiftConfigService;
}
/// <summary>
@ -56,6 +64,19 @@ namespace ZR.Admin.WebApi.Controllers
"如果觉得项目有用,打赏作者喝杯咖啡作为奖励\n☛☛http://www.izhaorui.cn/vip\n");
}
/// <summary>
/// home
/// </summary>
/// <returns></returns>
[Route("/config")]
[HttpGet]
[AllowAnonymous]
public async Task<object> GetConfig()
{
var response = _GiftConfigService.GetFirst(it => true);
return new { home = (response?.HomeImage ?? "") };
}
/// <summary>
/// 查询IP信息
/// </summary>
@ -98,7 +119,7 @@ namespace ZR.Admin.WebApi.Controllers
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "common")]
public async Task<IActionResult> UploadFile([FromForm] UploadDto uploadDto, IFormFile file, StoreType storeType = StoreType.LOCAL)
public async Task<IActionResult> UploadFile([FromForm] UploadDto uploadDto, IFormFile file, StoreType storeType = StoreType.ALIYUN)
{
if (file == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空");
SysFile sysfile = new();

View File

@ -0,0 +1,178 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using SKIT.FlurlHttpClient.Wechat.Api;
using System.Web;
using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
using ZR.Model.Business.Dto;
using Org.BouncyCastle.Utilities;
using System.Net;
namespace ZR.Admin.WebApi.Controllers
{
/// <summary>
/// webApi
/// </summary>
[Route("[controller]/[action]")]
[AllowAnonymous]
[ApiExplorerSettings(GroupName = "webapi")]
public class WebApiController : BaseController
{
private readonly WechatApiClient _client;
/// <summary>
/// 礼品申领表接口
/// </summary>
private readonly IGiftClaimService _GiftClaimService;
/// <summary>
/// 微信用户表接口
/// </summary>
private readonly IGiftUserService _GiftUserService;
public WebApiController(WechatApiClient client, IGiftUserService GiftUserService, IGiftClaimService giftClaimService)
{
_client = client;
_GiftUserService = GiftUserService;
_GiftClaimService = giftClaimService;
}
/// <summary>
/// 1
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost()]
[Route("/userLogin")]
[AllowAnonymous]
public async Task<IActionResult> GetOpenId([FromQuery] string code)
{
var response = await _client.ExecuteSnsJsCode2SessionAsync(new SnsJsCode2SessionRequest
{
JsCode = code,
GrantType = "authorization_code"
});
if (!response.IsSuccessful())
{
throw new Exception($"获取OpenId失败: {response.ErrorMessage}"); // 可以根据需要处理异常
}
var openId = response.OpenId;
var user = await _GiftUserService.AsQueryable().Where(it => it.Openid == openId).FirstAsync();
if (user == null)
{
user = new GiftUser()
{
AvatarUrl = "",
CreateTime = DateTime.Now,
Nickname = "微信用户",
Openid = openId,
UpdateTime = DateTime.Now,
LastLoginTime = DateTime.Now,
Phone = "",
Status = "0",
Unionid = ""
};
_GiftUserService.AddGiftUser(user);
}
return SUCCESS(new { user_id = user.Id });
}
[HttpGet("/getRecord")]
[AllowAnonymous]
public async Task<IActionResult> GetRecord([FromQuery] int userId)
{
if (userId == 0)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var user = await _GiftUserService.AsQueryable().Where(it => it.Id == userId).FirstAsync();
if (user == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var list = await _GiftClaimService.AsQueryable().Where(it => it.UserId == userId).OrderByDescending(it => it.Id).ToListAsync();
List<object> list1 = new List<object>();
list?.ForEach(it =>
{
list1.Add(new
{
it.Status,
it.Name,
it.Address,
it.Phone,
time = it.CreatedAt?.ToString("yyyy-MM-dd")
});
});
return SUCCESS(list1);
}
public static string domainUrl = AppSettings.GetConfig("ALIYUN_OSS:domainUrl");
[HttpPost()]
[Route("/addRecord")]
[AllowAnonymous]
public async Task<IActionResult> AddRecord([FromBody] AddGiftClaimDto giftClaim)
{
if (giftClaim.UserId == 0)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var user = await _GiftUserService.AsQueryable().Where(it => it.Id == giftClaim.UserId).FirstAsync();
if (user == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var images = ImageConverter.Base64ToImageBytes(giftClaim.ProductImage);
if (images.Length == 0)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "图片上传失败");
}
var imageprx = ImageConverter.GetFileExtensionFromBase64(giftClaim.ProductImage);
var imageName = ImageConverter.GenerateImageFileName(imageprx);
var filePath = "gift/" + DateTime.Now.ToString("yyyy/MMdd/");
//备份一下本地
var finalPath = filePath + imageName;
if (!string.IsNullOrEmpty(domainUrl))
{
var statusCode = AliyunOssHelper.PutObjectFromFile(new MemoryStream(images), finalPath, "");
}
try
{
var path = Path.GetFullPath(filePath);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
using (var stream = new FileStream(finalPath, FileMode.Create))
{
await stream.WriteAsync(images, 0, images.Length);
}
}
catch (Exception ex)
{
}
if (!string.IsNullOrEmpty(domainUrl))
{
finalPath = domainUrl + "/" + finalPath;
}
GiftClaim giftClaim1 = new GiftClaim()
{
Address = giftClaim.Address,
Name = giftClaim.Name,
Phone = giftClaim.Phone,
UserId = giftClaim.UserId,
Status = 0,
Company = giftClaim.Company,
ProductModel = giftClaim.ProductModel,
ProductDate = giftClaim.ProductDate,
ProductSerialNumber = giftClaim.ProductSerialNumber,
CreatedAt = DateTime.Now,
ProductImage = finalPath,
UserWxOpenId= user.Openid
};
_GiftClaimService.AddGiftClaim(giftClaim1);
return SUCCESS(new { giftClaim1.Id });
}
}
}

View File

@ -1,6 +1,14 @@
using Microsoft.AspNetCore.Mvc;
using SKIT.FlurlHttpClient.Wechat.Api;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using System.Web;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
namespace ZR.Admin.WebApi.Controllers
{
/// <summary>
@ -10,6 +18,23 @@ namespace ZR.Admin.WebApi.Controllers
[AllowAnonymous]
public class WxOpenController : BaseController
{
private readonly WechatApiClient _client;
/// <summary>
/// 礼品申领表接口
/// </summary>
private readonly IGiftClaimService _GiftClaimService;
/// <summary>
/// 微信用户表接口
/// </summary>
private readonly IGiftUserService _GiftUserService;
public WxOpenController(WechatApiClient client, IGiftUserService GiftUserService, IGiftClaimService giftClaimService)
{
_client = client;
_GiftUserService = GiftUserService;
_GiftClaimService = giftClaimService;
}
/// <summary>
/// 获取签名
/// </summary>
@ -35,5 +60,69 @@ namespace ZR.Admin.WebApi.Controllers
return SUCCESS(new { appId, signature, noncestr, timestamp, url });
}
[HttpGet("login")]
[AllowAnonymous]
public async Task<IActionResult> GetOpenId([FromQuery] string code)
{
var response = await _client.ExecuteSnsJsCode2SessionAsync(new SnsJsCode2SessionRequest
{
JsCode = code,
GrantType = "authorization_code"
});
if (!response.IsSuccessful())
{
throw new Exception($"获取OpenId失败: {response.ErrorMessage}"); // 可以根据需要处理异常
}
var openId = response.OpenId;
var user = await _GiftUserService.AsQueryable().Where(it => it.Openid == openId).FirstAsync();
if (user == null)
{
//response.
user = new GiftUser()
{
AvatarUrl = "",
CreateTime = DateTime.Now,
Nickname = "微信用户",
Openid = openId,
UpdateTime = DateTime.Now,
LastLoginTime = DateTime.Now,
Phone = "",
Status = "0",
Unionid = ""
};
_GiftUserService.AddGiftUser(user);
}
return SUCCESS(new { user_id = user.Id });
}
[HttpGet("getRecord")]
[AllowAnonymous]
public async Task<IActionResult> GetRecord([FromQuery] int user_id)
{
if (user_id == 0)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var user = await _GiftUserService.AsQueryable().Where(it => it.Id == user_id).FirstAsync();
if (user == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "用户不存在");
}
var list = await _GiftClaimService.AsQueryable().Where(it => it.UserId == user_id).ToListAsync();
List<object> list1 = new List<object>();
list?.ForEach(it =>
{
list1.Add(new
{
it.Status,
it.Name,
it.Address,
it.Phone
});
});
return SUCCESS(list1);
}
}
}

View File

@ -13,6 +13,7 @@ using ZR.Infrastructure.WebExtensions;
using ZR.ServiceCore.Signalr;
using ZR.ServiceCore.SqlSugar;
using ZR.Mall;
using SKIT.FlurlHttpClient.Wechat.Api;
//using SQLitePCL;
var builder = WebApplication.CreateBuilder(args);
@ -50,6 +51,19 @@ builder.Services.AddJwt();
builder.Services.AddSingleton(new AppSettings(builder.Configuration));
//app服务注册
builder.Services.AddAppService();
var wxMp = builder.Configuration.GetSection("WxMp");
var mp_appid = wxMp.GetSection("AppID").Value ?? "";//默认值
var mp_appSecret = wxMp.GetSection("AppSecret").Value ?? "";//默认值
builder.Services.AddSingleton<WechatApiClient>(sp =>
{
return new WechatApiClient(new WechatApiClientOptions
{
AppId = mp_appid,
AppSecret = mp_appSecret
});
});
//开启计划任务
builder.Services.AddTaskSchedulers();
//请求大小限制

View File

@ -20,6 +20,7 @@
<ItemGroup>
<PackageReference Include="Lazy.Captcha.Core" Version="2.0.9" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.11.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.12" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.4.0" />
@ -27,6 +28,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\WebApi\" />
<Folder Include="Properties\PublishProfiles\" />
</ItemGroup>

View File

@ -25,7 +25,7 @@
// http://localhost:8888/common/initseedData
"CodeGenDbConfig": {
//{dbName}
"Conn": "Data Source=192.168.1.41;User ID=sa;Password=Dbt@com@123;Initial Catalog={dbName};",
"Conn": "Data Source=192.168.1.41;User ID=sa;Password=Dbt@com@123;Encrypt=True;TrustServerCertificate=True;Initial Catalog={dbName};",
"DbType": 1,
"IsAutoCloseConnection": true,
"DbName": "ZrAdmin" //,Oracle
@ -43,8 +43,8 @@
"MainDb": "0", // ID
"UseTenant": 0, // 0: 1:
"InjectClass": [ "ZR.Repository", "ZR.Service", "ZR.Tasks", "ZR.ServiceCore", "ZR.Mall" ], //
"ShowDbLog": true, //db
"InitDb": true, //db
"ShowDbLog": false, //db
"InitDb": false, //db
"DemoMode": false, //
"SingleLogin": false, ///
"workId": 1, //id
@ -58,11 +58,11 @@
},
//
"ALIYUN_OSS": {
"REGIONID": "", //egcn-hangzhou
"KEY": "XX",
"SECRET": "XX",
"bucketName": "bucketName",
"domainUrl": "http://xxx.xxx.com", //访
"REGIONID": "https://oss-cn-shanghai.aliyuncs.com", //egcn-hangzhou
"KEY": "LTAI5tAm5ZZf2HWXDSbpa2qZ",
"SECRET": "daMgmpVpxVC9R0u88O3gbHjHmytyCM",
"bucketName": "zpc-gift",
"domainUrl": "https://zpc-gift.oss-cn-shanghai.aliyuncs.com", //访
"maxSize": 100 // 100M
},
//
@ -77,6 +77,10 @@
"AppID": "",
"AppSecret": ""
},
"WxMp": {
"AppId": "wx595ec949c6efd72b", //AppId"
"AppSecret": "81202b95746795f429fda6a448548b60" //AppSecret
},
//
"MailOptions": [
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -747,6 +747,7 @@ $if(replaceDto.ShowBtnEdit)
// 修改按钮操作
function handleUpdate(row) {
reset()
state.submitLoading = false
const id = row.${replaceDto.FistLowerPk} || ids.value
get${genTable.BusinessName}(id).then((res) => {
const { code, data } = res

View File

@ -1,7 +1,7 @@
 ___________ _ _ _ _ ______ _______
|___ / __ \ /\ | | (_) | \ | | ____|__ __|
/ /| |__) | / \ __| |_ __ ___ _ _ __ | \| | |__ | |
/ / | _ / / /\ \ / _` | '_ ` _ \| | '_ \ | . ` | __| | |
/ /__| | \ \ / ____ \ (_| | | | | | | | | | |_| |\ | |____ | |
/_____|_| \_\/_/ \_\__,_|_| |_| |_|_|_| |_(_)_| \_|______| |_|
 _ _ _ _ ______ _______
/\ | | (_) | \ | | ____|__ __|
/ \ __| |_ __ ___ _ _ __ | \| | |__ | |
/ /\ \ / _` | '_ ` _ \| | '_ \ | . ` | __| | |
/ ____ \ (_| | | | | | | | | | |_| |\ | |____ | |
/_/ \_\__,_|_| |_| |_|_|_| |_(_)_| \_|______| |_|

View File

@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ZR.Common;
public static class ImageConverter
{
/// <summary>
/// 将 Base64 编码的字符串转换为图片的二进制数据byte[])。
/// </summary>
/// <param name="base64String">Base64 编码的字符串,格式可以包含前缀(如 data:image/png;base64,)或不包含</param>
/// <returns>图片的字节数组</returns>
public static byte[] Base64ToImageBytes(string base64String)
{
// 如果包含 data:image/...base64, 的前缀,去除它
var base64Data = base64String;
if (base64String.Contains(","))
{
base64Data = base64String.Substring(base64String.IndexOf(",") + 1);
}
// 将 base64 字符串转换为字节数组
return Convert.FromBase64String(base64Data);
}
/// <summary>
/// 将 Base64 转换成图片文件并保存到指定路径
/// </summary>
/// <param name="base64String">Base64 字符串</param>
/// <param name="outputPath">输出文件完整路径(包含文件名和扩展名)</param>
public static void SaveBase64AsImage(string base64String, string outputPath)
{
byte[] imageBytes = Base64ToImageBytes(base64String);
File.WriteAllBytes(outputPath, imageBytes);
}
/// <summary>
/// 从 Base64 字符串中提取文件扩展名。
/// </summary>
/// <param name="base64"></param>
/// <returns></returns>
public static string GetFileExtensionFromBase64(string base64)
{
// 正则匹配 MIME 类型
var match = Regex.Match(base64, @"^data:image/(?<format>[a-zA-Z+]+);base64,");
if (!match.Success) return null;
string mimeType = match.Groups["format"].Value.ToLower();
// MIME 类型转文件扩展名
return mimeType switch
{
"png" => ".png",
"jpeg" or "jpg" => ".jpg",
"gif" => ".gif",
"webp" => ".webp",
"bmp" => ".bmp",
"svg+xml" => ".svg",
"tiff" => ".tiff",
"x-icon" => ".ico",
_ => null // 未知类型
};
}
/// <summary>
/// 生成图片名称:时间戳(秒)+4位随机数字
/// 示例16907832451234.png
/// </summary>
/// <param name="extension">文件扩展名(例如 .png、.jpg可选默认值为 .png</param>
/// <returns>生成的图片文件名</returns>
public static string GenerateImageFileName(string extension = ".png")
{
// 获取当前时间戳(秒)
long timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// 生成 4 位随机数1000 - 9999
Random random = new Random();
int randomNumber = random.Next(1000, 10000);
// 拼接文件名
return $"{timestamp}_{randomNumber}{extension}";
}
}

View File

@ -8,6 +8,7 @@
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageReference Include="MailKit" Version="4.9.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.11.0" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1,156 @@
namespace ZR.Model.Business.Dto
{
/// <summary>
/// 礼品申领表查询对象
/// </summary>
public class GiftClaimQueryDto : PagerInfo
{
public string Name { get; set; }
public string Phone { get; set; }
public string Company { get; set; }
public string Address { get; set; }
public string ProductModel { get; set; }
public string ProductSerialNumber { get; set; }
public int? Status { get; set; }
public string UserWxOpenId { get; set; }
}
/// <summary>
/// 礼品申领表输入输出对象
/// </summary>
public class GiftClaimDto
{
[Required(ErrorMessage = "主键不能为空")]
[ExcelColumn(Name = "主键")]
[ExcelColumnName("主键")]
public int Id { get; set; }
[Required(ErrorMessage = "用户ID不能为空")]
[ExcelColumn(Name = "用户ID")]
[ExcelColumnName("用户ID")]
public int UserId { get; set; }
[Required(ErrorMessage = "姓名不能为空")]
[ExcelColumn(Name = "姓名")]
[ExcelColumnName("姓名")]
public string Name { get; set; }
[Required(ErrorMessage = "联系方式不能为空")]
[ExcelColumn(Name = "联系方式")]
[ExcelColumnName("联系方式")]
public string Phone { get; set; }
[ExcelColumn(Name = "工作单位")]
[ExcelColumnName("工作单位")]
public string Company { get; set; }
[Required(ErrorMessage = "收货地址不能为空")]
[ExcelColumn(Name = "收货地址")]
[ExcelColumnName("收货地址")]
public string Address { get; set; }
[Required(ErrorMessage = "产品型号不能为空")]
[ExcelColumn(Name = "产品型号")]
[ExcelColumnName("产品型号")]
public string ProductModel { get; set; }
[Required(ErrorMessage = "出品编号不能为空")]
[ExcelColumn(Name = "出品编号")]
[ExcelColumnName("出品编号")]
public string ProductSerialNumber { get; set; }
[Required(ErrorMessage = "出品年月不能为空")]
[ExcelColumn(Name = "出品年月")]
[ExcelColumnName("出品年月")]
public string ProductDate { get; set; }
[ExcelColumn(Name = "出品图片")]
[ExcelColumnName("出品图片")]
public string ProductImage { get; set; }
[ExcelColumn(Name = "提交时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("提交时间")]
public DateTime? CreatedAt { get; set; }
[Required(ErrorMessage = "审核状态不能为空")]
[ExcelColumn(Name = "审核状态")]
[ExcelColumnName("审核状态")]
public int Status { get; set; }
[ExcelColumn(Name = "审核状态")]
public string StatusLabel { get; set; }
/// <summary>
/// 审核时间
/// </summary>
[ExcelColumn(Name = "审核时间")]
[ExcelColumnName("审核时间")]
public DateTime? ReviewAt { get; set; }
/// <summary>
/// 微信用户id
/// </summary>
[ExcelColumn(Name = "微信用户id")]
[ExcelColumnName("微信用户id")]
public string UserWxOpenId { get; set; }
}
/// <summary>
/// 礼品申领表输入输出对象
/// </summary>
public class AddGiftClaimDto
{
[Required(ErrorMessage = "用户ID不能为空")]
[ExcelColumn(Name = "用户ID")]
[ExcelColumnName("用户ID")]
public int UserId { get; set; }
[Required(ErrorMessage = "姓名不能为空")]
[ExcelColumn(Name = "姓名")]
[ExcelColumnName("姓名")]
public string Name { get; set; }
[Required(ErrorMessage = "联系方式不能为空")]
[ExcelColumn(Name = "联系方式")]
[ExcelColumnName("联系方式")]
public string Phone { get; set; }
[ExcelColumn(Name = "工作单位")]
[ExcelColumnName("工作单位")]
public string Company { get; set; }
[Required(ErrorMessage = "收货地址不能为空")]
[ExcelColumn(Name = "收货地址")]
[ExcelColumnName("收货地址")]
public string Address { get; set; }
[Required(ErrorMessage = "产品型号不能为空")]
[ExcelColumn(Name = "产品型号")]
[ExcelColumnName("产品型号")]
public string ProductModel { get; set; }
[Required(ErrorMessage = "出品编号不能为空")]
[ExcelColumn(Name = "出品编号")]
[ExcelColumnName("出品编号")]
public string ProductSerialNumber { get; set; }
[Required(ErrorMessage = "出品年月不能为空")]
[ExcelColumn(Name = "出品年月")]
[ExcelColumnName("出品年月")]
public string ProductDate { get; set; }
[Required(ErrorMessage = "出品图片不能为空")]
[ExcelColumn(Name = "出品图片")]
[ExcelColumnName("出品图片")]
public string ProductImage { get; set; }
}
}

View File

@ -0,0 +1,28 @@
namespace ZR.Model.Business.Dto
{
/// <summary>
/// 礼品小程序查询对象
/// </summary>
public class GiftConfigQueryDto : PagerInfo
{
}
/// <summary>
/// 礼品小程序输入输出对象
/// </summary>
public class GiftConfigDto
{
[Required(ErrorMessage = "Id不能为空")]
public int Id { get; set; }
public string HomeImage { get; set; }
public string Extend { get; set; }
public string Extend1 { get; set; }
}
}

View File

@ -0,0 +1,73 @@
namespace ZR.Model.Business.Dto
{
/// <summary>
/// 微信用户表查询对象
/// </summary>
public class GiftUserQueryDto : PagerInfo
{
public string Nickname { get; set; }
}
/// <summary>
/// 微信用户表输入输出对象
/// </summary>
public class GiftUserDto
{
[Required(ErrorMessage = "主键ID不能为空")]
[ExcelColumn(Name = "主键ID")]
[ExcelColumnName("主键ID")]
public int Id { get; set; }
[Required(ErrorMessage = "微信openid不能为空")]
[ExcelColumn(Name = "微信openid")]
[ExcelColumnName("微信openid")]
public string Openid { get; set; }
[ExcelColumn(Name = "微信unionid")]
[ExcelColumnName("微信unionid")]
public string Unionid { get; set; }
[ExcelColumn(Name = "昵称")]
[ExcelColumnName("昵称")]
public string Nickname { get; set; }
[ExcelColumn(Name = "头像URL")]
[ExcelColumnName("头像URL")]
public string AvatarUrl { get; set; }
[ExcelColumn(Name = "性别")]
[ExcelColumnName("性别")]
public string Gender { get; set; }
[ExcelColumn(Name = "手机号")]
[ExcelColumnName("手机号")]
public string Phone { get; set; }
[Required(ErrorMessage = "状态不能为空")]
[ExcelColumn(Name = "状态")]
[ExcelColumnName("状态")]
public string Status { get; set; }
[ExcelColumn(Name = "最后登录时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("最后登录时间")]
public DateTime? LastLoginTime { get; set; }
//[Required(ErrorMessage = "创建时间不能为空")]
[ExcelColumn(Name = "创建时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("创建时间")]
public DateTime? CreateTime { get; set; }
//[Required(ErrorMessage = "更新时间不能为空")]
[ExcelColumn(Name = "更新时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("更新时间")]
public DateTime? UpdateTime { get; set; }
[ExcelColumn(Name = "性别")]
public string GenderLabel { get; set; }
[ExcelColumn(Name = "状态")]
public string StatusLabel { get; set; }
}
}

View File

@ -0,0 +1,83 @@
namespace ZR.Model.Business
{
/// <summary>
/// 礼品申领表
/// </summary>
[SugarTable("gift_claim")]
public class GiftClaim
{
/// <summary>
/// 主键
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 用户ID
/// </summary>
[SugarColumn(ColumnName = "user_id")]
public int UserId { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 联系方式
/// </summary>
public string Phone { get; set; }
/// <summary>
/// 工作单位
/// </summary>
public string Company { get; set; }
/// <summary>
/// 收货地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 产品型号
/// </summary>
public string ProductModel { get; set; }
/// <summary>
/// 出品编号
/// </summary>
public string ProductSerialNumber { get; set; }
/// <summary>
/// 出品年月
/// </summary>
public string ProductDate { get; set; }
/// <summary>
/// 出品图片
/// </summary>
public string ProductImage { get; set; }
/// <summary>
/// 提交时间
/// </summary>
public DateTime? CreatedAt { get; set; }
/// <summary>
/// 审核状态
/// </summary>
public int Status { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public DateTime? ReviewAt { get; set; }
/// <summary>
/// 微信用户id
/// </summary>
public string UserWxOpenId { get; set; }
}
}

View File

@ -0,0 +1,32 @@
namespace ZR.Model.Business
{
/// <summary>
/// 礼品小程序
/// </summary>
[SugarTable("gift_config")]
public class GiftConfig
{
/// <summary>
/// Id
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 首页图片
/// </summary>
public string HomeImage { get; set; }
/// <summary>
/// 扩展1
/// </summary>
public string Extend { get; set; }
/// <summary>
/// 扩展2
/// </summary>
public string Extend1 { get; set; }
}
}

View File

@ -0,0 +1,71 @@
namespace ZR.Model.Business
{
/// <summary>
/// 微信用户表
/// </summary>
[SugarTable("gift_user")]
public class GiftUser
{
/// <summary>
/// 主键ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 微信openid
/// </summary>
public string Openid { get; set; }
/// <summary>
/// 微信unionid
/// </summary>
public string Unionid { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string Nickname { get; set; }
/// <summary>
/// 头像URL
/// </summary>
[SugarColumn(ColumnName = "avatar_url")]
public string AvatarUrl { get; set; }
/// <summary>
/// 性别
/// </summary>
public string Gender { get; set; }
/// <summary>
/// 手机号
/// </summary>
public string Phone { get; set; }
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; }
/// <summary>
/// 最后登录时间
/// </summary>
[SugarColumn(ColumnName = "last_login_time")]
public DateTime? LastLoginTime { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "create_time")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "update_time")]
public DateTime? UpdateTime { get; set; }
}
}

View File

@ -0,0 +1,117 @@
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Repository;
using ZR.Service.Business.IBusinessService;
namespace ZR.Service.Business
{
/// <summary>
/// 礼品申领表Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IGiftClaimService), ServiceLifetime = LifeTime.Transient)]
public class GiftClaimService : BaseService<GiftClaim>, IGiftClaimService
{
/// <summary>
/// 查询礼品申领表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GiftClaimDto> GetList(GiftClaimQueryDto parm)
{
var predicate = QueryExp(parm);
var response = Queryable()
//.OrderBy("Id desc")
.Where(predicate.ToExpression())
.ToPage<GiftClaim, GiftClaimDto>(parm);
//response.Result.ForEach(item =>
//{
// if (item.ProductImage.IndexOf("http") == -1)
// {
// item.ProductImage = "" +
// }
//});
return response;
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public GiftClaim GetInfo(int Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 添加礼品申领表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public GiftClaim AddGiftClaim(GiftClaim model)
{
return Insertable(model).ExecuteReturnEntity();
}
/// <summary>
/// 修改礼品申领表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateGiftClaim(GiftClaim model)
{
return Update(model, true);
}
/// <summary>
/// 导出礼品申领表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GiftClaimDto> ExportList(GiftClaimQueryDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.Select((it) => new GiftClaimDto()
{
StatusLabel = it.Status.GetConfigValue<Model.System.SysDictData>("gift_request_claim"),
}, true)
.ToPage(parm);
return response;
}
/// <summary>
/// 查询导出表达式
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
private static Expressionable<GiftClaim> QueryExp(GiftClaimQueryDto parm)
{
var predicate = Expressionable.Create<GiftClaim>();
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Name), it => it.Name.Contains(parm.Name));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Phone), it => it.Phone.Contains(parm.Phone));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Company), it => it.Company.Contains(parm.Company));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Address), it => it.Address.Contains(parm.Address));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.ProductModel), it => it.ProductModel.Contains(parm.ProductModel));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.ProductSerialNumber), it => it.ProductSerialNumber.Contains(parm.ProductSerialNumber));
predicate = predicate.AndIF(parm.Status != null, it => it.Status == parm.Status);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.UserWxOpenId), it => it.UserWxOpenId.Contains(parm.UserWxOpenId));
return predicate;
}
}
}

View File

@ -0,0 +1,79 @@
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Repository;
using ZR.Service.Business.IBusinessService;
namespace ZR.Service.Business
{
/// <summary>
/// 礼品小程序Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IGiftConfigService), ServiceLifetime = LifeTime.Transient)]
public class GiftConfigService : BaseService<GiftConfig>, IGiftConfigService
{
/// <summary>
/// 查询礼品小程序列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GiftConfigDto> GetList(GiftConfigQueryDto parm)
{
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage<GiftConfig, GiftConfigDto>(parm);
return response;
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public GiftConfig GetInfo(int Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 添加礼品小程序
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public GiftConfig AddGiftConfig(GiftConfig model)
{
return Insertable(model).ExecuteReturnEntity();
}
/// <summary>
/// 修改礼品小程序
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateGiftConfig(GiftConfig model)
{
return Update(model, true, "修改礼品小程序");
}
/// <summary>
/// 查询导出表达式
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
private static Expressionable<GiftConfig> QueryExp(GiftConfigQueryDto parm)
{
var predicate = Expressionable.Create<GiftConfig>();
return predicate;
}
}
}

View File

@ -0,0 +1,104 @@
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using ZR.Model.Business.Dto;
using ZR.Model.Business;
using ZR.Repository;
using ZR.Service.Business.IBusinessService;
namespace ZR.Service.Business
{
/// <summary>
/// 微信用户表Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IGiftUserService), ServiceLifetime = LifeTime.Transient)]
public class GiftUserService : BaseService<GiftUser>, IGiftUserService
{
/// <summary>
/// 查询微信用户表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GiftUserDto> GetList(GiftUserQueryDto parm)
{
var predicate = QueryExp(parm);
var response = Queryable()
//.OrderBy("Id desc")
.Where(predicate.ToExpression())
.ToPage<GiftUser, GiftUserDto>(parm);
return response;
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public GiftUser GetInfo(int Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 添加微信用户表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public GiftUser AddGiftUser(GiftUser model)
{
return Insertable(model).ExecuteReturnEntity();
}
/// <summary>
/// 修改微信用户表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateGiftUser(GiftUser model)
{
return Update(model, true);
}
/// <summary>
/// 导出微信用户表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GiftUserDto> ExportList(GiftUserQueryDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.Select((it) => new GiftUserDto()
{
GenderLabel = it.Gender.GetConfigValue<Model.System.SysDictData>("sys_user_sex"),
StatusLabel = it.Status.GetConfigValue<Model.System.SysDictData>("sys_common_status"),
}, true)
.ToPage(parm);
return response;
}
/// <summary>
/// 查询导出表达式
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
private static Expressionable<GiftUser> QueryExp(GiftUserQueryDto parm)
{
var predicate = Expressionable.Create<GiftUser>();
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Nickname), it => it.Nickname.Contains(parm.Nickname));
return predicate;
}
}
}

View File

@ -0,0 +1,22 @@
using ZR.Model.Business.Dto;
using ZR.Model.Business;
namespace ZR.Service.Business.IBusinessService
{
/// <summary>
/// 礼品申领表service接口
/// </summary>
public interface IGiftClaimService : IBaseService<GiftClaim>
{
PagedInfo<GiftClaimDto> GetList(GiftClaimQueryDto parm);
GiftClaim GetInfo(int Id);
GiftClaim AddGiftClaim(GiftClaim parm);
int UpdateGiftClaim(GiftClaim parm);
PagedInfo<GiftClaimDto> ExportList(GiftClaimQueryDto parm);
}
}

View File

@ -0,0 +1,21 @@
using ZR.Model.Business.Dto;
using ZR.Model.Business;
namespace ZR.Service.Business.IBusinessService
{
/// <summary>
/// 礼品小程序service接口
/// </summary>
public interface IGiftConfigService : IBaseService<GiftConfig>
{
PagedInfo<GiftConfigDto> GetList(GiftConfigQueryDto parm);
GiftConfig GetInfo(int Id);
GiftConfig AddGiftConfig(GiftConfig parm);
int UpdateGiftConfig(GiftConfig parm);
}
}

View File

@ -0,0 +1,22 @@
using ZR.Model.Business.Dto;
using ZR.Model.Business;
namespace ZR.Service.Business.IBusinessService
{
/// <summary>
/// 微信用户表service接口
/// </summary>
public interface IGiftUserService : IBaseService<GiftUser>
{
PagedInfo<GiftUserDto> GetList(GiftUserQueryDto parm);
GiftUser GetInfo(int Id);
GiftUser AddGiftUser(GiftUser parm);
int UpdateGiftUser(GiftUser parm);
PagedInfo<GiftUserDto> ExportList(GiftUserQueryDto parm);
}
}

View File

@ -1,11 +1,15 @@
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using NLog;
using ZR.Infrastructure.Helper;
using ZR.Infrastructure.IPTools;
using ZR.Model.System;
using ZR.ServiceCore.Services;
@ -111,11 +115,20 @@ namespace ZR.ServiceCore.Middleware
sysOperLog.OperParam = logAttribute.IsSaveRequestData ? sysOperLog.OperParam : "";
sysOperLog.JsonResult = logAttribute.IsSaveResponseData ? sysOperLog.JsonResult : "";
}
if (statusCode == 403)
{
sysOperLog.Status = 1;
sysOperLog.ErrorMsg = "无权限访问";
}
else
{
if (!string.IsNullOrEmpty(logAttribute.MessageKey))
{
sysOperLog.ErrorMsg = LogMessageRegistry.GetMessage(logAttribute.MessageKey, context);
}
}
LogEventInfo ei = new(NLog.LogLevel.Info, "GlobalActionMonitor", "");
ei.Properties["jsonResult"] = !HttpMethods.IsGet(method) ? jsonResult : "";

View File

@ -79,7 +79,7 @@ namespace ZR.ServiceCore.Middleware
var an1 = string.Empty;
if (ex.Message.Contains(q1))
{
an1 = $"====请查看issuehttps://gitee.com/izory/ZrAdminNetCore/issues/I6S4DZ";
//an1 = $"====请查看issuehttps://gitee.com/izory/ZrAdminNetCore/issues/I6S4DZ";
}
msg = "服务器好像出了点问题,请联系系统管理员...";
error = $"异常原因:{ex.Message}{an1}";

View File

@ -37,6 +37,7 @@ namespace ZR.ServiceCore.Middleware
await _next(context);
return;
}
if (_whitelistPaths.Any(p => path.StartsWith(p, StringComparison.OrdinalIgnoreCase)))
{
await _next(context);

View File

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
using ZR.Model.Dto;
using ZR.Model.System;
@ -17,7 +18,18 @@ namespace ZR.ServiceCore.Services
/// <param name="dto"></param>
/// <returns>文件对象</returns>
Task<SysFile> SaveFileToLocal(string rootPath, UploadDto dto, string userName, IFormFile formFile);
/// <summary>
///
/// </summary>
/// <param name="rootPath"></param>
/// <param name="dto"></param>
/// <param name="userName"></param>
/// <param name="fileName"></param>
/// <param name="fileByte"></param>
/// <returns></returns>
Task<SysFile> SaveFileToLocal(string rootPath, UploadDto dto, string userName, string fileName, byte[] fileByte);
/// <summary>
/// 上传文件到阿里云
/// </summary>
@ -26,7 +38,16 @@ namespace ZR.ServiceCore.Services
/// <param name="formFile"></param>
/// <returns></returns>
Task<SysFile> SaveFileToAliyun(SysFile file, UploadDto dto, IFormFile formFile);
/// <summary>
/// 上传文件到阿里云
/// </summary>
/// <param name="sysFile"></param>
/// <param name="dto"></param>
/// <param name="file"></param>
/// <returns></returns>
Task<SysFile> SaveFileToAliyun(SysFile sysFile, UploadDto dto, byte[] file);
/// <summary>
/// 按时间来创建文件夹
/// </summary>

View File

@ -2,13 +2,17 @@
using Infrastructure.Attribute;
using Infrastructure.Enums;
using Infrastructure.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using ZR.Common;
using ZR.Model.Dto;
using ZR.Model.System;
@ -210,5 +214,50 @@ namespace ZR.ServiceCore.Services
// 保存压缩后的图片到输出流
await image.SaveAsync(outputStream, encoder);
}
public async Task<SysFile> SaveFileToLocal(string rootPath, UploadDto dto, string userName, string fileName, byte[] fileByte)
{
var fileDir = dto.FileDir;
string fileExt = Path.GetExtension(fileName);
fileName = (fileName.IsEmpty() ? HashFileName() : fileName) + fileExt;
string filePath = GetdirPath(fileDir);
string finalFilePath = Path.Combine(rootPath, filePath, fileName);
double fileSize = Math.Round(fileByte.Length / 1024.0, 2);
if (!Directory.Exists(Path.GetDirectoryName(finalFilePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(finalFilePath));
}
// 常见的图片扩展名
//var imageExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };
// 检查扩展名是否在图片扩展名列表中
//bool isImageByExtension = imageExtensions.Contains(fileExt);
using (var stream = new FileStream(finalFilePath, FileMode.Create))
{
await stream.WriteAsync(fileByte, 0, fileByte.Length);
}
string uploadUrl = OptionsSetting.Upload.UploadUrl;
string accessPath = string.Concat(filePath.Replace("\\", "/"), "/", fileName);
Uri baseUri = new(uploadUrl);
Uri fullUrl = new(baseUri, accessPath);
SysFile file = new(fileName, fileName, fileExt, fileSize + "kb", filePath, userName)
{
StoreType = (int)StoreType.LOCAL,
FileType = fileExt,
FileUrl = finalFilePath.Replace("\\", "/"),
AccessUrl = fullUrl.AbsoluteUri,
ClassifyType = "",
CategoryId = dto.CategoryId,
};
file.Id = await InsertFile(file);
return file;
}
public async Task<SysFile> SaveFileToAliyun(SysFile sysFile, UploadDto dto, byte[] file)
{
throw new NotImplementedException();
}
}
}