1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2024-09-19 19:55:45 +00:00

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

This commit is contained in:
Carm Jos 2021-12-23 05:15:48 +08:00
parent fc72bf2fe3
commit abf82e1a91
24 changed files with 603 additions and 105 deletions

View File

@ -1,18 +0,0 @@
title: "&e&l农业仓库"
capacity:
default: 1000
permissions:
5000: "ub.farmer.vip"
items:
"POTATO":
slot: 5
limit: 500
price: 10
name: "土豆"
lore:
- "香甜的土豆。"

View File

@ -3,24 +3,23 @@ name: "&c&l矿业仓库"
capacity:
default: 1000
permissions:
5000: "ub.miner.vip"
- "ub.miner.vip:5000"
gui:
title: "&c&l矿业仓库"
lines: 6
items:
"CLOSE":
icon:
==: org.bukkit.ItemStack
slot: 0
type: BARRIER
data: 0
name: "关闭界面"
lore:
- "点击关闭界面"
actions:
- "[CLOSE]"
- "[LEFT:CLOSE]"
- "[SHIFT_LEFT:CLOSE]"
items:
"DIAMOND":
original: true #只允许无任何特殊属性的物品被收入
slot: 5
limit: 500
price: 10

View File

@ -38,6 +38,19 @@
## 插件指令
指令主指令为 /UltraBackpack (/ub | /backpack)
<details>
<summary>展开查看所有子指令</summary>
```text
```
</details>
## 插件变量 ([PlaceholderAPI](https://www.spigotmc.org/resources/6245/))
变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现,如需使用变量请安装其插件。

View File

@ -0,0 +1,12 @@
package cc.carm.plugin.ultrabackpack.api.configuration.backpack;
import java.util.Map;
public interface BackpackCapacity {
int getDefault();
Map<Integer, String> getPermissions();
}

View File

@ -0,0 +1,24 @@
package cc.carm.plugin.ultrabackpack.api.configuration.backpack;
import cc.carm.plugin.ultrabackpack.api.configuration.gui.GUIConfiguration;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public interface BackpackConfiguration {
@NotNull String getIdentifier();
@NotNull String getName();
@NotNull GUIConfiguration getGUIConfiguration();
@NotNull BackpackCapacity getCapacity();
int getCapacityFor(Player player);
@NotNull Map<String, BackpackItem> getItems();
}

View File

@ -0,0 +1,23 @@
package cc.carm.plugin.ultrabackpack.api.configuration.backpack;
import org.bukkit.Material;
import java.util.List;
public interface BackpackItem {
Material getMaterial();
int getData();
int getSoldLimit();
int getSoldPrice();
int getDisplaySlot();
String getDisplayName();
List<String> getDisplayLore();
}

View File

@ -0,0 +1,27 @@
package cc.carm.plugin.ultrabackpack.api.configuration.gui;
import org.bukkit.event.inventory.ClickType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface GUIAction {
enum ActionType {
COMMAND,
CONSOLE,
MESSAGE,
SOUND,
CLOSE
}
@Nullable ClickType getClickType();
@NotNull ActionType getActionType();
@NotNull String getActionContent();
void executeAction();
}

View File

@ -0,0 +1,14 @@
package cc.carm.plugin.ultrabackpack.api.configuration.gui;
import java.util.Map;
public interface GUIConfiguration {
String getTitle();
int getLines();
Map<Integer, GUIItemDetail> getItems();
}

View File

@ -0,0 +1,15 @@
package cc.carm.plugin.ultrabackpack.api.configuration.gui;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public interface GUIItemDetail {
ItemStack getIcon();
List<GUIAction> getActions();
}

View File

@ -1,45 +0,0 @@
package cc.carm.plugin.ultrabackpack.api.data;
import cc.carm.lib.easysql.api.SQLManager;
import java.sql.SQLException;
public enum DatabaseTables {
USER_DATA("ub_data", new String[]{
"`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // 用户的UUID
"`backpack` VARCHAR(32) NOT NULL",// 背包组名
"`type` VARCHAR(32) NOT NULL",// 背包内具体物品类型
"`amount` INT(11) NOT NULL DEFAULT 0", // 该物品的数量
"`sold` INT(11) NOT NULL DEFAULT 0", // 一周卖出次数
"`day` DATE NOT NULL", // 记录卖出数量的所在天
"PRIMARY KEY `data`(`uuid`,`backpack`,`type`)" // 联合主键索引
}),
;
String name;
String[] columns;
DatabaseTables(String name, String[] columns) {
this.name = name;
this.columns = columns;
}
public static void createTables(SQLManager sqlManager) throws SQLException {
for (DatabaseTables value : DatabaseTables.values()) {
sqlManager.createTable(value.getName())
.setColumns(value.getColumns())
.build().execute();
}
}
public String getName() {
return name;
}
public String[] getColumns() {
return columns;
}
}

View File

@ -0,0 +1,27 @@
package cc.carm.plugin.ultrabackpack.api.data;
import java.util.HashMap;
import java.util.Map;
public class UBContentsData {
private final Map<String, UBItemData> contents;
public UBContentsData(Map<String, UBItemData> contents) {
this.contents = contents;
}
public Map<String, UBItemData> getContents() {
return this.contents;
}
public UBItemData getItemData(String itemType) {
return getContents().get(itemType);
}
public static UBContentsData emptyContents() {
return new UBContentsData(new HashMap<>());
}
}

View File

@ -0,0 +1,29 @@
package cc.carm.plugin.ultrabackpack.api.data;
public class UBItemData {
int amount;
int sold;
public UBItemData(int amount, int sold) {
this.amount = amount;
this.sold = sold;
}
public int getAmount() {
return amount;
}
public int getSold() {
return sold;
}
public void clearSold() {
this.sold = 0;
}
public static UBItemData emptyItemData() {
return new UBItemData(0, 0);
}
}

View File

@ -0,0 +1,31 @@
package cc.carm.plugin.ultrabackpack.api.data;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.Date;
import java.util.Set;
import java.util.UUID;
public interface UBUserData {
@NotNull UUID getUserUUID();
@Nullable UBContentsData getBackpack(String backpackID);
@NotNull Set<String> getBackpackIDs();
int getItemAmount(String backpackID, String typeID);
int getItemSold(String backpackID, String typeID);
Date getDataDay();
boolean isCurrentDay();
void updateDate();
void save() throws Exception;
}

View File

@ -1,4 +1,22 @@
package cc.carm.plugin.ultrabackpack.api.manager;
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public interface UBUserManager {
@Nullable
UBUserData getData(@NotNull UUID userUUID);
@NotNull
UBUserData getData(@NotNull Player player);
@NotNull
UBUserData loaData(@NotNull UUID userUUID);
}

View File

@ -0,0 +1,18 @@
package cc.carm.plugin.ultrabackpack.api.storage;
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public interface UBStorage {
boolean initialize();
@NotNull
UBUserData loadData(@NotNull UUID uuid) throws Exception;
void saveUserData(@NotNull UBUserData data) throws Exception;
}

View File

@ -1,4 +0,0 @@
package cc.carm.plugin.ultrabackpack.api.user;
public interface UBUserData {
}

View File

@ -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() {

View File

@ -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"
);
}
}

View File

@ -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);
}
}

View File

@ -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 {

View File

@ -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) {
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,4 @@
package cc.carm.plugin.ultrabackpack.ui;
public class SellItemGUI {
}

View File

@ -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"