2025-02-27 21:35:01 +08:00

143 lines
5.2 KiB
Java

package com.example.system.controller;
import com.example.system.model.ArticleTable;
import com.example.system.model.UserTable;
import com.example.system.repository.ArticleRepository;
import com.example.system.repository.RegistrationRepository;
import com.example.system.advice.SmsBaoConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.RowSet;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Optional;
import org.springframework.web.bind.annotation.CrossOrigin;
@CrossOrigin
@RestController
public class PhoneSendCodeController {
@Autowired
private SmsBaoConfig smsBaoConfig;
@Autowired
private RegistrationRepository registrationRepository;
@Autowired
private ArticleRepository articleRepository;
// 发送文章简介给参赛者
@PostMapping("/api/sendsms")
public ResponseEntity<String> sendArticleBriefToParticipants(@RequestParam Long competitionId, @RequestParam Integer articleId) {
// // 根据文章ID查找文章
Optional<ArticleTable> articleOpt = articleRepository.findById(articleId);
if (articleOpt.isEmpty()) {
return new ResponseEntity<>("未找到公告", HttpStatus.NOT_FOUND);
}
ArticleTable article = articleOpt.get();
// 根据竞赛ID查找参赛者
List<String> phone = registrationRepository.findByCompetitionId(competitionId);
if (phone.isEmpty()) {
return new ResponseEntity<>("未找到参加比赛的用户", HttpStatus.NOT_FOUND);
}
// 获取文章简介内容
String briefContent = article.getBriefContent();
String ArticleTitle = article.getArticleTitle();
// 遍历参赛者并发送短信
for (String i : phone) {
if (i != null && !i.isEmpty()) {
boolean sendStatus = sendSms(i, "【计算机社团】您参加的 ["+ArticleTitle+"] 比赛有新的公告内容:\n" + briefContent +"\n请前往管理平台查看。");
if (!sendStatus) {
System.out.println("Failed to send SMS to: " + i);
}
}
}
return new ResponseEntity<>("短信发送成功", HttpStatus.OK);
}
// 发送短信
private boolean sendSms(String phone, String content) {
try {
String username = smsBaoConfig.getUsername();
String password = smsBaoConfig.getPassword();
String encodedContent = encodeUrlString(content, "UTF-8");
String smsBaoUrl = "http://api.smsbao.com/sms";
String httpArg = "u=" + username + "&p=" + md5(password) + "&m=" + phone + "&c=" + encodedContent;
String result = request(smsBaoUrl, httpArg);
return "0".equals(result);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 发起 HTTP 请求
private String request(String smsBaoUrl, String httpArg) {
StringBuilder result = new StringBuilder();
smsBaoUrl = smsBaoUrl + "?" + httpArg;
try {
URL url = new URL(smsBaoUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead;
while ((strRead = reader.readLine()) != null) {
result.append(strRead);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
// 计算 MD5 值
private String md5(String password) {
StringBuilder buf = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] b = md.digest();
for (byte value : b) {
int i = value;
if (i < 0) i += 256;
if (i < 16) buf.append("0");
buf.append(Integer.toHexString(i));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return buf.toString();
}
// 对字符串进行 URL 编码
private String encodeUrlString(String content, String charset) {
String strret = null;
if (content == null) return content;
try {
strret = java.net.URLEncoder.encode(content, charset);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return strret;
}
}