Merge pull request 'feature-nxdev' (#36) from feature-nxdev into main

Reviewed-on: #36
This commit is contained in:
西街长安 2025-12-30 17:59:50 +08:00
commit 85144dbf6f
22 changed files with 829 additions and 7 deletions

View File

@ -10,7 +10,7 @@
"Key": "YourSuperSecretKey123456784124214190!",
"Issuer": "IMDemo",
"Audience": "IMClients",
"AccessTokenMinutes": 15,
"AccessTokenMinutes": 30,
"RefreshTokenDays": 30
},
"ConnectionStrings": {

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("IMTest")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d852258d4fa2cf8bb6e4645d23894dfb8d8e4b1f")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2565678b22efd0dc8308f2004d582b518ada0245")]
[assembly: System.Reflection.AssemblyProductAttribute("IMTest")]
[assembly: System.Reflection.AssemblyTitleAttribute("IMTest")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
db83b7267fcf05069f219fdc3eec31e2a4e8928c3bd33341b22a7f66599bc599
b9832b036b93c6518b1db1781b830178cbe943c60495856f215e90e2f16d822b

View File

@ -32,6 +32,10 @@ public partial class Conversation
/// </summary>
public int UnreadCount { get; set; }
public string TargetName { get; set; } = null!;
public string TargetAvatar { get; set; } = null!;
public virtual Message LastMessage { get; set; } = null!;
public virtual User User { get; set; } = null!;

View File

@ -0,0 +1,735 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal;
namespace IM_API.Models;
public partial class ImDbContext : DbContext
{
public ImDbContext()
{
}
public ImDbContext(DbContextOptions<ImDbContext> options)
: base(options)
{
}
public virtual DbSet<Admin> Admins { get; set; }
public virtual DbSet<Conversation> Conversations { get; set; }
public virtual DbSet<Device> Devices { get; set; }
public virtual DbSet<File> Files { get; set; }
public virtual DbSet<Friend> Friends { get; set; }
public virtual DbSet<FriendRequest> FriendRequests { get; set; }
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<GroupInvite> GroupInvites { get; set; }
public virtual DbSet<GroupMember> GroupMembers { get; set; }
public virtual DbSet<GroupRequest> GroupRequests { get; set; }
public virtual DbSet<LoginLog> LoginLogs { get; set; }
public virtual DbSet<Message> Messages { get; set; }
public virtual DbSet<Notification> Notifications { get; set; }
public virtual DbSet<Permission> Permissions { get; set; }
public virtual DbSet<Permissionarole> Permissionaroles { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseMySql("server=frp-era.com;port=26582;database=IM;user=product;password=12345678", Microsoft.EntityFrameworkCore.ServerVersion.Parse("5.7.44-mysql"));
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.UseCollation("latin1_swedish_ci")
.HasCharSet("latin1");
modelBuilder.Entity<Admin>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("admins")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.RoleId, "RoleId");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("创建时间 ")
.HasColumnType("datetime");
entity.Property(e => e.Password)
.HasMaxLength(50)
.HasComment("密码");
entity.Property(e => e.RoleId)
.HasComment("角色")
.HasColumnType("int(11)");
entity.Property(e => e.State)
.HasComment("状态0:正常2封禁 ")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Updated)
.HasComment("更新时间 ")
.HasColumnType("datetime");
entity.Property(e => e.Username)
.HasMaxLength(50)
.HasComment("用户名");
entity.HasOne(d => d.Role).WithMany(p => p.Admins)
.HasForeignKey(d => d.RoleId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("admins_ibfk_1");
});
modelBuilder.Entity<Conversation>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("conversations")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.UserId, "Userid");
entity.HasIndex(e => e.LastMessageId, "lastMessageId");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.LastMessageId)
.HasComment("最后一条消息ID ")
.HasColumnType("int(11)")
.HasColumnName("lastMessageId");
entity.Property(e => e.MsgType)
.HasComment("消息类型同Messages.MsgType ")
.HasColumnType("int(11)");
entity.Property(e => e.TargetAvatar).HasMaxLength(255);
entity.Property(e => e.TargetId)
.HasComment("对方ID群聊为群聊ID单聊为单聊ID ")
.HasColumnType("int(11)");
entity.Property(e => e.TargetName).HasMaxLength(255);
entity.Property(e => e.UnreadCount)
.HasComment("未读消息数 ")
.HasColumnType("int(11)");
entity.Property(e => e.UserId)
.HasComment("用户")
.HasColumnType("int(11)");
entity.HasOne(d => d.LastMessage).WithMany(p => p.Conversations)
.HasForeignKey(d => d.LastMessageId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("conversations_ibfk_2");
entity.HasOne(d => d.User).WithMany(p => p.Conversations)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("conversations_ibfk_1");
});
modelBuilder.Entity<Device>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("devices")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.UserId, "Userid");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Dtype)
.HasComment("设备类型(\r\n0:Android,1:Ios,2:PC,3Pad,4:未知)")
.HasColumnType("tinyint(4)")
.HasColumnName("DType");
entity.Property(e => e.LastLogin)
.HasComment("最后一次登录 ")
.HasColumnType("datetime");
entity.Property(e => e.UserId)
.HasComment("设备所属用户 ")
.HasColumnType("int(11)");
entity.HasOne(d => d.User).WithMany(p => p.Devices)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("devices_ibfk_1");
});
modelBuilder.Entity<File>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("files")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.MessageId, "Messageld");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("创建时间 ")
.HasColumnType("datetime");
entity.Property(e => e.MessageId)
.HasComment("关联消息ID ")
.HasColumnType("int(11)");
entity.Property(e => e.Name)
.HasMaxLength(50)
.HasComment("文件名 ");
entity.Property(e => e.Size)
.HasComment("文件大小单位KB ")
.HasColumnType("int(11)");
entity.Property(e => e.Type)
.HasMaxLength(10)
.HasComment("文件类型 ");
entity.Property(e => e.Url)
.HasMaxLength(100)
.HasComment("文件储存URL ")
.HasColumnName("URL");
entity.HasOne(d => d.Message).WithMany(p => p.Files)
.HasForeignKey(d => d.MessageId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("files_ibfk_1");
});
modelBuilder.Entity<Friend>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("friends")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.Id, "ID");
entity.HasIndex(e => new { e.UserId, e.FriendId }, "Userld");
entity.HasIndex(e => e.FriendId, "用户2id");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Avatar)
.HasMaxLength(255)
.HasComment("好友头像");
entity.Property(e => e.Created)
.HasComment("好友关系创建时间")
.HasColumnType("datetime");
entity.Property(e => e.FriendId)
.HasComment("用户2ID")
.HasColumnType("int(11)");
entity.Property(e => e.RemarkName)
.HasMaxLength(20)
.HasComment("好友备注名");
entity.Property(e => e.Status)
.HasComment("当前好友关系状态\r\n0待通过,1已添加,2已拒绝,3已拉黑")
.HasColumnType("tinyint(4)");
entity.Property(e => e.UserId)
.HasComment("用户ID")
.HasColumnType("int(11)");
entity.HasOne(d => d.FriendNavigation).WithMany(p => p.FriendFriendNavigations)
.HasForeignKey(d => d.FriendId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("用户2id");
entity.HasOne(d => d.User).WithMany(p => p.FriendUsers)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("用户id");
});
modelBuilder.Entity<FriendRequest>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("friend_request")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.RequestUser, "RequestUser");
entity.HasIndex(e => e.ResponseUser, "ResponseUser");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("申请时间 ")
.HasColumnType("datetime");
entity.Property(e => e.Description)
.HasComment("申请附言 ")
.HasColumnType("text");
entity.Property(e => e.RequestUser)
.HasComment("申请人 ")
.HasColumnType("int(11)");
entity.Property(e => e.ResponseUser)
.HasComment("被申请人 ")
.HasColumnType("int(11)");
entity.Property(e => e.State)
.HasComment("申请状态0待通过,1:拒绝,2:同意,3拉黑 ")
.HasColumnType("tinyint(4)");
entity.HasOne(d => d.RequestUserNavigation).WithMany(p => p.FriendRequestRequestUserNavigations)
.HasForeignKey(d => d.RequestUser)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("friend_request_ibfk_1");
entity.HasOne(d => d.ResponseUserNavigation).WithMany(p => p.FriendRequestResponseUserNavigations)
.HasForeignKey(d => d.ResponseUser)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("friend_request_ibfk_2");
});
modelBuilder.Entity<Group>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("groups")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.GroupMaster, "GroupMaster");
entity.HasIndex(e => e.Id, "ID");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.AllMembersBanned)
.HasComment("全员禁言0允许发言2全员禁言")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Announcement)
.HasComment("群公告")
.HasColumnType("text");
entity.Property(e => e.Auhority)
.HasComment("群权限\r\n0需管理员同意,1任意人可加群,2不允许任何人加入")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Created)
.HasComment("群聊创建时间")
.HasColumnType("datetime");
entity.Property(e => e.GroupMaster)
.HasComment("群主")
.HasColumnType("int(11)");
entity.Property(e => e.Name)
.HasMaxLength(20)
.HasComment("群聊名称");
entity.Property(e => e.Status)
.HasComment("群聊状态\r\n(1正常,2封禁)")
.HasColumnType("tinyint(4)");
entity.HasOne(d => d.GroupMasterNavigation).WithMany(p => p.Groups)
.HasForeignKey(d => d.GroupMaster)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("groups_ibfk_1");
});
modelBuilder.Entity<GroupInvite>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("group_invite")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.GroupId, "GroupId");
entity.HasIndex(e => e.InviteUser, "InviteUser");
entity.HasIndex(e => e.InvitedUser, "InvitedUser");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.GroupId)
.HasComment("群聊编号")
.HasColumnType("int(11)");
entity.Property(e => e.InviteUser)
.HasComment("邀请用户")
.HasColumnType("int(11)");
entity.Property(e => e.InvitedUser)
.HasComment("被邀请用户")
.HasColumnType("int(11)");
entity.Property(e => e.State)
.HasComment("当前状态(0:待被邀请人同意\r\n1:被邀请人已同意)")
.HasColumnType("tinyint(4)");
entity.HasOne(d => d.Group).WithMany(p => p.GroupInvites)
.HasForeignKey(d => d.GroupId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("group_invite_ibfk_2");
entity.HasOne(d => d.InviteUserNavigation).WithMany(p => p.GroupInviteInviteUserNavigations)
.HasForeignKey(d => d.InviteUser)
.HasConstraintName("group_invite_ibfk_1");
entity.HasOne(d => d.InvitedUserNavigation).WithMany(p => p.GroupInviteInvitedUserNavigations)
.HasForeignKey(d => d.InvitedUser)
.HasConstraintName("group_invite_ibfk_3");
});
modelBuilder.Entity<GroupMember>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("group_member")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.GroupId, "Groupld");
entity.HasIndex(e => e.Id, "ID");
entity.HasIndex(e => e.UserId, "Userld");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasDefaultValueSql("'1970-01-01 00:00:00'")
.HasComment("加入群聊时间")
.HasColumnType("datetime");
entity.Property(e => e.GroupId)
.HasComment("群聊编号")
.HasColumnType("int(11)");
entity.Property(e => e.Role)
.HasComment("成员角色0:普通成员,1:管理员,2:群主)")
.HasColumnType("tinyint(4)");
entity.Property(e => e.UserId)
.HasComment("用户编号")
.HasColumnType("int(11)");
entity.HasOne(d => d.Group).WithMany(p => p.GroupMemberGroups)
.HasForeignKey(d => d.GroupId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("group_member_ibfk_2");
entity.HasOne(d => d.User).WithMany(p => p.GroupMemberUsers)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("group_member_ibfk_1");
});
modelBuilder.Entity<GroupRequest>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("group_request")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.GroupId, "GroupId");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.Description)
.HasComment("入群附言")
.HasColumnType("text");
entity.Property(e => e.GroupId)
.HasComment("群聊编号\r\n")
.HasColumnType("int(11)");
entity.Property(e => e.State)
.HasComment("申请状态0:待管理员同意,1:已拒绝,2已同意")
.HasColumnType("tinyint(4)");
entity.Property(e => e.UserId)
.HasComment("申请人 ")
.HasColumnType("int(11)");
entity.HasOne(d => d.Group).WithMany(p => p.GroupRequests)
.HasForeignKey(d => d.GroupId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("group_request_ibfk_1");
entity.HasOne(d => d.GroupNavigation).WithMany(p => p.GroupRequests)
.HasForeignKey(d => d.GroupId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("group_request_ibfk_2");
});
modelBuilder.Entity<LoginLog>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("login_log")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.UserId, "Userld");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Dtype)
.HasComment("设备类型通Devices/DType ")
.HasColumnType("tinyint(4)")
.HasColumnName("DType");
entity.Property(e => e.Logined)
.HasComment("登录时间 ")
.HasColumnType("datetime");
entity.Property(e => e.State)
.HasComment("登录状态(0:登陆成功,1:未验证,2:已被拒绝) ")
.HasColumnType("tinyint(4)");
entity.Property(e => e.UserId)
.HasComment("登录用户 ")
.HasColumnType("int(11)");
entity.HasOne(d => d.User).WithMany(p => p.LoginLogs)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("login_log_ibfk_1");
});
modelBuilder.Entity<Message>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("messages")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.Sender, "Sender");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.ChatType)
.HasComment("聊天类型\r\n0私聊,1群聊")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Content)
.HasComment("消息内容 ")
.HasColumnType("text");
entity.Property(e => e.Created)
.HasComment("发送时间 ")
.HasColumnType("datetime");
entity.Property(e => e.MsgType)
.HasComment("消息类型\r\n(0:文本,1图片,2语音,3视频,4文件5语音聊天,6视频聊天)")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Recipient)
.HasComment("接收者私聊为用户ID群聊为群聊ID ")
.HasColumnType("int(11)");
entity.Property(e => e.Sender)
.HasComment("发送者 ")
.HasColumnType("int(11)");
entity.Property(e => e.State)
.HasComment("消息状态(0:已发送,1:已撤回) ")
.HasColumnType("tinyint(4)");
entity.HasOne(d => d.SenderNavigation).WithMany(p => p.Messages)
.HasForeignKey(d => d.Sender)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("messages_ibfk_1");
});
modelBuilder.Entity<Notification>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("notifications")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.UserId, "Userld");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Content)
.HasComment("通知内容")
.HasColumnType("text");
entity.Property(e => e.Created)
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.Ntype)
.HasComment("通知类型(0文本)")
.HasColumnType("tinyint(4)")
.HasColumnName("NType");
entity.Property(e => e.Title)
.HasMaxLength(40)
.HasComment("通知标题");
entity.Property(e => e.UserId)
.HasComment("接收人(为空为全体通知)")
.HasColumnType("int(11)");
entity.HasOne(d => d.User).WithMany(p => p.Notifications)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("notifications_ibfk_1");
});
modelBuilder.Entity<Permission>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("permissions")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Code)
.HasComment("权限编码 ")
.HasColumnType("int(11)");
entity.Property(e => e.Created)
.HasComment("创建时间 ")
.HasColumnType("datetime");
entity.Property(e => e.Name)
.HasMaxLength(50)
.HasComment("权限名称 ");
entity.Property(e => e.Ptype)
.HasComment("权限类型(0:增,1:删,2:改,3:查) ")
.HasColumnType("int(11)")
.HasColumnName("PType");
});
modelBuilder.Entity<Permissionarole>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("permissionarole")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.PermissionId, "Permissionld");
entity.HasIndex(e => e.RoleId, "Roleld");
entity.Property(e => e.Id)
.ValueGeneratedNever()
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.PermissionId)
.HasComment("权限 ")
.HasColumnType("int(11)");
entity.Property(e => e.RoleId)
.HasComment("角色 ")
.HasColumnType("int(11)");
entity.HasOne(d => d.Permission).WithMany(p => p.Permissionaroles)
.HasForeignKey(d => d.PermissionId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("permissionarole_ibfk_2");
entity.HasOne(d => d.Role).WithMany(p => p.Permissionaroles)
.HasForeignKey(d => d.RoleId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("permissionarole_ibfk_1");
});
modelBuilder.Entity<Role>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("roles")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Created)
.HasComment("创建时间 ")
.HasColumnType("datetime");
entity.Property(e => e.Description)
.HasComment("角色描述 ")
.HasColumnType("text");
entity.Property(e => e.Name)
.HasMaxLength(20)
.HasComment("角色名称 ");
});
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity
.ToTable("users")
.HasCharSet("utf8mb4")
.UseCollation("utf8mb4_general_ci");
entity.HasIndex(e => e.Id, "ID");
entity.HasIndex(e => e.Username, "Username").IsUnique();
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
entity.Property(e => e.Avatar)
.HasMaxLength(255)
.HasComment("用户头像链接");
entity.Property(e => e.Created)
.HasDefaultValueSql("'1970-01-01 00:00:00'")
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.IsDeleted)
.HasComment("软删除标识\r\n0账号正常\r\n1账号已删除")
.HasColumnType("tinyint(4)");
entity.Property(e => e.NickName)
.HasMaxLength(50)
.HasComment("用户昵称");
entity.Property(e => e.OnlineStatus)
.HasComment("用户在线状态\r\n0默认不在线\r\n1在线")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Password)
.HasMaxLength(50)
.HasComment("密码");
entity.Property(e => e.Status)
.HasDefaultValueSql("'1'")
.HasComment("账户状态\r\n(0未激活,1正常,2封禁)")
.HasColumnType("tinyint(4)");
entity.Property(e => e.Updated)
.HasComment("修改时间")
.HasColumnType("datetime");
entity.Property(e => e.Username)
.HasMaxLength(50)
.HasComment("唯一用户名");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

