diff --git a/short-server-common/src/main/java/com/by/constants/SystemConstant.java b/short-server-common/src/main/java/com/by/constants/SystemConstant.java index e9dba55..6be46de 100644 --- a/short-server-common/src/main/java/com/by/constants/SystemConstant.java +++ b/short-server-common/src/main/java/com/by/constants/SystemConstant.java @@ -11,6 +11,9 @@ public class SystemConstant { */ public static final String DEFAULT_IP = "0.0.0.0"; - + /** + * DEBUG 开关 + */ + public static final Boolean SYS_DEBUG = true; } diff --git a/short-server-service/src/main/java/com/by/api/common/CommonResponse.java b/short-server-service/src/main/java/com/by/api/common/CommonResponse.java index 4e77014..397a0aa 100644 --- a/short-server-service/src/main/java/com/by/api/common/CommonResponse.java +++ b/short-server-service/src/main/java/com/by/api/common/CommonResponse.java @@ -2,6 +2,7 @@ package com.by.api.common; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; import lombok.NoArgsConstructor; import java.io.Serializable; @@ -15,6 +16,7 @@ import java.io.Serializable; * @author q */ @JsonSerialize +@Getter @JsonInclude(JsonInclude.Include.NON_EMPTY) @NoArgsConstructor public class CommonResponse implements Serializable { diff --git a/short-server-service/src/main/java/com/by/api/constants/RequestInfoConstant.java b/short-server-service/src/main/java/com/by/api/constants/RequestInfoConstant.java index 9a94200..79cde32 100644 --- a/short-server-service/src/main/java/com/by/api/constants/RequestInfoConstant.java +++ b/short-server-service/src/main/java/com/by/api/constants/RequestInfoConstant.java @@ -11,10 +11,14 @@ public class RequestInfoConstant { public static final String CUSTOMER_IP_ADDR_KEY = "customer_ip_addr_key"; /** - * 短链对应服务器绑定的域名 + * 短链对应服务器绑定的域名 - 正式环境 */ - public static final String LOCAL_SERVER_HOST = "http://s.baiyee.vip/"; + public static final String PROD_SERVER_HOST = "http://s.baiyee.vip/"; + /** + * 本地开发路径 - 应用于本地服务器 + */ + public static final String DEV_SERVER_HOST = "http://localhost:6666/"; /** * Http请求调用失败 重试次数 diff --git a/short-server-service/src/main/java/com/by/api/convert/ShortChainVOToDTOConvert.java b/short-server-service/src/main/java/com/by/api/convert/ShortChainVOToDTOConvert.java index 82fa6d6..f24b8b0 100644 --- a/short-server-service/src/main/java/com/by/api/convert/ShortChainVOToDTOConvert.java +++ b/short-server-service/src/main/java/com/by/api/convert/ShortChainVOToDTOConvert.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollectionUtil; import com.by.api.vo.ShortChainRequestVO; import com.by.constants.SymbolConstant; import com.by.dto.ShortChainDTO; -import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashSet; @@ -33,7 +32,7 @@ public class ShortChainVOToDTOConvert { String baseUrlAddr = shortChainRequestVO.getBaseUrlAddr(); shortChainRequestVO.getVariableList().forEach( each -> { - originsUrlSet.add(checkUrlAllowed(baseUrlAddr) + SymbolConstant.SPLIT_VERTICAL + each); + originsUrlSet.add(baseUrlAddr + SymbolConstant.SPLIT_VERTICAL + each); } ); @@ -47,12 +46,12 @@ public class ShortChainVOToDTOConvert { return new ShortChainDTO(); } - private static String checkUrlAllowed(String baseUrlAddr) { +/* private static String checkUrlAllowed(String baseUrlAddr) { if (!StringUtils.endsWith(baseUrlAddr.trim(), URL_END_TAG)) { return baseUrlAddr.trim() + URL_END_TAG; } return baseUrlAddr.trim(); - } + }*/ } diff --git a/short-server-service/src/main/java/com/by/api/vo/ShortChainRequestVO.java b/short-server-service/src/main/java/com/by/api/vo/ShortChainRequestVO.java index 7bdad74..f63f1a7 100644 --- a/short-server-service/src/main/java/com/by/api/vo/ShortChainRequestVO.java +++ b/short-server-service/src/main/java/com/by/api/vo/ShortChainRequestVO.java @@ -1,7 +1,9 @@ package com.by.api.vo; import com.by.api.constants.RequestDetailConstant; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @@ -14,6 +16,8 @@ import java.util.List; * @author q */ @Data +@AllArgsConstructor +@NoArgsConstructor public class ShortChainRequestVO { /** diff --git a/short-server-service/src/main/java/com/by/api/vo/ShortChainResponseVO.java b/short-server-service/src/main/java/com/by/api/vo/ShortChainResponseVO.java index fd56743..6bcd487 100644 --- a/short-server-service/src/main/java/com/by/api/vo/ShortChainResponseVO.java +++ b/short-server-service/src/main/java/com/by/api/vo/ShortChainResponseVO.java @@ -1,6 +1,8 @@ package com.by.api.vo; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @@ -10,6 +12,8 @@ import java.util.List; * @author q */ @Data +@AllArgsConstructor +@NoArgsConstructor public class ShortChainResponseVO { /** diff --git a/short-server-service/src/main/java/com/by/dao/ShortUrlDAO.java b/short-server-service/src/main/java/com/by/dao/ShortUrlDAO.java index c3952bb..e1717a7 100644 --- a/short-server-service/src/main/java/com/by/dao/ShortUrlDAO.java +++ b/short-server-service/src/main/java/com/by/dao/ShortUrlDAO.java @@ -33,21 +33,23 @@ public class ShortUrlDAO { * @param list 准备插入的数据 * @return 成功插入的条数 */ - public long batchInsertShortUrls(List list){ + public long batchInsertShortUrls(List list) { String sql = "INSERT INTO `t_short_url` " + - "(operator_ip,origin_url,short_url,point_tag,expiration_day,valid_tag)" + - "VALUES (?, ?, ?, ?, ?, ?)"; + "(gmt_create,gmt_modified,operator_ip,origin_url,short_url,point_tag,expiration_day,valid_tag)" + + "VALUES (?, ? ,? ,? ,? ,? ,? ,? )"; int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement preparedStatement, int i) throws SQLException { - preparedStatement.setString(1,list.get(i).getOperatorIp().trim()); - preparedStatement.setString(2,list.get(i).getOriginUrl().trim()); - preparedStatement.setString(3,list.get(i).getShortUrl().trim()); - preparedStatement.setInt(4,list.get(i).getPointTag()); - preparedStatement.setInt(5,list.get(i).getExpirationDay()); - preparedStatement.setInt(6,list.get(i).getValidTag()); + preparedStatement.setTimestamp(1, list.get(i).getGmtCreate()); + preparedStatement.setTimestamp(2, list.get(i).getGmtModified()); + preparedStatement.setString(3, list.get(i).getOperatorIp().trim()); + preparedStatement.setString(4, list.get(i).getOriginUrl().trim()); + preparedStatement.setString(5, list.get(i).getShortUrl().trim()); + preparedStatement.setInt(6, list.get(i).getPointTag()); + preparedStatement.setInt(7, list.get(i).getExpirationDay()); + preparedStatement.setInt(8, list.get(i).getValidTag()); } @Override @@ -56,7 +58,7 @@ public class ShortUrlDAO { } }); - log.info("=== [ ShortUrlDAO|batchInsertShortUrls 受影响的行数为: {} ] === ", ints.length); + log.info("=== [ ShortUrlDAO|batchInsertShortUrls 受影响的行数为: {} ] === ", ints.length); // 添加完成后移除保存的ip地址信息 ThreadLocalUtil.remove(CUSTOMER_IP_ADDR_KEY); diff --git a/short-server-service/src/main/java/com/by/entity/ShortUrl.java b/short-server-service/src/main/java/com/by/entity/ShortUrl.java index cc0f9c5..cad68c5 100644 --- a/short-server-service/src/main/java/com/by/entity/ShortUrl.java +++ b/short-server-service/src/main/java/com/by/entity/ShortUrl.java @@ -100,6 +100,8 @@ public class ShortUrl implements Serializable { */ public ShortUrl(String originUrl, String shortUrl, Integer pointTag, Integer validTag) { + this.gmtCreate = new Timestamp(System.currentTimeMillis()); + this.gmtModified = new Timestamp(System.currentTimeMillis()); this.operatorIp = ThreadLocalUtil.get(CUSTOMER_IP_ADDR_KEY); this.originUrl = originUrl; this.shortUrl = shortUrl; diff --git a/short-server-service/src/main/java/com/by/service/ShortServerService.java b/short-server-service/src/main/java/com/by/service/ShortServerService.java index c937a2b..59985e9 100644 --- a/short-server-service/src/main/java/com/by/service/ShortServerService.java +++ b/short-server-service/src/main/java/com/by/service/ShortServerService.java @@ -25,7 +25,7 @@ public interface ShortServerService { /** - * 更新猎河的发送记录 - 单条更新 + * 更新发送记录 - 单条更新 * @param recId * @param sucess * @return diff --git a/short-server-service/src/main/java/com/by/service/impl/ShortServerServiceImpl.java b/short-server-service/src/main/java/com/by/service/impl/ShortServerServiceImpl.java index 69664e7..dbf5fe1 100644 --- a/short-server-service/src/main/java/com/by/service/impl/ShortServerServiceImpl.java +++ b/short-server-service/src/main/java/com/by/service/impl/ShortServerServiceImpl.java @@ -1,6 +1,6 @@ package com.by.service.impl; -import com.by.api.constants.RequestInfoConstant; +import com.by.constants.SymbolConstant; import com.by.dao.ShortUrlDAO; import com.by.dao.ShortUrlRepository; import com.by.dto.ShortChainDTO; @@ -47,9 +47,12 @@ public class ShortServerServiceImpl implements ShortServerService { Map makeShortUrlResult = ShortUrlUtil.makeShortUrl(shortChainDTO.getShortChainOrigins()); // 2. 生成的短链请求批量入库 List shortUrls = new ArrayList<>(); + + List resultShortUrls = new ArrayList<>(); makeShortUrlResult.forEach( (shortUrl, originUrl) -> { shortUrls.add(new ShortUrl(originUrl, shortUrl, DBDefaultConstant.ZERO_NUM_TAG, DBDefaultConstant.ZERO_NUM_TAG)); + resultShortUrls.add(shortUrl + SymbolConstant.SPLIT_VERTICAL + StringUtils.substringAfterLast(originUrl, SymbolConstant.SPLIT_VERTICAL)); } ); @@ -59,13 +62,13 @@ public class ShortServerServiceImpl implements ShortServerService { throw BaiyeException.createBaiyeException(CommonErrorCode.DATA_ERROR); } // 3. 把短链请求 return 给调用方 - return new ShortChainDTO(null, new ArrayList<>(makeShortUrlResult.keySet())); + return new ShortChainDTO(null, new ArrayList<>(resultShortUrls)); } @Override public ShortUrl handleOnceShortUrlToRedirectOriginUrlAndRecord(String redeem) { // 1. 查询库中的短链请求 - ShortUrl byshortUrl = shortUrlRepository.findByshortUrl(RequestInfoConstant.LOCAL_SERVER_HOST + redeem); + ShortUrl byshortUrl = shortUrlRepository.findByshortUrl(redeem); // 2. 拿出真实请求进行跳转 if (Objects.isNull(byshortUrl)) { return new ShortUrl(); @@ -85,9 +88,9 @@ public class ShortServerServiceImpl implements ShortServerService { return Boolean.FALSE; } if (sucess) { - shortUrlRepository.updateSendStatus(1, recId); + shortUrlRepository.updateSendStatus(DBDefaultConstant.ONE_NUM_TAG, recId); }else { - shortUrlRepository.updateSendStatus(0, recId); + shortUrlRepository.updateSendStatus(DBDefaultConstant.ZERO_NUM_TAG, recId); } return Boolean.TRUE; } diff --git a/short-server-service/src/main/resources/application-test.yml b/short-server-service/src/main/resources/application-test.yml new file mode 100644 index 0000000..007c03c --- /dev/null +++ b/short-server-service/src/main/resources/application-test.yml @@ -0,0 +1,45 @@ +#配置数据源 +spring: + datasource: + druid: + db-type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/db_short_server?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true + username: root + password: root + # 初始连接数 + initial-size: 5 + # 最小连接数 + min-idle: 10 + # 最大连接数 + max-active: 20 + # 获取连接超时时间 + max-wait: 5000 + # 连接有效性检测时间 + time-between-eviction-runs-millis: 60000 + # 连接在池中最小生存的时间 + min-evictable-idle-time-millis: 300000 + # 连接在池中最大生存的时间 + max-evictable-idle-time-millis: 900000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 检测连接是否有效 + validation-query: select 1 + # 配置监控统计 + webStatFilter: + enabled: true + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: false + filter: + stat: + enabled: true + # 记录慢SQL + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/short-server-service/src/main/resources/application.yml b/short-server-service/src/main/resources/application.yml index 867a41c..f695fe5 100644 --- a/short-server-service/src/main/resources/application.yml +++ b/short-server-service/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 6666 spring: profiles: - active: dev + active: test jackson: time-zone: GMT+8 @@ -34,4 +34,9 @@ short: corePoolSize: 4 maxPoolSize: 32 queueCapacity: 100 - ThreadNamePrefix: 'shortChainTaskExecutor-' \ No newline at end of file + ThreadNamePrefix: 'shortChainTaskExecutor-' + +# 远程调用地址 +upload: + platform: + url: '118.178.137.129:8000/api/tbSendSms/url/callback' \ No newline at end of file diff --git a/short-server-service/src/main/resources/logback.xml b/short-server-service/src/main/resources/logback.xml index 40d230d..777c885 100644 --- a/short-server-service/src/main/resources/logback.xml +++ b/short-server-service/src/main/resources/logback.xml @@ -17,7 +17,7 @@ - ${LOG_DIR}/log.log + ${LOG_DIR}/short-log.log @@ -77,7 +77,7 @@ - - + + \ No newline at end of file diff --git a/short-server-service/src/test/java/com/by/BatchInsertTest.java b/short-server-service/src/test/java/com/by/BatchInsertTest.java new file mode 100644 index 0000000..195c1d0 --- /dev/null +++ b/short-server-service/src/test/java/com/by/BatchInsertTest.java @@ -0,0 +1,105 @@ +package com.by; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.persistence.*; +import java.util.Date; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest +@Slf4j +public class BatchInsertTest { + + + @Data + @Table(name = "t_user") + class User { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + /** + * 创建时间 + */ + @Column(name = "gmt_create", nullable = false) + @CreatedDate + private Date gmtCreate; + + /** + * 修改时间 + */ + @Column(name = "gmt_modified", nullable = false) + @LastModifiedDate + private Date gmtModified; + + /** + * 最后一次操作人的IP地址 + */ + @Column(name = "operator_ip", nullable = false) + private String operatorIp; + + } + + @Autowired + private JdbcTemplate jdbcTemplate; + + + @Test + public void testTestInsertDate() throws InterruptedException { + + List users = new ArrayList<>(); + User user = new User(); + user.setGmtCreate(new Date()); + user.setGmtModified(new Date()); + user.setOperatorIp("1111"); + User user1 = new User(); + user.setGmtCreate(new Date()); + user.setGmtModified(new Date()); + user.setOperatorIp("1111"); + + users.add(user); + users.add(user1); + + + String sql = "INSERT INTO `t_user` " + + "(gmt_create,gmt_modified,operator_ip)" + + "VALUES (?, ? ,?)"; + + int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement preparedStatement, int i) throws SQLException { + preparedStatement.setString(1, users.get(i).getGmtCreate().toString()); + preparedStatement.setString(2, users.get(i).getGmtModified().toString()); + preparedStatement.setString(3, users.get(i).getOperatorIp().trim()); + } + + @Override + public int getBatchSize() { + return users.size(); + } + }); + + Thread.currentThread().join(); + } + + +} diff --git a/sql/t_short_url.sql b/sql/t_short_url.sql index f8a5e14..482941d 100644 --- a/sql/t_short_url.sql +++ b/sql/t_short_url.sql @@ -1,10 +1,4 @@ --- ---------------------------- --- TODO please create database first --- ---------------------------- - - - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -21,7 +15,8 @@ CREATE TABLE `t_short_url` ( `short_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成短链', `point_tag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '点击标识 0-未点击 1-点击', `expiration_day` int(5) NOT NULL COMMENT '失效倒计时时间(day)', - `valid_tag` tinyint(1) NULL DEFAULT NULL COMMENT '有效标识 0-无效 1-有效', + `valid_tag` tinyint(1) NULL DEFAULT NULL COMMENT '有效标识 0-有效 1-无效', + `send_tag` tinyint(1) NULL DEFAULT NULL COMMENT '有效标识 0-成功 1-失败', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;