🎉 初始化第三方插件模块

This commit is contained in:
bunny 2025-07-06 23:15:28 +08:00
parent 3a0954bfce
commit 585dd4290d
39 changed files with 1878 additions and 42 deletions

View File

@ -24,23 +24,15 @@
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
@ -54,10 +46,10 @@
<!-- <groupId>com.alibaba.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>org.springframework.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-loadbalancer</artifactId> -->
<!-- </dependency> -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.springframework.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId> -->

View File

@ -36,9 +36,5 @@
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.springframework.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-loadbalancer</artifactId> -->
<!-- </dependency> -->
</dependencies>
</project>

View File

@ -3,8 +3,10 @@ package com.mall.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class MallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MallGatewayApplication.class, args);

View File

@ -11,9 +11,8 @@ spring:
- "*"
allowed-methods:
- "*"
allowed-origins:
- "*"
allow-credentials: true
routes:
- id: route-product
uri: lb://service-product
@ -32,4 +31,8 @@ spring:
- id: route-coupon
uri: lb://service-coupon
predicates:
- Path=/api/coupon/**
- Path=/api/coupon/**
- id: route-third-party
uri: lb://service-third-party
predicates:
- Path=/api/third-party/**

View File

@ -7,12 +7,16 @@ spring:
- routes
application:
name: service-gateway
devtools:
livereload:
port: 0
cloud:
nacos:
server-addr: bunny-web.site:8848
username: admin
password: admin123
config:
import-check:
enabled: false
jackson:
date-format: yyyy-MM-dd HH:mm:ss

View File

@ -31,6 +31,17 @@
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -17,6 +17,9 @@ spring:
maximum-pool-size: 20
connection-timeout: 30000
jackson:
date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
global-config:
@ -25,5 +28,5 @@ mybatis-plus:
logic-delete-value: 1
logic-not-delete-value: 0
jackson:
date-format: yyyy-MM-dd HH:mm:ss
# LTAI5tMynexvsUvznfXXL6x4
# 8H3EwbyvCKQ9FiTpnRzOojmHg1NKpg

View File

@ -18,6 +18,75 @@
</properties>
<dependencies>
<dependency>
<groupId>com.mall</groupId>
<artifactId>mall-common</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</exclusion>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- aliyun oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.18.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-secretsmanager-client</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.7.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.6</version>
</dependency>
</dependencies>
</project>

View File

@ -1,13 +0,0 @@
package com.mall;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}

View File

@ -0,0 +1,15 @@
package com.mall.thirdParty;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@EnableDiscoveryClient
@RefreshScope
@SpringBootApplication()
public class MallThirdPartyApplication {
public static void main(String[] args) {
SpringApplication.run(MallThirdPartyApplication.class, args);
}
}

View File

@ -0,0 +1,66 @@
package com.mall.thirdParty.client;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.comm.SignVersion;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
@Slf4j
public class AliOssClient {
@Value("${aliyun.oss.endpoint}")
String endpoint;
@Value("${aliyun.oss.accessKeyId}")
String accessKeyId;
@Value("${aliyun.oss.accessKeySecrect}")
String accessKeySecrect;
@Value("${aliyun.oss.bucketName}")
String bucketName;
@Value("${aliyun.oss.region}")
String region;
@Bean("AliOssClient")
public OSS aliOssClient() {
CredentialsProvider credentialsProvider = new CredentialsProvider() {
@Override
public Credentials getCredentials() {
return new DefaultCredentials(accessKeyId, accessKeySecrect);
}
@Override
public void setCredentials(Credentials credentials) {
}
};
try {
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
return OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
} catch (Exception exception) {
log.error(exception.getMessage(), exception);
}
return null;
}
}

View File

@ -0,0 +1,54 @@
package com.mall.thirdParty.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableKnife4j
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.ANY)
@Slf4j
public class Knife4jConfig {
@Value("${server.port}")
private String port;
@Bean
public OpenAPI openAPI() {
String url = "http://localhost:" + port;
// 作者等信息
Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url(url);
// 使用协议
License license = new License().name("MIT").url("https://mit-license.org");
// 相关信息
Info info = new Info().title("Bunny-Admin")
.contact(contact).license(license)
.description("BunnyMall商城")
.summary("Bunny商城")
.termsOfService(url)
.version("v0.0.1");
return new OpenAPI().info(info).externalDocs(new ExternalDocumentation());
}
@Bean
public GroupedOpenApi all() {
return GroupedOpenApi.builder().group("全部请求接口").pathsToMatch("/api/**").build();
}
@Bean
public GroupedOpenApi product() {
return GroupedOpenApi.builder().group("第三方请求接口").pathsToMatch("/api/third-party/**").build();
}
}

View File

@ -0,0 +1,29 @@
package com.mall.thirdParty.controller;
import com.mall.common.domain.vo.result.Result;
import com.mall.thirdParty.service.AliOssService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Tag(name = "阿里云上传文件", description = "阿里云上传文件相关接口")
@RestController
@RequestMapping("/api/third-party")
@RequiredArgsConstructor
public class AliOssController {
private final AliOssService aliOssService;
@GetMapping("/oss/policy")
@Operation(summary = "oss请求Token", description = "oss请求Token")
public Result<Map<String, String>> getPostSignatureForOssUpload() {
Map<String, String> vo = aliOssService.getPostSignatureForOssUpload();
return Result.success(vo);
}
}

View File

@ -0,0 +1,12 @@
package com.mall.thirdParty.service;
import java.util.Map;
public interface AliOssService {
/**
* OSS获取服务端签名
*
* @return OSS服务端签名
*/
Map<String, String> getPostSignatureForOssUpload();
}

