blob: 934a6c56b852a4e8a83a92618c0902ff73905b6e [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;
rhj7125df42025-06-09 01:06:01 +0800604 userStar.seed = seed; // 设置关联的种子对象
605 userStar.user = user; // 设置关联的用户对象
606 userStar.createdAt = new Date(); // 设置创建时间
rhje18c3f72025-06-08 00:27:01 +0800607 entitymanager.getTransaction().begin();
608 entitymanager.persist(userStar);
609 entitymanager.getTransaction().commit();
610 return true;
611 } catch (Exception e) {
612 e.printStackTrace();
613 if (entitymanager.getTransaction().isActive()) {
614 entitymanager.getTransaction().rollback();
615 }
Raverf79fdb62025-06-03 06:02:49 +0000616 return false;
rhje18c3f72025-06-08 00:27:01 +0800617 } finally {
618 if (entitymanager != null) {
619 entitymanager.close();
620 }
Raverf79fdb62025-06-03 06:02:49 +0000621 }
root0dbc9812025-05-19 04:41:57 +0000622 }
623
624 //删除一个收藏,返回状态:0 success,1 不存在,2其他原因
625 @Override
rhje18c3f72025-06-08 00:27:01 +0800626 public boolean DeleteCollect(String userid, String seedid){
627 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000628 try {
Raverf79fdb62025-06-03 06:02:49 +0000629 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000630 QUserStar u = QUserStar.userStar;
631 UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
632 if (userStar == null) {
633 return true; // 收藏不存在
634 }
rhje18c3f72025-06-08 00:27:01 +0800635 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000636 entitymanager.remove(userStar);
rhje18c3f72025-06-08 00:27:01 +0800637 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000638 return true;
639 } catch (Exception e) {
640 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +0800641 if (entitymanager.getTransaction().isActive()) {
642 entitymanager.getTransaction().rollback();
643 }
root0dbc9812025-05-19 04:41:57 +0000644 return false;
rhje18c3f72025-06-08 00:27:01 +0800645 } finally {
646 if (entitymanager != null) {
647 entitymanager.close();
648 }
root0dbc9812025-05-19 04:41:57 +0000649 }
Raverf79fdb62025-06-03 06:02:49 +0000650
root0dbc9812025-05-19 04:41:57 +0000651 }
652
653 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800654 public int AddBegSeed(BegInfo info) {
655 if (info == null || info.begid == null || info.begid.isEmpty()) {
656 logger.warn("Invalid parameter: info is null or begid is empty");
657 return 2;
658 }
659
660 EntityTransaction tx = null;
661
662 try {
rhj5ebd93c2025-06-07 15:57:28 +0800663 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800664 tx = entitymanager.getTransaction();
665 tx.begin();
666
667 // 检查是否重复
668 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
669 if (existingBeg != null) {
670 logger.warn("BegSeed with ID {} already exists", info.begid);
671 return 1;
672 }
673
674 // 设置默认值
675 if (info.endtime == null) {
676 // 设置默认14天截止期
677 Calendar calendar = Calendar.getInstance();
678 calendar.add(Calendar.DAY_OF_MONTH, 14);
679 info.endtime = calendar.getTime();
680 }
681 info.hasseed = 0;
682
683 // 保存新的求种信息
684 entitymanager.persist(info);
685 tx.commit();
686
687 logger.info("Successfully added new BegSeed with ID: {}", info.begid);
688 return 0;
689
690 } catch (Exception e) {
691 if (tx != null && tx.isActive()) {
692 tx.rollback();
693 }
694 logger.error("Error adding BegSeed: {}", e.getMessage());
695 return 2;
696 }
root0dbc9812025-05-19 04:41:57 +0000697 }
698
699 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800700 public int UpdateBegSeed(BegInfo info) {
701 if (info == null || info.begid == null || info.begid.isEmpty()) {
702 logger.warn("Invalid parameter: info is null or begid is empty");
703 return 2;
704 }
705
706 EntityTransaction tx = null;
707
708 try {
rhj5ebd93c2025-06-07 15:57:28 +0800709 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800710 tx = entitymanager.getTransaction();
711 tx.begin();
712
713 // 检查是否存在
714 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
715 if (existingBeg == null) {
716 logger.warn("BegSeed with ID {} does not exist", info.begid);
717 return 1;
718 }
719
720 // 保持原有值不变的字段
721 info.hasseed = existingBeg.hasseed;
722 if (info.endtime == null) {
723 info.endtime = existingBeg.endtime;
724 }
725
726 // 更新求种信息
727 entitymanager.merge(info);
728 tx.commit();
729
730 logger.info("Successfully updated BegSeed with ID: {}", info.begid);
731 return 0;
732
733 } catch (Exception e) {
734 if (tx != null && tx.isActive()) {
735 tx.rollback();
736 }
737 logger.error("Error updating BegSeed: {}", e.getMessage());
738 return 2;
739 }
root0dbc9812025-05-19 04:41:57 +0000740 }
741
742 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800743 public int DeleteBegSeed(String begid) {
744 if (begid == null || begid.isEmpty()) {
745 logger.warn("Invalid parameter: begid is null or empty");
746 return 2;
747 }
748
749 EntityTransaction tx = null;
750
751 try {
rhj5ebd93c2025-06-07 15:57:28 +0800752 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800753 tx = entitymanager.getTransaction();
754 tx.begin();
755
756 // 查找要删除的求种信息
757 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
758 if (begInfo == null) {
759 logger.warn("BegSeed with ID {} does not exist", begid);
760 tx.rollback();
761 return 1;
762 }
763
764 // 删除求种信息
765 entitymanager.remove(begInfo);
766 tx.commit();
767
768 logger.info("Successfully deleted BegSeed with ID: {}", begid);
769 return 0;
770
771 } catch (Exception e) {
772 if (tx != null && tx.isActive()) {
773 tx.rollback();
774 }
775 logger.error("Error deleting BegSeed: {}", e.getMessage());
776 return 2;
777 }
root0dbc9812025-05-19 04:41:57 +0000778 }
779
780 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800781 public int VoteSeed(String begId, String seedId, String userId) {
782 if (begId == null || seedId == null || userId == null ||
783 begId.isEmpty() || seedId.isEmpty() || userId.isEmpty()) {
784 logger.warn("Invalid parameters: begId, seedId or userId is null or empty");
785 return 2;
786 }
787
788 EntityTransaction tx = null;
789
790 try {
rhj5ebd93c2025-06-07 15:57:28 +0800791 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800792 tx = entitymanager.getTransaction();
793 tx.begin();
794
795 // 检查求种信息是否存在
796 BegInfo begInfo = entitymanager.find(BegInfo.class, begId);
797 if (begInfo == null) {
798 logger.warn("BegSeed with ID {} does not exist", begId);
799 return 2;
800 }
801
802 // 检查用户是否已投票
803 Long voteCount = new JPAQuery<>(entitymanager)
804 .select(QUserVotes.userVotes.count())
805 .from(QUserVotes.userVotes)
806 .where(QUserVotes.userVotes.id.eq(new entity.UserVotesId(userId, begId, seedId)))
807 .fetchOne();
808
809 if (voteCount != null && voteCount > 0) {
810 logger.warn("User {} has already voted for seed {} in beg {}", userId, seedId, begId);
811 return 1;
812 }
813
814 // 创建新的投票记录
815 entitymanager.createNativeQuery("INSERT INTO UserVotes (user_id, beg_id, seed_id, created_at) " +
816 "VALUES (?, ?, ?, CURRENT_TIMESTAMP)")
817 .setParameter(1, userId)
818 .setParameter(2, begId)
819 .setParameter(3, seedId)
820 .executeUpdate();
821
822 // 更新SubmitSeed表中的投票数
823 entitymanager.createQuery("UPDATE SubmitSeed s SET s.votes = s.votes + 1 " +
824 "WHERE s.id.begId = :begId AND s.id.seedId = :seedId")
825 .setParameter("begId", begId)
826 .setParameter("seedId", seedId)
827 .executeUpdate();
828
829 tx.commit();
830 logger.info("Successfully added vote from user {} for seed {} in beg {}", userId, seedId, begId);
831 return 0;
832
833 } catch (Exception e) {
834 if (tx != null && tx.isActive()) {
835 tx.rollback();
836 }
837 logger.error("Error voting for seed: {}", e.getMessage());
838 return 2;
839 }
root0dbc9812025-05-19 04:41:57 +0000840 }
841
842 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800843 public int SubmitSeed(String begid, Seed seed) {
844 if (begid == null || seed == null || begid.isEmpty() || seed.seedid == null) {
845 logger.warn("Invalid parameters: begid or seed is null or empty");
846 return 2;
847 }
848
849 EntityTransaction tx = null;
850
851 try {
rhj5ebd93c2025-06-07 15:57:28 +0800852 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800853 tx = entitymanager.getTransaction();
854 tx.begin();
855
856 // 检查求种信息是否存在
857 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
858 if (begInfo == null) {
859 logger.warn("BegSeed with ID {} does not exist", begid);
860 return 2;
861 }
862
863 // 检查种子是否已提交过
864 QSubmitSeed ss = QSubmitSeed.submitSeed;
865 Long submitCount = new JPAQuery<>(entitymanager)
866 .select(ss.count())
867 .from(ss)
868 .where(ss.begInfo.begid.eq(begid))
869 .where(ss.seed.seedid.eq(seed.seedid))
870 .fetchOne();
871
872 if (submitCount > 0) {
873 logger.warn("Seed {} has already been submitted for beg {}", seed.seedid,
874 begid);
875 return 1;
876 }
877
878 // 保存种子信息(如果不存在)
879 if (entitymanager.find(Seed.class, seed.seedid) == null) {
880 entitymanager.persist(seed);
881 }
882
883 // 创建提交记录
884 entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
885 .setParameter(1, begid)
886 .setParameter(2, seed.seedid)
887 .executeUpdate();
888
889 tx.commit();
890 logger.info("Successfully submitted seed {} for beg {}", seed.seedid, begid);
891 return 0;
892
893 } catch (Exception e) {
894 if (tx != null && tx.isActive()) {
895 tx.rollback();
896 }
897 logger.error("Error submitting seed: {}", e.getMessage());
898 return 2;
899 }
root0dbc9812025-05-19 04:41:57 +0000900 }
901
902 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800903 public void SettleBeg() {
904 EntityTransaction tx = null;
905
906 try {
rhj5ebd93c2025-06-07 15:57:28 +0800907 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800908 tx = entitymanager.getTransaction();
909 tx.begin();
910
911 // 1. 获取所有已过期且未完成的求种信息
912 QBegInfo b = QBegInfo.begInfo;
913 List<BegInfo> expiredBegs = new JPAQuery<>(entitymanager)
914 .select(b)
915 .from(b)
916 .where(b.endtime.loe(new Date())
917 .and(b.hasseed.eq(0)))
918 .fetch();
919
920 for (BegInfo beg : expiredBegs) {
921 // 2. 查找投票最多的提交任务
922 QSubmitSeed ss = QSubmitSeed.submitSeed;
923 Tuple topSubmission = new JPAQuery<>(entitymanager)
924 .select(ss.seed.seedid, ss.votes)
925 .from(ss)
926 .where(ss.begInfo.begid.eq(beg.begid))
927 .orderBy(ss.votes.desc())
928 .limit(1)
929 .fetchOne();
930
931 if (topSubmission != null && topSubmission.get(ss.votes) > 0) {
932 String seedId = topSubmission.get(ss.seed.seedid);
933
934 // 3. 获取上传者ID
935 QSeed s = QSeed.seed;
936 String ownerId = new JPAQuery<>(entitymanager)
937 .select(s.seeduserid)
938 .from(s)
939 .where(s.seedid.eq(seedId))
940 .fetchOne();
941
942 // 4. 获取上传者的PT信息并更新魔力值
943 UserPT ownerPT = entitymanager.find(UserPT.class, ownerId);
944 if (ownerPT != null) {
945 // 5. 发放奖励
946 ownerPT.magic += beg.magic;
947 entitymanager.merge(ownerPT);
948
949 // 6. 更新求种状态
950 beg.hasseed = 1;
951 entitymanager.merge(beg);
952
953 logger.info("Reward {} magic points awarded to user {} for beg {}",
954 beg.magic, ownerId, beg.begid);
955 }
956 }
957 }
958
959 tx.commit();
960 logger.info("Successfully settled {} expired beg requests",
961 expiredBegs.size());
962
963 } catch (Exception e) {
964 if (tx != null && tx.isActive()) {
965 tx.rollback();
966 }
967 logger.error("Error settling beg requests: {}", e.getMessage(), e);
968 }
root0dbc9812025-05-19 04:41:57 +0000969 }
970
971 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800972 public int AddPost(Post post) {
973 if (post == null || post.postid == null || post.postid.isEmpty()) {
974 logger.warn("Invalid parameter: post is null or postid is empty");
975 return 2;
976 }
977
978 EntityTransaction tx = null;
979
980 try {
rhj5ebd93c2025-06-07 15:57:28 +0800981 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800982 tx = entitymanager.getTransaction();
983 tx.begin();
984
985 // 检查是否重复
986 Post existingPost = entitymanager.find(Post.class, post.postid);
987 if (existingPost != null) {
988 logger.warn("Post with ID {} already exists", post.postid);
989 return 1;
990 }
991
992 // 检查用户是否存在
993 User user = entitymanager.find(User.class, post.postuserid);
994 if (user == null) {
995 logger.warn("User with ID {} does not exist", post.postuserid);
996 return 2;
997 }
998
999 // 设置初始值
1000 if (post.posttime == null) {
1001 post.posttime = new Date();
1002 }
1003 post.replytime = 0;
1004 post.readtime = 0;
1005
1006 // 保存帖子
1007 entitymanager.persist(post);
1008 tx.commit();
1009
1010 logger.info("Successfully added new post with ID: {}", post.postid);
1011 return 0;
1012
1013 } catch (Exception e) {
1014 if (tx != null && tx.isActive()) {
1015 tx.rollback();
1016 }
1017 logger.error("Error adding post: {}", e.getMessage());
1018 return 2;
1019 }
root0dbc9812025-05-19 04:41:57 +00001020 }
1021
1022 @Override
TRM-coding87c24972025-06-07 14:05:29 +08001023 public int UpdatePost(Post post) {
1024 if (post == null || post.postid == null || post.postid.isEmpty()) {
1025 logger.warn("Invalid parameter: post is null or postid is empty");
1026 return 2;
1027 }
1028
1029 EntityTransaction tx = null;
1030
1031 try {
rhj5ebd93c2025-06-07 15:57:28 +08001032 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +08001033 tx = entitymanager.getTransaction();
1034 tx.begin();
1035
1036 // 检查帖子是否存在
1037 Post existingPost = entitymanager.find(Post.class, post.postid);
1038 if (existingPost == null) {
1039 logger.warn("Post with ID {} does not exist", post.postid);
1040 return 1;
1041 }
1042
1043 // 保持原有不可修改的字段
1044 post.postuserid = existingPost.postuserid;
1045 post.posttime = existingPost.posttime;
1046 post.replytime = existingPost.replytime;
1047 post.readtime = existingPost.readtime;
1048
1049 // 更新帖子
1050 entitymanager.merge(post);
1051 tx.commit();
1052
1053 logger.info("Successfully updated post with ID: {}", post.postid);
1054 return 0;
1055
1056 } catch (Exception e) {
1057 if (tx != null && tx.isActive()) {
1058 tx.rollback();
1059 }
1060 logger.error("Error updating post: {}", e.getMessage());
1061 return 2;
1062 }
root0dbc9812025-05-19 04:41:57 +00001063 }
1064
1065 @Override
Raverf79fdb62025-06-03 06:02:49 +00001066 public int DeletePost(String postid){
TRM-coding87c24972025-06-07 14:05:29 +08001067 if (postid == null || postid.isEmpty()) {
1068 logger.warn("Invalid parameter: postid is null or empty");
1069 return 2;
1070 }
1071
1072 EntityManager em = null;
1073 EntityTransaction tx = null;
1074
1075 try {
1076 em = emf.createEntityManager();
1077 tx = em.getTransaction();
1078 tx.begin();
1079
1080 // 查找要删除的帖子
1081 Post post = em.find(Post.class, postid);
1082 if (post == null) {
1083 logger.warn("Post with ID {} does not exist", postid);
1084 tx.rollback();
1085 return 1;
1086 }
1087
1088 // 删除帖子(由于设置了级联删除,相关的回复会自动删除)
1089 em.remove(post);
1090 tx.commit();
1091
1092 logger.info("Successfully deleted post with ID: {}", postid);
1093 return 0;
1094
1095 } catch (Exception e) {
1096 if (tx != null && tx.isActive()) {
1097 tx.rollback();
1098 }
1099 logger.error("Error deleting post: {}", e.getMessage());
1100 return 2;
1101 } finally {
1102 if (em != null) {
1103 em.close();
1104 }
1105 }
root0dbc9812025-05-19 04:41:57 +00001106 }
1107
1108 @Override
Raverf79fdb62025-06-03 06:02:49 +00001109 public int AddComment(String postid, String userid, String comment){
TRM-coding87c24972025-06-07 14:05:29 +08001110 if (postid == null || postid.isEmpty() ||
1111 userid == null || userid.isEmpty() ||
1112 comment == null || comment.isEmpty()) {
1113 logger.warn("Invalid parameters: postid, userid or comment is null or empty");
1114 return 2;
1115 }
1116
1117 EntityManager em = null;
1118 EntityTransaction tx = null;
1119
1120 try {
1121 em = emf.createEntityManager();
1122 tx = em.getTransaction();
1123 tx.begin();
1124
1125 // 检查帖子是否存在
1126 Post post = em.find(Post.class, postid);
1127 if (post == null) {
1128 logger.warn("Post with ID {} does not exist", postid);
1129 return 1;
1130 }
1131
1132 // 检查评论用户是否存在
1133 User user = em.find(User.class, userid);
1134 if (user == null) {
1135 logger.warn("User with ID {} does not exist", userid);
1136 return 1;
1137 }
1138
1139 // 创建新的评论
1140 PostReply reply = new PostReply();
1141 reply.replyid = UUID.randomUUID().toString();
1142 reply.postid = postid;
1143 reply.authorid = userid;
1144 reply.content = comment;
1145 reply.createdAt = new Date();
1146
1147 // 保存评论
1148 em.persist(reply);
1149
1150 // 更新帖子的回复数
1151 post.replytime += 1;
1152 em.merge(post);
1153
1154 tx.commit();
1155
1156 logger.info("Successfully added comment by user {} to post {}, reply ID: {}",
1157 userid, postid, reply.replyid);
1158 return 0;
1159
1160 } catch (Exception e) {
1161 if (tx != null && tx.isActive()) {
1162 tx.rollback();
1163 }
1164 logger.error("Error adding comment: {}", e.getMessage());
1165 return 2;
1166 } finally {
1167 if (em != null) {
1168 em.close();
1169 }
1170 }
root0dbc9812025-05-19 04:41:57 +00001171 }
1172
1173 @Override
Raverf79fdb62025-06-03 06:02:49 +00001174 public int DeleteComment(String postid,String commentid){
TRM-coding87c24972025-06-07 14:05:29 +08001175 if (postid == null || postid.isEmpty() || commentid == null || commentid.isEmpty()) {
1176 logger.warn("Invalid parameters: postid or commentid is null or empty");
1177 return 2;
1178 }
1179
1180 EntityManager em = null;
1181 EntityTransaction tx = null;
1182
1183 try {
1184 em = emf.createEntityManager();
1185 tx = em.getTransaction();
1186 tx.begin();
1187
1188 // 检查帖子是否存在
1189 Post post = em.find(Post.class, postid);
1190 if (post == null) {
1191 logger.warn("Post with ID {} does not exist", postid);
1192 return 1;
1193 }
1194
1195 // 检查评论是否存在且属于该帖子
1196 PostReply reply = em.find(PostReply.class, commentid);
1197 if (reply == null || !reply.postid.equals(postid)) {
1198 logger.warn("Comment {} does not exist or does not belong to post {}", commentid, postid);
1199 return 1;
1200 }
1201
1202 // 删除评论
1203 em.remove(reply);
1204
1205 // 更新帖子的回复数
1206 post.replytime = Math.max(0, post.replytime - 1);
1207 em.merge(post);
1208
1209 tx.commit();
1210
1211 logger.info("Successfully deleted comment {} from post {}", commentid, postid);
1212 return 0;
1213
1214 } catch (Exception e) {
1215 if (tx != null && tx.isActive()) {
1216 tx.rollback();
1217 }
1218 logger.error("Error deleting comment: {}", e.getMessage());
1219 return 2;
1220 } finally {
1221 if (em != null) {
1222 em.close();
1223 }
1224 }
root0dbc9812025-05-19 04:41:57 +00001225 }
1226
1227 @Override
Raverf79fdb62025-06-03 06:02:49 +00001228 public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量,返回状态:0 success,1 不存在,2其他原因
root0dbc9812025-05-19 04:41:57 +00001229 {
TRM-coding87c24972025-06-07 14:05:29 +08001230 if (userid == null || userid.isEmpty() || magic <= 0) {
1231 logger.warn("参数无效: userid为空或magic <= 0");
1232 return false;
1233 }
1234
1235 EntityManager em = null;
1236 EntityTransaction tx = null;
1237
1238 try {
1239 em = emf.createEntityManager();
1240 tx = em.getTransaction();
1241 tx.begin();
1242
1243 UserPT userPT = em.find(UserPT.class, userid);
1244 if (userPT == null) {
1245 logger.warn("未找到用户 {} 的PT信息", userid);
1246 return false;
1247 }
1248
1249 if (userPT.magic < magic) {
1250 logger.warn("用户 {} 的魔力值不足", userid);
1251 return false;
1252 }
1253
1254 // 1:1兑换,直接加上魔力值(假设单位是MB)
1255 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001256 userPT.upload += magic * 10000000;
TRM-coding87c24972025-06-07 14:05:29 +08001257
1258 // 更新分享率
1259 if (userPT.download > 0) {
1260 userPT.share = (double) userPT.upload / userPT.download;
1261 }
1262
1263 em.merge(userPT);
1264 tx.commit();
1265
1266 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 上传量", userid, magic, magic);
1267 return true;
1268
1269 } catch (Exception e) {
1270 if (tx != null && tx.isActive()) {
1271 tx.rollback();
1272 }
rhje18c3f72025-06-08 00:27:01 +08001273 e.printStackTrace();
TRM-coding87c24972025-06-07 14:05:29 +08001274 logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
1275 return false;
1276 } finally {
1277 if (em != null) {
1278 em.close();
1279 }
1280 }
root0dbc9812025-05-19 04:41:57 +00001281 }
Raverf79fdb62025-06-03 06:02:49 +00001282
root0dbc9812025-05-19 04:41:57 +00001283 @Override
Raverf79fdb62025-06-03 06:02:49 +00001284 public boolean ExchangeMagicToDownload(String userid,int magic)
1285 {
TRM-coding87c24972025-06-07 14:05:29 +08001286 if (userid == null || userid.isEmpty() || magic <= 0) {
1287 logger.warn("参数无效: userid为空或magic <= 0");
1288 return false;
1289 }
1290
1291 EntityManager em = null;
1292 EntityTransaction tx = null;
1293
1294 try {
1295 em = emf.createEntityManager();
1296 tx = em.getTransaction();
1297 tx.begin();
1298
1299 UserPT userPT = em.find(UserPT.class, userid);
1300 if (userPT == null) {
1301 logger.warn("未找到用户 {} 的PT信息", userid);
1302 return false;
1303 }
1304
1305 if (userPT.magic < magic) {
1306 logger.warn("用户 {} 的魔力值不足", userid);
1307 return false;
1308 }
1309
1310 // 1:1兑换,直接减去魔力值对应的下载量(假设单位是MB)
1311 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001312 userPT.download = Math.max(0, userPT.download - magic * 10000000);
TRM-coding87c24972025-06-07 14:05:29 +08001313
1314 // 更新分享率
1315 if (userPT.download > 0) {
1316 userPT.share = (double) userPT.upload / userPT.download;
1317 }
1318
1319 em.merge(userPT);
1320 tx.commit();
1321
1322 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 下载量减免", userid, magic, magic);
1323 return true;
1324
1325 } catch (Exception e) {
1326 if (tx != null && tx.isActive()) {
1327 tx.rollback();
1328 }
1329 logger.error("魔力值兑换下载量时发生错误: {}", e.getMessage());
1330 return false;
1331 } finally {
1332 if (em != null) {
1333 em.close();
1334 }
1335 }
root0dbc9812025-05-19 04:41:57 +00001336 }//将魔力值兑换为下载量,返回状态:0 success,1 不存在,2其他原因
1337
1338 @Override
Raverf79fdb62025-06-03 06:02:49 +00001339 public boolean ExchangeMagicToVip(String userid,int magic){
TRM-coding87c24972025-06-07 14:05:29 +08001340 if (userid == null || userid.isEmpty() || magic <= 0) {
1341 logger.warn("参数无效: userid为空或magic <= 0");
1342 return false;
1343 }
1344
1345 EntityManager em = null;
1346 EntityTransaction tx = null;
1347
1348 try {
1349 em = emf.createEntityManager();
1350 tx = em.getTransaction();
1351 tx.begin();
1352
1353 UserPT userPT = em.find(UserPT.class, userid);
1354 if (userPT == null) {
1355 logger.warn("未找到用户 {} 的PT信息", userid);
1356 return false;
1357 }
1358
1359 if (userPT.magic < magic) {
1360 logger.warn("用户 {} 的魔力值不足", userid);
1361 return false;
1362 }
1363
1364 // 1:1兑换VIP下载次数
1365 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001366 userPT.viptime += magic / 100;
TRM-coding87c24972025-06-07 14:05:29 +08001367
1368 em.merge(userPT);
1369 tx.commit();
1370
1371 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {} 次VIP下载次数", userid, magic, magic);
1372 return true;
1373
1374 } catch (Exception e) {
1375 if (tx != null && tx.isActive()) {
1376 tx.rollback();
1377 }
1378 logger.error("魔力值兑换VIP下载次数时发生错误: {}", e.getMessage());
1379 return false;
1380 } finally {
1381 if (em != null) {
1382 em.close();
1383 }
1384 }
root0dbc9812025-05-19 04:41:57 +00001385 }
1386 //将魔力值兑换为VIP次数,返回状态:0 success,1 不存在,2其他原因
1387
1388 @Override
Raverf79fdb62025-06-03 06:02:49 +00001389 public boolean UploadTransmitProfile(Profile profile){
TRM-coding87c24972025-06-07 14:05:29 +08001390 if (profile == null || profile.profileurl == null || profile.profileurl.isEmpty() ||
1391 profile.userid == null || profile.userid.isEmpty()) {
1392 logger.warn("参数无效: profile为空或必要字段为空");
1393 return false;
1394 }
1395
1396 EntityManager em = null;
1397 EntityTransaction tx = null;
1398
1399 try {
1400 em = emf.createEntityManager();
1401 tx = em.getTransaction();
1402 tx.begin();
1403
1404 // 检查用户是否存在
1405 User user = em.find(User.class, profile.userid);
1406 if (user == null) {
1407 logger.warn("用户 {} 不存在", profile.userid);
1408 return false;
1409 }
1410
1411 // 检查是否已存在相同的迁移申请
1412 Profile existingProfile = em.find(Profile.class, profile.profileurl);
1413 if (existingProfile != null) {
1414 logger.warn("迁移申请 {} 已存在", profile.profileurl);
1415 return false;
1416 }
1417
1418 // 设置初始值
1419 profile.exampass = false;
1420 profile.magicgived = "0";
1421 profile.uploadgived = "0";
1422
1423 // 保存迁移申请
1424 em.persist(profile);
1425 tx.commit();
1426
1427 logger.info("成功上传迁移申请 {}", profile.profileurl);
1428 return true;
1429
1430 } catch (Exception e) {
1431 if (tx != null && tx.isActive()) {
1432 tx.rollback();
1433 }
1434 logger.error("上传迁移申请时发生错误: {}", e.getMessage());
1435 return false;
1436 } finally {
1437 if (em != null) {
1438 em.close();
1439 }
1440 }
root0dbc9812025-05-19 04:41:57 +00001441 }
1442
1443 @Override
Raverf79fdb62025-06-03 06:02:49 +00001444 public Profile GetTransmitProfile(String profileid){
TRM-coding87c24972025-06-07 14:05:29 +08001445 if (profileid == null || profileid.isEmpty()) {
1446 logger.warn("参数无效: profileid为空");
1447 return null;
1448 }
1449
1450 EntityManager em = null;
1451
1452 try {
1453 em = emf.createEntityManager();
1454 Profile profile = em.find(Profile.class, profileid);
1455 if (profile == null) {
1456 logger.warn("未找到迁移申请 {}", profileid);
1457 return null;
1458 }
1459
1460 logger.info("成功获取迁移申请 {}", profileid);
1461 return profile;
1462
1463 } catch (Exception e) {
1464 logger.error("获取迁移申请时发生错误: {}", e.getMessage());
1465 return null;
1466 } finally {
1467 if (em != null) {
1468 em.close();
1469 }
1470 }
root0dbc9812025-05-19 04:41:57 +00001471 }
1472 //获取迁移信息
Raverf79fdb62025-06-03 06:02:49 +00001473
root0dbc9812025-05-19 04:41:57 +00001474 @Override
Raverf79fdb62025-06-03 06:02:49 +00001475 public boolean ExamTransmitProfile(String profileid,boolean result){
TRM-coding87c24972025-06-07 14:05:29 +08001476 if (profileid == null || profileid.isEmpty()) {
1477 logger.warn("参数无效: profileid为空");
1478 return false;
1479 }
1480
1481 EntityManager em = null;
1482 EntityTransaction tx = null;
1483
1484 try {
1485 em = emf.createEntityManager();
1486 tx = em.getTransaction();
1487 tx.begin();
1488
1489 // 查找迁移申请
1490 Profile profile = em.find(Profile.class, profileid);
1491 if (profile == null) {
1492 logger.warn("未找到迁移申请 {}", profileid);
1493 return false;
1494 }
1495
1496 // 更新审核状态
1497 profile.exampass = result;
1498
1499 if (result) {
1500 // 如果审核通过,更新用户的PT信息
1501 UserPT userPT = em.find(UserPT.class, profile.userid);
1502 if (userPT != null) {
1503 // 发放魔力值
1504 int magicToGive = Integer.parseInt(profile.magictogive);
1505 userPT.magic += magicToGive;
1506 profile.magicgived = String.valueOf(magicToGive);
1507
1508 // 发放上传量
1509 long uploadToGive = Long.parseLong(profile.uploadtogive);
1510 userPT.upload += uploadToGive;
1511 profile.uploadgived = String.valueOf(uploadToGive);
1512
1513 em.merge(userPT);
rhje18c3f72025-06-08 00:27:01 +08001514 em.merge(profile);
TRM-coding87c24972025-06-07 14:05:29 +08001515 }
rhje18c3f72025-06-08 00:27:01 +08001516 } else {
1517 // 如果审核不通过,删除迁移申请
1518 em.remove(profile);
1519 logger.info("迁移申请 {} 审核不通过,已删除", profileid);
TRM-coding87c24972025-06-07 14:05:29 +08001520 }
TRM-coding87c24972025-06-07 14:05:29 +08001521 tx.commit();
1522
1523 logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
1524 return true;
1525
1526 } catch (Exception e) {
1527 if (tx != null && tx.isActive()) {
1528 tx.rollback();
1529 }
1530 logger.error("审核迁移申请时发生错误: {}", e.getMessage());
1531 return false;
1532 } finally {
1533 if (em != null) {
1534 em.close();
1535 }
1536 }
root0dbc9812025-05-19 04:41:57 +00001537 }
1538 //审核迁移信息,0成功,1失败
1539 @Override
Raverf79fdb62025-06-03 06:02:49 +00001540 public Profile[] GetTransmitProfileList(){
TRM-coding87c24972025-06-07 14:05:29 +08001541 EntityManager em = null;
1542
1543 try {
1544 em = emf.createEntityManager();
1545
1546 // 获取所有迁移申请
1547 QProfile p = QProfile.profile;
1548 List<Profile> profiles = new JPAQuery<>(em)
1549 .select(p)
1550 .from(p)
1551 .fetch();
1552
1553 logger.info("成功获取所有迁移申请,共 {} 条", profiles.size());
1554 return profiles.toArray(new Profile[0]);
1555
1556 } catch (Exception e) {
1557 logger.error("获取迁移申请列表时发生错误: {}", e.getMessage());
1558 return new Profile[0];
1559 } finally {
1560 if (em != null) {
1561 em.close();
1562 }
1563 }
root0dbc9812025-05-19 04:41:57 +00001564 }
1565 //获取所有迁移信息
1566
rhj46f62c42025-06-06 23:24:10 +08001567 @Override
1568 public Post[] GetPostList() {
rhj5ebd93c2025-06-07 15:57:28 +08001569 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001570 try{
1571 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1572 QPost p = QPost.post;
1573 List<Post> posts = query.select(p).from(p).fetch();
1574 return posts.toArray(new Post[0]);
1575 } catch (Exception e) {
1576 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1577 return new Post[0];
1578 } finally {
1579 entitymanager.close();
1580 logger.info("Post list retrieved successfully.");
1581 }
rhj46f62c42025-06-06 23:24:10 +08001582 }
1583
rhj5b69b7e2025-06-07 01:28:08 +08001584 @Override
1585 public Post GetPost(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001586 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001587 try {
1588 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1589 QPost p = QPost.post;
1590 Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
1591 return post;
1592 } catch (Exception e) {
1593 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1594 return new Post();
1595 } finally {
1596 entitymanager.close();
1597 logger.info("Post list retrieved successfully.");
1598 }
rhj5b69b7e2025-06-07 01:28:08 +08001599 }
1600
1601 @Override
1602 public PostReply[] GetPostReplyList(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001603 EntityManager entitymanager = createEntityManager();
rhj5b69b7e2025-06-07 01:28:08 +08001604 JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
1605 QPostReply p = QPostReply.postReply;
1606 List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
1607 return replies.toArray(new PostReply[0]);
1608 }
rhj5ebd93c2025-06-07 15:57:28 +08001609
1610 @Override
1611 public Post[] SearchPost(String postQ) {
1612 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001613 try {
1614 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1615 QPost p = QPost.post;
1616 List<Post> posts = query.select(p).from(p).fetch();
rhj5ebd93c2025-06-07 15:57:28 +08001617
rhje18c3f72025-06-08 00:27:01 +08001618 if (posts == null || postQ == null || postQ.trim().isEmpty()) {
1619 return posts.toArray(new Post[0]);
1620 }
1621
1622 String processedQuery = postQ.toLowerCase().trim();
1623 Map<Post, Integer> postCountMap = new HashMap<>();
1624 for(Post post : posts){
1625 String title = post.posttitle.toLowerCase().trim();
1626 int count = countCommonCharacter(processedQuery, title);
1627 postCountMap.put(post, count);
1628 }
1629 posts.sort((s1, s2) -> {
1630 int count1 = postCountMap.getOrDefault(s1, 0);
1631 int count2 = postCountMap.getOrDefault(s2, 0);
1632 return Integer.compare(count2, count1);
1633 });
1634
rhj5ebd93c2025-06-07 15:57:28 +08001635 return posts.toArray(new Post[0]);
rhje18c3f72025-06-08 00:27:01 +08001636 } catch (Exception e) {
1637 logger.error("搜索帖子时发生错误: {}", e.getMessage());
1638 return new Post[0];
1639 } finally {
1640 entitymanager.close();
1641 logger.info("Post search completed successfully.");
rhj5ebd93c2025-06-07 15:57:28 +08001642 }
rhj5ebd93c2025-06-07 15:57:28 +08001643 }
Raverf79fdb62025-06-03 06:02:49 +00001644
rhje18c3f72025-06-08 00:27:01 +08001645 @Override
1646 public int CheckAdmin(String userid) {
1647 if (userid == null || userid.isEmpty()) {
1648 logger.warn("参数无效: userid为空");
1649 return 2; // 参数无效
1650 }
1651
1652 EntityManager entitymanager = createEntityManager();
1653 JPAQuery<String> query = new JPAQuery<>(entitymanager);
1654 QAdmin a = QAdmin.admin;
1655 String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
1656 if (adminId == null) {
1657 logger.warn("用户 {} 不是管理员", userid);
1658 return 1; // 用户不是管理员
1659 } else {
1660 logger.info("用户 {} 是管理员", userid);
1661 return 0; // 用户是管理员
1662 }
1663 }
1664
1665 @Override
1666 public int InviteNewUser(String inviterid, String invitedemail) {
1667 EntityManager entitymanager = createEntityManager();
1668 try {
1669 User user = entitymanager.find(User.class, inviterid);
1670 if (user == null) {
1671 return 3;
1672 }
1673 if (user.invitetimes <= 0) {
1674 return 1;
1675 }
1676 user.invitetimes -= 1;
1677
1678 UserInvite invite = new UserInvite();
1679 invite.userId = inviterid;
1680 invite.inviterEmail = invitedemail;
1681 invite.inviterRegistered = false;
1682 invite.user = user;
1683
1684 entitymanager.getTransaction().begin();
1685 entitymanager.merge(user);
1686 entitymanager.persist(invite);
1687 entitymanager.getTransaction().commit();
1688 return 0;
1689 } catch (Exception e) {
1690 e.printStackTrace();
1691 if (entitymanager.getTransaction().isActive()) {
1692 entitymanager.getTransaction().rollback();
1693 }
1694 return 2;
1695 }
1696 }
1697
1698 @Override
1699 public UserStar[] GetUserStarList(String userid) {
1700 if (userid == null || userid.isEmpty()) {
1701 logger.warn("参数无效: userid为空");
1702 return new UserStar[0];
1703 }
1704
1705 EntityManager entitymanager = createEntityManager();
1706 try {
1707 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
1708 QUserStar us = QUserStar.userStar;
1709 List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
1710 return stars.toArray(new UserStar[0]);
1711 } catch (Exception e) {
1712 e.printStackTrace();
1713 if (entitymanager.getTransaction().isActive()) {
1714 entitymanager.getTransaction().rollback();
1715 }
1716 return new UserStar[0];
1717 } finally {
1718 if (entitymanager != null) {
1719 entitymanager.close();
1720 }
1721 }
1722 }
1723
1724 @Override
1725 public int UploadMigration(String userid, File file) {
1726 if (userid == null || userid.isEmpty() || file == null) {
1727 return 2; // 参数无效
1728 }
1729
1730 EntityManager entitymanager = createEntityManager();
1731
1732 try {
1733 // 检查用户是否存在
1734 User user = entitymanager.find(User.class, userid);
1735 if (user == null) {
1736 return 1; // 用户不存在
1737 }
1738
1739 // 创建迁移记录
1740 Profile migration = new Profile();
1741 migration.profileurl = java.util.UUID.randomUUID().toString();
1742 migration.userid = userid;
1743 migration.uploadtogive = "0"; // 初始上传量为0
1744 migration.magictogive = "0"; // 初始魔力值为0
1745 migration.downloadgived = "0"; // 初始下载量为0
1746 migration.uploadgived = "0"; // 初始上传量为0
1747 migration.magicgived = "0"; // 初始魔力值为0
1748 migration.downloadgived = "0"; // 初始下载量为0
1749 migration.exampass = false; // 初始审核状态为未通过
1750 migration.user = user;
1751 Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
1752 if (!Files.exists(storageDir)) {
1753 Files.createDirectories(storageDir);
1754 }
1755 String filename = file.getName();
1756 Path target = storageDir.resolve(migration.profileurl + "_" + filename);
1757 Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
1758 migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
1759
1760 entitymanager.getTransaction().begin();
1761 entitymanager.persist(migration);
1762 entitymanager.getTransaction().commit();
1763
1764 return 0; // 成功
1765
1766 } catch (Exception e) {
1767 if (entitymanager.getTransaction().isActive()) {
1768 entitymanager.getTransaction().rollback();
1769 }
1770 e.printStackTrace();
1771 return 2; // 其他错误
1772 } finally {
1773 if (entitymanager != null) {
1774 entitymanager.close();
1775 }
1776 }
1777 }
1778
1779 @Override
1780 public BegSeedDetail[] GetBegList() {
1781 EntityManager entitymanager = createEntityManager();
1782 try {
1783 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1784 QBegInfo b = QBegInfo.begInfo;
1785 List<BegInfo> begList = query.select(b).from(b).fetch();
1786
1787 List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
1788 for (BegInfo begInfo : begList) {
1789 // 查询对应的BegInfo表的Info字段
1790 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1791 // 构造BegSeedDetail对象
1792 BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
1793 begSeedDetailList.add(begSeedDetail);
1794 }
1795
1796 return begSeedDetailList.toArray(new BegSeedDetail[0]);
1797 } catch (Exception e) {
1798 if (entitymanager.getTransaction().isActive()) {
1799 entitymanager.getTransaction().rollback();
1800 }
1801 e.printStackTrace();
1802 return new BegSeedDetail[0];
1803 } finally {
1804 if(entitymanager != null){
1805 entitymanager.close();
1806 }
1807 }
1808 }
1809
1810 @Override
1811 public BegInfo GetBegDetail(String begid) {
1812 EntityManager entitymanager = createEntityManager();
1813 try {
1814 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1815 QBegInfo b = QBegInfo.begInfo;
1816 BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1817 return begDetail;
1818 } catch (Exception e) {
1819 if (entitymanager.getTransaction().isActive()) {
1820 entitymanager.getTransaction().rollback();
1821 }
1822 e.printStackTrace();
1823 return null;
1824 } finally {
1825 if(entitymanager != null){
1826 entitymanager.close();
1827 }
1828 }
1829 }
1830
1831 @Override
1832 public BegSeedDetail GetBegSeedDetail(String begid) {
1833 if (begid == null || begid.isEmpty()) {
1834 return null;
1835 }
1836
1837 EntityManager entitymanager = createEntityManager();
1838 try {
1839 // 查询 BegSeed 表数据
1840 JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
1841 QBegInfo b = QBegInfo.begInfo;
1842 BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1843
1844 if (begInfo == null) {
1845 return null;
1846 }
1847
1848 // 查询 BegInfo 表的 Info 字段
1849 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1850
1851 // 构造返回对象
1852 return new BegSeedDetail(begInfo, begInfoDetail);
1853 } catch (Exception e) {
1854 if (entitymanager.getTransaction().isActive()) {
1855 entitymanager.getTransaction().rollback();
1856 }
1857 e.printStackTrace();
1858 return null;
1859 } finally {
1860 if(entitymanager != null){
1861 entitymanager.close();
1862 }
1863 }
1864 }
1865
1866 @Override
1867 public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
1868 if (begid == null || begid.isEmpty()) {
1869 return new SeedWithVotes[0];
1870 }
1871
1872 EntityManager entitymanager = createEntityManager();
1873 try {
1874 JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
1875 QSubmitSeed ss = QSubmitSeed.submitSeed;
1876 QSeed s = QSeed.seed;
1877
1878 List<Tuple> results = query.select(s, ss.votes)
1879 .from(ss)
1880 .join(ss.seed, s)
1881 .where(ss.begInfo.begid.eq(begid))
1882 .fetch();
1883
1884 List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
1885 for (Tuple result : results) {
1886 Seed seed = result.get(s);
1887 Integer votes = result.get(ss.votes);
1888 seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
1889 }
1890
1891 return seedsWithVotes.toArray(new SeedWithVotes[0]);
1892 } catch (Exception e) {
1893 return new SeedWithVotes[0];
1894 } finally {
1895 entitymanager.close();
1896 }
1897 }
1898
1899 @Override
1900 public int SubmitBegSeed(String begid, String seedid, String userid) {
1901 if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
1902 return 2; // 参数无效
1903 }
1904
1905 EntityManager entitymanager = createEntityManager();
1906 EntityTransaction tx = entitymanager.getTransaction();
1907
1908 try {
1909 tx.begin();
1910
1911 // 检查种子信息是否存在
1912 Seed seed = entitymanager.find(Seed.class, seedid);
1913 if (seed == null || !seed.seeduserid.equals(userid)) {
1914 return 1;
1915 }
1916
1917 // int ret = SubmitSeed(begid, seed);
1918 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
1919 if (begInfo == null) {
1920 return 2;
1921 }
1922
1923 // 检查种子是否已提交过
1924 QSubmitSeed ss = QSubmitSeed.submitSeed;
1925 SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
1926 .select(ss)
1927 .from(ss)
1928 .where(ss.begInfo.begid.eq(begid))
1929 .where(ss.seed.seedid.eq(seed.seedid))
1930 .fetchOne();
1931
1932 submitSeed = new SubmitSeed();
rhj7125df42025-06-09 01:06:01 +08001933 // 设置复合主键
1934 submitSeed.id = new SubmitSeedId(begid, seed.seedid);
1935
rhje18c3f72025-06-08 00:27:01 +08001936 submitSeed.begInfo = begInfo;
1937 submitSeed.seed = seed;
1938 submitSeed.votes = 0; // 初始投票数为0
1939 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1940 if (begInfoDetail == null) {
1941 return 1;
1942 }
1943
rhje18c3f72025-06-08 00:27:01 +08001944 entitymanager.persist(submitSeed);
rhj7125df42025-06-09 01:06:01 +08001945 tx.commit();
rhje18c3f72025-06-08 00:27:01 +08001946
rhje18c3f72025-06-08 00:27:01 +08001947 return 0;
1948
1949 } catch (Exception e) {
rhj7125df42025-06-09 01:06:01 +08001950 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +08001951 if (tx.isActive()) {
1952 tx.rollback();
1953 }
1954 return 3; // 其他错误
1955 } finally {
1956 if (entitymanager != null) {
1957 entitymanager.close();
1958 }
1959 }
1960 }
1961
1962 @Override
1963 public int createBagSeed(BegInfo begInfo, String userid, String info) {
1964 if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
1965 return 2; // 参数无效
1966 }
1967
1968 EntityManager entitymanager = createEntityManager();
1969 try {
1970 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1971 if (begInfoDetail != null) {
1972 return 1; // 已存在
1973 }
1974
1975 User user = entitymanager.find(User.class, userid);
1976 if (user == null) {
1977 return 2; // 用户不存在
1978 }
1979
1980 UserPT userPT = entitymanager.find(UserPT.class, userid);
1981 if (userPT == null) {
1982 return 2; // 用户PT信息不存在
1983 }
1984
1985 if (userPT.magic < begInfo.magic) {
1986 return 3; // 魔力值不足
1987 }
1988
1989 begInfoDetail = new BegInfoDetail();
1990 begInfoDetail.begId = begInfo.begid;
1991 begInfoDetail.info = info;
1992 begInfoDetail.userId = userid;
1993 begInfoDetail.user = user;
1994 userPT.magic -= begInfo.magic; // 扣除魔力值
1995
1996 entitymanager.getTransaction().begin();
1997 entitymanager.persist(userPT);
1998 entitymanager.persist(begInfo);
1999 entitymanager.persist(begInfoDetail);
2000 entitymanager.getTransaction().commit();
2001
2002 return 0;
2003 } catch (Exception e) {
2004 if (entitymanager.getTransaction().isActive()) {
2005 entitymanager.getTransaction().rollback();
2006 }
2007 e.printStackTrace();
2008 return 2; // 其他错误
2009 } finally {
2010 if (entitymanager != null) {
2011 entitymanager.close();
2012 }
2013 }
2014 }
2015}