diff --git a/backend/IMTest/bin/Debug/net8.0/IMTest.dll b/backend/IMTest/bin/Debug/net8.0/IMTest.dll index 63e3e48..698670a 100644 Binary files a/backend/IMTest/bin/Debug/net8.0/IMTest.dll and b/backend/IMTest/bin/Debug/net8.0/IMTest.dll differ diff --git a/backend/IMTest/bin/Debug/net8.0/IMTest.pdb b/backend/IMTest/bin/Debug/net8.0/IMTest.pdb index f47ba12..3c5da42 100644 Binary files a/backend/IMTest/bin/Debug/net8.0/IMTest.pdb and b/backend/IMTest/bin/Debug/net8.0/IMTest.pdb differ diff --git a/backend/IMTest/bin/Debug/net8.0/IM_API.dll b/backend/IMTest/bin/Debug/net8.0/IM_API.dll index 3222751..76224c5 100644 Binary files a/backend/IMTest/bin/Debug/net8.0/IM_API.dll and b/backend/IMTest/bin/Debug/net8.0/IM_API.dll differ diff --git a/backend/IMTest/bin/Debug/net8.0/IM_API.exe b/backend/IMTest/bin/Debug/net8.0/IM_API.exe index 281e453..54ffe38 100644 Binary files a/backend/IMTest/bin/Debug/net8.0/IM_API.exe and b/backend/IMTest/bin/Debug/net8.0/IM_API.exe differ diff --git a/backend/IMTest/bin/Debug/net8.0/IM_API.pdb b/backend/IMTest/bin/Debug/net8.0/IM_API.pdb index e4a1a24..2acf00a 100644 Binary files a/backend/IMTest/bin/Debug/net8.0/IM_API.pdb and b/backend/IMTest/bin/Debug/net8.0/IM_API.pdb differ diff --git a/backend/IMTest/bin/Debug/net8.0/appsettings.json b/backend/IMTest/bin/Debug/net8.0/appsettings.json index 0ea93f2..9da907c 100644 --- a/backend/IMTest/bin/Debug/net8.0/appsettings.json +++ b/backend/IMTest/bin/Debug/net8.0/appsettings.json @@ -10,7 +10,7 @@ "Key": "YourSuperSecretKey123456784124214190!", "Issuer": "IMDemo", "Audience": "IMClients", - "AccessTokenMinutes": 15, + "AccessTokenMinutes": 30, "RefreshTokenDays": 30 }, "ConnectionStrings": { diff --git a/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfo.cs b/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfo.cs index 2c87e52..68d092d 100644 --- a/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfo.cs +++ b/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfo.cs @@ -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")] diff --git a/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfoInputs.cache b/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfoInputs.cache index 0724bdc..d02b5c0 100644 --- a/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfoInputs.cache +++ b/backend/IMTest/obj/Debug/net8.0/IMTest.AssemblyInfoInputs.cache @@ -1 +1 @@ -db83b7267fcf05069f219fdc3eec31e2a4e8928c3bd33341b22a7f66599bc599 +b9832b036b93c6518b1db1781b830178cbe943c60495856f215e90e2f16d822b diff --git a/backend/IMTest/obj/Debug/net8.0/IMTest.csproj.AssemblyReference.cache b/backend/IMTest/obj/Debug/net8.0/IMTest.csproj.AssemblyReference.cache index 5953ee7..8df7a82 100644 Binary files a/backend/IMTest/obj/Debug/net8.0/IMTest.csproj.AssemblyReference.cache and b/backend/IMTest/obj/Debug/net8.0/IMTest.csproj.AssemblyReference.cache differ diff --git a/backend/IMTest/obj/Debug/net8.0/IMTest.dll b/backend/IMTest/obj/Debug/net8.0/IMTest.dll index 63e3e48..698670a 100644 Binary files a/backend/IMTest/obj/Debug/net8.0/IMTest.dll and b/backend/IMTest/obj/Debug/net8.0/IMTest.dll differ diff --git a/backend/IMTest/obj/Debug/net8.0/IMTest.pdb b/backend/IMTest/obj/Debug/net8.0/IMTest.pdb index f47ba12..3c5da42 100644 Binary files a/backend/IMTest/obj/Debug/net8.0/IMTest.pdb and b/backend/IMTest/obj/Debug/net8.0/IMTest.pdb differ diff --git a/backend/IMTest/obj/Debug/net8.0/ref/IMTest.dll b/backend/IMTest/obj/Debug/net8.0/ref/IMTest.dll index a30bd43..105c505 100644 Binary files a/backend/IMTest/obj/Debug/net8.0/ref/IMTest.dll and b/backend/IMTest/obj/Debug/net8.0/ref/IMTest.dll differ diff --git a/backend/IMTest/obj/Debug/net8.0/refint/IMTest.dll b/backend/IMTest/obj/Debug/net8.0/refint/IMTest.dll index a30bd43..105c505 100644 Binary files a/backend/IMTest/obj/Debug/net8.0/refint/IMTest.dll and b/backend/IMTest/obj/Debug/net8.0/refint/IMTest.dll differ diff --git a/backend/IM_API/Models/Conversation.cs b/backend/IM_API/Models/Conversation.cs index 344de36..825a744 100644 --- a/backend/IM_API/Models/Conversation.cs +++ b/backend/IM_API/Models/Conversation.cs @@ -32,6 +32,10 @@ public partial class Conversation /// 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!; diff --git a/backend/IM_API/Models/ImDbContext.cs b/backend/IM_API/Models/ImDbContext.cs new file mode 100644 index 0000000..8a6901e --- /dev/null +++ b/backend/IM_API/Models/ImDbContext.cs @@ -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 options) + : base(options) + { + } + + public virtual DbSet Admins { get; set; } + + public virtual DbSet Conversations { get; set; } + + public virtual DbSet Devices { get; set; } + + public virtual DbSet Files { get; set; } + + public virtual DbSet Friends { get; set; } + + public virtual DbSet FriendRequests { get; set; } + + public virtual DbSet Groups { get; set; } + + public virtual DbSet GroupInvites { get; set; } + + public virtual DbSet GroupMembers { get; set; } + + public virtual DbSet GroupRequests { get; set; } + + public virtual DbSet LoginLogs { get; set; } + + public virtual DbSet Messages { get; set; } + + public virtual DbSet Notifications { get; set; } + + public virtual DbSet Permissions { get; set; } + + public virtual DbSet Permissionaroles { get; set; } + + public virtual DbSet Roles { get; set; } + + public virtual DbSet 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(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(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(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,3:Pad,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(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(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\n(0:待通过,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(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(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\n(0:需管理员同意,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(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(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(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(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(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\n(0:私聊,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(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(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(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(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(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); +} diff --git a/backend/IM_API/Models/User.cs b/backend/IM_API/Models/User.cs index e491ef9..c390560 100644 --- a/backend/IM_API/Models/User.cs +++ b/backend/IM_API/Models/User.cs @@ -20,7 +20,7 @@ public partial class User /// /// 用户昵称 /// - public string? NickName { get; set; } = null!; + public string? NickName { get; set; } /// /// 用户在线状态 diff --git a/frontend/web/.env b/frontend/web/.env index b61e7b0..ba350c4 100644 --- a/frontend/web/.env +++ b/frontend/web/.env @@ -1 +1 @@ -VITE_API_BASE_URL = http://localhost:5202/api \ No newline at end of file +VITE_API_BASE_URL = http://192.168.5.116:7070/api \ No newline at end of file diff --git a/frontend/web/src/router/index.js b/frontend/web/src/router/index.js index e39fea8..6a254fb 100644 --- a/frontend/web/src/router/index.js +++ b/frontend/web/src/router/index.js @@ -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', diff --git a/frontend/web/src/services/api.js b/frontend/web/src/services/api.js index 70d3c76..e0040ca 100644 --- a/frontend/web/src/services/api.js +++ b/frontend/web/src/services/api.js @@ -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); + } ) diff --git a/frontend/web/src/services/message.js b/frontend/web/src/services/message.js new file mode 100644 index 0000000..491e7f6 --- /dev/null +++ b/frontend/web/src/services/message.js @@ -0,0 +1,15 @@ +import { request } from "./api"; + +export const messageService = { + /** + * 获取当前用户会话 + * @returns + */ + getConversations: () => request.get('/conversation/list'), + + /** + * 清空所有会话消息 + * @returns + */ + clearConversation: () => request.post('') +} \ No newline at end of file diff --git a/frontend/web/src/views/auth/Login.vue b/frontend/web/src/views/auth/Login.vue index 7e20aba..c4803a6 100644 --- a/frontend/web/src/views/auth/Login.vue +++ b/frontend/web/src/views/auth/Login.vue @@ -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 || '登录失败') } diff --git a/frontend/web/src/views/messages/MessageDefault.vue b/frontend/web/src/views/messages/MessageDefault.vue new file mode 100644 index 0000000..10903ec --- /dev/null +++ b/frontend/web/src/views/messages/MessageDefault.vue @@ -0,0 +1,57 @@ + + + \ No newline at end of file