1
zj
2025-04-17 ff2d1f5acdadc466d7e199028ef385ae8ca277e7
1
4 files modified
288 ■■■■■ changed files
.idea/inspectionProfiles/Project_Default.xml 1 ●●●● patch | view | raw | blame | history
src/main/java/email/internal/InternalEmailSenderServiceImpl.java 109 ●●●●● patch | view | raw | blame | history
src/main/java/project/web/api/LocalUserController.java 177 ●●●●● patch | view | raw | blame | history
src/main/java/project/web/api/WalletController.java 1 ●●●● patch | view | raw | blame | history
.idea/inspectionProfiles/Project_Default.xml
@@ -2,6 +2,7 @@
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" />
    <inspection_tool class="AliDeprecation" enabled="true" level="WARNING" enabled_by_default="true" />
    <inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="true" level="WARNING" enabled_by_default="true" />
    <inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="true" level="WARNING" enabled_by_default="true" />
    <inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="true" level="WARNING" enabled_by_default="true" />
src/main/java/email/internal/InternalEmailSenderServiceImpl.java
@@ -1,33 +1,30 @@
package email.internal;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.sun.mail.util.MailSSLSocketFactory;
import email.EmailPropertiesUtil;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import email.sender.EmailMessage;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import kernel.util.StringUtils;
import javax.net.ssl.*;
import java.security.cert.X509Certificate;
public class InternalEmailSenderServiceImpl implements InternalEmailSenderService, InitializingBean {
    private JavaMailSenderImpl mailSender;
    private static final Logger logger = LoggerFactory.getLogger(InternalEmailSenderServiceImpl.class);
@@ -64,45 +61,65 @@
        freeMarkerConfigurer.setFreemarkerSettings(settings);
    }
    private static final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)  // 设置连接超时
            .readTimeout(30, java.util.concurrent.TimeUnit.SECONDS)     // 设置读取超时
            .writeTimeout(30, java.util.concurrent.TimeUnit.SECONDS)    // 设置写入超时
            .build();
    private static final String API_URL = "https://www.aoksend.com/index/api/send_email";
    private static final String APP_KEY = "d30ca7063ad44bd832bc934ff94a443b";  // 从环境变量或配置文件中获取
    @Override
    public void send(EmailMessage emailMessage) {
        try {
            logger.info("-----进到邮件发送-----");
            MimeMessage mailMsg = this.mailSender.createMimeMessage();
            logger.info("----------邮件发送,接收邮箱:"+emailMessage.getTomail()+"发送邮箱:"+this.mailMessage.getFrom());
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMsg, true, "UTF-8");
            messageHelper.setTo(emailMessage.getTomail());// 接收邮箱
            messageHelper.setFrom(this.mailMessage.getFrom());// 发送邮箱
            messageHelper.setSentDate(new Date());// 发送时间
            messageHelper.setSubject(emailMessage.getSubject());// 邮件标题
            if (StringUtils.isNullOrEmpty(emailMessage.getFtlname())) {
                messageHelper.setText(emailMessage.getContent());// 邮件内容
            } else {
                messageHelper.setText(this.getMailText(emailMessage.getFtlname(), emailMessage.getMap()), true);// 邮件内容
            }
            logger.info("-----1111111-----");
            // true 表示启动HTML格式的邮件
            if (emailMessage.getFile() != null) {
                // 添加邮件附件
                FileSystemResource rarfile = new FileSystemResource(emailMessage.getFile());
                // addAttachment addInline 两种附件添加方式
                // 以附件的形式添加到邮件
                // 使用MimeUtility.encodeWord 解决附件名中文乱码的问题
                messageHelper.addAttachment(MimeUtility.encodeWord(emailMessage.getFilename()), rarfile);
            }
            logger.info("-----邮件开始发送-----开始");
            this.mailSender.send(mailMsg);// 发送
            logger.info("-----邮件开始发送-----成功");
        } catch (MessagingException e) {
            logger.error("邮件发送失败【MessagingException】"+e.getMessage(), e);
        } catch (UnsupportedEncodingException e) {
            logger.error("邮件发送失败【UnsupportedEncodingException】"+e.getMessage(), e);
        }catch (Exception e){
            logger.error("邮件发送失败【Exception】"+"邮件发送失败"+e.getMessage(), e);
        // 验证邮件信息数据的有效性
        if (emailMessage == null || emailMessage.getTomail() == null || emailMessage.getContent() == null) {
            logger.error("无效的邮件信息数据。");
            return;
        }
        try {
            logger.info("----- 开始发送邮件 -----");
            logger.info("发送邮件到: " + emailMessage.getTomail() + ", 来自: " + emailMessage.getContent());
            // 使用 URL 构建器构建带有查询参数的 URL
            HttpUrl.Builder urlBuilder = HttpUrl.parse(API_URL).newBuilder();
            urlBuilder.addQueryParameter("app_key", APP_KEY);
            urlBuilder.addQueryParameter("template_id", "E_117228484621");
            urlBuilder.addQueryParameter("to", emailMessage.getTomail());
            // 将邮件内容以 JSON 形式传递
            String json = "{\"code\":\"" + emailMessage.getContent() + "\"}";
            urlBuilder.addQueryParameter("data", json);  // 确保正确编码
            // 构建请求体,使用 POST 方法
            RequestBody body = RequestBody.create(
                    json, MediaType.parse("application/json; charset=utf-8")
            );
            // 构建 POST 请求
            Request request = new Request.Builder()
                    .url(urlBuilder.build())
                    .post(body)  // 使用 POST 方法,并传递请求体
                    .addHeader("app_key", APP_KEY)
                    .build();
            // 执行请求
            try (Response response = client.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    logger.error("邮件发送失败。HTTP 响应码: " + response.code());
                    return;
                }
                logger.info("----- 邮件发送成功 -----");
                // 可选:记录响应体的内容(如果需要)
                logger.debug("响应内容: " + response.body().string());
            }
        } catch (IOException e) {
            logger.error("邮件发送失败【IOException】", e);
        } catch (Exception e) {
            logger.error("邮件发送失败【Exception】", e);
        }
    }
    /**
src/main/java/project/web/api/LocalUserController.java
@@ -392,22 +392,25 @@
        String password = request.getParameter("password").replace(" ", "");
        String re_password = request.getParameter("re_password").replace(" ", "");
        String usercode = request.getParameter("usercode");
        String phone = request.getParameter("phone");
        String verifcode = request.getParameter("verifcode");
        // 注册类型:1/手机;2/邮箱;3/用户名;
        String type = request.getParameter("type");
        // 资金密码选填,不填默认 000000
        String safeword = request.getParameter("safeword").replace(" ", "");
        String re_safeword = request.getParameter("re_safeword").replace(" ", "");
        ResultObject resultObject = new ResultObject();
        boolean lock = false;
        try {
            if (!LockFilter.add(username)) {
                throw new BusinessException("重复提交");
            }
            lock = true;
            if (StringUtils.isEmptyString(username)) {
                throw new BusinessException("用户名不能为空");
            }
@@ -427,46 +430,65 @@
            if (!password.equals(re_password)) {
                throw new BusinessException("两次输入的密码不相同");
            }
            if (StringUtils.isEmptyString(safeword)) {
                safeword = "000000";
            }
            if (StringUtils.isEmptyString(re_safeword)) {
                re_safeword = "000000";
            }
            if (safeword.length() != 6 || !Strings.isNumber(safeword)) {
                throw new BusinessException("资金密码不符合设定");
            }
            if (!safeword.equals(re_safeword)) {
                throw new BusinessException("两次输入的资金密码不相同");
            }
            if (StringUtils.isEmptyString(type) || !Arrays.asList("1", "2", "3").contains(type)) {
                throw new BusinessException("类型不能为空");
            }
            // 手机
            if ("1".equals(type)) {
                if(!isValidPhone(username)) {
                    throw new BusinessException("not a valid Phone!");
                }
            }
            // 邮箱
            if ("2".equals(type)) {
                if(!isValidEmail(username)) {
                    throw new BusinessException("not a valid Email!");
                }
            }
            // 用户名
            if ("3".equals(type)) {
                if(!isValidUsername(username)) {
                    throw new BusinessException("not a valid username!");
                }
            }
            String ip = this.getIp();
            if (!IpUtil.isCorrectIpRegular(ip)) {
                logger.error("校验IP不合法,参数{}", ip);
                throw new BusinessException("校验IP不合法");
            }
            ResultObject resultObject1 = save_email(username, verifcode);
            if(resultObject1.getCode().equals("1")){
                return resultObject1;
            }
            LocalNormalReg reg = new LocalNormalReg();
            reg.setUsername(username);
            reg.setPassword(password);
            reg.setSafeword("000000");
            reg.setSafeword(safeword);
            reg.setReco_usercode(usercode);
            SecUser  secUser = this.secUserService.findUserByLoginName(username);
            this.localUserService.saveRegisterNoVerifcode(reg, type);
            SecUser secUser = this.secUserService.findUserByLoginName(username);
            project.log.Log log = new project.log.Log();
            log.setCategory(Constants.LOG_CATEGORY_SECURITY);
            log.setLog("用户注册,ip[" + this.getIp(getRequest()) + "]");
@@ -474,23 +496,22 @@
            log.setUsername(username);
            this.logService.saveAsyn(log);
            // 注册完直接登录返回token
            String token = this.tokenService.savePut(secUser.getPartyId(),secUser.getUsername());
            this.userService.online(secUser.getPartyId());
            this.ipMenuService.saveIpMenuWhite(this.getIp());
            Party party = this.partyService.cachePartyBy(secUser.getPartyId(), true);
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("token", token);
            data.put("username", secUser.getUsername());
            data.put("usercode", party.getUsercode());
            party.setLogin_ip(this.getIp(getRequest()));
            this.partyService.update(party);
            ThreadUtils.sleep(500);
            resultObject.setData(data);
@@ -507,10 +528,49 @@
                LockFilter.remove(username);
            }
        }
        return resultObject;
    }
    public ResultObject save_email(String email ,String verifcode) {
        ResultObject resultObject = new ResultObject();
        try {
            if (StringUtils.isEmptyString(email) || !Strings.isEmail(email)) {
                throw new BusinessException("请填写正确的邮箱地址");
            }
            Party partyEmail = this.partyService.findPartyByVerifiedEmail(email);
            if (null != partyEmail) {
                throw new BusinessException("邮箱已绑定其他用户");
            }
            String authcode = this.identifyingCodeTimeWindowService.getAuthCode(email);
            if (StringUtils.isEmptyString(verifcode)) {
                throw new BusinessException("请填写正确的验证码");
            }
            if ((null == authcode) || (!authcode.equals(verifcode))) {
                resultObject.setCode("1");
                resultObject.setMsg("验证码不正确");
                return resultObject;
            }
        } catch (BusinessException e) {
            resultObject.setCode("1");
            resultObject.setMsg(e.getMessage());
        } catch (Throwable t) {
            resultObject.setCode("1");
            resultObject.setMsg("邮箱验证程序错误");
            logger.error("error:", t);
        }
        return resultObject;
    }
    /**
     * 体验用户注册
     */