View File

@ -0,0 +1,61 @@
package com.mall.thirdParty.service.ext;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class AliOssServiceImplExt {
/**
* 通过指定有效的时长生成过期时间
*
* @param seconds 有效时长
* @return ISO8601 时间字符串"2014-12-01T12:00:00.000Z"
*/
public static String generateExpiration(long seconds) {
// 获取当前时间戳以秒为单位
long now = Instant.now().getEpochSecond();
// 计算过期时间的时间戳
long expirationTime = now + seconds;
// 将时间戳转换为Instant对象并格式化为ISO8601格式
Instant instant = Instant.ofEpochSecond(expirationTime);
// 定义时区为UTC
ZoneId zone = ZoneOffset.UTC;
// Instant 转换为 ZonedDateTime
ZonedDateTime zonedDateTime = instant.atZone(zone);
// 定义日期时间格式例如2023-12-03T13:00:00.000Z
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
// 格式化日期时间
// 输出结果
return zonedDateTime.format(formatter);
}
public static byte[] hmacsha256(byte[] key, String data) {
try {
// 初始化HMAC密钥规格指定算法为HMAC-SHA256并使用提供的密钥
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");
// 获取Mac实例并通过getInstance方法指定使用HMAC-SHA256算法
Mac mac = Mac.getInstance("HmacSHA256");
// 使用密钥初始化Mac对象
mac.init(secretKeySpec);
// 执行HMAC计算通过doFinal方法接收需要计算的数据并返回计算结果的数组
return mac.doFinal(data.getBytes());
} catch (Exception e) {
throw new RuntimeException("Failed to calculate HMAC-SHA256", e);
}
}
public static byte[] calculateSigningKey(String accesskeysecret, String date, String region) {
byte[] dateKey = hmacsha256(("aliyun_v4" + accesskeysecret).getBytes(), date);
byte[] dateRegionKey = hmacsha256(dateKey, region);
byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss");
return hmacsha256(dateRegionServiceKey, "aliyun_v4_request");
}
}

View File

@ -0,0 +1,84 @@
package com.mall.thirdParty.service.impl;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mall.thirdParty.client.AliOssClient;
import com.mall.thirdParty.service.AliOssService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.mall.thirdParty.service.ext.AliOssServiceImplExt.*;
@Service
@RequiredArgsConstructor
public class AliOssServiceImpl implements AliOssService {
private final AliOssClient aliOssClient;
/**
* OSS获取服务端签名
*
* @return OSS服务端签名
*/
@SneakyThrows
public Map<String, String> getPostSignatureForOssUpload() {
// 基础信息获取
String accesskeyid = aliOssClient.getAccessKeyId();
String accesskeysecret = aliOssClient.getAccessKeySecrect();
String uploadDir = "images/" + LocalDate.now().format(DateTimeFormatter.ISO_DATE);
String region = aliOssClient.getRegion();
String bucket = aliOssClient.getBucketName();
// 时间格式化
ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
String date = now.format(DateTimeFormatter.BASIC_ISO_DATE);
String xOssDate = now.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'"));
String xOssCredential = String.format("%s/%s/%s/oss/aliyun_v4_request", accesskeyid, date, region);
// 创建policy
Map<String, Object> policy = new HashMap<>();
policy.put("expiration", generateExpiration(3600L));
List<Object> conditions = Arrays.asList(
Map.of("bucket", bucket),
Map.of("x-oss-signature-version", "OSS4-HMAC-SHA256"),
Map.of("x-oss-credential", xOssCredential),
Map.of("x-oss-date", xOssDate),
Arrays.asList("content-length-range", 1, 10240000),
Arrays.asList("eq", "$success_action_status", "200"),
Arrays.asList("starts-with", "$key", uploadDir)
);
policy.put("conditions", conditions);
// 签名计算
String jsonPolicy = new ObjectMapper().writeValueAsString(policy);
String stringToSign = Base64.encodeBase64String(jsonPolicy.getBytes());
byte[] signingKey = calculateSigningKey(accesskeysecret, date, region);
String signature = BinaryUtil.toHex(hmacsha256(signingKey, stringToSign));
// 构建返回结果
return Map.of(
"version", "OSS4-HMAC-SHA256",
"policy", stringToSign,
"x_oss_credential", xOssCredential,
"x_oss_date", xOssDate,
"signature", signature,
"dir", uploadDir,
"accessId", aliOssClient.getAccessKeyId(),
"host", aliOssClient.getEndpoint()
);
}
}

View File

@ -0,0 +1,22 @@
spring:
cloud:
nacos:
server-addr: bunny-web.site:8848
config:
import-check:
enabled: true
server-addr: bunny-web.site:8848
namespace: 9e2b0e65-7823-4897-97bb-7095a3e4f74f
group: DEFAULT_GROUP
refresh-enabled: true
config:
import:
- nacos:oss.yml
logging:
file:
path: "logs/${spring.application.name}"
level:
com.mall.product: debug
root: info

View File

@ -0,0 +1,27 @@
server:
port: 8081
spring:
profiles:
active: dev
application:
name: service-third-party
main:
allow-bean-definition-overriding: true
devtools:
livereload:
port: 0
jackson:
date-format: yyyy-MM-dd HH:mm:ss
aliyun:
oss:
endpoint: "https://oss-cn-shanghai.aliyuncs.com"
accessKeyId: LTAI5tMynexvsUvznfXXL6x4
accessKeySecrect: 8H3EwbyvCKQ9FiTpnRzOojmHg1NKpg
bucketName: bunny-mall-cloud
region: cn-shanghai
# LTAI5tMynexvsUvznfXXL6x4
# 8H3EwbyvCKQ9FiTpnRzOojmHg1NKpg

View File

@ -0,0 +1,13 @@
,-----. ,--. ,--. ,--.,--.
| |) /_ ,--.,--.,--,--, ,--,--, ,--. ,--. | `.' | ,--,--.| || |
| .-. \| || || \| \ \ ' / | |'.'| |' ,-. || || |
| '--' /' '' '| || || || | \ ' | | | |\ '-' || || |
`------' `----' `--''--'`--''--'.-' / `--' `--' `--`--'`--'`--'
`---'
Service Name${spring.application.name}
SpringBoot Version: ${spring-boot.version}${spring-boot.formatted-version}
Spring Active${spring.profiles.active}

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>logback</contextName>
<!-- 格式化 年--日 输出 -->
<timestamp key="datetime" datePattern="yyyy-MM-dd"/>
<!-- 引入Spring属性 -->
<springProperty name="APP_NAME" source="spring.application.name" defaultValue="application"/>
<!--编码-->
<property name="ENCODING" value="UTF-8"/>
<!-- 控制台日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 临界值过滤器 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>
%cyan([%thread %d{yyyy-MM-dd HH:mm:ss}]) %yellow(%-5level) %green(%logger{100}).%boldRed(%method)-%boldMagenta(%line)-%blue(%msg%n)
</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<!-- 文件日志 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/${APP_NAME}/${datetime}.log</file>
<append>true</append>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n</pattern>
<charset>${ENCODING}</charset>
</encoder>
</appender>
<!-- 让SpringBoot内部日志ERROR级别 减少日志输出 -->
<logger name="org.springframework" level="ERROR" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<!-- 让mybatis整合包日志ERROR 减少日志输出 -->
<logger name="org.mybatis" level="ERROR" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<!-- 让ibatis 日志ERROR 减少日志输出 -->
<logger name="org.apache.ibatis" level="ERROR" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<!-- 让 tomcat包打印日志 日志ERROR 减少日志输出 -->
<logger name="org.apache" level="ERROR" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<!-- 我们自己开发的程序为DEBUG -->
<logger name="cn.bunny" level="DEBUG" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<logger name="com.baomidou" level="ERROR" additivity="false">
<appender-ref ref="STOUT"/>
</logger>
<!-- 根日志记录器INFO级别 -->
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>

View File

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>400 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 400 - Bad Request</h1>
<dl>
<dt>错误说明:因为错误的语法导致服务器无法理解请求信息。</dt>
<dt>原因1客户端发起的请求不符合服务器对请求的某些限制或者请求本身存在一定的错误。</dt>
<dd>解决办法:</dd>
<dd>链接中有特殊字符或者链接长度过长导致,请对应修改.</dd>
<dt>原因2request header 或者 cookie 过大所引起</dt>
<dd>解决办法:</dd>
<dd>crtl+shift+delete 快捷键清除cookie.</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>403 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>403 - Forbidden 禁止访问: 访问被拒绝</h1>
<dl>
<dt>错误说明:禁止访问,服务器拒绝访问</dt>
<dt>原因1未找到默认的索引文件</dt>
<dd>解决办法:</dd>
<dd>IIS中【启用默认内容文档】选项中将默认打开文档修改为程序首页文件格式index.html或者index.php</dd>
<dt>原因2文件夹安全权限导致</dt>
<dd>解决办法:</dd>
<dd>程序文件-右击-属性-安全-Users-修改为读取和执行权限</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>404 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 50px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>404 - Page Not Found 未找到</h1>
<dl>
<dt>错误说明:请求的页面不存在</dt>
<dt>原因1访问的文档权限不够</dt>
<dd>解决办法:</dd>
<dd>修改文件权限为755windos系统修改目录权限为可写可读。</dd>
<dt>原因2防火墙的原因</dt>
<dd>解决办法:</dd>
<dd>先关闭让防火墙通过WWW服务。</dd>
<dt>原因3站点根目录无默认访问文件</dt>
<dd>解决办法:</dd>
<dd>在根目录中创建index.html或者创建index.php。</dd>
<dt>原因4站点配置目录不正确</dt>
<dd>解决办法:</dd>
<dd>将网站应用程序复制到站点目录中,或者修改站点配置目录指定到应用程序目录中。</dd>
<dt>原因5站点使用了伪静态</dt>
<dd>解决办法:</dd>
<dd>将伪静态规则删除,或者重新编写正确的伪静态规则,或关闭伪静态配置。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8">
<title>500 - 服务器错误</title>
<meta content="width=device-width, maximum-scale=1, initial-scale=1" name="viewport"/>
<style>
html, body {
height: 100%;
}
body {
color: #333;
margin: auto;
padding: 1em;
display: table;
user-select: none;
box-sizing: border-box;
font: lighter 20px "微软雅黑";
}
a {
color: #3498db;
text-decoration: none;
}
h1 {
margin-top: 0;
font-size: 3.5em;
}
main {
margin: 0 auto;
text-align: center;
display: table-cell;
vertical-align: middle;
}
.btn {
color: #fff;
padding: .75em 1em;
background: #3498db;
border-radius: 1.5em;
display: inline-block;
transition: opacity .3s, transform .3s;
}
.btn:hover {
transform: scale(1.1);
}
.btn:active {
opacity: .7;
}
</style>
</head>
<body>
<main>
<h1>:'(</h1>
<p>服务器开小差啦!管理员正在修理中...</p>
<p>还请阁下静候站点恢复~</p>
</main>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>501 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 501 - Not Implemented</h1>
<dl>
<dt>错误说明:服务器没有相应的执行动作来完成当前请求。</dt>
<dt>原因1Web 服务器不支持实现此请求所需的功能</dt>
<dd>解决办法:</dd>
<dd>可以用来HttpWebRequest指定一个UserAgent来试试的有时候你可以换电脑来测试一下的。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>502 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 50px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 502 - Bad Gateway 没有响应</h1>
<dl>
<dt>错误说明坏的网关http向后端节点请求没有响应</dt>
<dt>原因1DNS 缓冲</dt>
<dd>解决办法:</dd>
<dd>在dos窗口运行 ipconfig /flushdns该命令会刷新DNS缓冲。</dd>
<dt>原因2浏览器代理</dt>
<dd>解决办法:</dd>
<dd>关掉代理。</dd>
<dt>原因3dns 被劫持了即使使用国外的dns也会被劫持</dt>
<dd>解决办法:</dd>
<dd>
去掉VPN服务器的DNS。切换另外的dns。在windows系统中可以在本地网络连接的属性中去掉默认的dns选用国外的dns比如google的或opendns。
</dd>
<dt>原因4php执行超时</dt>
<dd>解决办法:</dd>
<dd>修改/usr/local/php/etc/php.ini 将max_execution_time 改为300。</dd>
<dt>原因5nginx等待时间超时</dt>
<dd>解决办法:</dd>
<dd>适当增加nginx.conf配置文件中FastCGI的timeout时间。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>503 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 503 - Service Unavailable 服务不可用</h1>
<dl>
<dt>错误说明:服务当前不可用</dt>
<dt>原因1服务不可用状态</dt>
<dd>解决办法:</dd>
<dd>服务器或许就是正在维护或者暂停了,你可以联系一下服务器空间商。</dd>
<dt>原因2程序占用资源太多</dt>
<dd>解决办法:</dd>
<dd>通过设置应用程序池把账户改为NetworkService即可解决。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>504 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 50px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 504 - Gateway Timeout 网关超时</h1>
<dl>
<dt>错误说明:网关超时,服务器响应时间,达到超出设定的范围</dt>
<dt>原因1后端电脑之间 IP 通讯缓慢而产生</dt>
<dd>解决办法:</dd>
<dd>如果您的 Web 服务器由某一网站托管, 只有负责那个网站设置的人员才能解决这个问题。</dd>
<dt>原因2由于nginx默认的fastcgi进程响应的缓冲区太小造成的错误</dt>
<dd>解决办法:</dd>
<dd>一般默认的fastcgi进程响应的缓冲区是8K这时可以设置大一点在nginx.conf里加入fastcgi_buffers 8
128k这表示设置fastcgi缓冲区为8块128k大小的空间。当然如果在进行某一项即时的操作, 可能需要nginx的超时参数调大点,
例如设置成60秒:send_timeout 60;经过这两个参数的调整一般不会再提示“504 Gateway Time-out”错误问题基本解决。
</dd>
<dt>原因3PHP环境的配置问题</dt>
<dd>解决办法:</dd>
<dd>更改php-fpm的几处配置 把max_children由之前的10改为现在的30这样就可以保证有充足的php-cgi进程可以被使用
把request_terminate_timeout由之前的0s改为60s这样php-cgi进程 处理脚本的超时时间就是60秒可以防止进程都被挂起提高利用效率。
接着再更改nginx的几个配置项减少FastCGI的请求次数尽量维持buffers不变 fastcgi_buffers由 4 64k 改为 2
256k fastcgi_buffer_size 由 64k 改为 128K fastcgi_busy_buffers_size 由 128K 改为 256K
fastcgi_temp_file_write_size 由 128K 改为 256K。 重新加载php-fpm和nginx的配置再次测试如果没有出现“504
Gateway Time-out”错误问题解决。
</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,72 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>505 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 505 - HTTP Version Not Supported</h1>
<dl>
<dt>错误说明HTTP 版本不受支持。</dt>
<dt>原因1您的 Web 服务器不支持,或拒绝支持客户端(如您的浏览器)在发送给服务器的 HTTP 请求数据流中指定的 HTTP
协议版本
</dt>
<dd>解决办法:</dd>
<dd>升级您的 Web 服务器软件。</dd>
<dt>原因2http请求格式的错误</dt>
<dd>解决办法:</dd>
<dd>对照一下自己的代码从打印的信息中终于找到问题所在。可能在请求后面多加了一个空格。http协议真是很严格了。
</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>506 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 506 - Variant Also Negotiates</h1>
<dl>
<dt>错误说明:</dt>
<dt>原因1服务器存在内部配置错误</dt>
<dd>解决办法:</dd>
<dd>被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>507 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 507 - Insufficient Storage</h1>
<dl>
<dt>错误说明:</dt>
<dt>原因1服务器无法存储完成请求所必须的内容</dt>
<dd>解决办法:</dd>
<dd>这个状况被认为是临时的。WebDAV (RFC 4918)。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>509 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 509 - Bandwidth Limit Exceeded</h1>
<dl>
<dt>错误说明:</dt>
<dt>原因1网站流量已经超出您所购买的方案限制即服务器达到带宽限制</dt>
<dd>解决办法:</dd>
<dd>1.升级方案 2.等到下个月后流量重新计算,网站即可正常浏览。</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>510 错误 - phpstudy</title>
<meta content="" name="keywords">
<meta content="" name="description">
<meta content="webkit" name="renderer">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="telephone=no" name="format-detection">
<meta CONTENT="no-cache" HTTP-EQUIV="pragma">
<meta CONTENT="no-store, must-revalidate" HTTP-EQUIV="Cache-Control">
<meta CONTENT="Wed, 26 Feb 1997 08:21:57 GMT" HTTP-EQUIV="expires">
<meta CONTENT="0" HTTP-EQUIV="expires">
<style>
body {
font: 16px arial, 'Microsoft Yahei', 'Hiragino Sans GB', sans-serif;
}
h1 {
margin: 0;
color: #3a87ad;
font-size: 26px;
}
.content {
width: 45%;
margin: 0 auto;
}
.content > div {
margin-top: 200px;
padding: 20px;
background: #d9edf7;
border-radius: 12px;
}
.content dl {
color: #2d6a88;
line-height: 40px;
}
.content div div {
padding-bottom: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="content">
<div>
<h1>HTTP 510 - Not Extended</h1>
<dl>
<dt>错误说明:</dt>
<dt>原因1获取资源所需要的策略并没有被满足</dt>
<dd>解决办法:</dd>
<dd>需要请求有额外的扩展内容,服务器才能处理请求。</dd>
</dl>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

View File

@ -0,0 +1,266 @@
<!DOCTYPE html>
<html lang="zh-cn" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>谷粒商城 - 第三方插件模块</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" th:href="@{/webjars/bootstrap/5.1.3/css/bootstrap.min.css}">
<!-- Font Awesome -->
<link rel="stylesheet" th:href="@{/webjars/font-awesome/5.15.4/css/all.min.css}">
<style>
:root {
--primary-color: #4e73df;
--secondary-color: #1cc88a;
--dark-color: #5a5c69;
}
body {
font-family: 'Nunito', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: #f8f9fc;
}
.hero-section {
background: linear-gradient(135deg, var(--primary-color) 0%, #224abe 100%);
color: white;
padding: 5rem 0;
margin-bottom: 3rem;
border-radius: 0 0 20px 20px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.feature-card {
border: none;
border-radius: 15px;
transition: transform 0.3s, box-shadow 0.3s;
margin-bottom: 20px;
height: 100%;
}
.feature-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
.feature-icon {
font-size: 2.5rem;
margin-bottom: 1rem;
color: var(--primary-color);
}
.btn-primary {
background-color: var(--primary-color);
border-color: var(--primary-color);
}
.btn-success {
background-color: var(--secondary-color);
border-color: var(--secondary-color);
}
.api-doc-btn {
background-color: #f6c23e;
border-color: #f6c23e;
color: #000;
}
.footer {
background-color: var(--dark-color);
color: white;
padding: 2rem 0;
margin-top: 3rem;
}
</style>
</head>
<body>
<!-- 导航栏 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brandEntity" href="/">
<i class="fas fa-shopping-bag me-2"></i>谷粒商城
</a>
<button class="navbar-toggler" data-bs-target="#navbarNav" data-bs-toggle="collapse" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link active" href="/">第三方插件模块</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/swagger-ui/index.html" target="_blank">Swagger API文档</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- 英雄区域 -->
<section class="hero-section text-center">
<div class="container">
<h1 class="display-4 fw-bold mb-4">谷粒商城第三方插件模块</h1>
<p class="lead mb-4">基于Java 17和Spring Boot 3.x的全新版本</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<a class="btn btn-lg api-doc-btn me-sm-3" href="/doc.html" target="_blank">
<i class="fas fa-book me-2"></i>查看API文档
</a>
<a class="btn btn-lg btn-light" href="https://gitee.com/BunnyBoss/mall-cloud.git" target="_blank">
<i class="fab fa-github me-2"></i>GitHub仓库
</a>
</div>
</div>
</section>
<!-- 特性介绍 -->
<section class="container mb-5">
<div class="row text-center mb-4">
<div class="col">
<h2 class="fw-bold">核心特性</h2>
<p class="text-muted">第三方插件模块提供丰富的扩展功能和集成能力</p>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-puzzle-piece"></i>
</div>
<h3>插件扩展</h3>
<p class="text-muted">支持热插拔式插件扩展,动态加载和卸载功能模块。</p>
</div>
</div>
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-plug"></i>
</div>
<h3>第三方集成</h3>
<p class="text-muted">预集成支付、物流、短信等常用第三方服务接口。</p>
</div>
</div>
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-cogs"></i>
</div>
<h3>配置管理</h3>
<p class="text-muted">统一管理插件配置,支持运行时动态调整参数。</p>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-shield-alt"></i>
</div>
<h3>安全沙箱</h3>
<p class="text-muted">插件运行在安全沙箱中,隔离系统核心功能。</p>
</div>
</div>
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-bolt"></i>
</div>
<h3>快速接入</h3>
<p class="text-muted">标准化接入流程,快速对接新第三方服务。</p>
</div>
</div>
<div class="col-md-4">
<div class="card feature-card p-4">
<div class="feature-icon">
<i class="fas fa-chart-bar"></i>
</div>
<h3>性能监控</h3>
<p class="text-muted">实时监控插件性能,保障系统稳定运行。</p>
</div>
</div>
</div>
</section>
<!-- 技术栈 -->
<section class="bg-light py-5">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-6 mb-4 mb-lg-0">
<h2 class="fw-bold mb-4">现代化技术栈</h2>
<ul class="list-unstyled">
<li class="mb-3">
<i class="fas fa-check-circle text-success me-2"></i>
<strong>Java 17</strong> - 使用最新的LTS版本
</li>
<li class="mb-3">
<i class="fas fa-check-circle text-success me-2"></i>
<strong>Spring Boot 3.x</strong> - 企业级开发框架
</li>
<li class="mb-3">
<i class="fas fa-check-circle text-success me-2"></i>
<strong>Knife4j</strong> - 强大的API文档工具
</li>
<li class="mb-3">
<i class="fas fa-check-circle text-success me-2"></i>
<strong>Thymeleaf</strong> - 现代化模板引擎
</li>
</ul>
</div>
<div class="col-lg-6">
<img alt="技术架构图" class="img-fluid rounded shadow" src="/images/architecture-diagram.jpg">
</div>
</div>
</div>
</section>
<!-- 快速开始 -->
<section class="container my-5">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="fw-bold mb-4">快速开始</h2>
<div class="card bg-dark text-white text-start mb-4">
<div class="card-body">
<code class="text-white">
# 克隆项目<br>
git clone https://gitee.com/BunnyBoss/mall-cloud.git<br><br>
# 启动第三方插件模块<br>
cd mall-cloud<br>
mvn spring-boot:run
</code>
</div>
</div>
<a class="btn btn-primary btn-lg px-4" href="/doc.html" target="_blank">
<i class="fas fa-rocket me-2"></i>立即体验API
</a>
</div>
</div>
</section>
<!-- 页脚 -->
<footer class="footer text-center">
<div class="container">
<div class="row">
<div class="col-lg-12">
<p class="mb-0">© 2023 谷粒商城 - 第三方插件模块. 基于Java 17的全新版本.</p>
<p class="mb-0">
<a class="text-white me-3" href="#"><i class="fab fa-github"></i></a>
<a class="text-white me-3" href="#"><i class="fab fa-twitter"></i></a>
<a class="text-white" href="#"><i class="fab fa-linkedin"></i></a>
</p>
</div>
</div>
</div>
</footer>
<!-- JavaScript -->
<script th:src="@{/webjars/jquery/3.6.0/jquery.min.js}"></script>
<script th:src="@{/webjars/bootstrap/5.1.3/js/bootstrap.bundle.min.js}"></script>
</body>
</html>

View File

@ -0,0 +1,82 @@
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception {
CredentialsProvider credentialsProvider = new CredentialsProvider() {
// 初始化变量
final String accessKeyId = "LTAI5tMynexvsUvznfXXL6x4";
// 初始化变量
final String accessKeySecrect = "8H3EwbyvCKQ9FiTpnRzOojmHg1NKpg";
// 初始化变量
// String token = null;
@Override
public Credentials getCredentials() {
// 返回长期凭证 access_key_id, access_key_secrect
return new DefaultCredentials(accessKeyId, accessKeySecrect);
// 返回 临时凭证 access_key_id, access_key_secrect, token
// 对于临时凭证需要根据过期时间刷新凭证
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
@Override
public void setCredentials(Credentials credentials) {
}
};
// Endpoint以华东1杭州为例其它Region请按实际情况填写
String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
// 从环境变量中获取访问凭证运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
// EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称例如examplebucket
String bucketName = "bunny-mall-cloud";
// 填写Object完整路径完整路径中不能包含Bucket名称例如exampledir/exampleobject.txt
String objectName = "images/5b5e74d0978360a1.jpg";
// 如果未指定本地路径则默认从示例程序所属项目对应本地路径中上传文件
String filePath = "F:\\文档&学习\\学习\\谷粒商城\\基础篇\\资料\\pics\\5b5e74d0978360a1.jpg";
// 填写Bucket所在地域以华东1杭州为例Region填写为cn-hangzhou
String region = "cn-shanghai";
// 创建OSSClient实例
// 当OSSClient实例不再使用时调用shutdown方法以释放资源
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 创建PutObjectRequest对象
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// 上传文件
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
ossClient.shutdown();
}
}
}

View File

@ -0,0 +1,54 @@
package com.mall.thirdParty.config;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.mall.thirdParty.client.AliOssClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
@SpringBootTest
class AliOssClientTest {
@Autowired
private OSS ossClient;
@Autowired
private AliOssClient aliOssClient;
@Test
public void test() {
// 填写Object完整路径完整路径中不能包含Bucket名称例如exampledir/exampleobject.txt
String objectName = "images/73ab4d2e818d2211.jpg";
// 如果未指定本地路径则默认从示例程序所属项目对应本地路径中上传文件
String filePath = "F:\\文档&学习\\学习\\谷粒商城\\基础篇\\资料\\pics\\73ab4d2e818d2211.jpg";
try {
// 创建PutObjectRequest对象
String bucketName = aliOssClient.getBucketName();
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// 上传文件
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
ossClient.shutdown();
}
}
}

View File

@ -4,7 +4,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
<version>3.3.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
@ -70,7 +70,7 @@
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.3</version>
<version>2023.0.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>