View File

@ -20,7 +20,7 @@ public partial class User
/// <summary>
/// 用户昵称
/// </summary>
public string? NickName { get; set; } = null!;
public string? NickName { get; set; }
/// <summary>
/// 用户在线状态

View File

@ -1 +1 @@
VITE_API_BASE_URL = http://localhost:5202/api
VITE_API_BASE_URL = http://192.168.5.116:7070/api

View File

@ -11,12 +11,19 @@ const routes = [
{
path: '/',
component: MainView,
children: [
{
path: '/messages',
name: 'userMessages',
component: () => import('@/views/messages/MessageList.vue'),
redirect: '/messages/index',
children: [
{
path: '/messages/index',
name: 'msgDefault',
component: () => import('@/views/messages/MessageDefault.vue')
},
{
path: '/messages/chat/:id',
name: '/msgChat',

View File

@ -47,8 +47,12 @@ api.interceptors.response.use(
message.error('请求错误,请检查网络。');
break;
}
return Promise.reject(err);
} else {
message.error('请求错误,请检查网络。');
return Promise.reject(err);
}
return Promise.reject(err);
}
)

View File

@ -0,0 +1,15 @@
import { request } from "./api";
export const messageService = {
/**
* 获取当前用户会话
* @returns
*/
getConversations: () => request.get('/conversation/list'),
/**
* 清空所有会话消息
* @returns
*/
clearConversation: () => request.post('')
}

View File

@ -96,7 +96,7 @@ const handleLogin = async () => {
if(res.code === 0){ // Assuming 0 is success
message.success('登录成功')
authStore.setLoginInfo(res.data.token, res.data.refreshToken, res.data.userInfo);
router.push('/')
router.push('/messages')
}else{
message.error(res.message || '登录失败')
}

View File

@ -0,0 +1,57 @@
<template>
<div class="empty-container">
<div class="empty-content">
<div class="empty-icon">
<svg viewBox="0 0 100 100" width="100" height="100">
<circle cx="50" cy="50" r="48" fill="none" stroke="#e2e2e2" stroke-width="2" />
<path d="M30 40 Q30 30 45 30 L65 30 Q75 30 75 40 L75 55 Q75 65 60 65 L45 80 L45 65 L35 65 Q30 65 30 55 Z"
fill="#f0f0f0" stroke="#dcdcdc" stroke-width="2" />
</svg>
</div>
<h2 class="empty-title">未选中会话</h2>
<p class="empty-tips">请从左侧列表中选择一个联系人开始聊天</p>
</div>
</div>
</template>
<style scoped>
.empty-container {
display: flex;
flex: 1;
height: 100%;
background-color: #f5f5f5; /* 与聊天列表右侧背景保持一致 */
align-items: center;
justify-content: center;
user-select: none;
}
.empty-content {
text-align: center;
/* 稍微上移一点,视觉中心更平衡 */
margin-top: -40px;
}
.empty-icon {
margin-bottom: 20px;
opacity: 0.8;
animation: fadeIn 0.8s ease-out;
}
.empty-title {
font-size: 18px;
color: #333;
font-weight: 400;
margin-bottom: 8px;
}
.empty-tips {
font-size: 14px;
color: #999;
}
/* 入场动画,增加平滑感 */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 0.8; transform: translateY(0); }
}
</style>