初步实现统一的数据接入层,方便后面的数据表添加操作。考虑可复用的统一逻辑

simpledesign
nxiaoxiao 1 year ago
parent 2a0fa4e7a0
commit 2771293732

@ -4,7 +4,7 @@ namespace OMS.NET.Common
{ {
private static readonly int _logLevel = 3; //debug private static readonly int _logLevel = 3; //debug
private static int logCount = 0; private static int logCount = 0;
private static string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", $"{DateTime.Now:yyyy-MM-dd-HH-mm-ss}.log"); private static string logPath = GetNewLogFile();
private static readonly object LogLock = new(); private static readonly object LogLock = new();
private static void WriteLogToFile(string message) private static void WriteLogToFile(string message)

@ -1,112 +0,0 @@
using MySql.Data.MySqlClient;
namespace OMS.NET.DbClass
{
public class AccountData
{
#region base
public string UserEmail { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int? MapLayer { get; set; }
public string? DefaultA1 { get; set; }
public string? SavePoint { get; set; }
public string? UserQQ { get; set; }
public string? HeadColor { get; set; }
public int Mode { get; set; }
public int Phase { get; set; }
public string? Custom { get; set; }
public AccountData()
{
this.UserEmail = "";
this.UserName = "";
this.Password = "";
this.Mode = 1;
this.Phase = 1;
//this.Custom = "";
}
#endregion
public static void Add(AccountData accountData)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"INSERT INTO account_data (user_email, user_name, pass_word, map_layer, default_a1, save_point, user_qq, head_color, mode, phase, custom)
VALUES (@UserEmail, @UserName, @Password, @MapLayer, @DefaultA1, @SavePoint, @UserQQ, @HeadColor, @Mode, @Phase, @Custom)";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@UserEmail", accountData.UserEmail);
command.Parameters.AddWithValue("@UserName", accountData.UserName);
command.Parameters.AddWithValue("@Password", accountData.Password);
command.Parameters.AddWithValue("@MapLayer", accountData.MapLayer ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@DefaultA1", accountData.DefaultA1 ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@SavePoint", accountData.SavePoint ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@UserQQ", accountData.UserQQ ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@HeadColor", accountData.HeadColor ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Mode", accountData.Mode);
command.Parameters.AddWithValue("@Phase", accountData.Phase);
command.Parameters.AddWithValue("@Custom", accountData.Custom ?? (object)DBNull.Value);
command.ExecuteNonQuery();
}
public static void Update(AccountData accountData)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"UPDATE account_data SET user_name = @UserName, pass_word = @Password, map_layer = @MapLayer, default_a1 = @DefaultA1, save_point = @SavePoint, user_qq = @UserQQ, head_color = @HeadColor, mode = @Mode, phase = @Phase, custom = @Custom
WHERE user_email = @UserEmail";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@UserEmail", accountData.UserEmail);
command.Parameters.AddWithValue("@UserName", accountData.UserName);
command.Parameters.AddWithValue("@Password", accountData.Password);
command.Parameters.AddWithValue("@MapLayer", accountData.MapLayer ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@DefaultA1", accountData.DefaultA1 ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@SavePoint", accountData.SavePoint ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@UserQQ", accountData.UserQQ ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@HeadColor", accountData.HeadColor ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Mode", accountData.Mode);
command.Parameters.AddWithValue("@Phase", accountData.Phase);
command.Parameters.AddWithValue("@Custom", accountData.Custom ?? (object)DBNull.Value);
command.ExecuteNonQuery();
}
public static void Delete(string userEmail)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"DELETE FROM account_data WHERE user_email = @UserEmail";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@UserEmail", userEmail);
command.ExecuteNonQuery();
}
public static AccountData? Get(string userEmail)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"SELECT user_email, user_name, pass_word, map_layer, default_a1, save_point, user_qq, head_color, mode, phase, custom
FROM account_data WHERE user_email = @UserEmail";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@UserEmail", userEmail);
using var reader = command.ExecuteReader();
if (reader.Read())
{
return new AccountData
{
UserEmail = reader.GetString("user_email"),
UserName = reader.GetString("user_name"),
Password = reader.GetString("pass_word"),
MapLayer = reader["map_layer"] as int?,
DefaultA1 = reader["default_a1"] as string,
SavePoint = reader["save_point"] as string,
UserQQ = reader["user_qq"] as string,
HeadColor = reader["head_color"] as string,
Mode = reader.GetInt32("mode"),
Phase = reader.GetInt32("phase"),
Custom = reader["custom"] as string,
};
}
return null;
}
}
}

