blob: 26ddc295af40b1592baa18f3524dae199a4d4f00 [file] [log] [blame]
rootcd436562025-05-08 14:09:19 +00001package database;
2
TRM-coding87c24972025-06-07 14:05:29 +08003import java.util.Calendar;
4import java.util.UUID;
root0dbc9812025-05-19 04:41:57 +00005import java.util.HashMap;
6import java.util.List;
rhje18c3f72025-06-08 00:27:01 +08007import java.util.ArrayList;
root0dbc9812025-05-19 04:41:57 +00008import java.util.Map;
TRM-coding87c24972025-06-07 14:05:29 +08009import java.util.Date;
rhje18c3f72025-06-08 00:27:01 +080010import java.io.File;
11import java.nio.file.Files;
12import java.nio.file.Path;
13import java.nio.file.Paths;
14import java.nio.file.StandardCopyOption;
root0dbc9812025-05-19 04:41:57 +000015
16import javax.persistence.EntityManager;
TRM-coding87c24972025-06-07 14:05:29 +080017import javax.persistence.EntityManagerFactory;
18import javax.persistence.EntityTransaction;
Raverf79fdb62025-06-03 06:02:49 +000019import javax.persistence.PersistenceContext;
root678fd3e2025-06-03 14:20:20 +000020import javax.persistence.Persistence;
root0dbc9812025-05-19 04:41:57 +000021
22import com.querydsl.jpa.impl.JPAQuery;
TRM-coding87c24972025-06-07 14:05:29 +080023import com.querydsl.core.Tuple;
root0dbc9812025-05-19 04:41:57 +000024
25import entity.BegInfo;
rhje18c3f72025-06-08 00:27:01 +080026import entity.BegInfoDetail;
27import entity.BegSeedDetail;
root0dbc9812025-05-19 04:41:57 +000028import entity.Notice;
29import entity.Post;
TRM-coding87c24972025-06-07 14:05:29 +080030import entity.PostReply;
root0dbc9812025-05-19 04:41:57 +000031import entity.Profile;
rhje18c3f72025-06-08 00:27:01 +080032import entity.SeedWithVotes;
33import entity.QAdmin;
TRM-coding87c24972025-06-07 14:05:29 +080034import entity.QBegInfo;
root0dbc9812025-05-19 04:41:57 +000035import entity.QNotice;
TRM-coding87c24972025-06-07 14:05:29 +080036import entity.QProfile;
root0dbc9812025-05-19 04:41:57 +000037import entity.QSeed;
TRM-coding87c24972025-06-07 14:05:29 +080038import entity.QSubmitSeed;
root0dbc9812025-05-19 04:41:57 +000039import entity.QUser;
40import entity.QUserPT;
41import entity.QUserStar;
TRM-codingcdfe5482025-06-06 17:31:01 +080042import entity.QUserInvite;
TRM-coding87c24972025-06-07 14:05:29 +080043import entity.QUserVotes;
rhj46f62c42025-06-06 23:24:10 +080044import entity.QPost;
root0dbc9812025-05-19 04:41:57 +000045import entity.Seed;
46import entity.User;
47import entity.UserPT;
48import entity.UserStar;
Raverf79fdb62025-06-03 06:02:49 +000049import entity.config;
rhj5b69b7e2025-06-07 01:28:08 +080050import entity.PostReply;
51import entity.QPostReply;
rhj5ebd93c2025-06-07 15:57:28 +080052import entity.UserInvite;
rhje18c3f72025-06-08 00:27:01 +080053import entity.QAdmin;
54import entity.UserStar;
55import entity.QUserStar;
56import entity.SubmitSeed;
57import entity.SubmitSeedId;
58
root0dbc9812025-05-19 04:41:57 +000059
TRM-coding87c24972025-06-07 14:05:29 +080060import org.slf4j.Logger;
61import org.slf4j.LoggerFactory;
62
root0dbc9812025-05-19 04:41:57 +000063public class Database1 implements DataManagerInterface {
TRM-coding87c24972025-06-07 14:05:29 +080064 private static final Logger logger = LoggerFactory.getLogger(Database1.class);
65 private EntityManagerFactory emf;
rhj5ebd93c2025-06-07 15:57:28 +080066
root678fd3e2025-06-03 14:20:20 +000067 public Database1() {
Raverf79fdb62025-06-03 06:02:49 +000068 config cfg = new config();
69 Map<String,Object> props = new HashMap<>();
70 props.put("javax.persistence.jdbc.url",
71 "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
root678fd3e2025-06-03 14:20:20 +000072 props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
73 props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
rhj5ebd93c2025-06-07 15:57:28 +080074 // 只创建一个 EntityManagerFactory,为每个操作创建新的 EntityManager
75 this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
root678fd3e2025-06-03 14:20:20 +000076 }
rhj5ebd93c2025-06-07 15:57:28 +080077
78 // 为每个操作创建新的 EntityManager 以避免线程安全问题
79 private EntityManager createEntityManager() {
80 return emf.createEntityManager();
81 }
82
TRM-codingcdfe5482025-06-06 17:31:01 +080083 @Override
84 public String LoginUser(User userinfo){
85 try {
86 // 检查传入的参数是否合法
87 if (userinfo == null || userinfo.password == null) {
88 return null;
89 }
90
TRM-codingcdfe5482025-06-06 17:31:01 +080091 boolean hasEmail = userinfo.email != null && !userinfo.email.isEmpty();
92
93 // 如果两个都为空或两个都不为空,返回null
rhj46f62c42025-06-06 23:24:10 +080094 if (!hasEmail) {
TRM-codingcdfe5482025-06-06 17:31:01 +080095 return null;
96 }
97
rhj5ebd93c2025-06-07 15:57:28 +080098 EntityManager entitymanager = createEntityManager();
TRM-codingcdfe5482025-06-06 17:31:01 +080099 JPAQuery<User> query = new JPAQuery<>(entitymanager);
100 QUser u = QUser.user;
101 User foundUser = null;
102
rhj46f62c42025-06-06 23:24:10 +0800103
104 // 通过邮箱和密码查找
105 foundUser = query.select(u)
106 .from(u)
107 .where(u.email.eq(userinfo.email)
108 .and(u.password.eq(userinfo.password)))
109 .fetchOne();
TRM-codingcdfe5482025-06-06 17:31:01 +0800110
111 // 如果找到匹配的用户则返回用户ID,否则返回null
112 return foundUser != null ? foundUser.userid : null;
113
114 } catch (Exception e) {
115 e.printStackTrace();
116 return null;
117 }
118 }
root0dbc9812025-05-19 04:41:57 +0000119
120 // 返回状态:0 success,1 邮箱重复,2其他原因
121 @Override
Raverf79fdb62025-06-03 06:02:49 +0000122 public int RegisterUser(User userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800123 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000124 try{
TRM-codingcdfe5482025-06-06 17:31:01 +0800125 // 首先检查该邮箱是否在UserInvite表中被邀请过
rhj5ebd93c2025-06-07 15:57:28 +0800126 JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
TRM-codingcdfe5482025-06-06 17:31:01 +0800127 QUserInvite ui = QUserInvite.userInvite;
rhj5ebd93c2025-06-07 15:57:28 +0800128 List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
TRM-codingcdfe5482025-06-06 17:31:01 +0800129
130 // 如果邮箱不在被邀请列表中,拒绝注册
rhj5ebd93c2025-06-07 15:57:28 +0800131 if(UserInvites.isEmpty()){
TRM-codingcdfe5482025-06-06 17:31:01 +0800132 return 2; // 未被邀请
133 }
134
135 // 检查邮箱是否已在User表中存在
Raverf79fdb62025-06-03 06:02:49 +0000136 JPAQuery<String> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000137 QUser u = QUser.user;
138 List<String> allEmails = query.select(u.email).from(u).fetch();
139
Raverf79fdb62025-06-03 06:02:49 +0000140 if(allEmails.contains(userinfo.email)){
TRM-codingcdfe5482025-06-06 17:31:01 +0800141 return 1; // 邮箱重复
root0dbc9812025-05-19 04:41:57 +0000142 }
root0dbc9812025-05-19 04:41:57 +0000143
rhj5ebd93c2025-06-07 15:57:28 +0800144 UserPT userPT = new UserPT();
145 userPT.userid = userinfo.userid;
146 userPT.magic = 0; // 设置默认值
147 userPT.upload = 0; // 设置默认值
148 userPT.download = 0; // 设置默认值
149 userPT.share = 0.0; // 设置默认值
150 userPT.user = userinfo; // 设置关联关系
151 userPT.farmurl = ""; // 设置默认值
152 userPT.viptime = 0; // 设置默认值
153
rhj46f62c42025-06-06 23:24:10 +0800154 entitymanager.getTransaction().begin();
155 entitymanager.persist(userinfo);
rhj5ebd93c2025-06-07 15:57:28 +0800156 entitymanager.persist(userPT);
157 // 删除所有匹配的邀请记录
158 for (UserInvite invite : UserInvites) {
159 entitymanager.remove(invite);
160 }
rhj46f62c42025-06-06 23:24:10 +0800161 entitymanager.getTransaction().commit();
162 return 0; // 注册成功
TRM-coding93f7be82025-06-06 22:29:02 +0800163
rhj46f62c42025-06-06 23:24:10 +0800164 }catch(Exception e){
165 e.printStackTrace();
166 if (entitymanager.getTransaction().isActive()) {
167 entitymanager.getTransaction().rollback();
168 }
169 return 4;
170 }
TRM-coding93f7be82025-06-06 22:29:02 +0800171
root0dbc9812025-05-19 04:41:57 +0000172 }
173
174 // 返回状态:0 success,1 不存在,2其他原因
175 @Override
Raverf79fdb62025-06-03 06:02:49 +0000176 public int UpdateInformation(User userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800177 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000178 try {
179 if (userinfo.userid == null) {
180 return 2; // userid为null直接返回错误
181 }
rhj5ebd93c2025-06-07 15:57:28 +0800182
rhjc6a4ee02025-06-06 00:45:18 +0800183 entitymanager.getTransaction().begin();
184
Raverf79fdb62025-06-03 06:02:49 +0000185 JPAQuery<User> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000186 QUser u = QUser.user;
187 User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
188
Raverf79fdb62025-06-03 06:02:49 +0000189 if(updateUser == null){
rhjc6a4ee02025-06-06 00:45:18 +0800190 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000191 return 1;
192 }
193 // 只更新需要的字段,避免破坏持久化状态和关联关系
rhjc6a4ee02025-06-06 00:45:18 +0800194 if (userinfo.email != null) updateUser.email = userinfo.email;
195 if (userinfo.username != null) updateUser.username = userinfo.username;
196 if (userinfo.password != null) updateUser.password = userinfo.password;
197 if (userinfo.sex != null) updateUser.sex = userinfo.sex;
198 if (userinfo.school != null) updateUser.school = userinfo.school;
199 if (userinfo.pictureurl != null) updateUser.pictureurl = userinfo.pictureurl;
200 if (userinfo.profile != null) updateUser.profile = userinfo.profile;
root0dbc9812025-05-19 04:41:57 +0000201 updateUser.accountstate = userinfo.accountstate;
202 updateUser.invitetimes = userinfo.invitetimes;
203 // 如有其他字段也一并赋值
Raverf79fdb62025-06-03 06:02:49 +0000204 entitymanager.merge(updateUser);
rhjc6a4ee02025-06-06 00:45:18 +0800205 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000206 return 0;
207 } catch (Exception e) {
208 e.printStackTrace();
rhjc6a4ee02025-06-06 00:45:18 +0800209 if (entitymanager.getTransaction().isActive()) {
210 entitymanager.getTransaction().rollback();
211 }
root0dbc9812025-05-19 04:41:57 +0000212 return 2;
213 }
Raverf79fdb62025-06-03 06:02:49 +0000214
root0dbc9812025-05-19 04:41:57 +0000215 }
216
217 // 返回用户的全部基本信息
218 @Override
Raverf79fdb62025-06-03 06:02:49 +0000219 public User GetInformation(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800220 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000221 User user = entitymanager.find(User.class, userid);
222 return user;
root0dbc9812025-05-19 04:41:57 +0000223 }
224
225 //返回用户的全部pt站信息
226 @Override
Raverf79fdb62025-06-03 06:02:49 +0000227 public UserPT GetInformationPT(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800228 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +0800229 try {
230 UserPT userPT = entitymanager.find(UserPT.class, userid);
231 if (userPT == null) {
232 return null; // 用户PT信息不存在
233 }
234 return userPT;
235 } catch (Exception e) {
236 e.printStackTrace();
237 return null; // 出现异常,返回null
238 }
root0dbc9812025-05-19 04:41:57 +0000239 }
240
241 //返回状态:0 success,1 邮箱重复,2其他原因
242 @Override
Raverf79fdb62025-06-03 06:02:49 +0000243 public int UpdateInformationPT(UserPT userinfo){
244 try{
rhj5ebd93c2025-06-07 15:57:28 +0800245 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000246 JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000247 QUserPT u = QUserPT.userPT;
248 UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
Raverf79fdb62025-06-03 06:02:49 +0000249
250 if(userPT == null){
root0dbc9812025-05-19 04:41:57 +0000251 return 1;
252 }
253 userPT = userinfo;
Raverf79fdb62025-06-03 06:02:49 +0000254 entitymanager.merge(userPT);
root0dbc9812025-05-19 04:41:57 +0000255 return 0;
256
Raverf79fdb62025-06-03 06:02:49 +0000257 }catch(Exception e){
root0dbc9812025-05-19 04:41:57 +0000258 e.printStackTrace();
259 return 2;
260 }
261 }
262
263 //返回状态:0 success,1 id重复,2其他原因
264 @Override
Raverf79fdb62025-06-03 06:02:49 +0000265 public int RegisterUserPT(UserPT userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800266 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000267 try {
rhj46f62c42025-06-06 23:24:10 +0800268 entitymanager.getTransaction().begin();
269
Raverf79fdb62025-06-03 06:02:49 +0000270 JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000271 QUserPT u = QUserPT.userPT;
272 UserPT checkUserPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
273 if (checkUserPT != null) {
rhj46f62c42025-06-06 23:24:10 +0800274 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000275 return 1;
276 }
rhj46f62c42025-06-06 23:24:10 +0800277
Raverf79fdb62025-06-03 06:02:49 +0000278 entitymanager.persist(userinfo);
rhj46f62c42025-06-06 23:24:10 +0800279 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000280 return 0;
281 } catch (Exception e) {
282 e.printStackTrace();
rhj46f62c42025-06-06 23:24:10 +0800283 if (entitymanager.getTransaction().isActive()) {
284 entitymanager.getTransaction().rollback();
285 }
root0dbc9812025-05-19 04:41:57 +0000286 return 2;
287 }
288 }
289
290 //返回种子的全部信息
291 @Override
Raverf79fdb62025-06-03 06:02:49 +0000292 public Seed GetSeedInformation(String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800293 EntityManager em = createEntityManager();
294 try {
295 JPAQuery<Seed> query = new JPAQuery<>(em);
296 QSeed s = QSeed.seed;
297 QUser u = QUser.user;
298 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
299 Seed seed = query.select(s).from(s)
300 .leftJoin(s.user, u).fetchJoin()
301 .where(s.seedid.eq(seedid)).fetchOne();
302 return seed;
303 } finally {
304 em.close();
305 }
root0dbc9812025-05-19 04:41:57 +0000306 }
307
Raveraae06122025-06-05 08:13:35 +0000308 @Override
309 public Seed[] GetSeedListByTag(String tag){
rhj5ebd93c2025-06-07 15:57:28 +0800310 EntityManager em = createEntityManager();
311 try {
312 JPAQuery<Seed> query = new JPAQuery<>(em);
313 QSeed s = QSeed.seed;
314 QUser u = QUser.user;
315 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
316 List<Seed> seeds = query.select(s).from(s)
317 .leftJoin(s.user, u).fetchJoin()
318 .where(s.seedtag.eq(tag)).fetch();
319 return seeds.toArray(new Seed[0]);
320 } finally {
321 em.close();
322 }
Raveraae06122025-06-05 08:13:35 +0000323 }
324
rhjc6a4ee02025-06-06 00:45:18 +0800325 @Override
326 public Seed[] GetSeedListByUser(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800327 EntityManager em = createEntityManager();
328 try {
329 JPAQuery<Seed> query = new JPAQuery<>(em);
330 QSeed s = QSeed.seed;
331 QUser u = QUser.user;
332 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
333 List<Seed> seeds = query.select(s).from(s)
334 .leftJoin(s.user, u).fetchJoin()
335 .where(s.seeduserid.eq(userid)).fetch();
336 return seeds.toArray(new Seed[0]);
337 } finally {
338 em.close();
339 }
rhjc6a4ee02025-06-06 00:45:18 +0800340 }
341
342 @Override
343 public int DeleteSeed(String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800344 EntityManager entitymanager = createEntityManager();
rhjc6a4ee02025-06-06 00:45:18 +0800345 try {
346 entitymanager.getTransaction().begin();
347 Seed seed = entitymanager.find(Seed.class, seedid);
348 if (seed == null) {
349 entitymanager.getTransaction().rollback();
350 return 1; // 种子不存在
351 }
352 entitymanager.remove(seed);
353 entitymanager.getTransaction().commit();
354 return 0; // 成功删除
355 } catch (Exception e) {
356 e.printStackTrace();
357 if (entitymanager.getTransaction().isActive()) {
358 entitymanager.getTransaction().rollback();
359 }
360 return 2; // 其他错误
361 }
362 }
363
root0dbc9812025-05-19 04:41:57 +0000364 //添加一个新的种子,0成功,其他失败信息待定;
365 @Override
Raverf79fdb62025-06-03 06:02:49 +0000366 public int RegisterSeed(Seed seedinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800367 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000368 try {
Raveraae06122025-06-05 08:13:35 +0000369 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000370 JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000371 QSeed s = QSeed.seed;
372 Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
Raveraae06122025-06-05 08:13:35 +0000373 User user = entitymanager.find(User.class, seedinfo.seeduserid);
374 if (user == null) {
375 entitymanager.getTransaction().rollback();
376 return 2; // 用户不存在
377 }
rhjc6a4ee02025-06-06 00:45:18 +0800378 seedinfo.user = user; // 设置种子的用户关联
root0dbc9812025-05-19 04:41:57 +0000379 if (seed != null) {
Raveraae06122025-06-05 08:13:35 +0000380 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000381 return 1;
382 }
Raverf79fdb62025-06-03 06:02:49 +0000383 entitymanager.persist(seedinfo);
Raveraae06122025-06-05 08:13:35 +0000384 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000385 return 0;
386 } catch (Exception e) {
387 e.printStackTrace();
Raveraae06122025-06-05 08:13:35 +0000388 if (entitymanager.getTransaction().isActive()) {
389 entitymanager.getTransaction().rollback();
390 }
root0dbc9812025-05-19 04:41:57 +0000391 return 2;
392 }
393 }
394
395 //接收新的种子然后更新其全部属性
396 @Override
Raverf79fdb62025-06-03 06:02:49 +0000397 public int UpdateSeed(Seed seedinfo){
root0dbc9812025-05-19 04:41:57 +0000398 try {
rhj5ebd93c2025-06-07 15:57:28 +0800399 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000400 JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000401 QSeed s = QSeed.seed;
402 Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
403 if (seed == null) {
404 return 1;
405 }
406 seed = seedinfo;
Raverf79fdb62025-06-03 06:02:49 +0000407 entitymanager.merge(seed);
root0dbc9812025-05-19 04:41:57 +0000408 return 0;
409 } catch (Exception e) {
410 e.printStackTrace();
411 return 2;
412 }
413 }
414
415 //传入搜索的关键词或句子,返回搜索到的种子信息(按照公共字符数量排序)
416 @Override
Raverf79fdb62025-06-03 06:02:49 +0000417 public Seed[] SearchSeed(String userQ){
rhj5ebd93c2025-06-07 15:57:28 +0800418 EntityManager em = createEntityManager();
419 try {
420 JPAQuery<Seed> query = new JPAQuery<>(em);
421 QSeed s = QSeed.seed;
422 QUser u = QUser.user;
423 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
424 List<Seed> seeds = query.select(s).from(s)
425 .leftJoin(s.user, u).fetchJoin()
426 .fetch();
root0dbc9812025-05-19 04:41:57 +0000427
rhj5ebd93c2025-06-07 15:57:28 +0800428 if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
429 return seeds.toArray(new Seed[0]);
430 }
431
432 String processedQuery = userQ.toLowerCase().trim();
433 Map<Seed, Integer> seedCountMap = new HashMap<>();
434 for(Seed seed : seeds){
435 String title = seed.title.toLowerCase().trim();
436 int count = countCommonCharacter(processedQuery, title);
437 seedCountMap.put(seed, count);
438 }
439 seeds.sort((s1, s2) -> {
440 int count1 = seedCountMap.getOrDefault(s1, 0);
441 int count2 = seedCountMap.getOrDefault(s2, 0);
442 return Integer.compare(count2, count1);
443 });
444
root0dbc9812025-05-19 04:41:57 +0000445 return seeds.toArray(new Seed[0]);
rhj5ebd93c2025-06-07 15:57:28 +0800446 } finally {
447 em.close();
root0dbc9812025-05-19 04:41:57 +0000448 }
root0dbc9812025-05-19 04:41:57 +0000449 }
450
451 //计算字符串公共字符数量
Raverf79fdb62025-06-03 06:02:49 +0000452 private int countCommonCharacter(String str1, String str2){
root0dbc9812025-05-19 04:41:57 +0000453 Map<Character, Integer> map1 = new HashMap<>();
454 Map<Character, Integer> map2 = new HashMap<>();
455
Raverf79fdb62025-06-03 06:02:49 +0000456 for(char c : str1.toCharArray()){
root0dbc9812025-05-19 04:41:57 +0000457 if (!Character.isWhitespace(c)) {
458 map1.put(c, map1.getOrDefault(c, 0) + 1);
459 }
460 }
461
Raverf79fdb62025-06-03 06:02:49 +0000462 for(char c : str2.toCharArray()){
root0dbc9812025-05-19 04:41:57 +0000463 if (!Character.isWhitespace(c)) {
464 map2.put(c, map2.getOrDefault(c, 0) + 1);
465 }
466 }
467
468 int res = 0;
Raverf79fdb62025-06-03 06:02:49 +0000469 for(char c : map1.keySet()){
root0dbc9812025-05-19 04:41:57 +0000470 if (map2.containsKey(c)) {
471 res += Math.min(map1.get(c), map2.get(c));
472 }
Raverf79fdb62025-06-03 06:02:49 +0000473
root0dbc9812025-05-19 04:41:57 +0000474 }
475 return res;
476 }
477
478 //返回状态:0 success,1 重复,2其他原因
479 @Override
Raverf79fdb62025-06-03 06:02:49 +0000480 public int AddNotice(Notice notice){
root0dbc9812025-05-19 04:41:57 +0000481 try {
rhj5ebd93c2025-06-07 15:57:28 +0800482 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000483 JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000484 QNotice n = QNotice.notice;
485 Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
486 if (checkNotice != null) {
487 return 1;
488 }
Raverf79fdb62025-06-03 06:02:49 +0000489
490 entitymanager.persist(notice);
root0dbc9812025-05-19 04:41:57 +0000491 return 0;
492 } catch (Exception e) {
493 e.printStackTrace();
494 return 2;
495 }
Raverf79fdb62025-06-03 06:02:49 +0000496
root0dbc9812025-05-19 04:41:57 +0000497 }
498
499 //返回状态:0 success,1 不存在,2其他原因
500 @Override
Raverf79fdb62025-06-03 06:02:49 +0000501 public boolean UpdateNotice(Notice notice){
root0dbc9812025-05-19 04:41:57 +0000502 try {
rhj5ebd93c2025-06-07 15:57:28 +0800503 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000504 Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
root0dbc9812025-05-19 04:41:57 +0000505 if (oldNotice == null) {
506 return false;
507 }
508 oldNotice = notice;
Raverf79fdb62025-06-03 06:02:49 +0000509 entitymanager.merge(oldNotice);
root0dbc9812025-05-19 04:41:57 +0000510 return true;
511 } catch (Exception e) {
512 e.printStackTrace();
513 return false;
514 }
515 }
516
517 //删除公告,返回状态:0 success,1 不存在,2其他原因
518 @Override
Raverf79fdb62025-06-03 06:02:49 +0000519 public boolean DeleteNotice(String noticeid){
root0dbc9812025-05-19 04:41:57 +0000520 try {
rhj5ebd93c2025-06-07 15:57:28 +0800521 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000522 Notice notice = entitymanager.find(Notice.class, noticeid);
root0dbc9812025-05-19 04:41:57 +0000523 if (notice == null) {
524 return false;
525 }
Raverf79fdb62025-06-03 06:02:49 +0000526 entitymanager.remove(notice);
root0dbc9812025-05-19 04:41:57 +0000527 return true;
528 } catch (Exception e) {
529 e.printStackTrace();
530 return false;
531 }
Raverf79fdb62025-06-03 06:02:49 +0000532
root0dbc9812025-05-19 04:41:57 +0000533 }
534
535 //获取用户的剩余邀请次数
Raverf79fdb62025-06-03 06:02:49 +0000536 public int GetUserAvailableInviteTimes(String userid){
root0dbc9812025-05-19 04:41:57 +0000537 try {
rhj5ebd93c2025-06-07 15:57:28 +0800538 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000539 JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000540 QUser u = QUser.user;
541 int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
Raverf79fdb62025-06-03 06:02:49 +0000542
root0dbc9812025-05-19 04:41:57 +0000543 return invite_left;
544 } catch (Exception e) {
545 e.printStackTrace();
546 return -1;
547 }
Raverf79fdb62025-06-03 06:02:49 +0000548
root0dbc9812025-05-19 04:41:57 +0000549 }
550
551 //邀请用户,返回状态:0 success,1 剩余次数不足,2,3其他原因
552 @Override
Raverf79fdb62025-06-03 06:02:49 +0000553 public int InviteUser(String inviterid,String inviteemail){
rhje18c3f72025-06-08 00:27:01 +0800554 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000555 try {
Raverf79fdb62025-06-03 06:02:49 +0000556 User user = entitymanager.find(User.class, inviterid);
root0dbc9812025-05-19 04:41:57 +0000557 if (user == null || !user.email.equals(inviteemail)) {
558 return 3;
559 }
560 if (user.invitetimes <= 0) {
561 return 1;
562 }
563 user.invitetimes -= 1;
rhje18c3f72025-06-08 00:27:01 +0800564 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000565 entitymanager.merge(user);
rhje18c3f72025-06-08 00:27:01 +0800566 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000567 return 0;
568 } catch (Exception e) {
569 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +0800570 if (entitymanager.getTransaction().isActive()) {
571 entitymanager.getTransaction().rollback();
572 }
root0dbc9812025-05-19 04:41:57 +0000573 return 2;
574 }
root0dbc9812025-05-19 04:41:57 +0000575 }
576
577 //添加一个收藏,返回状态:0 success,1 不存在,2其他原因
578 @Override
Raverf79fdb62025-06-03 06:02:49 +0000579 public boolean AddCollect(String userid,String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800580 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +0800581 try {
582 JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
583 QUser u2 = QUser.user;
584 User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
585 if (user == null) {
586 return false;
587 }
588 JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
589 QSeed p = QSeed.seed;
590 Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
591 if (seed == null) {
592 return false;
593 }
594 JPAQuery<String> query = new JPAQuery<>(entitymanager);
595 QUserStar u = QUserStar.userStar;
596 List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
Raverf79fdb62025-06-03 06:02:49 +0000597
rhje18c3f72025-06-08 00:27:01 +0800598 if (allSeedId.contains(seedid)) {
599 return false;
600 }
601 UserStar userStar = new UserStar();
602 userStar.userid = userid;
603 userStar.seedid = seedid;
604 entitymanager.getTransaction().begin();
605 entitymanager.persist(userStar);
606 entitymanager.getTransaction().commit();
607 return true;
608 } catch (Exception e) {
609 e.printStackTrace();
610 if (entitymanager.getTransaction().isActive()) {
611 entitymanager.getTransaction().rollback();
612 }
Raverf79fdb62025-06-03 06:02:49 +0000613 return false;
rhje18c3f72025-06-08 00:27:01 +0800614 } finally {
615 if (entitymanager != null) {
616 entitymanager.close();
617 }
Raverf79fdb62025-06-03 06:02:49 +0000618 }
root0dbc9812025-05-19 04:41:57 +0000619 }
620
621 //删除一个收藏,返回状态:0 success,1 不存在,2其他原因
622 @Override
rhje18c3f72025-06-08 00:27:01 +0800623 public boolean DeleteCollect(String userid, String seedid){
624 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000625 try {
Raverf79fdb62025-06-03 06:02:49 +0000626 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000627 QUserStar u = QUserStar.userStar;
628 UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
629 if (userStar == null) {
630 return true; // 收藏不存在
631 }
rhje18c3f72025-06-08 00:27:01 +0800632 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000633 entitymanager.remove(userStar);
rhje18c3f72025-06-08 00:27:01 +0800634 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000635 return true;
636 } catch (Exception e) {
637 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +0800638 if (entitymanager.getTransaction().isActive()) {
639 entitymanager.getTransaction().rollback();
640 }
root0dbc9812025-05-19 04:41:57 +0000641 return false;
rhje18c3f72025-06-08 00:27:01 +0800642 } finally {
643 if (entitymanager != null) {
644 entitymanager.close();
645 }
root0dbc9812025-05-19 04:41:57 +0000646 }
Raverf79fdb62025-06-03 06:02:49 +0000647
root0dbc9812025-05-19 04:41:57 +0000648 }
649
650 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800651 public int AddBegSeed(BegInfo info) {
652 if (info == null || info.begid == null || info.begid.isEmpty()) {
653 logger.warn("Invalid parameter: info is null or begid is empty");
654 return 2;
655 }
656
657 EntityTransaction tx = null;
658
659 try {
rhj5ebd93c2025-06-07 15:57:28 +0800660 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800661 tx = entitymanager.getTransaction();
662 tx.begin();
663
664 // 检查是否重复
665 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
666 if (existingBeg != null) {
667 logger.warn("BegSeed with ID {} already exists", info.begid);
668 return 1;
669 }
670
671 // 设置默认值
672 if (info.endtime == null) {
673 // 设置默认14天截止期
674 Calendar calendar = Calendar.getInstance();
675 calendar.add(Calendar.DAY_OF_MONTH, 14);
676 info.endtime = calendar.getTime();
677 }
678 info.hasseed = 0;
679
680 // 保存新的求种信息
681 entitymanager.persist(info);
682 tx.commit();
683
684 logger.info("Successfully added new BegSeed with ID: {}", info.begid);
685 return 0;
686
687 } catch (Exception e) {
688 if (tx != null && tx.isActive()) {
689 tx.rollback();
690 }
691 logger.error("Error adding BegSeed: {}", e.getMessage());
692 return 2;
693 }
root0dbc9812025-05-19 04:41:57 +0000694 }
695
696 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800697 public int UpdateBegSeed(BegInfo info) {
698 if (info == null || info.begid == null || info.begid.isEmpty()) {
699 logger.warn("Invalid parameter: info is null or begid is empty");
700 return 2;
701 }
702
703 EntityTransaction tx = null;
704
705 try {
rhj5ebd93c2025-06-07 15:57:28 +0800706 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800707 tx = entitymanager.getTransaction();
708 tx.begin();
709
710 // 检查是否存在
711 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
712 if (existingBeg == null) {
713 logger.warn("BegSeed with ID {} does not exist", info.begid);
714 return 1;
715 }
716
717 // 保持原有值不变的字段
718 info.hasseed = existingBeg.hasseed;
719 if (info.endtime == null) {
720 info.endtime = existingBeg.endtime;
721 }
722
723 // 更新求种信息
724 entitymanager.merge(info);
725 tx.commit();
726
727 logger.info("Successfully updated BegSeed with ID: {}", info.begid);
728 return 0;
729
730 } catch (Exception e) {
731 if (tx != null && tx.isActive()) {
732 tx.rollback();
733 }
734 logger.error("Error updating BegSeed: {}", e.getMessage());
735 return 2;
736 }
root0dbc9812025-05-19 04:41:57 +0000737 }
738
739 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800740 public int DeleteBegSeed(String begid) {
741 if (begid == null || begid.isEmpty()) {
742 logger.warn("Invalid parameter: begid is null or empty");
743 return 2;
744 }
745
746 EntityTransaction tx = null;
747
748 try {
rhj5ebd93c2025-06-07 15:57:28 +0800749 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800750 tx = entitymanager.getTransaction();
751 tx.begin();
752
753 // 查找要删除的求种信息
754 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
755 if (begInfo == null) {
756 logger.warn("BegSeed with ID {} does not exist", begid);
757 tx.rollback();
758 return 1;
759 }
760
761 // 删除求种信息
762 entitymanager.remove(begInfo);
763 tx.commit();
764
765 logger.info("Successfully deleted BegSeed with ID: {}", begid);
766 return 0;
767
768 } catch (Exception e) {
769 if (tx != null && tx.isActive()) {
770 tx.rollback();
771 }
772 logger.error("Error deleting BegSeed: {}", e.getMessage());
773 return 2;
774 }
root0dbc9812025-05-19 04:41:57 +0000775 }
776
777 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800778 public int VoteSeed(String begId, String seedId, String userId) {
779 if (begId == null || seedId == null || userId == null ||
780 begId.isEmpty() || seedId.isEmpty() || userId.isEmpty()) {
781 logger.warn("Invalid parameters: begId, seedId or userId is null or empty");
782 return 2;
783 }
784
785 EntityTransaction tx = null;
786
787 try {
rhj5ebd93c2025-06-07 15:57:28 +0800788 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800789 tx = entitymanager.getTransaction();
790 tx.begin();
791
792 // 检查求种信息是否存在
793 BegInfo begInfo = entitymanager.find(BegInfo.class, begId);
794 if (begInfo == null) {
795 logger.warn("BegSeed with ID {} does not exist", begId);
796 return 2;
797 }
798
799 // 检查用户是否已投票
800 Long voteCount = new JPAQuery<>(entitymanager)
801 .select(QUserVotes.userVotes.count())
802 .from(QUserVotes.userVotes)
803 .where(QUserVotes.userVotes.id.eq(new entity.UserVotesId(userId, begId, seedId)))
804 .fetchOne();
805
806 if (voteCount != null && voteCount > 0) {
807 logger.warn("User {} has already voted for seed {} in beg {}", userId, seedId, begId);
808 return 1;
809 }
810
811 // 创建新的投票记录
812 entitymanager.createNativeQuery("INSERT INTO UserVotes (user_id, beg_id, seed_id, created_at) " +
813 "VALUES (?, ?, ?, CURRENT_TIMESTAMP)")
814 .setParameter(1, userId)
815 .setParameter(2, begId)
816 .setParameter(3, seedId)
817 .executeUpdate();
818
819 // 更新SubmitSeed表中的投票数
820 entitymanager.createQuery("UPDATE SubmitSeed s SET s.votes = s.votes + 1 " +
821 "WHERE s.id.begId = :begId AND s.id.seedId = :seedId")
822 .setParameter("begId", begId)
823 .setParameter("seedId", seedId)
824 .executeUpdate();
825
826 tx.commit();
827 logger.info("Successfully added vote from user {} for seed {} in beg {}", userId, seedId, begId);
828 return 0;
829
830 } catch (Exception e) {
831 if (tx != null && tx.isActive()) {
832 tx.rollback();
833 }
834 logger.error("Error voting for seed: {}", e.getMessage());
835 return 2;
836 }
root0dbc9812025-05-19 04:41:57 +0000837 }
838
839 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800840 public int SubmitSeed(String begid, Seed seed) {
841 if (begid == null || seed == null || begid.isEmpty() || seed.seedid == null) {
842 logger.warn("Invalid parameters: begid or seed is null or empty");
843 return 2;
844 }
845
846 EntityTransaction tx = null;
847
848 try {
rhj5ebd93c2025-06-07 15:57:28 +0800849 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800850 tx = entitymanager.getTransaction();
851 tx.begin();
852
853 // 检查求种信息是否存在
854 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
855 if (begInfo == null) {
856 logger.warn("BegSeed with ID {} does not exist", begid);
857 return 2;
858 }
859
860 // 检查种子是否已提交过
861 QSubmitSeed ss = QSubmitSeed.submitSeed;
862 Long submitCount = new JPAQuery<>(entitymanager)
863 .select(ss.count())
864 .from(ss)
865 .where(ss.begInfo.begid.eq(begid))
866 .where(ss.seed.seedid.eq(seed.seedid))
867 .fetchOne();
868
869 if (submitCount > 0) {
870 logger.warn("Seed {} has already been submitted for beg {}", seed.seedid,
871 begid);
872 return 1;
873 }
874
875 // 保存种子信息(如果不存在)
876 if (entitymanager.find(Seed.class, seed.seedid) == null) {
877 entitymanager.persist(seed);
878 }
879
880 // 创建提交记录
881 entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
882 .setParameter(1, begid)
883 .setParameter(2, seed.seedid)
884 .executeUpdate();
885
886 tx.commit();
887 logger.info("Successfully submitted seed {} for beg {}", seed.seedid, begid);
888 return 0;
889
890 } catch (Exception e) {
891 if (tx != null && tx.isActive()) {
892 tx.rollback();
893 }
894 logger.error("Error submitting seed: {}", e.getMessage());
895 return 2;
896 }
root0dbc9812025-05-19 04:41:57 +0000897 }
898
899 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800900 public void SettleBeg() {
901 EntityTransaction tx = null;
902
903 try {
rhj5ebd93c2025-06-07 15:57:28 +0800904 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800905 tx = entitymanager.getTransaction();
906 tx.begin();
907
908 // 1. 获取所有已过期且未完成的求种信息
909 QBegInfo b = QBegInfo.begInfo;
910 List<BegInfo> expiredBegs = new JPAQuery<>(entitymanager)
911 .select(b)
912 .from(b)
913 .where(b.endtime.loe(new Date())
914 .and(b.hasseed.eq(0)))
915 .fetch();
916
917 for (BegInfo beg : expiredBegs) {
918 // 2. 查找投票最多的提交任务
919 QSubmitSeed ss = QSubmitSeed.submitSeed;
920 Tuple topSubmission = new JPAQuery<>(entitymanager)
921 .select(ss.seed.seedid, ss.votes)
922 .from(ss)
923 .where(ss.begInfo.begid.eq(beg.begid))
924 .orderBy(ss.votes.desc())
925 .limit(1)
926 .fetchOne();
927
928 if (topSubmission != null && topSubmission.get(ss.votes) > 0) {
929 String seedId = topSubmission.get(ss.seed.seedid);
930
931 // 3. 获取上传者ID
932 QSeed s = QSeed.seed;
933 String ownerId = new JPAQuery<>(entitymanager)
934 .select(s.seeduserid)
935 .from(s)
936 .where(s.seedid.eq(seedId))
937 .fetchOne();
938
939 // 4. 获取上传者的PT信息并更新魔力值
940 UserPT ownerPT = entitymanager.find(UserPT.class, ownerId);
941 if (ownerPT != null) {
942 // 5. 发放奖励
943 ownerPT.magic += beg.magic;
944 entitymanager.merge(ownerPT);
945
946 // 6. 更新求种状态
947 beg.hasseed = 1;
948 entitymanager.merge(beg);
949
950 logger.info("Reward {} magic points awarded to user {} for beg {}",
951 beg.magic, ownerId, beg.begid);
952 }
953 }
954 }
955
956 tx.commit();
957 logger.info("Successfully settled {} expired beg requests",
958 expiredBegs.size());
959
960 } catch (Exception e) {
961 if (tx != null && tx.isActive()) {
962 tx.rollback();
963 }
964 logger.error("Error settling beg requests: {}", e.getMessage(), e);
965 }
root0dbc9812025-05-19 04:41:57 +0000966 }
967
968 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800969 public int AddPost(Post post) {
970 if (post == null || post.postid == null || post.postid.isEmpty()) {
971 logger.warn("Invalid parameter: post is null or postid is empty");
972 return 2;
973 }
974
975 EntityTransaction tx = null;
976
977 try {
rhj5ebd93c2025-06-07 15:57:28 +0800978 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800979 tx = entitymanager.getTransaction();
980 tx.begin();
981
982 // 检查是否重复
983 Post existingPost = entitymanager.find(Post.class, post.postid);
984 if (existingPost != null) {
985 logger.warn("Post with ID {} already exists", post.postid);
986 return 1;
987 }
988
989 // 检查用户是否存在
990 User user = entitymanager.find(User.class, post.postuserid);
991 if (user == null) {
992 logger.warn("User with ID {} does not exist", post.postuserid);
993 return 2;
994 }
995
996 // 设置初始值
997 if (post.posttime == null) {
998 post.posttime = new Date();
999 }
1000 post.replytime = 0;
1001 post.readtime = 0;
1002
1003 // 保存帖子
1004 entitymanager.persist(post);
1005 tx.commit();
1006
1007 logger.info("Successfully added new post with ID: {}", post.postid);
1008 return 0;
1009
1010 } catch (Exception e) {
1011 if (tx != null && tx.isActive()) {
1012 tx.rollback();
1013 }
1014 logger.error("Error adding post: {}", e.getMessage());
1015 return 2;
1016 }
root0dbc9812025-05-19 04:41:57 +00001017 }
1018
1019 @Override
TRM-coding87c24972025-06-07 14:05:29 +08001020 public int UpdatePost(Post post) {
1021 if (post == null || post.postid == null || post.postid.isEmpty()) {
1022 logger.warn("Invalid parameter: post is null or postid is empty");
1023 return 2;
1024 }
1025
1026 EntityTransaction tx = null;
1027
1028 try {
rhj5ebd93c2025-06-07 15:57:28 +08001029 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +08001030 tx = entitymanager.getTransaction();
1031 tx.begin();
1032
1033 // 检查帖子是否存在
1034 Post existingPost = entitymanager.find(Post.class, post.postid);
1035 if (existingPost == null) {
1036 logger.warn("Post with ID {} does not exist", post.postid);
1037 return 1;
1038 }
1039
1040 // 保持原有不可修改的字段
1041 post.postuserid = existingPost.postuserid;
1042 post.posttime = existingPost.posttime;
1043 post.replytime = existingPost.replytime;
1044 post.readtime = existingPost.readtime;
1045
1046 // 更新帖子
1047 entitymanager.merge(post);
1048 tx.commit();
1049
1050 logger.info("Successfully updated post with ID: {}", post.postid);
1051 return 0;
1052
1053 } catch (Exception e) {
1054 if (tx != null && tx.isActive()) {
1055 tx.rollback();
1056 }
1057 logger.error("Error updating post: {}", e.getMessage());
1058 return 2;
1059 }
root0dbc9812025-05-19 04:41:57 +00001060 }
1061
1062 @Override
Raverf79fdb62025-06-03 06:02:49 +00001063 public int DeletePost(String postid){
TRM-coding87c24972025-06-07 14:05:29 +08001064 if (postid == null || postid.isEmpty()) {
1065 logger.warn("Invalid parameter: postid is null or empty");
1066 return 2;
1067 }
1068
1069 EntityManager em = null;
1070 EntityTransaction tx = null;
1071
1072 try {
1073 em = emf.createEntityManager();
1074 tx = em.getTransaction();
1075 tx.begin();
1076
1077 // 查找要删除的帖子
1078 Post post = em.find(Post.class, postid);
1079 if (post == null) {
1080 logger.warn("Post with ID {} does not exist", postid);
1081 tx.rollback();
1082 return 1;
1083 }
1084
1085 // 删除帖子(由于设置了级联删除,相关的回复会自动删除)
1086 em.remove(post);
1087 tx.commit();
1088
1089 logger.info("Successfully deleted post with ID: {}", postid);
1090 return 0;
1091
1092 } catch (Exception e) {
1093 if (tx != null && tx.isActive()) {
1094 tx.rollback();
1095 }
1096 logger.error("Error deleting post: {}", e.getMessage());
1097 return 2;
1098 } finally {
1099 if (em != null) {
1100 em.close();
1101 }
1102 }
root0dbc9812025-05-19 04:41:57 +00001103 }
1104
1105 @Override
Raverf79fdb62025-06-03 06:02:49 +00001106 public int AddComment(String postid, String userid, String comment){
TRM-coding87c24972025-06-07 14:05:29 +08001107 if (postid == null || postid.isEmpty() ||
1108 userid == null || userid.isEmpty() ||
1109 comment == null || comment.isEmpty()) {
1110 logger.warn("Invalid parameters: postid, userid or comment is null or empty");
1111 return 2;
1112 }
1113
1114 EntityManager em = null;
1115 EntityTransaction tx = null;
1116
1117 try {
1118 em = emf.createEntityManager();
1119 tx = em.getTransaction();
1120 tx.begin();
1121
1122 // 检查帖子是否存在
1123 Post post = em.find(Post.class, postid);
1124 if (post == null) {
1125 logger.warn("Post with ID {} does not exist", postid);
1126 return 1;
1127 }
1128
1129 // 检查评论用户是否存在
1130 User user = em.find(User.class, userid);
1131 if (user == null) {
1132 logger.warn("User with ID {} does not exist", userid);
1133 return 1;
1134 }
1135
1136 // 创建新的评论
1137 PostReply reply = new PostReply();
1138 reply.replyid = UUID.randomUUID().toString();
1139 reply.postid = postid;
1140 reply.authorid = userid;
1141 reply.content = comment;
1142 reply.createdAt = new Date();
1143
1144 // 保存评论
1145 em.persist(reply);
1146
1147 // 更新帖子的回复数
1148 post.replytime += 1;
1149 em.merge(post);
1150
1151 tx.commit();
1152
1153 logger.info("Successfully added comment by user {} to post {}, reply ID: {}",
1154 userid, postid, reply.replyid);
1155 return 0;
1156
1157 } catch (Exception e) {
1158 if (tx != null && tx.isActive()) {
1159 tx.rollback();
1160 }
1161 logger.error("Error adding comment: {}", e.getMessage());
1162 return 2;
1163 } finally {
1164 if (em != null) {
1165 em.close();
1166 }
1167 }
root0dbc9812025-05-19 04:41:57 +00001168 }
1169
1170 @Override
Raverf79fdb62025-06-03 06:02:49 +00001171 public int DeleteComment(String postid,String commentid){
TRM-coding87c24972025-06-07 14:05:29 +08001172 if (postid == null || postid.isEmpty() || commentid == null || commentid.isEmpty()) {
1173 logger.warn("Invalid parameters: postid or commentid is null or empty");
1174 return 2;
1175 }
1176
1177 EntityManager em = null;
1178 EntityTransaction tx = null;
1179
1180 try {
1181 em = emf.createEntityManager();
1182 tx = em.getTransaction();
1183 tx.begin();
1184
1185 // 检查帖子是否存在
1186 Post post = em.find(Post.class, postid);
1187 if (post == null) {
1188 logger.warn("Post with ID {} does not exist", postid);
1189 return 1;
1190 }
1191
1192 // 检查评论是否存在且属于该帖子
1193 PostReply reply = em.find(PostReply.class, commentid);
1194 if (reply == null || !reply.postid.equals(postid)) {
1195 logger.warn("Comment {} does not exist or does not belong to post {}", commentid, postid);
1196 return 1;
1197 }
1198
1199 // 删除评论
1200 em.remove(reply);
1201
1202 // 更新帖子的回复数
1203 post.replytime = Math.max(0, post.replytime - 1);
1204 em.merge(post);
1205
1206 tx.commit();
1207
1208 logger.info("Successfully deleted comment {} from post {}", commentid, postid);
1209 return 0;
1210
1211 } catch (Exception e) {
1212 if (tx != null && tx.isActive()) {
1213 tx.rollback();
1214 }
1215 logger.error("Error deleting comment: {}", e.getMessage());
1216 return 2;
1217 } finally {
1218 if (em != null) {
1219 em.close();
1220 }
1221 }
root0dbc9812025-05-19 04:41:57 +00001222 }
1223
1224 @Override
Raverf79fdb62025-06-03 06:02:49 +00001225 public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量,返回状态:0 success,1 不存在,2其他原因
root0dbc9812025-05-19 04:41:57 +00001226 {
TRM-coding87c24972025-06-07 14:05:29 +08001227 if (userid == null || userid.isEmpty() || magic <= 0) {
1228 logger.warn("参数无效: userid为空或magic <= 0");
1229 return false;
1230 }
1231
1232 EntityManager em = null;
1233 EntityTransaction tx = null;
1234
1235 try {
1236 em = emf.createEntityManager();
1237 tx = em.getTransaction();
1238 tx.begin();
1239
1240 UserPT userPT = em.find(UserPT.class, userid);
1241 if (userPT == null) {
1242 logger.warn("未找到用户 {} 的PT信息", userid);
1243 return false;
1244 }
1245
1246 if (userPT.magic < magic) {
1247 logger.warn("用户 {} 的魔力值不足", userid);
1248 return false;
1249 }
1250
1251 // 1:1兑换,直接加上魔力值(假设单位是MB)
1252 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001253 userPT.upload += magic * 10000000;
TRM-coding87c24972025-06-07 14:05:29 +08001254
1255 // 更新分享率
1256 if (userPT.download > 0) {
1257 userPT.share = (double) userPT.upload / userPT.download;
1258 }
1259
1260 em.merge(userPT);
1261 tx.commit();
1262
1263 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 上传量", userid, magic, magic);
1264 return true;
1265
1266 } catch (Exception e) {
1267 if (tx != null && tx.isActive()) {
1268 tx.rollback();
1269 }
rhje18c3f72025-06-08 00:27:01 +08001270 e.printStackTrace();
TRM-coding87c24972025-06-07 14:05:29 +08001271 logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
1272 return false;
1273 } finally {
1274 if (em != null) {
1275 em.close();
1276 }
1277 }
root0dbc9812025-05-19 04:41:57 +00001278 }
Raverf79fdb62025-06-03 06:02:49 +00001279
root0dbc9812025-05-19 04:41:57 +00001280 @Override
Raverf79fdb62025-06-03 06:02:49 +00001281 public boolean ExchangeMagicToDownload(String userid,int magic)
1282 {
TRM-coding87c24972025-06-07 14:05:29 +08001283 if (userid == null || userid.isEmpty() || magic <= 0) {
1284 logger.warn("参数无效: userid为空或magic <= 0");
1285 return false;
1286 }
1287
1288 EntityManager em = null;
1289 EntityTransaction tx = null;
1290
1291 try {
1292 em = emf.createEntityManager();
1293 tx = em.getTransaction();
1294 tx.begin();
1295
1296 UserPT userPT = em.find(UserPT.class, userid);
1297 if (userPT == null) {
1298 logger.warn("未找到用户 {} 的PT信息", userid);
1299 return false;
1300 }
1301
1302 if (userPT.magic < magic) {
1303 logger.warn("用户 {} 的魔力值不足", userid);
1304 return false;
1305 }
1306
1307 // 1:1兑换,直接减去魔力值对应的下载量(假设单位是MB)
1308 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001309 userPT.download = Math.max(0, userPT.download - magic * 10000000);
TRM-coding87c24972025-06-07 14:05:29 +08001310
1311 // 更新分享率
1312 if (userPT.download > 0) {
1313 userPT.share = (double) userPT.upload / userPT.download;
1314 }
1315
1316 em.merge(userPT);
1317 tx.commit();
1318
1319 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 下载量减免", userid, magic, magic);
1320 return true;
1321
1322 } catch (Exception e) {
1323 if (tx != null && tx.isActive()) {
1324 tx.rollback();
1325 }
1326 logger.error("魔力值兑换下载量时发生错误: {}", e.getMessage());
1327 return false;
1328 } finally {
1329 if (em != null) {
1330 em.close();
1331 }
1332 }
root0dbc9812025-05-19 04:41:57 +00001333 }//将魔力值兑换为下载量,返回状态:0 success,1 不存在,2其他原因
1334
1335 @Override
Raverf79fdb62025-06-03 06:02:49 +00001336 public boolean ExchangeMagicToVip(String userid,int magic){
TRM-coding87c24972025-06-07 14:05:29 +08001337 if (userid == null || userid.isEmpty() || magic <= 0) {
1338 logger.warn("参数无效: userid为空或magic <= 0");
1339 return false;
1340 }
1341
1342 EntityManager em = null;
1343 EntityTransaction tx = null;
1344
1345 try {
1346 em = emf.createEntityManager();
1347 tx = em.getTransaction();
1348 tx.begin();
1349
1350 UserPT userPT = em.find(UserPT.class, userid);
1351 if (userPT == null) {
1352 logger.warn("未找到用户 {} 的PT信息", userid);
1353 return false;
1354 }
1355
1356 if (userPT.magic < magic) {
1357 logger.warn("用户 {} 的魔力值不足", userid);
1358 return false;
1359 }
1360
1361 // 1:1兑换VIP下载次数
1362 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001363 userPT.viptime += magic / 100;
TRM-coding87c24972025-06-07 14:05:29 +08001364
1365 em.merge(userPT);
1366 tx.commit();
1367
1368 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {} 次VIP下载次数", userid, magic, magic);
1369 return true;
1370
1371 } catch (Exception e) {
1372 if (tx != null && tx.isActive()) {
1373 tx.rollback();
1374 }
1375 logger.error("魔力值兑换VIP下载次数时发生错误: {}", e.getMessage());
1376 return false;
1377 } finally {
1378 if (em != null) {
1379 em.close();
1380 }
1381 }
root0dbc9812025-05-19 04:41:57 +00001382 }
1383 //将魔力值兑换为VIP次数,返回状态:0 success,1 不存在,2其他原因
1384
1385 @Override
Raverf79fdb62025-06-03 06:02:49 +00001386 public boolean UploadTransmitProfile(Profile profile){
TRM-coding87c24972025-06-07 14:05:29 +08001387 if (profile == null || profile.profileurl == null || profile.profileurl.isEmpty() ||
1388 profile.userid == null || profile.userid.isEmpty()) {
1389 logger.warn("参数无效: profile为空或必要字段为空");
1390 return false;
1391 }
1392
1393 EntityManager em = null;
1394 EntityTransaction tx = null;
1395
1396 try {
1397 em = emf.createEntityManager();
1398 tx = em.getTransaction();
1399 tx.begin();
1400
1401 // 检查用户是否存在
1402 User user = em.find(User.class, profile.userid);
1403 if (user == null) {
1404 logger.warn("用户 {} 不存在", profile.userid);
1405 return false;
1406 }
1407
1408 // 检查是否已存在相同的迁移申请
1409 Profile existingProfile = em.find(Profile.class, profile.profileurl);
1410 if (existingProfile != null) {
1411 logger.warn("迁移申请 {} 已存在", profile.profileurl);
1412 return false;
1413 }
1414
1415 // 设置初始值
1416 profile.exampass = false;
1417 profile.magicgived = "0";
1418 profile.uploadgived = "0";
1419
1420 // 保存迁移申请
1421 em.persist(profile);
1422 tx.commit();
1423
1424 logger.info("成功上传迁移申请 {}", profile.profileurl);
1425 return true;
1426
1427 } catch (Exception e) {
1428 if (tx != null && tx.isActive()) {
1429 tx.rollback();
1430 }
1431 logger.error("上传迁移申请时发生错误: {}", e.getMessage());
1432 return false;
1433 } finally {
1434 if (em != null) {
1435 em.close();
1436 }
1437 }
root0dbc9812025-05-19 04:41:57 +00001438 }
1439
1440 @Override
Raverf79fdb62025-06-03 06:02:49 +00001441 public Profile GetTransmitProfile(String profileid){
TRM-coding87c24972025-06-07 14:05:29 +08001442 if (profileid == null || profileid.isEmpty()) {
1443 logger.warn("参数无效: profileid为空");
1444 return null;
1445 }
1446
1447 EntityManager em = null;
1448
1449 try {
1450 em = emf.createEntityManager();
1451 Profile profile = em.find(Profile.class, profileid);
1452 if (profile == null) {
1453 logger.warn("未找到迁移申请 {}", profileid);
1454 return null;
1455 }
1456
1457 logger.info("成功获取迁移申请 {}", profileid);
1458 return profile;
1459
1460 } catch (Exception e) {
1461 logger.error("获取迁移申请时发生错误: {}", e.getMessage());
1462 return null;
1463 } finally {
1464 if (em != null) {
1465 em.close();
1466 }
1467 }
root0dbc9812025-05-19 04:41:57 +00001468 }
1469 //获取迁移信息
Raverf79fdb62025-06-03 06:02:49 +00001470
root0dbc9812025-05-19 04:41:57 +00001471 @Override
Raverf79fdb62025-06-03 06:02:49 +00001472 public boolean ExamTransmitProfile(String profileid,boolean result){
TRM-coding87c24972025-06-07 14:05:29 +08001473 if (profileid == null || profileid.isEmpty()) {
1474 logger.warn("参数无效: profileid为空");
1475 return false;
1476 }
1477
1478 EntityManager em = null;
1479 EntityTransaction tx = null;
1480
1481 try {
1482 em = emf.createEntityManager();
1483 tx = em.getTransaction();
1484 tx.begin();
1485
1486 // 查找迁移申请
1487 Profile profile = em.find(Profile.class, profileid);
1488 if (profile == null) {
1489 logger.warn("未找到迁移申请 {}", profileid);
1490 return false;
1491 }
1492
1493 // 更新审核状态
1494 profile.exampass = result;
1495
1496 if (result) {
1497 // 如果审核通过,更新用户的PT信息
1498 UserPT userPT = em.find(UserPT.class, profile.userid);
1499 if (userPT != null) {
1500 // 发放魔力值
1501 int magicToGive = Integer.parseInt(profile.magictogive);
1502 userPT.magic += magicToGive;
1503 profile.magicgived = String.valueOf(magicToGive);
1504
1505 // 发放上传量
1506 long uploadToGive = Long.parseLong(profile.uploadtogive);
1507 userPT.upload += uploadToGive;
1508 profile.uploadgived = String.valueOf(uploadToGive);
1509
1510 em.merge(userPT);
rhje18c3f72025-06-08 00:27:01 +08001511 em.merge(profile);
TRM-coding87c24972025-06-07 14:05:29 +08001512 }
rhje18c3f72025-06-08 00:27:01 +08001513 } else {
1514 // 如果审核不通过,删除迁移申请
1515 em.remove(profile);
1516 logger.info("迁移申请 {} 审核不通过,已删除", profileid);
TRM-coding87c24972025-06-07 14:05:29 +08001517 }
TRM-coding87c24972025-06-07 14:05:29 +08001518 tx.commit();
1519
1520 logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
1521 return true;
1522
1523 } catch (Exception e) {
1524 if (tx != null && tx.isActive()) {
1525 tx.rollback();
1526 }
1527 logger.error("审核迁移申请时发生错误: {}", e.getMessage());
1528 return false;
1529 } finally {
1530 if (em != null) {
1531 em.close();
1532 }
1533 }
root0dbc9812025-05-19 04:41:57 +00001534 }
1535 //审核迁移信息,0成功,1失败
1536 @Override
Raverf79fdb62025-06-03 06:02:49 +00001537 public Profile[] GetTransmitProfileList(){
TRM-coding87c24972025-06-07 14:05:29 +08001538 EntityManager em = null;
1539
1540 try {
1541 em = emf.createEntityManager();
1542
1543 // 获取所有迁移申请
1544 QProfile p = QProfile.profile;
1545 List<Profile> profiles = new JPAQuery<>(em)
1546 .select(p)
1547 .from(p)
1548 .fetch();
1549
1550 logger.info("成功获取所有迁移申请,共 {} 条", profiles.size());
1551 return profiles.toArray(new Profile[0]);
1552
1553 } catch (Exception e) {
1554 logger.error("获取迁移申请列表时发生错误: {}", e.getMessage());
1555 return new Profile[0];
1556 } finally {
1557 if (em != null) {
1558 em.close();
1559 }
1560 }
root0dbc9812025-05-19 04:41:57 +00001561 }
1562 //获取所有迁移信息
1563
rhj46f62c42025-06-06 23:24:10 +08001564 @Override
1565 public Post[] GetPostList() {
rhj5ebd93c2025-06-07 15:57:28 +08001566 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001567 try{
1568 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1569 QPost p = QPost.post;
1570 List<Post> posts = query.select(p).from(p).fetch();
1571 return posts.toArray(new Post[0]);
1572 } catch (Exception e) {
1573 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1574 return new Post[0];
1575 } finally {
1576 entitymanager.close();
1577 logger.info("Post list retrieved successfully.");
1578 }
rhj46f62c42025-06-06 23:24:10 +08001579 }
1580
rhj5b69b7e2025-06-07 01:28:08 +08001581 @Override
1582 public Post GetPost(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001583 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001584 try {
1585 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1586 QPost p = QPost.post;
1587 Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
1588 return post;
1589 } catch (Exception e) {
1590 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1591 return new Post();
1592 } finally {
1593 entitymanager.close();
1594 logger.info("Post list retrieved successfully.");
1595 }
rhj5b69b7e2025-06-07 01:28:08 +08001596 }
1597
1598 @Override
1599 public PostReply[] GetPostReplyList(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001600 EntityManager entitymanager = createEntityManager();
rhj5b69b7e2025-06-07 01:28:08 +08001601 JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
1602 QPostReply p = QPostReply.postReply;
1603 List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
1604 return replies.toArray(new PostReply[0]);
1605 }
rhj5ebd93c2025-06-07 15:57:28 +08001606
1607 @Override
1608 public Post[] SearchPost(String postQ) {
1609 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001610 try {
1611 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1612 QPost p = QPost.post;
1613 List<Post> posts = query.select(p).from(p).fetch();
rhj5ebd93c2025-06-07 15:57:28 +08001614
rhje18c3f72025-06-08 00:27:01 +08001615 if (posts == null || postQ == null || postQ.trim().isEmpty()) {
1616 return posts.toArray(new Post[0]);
1617 }
1618
1619 String processedQuery = postQ.toLowerCase().trim();
1620 Map<Post, Integer> postCountMap = new HashMap<>();
1621 for(Post post : posts){
1622 String title = post.posttitle.toLowerCase().trim();
1623 int count = countCommonCharacter(processedQuery, title);
1624 postCountMap.put(post, count);
1625 }
1626 posts.sort((s1, s2) -> {
1627 int count1 = postCountMap.getOrDefault(s1, 0);
1628 int count2 = postCountMap.getOrDefault(s2, 0);
1629 return Integer.compare(count2, count1);
1630 });
1631
rhj5ebd93c2025-06-07 15:57:28 +08001632 return posts.toArray(new Post[0]);
rhje18c3f72025-06-08 00:27:01 +08001633 } catch (Exception e) {
1634 logger.error("搜索帖子时发生错误: {}", e.getMessage());
1635 return new Post[0];
1636 } finally {
1637 entitymanager.close();
1638 logger.info("Post search completed successfully.");
rhj5ebd93c2025-06-07 15:57:28 +08001639 }
rhj5ebd93c2025-06-07 15:57:28 +08001640 }
Raverf79fdb62025-06-03 06:02:49 +00001641
rhje18c3f72025-06-08 00:27:01 +08001642 @Override
1643 public int CheckAdmin(String userid) {
1644 if (userid == null || userid.isEmpty()) {
1645 logger.warn("参数无效: userid为空");
1646 return 2; // 参数无效
1647 }
1648
1649 EntityManager entitymanager = createEntityManager();
1650 JPAQuery<String> query = new JPAQuery<>(entitymanager);
1651 QAdmin a = QAdmin.admin;
1652 String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
1653 if (adminId == null) {
1654 logger.warn("用户 {} 不是管理员", userid);
1655 return 1; // 用户不是管理员
1656 } else {
1657 logger.info("用户 {} 是管理员", userid);
1658 return 0; // 用户是管理员
1659 }
1660 }
1661
1662 @Override
1663 public int InviteNewUser(String inviterid, String invitedemail) {
1664 EntityManager entitymanager = createEntityManager();
1665 try {
1666 User user = entitymanager.find(User.class, inviterid);
1667 if (user == null) {
1668 return 3;
1669 }
1670 if (user.invitetimes <= 0) {
1671 return 1;
1672 }
1673 user.invitetimes -= 1;
1674
1675 UserInvite invite = new UserInvite();
1676 invite.userId = inviterid;
1677 invite.inviterEmail = invitedemail;
1678 invite.inviterRegistered = false;
1679 invite.user = user;
1680
1681 entitymanager.getTransaction().begin();
1682 entitymanager.merge(user);
1683 entitymanager.persist(invite);
1684 entitymanager.getTransaction().commit();
1685 return 0;
1686 } catch (Exception e) {
1687 e.printStackTrace();
1688 if (entitymanager.getTransaction().isActive()) {
1689 entitymanager.getTransaction().rollback();
1690 }
1691 return 2;
1692 }
1693 }
1694
1695 @Override
1696 public UserStar[] GetUserStarList(String userid) {
1697 if (userid == null || userid.isEmpty()) {
1698 logger.warn("参数无效: userid为空");
1699 return new UserStar[0];
1700 }
1701
1702 EntityManager entitymanager = createEntityManager();
1703 try {
1704 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
1705 QUserStar us = QUserStar.userStar;
1706 List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
1707 return stars.toArray(new UserStar[0]);
1708 } catch (Exception e) {
1709 e.printStackTrace();
1710 if (entitymanager.getTransaction().isActive()) {
1711 entitymanager.getTransaction().rollback();
1712 }
1713 return new UserStar[0];
1714 } finally {
1715 if (entitymanager != null) {
1716 entitymanager.close();
1717 }
1718 }
1719 }
1720
1721 @Override
1722 public int UploadMigration(String userid, File file) {
1723 if (userid == null || userid.isEmpty() || file == null) {
1724 return 2; // 参数无效
1725 }
1726
1727 EntityManager entitymanager = createEntityManager();
1728
1729 try {
1730 // 检查用户是否存在
1731 User user = entitymanager.find(User.class, userid);
1732 if (user == null) {
1733 return 1; // 用户不存在
1734 }
1735
1736 // 创建迁移记录
1737 Profile migration = new Profile();
1738 migration.profileurl = java.util.UUID.randomUUID().toString();
1739 migration.userid = userid;
1740 migration.uploadtogive = "0"; // 初始上传量为0
1741 migration.magictogive = "0"; // 初始魔力值为0
1742 migration.downloadgived = "0"; // 初始下载量为0
1743 migration.uploadgived = "0"; // 初始上传量为0
1744 migration.magicgived = "0"; // 初始魔力值为0
1745 migration.downloadgived = "0"; // 初始下载量为0
1746 migration.exampass = false; // 初始审核状态为未通过
1747 migration.user = user;
1748 Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
1749 if (!Files.exists(storageDir)) {
1750 Files.createDirectories(storageDir);
1751 }
1752 String filename = file.getName();
1753 Path target = storageDir.resolve(migration.profileurl + "_" + filename);
1754 Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
1755 migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
1756
1757 entitymanager.getTransaction().begin();
1758 entitymanager.persist(migration);
1759 entitymanager.getTransaction().commit();
1760
1761 return 0; // 成功
1762
1763 } catch (Exception e) {
1764 if (entitymanager.getTransaction().isActive()) {
1765 entitymanager.getTransaction().rollback();
1766 }
1767 e.printStackTrace();
1768 return 2; // 其他错误
1769 } finally {
1770 if (entitymanager != null) {
1771 entitymanager.close();
1772 }
1773 }
1774 }
1775
1776 @Override
1777 public BegSeedDetail[] GetBegList() {
1778 EntityManager entitymanager = createEntityManager();
1779 try {
1780 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1781 QBegInfo b = QBegInfo.begInfo;
1782 List<BegInfo> begList = query.select(b).from(b).fetch();
1783
1784 List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
1785 for (BegInfo begInfo : begList) {
1786 // 查询对应的BegInfo表的Info字段
1787 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1788 // 构造BegSeedDetail对象
1789 BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
1790 begSeedDetailList.add(begSeedDetail);
1791 }
1792
1793 return begSeedDetailList.toArray(new BegSeedDetail[0]);
1794 } catch (Exception e) {
1795 if (entitymanager.getTransaction().isActive()) {
1796 entitymanager.getTransaction().rollback();
1797 }
1798 e.printStackTrace();
1799 return new BegSeedDetail[0];
1800 } finally {
1801 if(entitymanager != null){
1802 entitymanager.close();
1803 }
1804 }
1805 }
1806
1807 @Override
1808 public BegInfo GetBegDetail(String begid) {
1809 EntityManager entitymanager = createEntityManager();
1810 try {
1811 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1812 QBegInfo b = QBegInfo.begInfo;
1813 BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1814 return begDetail;
1815 } catch (Exception e) {
1816 if (entitymanager.getTransaction().isActive()) {
1817 entitymanager.getTransaction().rollback();
1818 }
1819 e.printStackTrace();
1820 return null;
1821 } finally {
1822 if(entitymanager != null){
1823 entitymanager.close();
1824 }
1825 }
1826 }
1827
1828 @Override
1829 public BegSeedDetail GetBegSeedDetail(String begid) {
1830 if (begid == null || begid.isEmpty()) {
1831 return null;
1832 }
1833
1834 EntityManager entitymanager = createEntityManager();
1835 try {
1836 // 查询 BegSeed 表数据
1837 JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
1838 QBegInfo b = QBegInfo.begInfo;
1839 BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1840
1841 if (begInfo == null) {
1842 return null;
1843 }
1844
1845 // 查询 BegInfo 表的 Info 字段
1846 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1847
1848 // 构造返回对象
1849 return new BegSeedDetail(begInfo, begInfoDetail);
1850 } catch (Exception e) {
1851 if (entitymanager.getTransaction().isActive()) {
1852 entitymanager.getTransaction().rollback();
1853 }
1854 e.printStackTrace();
1855 return null;
1856 } finally {
1857 if(entitymanager != null){
1858 entitymanager.close();
1859 }
1860 }
1861 }
1862
1863 @Override
1864 public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
1865 if (begid == null || begid.isEmpty()) {
1866 return new SeedWithVotes[0];
1867 }
1868
1869 EntityManager entitymanager = createEntityManager();
1870 try {
1871 JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
1872 QSubmitSeed ss = QSubmitSeed.submitSeed;
1873 QSeed s = QSeed.seed;
1874
1875 List<Tuple> results = query.select(s, ss.votes)
1876 .from(ss)
1877 .join(ss.seed, s)
1878 .where(ss.begInfo.begid.eq(begid))
1879 .fetch();
1880
1881 List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
1882 for (Tuple result : results) {
1883 Seed seed = result.get(s);
1884 Integer votes = result.get(ss.votes);
1885 seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
1886 }
1887
1888 return seedsWithVotes.toArray(new SeedWithVotes[0]);
1889 } catch (Exception e) {
1890 return new SeedWithVotes[0];
1891 } finally {
1892 entitymanager.close();
1893 }
1894 }
1895
1896 @Override
1897 public int SubmitBegSeed(String begid, String seedid, String userid) {
1898 if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
1899 return 2; // 参数无效
1900 }
1901
1902 EntityManager entitymanager = createEntityManager();
1903 EntityTransaction tx = entitymanager.getTransaction();
1904
1905 try {
1906 tx.begin();
1907
1908 // 检查种子信息是否存在
1909 Seed seed = entitymanager.find(Seed.class, seedid);
1910 if (seed == null || !seed.seeduserid.equals(userid)) {
1911 return 1;
1912 }
1913
1914 // int ret = SubmitSeed(begid, seed);
1915 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
1916 if (begInfo == null) {
1917 return 2;
1918 }
1919
1920 // 检查种子是否已提交过
1921 QSubmitSeed ss = QSubmitSeed.submitSeed;
1922 SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
1923 .select(ss)
1924 .from(ss)
1925 .where(ss.begInfo.begid.eq(begid))
1926 .where(ss.seed.seedid.eq(seed.seedid))
1927 .fetchOne();
1928
1929 submitSeed = new SubmitSeed();
1930 submitSeed.begInfo = begInfo;
1931 submitSeed.seed = seed;
1932 submitSeed.votes = 0; // 初始投票数为0
1933 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1934 if (begInfoDetail == null) {
1935 return 1;
1936 }
1937
1938 entitymanager.getTransaction().begin();
1939 entitymanager.persist(submitSeed);
1940 entitymanager.getTransaction().commit();
1941
1942 // 创建提交记录
1943 entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
1944 .setParameter(1, begid)
1945 .setParameter(2, seed.seedid)
1946 .executeUpdate();
1947 return 0;
1948
1949 } catch (Exception e) {
1950 if (tx.isActive()) {
1951 tx.rollback();
1952 }
1953 return 3; // 其他错误
1954 } finally {
1955 if (entitymanager != null) {
1956 entitymanager.close();
1957 }
1958 }
1959 }
1960
1961 @Override
1962 public int createBagSeed(BegInfo begInfo, String userid, String info) {
1963 if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
1964 return 2; // 参数无效
1965 }
1966
1967 EntityManager entitymanager = createEntityManager();
1968 try {
1969 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1970 if (begInfoDetail != null) {
1971 return 1; // 已存在
1972 }
1973
1974 User user = entitymanager.find(User.class, userid);
1975 if (user == null) {
1976 return 2; // 用户不存在
1977 }
1978
1979 UserPT userPT = entitymanager.find(UserPT.class, userid);
1980 if (userPT == null) {
1981 return 2; // 用户PT信息不存在
1982 }
1983
1984 if (userPT.magic < begInfo.magic) {
1985 return 3; // 魔力值不足
1986 }
1987
1988 begInfoDetail = new BegInfoDetail();
1989 begInfoDetail.begId = begInfo.begid;
1990 begInfoDetail.info = info;
1991 begInfoDetail.userId = userid;
1992 begInfoDetail.user = user;
1993 userPT.magic -= begInfo.magic; // 扣除魔力值
1994
1995 entitymanager.getTransaction().begin();
1996 entitymanager.persist(userPT);
1997 entitymanager.persist(begInfo);
1998 entitymanager.persist(begInfoDetail);
1999 entitymanager.getTransaction().commit();
2000
2001 return 0;
2002 } catch (Exception e) {
2003 if (entitymanager.getTransaction().isActive()) {
2004 entitymanager.getTransaction().rollback();
2005 }
2006 e.printStackTrace();
2007 return 2; // 其他错误
2008 } finally {
2009 if (entitymanager != null) {
2010 entitymanager.close();
2011 }
2012 }
2013 }
2014}