一、创建数据库
首先,可以使用SQL Server Management Studio创建一个新的数据库(MyDatabase) 以及三个表(Users, Messages, UserMessageStatus),分别用于存储用户信息,消息信息以及用户消息状态。
Users表
该表包含了所有注册用户的信息。
Field | Type |
---|---|
id | int (PK) |
username | varchar(50) |
password | varchar(50) |
Messages表
该表存储了所有的消息信息。
Field | Type |
---|---|
id | int (PK) |
title | varchar(50) |
content | varchar(500) |
created_time | datetime |
UserMessageStatus表
该表用于记录每个用户与每个消息的关系,以及他们对消息的阅读状态。
Field | Type |
---|---|
id | int (PK) |
user_id | int (FK) |
message_id | int (FK) |
status | varchar(10) |
其中,FK代表外键。
- 添加数据
在Users和Messages表中添加数据。
INSERT INTO Users VALUES (1, 'user1', 'password1') INSERT INTO Users VALUES (2, 'user2', 'password2')
INSERT INTO Messages VALUES (1, 'Message 1', 'This is message 1', '2023-06-06 10:00:00') INSERT INTO Messages VALUES (2, 'Message 2', 'This is message 2', '2023-06-05 10:00:00') INSERT INTO Messages VALUES (3, 'Message 3', 'This is message 3', '2023-06-04 10:00:00')
二、构建应用程序
现在,可以使用C#编写一个程序来实现用户登录以及消息的阅读状态更新。
首先,创建一个User类,用于表示用户信息。
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
然后,创建一个Message类,用于表示消息信息。
public class Message
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime CreatedTime { get; set; }
}
创建一个UserMessageStatus类,用于表示用户与消息之间的关系。
public class UserMessageStatus
{
public int Id { get; set; }
public int UserId { get; set; }
public int MessageId { get; set; }
public string Status { get; set; }
}
接下来,定义一个数据访问类,用于操作数据库中的数据。
public class DataAccess
{
private readonly string connectionString = "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;";
public List<User> GetUsers()
{
string query = "SELECT * FROM Users";
using (SqlConnection connection = new SqlConnection(connectionString))
{
List<User> users = connection.Query<User>(query).ToList();
return users;
}
}
public List<Message> GetMessages()
{
string query = "SELECT * FROM Messages";
using (SqlConnection connection = new SqlConnection(connectionString))
{
List<Message> messages = connection.Query<Message>(query).ToList();
return messages;
}
}
public List<UserMessageStatus> GetUserMessageStatus(int userId)
{
string query = $"SELECT * FROM UserMessageStatus WHERE user_id = {userId}";
using (SqlConnection connection = new SqlConnection(connectionString))
{
List<UserMessageStatus> userMessageStatuses = connection.Query<UserMessageStatus>(query).ToList();
return userMessageStatuses;
}
}
public void UpdateUserMessageStatus(int userId, int messageId)
{
string query = $"UPDATE UserMessageStatus SET status = 'Read' WHERE user_id = {userId} AND message_id = {messageId}";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Execute(query);
}
}
}
其中,GetUsers() 用于获取所有注册用户;GetMessages() 用于获取所有消息;GetUserMessageStatus(userId) 用于获取给定用户的所有消息状态;UpdateUserMessageStatus(userId, messageId) 用于将给定消息标记为已读。
最后,创建一个主程序,以便用户可以登录,查看消息并标记为已读。
class Program
{
static void Main(string[] args)
{
DataAccess dataAccess = new DataAccess();
Console.WriteLine("Please log in:");
Console.Write("Username: ");
string username = Console.ReadLine();
Console.Write("Password: ");
string password = Console.ReadLine();
List<User> users = dataAccess.GetUsers();
User user = users.SingleOrDefault(u => u.Username == username && u.Password == password);
if (user == null)
{
Console.WriteLine("Invalid user.");
return;
}
List<Message> messages = dataAccess.GetMessages();
foreach (Message message in messages)
{
List<UserMessageStatus> userMessageStatuses = dataAccess.GetUserMessageStatus(user.Id);
UserMessageStatus userMessageStatus = userMessageStatuses.SingleOrDefault(ums => ums.MessageId == message.Id);
if (userMessageStatus != null && userMessageStatus.Status == "Read")
{
Console.WriteLine("[Read] {0} - {1} ({2})", message.CreatedTime, message.Title, message.Content);
}
else
{
Console.WriteLine("[Unread] {0} - {1} ({2})", message.CreatedTime, message.Title, message.Content);
}
}
Console.Write("Enter the ID of the message you want to mark as read: ");
int messageId = int.Parse(Console.ReadLine());
dataAccess.UpdateUserMessageStatus(user.Id, messageId);
Console.WriteLine("Message marked as read.");
}
}
该程序首先要求用户进行登录,然后加载所有的消息并将它们按阅读状态分组。如果该消息已被该用户标记为已读,则显示[Read]标记。否则,显示[Unread]标记。最后,用户可以输入要将其标记为已读的消息的 ID。
在用户将消息标记为已读后,程序将调用UpdateUserMessageStatus方法,并将消息的ID和用户的ID传递给该方法,以便将消息的状态更新为“Read”。
三、效果演示:
1、运行程序,首先登录账号user2,password2,登录后可以看到有3条未读信息,如下所示:
2、选择第3条数据设置为已读,输入3后点回车后程序会关闭,如下所示:
3、再次运行程序查看,状态修改成功