@ -0,0 +1,255 @@
using System.Reflection;
using MySql.Data.MySqlClient;
using OMS.NET.Common;
namespace OMS.NET.DbClass
{
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class TableAttribute : Attribute
{
public string TableName { get; }
public TableAttribute(string tableName)
{
TableName = tableName;
}
}
[AttributeUsage(AttributeTargets.Property, Inherited = false)]
public class ColumnAttribute : Attribute
{
public string ColumnName { get; }
public bool IsPrimaryKey { get; }
public bool IsIdentity { get; } // 是否自增列
public ColumnAttribute(string columnName, bool isPrimaryKey = false, bool isIdentity = false)
{
ColumnName = columnName;
IsPrimaryKey = isPrimaryKey;
IsIdentity = isIdentity;
}
}
public class BaseObject
{
private static string GetTableName(Type type)
{
var attr = type.GetCustomAttribute<TableAttribute>();
return attr?.TableName ?? throw new Exception($"{type.Name} 没有指定数据表");
}
private static IEnumerable<PropertyInfo> GetProperties(Type type)
{
return type.GetProperties()
.Where(p => p.GetCustomAttribute<ColumnAttribute>() != null);
}
private static PropertyInfo GetPrimaryKeyProperties(Type type)
{
var primaryKeyProperties = GetProperties(type)
.Where(p => p.GetCustomAttribute<ColumnAttribute>()?.IsPrimaryKey == true)
.ToList();
if (primaryKeyProperties.Count == 0)
{
throw new InvalidOperationException("No primary key defined for the class.");
}
if (primaryKeyProperties.Count != 1)
{
throw new InvalidOperationException("Multiple primary keys defined for the class. Only one primary key is allowed.");
}
return primaryKeyProperties.First();
}
private static IEnumerable<PropertyInfo> GetNonKeyProperties(Type type)
{
return GetProperties(type)
.Where(p => p.GetCustomAttribute<ColumnAttribute>()?.IsPrimaryKey == false);
}
private static PropertyInfo? GetIdentityKeyProperty(Type type)
{
var primaryKey = GetPrimaryKeyProperties(type);
return (primaryKey.GetCustomAttribute<ColumnAttribute>()!.IsIdentity == true) ? null : primaryKey;
}
private static string GetInsertSql(Type type)
{
var tableName = GetTableName(type);
var identityKey = GetIdentityKeyProperty(type);
var columns = GetNonKeyProperties(type)
.Select(p => p.GetCustomAttribute<ColumnAttribute>()!.ColumnName).ToList();
var values = GetNonKeyProperties(type)
.Select(p => "@" + p.Name).ToList();
if (identityKey != null)
{
// Exclude the identity key from columns and values for insert statement
columns.Add(identityKey.GetCustomAttribute<ColumnAttribute>()!.ColumnName);
values.Add("@" + identityKey.Name);
}
return $"INSERT INTO {tableName} ({string.Join(", ", columns)}) VALUES ({string.Join(", ", values)})";
}
private static string GetUpdateSql(Type type)
{
var tableName = GetTableName(type);
var setClause = string.Join(", ",
GetNonKeyProperties(type)
.Select(p => $"{p.GetCustomAttribute<ColumnAttribute>()!.ColumnName} = @{p.Name}"));
var primaryKey = GetPrimaryKeyProperties(type);
var whereClause = $"{primaryKey.GetCustomAttribute<ColumnAttribute>()!.ColumnName} = @{primaryKey.Name}";
return $"UPDATE {tableName} SET {setClause} WHERE {whereClause}";
}
private static string GetDeleteSql(Type type)
{
var tableName = GetTableName(type);
var primaryKey = GetPrimaryKeyProperties(type);
var whereClause = $"{primaryKey.GetCustomAttribute<ColumnAttribute>()!.ColumnName} = @{primaryKey.Name}";
return $"DELETE FROM {tableName} WHERE {whereClause}";
}
private static string GetSelectSql(Type type)
{
var tableName = GetTableName(type);
var columns = string.Join(", ",
GetProperties(type)
.Select(p => p.GetCustomAttribute<ColumnAttribute>()!.ColumnName));
return $"SELECT {columns} FROM {tableName}";
}
private static string GetSelectSqlWithPrimaryKey(Type type)
{
var tableName = GetTableName(type);
var columns = string.Join(", ",
GetProperties(type)
.Select(p => p.GetCustomAttribute<ColumnAttribute>()!.ColumnName));
var primaryKey = GetPrimaryKeyProperties(type);
var whereClause = $"{primaryKey.GetCustomAttribute<ColumnAttribute>()!.ColumnName} = @{primaryKey.Name}";
return $"SELECT {columns} FROM {tableName} WHERE {whereClause}";
}
public void Test()
{
Console.WriteLine("===========this is a test area=================");
Console.WriteLine(GetInsertSql(GetType()));
Console.WriteLine(GetDeleteSql(GetType()));
Console.WriteLine(GetUpdateSql(GetType()));
Console.WriteLine(GetSelectSql(GetType()));
Console.WriteLine(GetSelectSqlWithPrimaryKey(GetType()));
Console.WriteLine("===========this is a test area=================");
}
public virtual void Insert()
{
var type = GetType();
var insertSql = GetInsertSql(GetType());
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open(); // 确保在执行命令之前打开连接
using var command = new MySqlCommand(insertSql, connection);
AddParameters(command);
Console.WriteLine($"SQL: {command.CommandText}");
foreach (MySqlParameter param in command.Parameters)
{
Console.WriteLine($"Parameter: {param.ParameterName}, Value: {param.Value}");
}
command.ExecuteNonQuery();
Log.Info($"{GetTableName(type)}数据表插入({string.Join(',', ShowDetail())})");
}
public virtual void Update()
{
var type = GetType();
var updateSql = GetUpdateSql(GetType());
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open(); // 确保在执行命令之前打开连接
using var command = new MySqlCommand(updateSql, connection);
AddParameters(command);
command.ExecuteNonQuery();
Log.Info($"{GetTableName(type)}数据表修改({string.Join(',', ShowDetail())})");
}
public virtual void Delete()
{
var type = GetType();
var deleteSql = GetDeleteSql(GetType());
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open(); // 确保在执行命令之前打开连接
using var command = new MySqlCommand(deleteSql, connection);
AddParameters(command);
command.ExecuteNonQuery();
Log.Info($"{GetTableName(type)}数据表删除({string.Join(',', ShowDetail())})");
}
public static IEnumerable<T> SelectAll<T>() where T : BaseObject, new()
{
var type = typeof(T);
var selectSql = GetSelectSql(type);
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open(); // 确保在执行命令之前打开连接
using var command = new MySqlCommand(selectSql, connection);
using var reader = command.ExecuteReader();
var results = new List<T>();
while (reader.Read())
{
var item = new T();
PopulateObject(reader, item);
results.Add(item);
}
return results;
}
public static T? Get<T>(object key) where T : BaseObject, new()
{
var type = typeof(T);
var selectSql = GetSelectSqlWithPrimaryKey(type);
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open(); // 确保在执行命令之前打开连接
using var command = new MySqlCommand(selectSql, connection);
var primaryKey = GetPrimaryKeyProperties(type);
command.Parameters.AddWithValue("@" + primaryKey.GetCustomAttribute<ColumnAttribute>()!.ColumnName, key);
using var reader = command.ExecuteReader();
while (reader.Read())
{
var item = new T();
PopulateObject(reader, item);
return item;
}
return null;
}
private void AddParameters(MySqlCommand command)
{
foreach (var property in GetProperties(GetType()))
{
//var columnAttr = property.GetCustomAttribute<ColumnAttribute>()!;
command.Parameters.AddWithValue("@" + property.Name, property.GetValue(this));
}
}
private IEnumerable<string> ShowDetail()
{
return GetProperties(GetType()).Select(p => $"{p.Name}={p.GetValue(this)}");
}
private static void PopulateObject(MySqlDataReader reader, BaseObject obj)
{
var type = obj.GetType();
foreach (var property in GetProperties(type))
{
var columnAttr = property.GetCustomAttribute<ColumnAttribute>()!;
var value = reader[columnAttr.ColumnName];
if (value != DBNull.Value)
{
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType));
}
}
}
}
}

@ -0,0 +1,28 @@
namespace OMS.NET.DbClass
{
[Table("map_data")]
public class Map : BaseObject
{
[Column("id", true)] // Primary Key and Identity false
public string Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("description")]
public string Description { get; set; }
public Map()
{
Id = "";
Name = "";
Description = "";
}
public Map(string key, string name, string description)
{
Id = key;
Name = name;
Description = description;
}
}
}

@ -1,155 +0,0 @@
using MySql.Data.MySqlClient;
namespace OMS.NET.DbClass
{
public class MapData
{
#region base
public long Id { get; set; }
public string Type { get; set; }
public string Points { get; set; }
public string Point { get; set; }
public string? Color { get; set; }
public int Phase { get; set; }
public int? Width { get; set; }
public string? ChildRelations { get; set; }
public string? FatherRelations { get; set; }
public string? ChildNodes { get; set; }
public string? FatherNode { get; set; }
public string? Details { get; set; }
public string? Custom { get; set; }
public MapData()
{
this.Id = -1;
this.Type = "";
this.Points = "";
this.Point = "";
this.Phase = 1;
}
#endregion
public static void Add(MapData mapData)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"INSERT INTO map_0_data (type, points, point, color, phase, width, child_relations, father_relations, child_nodes, father_node, details, custom)
VALUES (@Type, @Points, @Point, @Color, @Phase, @Width, @ChildRelations, @FatherRelations, @ChildNodes, @FatherNode, @Details, @Custom)";
using MySqlCommand command = new(query, connection);
command.Parameters.AddWithValue("@Type", mapData.Type);
command.Parameters.AddWithValue("@Points", mapData.Points);
command.Parameters.AddWithValue("@Point", mapData.Point);
command.Parameters.AddWithValue("@Color", mapData.Color ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Phase", mapData.Phase);
command.Parameters.AddWithValue("@Width", mapData.Width ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@ChildRelations", mapData.ChildRelations ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@FatherRelations", mapData.FatherRelations ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@ChildNodes", mapData.ChildNodes ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@FatherNode", mapData.FatherNode ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Details", mapData.Details ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Custom", mapData.Custom ?? (object)DBNull.Value);
command.ExecuteNonQuery();
mapData.Id = command.LastInsertedId;
}
public static int Update(MapData mapData)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"UPDATE map_0_data SET type = @Type, points = @Points, point = @Point, color = @Color, phase = @Phase, width = @Width,
child_relations = @ChildRelations, father_relations = @FatherRelations, child_nodes = @ChildNodes, father_node = @FatherNode,
details = @Details, custom = @Custom WHERE id = @Id";
using MySqlCommand command = new(query, connection);
command.Parameters.AddWithValue("@Id", mapData.Id);
command.Parameters.AddWithValue("@Type", mapData.Type);
command.Parameters.AddWithValue("@Points", mapData.Points);
command.Parameters.AddWithValue("@Point", mapData.Point);
command.Parameters.AddWithValue("@Color", mapData.Color ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Phase", mapData.Phase);
command.Parameters.AddWithValue("@Width", mapData.Width ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@ChildRelations", mapData.ChildRelations ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@FatherRelations", mapData.FatherRelations ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@ChildNodes", mapData.ChildNodes ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@FatherNode", mapData.FatherNode ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Details", mapData.Details ?? (object)DBNull.Value);
command.Parameters.AddWithValue("@Custom", mapData.Custom ?? (object)DBNull.Value);
return command.ExecuteNonQuery();
}
public static void Delete(long id)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"DELETE FROM map_0_data WHERE id = @Id";
using MySqlCommand command = new(query, connection);
command.Parameters.AddWithValue("@Id", id);
command.ExecuteNonQuery();
}
public static MapData? Get(long id)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"SELECT id, type, points, point, color, phase, width, child_relations, father_relations, child_nodes, father_node, details, custom
FROM map_0_data WHERE id = @Id";
using MySqlCommand command = new(query, connection);
command.Parameters.AddWithValue("@Id", id);
using MySqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
return new MapData
{
Id = reader.GetInt64("id"),
Type = reader.GetString("type"),
Points = reader.GetString("points"),
Point = reader.GetString("point"),
Color = reader["color"] as string,
Phase = reader.GetInt32("phase"),
Width = reader["width"] as int?,
ChildRelations = reader["child_relations"] as string,
FatherRelations = reader["father_relations"] as string,
ChildNodes = reader["child_nodes"] as string,
FatherNode = reader["father_node"] as string,
Details = reader["details"] as string,
Custom = reader["custom"] as string
};
}
return null;
}
public static List<MapData> GetMapDataList()
{
List<MapData> mapDataList = new();
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"SELECT * FROM map_0_data";
using var command = new MySqlCommand(query, connection);
using var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
var mapData = new MapData
{
Id = reader.GetInt64("id"),
Type = reader.GetString("type"),
Points = reader.GetString("points"),
Point = reader.GetString("point"),
Color = reader.IsDBNull(reader.GetOrdinal("color")) ? null : reader.GetString("color"),
Phase = reader.GetInt32("phase"),
Width = reader.IsDBNull(reader.GetOrdinal("width")) ? (int?)null : reader.GetInt32("width"),
ChildRelations = reader.IsDBNull(reader.GetOrdinal("child_relations")) ? null : reader.GetString("child_relations"),
FatherRelations = reader.IsDBNull(reader.GetOrdinal("father_relations")) ? null : reader.GetString("father_relations"),
ChildNodes = reader.IsDBNull(reader.GetOrdinal("child_nodes")) ? null : reader.GetString("child_nodes"),
FatherNode = reader.IsDBNull(reader.GetOrdinal("father_node")) ? null : reader.GetString("father_node"),
Details = reader.IsDBNull(reader.GetOrdinal("details")) ? null : reader.GetString("details"),
Custom = reader.IsDBNull(reader.GetOrdinal("custom")) ? null : reader.GetString("custom")
};
mapDataList.Add(mapData);
}
}
return mapDataList;
}
}
}

@ -1,142 +0,0 @@
using MySql.Data.MySqlClient;
namespace OMS.NET.DbClass
{
public class MapLayer
{
#region base
public long Id { get; set; }
public string Type { get; set; }
public string Members { get; set; }
public string Structure { get; set; }
public int Phase { get; set; }
public MapLayer()
{
this.Id = 0;
this.Type = "";
this.Members = "";
this.Structure = "";
this.Phase = 1;
}
public MapLayer(long id, string type, string members, string structure, int phase)
{
Id = id;
Type = type;
Members = members;
Structure = structure;
Phase = phase;
}
#endregion
public static void Add(MapLayer mapLayer)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"INSERT INTO map_0_layer (type, members, structure, phase)
VALUES (@Type, @Members, @Structure, @Phase)";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@Type", mapLayer.Type);
command.Parameters.AddWithValue("@Members", mapLayer.Members);
command.Parameters.AddWithValue("@Structure", mapLayer.Structure);
command.Parameters.AddWithValue("@Phase", mapLayer.Phase);
command.ExecuteNonQuery();
mapLayer.Id = command.LastInsertedId;
}
public static void Update(MapLayer mapLayer)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"UPDATE map_0_layer SET type = @Type, members = @Members, structure = @Structure, phase = @Phase
WHERE id = @Id";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", mapLayer.Id);
command.Parameters.AddWithValue("@Type", mapLayer.Type);
command.Parameters.AddWithValue("@Members", mapLayer.Members);
command.Parameters.AddWithValue("@Structure", mapLayer.Structure);
command.Parameters.AddWithValue("@Phase", mapLayer.Phase);
command.ExecuteNonQuery();
}
public static void Delete(long id)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"DELETE FROM map_0_layer WHERE id = @Id";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", id);
command.ExecuteNonQuery();
}
public static MapLayer? Get(long id)
{
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
var query = @"SELECT id, type, members, structure, phase FROM map_0_layer WHERE id = @Id";
using var command = new MySqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", id);
using var reader = command.ExecuteReader();
if (reader.Read())
{
return new MapLayer
{
Id = reader.GetInt64("id"),
Type = reader.GetString("type"),
Members = reader.GetString("members"),
Structure = reader.GetString("structure"),
Phase = reader.GetInt32("phase")
};
}
return null;
}
/// <summary>
/// 获取所有MapLayer数据
/// </summary>
/// <returns></returns>
public static List<MapLayer> GetMapLayerList()
{
List<MapLayer> mapLayerList = new();
using MySqlConnection connection = new(GlobalArea.ConnectionStringWithDbName);
connection.Open();
string query = "SELECT * FROM map_0_layer";
using var command = new MySqlCommand(query, connection);
using var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
var mapLayer = new MapLayer
{
Id = reader.GetInt64("id"),
Type = reader.GetString("type"),
Members = reader.GetString("members"),
Structure = reader.GetString("structure"),
Phase = reader.GetInt32("phase")
};
mapLayerList.Add(mapLayer);
}
}
return mapLayerList;
}
/// <summary>
/// 指定是否将指定字段编码成base64格式 ???
/// </summary>
public static void ProcessMapLayers(List<MapLayer> mapLayers, bool encode = false)
{
mapLayers.ForEach(mapLayer =>
{
if (encode)
{
}
else
{
}
});
}
}
}

