blob: 98effe1039e113b791573744aecd85647a04d0f7 [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;
rhj7912f2c2025-06-09 17:21:32 +080046import entity.SeedPromotion;
47import entity.SeedWithPromotionDTO;
root0dbc9812025-05-19 04:41:57 +000048import entity.User;
49import entity.UserPT;
50import entity.UserStar;
Raverf79fdb62025-06-03 06:02:49 +000051import entity.config;
rhj5b69b7e2025-06-07 01:28:08 +080052import entity.PostReply;
53import entity.QPostReply;
rhj5ebd93c2025-06-07 15:57:28 +080054import entity.UserInvite;
rhje18c3f72025-06-08 00:27:01 +080055import entity.QAdmin;
56import entity.UserStar;
57import entity.QUserStar;
58import entity.SubmitSeed;
59import entity.SubmitSeedId;
rhj7912f2c2025-06-09 17:21:32 +080060import entity.QSeedPromotion;
rhje18c3f72025-06-08 00:27:01 +080061
root0dbc9812025-05-19 04:41:57 +000062
TRM-coding87c24972025-06-07 14:05:29 +080063import org.slf4j.Logger;
64import org.slf4j.LoggerFactory;
65
root0dbc9812025-05-19 04:41:57 +000066public class Database1 implements DataManagerInterface {
TRM-coding87c24972025-06-07 14:05:29 +080067 private static final Logger logger = LoggerFactory.getLogger(Database1.class);
68 private EntityManagerFactory emf;
rhj5ebd93c2025-06-07 15:57:28 +080069
root678fd3e2025-06-03 14:20:20 +000070 public Database1() {
Raverf79fdb62025-06-03 06:02:49 +000071 config cfg = new config();
72 Map<String,Object> props = new HashMap<>();
73 props.put("javax.persistence.jdbc.url",
74 "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
root678fd3e2025-06-03 14:20:20 +000075 props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
76 props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
rhj5ebd93c2025-06-07 15:57:28 +080077 // 只创建一个 EntityManagerFactory,为每个操作创建新的 EntityManager
78 this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
root678fd3e2025-06-03 14:20:20 +000079 }
rhj5ebd93c2025-06-07 15:57:28 +080080
81 // 为每个操作创建新的 EntityManager 以避免线程安全问题
82 private EntityManager createEntityManager() {
83 return emf.createEntityManager();
84 }
85
TRM-codingcdfe5482025-06-06 17:31:01 +080086 @Override
87 public String LoginUser(User userinfo){
88 try {
89 // 检查传入的参数是否合法
90 if (userinfo == null || userinfo.password == null) {
91 return null;
92 }
93
TRM-codingcdfe5482025-06-06 17:31:01 +080094 boolean hasEmail = userinfo.email != null && !userinfo.email.isEmpty();
95
96 // 如果两个都为空或两个都不为空,返回null
rhj46f62c42025-06-06 23:24:10 +080097 if (!hasEmail) {
TRM-codingcdfe5482025-06-06 17:31:01 +080098 return null;
99 }
100
rhj5ebd93c2025-06-07 15:57:28 +0800101 EntityManager entitymanager = createEntityManager();
TRM-codingcdfe5482025-06-06 17:31:01 +0800102 JPAQuery<User> query = new JPAQuery<>(entitymanager);
103 QUser u = QUser.user;
104 User foundUser = null;
105
rhj46f62c42025-06-06 23:24:10 +0800106
107 // 通过邮箱和密码查找
108 foundUser = query.select(u)
109 .from(u)
110 .where(u.email.eq(userinfo.email)
111 .and(u.password.eq(userinfo.password)))
112 .fetchOne();
TRM-codingcdfe5482025-06-06 17:31:01 +0800113
114 // 如果找到匹配的用户则返回用户ID,否则返回null
115 return foundUser != null ? foundUser.userid : null;
116
117 } catch (Exception e) {
118 e.printStackTrace();
119 return null;
120 }
121 }
root0dbc9812025-05-19 04:41:57 +0000122
123 // 返回状态:0 success,1 邮箱重复,2其他原因
124 @Override
Raverf79fdb62025-06-03 06:02:49 +0000125 public int RegisterUser(User userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800126 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000127 try{
TRM-codingcdfe5482025-06-06 17:31:01 +0800128 // 首先检查该邮箱是否在UserInvite表中被邀请过
rhj5ebd93c2025-06-07 15:57:28 +0800129 JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
TRM-codingcdfe5482025-06-06 17:31:01 +0800130 QUserInvite ui = QUserInvite.userInvite;
rhj5ebd93c2025-06-07 15:57:28 +0800131 List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
TRM-codingcdfe5482025-06-06 17:31:01 +0800132
133 // 如果邮箱不在被邀请列表中,拒绝注册
rhj5ebd93c2025-06-07 15:57:28 +0800134 if(UserInvites.isEmpty()){
TRM-codingcdfe5482025-06-06 17:31:01 +0800135 return 2; // 未被邀请
136 }
137
138 // 检查邮箱是否已在User表中存在
Raverf79fdb62025-06-03 06:02:49 +0000139 JPAQuery<String> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000140 QUser u = QUser.user;
141 List<String> allEmails = query.select(u.email).from(u).fetch();
142
Raverf79fdb62025-06-03 06:02:49 +0000143 if(allEmails.contains(userinfo.email)){
TRM-codingcdfe5482025-06-06 17:31:01 +0800144 return 1; // 邮箱重复
root0dbc9812025-05-19 04:41:57 +0000145 }
root0dbc9812025-05-19 04:41:57 +0000146
rhj5ebd93c2025-06-07 15:57:28 +0800147 UserPT userPT = new UserPT();
148 userPT.userid = userinfo.userid;
149 userPT.magic = 0; // 设置默认值
150 userPT.upload = 0; // 设置默认值
151 userPT.download = 0; // 设置默认值
152 userPT.share = 0.0; // 设置默认值
153 userPT.user = userinfo; // 设置关联关系
154 userPT.farmurl = ""; // 设置默认值
155 userPT.viptime = 0; // 设置默认值
156
rhj46f62c42025-06-06 23:24:10 +0800157 entitymanager.getTransaction().begin();
158 entitymanager.persist(userinfo);
rhj5ebd93c2025-06-07 15:57:28 +0800159 entitymanager.persist(userPT);
160 // 删除所有匹配的邀请记录
161 for (UserInvite invite : UserInvites) {
162 entitymanager.remove(invite);
163 }
rhj46f62c42025-06-06 23:24:10 +0800164 entitymanager.getTransaction().commit();
165 return 0; // 注册成功
TRM-coding93f7be82025-06-06 22:29:02 +0800166
rhj46f62c42025-06-06 23:24:10 +0800167 }catch(Exception e){
168 e.printStackTrace();
169 if (entitymanager.getTransaction().isActive()) {
170 entitymanager.getTransaction().rollback();
171 }
172 return 4;
173 }
TRM-coding93f7be82025-06-06 22:29:02 +0800174
root0dbc9812025-05-19 04:41:57 +0000175 }
176
177 // 返回状态:0 success,1 不存在,2其他原因
178 @Override
Raverf79fdb62025-06-03 06:02:49 +0000179 public int UpdateInformation(User userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800180 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000181 try {
182 if (userinfo.userid == null) {
183 return 2; // userid为null直接返回错误
184 }
rhj5ebd93c2025-06-07 15:57:28 +0800185
rhjc6a4ee02025-06-06 00:45:18 +0800186 entitymanager.getTransaction().begin();
187
Raverf79fdb62025-06-03 06:02:49 +0000188 JPAQuery<User> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000189 QUser u = QUser.user;
190 User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
191
Raverf79fdb62025-06-03 06:02:49 +0000192 if(updateUser == null){
rhjc6a4ee02025-06-06 00:45:18 +0800193 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000194 return 1;
195 }
196 // 只更新需要的字段,避免破坏持久化状态和关联关系
rhjc6a4ee02025-06-06 00:45:18 +0800197 if (userinfo.email != null) updateUser.email = userinfo.email;
198 if (userinfo.username != null) updateUser.username = userinfo.username;
199 if (userinfo.password != null) updateUser.password = userinfo.password;
200 if (userinfo.sex != null) updateUser.sex = userinfo.sex;
201 if (userinfo.school != null) updateUser.school = userinfo.school;
202 if (userinfo.pictureurl != null) updateUser.pictureurl = userinfo.pictureurl;
203 if (userinfo.profile != null) updateUser.profile = userinfo.profile;
root0dbc9812025-05-19 04:41:57 +0000204 updateUser.accountstate = userinfo.accountstate;
205 updateUser.invitetimes = userinfo.invitetimes;
206 // 如有其他字段也一并赋值
Raverf79fdb62025-06-03 06:02:49 +0000207 entitymanager.merge(updateUser);
rhjc6a4ee02025-06-06 00:45:18 +0800208 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000209 return 0;
210 } catch (Exception e) {
211 e.printStackTrace();
rhjc6a4ee02025-06-06 00:45:18 +0800212 if (entitymanager.getTransaction().isActive()) {
213 entitymanager.getTransaction().rollback();
214 }
root0dbc9812025-05-19 04:41:57 +0000215 return 2;
216 }
Raverf79fdb62025-06-03 06:02:49 +0000217
root0dbc9812025-05-19 04:41:57 +0000218 }
219
220 // 返回用户的全部基本信息
221 @Override
Raverf79fdb62025-06-03 06:02:49 +0000222 public User GetInformation(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800223 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000224 User user = entitymanager.find(User.class, userid);
225 return user;
root0dbc9812025-05-19 04:41:57 +0000226 }
227
228 //返回用户的全部pt站信息
229 @Override
Raverf79fdb62025-06-03 06:02:49 +0000230 public UserPT GetInformationPT(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800231 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +0800232 try {
233 UserPT userPT = entitymanager.find(UserPT.class, userid);
234 if (userPT == null) {
235 return null; // 用户PT信息不存在
236 }
237 return userPT;
238 } catch (Exception e) {
239 e.printStackTrace();
240 return null; // 出现异常,返回null
241 }
root0dbc9812025-05-19 04:41:57 +0000242 }
243
244 //返回状态:0 success,1 邮箱重复,2其他原因
245 @Override
Raverf79fdb62025-06-03 06:02:49 +0000246 public int UpdateInformationPT(UserPT userinfo){
247 try{
rhj5ebd93c2025-06-07 15:57:28 +0800248 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000249 JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000250 QUserPT u = QUserPT.userPT;
251 UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
Raverf79fdb62025-06-03 06:02:49 +0000252
253 if(userPT == null){
root0dbc9812025-05-19 04:41:57 +0000254 return 1;
255 }
256 userPT = userinfo;
Raverf79fdb62025-06-03 06:02:49 +0000257 entitymanager.merge(userPT);
root0dbc9812025-05-19 04:41:57 +0000258 return 0;
259
Raverf79fdb62025-06-03 06:02:49 +0000260 }catch(Exception e){
root0dbc9812025-05-19 04:41:57 +0000261 e.printStackTrace();
262 return 2;
263 }
264 }
265
266 //返回状态:0 success,1 id重复,2其他原因
267 @Override
Raverf79fdb62025-06-03 06:02:49 +0000268 public int RegisterUserPT(UserPT userinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800269 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000270 try {
rhj46f62c42025-06-06 23:24:10 +0800271 entitymanager.getTransaction().begin();
272
Raverf79fdb62025-06-03 06:02:49 +0000273 JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000274 QUserPT u = QUserPT.userPT;
275 UserPT checkUserPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
276 if (checkUserPT != null) {
rhj46f62c42025-06-06 23:24:10 +0800277 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000278 return 1;
279 }
rhj46f62c42025-06-06 23:24:10 +0800280
Raverf79fdb62025-06-03 06:02:49 +0000281 entitymanager.persist(userinfo);
rhj46f62c42025-06-06 23:24:10 +0800282 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000283 return 0;
284 } catch (Exception e) {
285 e.printStackTrace();
rhj46f62c42025-06-06 23:24:10 +0800286 if (entitymanager.getTransaction().isActive()) {
287 entitymanager.getTransaction().rollback();
288 }
root0dbc9812025-05-19 04:41:57 +0000289 return 2;
290 }
291 }
292
293 //返回种子的全部信息
294 @Override
Raverf79fdb62025-06-03 06:02:49 +0000295 public Seed GetSeedInformation(String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800296 EntityManager em = createEntityManager();
297 try {
298 JPAQuery<Seed> query = new JPAQuery<>(em);
299 QSeed s = QSeed.seed;
300 QUser u = QUser.user;
301 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
302 Seed seed = query.select(s).from(s)
303 .leftJoin(s.user, u).fetchJoin()
304 .where(s.seedid.eq(seedid)).fetchOne();
305 return seed;
306 } finally {
307 em.close();
308 }
root0dbc9812025-05-19 04:41:57 +0000309 }
310
Raveraae06122025-06-05 08:13:35 +0000311 @Override
rhj7912f2c2025-06-09 17:21:32 +0800312 public SeedWithPromotionDTO[] GetSeedListByTag(String tag){
rhj5ebd93c2025-06-07 15:57:28 +0800313 EntityManager em = createEntityManager();
314 try {
315 JPAQuery<Seed> query = new JPAQuery<>(em);
316 QSeed s = QSeed.seed;
317 QUser u = QUser.user;
rhj7912f2c2025-06-09 17:21:32 +0800318 QSeedPromotion sp = QSeedPromotion.seedPromotion;
319
rhj5ebd93c2025-06-07 15:57:28 +0800320 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
321 List<Seed> seeds = query.select(s).from(s)
322 .leftJoin(s.user, u).fetchJoin()
323 .where(s.seedtag.eq(tag)).fetch();
rhj7912f2c2025-06-09 17:21:32 +0800324
325 // 创建结果列表
326 List<SeedWithPromotionDTO> result = new ArrayList<>();
327 Date currentDate = new Date();
328
329 for (Seed seed : seeds) {
330 // 查询当前有效的促销信息
331 JPAQuery<SeedPromotion> promotionQuery = new JPAQuery<>(em);
332 SeedPromotion promotion = promotionQuery.select(sp).from(sp)
333 .where(sp.seed.seedid.eq(seed.seedid)
334 .and(sp.startTime.loe(currentDate))
335 .and(sp.endTime.goe(currentDate)))
336 .fetchOne();
337
338 Integer discount = promotion != null ? promotion.discount : null;
339 result.add(new SeedWithPromotionDTO(seed, discount));
340 }
341
342 return result.toArray(new SeedWithPromotionDTO[0]);
rhj5ebd93c2025-06-07 15:57:28 +0800343 } finally {
344 em.close();
345 }
Raveraae06122025-06-05 08:13:35 +0000346 }
347
rhjc6a4ee02025-06-06 00:45:18 +0800348 @Override
349 public Seed[] GetSeedListByUser(String userid){
rhj5ebd93c2025-06-07 15:57:28 +0800350 EntityManager em = createEntityManager();
351 try {
352 JPAQuery<Seed> query = new JPAQuery<>(em);
353 QSeed s = QSeed.seed;
354 QUser u = QUser.user;
355 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
356 List<Seed> seeds = query.select(s).from(s)
357 .leftJoin(s.user, u).fetchJoin()
358 .where(s.seeduserid.eq(userid)).fetch();
359 return seeds.toArray(new Seed[0]);
360 } finally {
361 em.close();
362 }
rhjc6a4ee02025-06-06 00:45:18 +0800363 }
364
365 @Override
366 public int DeleteSeed(String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800367 EntityManager entitymanager = createEntityManager();
rhjc6a4ee02025-06-06 00:45:18 +0800368 try {
369 entitymanager.getTransaction().begin();
370 Seed seed = entitymanager.find(Seed.class, seedid);
371 if (seed == null) {
372 entitymanager.getTransaction().rollback();
373 return 1; // 种子不存在
374 }
375 entitymanager.remove(seed);
376 entitymanager.getTransaction().commit();
377 return 0; // 成功删除
378 } catch (Exception e) {
379 e.printStackTrace();
380 if (entitymanager.getTransaction().isActive()) {
381 entitymanager.getTransaction().rollback();
382 }
383 return 2; // 其他错误
384 }
385 }
386
root0dbc9812025-05-19 04:41:57 +0000387 //添加一个新的种子,0成功,其他失败信息待定;
388 @Override
Raverf79fdb62025-06-03 06:02:49 +0000389 public int RegisterSeed(Seed seedinfo){
rhj5ebd93c2025-06-07 15:57:28 +0800390 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000391 try {
Raveraae06122025-06-05 08:13:35 +0000392 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000393 JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000394 QSeed s = QSeed.seed;
395 Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
Raveraae06122025-06-05 08:13:35 +0000396 User user = entitymanager.find(User.class, seedinfo.seeduserid);
397 if (user == null) {
398 entitymanager.getTransaction().rollback();
399 return 2; // 用户不存在
400 }
rhjc6a4ee02025-06-06 00:45:18 +0800401 seedinfo.user = user; // 设置种子的用户关联
root0dbc9812025-05-19 04:41:57 +0000402 if (seed != null) {
Raveraae06122025-06-05 08:13:35 +0000403 entitymanager.getTransaction().rollback();
root0dbc9812025-05-19 04:41:57 +0000404 return 1;
405 }
Raverf79fdb62025-06-03 06:02:49 +0000406 entitymanager.persist(seedinfo);
Raveraae06122025-06-05 08:13:35 +0000407 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000408 return 0;
409 } catch (Exception e) {
410 e.printStackTrace();
Raveraae06122025-06-05 08:13:35 +0000411 if (entitymanager.getTransaction().isActive()) {
412 entitymanager.getTransaction().rollback();
413 }
root0dbc9812025-05-19 04:41:57 +0000414 return 2;
415 }
416 }
417
418 //接收新的种子然后更新其全部属性
419 @Override
Raverf79fdb62025-06-03 06:02:49 +0000420 public int UpdateSeed(Seed seedinfo){
root0dbc9812025-05-19 04:41:57 +0000421 try {
rhj5ebd93c2025-06-07 15:57:28 +0800422 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000423 JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000424 QSeed s = QSeed.seed;
425 Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
426 if (seed == null) {
427 return 1;
428 }
429 seed = seedinfo;
Raverf79fdb62025-06-03 06:02:49 +0000430 entitymanager.merge(seed);
root0dbc9812025-05-19 04:41:57 +0000431 return 0;
432 } catch (Exception e) {
433 e.printStackTrace();
434 return 2;
435 }
436 }
437
438 //传入搜索的关键词或句子,返回搜索到的种子信息(按照公共字符数量排序)
439 @Override
Raverf79fdb62025-06-03 06:02:49 +0000440 public Seed[] SearchSeed(String userQ){
rhj5ebd93c2025-06-07 15:57:28 +0800441 EntityManager em = createEntityManager();
442 try {
443 JPAQuery<Seed> query = new JPAQuery<>(em);
444 QSeed s = QSeed.seed;
445 QUser u = QUser.user;
446 // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
447 List<Seed> seeds = query.select(s).from(s)
448 .leftJoin(s.user, u).fetchJoin()
449 .fetch();
root0dbc9812025-05-19 04:41:57 +0000450
rhj5ebd93c2025-06-07 15:57:28 +0800451 if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
452 return seeds.toArray(new Seed[0]);
453 }
454
455 String processedQuery = userQ.toLowerCase().trim();
456 Map<Seed, Integer> seedCountMap = new HashMap<>();
457 for(Seed seed : seeds){
458 String title = seed.title.toLowerCase().trim();
459 int count = countCommonCharacter(processedQuery, title);
460 seedCountMap.put(seed, count);
461 }
462 seeds.sort((s1, s2) -> {
463 int count1 = seedCountMap.getOrDefault(s1, 0);
464 int count2 = seedCountMap.getOrDefault(s2, 0);
465 return Integer.compare(count2, count1);
466 });
467
root0dbc9812025-05-19 04:41:57 +0000468 return seeds.toArray(new Seed[0]);
rhj5ebd93c2025-06-07 15:57:28 +0800469 } finally {
470 em.close();
root0dbc9812025-05-19 04:41:57 +0000471 }
root0dbc9812025-05-19 04:41:57 +0000472 }
473
474 //计算字符串公共字符数量
Raverf79fdb62025-06-03 06:02:49 +0000475 private int countCommonCharacter(String str1, String str2){
root0dbc9812025-05-19 04:41:57 +0000476 Map<Character, Integer> map1 = new HashMap<>();
477 Map<Character, Integer> map2 = new HashMap<>();
478
Raverf79fdb62025-06-03 06:02:49 +0000479 for(char c : str1.toCharArray()){
root0dbc9812025-05-19 04:41:57 +0000480 if (!Character.isWhitespace(c)) {
481 map1.put(c, map1.getOrDefault(c, 0) + 1);
482 }
483 }
484
Raverf79fdb62025-06-03 06:02:49 +0000485 for(char c : str2.toCharArray()){
root0dbc9812025-05-19 04:41:57 +0000486 if (!Character.isWhitespace(c)) {
487 map2.put(c, map2.getOrDefault(c, 0) + 1);
488 }
489 }
490
491 int res = 0;
Raverf79fdb62025-06-03 06:02:49 +0000492 for(char c : map1.keySet()){
root0dbc9812025-05-19 04:41:57 +0000493 if (map2.containsKey(c)) {
494 res += Math.min(map1.get(c), map2.get(c));
495 }
Raverf79fdb62025-06-03 06:02:49 +0000496
root0dbc9812025-05-19 04:41:57 +0000497 }
498 return res;
499 }
500
501 //返回状态:0 success,1 重复,2其他原因
502 @Override
Raverf79fdb62025-06-03 06:02:49 +0000503 public int AddNotice(Notice notice){
root0dbc9812025-05-19 04:41:57 +0000504 try {
rhj5ebd93c2025-06-07 15:57:28 +0800505 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000506 JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000507 QNotice n = QNotice.notice;
508 Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
509 if (checkNotice != null) {
510 return 1;
511 }
Raverf79fdb62025-06-03 06:02:49 +0000512
513 entitymanager.persist(notice);
root0dbc9812025-05-19 04:41:57 +0000514 return 0;
515 } catch (Exception e) {
516 e.printStackTrace();
517 return 2;
518 }
Raverf79fdb62025-06-03 06:02:49 +0000519
root0dbc9812025-05-19 04:41:57 +0000520 }
521
522 //返回状态:0 success,1 不存在,2其他原因
523 @Override
Raverf79fdb62025-06-03 06:02:49 +0000524 public boolean UpdateNotice(Notice notice){
root0dbc9812025-05-19 04:41:57 +0000525 try {
rhj5ebd93c2025-06-07 15:57:28 +0800526 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000527 Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
root0dbc9812025-05-19 04:41:57 +0000528 if (oldNotice == null) {
529 return false;
530 }
531 oldNotice = notice;
Raverf79fdb62025-06-03 06:02:49 +0000532 entitymanager.merge(oldNotice);
root0dbc9812025-05-19 04:41:57 +0000533 return true;
534 } catch (Exception e) {
535 e.printStackTrace();
536 return false;
537 }
538 }
539
540 //删除公告,返回状态:0 success,1 不存在,2其他原因
541 @Override
Raverf79fdb62025-06-03 06:02:49 +0000542 public boolean DeleteNotice(String noticeid){
root0dbc9812025-05-19 04:41:57 +0000543 try {
rhj5ebd93c2025-06-07 15:57:28 +0800544 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000545 Notice notice = entitymanager.find(Notice.class, noticeid);
root0dbc9812025-05-19 04:41:57 +0000546 if (notice == null) {
547 return false;
548 }
Raverf79fdb62025-06-03 06:02:49 +0000549 entitymanager.remove(notice);
root0dbc9812025-05-19 04:41:57 +0000550 return true;
551 } catch (Exception e) {
552 e.printStackTrace();
553 return false;
554 }
Raverf79fdb62025-06-03 06:02:49 +0000555
root0dbc9812025-05-19 04:41:57 +0000556 }
557
558 //获取用户的剩余邀请次数
Raverf79fdb62025-06-03 06:02:49 +0000559 public int GetUserAvailableInviteTimes(String userid){
root0dbc9812025-05-19 04:41:57 +0000560 try {
rhj5ebd93c2025-06-07 15:57:28 +0800561 EntityManager entitymanager = createEntityManager();
Raverf79fdb62025-06-03 06:02:49 +0000562 JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000563 QUser u = QUser.user;
564 int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
Raverf79fdb62025-06-03 06:02:49 +0000565
root0dbc9812025-05-19 04:41:57 +0000566 return invite_left;
567 } catch (Exception e) {
568 e.printStackTrace();
569 return -1;
570 }
Raverf79fdb62025-06-03 06:02:49 +0000571
root0dbc9812025-05-19 04:41:57 +0000572 }
573
574 //邀请用户,返回状态:0 success,1 剩余次数不足,2,3其他原因
575 @Override
Raverf79fdb62025-06-03 06:02:49 +0000576 public int InviteUser(String inviterid,String inviteemail){
rhje18c3f72025-06-08 00:27:01 +0800577 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000578 try {
Raverf79fdb62025-06-03 06:02:49 +0000579 User user = entitymanager.find(User.class, inviterid);
root0dbc9812025-05-19 04:41:57 +0000580 if (user == null || !user.email.equals(inviteemail)) {
581 return 3;
582 }
583 if (user.invitetimes <= 0) {
584 return 1;
585 }
586 user.invitetimes -= 1;
rhje18c3f72025-06-08 00:27:01 +0800587 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000588 entitymanager.merge(user);
rhje18c3f72025-06-08 00:27:01 +0800589 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000590 return 0;
591 } catch (Exception e) {
592 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +0800593 if (entitymanager.getTransaction().isActive()) {
594 entitymanager.getTransaction().rollback();
595 }
root0dbc9812025-05-19 04:41:57 +0000596 return 2;
597 }
root0dbc9812025-05-19 04:41:57 +0000598 }
599
600 //添加一个收藏,返回状态:0 success,1 不存在,2其他原因
601 @Override
Raverf79fdb62025-06-03 06:02:49 +0000602 public boolean AddCollect(String userid,String seedid){
rhj5ebd93c2025-06-07 15:57:28 +0800603 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +0800604 try {
605 JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
606 QUser u2 = QUser.user;
607 User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
608 if (user == null) {
609 return false;
610 }
611 JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
612 QSeed p = QSeed.seed;
613 Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
614 if (seed == null) {
615 return false;
616 }
617 JPAQuery<String> query = new JPAQuery<>(entitymanager);
618 QUserStar u = QUserStar.userStar;
619 List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
Raverf79fdb62025-06-03 06:02:49 +0000620
rhje18c3f72025-06-08 00:27:01 +0800621 if (allSeedId.contains(seedid)) {
622 return false;
623 }
624 UserStar userStar = new UserStar();
625 userStar.userid = userid;
626 userStar.seedid = seedid;
rhj7125df42025-06-09 01:06:01 +0800627 userStar.seed = seed; // 设置关联的种子对象
628 userStar.user = user; // 设置关联的用户对象
629 userStar.createdAt = new Date(); // 设置创建时间
rhje18c3f72025-06-08 00:27:01 +0800630 entitymanager.getTransaction().begin();
631 entitymanager.persist(userStar);
632 entitymanager.getTransaction().commit();
633 return true;
634 } catch (Exception e) {
635 e.printStackTrace();
636 if (entitymanager.getTransaction().isActive()) {
637 entitymanager.getTransaction().rollback();
638 }
Raverf79fdb62025-06-03 06:02:49 +0000639 return false;
rhje18c3f72025-06-08 00:27:01 +0800640 } finally {
641 if (entitymanager != null) {
642 entitymanager.close();
643 }
Raverf79fdb62025-06-03 06:02:49 +0000644 }
root0dbc9812025-05-19 04:41:57 +0000645 }
646
647 //删除一个收藏,返回状态:0 success,1 不存在,2其他原因
648 @Override
rhje18c3f72025-06-08 00:27:01 +0800649 public boolean DeleteCollect(String userid, String seedid){
650 EntityManager entitymanager = createEntityManager();
root0dbc9812025-05-19 04:41:57 +0000651 try {
Raverf79fdb62025-06-03 06:02:49 +0000652 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
root0dbc9812025-05-19 04:41:57 +0000653 QUserStar u = QUserStar.userStar;
654 UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
655 if (userStar == null) {
656 return true; // 收藏不存在
657 }
rhje18c3f72025-06-08 00:27:01 +0800658 entitymanager.getTransaction().begin();
Raverf79fdb62025-06-03 06:02:49 +0000659 entitymanager.remove(userStar);
rhje18c3f72025-06-08 00:27:01 +0800660 entitymanager.getTransaction().commit();
root0dbc9812025-05-19 04:41:57 +0000661 return true;
662 } catch (Exception e) {
663 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +0800664 if (entitymanager.getTransaction().isActive()) {
665 entitymanager.getTransaction().rollback();
666 }
root0dbc9812025-05-19 04:41:57 +0000667 return false;
rhje18c3f72025-06-08 00:27:01 +0800668 } finally {
669 if (entitymanager != null) {
670 entitymanager.close();
671 }
root0dbc9812025-05-19 04:41:57 +0000672 }
Raverf79fdb62025-06-03 06:02:49 +0000673
root0dbc9812025-05-19 04:41:57 +0000674 }
675
676 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800677 public int AddBegSeed(BegInfo info) {
678 if (info == null || info.begid == null || info.begid.isEmpty()) {
679 logger.warn("Invalid parameter: info is null or begid is empty");
680 return 2;
681 }
682
683 EntityTransaction tx = null;
684
685 try {
rhj5ebd93c2025-06-07 15:57:28 +0800686 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800687 tx = entitymanager.getTransaction();
688 tx.begin();
689
690 // 检查是否重复
691 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
692 if (existingBeg != null) {
693 logger.warn("BegSeed with ID {} already exists", info.begid);
694 return 1;
695 }
696
697 // 设置默认值
698 if (info.endtime == null) {
699 // 设置默认14天截止期
700 Calendar calendar = Calendar.getInstance();
701 calendar.add(Calendar.DAY_OF_MONTH, 14);
702 info.endtime = calendar.getTime();
703 }
704 info.hasseed = 0;
705
706 // 保存新的求种信息
707 entitymanager.persist(info);
708 tx.commit();
709
710 logger.info("Successfully added new BegSeed with ID: {}", info.begid);
711 return 0;
712
713 } catch (Exception e) {
714 if (tx != null && tx.isActive()) {
715 tx.rollback();
716 }
717 logger.error("Error adding BegSeed: {}", e.getMessage());
718 return 2;
719 }
root0dbc9812025-05-19 04:41:57 +0000720 }
721
722 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800723 public int UpdateBegSeed(BegInfo info) {
724 if (info == null || info.begid == null || info.begid.isEmpty()) {
725 logger.warn("Invalid parameter: info is null or begid is empty");
726 return 2;
727 }
728
729 EntityTransaction tx = null;
730
731 try {
rhj5ebd93c2025-06-07 15:57:28 +0800732 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800733 tx = entitymanager.getTransaction();
734 tx.begin();
735
736 // 检查是否存在
737 BegInfo existingBeg = entitymanager.find(BegInfo.class, info.begid);
738 if (existingBeg == null) {
739 logger.warn("BegSeed with ID {} does not exist", info.begid);
740 return 1;
741 }
742
743 // 保持原有值不变的字段
744 info.hasseed = existingBeg.hasseed;
745 if (info.endtime == null) {
746 info.endtime = existingBeg.endtime;
747 }
748
749 // 更新求种信息
750 entitymanager.merge(info);
751 tx.commit();
752
753 logger.info("Successfully updated BegSeed with ID: {}", info.begid);
754 return 0;
755
756 } catch (Exception e) {
757 if (tx != null && tx.isActive()) {
758 tx.rollback();
759 }
760 logger.error("Error updating BegSeed: {}", e.getMessage());
761 return 2;
762 }
root0dbc9812025-05-19 04:41:57 +0000763 }
764
765 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800766 public int DeleteBegSeed(String begid) {
767 if (begid == null || begid.isEmpty()) {
768 logger.warn("Invalid parameter: begid is null or empty");
769 return 2;
770 }
771
772 EntityTransaction tx = null;
773
774 try {
rhj5ebd93c2025-06-07 15:57:28 +0800775 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800776 tx = entitymanager.getTransaction();
777 tx.begin();
778
779 // 查找要删除的求种信息
780 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
781 if (begInfo == null) {
782 logger.warn("BegSeed with ID {} does not exist", begid);
783 tx.rollback();
784 return 1;
785 }
786
787 // 删除求种信息
788 entitymanager.remove(begInfo);
789 tx.commit();
790
791 logger.info("Successfully deleted BegSeed with ID: {}", begid);
792 return 0;
793
794 } catch (Exception e) {
795 if (tx != null && tx.isActive()) {
796 tx.rollback();
797 }
798 logger.error("Error deleting BegSeed: {}", e.getMessage());
799 return 2;
800 }
root0dbc9812025-05-19 04:41:57 +0000801 }
802
803 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800804 public int VoteSeed(String begId, String seedId, String userId) {
805 if (begId == null || seedId == null || userId == null ||
806 begId.isEmpty() || seedId.isEmpty() || userId.isEmpty()) {
807 logger.warn("Invalid parameters: begId, seedId or userId is null or empty");
808 return 2;
809 }
810
811 EntityTransaction tx = null;
812
813 try {
rhj5ebd93c2025-06-07 15:57:28 +0800814 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800815 tx = entitymanager.getTransaction();
816 tx.begin();
817
818 // 检查求种信息是否存在
819 BegInfo begInfo = entitymanager.find(BegInfo.class, begId);
820 if (begInfo == null) {
821 logger.warn("BegSeed with ID {} does not exist", begId);
822 return 2;
823 }
824
825 // 检查用户是否已投票
826 Long voteCount = new JPAQuery<>(entitymanager)
827 .select(QUserVotes.userVotes.count())
828 .from(QUserVotes.userVotes)
829 .where(QUserVotes.userVotes.id.eq(new entity.UserVotesId(userId, begId, seedId)))
830 .fetchOne();
831
832 if (voteCount != null && voteCount > 0) {
833 logger.warn("User {} has already voted for seed {} in beg {}", userId, seedId, begId);
834 return 1;
835 }
836
837 // 创建新的投票记录
838 entitymanager.createNativeQuery("INSERT INTO UserVotes (user_id, beg_id, seed_id, created_at) " +
839 "VALUES (?, ?, ?, CURRENT_TIMESTAMP)")
840 .setParameter(1, userId)
841 .setParameter(2, begId)
842 .setParameter(3, seedId)
843 .executeUpdate();
844
845 // 更新SubmitSeed表中的投票数
846 entitymanager.createQuery("UPDATE SubmitSeed s SET s.votes = s.votes + 1 " +
847 "WHERE s.id.begId = :begId AND s.id.seedId = :seedId")
848 .setParameter("begId", begId)
849 .setParameter("seedId", seedId)
850 .executeUpdate();
851
852 tx.commit();
853 logger.info("Successfully added vote from user {} for seed {} in beg {}", userId, seedId, begId);
854 return 0;
855
856 } catch (Exception e) {
857 if (tx != null && tx.isActive()) {
858 tx.rollback();
859 }
860 logger.error("Error voting for seed: {}", e.getMessage());
861 return 2;
862 }
root0dbc9812025-05-19 04:41:57 +0000863 }
864
865 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800866 public int SubmitSeed(String begid, Seed seed) {
867 if (begid == null || seed == null || begid.isEmpty() || seed.seedid == null) {
868 logger.warn("Invalid parameters: begid or seed is null or empty");
869 return 2;
870 }
871
872 EntityTransaction tx = null;
873
874 try {
rhj5ebd93c2025-06-07 15:57:28 +0800875 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800876 tx = entitymanager.getTransaction();
877 tx.begin();
878
879 // 检查求种信息是否存在
880 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
881 if (begInfo == null) {
882 logger.warn("BegSeed with ID {} does not exist", begid);
883 return 2;
884 }
885
886 // 检查种子是否已提交过
887 QSubmitSeed ss = QSubmitSeed.submitSeed;
888 Long submitCount = new JPAQuery<>(entitymanager)
889 .select(ss.count())
890 .from(ss)
891 .where(ss.begInfo.begid.eq(begid))
892 .where(ss.seed.seedid.eq(seed.seedid))
893 .fetchOne();
894
895 if (submitCount > 0) {
896 logger.warn("Seed {} has already been submitted for beg {}", seed.seedid,
897 begid);
898 return 1;
899 }
900
901 // 保存种子信息(如果不存在)
902 if (entitymanager.find(Seed.class, seed.seedid) == null) {
903 entitymanager.persist(seed);
904 }
905
906 // 创建提交记录
907 entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
908 .setParameter(1, begid)
909 .setParameter(2, seed.seedid)
910 .executeUpdate();
911
912 tx.commit();
913 logger.info("Successfully submitted seed {} for beg {}", seed.seedid, begid);
914 return 0;
915
916 } catch (Exception e) {
917 if (tx != null && tx.isActive()) {
918 tx.rollback();
919 }
920 logger.error("Error submitting seed: {}", e.getMessage());
921 return 2;
922 }
root0dbc9812025-05-19 04:41:57 +0000923 }
924
925 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800926 public void SettleBeg() {
927 EntityTransaction tx = null;
928
929 try {
rhj5ebd93c2025-06-07 15:57:28 +0800930 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +0800931 tx = entitymanager.getTransaction();
932 tx.begin();
933
934 // 1. 获取所有已过期且未完成的求种信息
935 QBegInfo b = QBegInfo.begInfo;
936 List<BegInfo> expiredBegs = new JPAQuery<>(entitymanager)
937 .select(b)
938 .from(b)
939 .where(b.endtime.loe(new Date())
940 .and(b.hasseed.eq(0)))
941 .fetch();
942
943 for (BegInfo beg : expiredBegs) {
944 // 2. 查找投票最多的提交任务
945 QSubmitSeed ss = QSubmitSeed.submitSeed;
946 Tuple topSubmission = new JPAQuery<>(entitymanager)
947 .select(ss.seed.seedid, ss.votes)
948 .from(ss)
949 .where(ss.begInfo.begid.eq(beg.begid))
950 .orderBy(ss.votes.desc())
951 .limit(1)
952 .fetchOne();
953
954 if (topSubmission != null && topSubmission.get(ss.votes) > 0) {
955 String seedId = topSubmission.get(ss.seed.seedid);
956
957 // 3. 获取上传者ID
958 QSeed s = QSeed.seed;
959 String ownerId = new JPAQuery<>(entitymanager)
960 .select(s.seeduserid)
961 .from(s)
962 .where(s.seedid.eq(seedId))
963 .fetchOne();
964
965 // 4. 获取上传者的PT信息并更新魔力值
966 UserPT ownerPT = entitymanager.find(UserPT.class, ownerId);
967 if (ownerPT != null) {
968 // 5. 发放奖励
969 ownerPT.magic += beg.magic;
970 entitymanager.merge(ownerPT);
971
972 // 6. 更新求种状态
973 beg.hasseed = 1;
974 entitymanager.merge(beg);
975
976 logger.info("Reward {} magic points awarded to user {} for beg {}",
977 beg.magic, ownerId, beg.begid);
978 }
979 }
980 }
981
982 tx.commit();
983 logger.info("Successfully settled {} expired beg requests",
984 expiredBegs.size());
985
986 } catch (Exception e) {
987 if (tx != null && tx.isActive()) {
988 tx.rollback();
989 }
990 logger.error("Error settling beg requests: {}", e.getMessage(), e);
991 }
root0dbc9812025-05-19 04:41:57 +0000992 }
993
994 @Override
TRM-coding87c24972025-06-07 14:05:29 +0800995 public int AddPost(Post post) {
996 if (post == null || post.postid == null || post.postid.isEmpty()) {
997 logger.warn("Invalid parameter: post is null or postid is empty");
998 return 2;
999 }
1000
1001 EntityTransaction tx = null;
1002
1003 try {
rhj5ebd93c2025-06-07 15:57:28 +08001004 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +08001005 tx = entitymanager.getTransaction();
1006 tx.begin();
1007
1008 // 检查是否重复
1009 Post existingPost = entitymanager.find(Post.class, post.postid);
1010 if (existingPost != null) {
1011 logger.warn("Post with ID {} already exists", post.postid);
1012 return 1;
1013 }
1014
1015 // 检查用户是否存在
1016 User user = entitymanager.find(User.class, post.postuserid);
1017 if (user == null) {
1018 logger.warn("User with ID {} does not exist", post.postuserid);
1019 return 2;
1020 }
1021
1022 // 设置初始值
1023 if (post.posttime == null) {
1024 post.posttime = new Date();
1025 }
1026 post.replytime = 0;
1027 post.readtime = 0;
1028
1029 // 保存帖子
1030 entitymanager.persist(post);
1031 tx.commit();
1032
1033 logger.info("Successfully added new post with ID: {}", post.postid);
1034 return 0;
1035
1036 } catch (Exception e) {
1037 if (tx != null && tx.isActive()) {
1038 tx.rollback();
1039 }
1040 logger.error("Error adding post: {}", e.getMessage());
1041 return 2;
1042 }
root0dbc9812025-05-19 04:41:57 +00001043 }
1044
1045 @Override
TRM-coding87c24972025-06-07 14:05:29 +08001046 public int UpdatePost(Post post) {
1047 if (post == null || post.postid == null || post.postid.isEmpty()) {
1048 logger.warn("Invalid parameter: post is null or postid is empty");
1049 return 2;
1050 }
1051
1052 EntityTransaction tx = null;
1053
1054 try {
rhj5ebd93c2025-06-07 15:57:28 +08001055 EntityManager entitymanager = createEntityManager();
TRM-coding87c24972025-06-07 14:05:29 +08001056 tx = entitymanager.getTransaction();
1057 tx.begin();
1058
1059 // 检查帖子是否存在
1060 Post existingPost = entitymanager.find(Post.class, post.postid);
1061 if (existingPost == null) {
1062 logger.warn("Post with ID {} does not exist", post.postid);
1063 return 1;
1064 }
1065
1066 // 保持原有不可修改的字段
1067 post.postuserid = existingPost.postuserid;
1068 post.posttime = existingPost.posttime;
1069 post.replytime = existingPost.replytime;
1070 post.readtime = existingPost.readtime;
1071
1072 // 更新帖子
1073 entitymanager.merge(post);
1074 tx.commit();
1075
1076 logger.info("Successfully updated post with ID: {}", post.postid);
1077 return 0;
1078
1079 } catch (Exception e) {
1080 if (tx != null && tx.isActive()) {
1081 tx.rollback();
1082 }
1083 logger.error("Error updating post: {}", e.getMessage());
1084 return 2;
1085 }
root0dbc9812025-05-19 04:41:57 +00001086 }
1087
1088 @Override
Raverf79fdb62025-06-03 06:02:49 +00001089 public int DeletePost(String postid){
TRM-coding87c24972025-06-07 14:05:29 +08001090 if (postid == null || postid.isEmpty()) {
1091 logger.warn("Invalid parameter: postid is null or empty");
1092 return 2;
1093 }
1094
1095 EntityManager em = null;
1096 EntityTransaction tx = null;
1097
1098 try {
1099 em = emf.createEntityManager();
1100 tx = em.getTransaction();
1101 tx.begin();
1102
1103 // 查找要删除的帖子
1104 Post post = em.find(Post.class, postid);
1105 if (post == null) {
1106 logger.warn("Post with ID {} does not exist", postid);
1107 tx.rollback();
1108 return 1;
1109 }
1110
1111 // 删除帖子(由于设置了级联删除,相关的回复会自动删除)
1112 em.remove(post);
1113 tx.commit();
1114
1115 logger.info("Successfully deleted post with ID: {}", postid);
1116 return 0;
1117
1118 } catch (Exception e) {
1119 if (tx != null && tx.isActive()) {
1120 tx.rollback();
1121 }
1122 logger.error("Error deleting post: {}", e.getMessage());
1123 return 2;
1124 } finally {
1125 if (em != null) {
1126 em.close();
1127 }
1128 }
root0dbc9812025-05-19 04:41:57 +00001129 }
1130
1131 @Override
Raverf79fdb62025-06-03 06:02:49 +00001132 public int AddComment(String postid, String userid, String comment){
TRM-coding87c24972025-06-07 14:05:29 +08001133 if (postid == null || postid.isEmpty() ||
1134 userid == null || userid.isEmpty() ||
1135 comment == null || comment.isEmpty()) {
1136 logger.warn("Invalid parameters: postid, userid or comment is null or empty");
1137 return 2;
1138 }
1139
1140 EntityManager em = null;
1141 EntityTransaction tx = null;
1142
1143 try {
1144 em = emf.createEntityManager();
1145 tx = em.getTransaction();
1146 tx.begin();
1147
1148 // 检查帖子是否存在
1149 Post post = em.find(Post.class, postid);
1150 if (post == null) {
1151 logger.warn("Post with ID {} does not exist", postid);
1152 return 1;
1153 }
1154
1155 // 检查评论用户是否存在
1156 User user = em.find(User.class, userid);
1157 if (user == null) {
1158 logger.warn("User with ID {} does not exist", userid);
1159 return 1;
1160 }
1161
1162 // 创建新的评论
1163 PostReply reply = new PostReply();
1164 reply.replyid = UUID.randomUUID().toString();
1165 reply.postid = postid;
1166 reply.authorid = userid;
1167 reply.content = comment;
1168 reply.createdAt = new Date();
1169
1170 // 保存评论
1171 em.persist(reply);
1172
1173 // 更新帖子的回复数
1174 post.replytime += 1;
1175 em.merge(post);
1176
1177 tx.commit();
1178
1179 logger.info("Successfully added comment by user {} to post {}, reply ID: {}",
1180 userid, postid, reply.replyid);
1181 return 0;
1182
1183 } catch (Exception e) {
1184 if (tx != null && tx.isActive()) {
1185 tx.rollback();
1186 }
1187 logger.error("Error adding comment: {}", e.getMessage());
1188 return 2;
1189 } finally {
1190 if (em != null) {
1191 em.close();
1192 }
1193 }
root0dbc9812025-05-19 04:41:57 +00001194 }
1195
1196 @Override
Raverf79fdb62025-06-03 06:02:49 +00001197 public int DeleteComment(String postid,String commentid){
TRM-coding87c24972025-06-07 14:05:29 +08001198 if (postid == null || postid.isEmpty() || commentid == null || commentid.isEmpty()) {
1199 logger.warn("Invalid parameters: postid or commentid is null or empty");
1200 return 2;
1201 }
1202
1203 EntityManager em = null;
1204 EntityTransaction tx = null;
1205
1206 try {
1207 em = emf.createEntityManager();
1208 tx = em.getTransaction();
1209 tx.begin();
1210
1211 // 检查帖子是否存在
1212 Post post = em.find(Post.class, postid);
1213 if (post == null) {
1214 logger.warn("Post with ID {} does not exist", postid);
1215 return 1;
1216 }
1217
1218 // 检查评论是否存在且属于该帖子
1219 PostReply reply = em.find(PostReply.class, commentid);
1220 if (reply == null || !reply.postid.equals(postid)) {
1221 logger.warn("Comment {} does not exist or does not belong to post {}", commentid, postid);
1222 return 1;
1223 }
1224
1225 // 删除评论
1226 em.remove(reply);
1227
1228 // 更新帖子的回复数
1229 post.replytime = Math.max(0, post.replytime - 1);
1230 em.merge(post);
1231
1232 tx.commit();
1233
1234 logger.info("Successfully deleted comment {} from post {}", commentid, postid);
1235 return 0;
1236
1237 } catch (Exception e) {
1238 if (tx != null && tx.isActive()) {
1239 tx.rollback();
1240 }
1241 logger.error("Error deleting comment: {}", e.getMessage());
1242 return 2;
1243 } finally {
1244 if (em != null) {
1245 em.close();
1246 }
1247 }
root0dbc9812025-05-19 04:41:57 +00001248 }
1249
1250 @Override
Raverf79fdb62025-06-03 06:02:49 +00001251 public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量,返回状态:0 success,1 不存在,2其他原因
root0dbc9812025-05-19 04:41:57 +00001252 {
TRM-coding87c24972025-06-07 14:05:29 +08001253 if (userid == null || userid.isEmpty() || magic <= 0) {
1254 logger.warn("参数无效: userid为空或magic <= 0");
1255 return false;
1256 }
1257
1258 EntityManager em = null;
1259 EntityTransaction tx = null;
1260
1261 try {
1262 em = emf.createEntityManager();
1263 tx = em.getTransaction();
1264 tx.begin();
1265
1266 UserPT userPT = em.find(UserPT.class, userid);
1267 if (userPT == null) {
1268 logger.warn("未找到用户 {} 的PT信息", userid);
1269 return false;
1270 }
1271
1272 if (userPT.magic < magic) {
1273 logger.warn("用户 {} 的魔力值不足", userid);
1274 return false;
1275 }
1276
1277 // 1:1兑换,直接加上魔力值(假设单位是MB)
1278 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001279 userPT.upload += magic * 10000000;
TRM-coding87c24972025-06-07 14:05:29 +08001280
1281 // 更新分享率
1282 if (userPT.download > 0) {
1283 userPT.share = (double) userPT.upload / userPT.download;
1284 }
1285
1286 em.merge(userPT);
1287 tx.commit();
1288
1289 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 上传量", userid, magic, magic);
1290 return true;
1291
1292 } catch (Exception e) {
1293 if (tx != null && tx.isActive()) {
1294 tx.rollback();
1295 }
rhje18c3f72025-06-08 00:27:01 +08001296 e.printStackTrace();
TRM-coding87c24972025-06-07 14:05:29 +08001297 logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
1298 return false;
1299 } finally {
1300 if (em != null) {
1301 em.close();
1302 }
1303 }
root0dbc9812025-05-19 04:41:57 +00001304 }
Raverf79fdb62025-06-03 06:02:49 +00001305
root0dbc9812025-05-19 04:41:57 +00001306 @Override
Raverf79fdb62025-06-03 06:02:49 +00001307 public boolean ExchangeMagicToDownload(String userid,int magic)
1308 {
TRM-coding87c24972025-06-07 14:05:29 +08001309 if (userid == null || userid.isEmpty() || magic <= 0) {
1310 logger.warn("参数无效: userid为空或magic <= 0");
1311 return false;
1312 }
1313
1314 EntityManager em = null;
1315 EntityTransaction tx = null;
1316
1317 try {
1318 em = emf.createEntityManager();
1319 tx = em.getTransaction();
1320 tx.begin();
1321
1322 UserPT userPT = em.find(UserPT.class, userid);
1323 if (userPT == null) {
1324 logger.warn("未找到用户 {} 的PT信息", userid);
1325 return false;
1326 }
1327
1328 if (userPT.magic < magic) {
1329 logger.warn("用户 {} 的魔力值不足", userid);
1330 return false;
1331 }
1332
1333 // 1:1兑换,直接减去魔力值对应的下载量(假设单位是MB)
1334 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001335 userPT.download = Math.max(0, userPT.download - magic * 10000000);
TRM-coding87c24972025-06-07 14:05:29 +08001336
1337 // 更新分享率
1338 if (userPT.download > 0) {
1339 userPT.share = (double) userPT.upload / userPT.download;
1340 }
1341
1342 em.merge(userPT);
1343 tx.commit();
1344
1345 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {}MB 下载量减免", userid, magic, magic);
1346 return true;
1347
1348 } catch (Exception e) {
1349 if (tx != null && tx.isActive()) {
1350 tx.rollback();
1351 }
1352 logger.error("魔力值兑换下载量时发生错误: {}", e.getMessage());
1353 return false;
1354 } finally {
1355 if (em != null) {
1356 em.close();
1357 }
1358 }
root0dbc9812025-05-19 04:41:57 +00001359 }//将魔力值兑换为下载量,返回状态:0 success,1 不存在,2其他原因
1360
1361 @Override
Raverf79fdb62025-06-03 06:02:49 +00001362 public boolean ExchangeMagicToVip(String userid,int magic){
TRM-coding87c24972025-06-07 14:05:29 +08001363 if (userid == null || userid.isEmpty() || magic <= 0) {
1364 logger.warn("参数无效: userid为空或magic <= 0");
1365 return false;
1366 }
1367
1368 EntityManager em = null;
1369 EntityTransaction tx = null;
1370
1371 try {
1372 em = emf.createEntityManager();
1373 tx = em.getTransaction();
1374 tx.begin();
1375
1376 UserPT userPT = em.find(UserPT.class, userid);
1377 if (userPT == null) {
1378 logger.warn("未找到用户 {} 的PT信息", userid);
1379 return false;
1380 }
1381
1382 if (userPT.magic < magic) {
1383 logger.warn("用户 {} 的魔力值不足", userid);
1384 return false;
1385 }
1386
1387 // 1:1兑换VIP下载次数
1388 userPT.magic -= magic;
rhje18c3f72025-06-08 00:27:01 +08001389 userPT.viptime += magic / 100;
TRM-coding87c24972025-06-07 14:05:29 +08001390
1391 em.merge(userPT);
1392 tx.commit();
1393
1394 logger.info("用户 {} 成功将 {} 点魔力值兑换为 {} 次VIP下载次数", userid, magic, magic);
1395 return true;
1396
1397 } catch (Exception e) {
1398 if (tx != null && tx.isActive()) {
1399 tx.rollback();
1400 }
1401 logger.error("魔力值兑换VIP下载次数时发生错误: {}", e.getMessage());
1402 return false;
1403 } finally {
1404 if (em != null) {
1405 em.close();
1406 }
1407 }
root0dbc9812025-05-19 04:41:57 +00001408 }
1409 //将魔力值兑换为VIP次数,返回状态:0 success,1 不存在,2其他原因
1410
1411 @Override
Raverf79fdb62025-06-03 06:02:49 +00001412 public boolean UploadTransmitProfile(Profile profile){
TRM-coding87c24972025-06-07 14:05:29 +08001413 if (profile == null || profile.profileurl == null || profile.profileurl.isEmpty() ||
1414 profile.userid == null || profile.userid.isEmpty()) {
1415 logger.warn("参数无效: profile为空或必要字段为空");
1416 return false;
1417 }
1418
1419 EntityManager em = null;
1420 EntityTransaction tx = null;
1421
1422 try {
1423 em = emf.createEntityManager();
1424 tx = em.getTransaction();
1425 tx.begin();
1426
1427 // 检查用户是否存在
1428 User user = em.find(User.class, profile.userid);
1429 if (user == null) {
1430 logger.warn("用户 {} 不存在", profile.userid);
1431 return false;
1432 }
1433
1434 // 检查是否已存在相同的迁移申请
1435 Profile existingProfile = em.find(Profile.class, profile.profileurl);
1436 if (existingProfile != null) {
1437 logger.warn("迁移申请 {} 已存在", profile.profileurl);
1438 return false;
1439 }
1440
1441 // 设置初始值
1442 profile.exampass = false;
1443 profile.magicgived = "0";
1444 profile.uploadgived = "0";
1445
1446 // 保存迁移申请
1447 em.persist(profile);
1448 tx.commit();
1449
1450 logger.info("成功上传迁移申请 {}", profile.profileurl);
1451 return true;
1452
1453 } catch (Exception e) {
1454 if (tx != null && tx.isActive()) {
1455 tx.rollback();
1456 }
1457 logger.error("上传迁移申请时发生错误: {}", e.getMessage());
1458 return false;
1459 } finally {
1460 if (em != null) {
1461 em.close();
1462 }
1463 }
root0dbc9812025-05-19 04:41:57 +00001464 }
1465
1466 @Override
Raverf79fdb62025-06-03 06:02:49 +00001467 public Profile GetTransmitProfile(String profileid){
TRM-coding87c24972025-06-07 14:05:29 +08001468 if (profileid == null || profileid.isEmpty()) {
1469 logger.warn("参数无效: profileid为空");
1470 return null;
1471 }
1472
1473 EntityManager em = null;
1474
1475 try {
1476 em = emf.createEntityManager();
1477 Profile profile = em.find(Profile.class, profileid);
1478 if (profile == null) {
1479 logger.warn("未找到迁移申请 {}", profileid);
1480 return null;
1481 }
1482
1483 logger.info("成功获取迁移申请 {}", profileid);
1484 return profile;
1485
1486 } catch (Exception e) {
1487 logger.error("获取迁移申请时发生错误: {}", e.getMessage());
1488 return null;
1489 } finally {
1490 if (em != null) {
1491 em.close();
1492 }
1493 }
root0dbc9812025-05-19 04:41:57 +00001494 }
1495 //获取迁移信息
Raverf79fdb62025-06-03 06:02:49 +00001496
root0dbc9812025-05-19 04:41:57 +00001497 @Override
rhj7912f2c2025-06-09 17:21:32 +08001498 public boolean ExamTransmitProfile(String profileid, boolean result, Integer grantedUpload){
TRM-coding87c24972025-06-07 14:05:29 +08001499 if (profileid == null || profileid.isEmpty()) {
1500 logger.warn("参数无效: profileid为空");
1501 return false;
1502 }
1503
1504 EntityManager em = null;
1505 EntityTransaction tx = null;
1506
1507 try {
1508 em = emf.createEntityManager();
1509 tx = em.getTransaction();
1510 tx.begin();
1511
1512 // 查找迁移申请
1513 Profile profile = em.find(Profile.class, profileid);
1514 if (profile == null) {
1515 logger.warn("未找到迁移申请 {}", profileid);
1516 return false;
1517 }
1518
1519 // 更新审核状态
1520 profile.exampass = result;
1521
1522 if (result) {
1523 // 如果审核通过,更新用户的PT信息
1524 UserPT userPT = em.find(UserPT.class, profile.userid);
1525 if (userPT != null) {
1526 // 发放魔力值
1527 int magicToGive = Integer.parseInt(profile.magictogive);
1528 userPT.magic += magicToGive;
1529 profile.magicgived = String.valueOf(magicToGive);
1530
1531 // 发放上传量
rhj7912f2c2025-06-09 17:21:32 +08001532 // long uploadToGive = Long.parseLong(profile.uploadtogive);
1533 userPT.upload += grantedUpload;
1534 profile.uploadgived = String.valueOf(grantedUpload);
TRM-coding87c24972025-06-07 14:05:29 +08001535
1536 em.merge(userPT);
rhje18c3f72025-06-08 00:27:01 +08001537 em.merge(profile);
TRM-coding87c24972025-06-07 14:05:29 +08001538 }
rhje18c3f72025-06-08 00:27:01 +08001539 } else {
1540 // 如果审核不通过,删除迁移申请
1541 em.remove(profile);
1542 logger.info("迁移申请 {} 审核不通过,已删除", profileid);
TRM-coding87c24972025-06-07 14:05:29 +08001543 }
TRM-coding87c24972025-06-07 14:05:29 +08001544 tx.commit();
1545
1546 logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
1547 return true;
1548
1549 } catch (Exception e) {
1550 if (tx != null && tx.isActive()) {
1551 tx.rollback();
1552 }
1553 logger.error("审核迁移申请时发生错误: {}", e.getMessage());
1554 return false;
1555 } finally {
1556 if (em != null) {
1557 em.close();
1558 }
1559 }
root0dbc9812025-05-19 04:41:57 +00001560 }
1561 //审核迁移信息,0成功,1失败
1562 @Override
Raverf79fdb62025-06-03 06:02:49 +00001563 public Profile[] GetTransmitProfileList(){
TRM-coding87c24972025-06-07 14:05:29 +08001564 EntityManager em = null;
1565
1566 try {
1567 em = emf.createEntityManager();
1568
1569 // 获取所有迁移申请
1570 QProfile p = QProfile.profile;
1571 List<Profile> profiles = new JPAQuery<>(em)
1572 .select(p)
1573 .from(p)
1574 .fetch();
1575
1576 logger.info("成功获取所有迁移申请,共 {} 条", profiles.size());
1577 return profiles.toArray(new Profile[0]);
1578
1579 } catch (Exception e) {
1580 logger.error("获取迁移申请列表时发生错误: {}", e.getMessage());
1581 return new Profile[0];
1582 } finally {
1583 if (em != null) {
1584 em.close();
1585 }
1586 }
root0dbc9812025-05-19 04:41:57 +00001587 }
1588 //获取所有迁移信息
1589
rhj46f62c42025-06-06 23:24:10 +08001590 @Override
1591 public Post[] GetPostList() {
rhj5ebd93c2025-06-07 15:57:28 +08001592 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001593 try{
1594 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1595 QPost p = QPost.post;
1596 List<Post> posts = query.select(p).from(p).fetch();
1597 return posts.toArray(new Post[0]);
1598 } catch (Exception e) {
1599 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1600 return new Post[0];
1601 } finally {
1602 entitymanager.close();
1603 logger.info("Post list retrieved successfully.");
1604 }
rhj46f62c42025-06-06 23:24:10 +08001605 }
1606
rhj5b69b7e2025-06-07 01:28:08 +08001607 @Override
1608 public Post GetPost(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001609 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001610 try {
1611 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1612 QPost p = QPost.post;
1613 Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
1614 return post;
1615 } catch (Exception e) {
1616 logger.error("获取帖子列表时发生错误: {}", e.getMessage());
1617 return new Post();
1618 } finally {
1619 entitymanager.close();
1620 logger.info("Post list retrieved successfully.");
1621 }
rhj5b69b7e2025-06-07 01:28:08 +08001622 }
1623
1624 @Override
1625 public PostReply[] GetPostReplyList(String postid) {
rhj5ebd93c2025-06-07 15:57:28 +08001626 EntityManager entitymanager = createEntityManager();
rhj5b69b7e2025-06-07 01:28:08 +08001627 JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
1628 QPostReply p = QPostReply.postReply;
1629 List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
1630 return replies.toArray(new PostReply[0]);
1631 }
rhj5ebd93c2025-06-07 15:57:28 +08001632
1633 @Override
1634 public Post[] SearchPost(String postQ) {
1635 EntityManager entitymanager = createEntityManager();
rhje18c3f72025-06-08 00:27:01 +08001636 try {
1637 JPAQuery<Post> query = new JPAQuery<>(entitymanager);
1638 QPost p = QPost.post;
1639 List<Post> posts = query.select(p).from(p).fetch();
rhj5ebd93c2025-06-07 15:57:28 +08001640
rhje18c3f72025-06-08 00:27:01 +08001641 if (posts == null || postQ == null || postQ.trim().isEmpty()) {
1642 return posts.toArray(new Post[0]);
1643 }
1644
1645 String processedQuery = postQ.toLowerCase().trim();
1646 Map<Post, Integer> postCountMap = new HashMap<>();
1647 for(Post post : posts){
1648 String title = post.posttitle.toLowerCase().trim();
1649 int count = countCommonCharacter(processedQuery, title);
1650 postCountMap.put(post, count);
1651 }
1652 posts.sort((s1, s2) -> {
1653 int count1 = postCountMap.getOrDefault(s1, 0);
1654 int count2 = postCountMap.getOrDefault(s2, 0);
1655 return Integer.compare(count2, count1);
1656 });
1657
rhj5ebd93c2025-06-07 15:57:28 +08001658 return posts.toArray(new Post[0]);
rhje18c3f72025-06-08 00:27:01 +08001659 } catch (Exception e) {
1660 logger.error("搜索帖子时发生错误: {}", e.getMessage());
1661 return new Post[0];
1662 } finally {
1663 entitymanager.close();
1664 logger.info("Post search completed successfully.");
rhj5ebd93c2025-06-07 15:57:28 +08001665 }
rhj5ebd93c2025-06-07 15:57:28 +08001666 }
Raverf79fdb62025-06-03 06:02:49 +00001667
rhje18c3f72025-06-08 00:27:01 +08001668 @Override
1669 public int CheckAdmin(String userid) {
1670 if (userid == null || userid.isEmpty()) {
1671 logger.warn("参数无效: userid为空");
1672 return 2; // 参数无效
1673 }
1674
1675 EntityManager entitymanager = createEntityManager();
1676 JPAQuery<String> query = new JPAQuery<>(entitymanager);
1677 QAdmin a = QAdmin.admin;
1678 String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
1679 if (adminId == null) {
1680 logger.warn("用户 {} 不是管理员", userid);
1681 return 1; // 用户不是管理员
1682 } else {
1683 logger.info("用户 {} 是管理员", userid);
1684 return 0; // 用户是管理员
1685 }
1686 }
1687
1688 @Override
1689 public int InviteNewUser(String inviterid, String invitedemail) {
1690 EntityManager entitymanager = createEntityManager();
1691 try {
1692 User user = entitymanager.find(User.class, inviterid);
1693 if (user == null) {
1694 return 3;
1695 }
1696 if (user.invitetimes <= 0) {
1697 return 1;
1698 }
1699 user.invitetimes -= 1;
1700
1701 UserInvite invite = new UserInvite();
1702 invite.userId = inviterid;
1703 invite.inviterEmail = invitedemail;
1704 invite.inviterRegistered = false;
1705 invite.user = user;
1706
1707 entitymanager.getTransaction().begin();
1708 entitymanager.merge(user);
1709 entitymanager.persist(invite);
1710 entitymanager.getTransaction().commit();
1711 return 0;
1712 } catch (Exception e) {
1713 e.printStackTrace();
1714 if (entitymanager.getTransaction().isActive()) {
1715 entitymanager.getTransaction().rollback();
1716 }
1717 return 2;
1718 }
1719 }
1720
1721 @Override
1722 public UserStar[] GetUserStarList(String userid) {
1723 if (userid == null || userid.isEmpty()) {
1724 logger.warn("参数无效: userid为空");
1725 return new UserStar[0];
1726 }
1727
1728 EntityManager entitymanager = createEntityManager();
1729 try {
1730 JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
1731 QUserStar us = QUserStar.userStar;
1732 List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
1733 return stars.toArray(new UserStar[0]);
1734 } catch (Exception e) {
1735 e.printStackTrace();
1736 if (entitymanager.getTransaction().isActive()) {
1737 entitymanager.getTransaction().rollback();
1738 }
1739 return new UserStar[0];
1740 } finally {
1741 if (entitymanager != null) {
1742 entitymanager.close();
1743 }
1744 }
1745 }
1746
1747 @Override
rhj7912f2c2025-06-09 17:21:32 +08001748 public int UploadMigration(String userid, File file, String uploadtogive) {
rhje18c3f72025-06-08 00:27:01 +08001749 if (userid == null || userid.isEmpty() || file == null) {
1750 return 2; // 参数无效
1751 }
1752
1753 EntityManager entitymanager = createEntityManager();
1754
1755 try {
1756 // 检查用户是否存在
1757 User user = entitymanager.find(User.class, userid);
1758 if (user == null) {
1759 return 1; // 用户不存在
1760 }
1761
1762 // 创建迁移记录
1763 Profile migration = new Profile();
1764 migration.profileurl = java.util.UUID.randomUUID().toString();
1765 migration.userid = userid;
rhj7912f2c2025-06-09 17:21:32 +08001766 migration.uploadtogive = uploadtogive; // 初始上传量为0
rhje18c3f72025-06-08 00:27:01 +08001767 migration.magictogive = "0"; // 初始魔力值为0
1768 migration.downloadgived = "0"; // 初始下载量为0
1769 migration.uploadgived = "0"; // 初始上传量为0
1770 migration.magicgived = "0"; // 初始魔力值为0
1771 migration.downloadgived = "0"; // 初始下载量为0
1772 migration.exampass = false; // 初始审核状态为未通过
1773 migration.user = user;
1774 Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
1775 if (!Files.exists(storageDir)) {
1776 Files.createDirectories(storageDir);
1777 }
1778 String filename = file.getName();
1779 Path target = storageDir.resolve(migration.profileurl + "_" + filename);
1780 Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
1781 migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
1782
1783 entitymanager.getTransaction().begin();
1784 entitymanager.persist(migration);
1785 entitymanager.getTransaction().commit();
1786
1787 return 0; // 成功
1788
1789 } catch (Exception e) {
1790 if (entitymanager.getTransaction().isActive()) {
1791 entitymanager.getTransaction().rollback();
1792 }
1793 e.printStackTrace();
1794 return 2; // 其他错误
1795 } finally {
1796 if (entitymanager != null) {
1797 entitymanager.close();
1798 }
1799 }
1800 }
1801
1802 @Override
1803 public BegSeedDetail[] GetBegList() {
1804 EntityManager entitymanager = createEntityManager();
1805 try {
1806 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1807 QBegInfo b = QBegInfo.begInfo;
1808 List<BegInfo> begList = query.select(b).from(b).fetch();
1809
1810 List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
1811 for (BegInfo begInfo : begList) {
1812 // 查询对应的BegInfo表的Info字段
1813 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1814 // 构造BegSeedDetail对象
1815 BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
1816 begSeedDetailList.add(begSeedDetail);
1817 }
1818
1819 return begSeedDetailList.toArray(new BegSeedDetail[0]);
1820 } catch (Exception e) {
1821 if (entitymanager.getTransaction().isActive()) {
1822 entitymanager.getTransaction().rollback();
1823 }
1824 e.printStackTrace();
1825 return new BegSeedDetail[0];
1826 } finally {
1827 if(entitymanager != null){
1828 entitymanager.close();
1829 }
1830 }
1831 }
1832
1833 @Override
1834 public BegInfo GetBegDetail(String begid) {
1835 EntityManager entitymanager = createEntityManager();
1836 try {
1837 JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
1838 QBegInfo b = QBegInfo.begInfo;
1839 BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1840 return begDetail;
1841 } catch (Exception e) {
1842 if (entitymanager.getTransaction().isActive()) {
1843 entitymanager.getTransaction().rollback();
1844 }
1845 e.printStackTrace();
1846 return null;
1847 } finally {
1848 if(entitymanager != null){
1849 entitymanager.close();
1850 }
1851 }
1852 }
1853
1854 @Override
1855 public BegSeedDetail GetBegSeedDetail(String begid) {
1856 if (begid == null || begid.isEmpty()) {
1857 return null;
1858 }
1859
1860 EntityManager entitymanager = createEntityManager();
1861 try {
1862 // 查询 BegSeed 表数据
1863 JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
1864 QBegInfo b = QBegInfo.begInfo;
1865 BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
1866
1867 if (begInfo == null) {
1868 return null;
1869 }
1870
1871 // 查询 BegInfo 表的 Info 字段
1872 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1873
1874 // 构造返回对象
1875 return new BegSeedDetail(begInfo, begInfoDetail);
1876 } catch (Exception e) {
1877 if (entitymanager.getTransaction().isActive()) {
1878 entitymanager.getTransaction().rollback();
1879 }
1880 e.printStackTrace();
1881 return null;
1882 } finally {
1883 if(entitymanager != null){
1884 entitymanager.close();
1885 }
1886 }
1887 }
1888
1889 @Override
1890 public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
1891 if (begid == null || begid.isEmpty()) {
1892 return new SeedWithVotes[0];
1893 }
1894
1895 EntityManager entitymanager = createEntityManager();
1896 try {
1897 JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
1898 QSubmitSeed ss = QSubmitSeed.submitSeed;
1899 QSeed s = QSeed.seed;
1900
1901 List<Tuple> results = query.select(s, ss.votes)
1902 .from(ss)
1903 .join(ss.seed, s)
1904 .where(ss.begInfo.begid.eq(begid))
1905 .fetch();
1906
1907 List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
1908 for (Tuple result : results) {
1909 Seed seed = result.get(s);
1910 Integer votes = result.get(ss.votes);
1911 seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
1912 }
1913
1914 return seedsWithVotes.toArray(new SeedWithVotes[0]);
1915 } catch (Exception e) {
1916 return new SeedWithVotes[0];
1917 } finally {
1918 entitymanager.close();
1919 }
1920 }
1921
1922 @Override
1923 public int SubmitBegSeed(String begid, String seedid, String userid) {
1924 if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
1925 return 2; // 参数无效
1926 }
1927
1928 EntityManager entitymanager = createEntityManager();
1929 EntityTransaction tx = entitymanager.getTransaction();
1930
1931 try {
1932 tx.begin();
1933
1934 // 检查种子信息是否存在
1935 Seed seed = entitymanager.find(Seed.class, seedid);
1936 if (seed == null || !seed.seeduserid.equals(userid)) {
1937 return 1;
1938 }
1939
1940 // int ret = SubmitSeed(begid, seed);
1941 BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
1942 if (begInfo == null) {
1943 return 2;
1944 }
1945
1946 // 检查种子是否已提交过
1947 QSubmitSeed ss = QSubmitSeed.submitSeed;
1948 SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
1949 .select(ss)
1950 .from(ss)
1951 .where(ss.begInfo.begid.eq(begid))
1952 .where(ss.seed.seedid.eq(seed.seedid))
1953 .fetchOne();
1954
1955 submitSeed = new SubmitSeed();
rhj7125df42025-06-09 01:06:01 +08001956 // 设置复合主键
1957 submitSeed.id = new SubmitSeedId(begid, seed.seedid);
1958
rhje18c3f72025-06-08 00:27:01 +08001959 submitSeed.begInfo = begInfo;
1960 submitSeed.seed = seed;
1961 submitSeed.votes = 0; // 初始投票数为0
1962 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
1963 if (begInfoDetail == null) {
1964 return 1;
1965 }
1966
rhje18c3f72025-06-08 00:27:01 +08001967 entitymanager.persist(submitSeed);
rhj7125df42025-06-09 01:06:01 +08001968 tx.commit();
rhje18c3f72025-06-08 00:27:01 +08001969
rhje18c3f72025-06-08 00:27:01 +08001970 return 0;
1971
1972 } catch (Exception e) {
rhj7125df42025-06-09 01:06:01 +08001973 e.printStackTrace();
rhje18c3f72025-06-08 00:27:01 +08001974 if (tx.isActive()) {
1975 tx.rollback();
1976 }
1977 return 3; // 其他错误
1978 } finally {
1979 if (entitymanager != null) {
1980 entitymanager.close();
1981 }
1982 }
1983 }
1984
1985 @Override
1986 public int createBagSeed(BegInfo begInfo, String userid, String info) {
1987 if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
1988 return 2; // 参数无效
1989 }
1990
1991 EntityManager entitymanager = createEntityManager();
1992 try {
1993 BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
1994 if (begInfoDetail != null) {
1995 return 1; // 已存在
1996 }
1997
1998 User user = entitymanager.find(User.class, userid);
1999 if (user == null) {
2000 return 2; // 用户不存在
2001 }
2002
2003 UserPT userPT = entitymanager.find(UserPT.class, userid);
2004 if (userPT == null) {
2005 return 2; // 用户PT信息不存在
2006 }
2007
2008 if (userPT.magic < begInfo.magic) {
2009 return 3; // 魔力值不足
2010 }
2011
2012 begInfoDetail = new BegInfoDetail();
2013 begInfoDetail.begId = begInfo.begid;
2014 begInfoDetail.info = info;
2015 begInfoDetail.userId = userid;
2016 begInfoDetail.user = user;
2017 userPT.magic -= begInfo.magic; // 扣除魔力值
2018
2019 entitymanager.getTransaction().begin();
2020 entitymanager.persist(userPT);
2021 entitymanager.persist(begInfo);
2022 entitymanager.persist(begInfoDetail);
2023 entitymanager.getTransaction().commit();
2024
2025 return 0;
2026 } catch (Exception e) {
2027 if (entitymanager.getTransaction().isActive()) {
2028 entitymanager.getTransaction().rollback();
2029 }
2030 e.printStackTrace();
2031 return 2; // 其他错误
2032 } finally {
2033 if (entitymanager != null) {
2034 entitymanager.close();
2035 }
2036 }
2037 }
rhj7912f2c2025-06-09 17:21:32 +08002038
2039 @Override
2040 public Seed[] getAllSeeds() {
2041 EntityManager entitymanager = createEntityManager();
2042 try {
2043 JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
2044 QSeed s = QSeed.seed;
2045 List<Seed> seeds = query.select(s).from(s).fetch();
2046 return seeds.toArray(new Seed[0]);
2047 } catch (Exception e) {
2048 e.printStackTrace();
2049 if (entitymanager.getTransaction().isActive()) {
2050 entitymanager.getTransaction().rollback();
2051 }
2052 return new Seed[0];
2053 } finally {
2054 if (entitymanager != null) {
2055 entitymanager.close();
2056 }
2057 }
2058 }
2059
2060 @Override
2061 public SeedPromotion[] getAllSeedPromotions() {
2062 EntityManager entitymanager = createEntityManager();
2063 try {
2064 JPAQuery<SeedPromotion> query = new JPAQuery<>(entitymanager);
2065 QSeedPromotion sp = QSeedPromotion.seedPromotion;
2066 List<SeedPromotion> promotions = query.select(sp).from(sp).fetch();
2067 return promotions.toArray(new SeedPromotion[0]);
2068 } catch (Exception e) {
2069 e.printStackTrace();
2070 if (entitymanager.getTransaction().isActive()) {
2071 entitymanager.getTransaction().rollback();
2072 }
2073 return new SeedPromotion[0];
2074 } finally {
2075 if (entitymanager != null) {
2076 entitymanager.close();
2077 }
2078 }
2079 }
2080
2081 @Override
2082 public int createSeedPromotion(String seedid, Date startTime, Date endTime, Integer discount) {
2083 if (seedid == null || seedid.isEmpty() || startTime == null || endTime == null || discount == null) {
2084 return 2; // 参数无效
2085 }
2086
2087 EntityManager entitymanager = createEntityManager();
2088 EntityTransaction tx = entitymanager.getTransaction();
2089
2090 try {
2091 tx.begin();
2092
2093 // 检查种子是否存在
2094 Seed seed = entitymanager.find(Seed.class, seedid);
2095 if (seed == null) {
2096 return 1; // 种子不存在
2097 }
2098
2099 // 检查是否已存在相同的促销活动
2100 QSeedPromotion sp = QSeedPromotion.seedPromotion;
2101 SeedPromotion existingPromotion = new JPAQuery<>(entitymanager)
2102 .select(sp)
2103 .from(sp)
2104 .where(sp.seed.seedid.eq(seedid))
2105 .fetchOne();
2106
2107 // 创建新的促销活动
2108 SeedPromotion promotion = new SeedPromotion();
2109 promotion.promotionId = java.util.UUID.randomUUID().toString();
2110 promotion.seed = seed;
2111 promotion.startTime = startTime;
2112 promotion.endTime = endTime;
2113 promotion.discount = discount;
2114
2115 if (existingPromotion != null) {
2116 promotion.promotionId = existingPromotion.promotionId; // 如果已存在,则使用现有的ID
2117 entitymanager.merge(promotion); // 更新现有的促销活动
2118 } else {
2119 entitymanager.persist(promotion); // 创建新的促销活动
2120 }
2121
2122 tx.commit();
2123 return 0; // 成功
2124
2125 } catch (Exception e) {
2126 e.printStackTrace();
2127 if (tx.isActive()) {
2128 tx.rollback();
2129 }
2130 return 4; // 其他错误
2131 } finally {
2132 if (entitymanager != null) {
2133 entitymanager.close();
2134 }
2135 }
2136 }
rhje18c3f72025-06-08 00:27:01 +08002137}