- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
356 lines
12 KiB
C#
356 lines
12 KiB
C#
using Mono.Data.Sqlite;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using DevelopEngine;
|
|
/// <summary>
|
|
/// 数据库管理类 在DBAccess工具类的基础上进一步封装适用本项目的数据库操作逻辑
|
|
/// </summary>
|
|
public class DBManager :Singleton<DBManager>
|
|
{
|
|
DBAccess sqlDB;
|
|
SqliteDataReader sqlReader;
|
|
|
|
/// <summary>
|
|
/// 文件路径
|
|
/// </summary>
|
|
/// <param name="path"></param>
|
|
public void InitDBManager(string path)
|
|
{
|
|
sqlDB = new DBAccess($"Data Source = {path}");
|
|
}
|
|
|
|
//断开连接
|
|
public void CloseSqlConnectionDB()
|
|
{
|
|
sqlDB?.CloseSqlConnectionDB();
|
|
}
|
|
|
|
//创建数据库表
|
|
public void CreatTable(string tableName, string[] col, string[] colType)
|
|
{
|
|
sqlDB.CreatTable(tableName, col, colType);
|
|
}
|
|
|
|
#region Demo
|
|
public void CreatTableDemo()
|
|
{
|
|
sqlDB.CreatTable("TeacherTable", new string[] { "Name", "Subject", "StudentCounts", "PassCount" }, new string[] { "TEXT", "TEXT", "INTEGER", "INTEGER" });
|
|
//sqlDB.CreatTable("RecordTable", new string[] { "'StudentName'", "'Date'", "'Duration'", "'TeacherName'","'Number'","'Result'" }, new string[] { "TEXT", "DATE TIME", "TEXT", "TEXT","TEXT", "TEXT" });
|
|
//sqlDB.CreatTable("DataTable", new string[] { "'Date'", "'DataBytes'"}, new string[] { "DATE TIME", "BLOB" });//创建数据记录存储表
|
|
}
|
|
|
|
public void InsterDemo(string stname, string sex, string className, string stnumber, string stYear, string stZY, string teach, string phone)
|
|
{
|
|
sqlDB.InsterInto("StMessTable", new string[] { stname, sex, className, stnumber, stYear, stZY, teach, phone });
|
|
}
|
|
|
|
public void UpdateDemo(string stname, string sex, string className, string stnumber, string stYear, string stZY, string teach, string phone,string oldNumber)
|
|
{
|
|
sqlDB.UpdateValues("StMessTable", new string[] { "Name", "Sex", "Class", "Number", "Year", "College", "Teacher", "Phone" }, new string[] { "'" + stname + "'", "'" + sex + "'", "'" + className + "'", "'" + stnumber + "'", "'" + stYear + "'", "'" + stZY + "'", "'" + teach + "'", "'" + phone + "'" }, "Number", "=", "'" + oldNumber + "'");
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 按姓名和时间查找
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="startTime"></param>
|
|
/// <param name="finishTime"></param>
|
|
public RecordClassDemo[] EnquireRecordDemo(string name, string startTime, string finishTime)
|
|
{
|
|
sqlReader = sqlDB.SelectDataAndName("RecordTable", "Date", "'" + startTime + " 00:00:00'", "'" + finishTime + " 23:59:59'", "StudentName", "'" + name + "'");
|
|
return GetMessDemo(sqlReader);
|
|
}
|
|
|
|
|
|
RecordClassDemo[] GetMessDemo(SqliteDataReader reader)
|
|
{
|
|
List<RecordClassDemo> message = new List<RecordClassDemo>();
|
|
while (reader.Read())
|
|
{
|
|
RecordClassDemo oneMessage = new RecordClassDemo();
|
|
if (!reader.IsDBNull(sqlReader.GetOrdinal("User")))
|
|
oneMessage.user = reader.GetString(sqlReader.GetOrdinal("User"));
|
|
if (!reader.IsDBNull(sqlReader.GetOrdinal("StudentName")))
|
|
oneMessage.msg = reader.GetString(sqlReader.GetOrdinal("Msg"));
|
|
message.Add(oneMessage);
|
|
}
|
|
return message.ToArray();
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region //历史数据操作
|
|
|
|
/// <summary>
|
|
/// 插入一条学员学习记录 不允许插入重复的数据 重复判定依据为 user+date
|
|
/// </summary>
|
|
internal bool InsterResultMsg(OperaterRecording operater)
|
|
{
|
|
string key = $"{operater.user}:{operater.date}";//学员+日期组成唯一键
|
|
sqlReader = sqlDB.Select("LearnRecordTable", "Key", key);
|
|
if (!sqlReader.HasRows)
|
|
{
|
|
byte[] bytes = BytesHelper.ClassToBytes<OperaterRecording>(operater);
|
|
string sql = "INSERT INTO LearnRecordTable(Key, RecordData) values (@Key, @RecordData)";
|
|
SqliteParameter[] parameters = new SqliteParameter[] {
|
|
new SqliteParameter ("@Key", key),
|
|
new SqliteParameter ("@RecordData", bytes)
|
|
};
|
|
sqlDB.ExecuteQuery(parameters, sql);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询所有的记录数据
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public OperaterRecording[] GetAllResultMsg()
|
|
{
|
|
sqlReader = sqlDB.GetAllLineMess("LearnRecordTable", "RecordData");
|
|
return GetRecording();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 按姓名查找记录
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
public OperaterRecording[] EnquireRecord(string user)
|
|
{
|
|
sqlReader = sqlDB.Select("LearnRecordTable", "User", user);
|
|
return GetRecording();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除数据
|
|
/// </summary>
|
|
internal bool DeleteRecord(OperaterRecording operater)
|
|
{
|
|
string key = $"{operater.user}:{operater.date}";//学员+日期组成唯一键
|
|
return sqlDB.DeleteValuesAND("LearnRecordTable", new string[] { "Key" }, new string[] { "=" }, new string[] { $"'{key}'" });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 按姓名和时间查找记录
|
|
/// </summary>
|
|
/// <param name="userName"></param>
|
|
/// <param name="startTime"></param>
|
|
/// <param name="finishTime"></param>
|
|
public OperaterRecording[] EnquireRecord(string userName, string startTime, string finishTime)
|
|
{
|
|
sqlReader = sqlDB.SelectDataAndName("LearnRecordTable", "Date", startTime + " 00:00:00", finishTime + " 23:59:59", "StudentName", userName);
|
|
return GetRecording();
|
|
}
|
|
|
|
|
|
//读取完成后解析记录数据
|
|
private OperaterRecording[] GetRecording()
|
|
{
|
|
if (!sqlReader.HasRows) return null;
|
|
List<OperaterRecording> operaters = new List<OperaterRecording>();
|
|
while (sqlReader.Read())
|
|
{
|
|
OperaterRecording oneMessage = new OperaterRecording();
|
|
byte[] buffer = new byte[8192];//数据最大长度不超过8192
|
|
long bytesRead = sqlReader.GetBytes(sqlReader.GetOrdinal("RecordData"), 0, buffer, 0, buffer.Length);
|
|
byte[] actualRead = new byte[bytesRead];
|
|
Array.Copy(buffer, 0, actualRead, 0, (int)bytesRead);
|
|
oneMessage = BytesHelper.BytesToClass<OperaterRecording>(actualRead);
|
|
operaters.Add(oneMessage);
|
|
}
|
|
return operaters.ToArray();
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region //AB包资源相关操作
|
|
/// <summary>
|
|
/// 删除AB包数据
|
|
/// </summary>
|
|
/// <param name="currentMsg"></param>
|
|
internal void DeleteABMsg(string currentMsg)
|
|
{
|
|
sqlDB.DeleteValuesAND("AssetBundle", new string[] { "Name" }, new string[] { "=" }, new string[] { $"'{currentMsg}'" });
|
|
|
|
}
|
|
|
|
AssetBundleMsg[] GetABMsg(SqliteDataReader sqlReader)
|
|
{
|
|
List<AssetBundleMsg> abs = new List<AssetBundleMsg>();
|
|
while (sqlReader.Read())
|
|
{
|
|
AssetBundleMsg oneMsg = new AssetBundleMsg();
|
|
oneMsg.assetsName = sqlReader.GetString(sqlReader.GetOrdinal("Name"));
|
|
oneMsg.type = (ABType)sqlReader.GetInt32(sqlReader.GetOrdinal("Type"));
|
|
oneMsg.filePath = sqlReader.GetString(sqlReader.GetOrdinal("FilePath"));
|
|
oneMsg.parentName = sqlReader.GetString(sqlReader.GetOrdinal("ParentName"));
|
|
abs.Add(oneMsg);
|
|
}
|
|
return abs.ToArray();
|
|
}
|
|
|
|
|
|
string[] GetNames(SqliteDataReader reader)
|
|
{
|
|
List<string> names = new List<string>();
|
|
while (reader.Read())
|
|
{
|
|
string oneName = null;
|
|
if (!reader.IsDBNull(sqlReader.GetOrdinal("Name")))
|
|
oneName = reader.GetString(sqlReader.GetOrdinal("Name"));
|
|
if (!string.IsNullOrEmpty(oneName))
|
|
names.Add(oneName);
|
|
}
|
|
return names.ToArray();
|
|
}
|
|
|
|
//插入新数据时 判断是否存在已有数据 若存在则更新 避免出现添加多个同装备的情况
|
|
internal void InsterABMsg(AssetBundleMsg currentMsg)
|
|
{
|
|
sqlReader = sqlDB.Select("AssetBundle", "Name", currentMsg.assetsName);
|
|
if (sqlReader.HasRows)
|
|
{
|
|
UpdateABMsg(currentMsg);
|
|
}
|
|
else
|
|
sqlDB.InsterInto("AssetBundle", new string[] { currentMsg.assetsName, ((int)currentMsg.type).ToString(), currentMsg.filePath, currentMsg.parentName });
|
|
}
|
|
|
|
void UpdateABMsg(AssetBundleMsg currentMsg)
|
|
{
|
|
sqlDB.UpdateValues("AssetBundle", new string[] { "Type","FilePath", "ParentName" },new string[] {((int)currentMsg.type).ToString(),currentMsg.filePath,currentMsg.parentName },"Name","=", currentMsg.assetsName);
|
|
}
|
|
|
|
|
|
|
|
public string[] GetABNames(ABType aBType)
|
|
{
|
|
sqlReader = sqlDB.Select("AssetBundle", "Type", ((int)aBType).ToString());
|
|
return GetNames(sqlReader);
|
|
}
|
|
|
|
//获取车载装备和车辆配置关系 key 车辆 value车载装备
|
|
public XDictionary<string, string> GetOnBoardEquip()
|
|
{
|
|
sqlReader = sqlDB.Select("AssetBundle", "Type", ((int) ABType.工具).ToString());
|
|
XDictionary<string, string> pairs = new XDictionary<string, string>();
|
|
while (sqlReader.Read())
|
|
{
|
|
string equipName = null;
|
|
if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("Name")))
|
|
equipName = sqlReader.GetString(sqlReader.GetOrdinal("Name"));
|
|
if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("ParentName")))
|
|
pairs[sqlReader.GetString(sqlReader.GetOrdinal("ParentName"))]= equipName;
|
|
}
|
|
return pairs;
|
|
}
|
|
|
|
public AssetBundleMsg[] GetABMsg()
|
|
{
|
|
sqlReader = sqlDB.ReaderFullTable("AssetBundle");
|
|
return GetABMsg(sqlReader);
|
|
}
|
|
#endregion
|
|
|
|
#region 用户数据相关操作
|
|
//用户登录查询
|
|
public bool CheckUserLogin(User user)
|
|
{
|
|
sqlReader = sqlDB.Select(GetUserTable(user.userType), new string[] { "user" }, new string[] { "user", "password" }, new string[] { user.user, user.password });
|
|
return !sqlReader.IsDBNull(sqlReader.GetOrdinal("user"));//能查询到该用户
|
|
}
|
|
|
|
//添加用户
|
|
public bool InsterUser(User userMsg)
|
|
{
|
|
sqlReader = sqlDB.Select(GetUserTable(userMsg.userType), "user", userMsg.user);
|
|
if(!sqlReader.HasRows)//查询 避免重复插入输入
|
|
{
|
|
sqlDB.InsterInto(GetUserTable(userMsg.userType), new string[] {userMsg.user,userMsg.password});
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//查找所有用户
|
|
public User[] GetAllUser(UserType userType)
|
|
{
|
|
sqlReader = sqlDB.ReaderFullTable(GetUserTable(userType));
|
|
List<User> userLis = new List<User>();
|
|
while (sqlReader.Read())
|
|
{
|
|
User oneMessage = new User();
|
|
if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("user")))
|
|
oneMessage.user = sqlReader.GetString(sqlReader.GetOrdinal("user"));
|
|
if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("password")))
|
|
oneMessage.password = sqlReader.GetString(sqlReader.GetOrdinal("password"));
|
|
oneMessage.userType = userType;
|
|
userLis.Add(oneMessage);
|
|
}
|
|
return userLis.ToArray();
|
|
}
|
|
|
|
//删除用户
|
|
public void DeleteUser(User user)
|
|
{
|
|
sqlDB.DeleteValuesAND(GetUserTable(user.userType), new string[] { "user" }, new string[] { "=" }, new string[] { $"'{user.user}'" });
|
|
}
|
|
|
|
//更新用户密码
|
|
public void UpdateUser(User user)
|
|
{
|
|
sqlDB.UpdateValues(GetUserTable(user.userType), new string[] { "user", "password" }, new string[] {user.user,user.password }, "user", "=", user.user);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 根据用户类型获取 数据库表名称
|
|
/// </summary>
|
|
/// <param name="user"></param>
|
|
/// <returns></returns>
|
|
private string GetUserTable(UserType user)
|
|
{
|
|
string tableName = "";
|
|
switch (user)
|
|
{
|
|
case UserType.student:
|
|
tableName = "StudentUser";
|
|
break;
|
|
case UserType.Teacher:
|
|
tableName = "TeacherUser";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return tableName;
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
|
|
//成功插入一条数据时返回的操作类型
|
|
//用于某些带有唯一标识且可能重复插入数据的表单
|
|
public enum InsterType
|
|
{
|
|
/// <summary>
|
|
/// 新数据
|
|
/// </summary>
|
|
newData,
|
|
|
|
/// <summary>
|
|
/// 覆盖一条原有数据
|
|
/// </summary>
|
|
overwrite,
|
|
}
|
|
|