@ -1,4 +1,4 @@
using OMS.NET.DbClass; using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
@ -15,12 +15,7 @@ namespace OMS.NET.Instructs
{ {
if (GlobalArea.LoginCheckByID(wsid)) if (GlobalArea.LoginCheckByID(wsid))
{ {
List<MapData> mapDatas = MapData.GetMapDataList().Where(m => m.Phase != 2).ToList();
this.ResponseOrBroadcastInstructs.Add(new SendMapDataInstruct()
{
IsResponse = true,
Data = mapDatas
});
} }
}); });
} }

@ -1,4 +1,4 @@
using OMS.NET.DbClass; using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
@ -15,12 +15,7 @@ namespace OMS.NET.Instructs
{ {
if (GlobalArea.LoginCheckByID(wsid)) if (GlobalArea.LoginCheckByID(wsid))
{ {
List<MapLayer> mapLayers = MapLayer.GetMapLayerList().Where(m => m.Phase != 2).ToList();
this.ResponseOrBroadcastInstructs.Add(new SendMapLayerInstruct()
{
IsResponse = true,
Data = mapLayers
});
} }
}); });
} }

@ -1,3 +1,5 @@
using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
public class GetPublickeyInstruct : Instruct public class GetPublickeyInstruct : Instruct

@ -1,4 +1,4 @@
using OMS.NET.DbClass; using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
@ -16,23 +16,6 @@ namespace OMS.NET.Instructs
if (GlobalArea.LoginCheckByID(wsid)) if (GlobalArea.LoginCheckByID(wsid))
{ {
string userEmail = GlobalArea.UserConnects.First(u => u.ID == wsid).UserEmail!; string userEmail = GlobalArea.UserConnects.First(u => u.ID == wsid).UserEmail!;
AccountData accountData = GlobalArea.GetLoginAccountData(userEmail)!;
this.ResponseOrBroadcastInstructs.Add(new SendUserDataInstruct()
{
IsResponse = true,
Data = new
{
user_email = accountData.UserEmail,
user_name = accountData.UserName,
map_layer = accountData.MapLayer,
default_a1 = accountData.DefaultA1,
save_point = accountData.SavePoint,
head_color = accountData.HeadColor,
mode = accountData.Mode,
phase = accountData.Phase,
custom = accountData.Custom,
}
});
} }
}); });
} }

