105040 Add 用户管理模块

This commit is contained in:
lihanbo 2024-10-29 15:46:44 +08:00
parent 04f8d9e15d
commit 713e57c424
11 changed files with 252 additions and 4 deletions

View File

@ -0,0 +1,30 @@
using LFlow.Base.Interfaces;
using LFlow.Base.Utils;
using LFlow.UserManagement.Model;
using LFlow.UserManagement.Service;
using Microsoft.AspNetCore.Mvc;
namespace LFlow.UserManagement.Controller
{
public class UserManagementController(IUserManagementService service) : BaseController
{
[HttpPost]
public ApiResult<UserDto>? Login(UserDto user)
{
return Success(service.Login(user));
}
[HttpPost]
public ApiResult<UserDto> Register(UserDto user)
{
try
{
return Success(service.Register(user));
}
catch (Exception ex)
{
return Fail<UserDto>(null, ex.Message, 500);
}
}
}
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputPath>../LFlow_Bin/Services/</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<UseCommonOutputDirectory>true</UseCommonOutputDirectory>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\LFlow.Base\LFlow.Base.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,27 @@
using LFlow.Base.Interfaces;
namespace LFlow.UserManagement.Model
{
public class UserDto : IModel
{
public string? ID
{
get;
set;
}
public string? UserName
{
get;
set;
}
public string? UserEmail
{
get; set;
}
public string? UserPassword
{
get; set;
}
}
}

View File

@ -0,0 +1,31 @@
using LFlow.Base.Interfaces;
using SqlSugar;
namespace LFlow.UserManagement.Model
{
[SugarTable("T_U_USERINFO")]
public class UserModel : IDataModel
{
[SugarColumn(IsPrimaryKey = true)]
public string ID
{
get;
set;
}
public string UserName
{
get;
set;
}
public string UserEmail
{
get; set;
}
public string UserPassword
{
get; set;
}
}
}

View File

@ -0,0 +1,10 @@
using LFlow.Base.Default;
using LFlow.UserManagement.Model;
using SqlSugar;
namespace LFlow.UserManagement.Repository
{
internal class UserManagementRepo(ISqlSugarClient client) : DefaultCurdRepo<UserModel, string>(client)
{
}
}

View File

@ -0,0 +1,14 @@
using LFlow.Base.Interfaces;
using LFlow.UserManagement.Model;
namespace LFlow.UserManagement.Service
{
public interface IUserManagementService : IService//<VersionDto>
{
UserDto? Login(UserDto user);
Task<UserDto>? LoginAsync(UserDto user);
UserDto? Register(UserDto user);
Task<UserDto>? RegisterAsync(UserDto user);
}
}

View File

@ -0,0 +1,69 @@
using LFlow.Base.Interfaces;
using LFlow.Base.Utils;
using LFlow.UserManagement.Model;
using LFlow.UserManagement.Util;
namespace LFlow.UserManagement.Service
{
/// <summary>
/// 在线管理服务
/// </summary>
public class UserManagementService(IRepo<UserModel, string> repo) : IUserManagementService
{
public UserDto? Login(UserDto user)
{
var userPwd = PasswordHelper.HashPassword(user.UserPassword);
var userModel = repo.WhereSearchId(new UserModel
{
UserName = user.UserName,
UserPassword = userPwd
});
if (userModel == null)
{
return null;
}
var loginedUser = repo.Get(userModel.FirstOrDefault());
loginedUser.UserPassword = "";
return loginedUser.MapTo<UserDto>();
}
public Task<UserDto>? LoginAsync(UserDto user)
{
return Task.FromResult(this.Login(user));
}
public UserDto? Register(UserDto user)
{
if (user.UserEmail == null || user.UserName == null || user.UserPassword == null)
{
throw new Exception("用户名、密码、邮箱不能为空");
}
var userPwd = PasswordHelper.HashPassword(user.UserPassword);
var ids = repo.WhereSearchId(new UserModel
{
UserName = user.UserName
});
if (ids != null && ids.Count > 0)
{
throw new Exception("用户名已存在");
}
var userModel = new UserModel
{
ID = Guid.NewGuid().ToString(),
UserName = user.UserName,
UserEmail = user.UserEmail,
UserPassword = userPwd
};
var savedUser = repo.SaveOrUpdate(userModel, false).MapTo<UserDto>();
savedUser.UserPassword = "";
return savedUser;
}
public Task<UserDto> RegisterAsync(UserDto user)
{
return Task.FromResult(this.Register(user));
}
}
}

View File

@ -0,0 +1,24 @@
using LFlow.Base.Interfaces;
using LFlow.Base.Utils;
using LFlow.UserManagement.Model;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using System.Reflection;
namespace LFlow.UserManagement
{
public class UserManegementModule : IModule
{
public void ConfigureModule(IServiceCollection services)
{
CodeFirst.AddType(typeof(UserModel));
var assembly = Assembly.GetAssembly(typeof(UserManegementModule))!;
var types = assembly.GetTypes().ToList();
RegisterModule.RegisterAllService(types, services);
RegisterModule.RegisterAllRepo(types, services);
RegisterModule.RegisterAllModel(types, services);
services.AddControllers().AddApplicationPart(assembly);
Log.Logger?.Information("UserManegementModule ConfigureModule done");
}
}
}

View File

@ -0,0 +1,20 @@
using System.Security.Cryptography;
using System.Text;
namespace LFlow.UserManagement.Util
{
public class PasswordHelper
{
public static string HashPassword(string password)
{
byte[] data = Encoding.Default.GetBytes(password);
byte[] hashData = MD5.HashData(data);
StringBuilder sb = new();
foreach (byte b in hashData)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
}
}

View File

@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
using Serilog;
using System.Reflection;
namespace LFlow.User;
namespace LFlow.VersionManagement;
public class VersionManagementModule : IModule
{
@ -14,8 +14,8 @@ public class VersionManagementModule : IModule
CodeFirst.AddType(typeof(VersionModel));
var assembly = Assembly.GetAssembly(typeof(VersionManagementModule))!;
var types = assembly.GetTypes().ToList();
RegisterModule.RegisterAllService(types, services);
RegisterModule.RegisterAllRepo(types, services);
types.RegisterAllService(services);
types.RegisterAllRepo(services);
//RegisterModule.RegisterAllModel(types, services);
services.AddControllers().AddApplicationPart(assembly);
Log.Logger?.Information("VersionManagementModule ConfigureModule done");

View File

@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.Base", "LFlow.Base\LF
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.VersionManagement", "LFlow.VersionManagement\LFlow.VersionManagement.csproj", "{D52CC594-B10C-4FC0-8B7A-68CE0645A95D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LFlow.OnlineManegement", "LFlow.OnlineManegement\LFlow.OnlineManegement.csproj", "{E849310F-64AD-453A-A2AA-557731508BF1}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.OnlineManegement", "LFlow.OnlineManegement\LFlow.OnlineManegement.csproj", "{E849310F-64AD-453A-A2AA-557731508BF1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LFlow.UserManagement", "LFlow.UserManagement\LFlow.UserManagement.csproj", "{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -27,6 +29,10 @@ Global
{E849310F-64AD-453A-A2AA-557731508BF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E849310F-64AD-453A-A2AA-557731508BF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E849310F-64AD-453A-A2AA-557731508BF1}.Release|Any CPU.Build.0 = Release|Any CPU
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE