Jelajahi Sumber

add basic configuration and service

Bay 5 tahun lalu
induk
melakukan
02912e318f
18 mengubah file dengan 640 tambahan dan 0 penghapusan
  1. 5 0
      pom.xml
  2. 116 0
      seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/UserVO.java
  3. 4 0
      seecoder-portal-server/pom.xml
  4. 2 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/SeecoderPortalServerApplication.java
  5. 12 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/AsyncConfiguration.java
  6. 28 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/JacksonConfiguration.java
  7. 60 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/SpringSecurityConfiguration.java
  8. 67 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/property/AliProperties.java
  9. 19 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/PhoneVerificationRepository.java
  10. 106 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/AliService.java
  11. 7 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/TeacherService.java
  12. 75 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/UserService.java
  13. 60 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/utility/RandomString.java
  14. 21 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/utility/ResponseUtil.java
  15. 11 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/errors/PhoneAlreadyUsedException.java
  16. 10 0
      seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/errors/PhoneVerificationNotMatchException.java
  17. 16 0
      seecoder-portal-server/src/main/resources/application-dev.yml
  18. 21 0
      seecoder-portal-server/src/main/resources/application.yml

+ 5 - 0
pom.xml

@@ -59,6 +59,11 @@
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>aliyun-java-sdk-core</artifactId>
+                <version>4.5.20</version>
+            </dependency>
             <dependency>
                 <groupId>cn.seecoder</groupId>
                 <artifactId>seecoder-portal-common</artifactId>

+ 116 - 0
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/UserVO.java

@@ -1,7 +1,123 @@
 package cn.seecoder.seecoderportalcommon.vo;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.time.OffsetDateTime;
+
 /**
  * @author Kunduin
  */
 public class UserVO {
+    private Long id;
+
+    @Size(max = 64)
+    @NotBlank
+    private String phone;
+
+    @Size(max = 64)
+    private String name;
+
+    @Size(max = 512)
+    private String email;
+
+    @Size(max = 512)
+    private String photo;
+
+    @NotNull
+    private UserRole role = UserRole.STUDENT;
+
+    @Size(max = 512)
+    private String signature = "无";
+
+    private OffsetDateTime createdTime;
+
+    private Boolean isValid = true;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public UserRole getRole() {
+        return role;
+    }
+
+    public void setRole(UserRole role) {
+        this.role = role;
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+    public void setSignature(String signature) {
+        this.signature = signature;
+    }
+
+    public OffsetDateTime getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(OffsetDateTime createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Boolean getValid() {
+        return isValid;
+    }
+
+    public void setValid(Boolean valid) {
+        isValid = valid;
+    }
+
+    @Override
+    public String toString() {
+        return "UserVO{" +
+                "id=" + id +
+                ", phone='" + phone + '\'' +
+                ", name='" + name + '\'' +
+                ", email='" + email + '\'' +
+                ", photo='" + photo + '\'' +
+                ", role=" + role +
+                ", signature='" + signature + '\'' +
+                ", createdTime=" + createdTime +
+                ", isValid=" + isValid +
+                '}';
+    }
 }

+ 4 - 0
seecoder-portal-server/pom.xml

@@ -121,6 +121,10 @@
             <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 2 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/SeecoderPortalServerApplication.java

@@ -2,11 +2,13 @@ package cn.seecoder.seecoderportalserver;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 
 /**
  * @author Kunduin
  */
 @SpringBootApplication
+@EnableConfigurationProperties
 public class SeecoderPortalServerApplication {
     public static void main(String[] args) {
         SpringApplication.run(SeecoderPortalServerApplication.class, args);

+ 12 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/AsyncConfiguration.java

@@ -0,0 +1,12 @@
+package cn.seecoder.seecoderportalserver.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * @author kunduin
+ */
+@Configuration
+@EnableAsync
+public class AsyncConfiguration {
+}

+ 28 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/JacksonConfiguration.java

@@ -0,0 +1,28 @@
+package cn.seecoder.seecoderportalserver.config;
+
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author kunduin
+ */
+@Configuration
+public class JacksonConfiguration {
+
+    /**
+     * Support for Java date and time API.
+     *
+     * @return the corresponding Jackson module.
+     */
+    @Bean
+    public JavaTimeModule javaTimeModule() {
+        return new JavaTimeModule();
+    }
+
+    @Bean
+    public Jdk8Module jdk8TimeModule() {
+        return new Jdk8Module();
+    }
+}

+ 60 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/SpringSecurityConfiguration.java

@@ -0,0 +1,60 @@
+package cn.seecoder.seecoderportalserver.config;
+
+import cn.seecoder.seecoderportalserver.security.jwt.JWTConfigurer;
+import cn.seecoder.seecoderportalserver.security.jwt.TokenProvider;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+/**
+ * @author kunduin
+ */
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
+public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
+    private final TokenProvider tokenProvider;
+
+    public SpringSecurityConfiguration(TokenProvider tokenProvider) {
+        this.tokenProvider = tokenProvider;
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http
+                // csrf
+                .csrf()
+                .disable()
+
+                // cors
+                .cors()
+                .and()
+
+                // session
+                .sessionManagement()
+                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+                .and()
+
+                // auth
+                .authorizeRequests()
+                .antMatchers("/api/authenticate", "/api/account/register", "/api/account/reset", "/api/message")
+                .permitAll() // authenticate
+                .antMatchers("/api/**")
+                .authenticated()
+                .and()
+                .httpBasic()
+                .and()
+
+                // jwt
+                .apply(new JWTConfigurer(tokenProvider));
+    }
+}

+ 67 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/config/property/AliProperties.java

@@ -0,0 +1,67 @@
+package cn.seecoder.seecoderportalserver.config.property;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author kunduin
+ */
+@ConfigurationProperties("aliyun")
+public class AliProperties {
+    private Profile profile;
+
+    public static class Profile {
+        private String accessKeyId;
+        private String accessKeySecret;
+        private String regionId;
+        private String sysDomain;
+        private String sysVersion;
+
+        public String getAccessKeyId() {
+            return accessKeyId;
+        }
+
+        public void setAccessKeyId(String accessKeyId) {
+            this.accessKeyId = accessKeyId;
+        }
+
+        public String getAccessKeySecret() {
+            return accessKeySecret;
+        }
+
+        public void setAccessKeySecret(String accessKeySecret) {
+            this.accessKeySecret = accessKeySecret;
+        }
+
+        public String getRegionId() {
+            return regionId;
+        }
+
+        public void setRegionId(String regionId) {
+            this.regionId = regionId;
+        }
+
+        public String getSysDomain() {
+            return sysDomain;
+        }
+
+        public void setSysDomain(String sysDomain) {
+            this.sysDomain = sysDomain;
+        }
+
+        public String getSysVersion() {
+            return sysVersion;
+        }
+
+        public void setSysVersion(String sysVersion) {
+            this.sysVersion = sysVersion;
+        }
+    }
+
+    public Profile getProfile() {
+        return profile;
+    }
+
+    public void setProfile(Profile profile) {
+        this.profile = profile;
+    }
+}

+ 19 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/PhoneVerificationRepository.java

@@ -0,0 +1,19 @@
+package cn.seecoder.seecoderportalserver.repository;
+
+import cn.seecoder.seecoderportalserver.domain.PhoneVerification;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.time.OffsetDateTime;
+import java.util.Optional;
+
+/**
+ * @author kunduin
+ */
+@Repository
+public interface PhoneVerificationRepository extends JpaRepository<PhoneVerification, Long> {
+
+    Optional<PhoneVerification> findByPhone(String phone);
+
+    void deleteByCodeTimeBefore(OffsetDateTime offsetDateTime);
+}

+ 106 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/AliService.java

@@ -0,0 +1,106 @@
+package cn.seecoder.seecoderportalserver.service;
+
+
+import cn.seecoder.seecoderportalserver.config.property.AliProperties;
+import cn.seecoder.seecoderportalserver.domain.PhoneVerification;
+import cn.seecoder.seecoderportalserver.repository.PhoneVerificationRepository;
+import cn.seecoder.seecoderportalserver.utility.RandomString;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.constraints.NotBlank;
+import java.time.OffsetDateTime;
+import java.util.Optional;
+
+import static cn.seecoder.seecoderportalserver.utility.RandomString.DIGITS;
+
+/**
+ * @author Kunduin
+ */
+@Service
+public class AliService {
+    private static final Logger log = LoggerFactory.getLogger(AliService.class);
+
+    private final RandomString randomString = new RandomString(6, DIGITS);
+    private final AliProperties.Profile aliProfile;
+    private final IAcsClient client;
+    private final PhoneVerificationRepository phoneVerificationRepository;
+
+    public AliService(AliProperties aliProperties, PhoneVerificationRepository phoneVerificationRepository) {
+        this.aliProfile = aliProperties.getProfile();
+        this.phoneVerificationRepository = phoneVerificationRepository;
+        DefaultProfile profile = DefaultProfile.getProfile(
+                aliProfile.getRegionId(),
+                aliProfile.getAccessKeyId(),
+                aliProfile.getAccessKeySecret());
+        client = new DefaultAcsClient(profile);
+    }
+
+    @Async
+    public void sendMessage(String phone) {
+        sendMessage(phone, randomString.nextString());
+    }
+
+    @Async
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void sendMessage(@NotBlank String phone, @NotBlank String code) {
+        PhoneVerification phoneVerification = phoneVerificationRepository.findByPhone(phone)
+                .orElseGet(() -> {
+                    PhoneVerification nextPhoneVerification = new PhoneVerification();
+                    nextPhoneVerification.setPhone(phone);
+                    return nextPhoneVerification;
+                });
+        phoneVerification.setCode(code);
+        phoneVerificationRepository.save(phoneVerification);
+
+        sendSms(phone, code);
+    }
+
+    @Transactional(rollbackFor = RuntimeException.class)
+    public boolean checkPhoneMessage(@NotBlank String phone, @NotBlank String code) {
+        Optional<PhoneVerification> optionalPhoneVerification = phoneVerificationRepository.findByPhone(phone);
+        log.debug("Check phone[{}] {}", phone, optionalPhoneVerification);
+        return optionalPhoneVerification
+                .map(phoneVerification ->
+                        phoneVerification.getCode().toLowerCase().equals(code.toLowerCase()))
+                .orElse(false);
+    }
+
+    @Scheduled(cron = "0 0 4 ? * *")
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void clearVerification() {
+        OffsetDateTime yesterday = OffsetDateTime.now().minusDays(1);
+        phoneVerificationRepository.deleteByCodeTimeBefore(yesterday);
+    }
+
+
+    private void sendSms(String phone, String code) {
+        CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain(aliProfile.getSysDomain());
+        request.setSysVersion(aliProfile.getSysVersion());
+        request.setSysAction("SendSms");
+        request.putQueryParameter("RegionId", aliProfile.getRegionId());
+        request.putQueryParameter("PhoneNumbers", phone);
+        request.putQueryParameter("SignName", "seeccoder");
+        request.putQueryParameter("TemplateCode", "SMS_181555598");
+        request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");
+        try {
+            CommonResponse response = client.getCommonResponse(request);
+            log.info(response.getData());
+        } catch (ClientException e) {
+            log.error("Send sms error", e);
+        }
+    }
+}

+ 7 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/TeacherService.java

@@ -0,0 +1,7 @@
+package cn.seecoder.seecoderportalserver.service;
+
+/**
+ * @author kunduin
+ */
+public class TeacherService {
+}

+ 75 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/UserService.java

@@ -0,0 +1,75 @@
+package cn.seecoder.seecoderportalserver.service;
+
+import cn.seecoder.seecoderportalcommon.vo.UserVO;
+import cn.seecoder.seecoderportalserver.domain.User;
+import cn.seecoder.seecoderportalserver.mapper.UserMapper;
+import cn.seecoder.seecoderportalserver.repository.UserRepository;
+import cn.seecoder.seecoderportalserver.web.rest.errors.PhoneAlreadyUsedException;
+import cn.seecoder.seecoderportalserver.web.rest.errors.PhoneVerificationNotMatchException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author Kunduin
+ */
+@Service
+@Transactional(rollbackFor = RuntimeException.class)
+public class UserService {
+    private static final Logger log = LoggerFactory.getLogger(UserService.class);
+
+    private final UserRepository userRepository;
+    private final PasswordEncoder passwordEncoder;
+    private final UserMapper userMapper;
+    private final AliService aliService;
+
+    public UserService(
+            UserRepository userRepository, PasswordEncoder passwordEncoder,
+            UserMapper userMapper, AliService aliService) {
+        this.userRepository = userRepository;
+        this.passwordEncoder = passwordEncoder;
+        this.userMapper = userMapper;
+        this.aliService = aliService;
+    }
+
+    @Transactional(rollbackFor = RuntimeException.class)
+    public User registerUser(UserVO userDTO, String password, String phoneCode) {
+        checkPhoneMessageOrThrowError(userDTO.getPhone(), phoneCode);
+
+        userRepository
+                .findByPhone(userDTO.getPhone())
+                .ifPresent(user -> {
+                    throw new PhoneAlreadyUsedException();
+                });
+        User user = userMapper.userVOToUser(userDTO);
+        String encodedPassword = passwordEncoder.encode(password);
+        user.setPassword(encodedPassword);
+        User savedUser = userRepository.save(user);
+        log.debug("Created Information for User: {}", savedUser);
+        return savedUser;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public User resetPassword(String phone, String phoneCode, String password) {
+        checkPhoneMessageOrThrowError(phone, phoneCode);
+
+        User user = userRepository
+                .findByPhone(phone)
+                .<UsernameNotFoundException>orElseThrow(() -> {
+                    throw new UsernameNotFoundException("找不到手机用户[" + phone + "]");
+                });
+        user.setPassword(passwordEncoder.encode(password));
+        User savedUser = userRepository.save(user);
+        log.debug("Reset Password for User: {}", savedUser);
+        return savedUser;
+    }
+
+    private void checkPhoneMessageOrThrowError(String phone, String phoneCode) {
+        if (!aliService.checkPhoneMessage(phone, phoneCode)) {
+            throw new PhoneVerificationNotMatchException();
+        }
+    }
+}

+ 60 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/utility/RandomString.java

@@ -0,0 +1,60 @@
+package cn.seecoder.seecoderportalserver.utility;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+import java.security.SecureRandom;
+import java.util.Locale;
+import java.util.Random;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * @author Kunduin
+ */
+
+public class RandomString {
+
+    public static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    public static final String LOWER = UPPER.toLowerCase(Locale.ENGLISH);
+    public static final String DIGITS = "0123456789";
+    public static final String ALPHA_NUM = UPPER + LOWER + DIGITS;
+
+    private final Random random;
+    private final char[] symbols;
+    private final char[] buf;
+
+    public RandomString(
+            @Positive int length,
+            @NotNull Random random,
+            @NotBlank String symbols) {
+        checkArgument(symbols.length() >= 2);
+
+        this.random = random;
+        this.symbols = symbols.toCharArray();
+        this.buf = new char[length];
+    }
+
+    public RandomString(int length, Random random) {
+        this(length, random, ALPHA_NUM);
+    }
+
+    public RandomString(int length) {
+        this(length, new SecureRandom());
+    }
+
+    public RandomString(int length, String symbols) {
+        this(length, new SecureRandom(), symbols);
+    }
+
+    public RandomString() {
+        this(16);
+    }
+
+    public String nextString() {
+        for (int i = 0; i < buf.length; i++) {
+            buf[i] = symbols[random.nextInt(symbols.length)];
+        }
+        return new String(buf);
+    }
+}

+ 21 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/utility/ResponseUtil.java

@@ -0,0 +1,21 @@
+package cn.seecoder.seecoderportalserver.utility;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.Optional;
+
+/** @author kunduin */
+public class ResponseUtil {
+    static <X> ResponseEntity<X> wrapOrNotFound(Optional<X> maybeResponse) {
+        return wrapOrNotFound(maybeResponse, null);
+    }
+
+    static <X> ResponseEntity<X> wrapOrNotFound(Optional<X> maybeResponse, HttpHeaders header) {
+        return maybeResponse
+                .map(response -> ResponseEntity.ok().headers(header).body(response))
+                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
+    }
+}

+ 11 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/errors/PhoneAlreadyUsedException.java

@@ -0,0 +1,11 @@
+package cn.seecoder.seecoderportalserver.web.rest.errors;
+
+/**
+ * @author Kunduin
+ */
+public class PhoneAlreadyUsedException extends RuntimeException {
+
+    public PhoneAlreadyUsedException() {
+        super("Login name already used!");
+    }
+}

+ 10 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/errors/PhoneVerificationNotMatchException.java

@@ -0,0 +1,10 @@
+package cn.seecoder.seecoderportalserver.web.rest.errors;
+
+/**
+ * @author kunduin
+ */
+public class PhoneVerificationNotMatchException extends RuntimeException {
+    public PhoneVerificationNotMatchException() {
+        super("Phone verification not right");
+    }
+}

+ 16 - 0
seecoder-portal-server/src/main/resources/application-dev.yml

@@ -0,0 +1,16 @@
+debug: true
+logging:
+  level:
+    tracer: trace
+    org:
+      elasticsearch:
+        client:
+          RestClient: trace
+
+spring:
+  jpa:
+    show-sql: true
+  datasource:
+    url: jdbc:postgresql://centos8.local:5432/portal
+    username: postgres
+    password: 12345678qwerQWER

+ 21 - 0
seecoder-portal-server/src/main/resources/application.yml

@@ -0,0 +1,21 @@
+
+seec:
+  secret: UenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRWUenM4KGb6DskRW
+
+aliyun:
+  profile:
+    access-key-id: LTAI4FiAXXyNfYJLweBXpKPx
+    access-key-secret: IBoC7KGkZHOvxZQIfQgp98ZY48AVjW
+    region-id: cn-hangzhou
+    sys-domain: dysmsapi.aliyuncs.com
+    sys-version: 2017-05-25
+
+spring:
+  jpa:
+    database: postgresql
+    open-in-view: false
+    hibernate:
+      ddl-auto: update
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+