@ -1,6 +1,7 @@
using System.Diagnostics; using System.Diagnostics;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
@ -43,29 +44,14 @@ namespace OMS.NET.Instructs
{ {
//实现新指令需在这里添加反序列化类型,限定为客户端发过来的指令类型 //实现新指令需在这里添加反序列化类型,限定为客户端发过来的指令类型
"get_publickey" => JsonSerializer.Deserialize<GetPublickeyInstruct>(root.GetRawText(), options), "get_publickey" => JsonSerializer.Deserialize<GetPublickeyInstruct>(root.GetRawText(), options),
"get_serverImg" => JsonSerializer.Deserialize<GetServerImgInstruct>(root.GetRawText(), options),
"get_serverConfig" => JsonSerializer.Deserialize<GetServerConfigInstruct>(root.GetRawText(), options),
"login" => JsonSerializer.Deserialize<LoginInstruct>(root.GetRawText(), options), "login" => JsonSerializer.Deserialize<LoginInstruct>(root.GetRawText(), options),
"test" => JsonSerializer.Deserialize<TestInstruct>(root.GetRawText(), options), "test" => JsonSerializer.Deserialize<TestInstruct>(root.GetRawText(), options),
"get_userData" => JsonSerializer.Deserialize<GetUserDataInstruct>(root.GetRawText(), options), "get_userData" => JsonSerializer.Deserialize<GetUserDataInstruct>(root.GetRawText(), options),
"get_presence" => JsonSerializer.Deserialize<GetPresenceInstruct>(root.GetRawText(), options),
"get_mapData" => JsonSerializer.Deserialize<GetMapDataInstruct>(root.GetRawText(), options), "get_mapData" => JsonSerializer.Deserialize<GetMapDataInstruct>(root.GetRawText(), options),
"get_mapLayer" => JsonSerializer.Deserialize<GetMapLayerInstruct>(root.GetRawText(), options), "get_mapLayer" => JsonSerializer.Deserialize<GetMapLayerInstruct>(root.GetRawText(), options),
"ping" => JsonSerializer.Deserialize<PingInstuct>(root.GetRawText(), options),
//广播指令
"broadcast" => classValue switch
{
//广播指令继承结构
"point" => JsonSerializer.Deserialize<AddElementBroadcastInstruct>(root.GetRawText(), options),
"line" => JsonSerializer.Deserialize<AddElementBroadcastInstruct>(root.GetRawText(), options),
"area" => JsonSerializer.Deserialize<AddElementBroadcastInstruct>(root.GetRawText(), options),
"curve" => JsonSerializer.Deserialize<AddElementBroadcastInstruct>(root.GetRawText(), options),
_ => JsonSerializer.Deserialize<Instruct>(root.GetRawText(), options)
},
_ => null _ => null
} ?? throw new JsonException($"{typeValue} 反序列化失败"); };
return instruct; return instruct ?? throw new JsonException($"{typeValue} 反序列化失败");
} }
else else
{ {
@ -144,7 +130,7 @@ namespace OMS.NET.Instructs
stopWatch.Start(); stopWatch.Start();
await Handler(wsid); await Handler(wsid);
stopWatch.Stop(); stopWatch.Stop();
GlobalArea.Log.Debug($"处理{this.GetType()}耗时:{stopWatch.ElapsedMilliseconds}ms"); Log.Debug($"处理{this.GetType()}耗时:{stopWatch.ElapsedMilliseconds}ms");
} }
public string ToJsonString() public string ToJsonString()
@ -160,7 +146,7 @@ namespace OMS.NET.Instructs
} }
catch (Exception ex) catch (Exception ex)
{ {
GlobalArea.Log.Error(ex.Message); Log.Error(ex.Message);
return null; return null;
} }
} }

