1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2026-06-04 16:48:21 +08:00

调整数据结构,完成MySQL数据存储部分

This commit is contained in:
2021-12-23 05:15:48 +08:00
parent fc72bf2fe3
commit abf82e1a91
24 changed files with 603 additions and 105 deletions
@@ -1,5 +1,7 @@
package cc.carm.plugin.ultrabackpack;
import cc.carm.plugin.ultrabackpack.configuration.PluginConfig;
import cc.carm.plugin.ultrabackpack.manager.ConfigManager;
import cc.carm.plugin.ultrabackpack.util.ColorParser;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor;
@@ -13,7 +15,6 @@ import org.jetbrains.annotations.Nullable;
public class Main extends JavaPlugin {
private static Main instance;
public static boolean debugMode = true;
@Override
public void onEnable() {
@@ -22,8 +23,7 @@ public class Main extends JavaPlugin {
long startTime = System.currentTimeMillis();
log("加载配置文件...");
saveDefaultConfig();
reloadConfig();
ConfigManager.initConfig();
log("注册监听器...");
@@ -56,10 +56,12 @@ public class Main extends JavaPlugin {
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
}
public static void error(String message) {
log("&c[ERROR] &r" + message);
}
public static void debug(@Nullable String message) {
if (debugMode) {
log("[DEBUG] " + message);
}
if (PluginConfig.DEBUG.get()) log("[DEBUG] " + message);
}
public static Main getInstance() {
@@ -8,24 +8,4 @@ public class PluginConfig {
"debug", Boolean.class
);
public static class Database {
public static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
"database.driver", String.class, "com.mysql.jdbc.Driver"
);
public static final ConfigValue<String> URL = new ConfigValue<>(
"database.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
);
public static final ConfigValue<String> USERNAME = new ConfigValue<>(
"database.username", String.class, "username"
);
public static final ConfigValue<String> PASSWORD = new ConfigValue<>(
"database.password", String.class, "password"
);
}
}
@@ -0,0 +1,81 @@
package cc.carm.plugin.ultrabackpack.data;
import cc.carm.plugin.ultrabackpack.api.data.UBContentsData;
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
import cc.carm.plugin.ultrabackpack.api.storage.UBStorage;
import org.jetbrains.annotations.NotNull;
import java.sql.Date;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class UserData implements UBUserData {
public final UUID userUUID;
UBStorage storage;
Map<String, UBContentsData> backpacks;
Date day;
public UserData(UUID userUUID, UBStorage storage, Map<String, UBContentsData> backpacks, Date day) {
this.userUUID = userUUID;
this.storage = storage;
this.backpacks = backpacks;
this.day = day;
}
@Override
public @NotNull UUID getUserUUID() {
return this.userUUID;
}
public @NotNull Map<String, UBContentsData> getBackpacks() {
return this.backpacks;
}
@Override
public @NotNull UBContentsData getBackpack(String backpackID) {
if (!getBackpacks().containsKey(backpackID)) {
getBackpacks().put(backpackID, UBContentsData.emptyContents());
}
return getBackpacks().get(backpackID);
}
@Override
public @NotNull Set<String> getBackpackIDs() {
return getBackpacks().keySet();
}
@Override
public int getItemAmount(String backpackID, String typeID) {
return getBackpack(backpackID).getItemData(typeID).getAmount();
}
@Override
public int getItemSold(String backpackID, String typeID) {
return getBackpack(backpackID).getItemData(typeID).getSold();
}
@Override
public Date getDataDay() {
return this.day;
}
@Override
public boolean isCurrentDay() {
return this.day.equals(new Date(System.currentTimeMillis()));
}
@Override
public void updateDate() {
}
@Override
public void save() throws Exception {
this.storage.saveUserData(this);
}
}
@@ -3,7 +3,6 @@ package cc.carm.plugin.ultrabackpack.manager;
import cc.carm.plugin.ultrabackpack.Main;
import cc.carm.plugin.ultrabackpack.configuration.file.FileConfig;
import org.bukkit.Material;
public class ConfigManager {
@@ -0,0 +1,32 @@
package cc.carm.plugin.ultrabackpack.storage;
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
import cc.carm.plugin.ultrabackpack.api.storage.UBStorage;
import cc.carm.plugin.ultrabackpack.data.UserData;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.sql.Date;
import java.util.HashMap;
import java.util.UUID;
public class FileStorage implements UBStorage {
private File dataContainer;
@Override
public boolean initialize() {
return false;
}
@Override
public @NotNull UserData loadData(@NotNull UUID uuid) {
return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis()));
}
@Override
public void saveUserData(@NotNull UBUserData data) {
}
}
@@ -0,0 +1,213 @@
package cc.carm.plugin.ultrabackpack.storage;
import cc.carm.lib.easysql.EasySQL;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.action.query.PreparedQueryAction;
import cc.carm.lib.easysql.api.action.query.SQLQuery;
import cc.carm.plugin.ultrabackpack.Main;
import cc.carm.plugin.ultrabackpack.api.data.UBContentsData;
import cc.carm.plugin.ultrabackpack.api.data.UBItemData;
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
import cc.carm.plugin.ultrabackpack.api.storage.UBStorage;
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
import cc.carm.plugin.ultrabackpack.data.UserData;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class MySQLStorage implements UBStorage {
public static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
);
public static final ConfigValue<String> URL = new ConfigValue<>(
"storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
);
public static final ConfigValue<String> USERNAME = new ConfigValue<>(
"storage.mysql.username", String.class, "username"
);
public static final ConfigValue<String> PASSWORD = new ConfigValue<>(
"storage.mysql.password", String.class, "password"
);
public enum SQLTables {
USER_DATA("ub_data", new String[]{
"`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // 用户的UUID
"`data` MEDIUMTEXT NOT NULL",// 背包内具体物品
"`day` DATE NOT NULL", // 记录卖出数量的所在天
});
String name;
String[] columns;
SQLTables(String name, String[] columns) {
this.name = name;
this.columns = columns;
}
public static void createTables(SQLManager sqlManager) throws SQLException {
for (SQLTables value : values()) {
sqlManager.createTable(value.getName())
.setColumns(value.getColumns())
.build().execute();
}
}
public String getName() {
return name;
}
public String[] getColumns() {
return columns;
}
}
public static final Gson GSON = new Gson();
public static final JsonParser PARSER = new JsonParser();
SQLManager sqlManager;
@Override
public boolean initialize() {
try {
Main.log("尝试连接到数据库...");
this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get());
} catch (Exception exception) {
Main.error("无法连接到数据库,请检查配置文件。");
Main.error("Could not connect to the database, please check the configuration.");
exception.printStackTrace();
return false;
}
try {
Main.log("创建插件所需表...");
SQLTables.createTables(sqlManager);
} catch (SQLException exception) {
Main.error("无法创建插件所需的表,请检查数据库权限。");
Main.error("Could not create necessary tables, please check the database privileges.");
exception.printStackTrace();
return false;
}
return true;
}
@Override
public @NotNull UserData loadData(@NotNull UUID uuid) throws Exception {
try (SQLQuery query = createAction(uuid).execute()) {
ResultSet resultSet = query.getResultSet();
Map<String, UBContentsData> dataMap = new HashMap<>();
if (resultSet != null && resultSet.next()) {
String dataJSON = resultSet.getString("data");
Date date = resultSet.getDate("day");
JsonElement dataElement = PARSER.parse(dataJSON);
if (dataElement.isJsonObject()) {
dataElement.getAsJsonObject().entrySet().forEach(entry -> {
String backpackID = entry.getKey();
UBContentsData contentsData = parseContentsData(entry.getValue());
if (contentsData != null) dataMap.put(backpackID, contentsData);
});
}
return new UserData(uuid, this, dataMap, date);
}
return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis()));
} catch (Exception exception) {
Main.error("在加载玩家 #" + uuid + " 的数据时出现异常。");
Main.error("Error occurred when loading #" + uuid + " data.");
throw new Exception(exception);
}
}
@Override
public void saveUserData(@NotNull UBUserData data) throws Exception {
JsonObject dataObject = new JsonObject();
for (String backpackID : data.getBackpackIDs()) {
JsonObject contentObject = serializeContentsData(data.getBackpack(backpackID));
if (contentObject != null) dataObject.add(backpackID, contentObject);
}
try {
getSQLManager().createReplace(SQLTables.USER_DATA.getName())
.setColumnNames("uuid", "data", "day")
.setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDataDay())
.execute();
} catch (SQLException exception) {
Main.error("在加载玩家 #" + data.getUserUUID() + " 的数据时出现异常。");
Main.error("Error occurred when loading #" + data.getUserUUID() + " data.");
throw new Exception(exception);
}
}
private SQLManager getSQLManager() {
return sqlManager;
}
private PreparedQueryAction createAction(UUID uuid) {
return getSQLManager().createQuery()
.inTable(SQLTables.USER_DATA.getName())
.addCondition("uuid", uuid.toString())
.setLimit(1).build();
}
private UBContentsData parseContentsData(JsonElement contentsElement) {
return contentsElement.isJsonObject() ? parseContentsData(contentsElement.getAsJsonObject()) : null;
}
private UBContentsData parseContentsData(JsonObject contentsObject) {
Map<String, UBItemData> contents = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : contentsObject.entrySet()) {
String itemType = entry.getKey();
UBItemData data = parseItemData(entry.getValue());
contents.put(itemType, data);
}
return new UBContentsData(contents);
}
private UBItemData parseItemData(JsonElement itemElement) {
return itemElement.isJsonObject() ? parseItemData(itemElement.getAsJsonObject()) : null;
}
private UBItemData parseItemData(JsonObject itemObject) {
if (!itemObject.has("amount") || !itemObject.has("sold")) {
return UBItemData.emptyItemData();
} else {
return new UBItemData(itemObject.get("amount").getAsInt(), itemObject.get("sold").getAsInt());
}
}
@Nullable
private JsonObject serializeContentsData(@Nullable UBContentsData contentsData) {
if (contentsData == null) return null;
JsonObject contentsObject = new JsonObject();
contentsData.getContents().forEach((typeID, item) -> contentsObject.add(typeID, serializeItemData(item)));
return contentsObject;
}
@NotNull
private JsonObject serializeItemData(@NotNull UBItemData itemData) {
JsonObject itemObject = new JsonObject();
itemObject.addProperty("amount", itemData.getAmount());
itemObject.addProperty("sold", itemData.getSold());
return itemObject;
}
}
@@ -0,0 +1,4 @@
package cc.carm.plugin.ultrabackpack.ui;
public class SellItemGUI {
}
@@ -4,10 +4,14 @@
version: ${project.parent.version}
stroage:
debug: false
# 存储方式,可选 [ yaml | mysql ]
method: database
# 存储相关配置
# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。
storage:
# 存储方式,可选 [ file | mysql ]
method: mysql
# 选择 file 存储方式时的存储路径
# 默认为相对路径,相对于插件生成的配置文件夹下的路径
@@ -19,7 +23,7 @@ stroage:
mysql:
# 数据库驱动路径
driver: "com.mysql.jdbc.Driver"
url: "jdbc:mysql://127.0.0.1:3306/db-name"
url: "jdbc:mysql://127.0.0.1:3306/<db-name>"
username: "username"
password: "password"