@@ -631,6 +691,7 @@
        String password = request.getParameter("password").replace(" ", "");
        String re_password = request.getParameter("re_password").replace(" ", "");
        String usercode = request.getParameter("usercode");
        String verifcode = request.getParameter("verifcode");
        // 注册类型:1/手机;2/邮箱;3/用户名;
        String type = request.getParameter("type");
        // 资金密码选填,不填默认 000000
@@ -713,7 +774,10 @@
                logger.error("校验IP不合法,参数{}", ip);
                throw new BusinessException("校验IP不合法");
            }
            ResultObject resultObject1 = save_email(username, verifcode);
            if(resultObject1.getCode().equals(1)){
                return resultObject1;
            }
            LocalNormalReg reg = new LocalNormalReg();
            reg.setUsername(username);
            reg.setPassword(password);            
@@ -958,10 +1022,10 @@
        String verifcode = request.getParameter("verifcode");
        ResultObject resultObject = new ResultObject();
        resultObject = this.readSecurityContextFromSession(resultObject);
        if (!"0".equals(resultObject.getCode())) {
            return resultObject;
        }
//        resultObject = this.readSecurityContextFromSession(resultObject);
//        if (!"0".equals(resultObject.getCode())) {
//            return resultObject;
//        }
        try {
            
@@ -969,15 +1033,15 @@
                throw new BusinessException("请填写正确的邮箱地址");
            }
            String loginPartyId = this.getLoginPartyId();
            Party party = this.partyService.cachePartyBy(loginPartyId, false);
            if (null != party.getEmail() && party.getEmail().equals(email) && true == party.getEmail_authority()) {
                throw new BusinessException("邮箱已绑定");
            }