@ -1,6 +1,6 @@
using System.Text.Json; using System.Text.Json;
using OMS.NET.DbClass; using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
@ -24,47 +24,9 @@ namespace OMS.NET.Instructs
string password = this.Data.GetProperty("password").GetString(); string password = this.Data.GetProperty("password").GetString();
if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password))
{ {
GlobalArea.Log.Warn("登录信息不能为空!"); Log.Warn("登录信息不能为空!");
return; return;
} }
//能够获取到则说明客户端有发送数据过来
Instruct res1 = new LoginStatusInstuct
{
Data = false,
IsResponse = true
};//默认为false
//Console.WriteLine($"已获取到{email}:{password},解密测试{GlobalArea.DecryptFromBase64String(password)}");
AccountData? accountData = AccountData.Get(email);
GlobalArea.AddLoginAccountData(accountData);
if (accountData != null)
{
//只能原文比较,密文每次都不一样,涉及随机性填充
if (accountData.Password == GlobalArea.DecryptFromBase64String(password))
{
res1.Data = true;//登录成功则修改为true
this.ResponseOrBroadcastInstructs.Add(res1);
GlobalArea.Log.Info($"{accountData.UserEmail}:登录成功");
GlobalArea.Login(wsid, accountData.UserEmail);
GlobalArea.Log.Info($"当前登录用户数量: {GlobalArea.LoginUserCount}");
this.ResponseOrBroadcastInstructs.Add(new Instruct
{
Type = "broadcast",
Class = "logIn",
Data = new
{
userEmail = accountData.UserEmail,
userName = accountData.UserName,
headColor = accountData.HeadColor,
userQq = accountData.UserQQ,
},
IsBroadcast = true
});
}
else
{
this.ResponseOrBroadcastInstructs.Add(res1);
}
}
} }
}); });
} }

@ -1,3 +1,5 @@
using OMS.NET.Common;
namespace OMS.NET.Instructs namespace OMS.NET.Instructs
{ {
/// <summary> /// <summary>
@ -15,8 +17,8 @@ namespace OMS.NET.Instructs
return Task.Run(() => return Task.Run(() =>
{ {
//GlobalArea.UserConnects.Where(x => x.ID == wsid).First().UserEmail = "xxx@xx.com";//login //GlobalArea.UserConnects.Where(x => x.ID == wsid).First().UserEmail = "xxx@xx.com";//login
GlobalArea.Log.Info("当前客户端连接数:" + GlobalArea.ConnectClientsCount); Log.Info("当前客户端连接数:" + GlobalArea.ConnectClientsCount);
GlobalArea.Log.Info("当前登录用户数:" + GlobalArea.LoginUserCount); Log.Info("当前登录用户数:" + GlobalArea.LoginUserCount);
}); });
} }
} }

