Commit 728edf62 728edf62e8085afbb977580ec6f8ae4e9d5da610 by lWoHvYe

完成自动关联应用、自动关联服务包、自动上线功能

0 parents
1 HELP.md
2 target/
3 !.mvn/wrapper/maven-wrapper.jar
4 !**/src/main/**/target/
5 !**/src/test/**/target/
6
7 ### STS ###
8 .apt_generated
9 .classpath
10 .factorypath
11 .project
12 .settings
13 .springBeans
14 .sts4-cache
15
16 ### IntelliJ IDEA ###
17 .idea
18 *.iws
19 *.iml
20 *.ipr
21
22 ### NetBeans ###
23 /nbproject/private/
24 /nbbuild/
25 /dist/
26 /nbdist/
27 /.nb-gradle/
28 build/
29 !**/src/main/**/build/
30 !**/src/test/**/build/
31
32 ### VS Code ###
33 .vscode/
34
35 logs/*
36
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <parent>
6 <groupId>org.springframework.boot</groupId>
7 <artifactId>spring-boot-starter-parent</artifactId>
8 <version>2.3.4.RELEASE</version>
9 <relativePath/> <!-- lookup parent from repository -->
10 </parent>
11 <groupId>com.topdraw.platform</groupId>
12 <artifactId>cms-scheduler</artifactId>
13 <version>1.0</version>
14 <name>cms-scheduler</name>
15 <description>cms系统部分定时任务</description>
16
17 <properties>
18 <java.version>1.8</java.version>
19 </properties>
20
21 <dependencies>
22 <dependency>
23 <groupId>org.springframework.boot</groupId>
24 <artifactId>spring-boot-starter-web</artifactId>
25 </dependency>
26 <dependency>
27 <groupId>org.springframework.boot</groupId>
28 <artifactId>spring-boot-devtools</artifactId>
29 <scope>runtime</scope>
30 <optional>true</optional>
31 </dependency>
32 <dependency>
33 <groupId>org.projectlombok</groupId>
34 <artifactId>lombok</artifactId>
35 <optional>true</optional>
36 </dependency>
37 <dependency>
38 <groupId>org.springframework.boot</groupId>
39 <artifactId>spring-boot-starter-test</artifactId>
40 <scope>test</scope>
41 </dependency>
42 <dependency>
43 <groupId>org.springframework.boot</groupId>
44 <artifactId>spring-boot-starter-mail</artifactId>
45 </dependency>
46 <dependency>
47 <groupId>org.springframework.boot</groupId>
48 <artifactId>spring-boot-starter-jdbc</artifactId>
49 </dependency>
50 <dependency>
51 <groupId>com.alibaba</groupId>
52 <artifactId>fastjson</artifactId>
53 <version>1.2.73</version>
54 </dependency>
55 <dependency>
56 <groupId>mysql</groupId>
57 <artifactId>mysql-connector-java</artifactId>
58 <version>5.1.40</version>
59 </dependency>
60 <dependency>
61 <groupId>commons-dbutils</groupId>
62 <artifactId>commons-dbutils</artifactId>
63 <version>1.7</version>
64 </dependency>
65 <dependency>
66 <groupId>commons-codec</groupId>
67 <artifactId>commons-codec</artifactId>
68 <version>1.15</version>
69 </dependency>
70 <dependency>
71 <groupId>cn.hutool</groupId>
72 <artifactId>hutool-all</artifactId>
73 <version>5.5.2</version>
74 </dependency>
75 </dependencies>
76
77 <profiles>
78 <!-- 本地开发环境 -->
79 <profile>
80 <id>dev</id>
81 <properties>
82 <profiles.active>dev</profiles.active>
83 </properties>
84 <activation>
85 <!-- 默认的,不加参数时执行这个profile -->
86 <activeByDefault>true</activeByDefault>
87 </activation>
88 </profile>
89 <!-- 生产环境 -->
90 <profile>
91 <id>prod</id>
92 <properties>
93 <profiles.active>prod</profiles.active>
94 <modifier>-prod</modifier>
95 </properties>
96 </profile>
97 </profiles>
98
99 <build>
100 <plugins>
101 <plugin>
102 <groupId>org.springframework.boot</groupId>
103 <artifactId>spring-boot-maven-plugin</artifactId>
104 </plugin>
105 <plugin>
106 <groupId>org.apache.maven.plugins</groupId>
107 <artifactId>maven-surefire-plugin</artifactId>
108 <configuration>
109 <skip>true</skip>
110 </configuration>
111 </plugin>
112 <plugin>
113 <artifactId>maven-resources-plugin</artifactId>
114 <executions>
115 <execution>
116 <id>copy-resources</id>
117 <phase>package</phase>
118 <goals>
119 <goal>copy-resources</goal>
120 </goals>
121 <configuration>
122 <resources>
123 <resource>
124 <directory>src/main/resources/config</directory>
125 <includes>
126 <include>application.yml</include>
127 <include>application-${profiles.active}.yml</include>
128 </includes>
129 </resource>
130 </resources>
131 <outputDirectory>${project.build.directory}/config</outputDirectory>
132 </configuration>
133 </execution>
134 </executions>
135 </plugin>
136 <!-- jar包内剔除所有配置文件 -->
137 <plugin>
138 <artifactId>maven-jar-plugin</artifactId>
139 <configuration>
140 <!--不打入jar包的文件类型或者路径-->
141 <excludes>
142 <exclude>config/**</exclude>
143 </excludes>
144 </configuration>
145 </plugin>
146 </plugins>
147 </build>
148
149 </project>
1 #!/bin/bash
2 echo Stopping application
3 source ./shutdown.sh
4 # sleep 2
5 echo Starting application
6 source ./start.sh
1 #!/bin/bash
2 echo "stop SpringBoot BAppApiServerApplication"
3 pid=`ps -ef | grep cms-scheduler-1.0.jar | grep -v grep | awk '{print $2}'`
4 echo "旧应用进程id:" $pid
5 if [ -n "$pid" ]
6 then
7 kill -9 $pid
8 fi
9
1 #!/bin/bash
2 export JAVA_HOME=/x/app/jdk1.8.0_77
3 echo ${JAVA_HOME}
4 echo "授权当前用户"
5 chmod 777 ./*.jar
6 echo "执行...."
7 # cd x/app/ams/
8 nohup ${JAVA_HOME}/bin/java -Xms100m -Xmx500m -jar cms-scheduler-1.0.jar --spring.profiles.active=prod >log.info &
9 echo "启动成功"
1 package com.topdraw.platform;
2
3 import org.springframework.boot.SpringApplication;
4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5 import org.springframework.scheduling.annotation.EnableScheduling;
6
7 @SpringBootApplication
8 @EnableScheduling
9 public class CmsSchedulerApplication {
10
11 public static void main(String[] args) {
12 SpringApplication.run(CmsSchedulerApplication.class, args);
13 }
14
15 }
1 package com.topdraw.platform.executor;
2
3 import cn.hutool.core.util.StrUtil;
4 import com.topdraw.platform.util.DbUtil;
5 import lombok.extern.slf4j.Slf4j;
6 import lombok.var;
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.beans.factory.annotation.Value;
9 import org.springframework.stereotype.Component;
10 import org.springframework.transaction.annotation.Transactional;
11
12 import java.sql.Connection;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 @Component
18 @Slf4j
19 public class AutoBindAppProcessor {
20 @Autowired
21 DbUtil dbUtil;
22
23 @Value("${entity.appId}")
24 private Long APP_ID;
25
26 @Transactional(rollbackFor = Exception.class)
27 public void execute() {
28 Connection connection = null;
29 try {
30 connection = dbUtil.getConnection();
31 // 查询未绑定
32 String sql = StrUtil.format(" select xm.id,xm.name from x_media xm LEFT JOIN x_media__app xma on xm.id = xma.media_id and xma.app_id = {} where xma.id is null limit 100 ", APP_ID);
33 List<Map<String, Object>> list = dbUtil.queryList(connection, sql);
34 // 开启事务
35 dbUtil.beginTransaction(connection);
36 for (Map<String, Object> map : list) {
37 var mediaId = (Long) map.get("id");
38 var mapData = new HashMap<String, Object>();
39 mapData.put("media_id", mediaId);
40 mapData.put("app_id", APP_ID);
41 String objectName = "x_media__app";
42 // 添加关联关系
43 dbUtil.save(connection, mapData, objectName);
44 }
45 // 提交事务
46 dbUtil.commitTransaction(connection);
47
48 } catch (Exception ex) {
49 ex.printStackTrace();
50 } finally {
51 dbUtil.close(connection);
52 }
53 }
54 }
1 package com.topdraw.platform.executor;
2
3 import cn.hutool.core.util.StrUtil;
4 import com.topdraw.platform.util.DbUtil;
5 import lombok.extern.slf4j.Slf4j;
6 import lombok.var;
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.beans.factory.annotation.Value;
9 import org.springframework.stereotype.Component;
10 import org.springframework.transaction.annotation.Transactional;
11
12 import java.sql.Connection;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 @Component
18 @Slf4j
19 public class AutoBindServiceProcessor {
20 @Autowired
21 DbUtil dbUtil;
22
23 @Value("${entity.serviceId}")
24 private Long SERVICE_ID;
25
26 @Transactional(rollbackFor = Exception.class)
27 public void execute() {
28 Connection connection = null;
29 try {
30 connection = dbUtil.getConnection();
31 // 查询未绑定
32 String sql = StrUtil.format(" select xm.id,xm.name from x_media xm LEFT JOIN x_service__media xsm on xm.id = xsm.media_id and xsm.service_id = {} where xsm.id is null limit 100 ", SERVICE_ID);
33 List<Map<String, Object>> list = dbUtil.queryList(connection, sql);
34 // 开启事务
35 dbUtil.beginTransaction(connection);
36 for (Map<String, Object> map : list) {
37 var mediaId = (Long) map.get("id");
38 var mapData = new HashMap<String, Object>();
39 mapData.put("media_id", mediaId);
40 mapData.put("service_id", SERVICE_ID);
41 String objectName = "x_service__media";
42 // 添加关联关系
43 dbUtil.save(connection, mapData, objectName);
44 }
45 // 提交事务
46 dbUtil.commitTransaction(connection);
47
48 } catch (Exception ex) {
49 ex.printStackTrace();
50 } finally {
51 dbUtil.close(connection);
52 }
53 }
54 }
1 package com.topdraw.platform.executor;
2
3 import cn.hutool.core.date.DateUtil;
4 import cn.hutool.core.util.StrUtil;
5 import com.topdraw.platform.util.DbUtil;
6 import lombok.extern.slf4j.Slf4j;
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.stereotype.Component;
9 import org.springframework.transaction.annotation.Transactional;
10
11 import java.sql.Connection;
12
13 @Component
14 @Slf4j
15 public class AutoOnlineProcessor {
16 @Autowired
17 DbUtil dbUtil;
18
19 @Transactional(rollbackFor = Exception.class)
20 public void execute() {
21 Connection connection = null;
22 String today = DateUtil.today();
23 try {
24 connection = dbUtil.getConnection();
25 // 查询未绑定
26 String sql = " update `x_media` set `status` = '001' where `status` = '000' and file_status = '001' and create_time >= ? ";
27 dbUtil.doExecute(connection, sql, today);
28 // 提交事务
29 dbUtil.commitTransaction(connection);
30
31 } catch (Exception ex) {
32 ex.printStackTrace();
33 } finally {
34 dbUtil.close(connection);
35 }
36 }
37 }
1 package com.topdraw.platform.scheduler;
2
3 import com.topdraw.platform.executor.AutoBindAppProcessor;
4 import lombok.extern.slf4j.Slf4j;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7 import org.springframework.scheduling.annotation.Scheduled;
8 import org.springframework.stereotype.Component;
9
10 @Component
11 @Slf4j
12 @ConditionalOnProperty(prefix = "scheduler", name = "auto-bind.app-enabled", havingValue = "true")
13 public class AutoBindAppScheduler {
14
15 @Autowired
16 private AutoBindAppProcessor autoBindAppProcessor;
17
18 @Scheduled(cron = "${cron.auto-bind.app}")
19 public void execute() {
20 log.info("schedule [自动绑定应用] start >>>>>>>>>>");
21 autoBindAppProcessor.execute();
22 log.info("schedule [自动绑定应用] end <<<<<<<<<<");
23 }
24 }
1 package com.topdraw.platform.scheduler;
2
3 import com.topdraw.platform.executor.AutoBindServiceProcessor;
4 import lombok.extern.slf4j.Slf4j;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7 import org.springframework.scheduling.annotation.Scheduled;
8 import org.springframework.stereotype.Component;
9
10 @Component
11 @Slf4j
12 @ConditionalOnProperty(prefix = "scheduler", name = "auto-bind.service-enabled", havingValue = "true")
13 public class AutoBindServiceScheduler {
14
15 @Autowired
16 private AutoBindServiceProcessor autoBindServiceProcessor;
17
18 @Scheduled(cron = "${cron.auto-bind.service}")
19 public void execute() {
20 log.info("schedule [自动绑定服务包] start >>>>>>>>>>");
21 autoBindServiceProcessor.execute();
22 log.info("schedule [自动绑定服务包] end <<<<<<<<<<");
23 }
24 }
1 package com.topdraw.platform.scheduler;
2
3 import com.topdraw.platform.executor.AutoOnlineProcessor;
4 import lombok.extern.slf4j.Slf4j;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7 import org.springframework.scheduling.annotation.Scheduled;
8 import org.springframework.stereotype.Component;
9
10 @Component
11 @Slf4j
12 @ConditionalOnProperty(prefix = "scheduler", name = "media-online-enabled", havingValue = "true")
13 public class AutoOnlineScheduler {
14
15 @Autowired
16 private AutoOnlineProcessor autoOnlineProcessor;
17
18 @Scheduled(cron = "${cron.media-online}")
19 public void execute() {
20 log.info("schedule [内容自动上线] start >>>>>>>>>>");
21 autoOnlineProcessor.execute();
22 log.info("schedule [内容自动上线] end <<<<<<<<<<");
23 }
24 }
1 package com.topdraw.platform.util;
2
3 import lombok.extern.slf4j.Slf4j;
4 import org.apache.commons.dbutils.QueryRunner;
5 import org.apache.commons.dbutils.ResultSetHandler;
6 import org.apache.commons.dbutils.handlers.MapHandler;
7 import org.apache.commons.dbutils.handlers.MapListHandler;
8 import org.springframework.stereotype.Component;
9 import org.springframework.util.StringUtils;
10
11 import javax.annotation.Resource;
12 import javax.sql.DataSource;
13 import java.sql.Connection;
14 import java.sql.ResultSet;
15 import java.sql.SQLException;
16 import java.util.*;
17
18 @Component
19 @Slf4j
20 public class DbUtil {
21 @Resource
22 DataSource dataSource;
23
24 public Connection getConnection() throws SQLException {
25 Connection connection = null;
26 if (dataSource != null) {
27 connection = dataSource.getConnection();
28 connection.setAutoCommit(true);
29 }
30 return connection;
31 }
32
33 public void close(Connection conn) {
34 if (conn != null) {
35 try {
36 if (!conn.isClosed()) {
37 conn.close();
38 }
39 } catch (SQLException e) {
40 e.printStackTrace();
41 }
42 }
43 }
44
45 /**
46 * 查询唯一结果集
47 *
48 * @param conn
49 * @param strSqlCommand
50 * @param parameters
51 * @return
52 * @throws SQLException
53 */
54 public Map<String, Object> queryUniqueResult(Connection conn, String strSqlCommand, Object... parameters)
55 throws SQLException {
56 QueryRunner runner = new QueryRunner();
57 MapHandler handler = new MapHandler();
58 return runner.query(conn, strSqlCommand, handler, parameters);
59 }
60
61 /**
62 * 列表查询
63 *
64 * @param conn
65 * @param strSqlCommand
66 * @param parameters
67 * @return
68 * @throws Exception
69 */
70 public List<Map<String, Object>> queryList(Connection conn, String strSqlCommand, Object... parameters)
71 throws SQLException {
72 QueryRunner runner = new QueryRunner();
73 MapListHandler handler = new MapListHandler();
74 return runner.query(conn, strSqlCommand, handler, parameters);
75 }
76
77 /***
78 * 记录保存
79 *
80 * @param conn
81 * @param mapData
82 * @param objectName
83 * @return
84 * @throws SQLException
85 */
86 public <T> T save(Connection conn, Map<String, Object> mapData, String objectName) throws SQLException {
87 if (!mapData.containsKey("update_time") || mapData.get("update_time") == null) {
88 mapData.put("update_time", new Date());
89 }
90 if (!mapData.containsKey("create_time") || mapData.get("create_time") == null) {
91 mapData.put("create_time", new Date());
92 }
93 Iterator<String> it = mapData.keySet().iterator();
94
95 String key;
96 StringBuilder sbInsert = new StringBuilder();
97 sbInsert.append("INSERT INTO ").append(objectName);
98
99 List<Object> valueList = new ArrayList<>();
100 List<String> filedNameList = new ArrayList<>();
101 List<String> preValueList = new ArrayList<>();
102
103 while (it.hasNext()) {
104 key = it.next();
105 filedNameList.add(key);
106 preValueList.add("?");
107 valueList.add(mapData.get(key));
108 }
109 sbInsert.append(" ( `").append(StringUtils.collectionToDelimitedString(filedNameList, "`,`"))
110 .append("` ) VALUES ( ").append(StringUtils.collectionToDelimitedString(preValueList, ",")).append(")");
111 QueryRunner run = new QueryRunner();
112
113 return run.insert(conn, sbInsert.toString(), new InsertResultHandler<T>(), valueList.toArray());
114 }
115
116 private class InsertResultHandler<T> implements ResultSetHandler<T> {
117 @SuppressWarnings("unchecked")
118 @Override
119 public T handle(ResultSet rs) throws SQLException {
120 T t;
121 if (rs.next()) {
122 t = (T) rs.getObject(1);
123 } else {
124 // throw new NoIdGeneratedException("No id generated from database...");
125 return null;
126 }
127 return t;
128 }
129 }
130
131 /**
132 * 记录更新
133 *
134 * @param conn
135 * @param mapData
136 * @param objectName
137 * @param strPrimaryKey
138 * @return
139 * @throws SQLException
140 */
141 public long update(Connection conn, Map<String, Object> mapData, String objectName, String strPrimaryKey)
142 throws SQLException {
143 if (!mapData.containsKey("update_time") || mapData.get("update_time") == null) {
144 mapData.put("update_time", new Date());
145 }
146
147 Iterator<String> it = mapData.keySet().iterator();
148 String key;
149 List<Object> valList = new ArrayList<>();
150 StringBuffer updateSql = new StringBuffer(128);
151 updateSql.append("UPDATE ").append(objectName).append(" SET ");
152 while (it.hasNext()) {
153 key = it.next();
154 if (key.equalsIgnoreCase(strPrimaryKey)) {
155 continue;
156 }
157 updateSql.append("`" + key + "`").append("=?,");
158 valList.add(mapData.get(key));
159 }
160 updateSql.deleteCharAt(updateSql.length() - 1);
161 updateSql.append(" WHERE `" + strPrimaryKey + "`= ? ");
162 valList.add(mapData.get(strPrimaryKey));
163 return doExecute(conn, updateSql.toString(), valList.toArray());
164 }
165
166 /**
167 * sql执行
168 *
169 * @param conn
170 * @param sql
171 * @param parameters
172 * @return
173 * @throws SQLException
174 */
175 public long doExecute(Connection conn, String sql, Object... parameters) throws SQLException {
176 QueryRunner runner = new QueryRunner();
177 return runner.update(conn, sql, parameters);
178 }
179
180 /**
181 * 按主键删除记录
182 *
183 * @param conn
184 * @param objectName
185 * @param id
186 * @return
187 */
188 public int deleteById(Connection conn, String objectName, String id) throws SQLException {
189 String sql = "DELETE FROM " + objectName + " WHERE id = ? ";
190 QueryRunner runner = new QueryRunner();
191 return runner.update(conn, sql, id);
192 }
193
194 public void beginTransaction(Connection connection) throws Exception {
195 connection.setAutoCommit(false);
196 connection.setReadOnly(false);
197 }
198
199 public void commitTransaction(Connection connection) throws SQLException {
200 if (!connection.getAutoCommit()) {
201 connection.commit();
202 }
203 }
204
205 public void rollbackTransaction(Connection connection) throws SQLException {
206 if (!connection.getAutoCommit()) {
207 connection.rollback();
208 }
209 }
210 }
1 package com.topdraw.platform.util;
2
3 /*
4 MessageDigest md = MessageDigest.getInstance("SHA");
5
6 try {
7 md.update(toChapter1);
8 MessageDigest tc1 = md.clone();
9 byte[] toChapter1Digest = tc1.digest();
10 md.update(toChapter2);
11 ...etc.
12 } catch (CloneNotSupportedException cnse) {
13 throw new DigestException("couldn't make digest of partial content");
14 }
15 */
16
17 import org.apache.commons.codec.binary.Hex;
18 import org.apache.tomcat.util.codec.binary.Base64;
19
20 import java.io.UnsupportedEncodingException;
21 import java.security.MessageDigest;
22 import java.security.NoSuchAlgorithmException;
23
24 /**
25 * @author zehui.zeng
26 * @date 13-3-17 下午9:23
27 */
28 public class MD5Util {
29 private final String algorithm;
30 private boolean encodeHashAsBase64 = false;
31 private static MD5Util md5 = null;
32
33 /**
34 * The digest algorithm to use
35 * Supports the named <a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppA">
36 * Message Digest Algorithms</a> in the Java environment.
37 *
38 * @param algorithm
39 */
40 public MD5Util(String algorithm) {
41 this(algorithm, false);
42 }
43
44 public MD5Util(){
45 this.algorithm = "MD5";
46 }
47
48 /**
49 * Convenience constructor for specifying the algorithm and whether or not to enable base64 encoding
50 *
51 * @param algorithm
52 * @param encodeHashAsBase64
53 * @throws IllegalArgumentException if an unknown
54 */
55 public MD5Util(String algorithm, boolean encodeHashAsBase64) throws IllegalArgumentException {
56 this.algorithm = algorithm;
57 setEncodeHashAsBase64(encodeHashAsBase64);
58 //Validity Check
59 getMessageDigest();
60 }
61
62 public static String encodePassword(String passwd){
63 if(md5 == null){
64 md5 = new MD5Util();
65 }
66 return md5.encodePassword(passwd, "");
67 }
68
69
70
71 /**
72 * Encodes the rawPass using a MessageDigest.
73 * If a salt is specified it will be merged with the password before encoding.
74 *
75 * @param rawPass The plain text password
76 * @param salt The salt to sprinkle
77 * @return Hex string of password digest (or base64 encoded string if encodeHashAsBase64 is enabled.
78 */
79 public String encodePassword(String rawPass, Object salt) {
80 String saltedPass = mergePasswordAndSalt(rawPass, salt, false);
81
82 MessageDigest messageDigest = getMessageDigest();
83
84 byte[] digest;
85
86 try {
87 digest = messageDigest.digest(saltedPass.getBytes("UTF-8"));
88 } catch (UnsupportedEncodingException e) {
89 throw new IllegalStateException("UTF-8 not supported!");
90 }
91
92 if (getEncodeHashAsBase64()) {
93 return new String(Base64.encodeBase64(digest));
94 } else {
95 return new String(Hex.encodeHex(digest));
96 }
97 }
98
99 /**
100 * Get a MessageDigest instance for the given algorithm.
101 * Throws an IllegalArgumentException if <i>algorithm</i> is unknown
102 *
103 * @return MessageDigest instance
104 * @throws IllegalArgumentException if NoSuchAlgorithmException is thrown
105 */
106 protected final MessageDigest getMessageDigest() throws IllegalArgumentException {
107 try {
108 return MessageDigest.getInstance(algorithm);
109 } catch (NoSuchAlgorithmException e) {
110 throw new IllegalArgumentException("No such algorithm [" + algorithm + "]");
111 }
112 }
113
114 /**
115 * Takes a previously encoded password and compares it with a rawpassword after mixing in the salt and
116 * encoding that value
117 *
118 * @param encPass previously encoded password
119 * @param rawPass plain text password
120 * @param salt salt to mix into password
121 * @return true or false
122 */
123 public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
124 String pass1 = "" + encPass;
125 String pass2 = encodePassword(rawPass, salt);
126
127 return pass1.equals(pass2);
128 }
129
130
131 /**
132 * Used by subclasses to extract the password and salt from a merged <code>String</code> created using
133 * {@link #mergePasswordAndSalt(String,Object,boolean)}.<p>The first element in the returned array is the
134 * password. The second element is the salt. The salt array element will always be present, even if no salt was
135 * found in the <code>mergedPasswordSalt</code> argument.</p>
136 *
137 * @param mergedPasswordSalt as generated by <code>mergePasswordAndSalt</code>
138 *
139 * @return an array, in which the first element is the password and the second the salt
140 *
141 * @throws IllegalArgumentException if mergedPasswordSalt is null or empty.
142 */
143 protected String[] demergePasswordAndSalt(String mergedPasswordSalt) {
144 if ((mergedPasswordSalt == null) || "".equals(mergedPasswordSalt)) {
145 throw new IllegalArgumentException("Cannot pass a null or empty String");
146 }
147
148 String password = mergedPasswordSalt;
149 String salt = "";
150
151 int saltBegins = mergedPasswordSalt.lastIndexOf("{");
152
153 if ((saltBegins != -1) && ((saltBegins + 1) < mergedPasswordSalt.length())) {
154 salt = mergedPasswordSalt.substring(saltBegins + 1, mergedPasswordSalt.length() - 1);
155 password = mergedPasswordSalt.substring(0, saltBegins);
156 }
157
158 return new String[] {password, salt};
159 }
160
161 /**
162 * Used by subclasses to generate a merged password and salt <code>String</code>.<P>The generated password
163 * will be in the form of <code>password{salt}</code>.</p>
164 * <p>A <code>null</code> can be passed to either method, and will be handled correctly. If the
165 * <code>salt</code> is <code>null</code> or empty, the resulting generated password will simply be the passed
166 * <code>password</code>. The <code>toString</code> method of the <code>salt</code> will be used to represent the
167 * salt.</p>
168 *
169 * @param password the password to be used (can be <code>null</code>)
170 * @param salt the salt to be used (can be <code>null</code>)
171 * @param strict ensures salt doesn't contain the delimiters
172 *
173 * @return a merged password and salt <code>String</code>
174 *
175 * @throws IllegalArgumentException if the salt contains '{' or '}' characters.
176 */
177 protected String mergePasswordAndSalt(String password, Object salt, boolean strict) {
178 if (password == null) {
179 password = "";
180 }
181
182 if (strict && (salt != null)) {
183 if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) {
184 throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
185 }
186 }
187
188 if ((salt == null) || "".equals(salt)) {
189 return password;
190 } else {
191 return password + "{" + salt.toString() + "}";
192 }
193 }
194
195 public String getAlgorithm() {
196 return algorithm;
197 }
198
199 public boolean getEncodeHashAsBase64() {
200 return encodeHashAsBase64;
201 }
202
203 /**
204 * The encoded password is normally returned as Hex (32 char) version of the hash bytes. Setting this
205 * property to true will cause the encoded pass to be returned as Base64 text, which will consume 24 characters.
206 *
207 * @param encodeHashAsBase64 set to true for Base64 output
208 */
209 public void setEncodeHashAsBase64(boolean encodeHashAsBase64) {
210 this.encodeHashAsBase64 = encodeHashAsBase64;
211 }
212
213 public static void main(String[] args){
214 System.out.println(MD5Util.encodePassword("system1"));
215 }
216
217
218 }
1 package com.topdraw.platform.util;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.beans.factory.annotation.Value;
5 import org.springframework.mail.SimpleMailMessage;
6 import org.springframework.mail.javamail.JavaMailSender;
7 import org.springframework.stereotype.Component;
8
9 @Component
10 public class MailUtil {
11
12 @Autowired
13 private JavaMailSender javaMailSender;
14
15 @Value("${spring.mail.username}")
16 private String from;
17
18 @Value("${spring.mail.developer-mail-address}")
19 private String to;
20
21 public void sendSimpleMail(String subject, String text) {
22 SimpleMailMessage message = new SimpleMailMessage();
23 message.setFrom(from);
24 message.setTo(to);
25 message.setSubject(subject);
26 message.setText(text);
27 javaMailSender.send(message);
28 }
29 }
1 spring:
2 datasource:
3 url: jdbc:mysql://139.196.192.242:3306/cms_test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
4 username: root
5 password: Tjlh@2017
6 driver-class-name: com.mysql.jdbc.Driver
7 hikari:
8 maximum-pool-size: 10
9 minimum-idle: 5
10 idle-timeout: 180000
11 auto-commit: true
12 connection-timeout: 30000
13 connection-test-query: SELECT 1
1 spring:
2 datasource:
3 url: jdbc:mysql://139.196.192.242:3306/cms_test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&autoReconnect=true
4 username: root
5 password: Topdraw1qaz
6 driver-class-name: com.mysql.jdbc.Driver
7 hikari:
8 maximum-pool-size: 10
9 minimum-idle: 5
10 idle-timeout: 180000
11 auto-commit: true
12 connection-timeout: 30000
13 connection-test-query: SELECT 1
1 server:
2 port: 18080
3
4 scheduler:
5 auto-bind:
6 app-enabled: true
7 service-enabled: true
8 media-online-enabled: true
9
10 cron:
11 auto-bind:
12 app: 0/10 * * * * ?
13 service: 0/10 * * * * ?
14 media-online: 0/10 * * * * ?
15
16 spring:
17 mail:
18 host: smtp.ym.163.com
19 username: test@topdraw.cn
20 password: 123456789
21 protocol: smtp
22 default-encoding: utf-8
23 developer-mail-address: wanghongyan@topdraw.cn
24
25 profiles:
26 active: dev
27
28 entity:
29 appId: 63
30 serviceId: 1
1 <?xml version="1.0" encoding="UTF-8"?>
2 <configuration scan="true" scanPeriod="60 seconds" debug="false">
3
4 <!--定义参数,后面可以通过${app.name}使用-->
5 <property name="app.name" value="cms.scheduler"/>
6 <property name="log.path" value="./logs"/>
7 <property name="log.pattern" value="%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/>
8
9 <!--输出到控制台-->
10 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
11 <!-- encoder 默认配置为PatternLayoutEncoder -->
12 <!--定义控制台输出格式-->
13 <encoder>
14 <pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg %n</pattern>
15 <charset>utf-8</charset>
16 </encoder>
17 </appender>
18
19 <!--获取比info级别高(包括info级别)但除error级别的日志-->
20 <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
21 <filter class="ch.qos.logback.classic.filter.LevelFilter">
22 <level>ERROR</level>
23 <onMatch>DENY</onMatch>
24 <onMismatch>ACCEPT</onMismatch>
25 </filter>
26 <encoder>
27 <pattern>${log.pattern}</pattern>
28 </encoder>
29 <!--滚动策略-->
30 <file>${log.path}/${app.name}-info.log</file>
31 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
32 <!--路径-->
33 <fileNamePattern>${log.path}/info/${app.name}-%d{yyyy-MM-dd}.log</fileNamePattern>
34 <maxHistory>30</maxHistory>
35 <totalSizeCap>10GB</totalSizeCap>
36 </rollingPolicy>
37 <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
38 <!-- &lt;!&ndash;每个日志文件最大100MB&ndash;&gt;-->
39 <!-- <maxFileSize>100MB</maxFileSize>-->
40 <!-- </triggeringPolicy>-->
41 </appender>
42
43 <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
44 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
45 <level>ERROR</level>
46 </filter>
47 <encoder>
48 <pattern>${log.pattern}</pattern>
49 </encoder>
50 <!--滚动策略-->
51 <file>${log.path}/${app.name}-error.log</file>
52 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
53 <!--路径-->
54 <fileNamePattern>${log.path}/error/${app.name}-%d{yyyy-MM-dd}.log</fileNamePattern>
55 <maxHistory>30</maxHistory>
56 <totalSizeCap>10GB</totalSizeCap>
57 </rollingPolicy>
58 <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
59 <!-- &lt;!&ndash;每个日志文件最大50MB&ndash;&gt;-->
60 <!-- <maxFileSize>50MB</maxFileSize>-->
61 <!-- </triggeringPolicy>-->
62 </appender>
63
64 <!--普通日志输出到控制台-->
65 <root level="info">
66 <appender-ref ref="console" />
67 <appender-ref ref="info" />
68 <appender-ref ref="error" />
69 </root>
70
71 <!--监控sql日志输出 -->
72 <logger name="jdbc.sqlonly" level="INFO" additivity="false">
73 <appender-ref ref="console" />
74 </logger>
75
76 <logger name="jdbc.resultset" level="ERROR" additivity="false">
77 <appender-ref ref="console" />
78 </logger>
79
80 <!-- 如想看到表格数据,将OFF改为INFO -->
81 <logger name="jdbc.resultsettable" level="OFF" additivity="false">
82 <appender-ref ref="console" />
83 </logger>
84
85 <logger name="jdbc.connection" level="OFF" additivity="false">
86 <appender-ref ref="console" />
87 </logger>
88
89 <logger name="jdbc.sqltiming" level="OFF" additivity="false">
90 <appender-ref ref="console" />
91 </logger>
92
93 <logger name="jdbc.audit" level="OFF" additivity="false">
94 <appender-ref ref="console" />
95 </logger>
96 </configuration>
1 package com.topdraw.platform;
2
3 import org.junit.jupiter.api.Test;
4 import org.springframework.boot.test.context.SpringBootTest;
5
6 @SpringBootTest
7 class LeviathanSchedulerApplicationTests {
8
9 @Test
10 void contextLoads() {
11 }
12
13 }