//            String loginPartyId = this.getLoginPartyId();
//            Party party = this.partyService.cachePartyBy(loginPartyId, false);
//
//            if (null != party.getEmail() && party.getEmail().equals(email) && true == party.getEmail_authority()) {
//                throw new BusinessException("邮箱已绑定");
//            }
            
            Party partyEmail = this.partyService.findPartyByVerifiedEmail(email);
            if (null != partyEmail && !partyEmail.getId().toString().equals(loginPartyId)) {
            if (null != partyEmail) {
                throw new BusinessException("邮箱已绑定其他用户");
            }
            
@@ -986,41 +1050,18 @@
            String bind_phone_email_ver = sysparaService.find("bind_phone_email_ver").getValue();
            // 如果是演示用户,则不判断验证码
            if (!"GUEST".contentEquals(party.getRolename())) {
                if ("1".contentEquals(bind_phone_email_ver)) {
                    if (StringUtils.isEmptyString(verifcode)) {
                        throw new BusinessException("请填写正确的验证码");
                    }
                    if ((null == authcode) || (!authcode.equals(verifcode))) {
                        resultObject.setCode("1");
                        resultObject.setMsg("验证码不正确");
                        return resultObject;
                    }
            if ("1".contentEquals(bind_phone_email_ver)) {
                if (StringUtils.isEmptyString(verifcode)) {
                    throw new BusinessException("请填写正确的验证码");
                }
                if ((null == authcode) || (!authcode.equals(verifcode))) {
                    resultObject.setCode("1");
                    resultObject.setMsg("验证码不正确");
                    return resultObject;
                }
            }
            // 邮箱绑定成功
            party.setEmail(email);
            party.setEmail_authority(true);
            // 获取用户系统等级:1/新注册;2/邮箱谷歌手机其中有一个已验证;3/用户实名认证; 4/用户高级认证;
            int userLevelSystem = this.partyService.getUserLevelByAuth(party);
            // 十进制个位表示系统级别:1/新注册;2/邮箱谷歌手机其中有一个已验证;3/用户实名认证;4/用户高级认证;
            // 十进制十位表示自定义级别:对应在前端显示为如VIP1 VIP2等级、黄金 白银等级;
            // 如:级别11表示:新注册的前端显示为VIP1;
            int userLevel = party.getUser_level();
            party.setUser_level(((int) Math.floor(userLevel / 10)) * 10 + userLevelSystem);
            this.partyService.update(party);
            Log log = new Log();
            log.setCategory(Constants.LOG_CATEGORY_SECURITY);
            log.setLog("用户邮箱绑定,ip[" + this.getIp(getRequest()) + "]");
            log.setPartyId(party.getId());
            log.setUsername(party.getUsername());
            logService.saveAsyn(log);
        } catch (BusinessException e) {
            resultObject.setCode("1");
            resultObject.setMsg(e.getMessage());
src/main/java/project/web/api/WalletController.java
@@ -302,6 +302,7 @@
                        walletExtend.setAmount(Double.valueOf(df2.format(walletExtend.getAmount())));
                        walletExtend.setLock_amount(Double.valueOf(df2.format(walletExtend.getLock_amount())));
                        walletExtend.setFreeze_amount(Double.valueOf(df2.format(walletExtend.getFreeze_amount())));
                        walletExtend.setName(itemMap.get(list_symbol.get(i)).getName());
                        walletExtendsRet.add(walletExtend);
                        temp = 1;
                    }