@ -19,8 +19,5 @@
<None Update="init.sql"> <None Update="init.sql">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Update="map_img.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,6 +1,7 @@
using WebSocketSharp.Server; using WebSocketSharp.Server;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using OMS.NET.Common; using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET namespace OMS.NET
{ {
@ -10,35 +11,7 @@ namespace OMS.NET
{ {
try try
{ {
GlobalArea.LoadServerConfig();//加载服务器配置 默认server.yaml MainLoop();
GlobalArea.LoadRsaPkey();//加载rsa私钥 默认.pkey
DbCheck();
//开启ws监听
var wssv = new WebSocketServer(Convert.ToInt16(GlobalArea.ServerConfig.ListenPort), false);
//wssv.SslConfiguration.ServerCertificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server.pfx"));
wssv.AddWebSocketService<MapServer>("/");
wssv.Start();
Console.WriteLine("已开启ws监听, 端口: " + GlobalArea.ServerConfig.ListenPort);
Console.WriteLine("输入exit退出程序");
bool loopFlag = true;
while (loopFlag)
{
string input = Console.ReadLine() ?? "";
switch (input.Trim())
{
case "exit":
loopFlag = false;
break;
case "logins":
Console.WriteLine("当前登录用户 " + GlobalArea.LoginUserCount);
break;
default:
break;
}
}
wssv.Stop();
} }
catch (Exception e) catch (Exception e)
{ {
@ -100,5 +73,38 @@ namespace OMS.NET
Log.Info("满足预设条件,跳过数据库检查"); Log.Info("满足预设条件,跳过数据库检查");
} }
} }
static void MainLoop()
{
GlobalArea.LoadServerConfig();//加载服务器配置 默认server.yaml
GlobalArea.LoadRsaPkey();//加载rsa私钥 默认.pkey
DbCheck();
//开启ws监听
var wssv = new WebSocketServer(Convert.ToInt16(GlobalArea.ServerConfig.ListenPort), false);
//wssv.SslConfiguration.ServerCertificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server.pfx"));
wssv.AddWebSocketService<MapServer>("/");
wssv.Start();
Console.WriteLine("已开启ws监听, 端口: " + GlobalArea.ServerConfig.ListenPort);
Console.WriteLine("输入exit退出程序");
bool loopFlag = true;
while (loopFlag)
{
string input = Console.ReadLine() ?? "";
switch (input.Trim())
{
case "exit":
loopFlag = false;
break;
case "logins":
Console.WriteLine("当前登录用户 " + GlobalArea.LoginUserCount);
break;
default:
break;
}
}
wssv.Stop();
}
} }
} }

@ -1,40 +1,6 @@
CREATE TABLE IF NOT EXISTS map_0_data ( CREATE TABLE IF NOT EXISTS map_data (
id BIGINT(20) NOT NULL AUTO_INCREMENT, id VARCHAR(255) NOT NULL,
type VARCHAR(12) NOT NULL, name VARCHAR(255) NOT NULL,
points MEDIUMTEXT NOT NULL, description VARCHAR(255) NOT NULL,
point VARCHAR(255) NOT NULL,
color VARCHAR(255),
phase INT(1) NOT NULL,
width INT(11),
child_relations MEDIUMTEXT,
father_relations VARCHAR(255),
child_nodes MEDIUMTEXT,
father_node VARCHAR(255),
details MEDIUMTEXT,
custom MEDIUMTEXT,
PRIMARY KEY (id) PRIMARY KEY (id)
); );
CREATE TABLE IF NOT EXISTS map_0_layer (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
type VARCHAR(255) NOT NULL,
members MEDIUMTEXT NOT NULL,
structure MEDIUMTEXT NOT NULL,
phase INT(1) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS account_data (
user_email VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
pass_word VARCHAR(255) NOT NULL,
map_layer INT(11),
default_a1 VARCHAR(255),
save_point MEDIUMTEXT,
user_qq VARCHAR(255),
head_color VARCHAR(6),
mode INT(1) NOT NULL,
phase INT(1) NOT NULL,
custom MEDIUMTEXT,
PRIMARY KEY (user_email)
);
Loading…
Cancel
Save