由于尚硅谷的视频是通过Eclipse软件来做的,其中有些操作与IDEA上有所区别,所以我在这里将IDEA区别于Eclipse的操作、操作过程中涉及的源码(与视频的源码略有出入)以及大家可能遇到的种种问题分享给大家,这些源码在我这里均是通过测试的,仅供参考!
1 OSS服务
按照工程文档一步步操作就可以,这里不再截图演示。
2 OSS整合至项目
2.1 Pom配置
修改project-consumer\pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入springboot&redis整合场景 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 引入springboot&springsession整合场景 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
</dependencies>
2.2 主启动类&OSSProperties&application
新建project-consumer\src\main\java\com\atguigu\crowd\CrowdMainClass.java
package com.atguigu.crowd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
//启用Feign客户端功能
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class CrowdMainClass {
public static void main(String[] args) {
SpringApplication.run(CrowdMainClass.class, args);
}
}
新建project-consumer\src\main\java\com\atguigu\crowd\config\OSSProperties.java
package com.atguigu.crowd.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OSSProperties {
private String endPoint;
private String bucketName;
private String accessKeyId;
private String accessKeySecret;
private String bucketDomain;
}
新建project-consumer\src\main\resources\application.yml
server:
port: 5000
spring:
application:
name: atguigu-crowd-project
thymeleaf:
prefix: classpath:/templates/
suffix: .html
redis:
host: 127.0.0.1
session:
store-type: redis
eureka:
client:
service-url:
defaultZone: http://localhost:1000/eureka
aliyun:
oss:
access-key-id: LTAI5tF97XxYjpbT8z5yEzf2
access-key-secret: ixnXE8Q8LMvk7H41zAuegitMHTKrRm
bucket-domain: 961147939.oss-cn-beijing.aliyuncs.com
bucket-name: 961147939
end-point: oss-cn-beijing.aliyuncs.com
注:OSS里面五项均需要填报在第1步申请服务时获得的数据!!
2.3 后端部分
修改util\pom.xml
<!-- OSS客户端SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.14.0</version>
</dependency>
修改util\src\main\java\com\atguigu\crowd\util\CrowdUtil.java
/**
* 专门负责上传文件到OSS服务器的工具方法
* @param endpoint OSS参数
* @param accessKeyId OSS参数
* @param accessKeySecret OSS参数
* @param inputStream 要上传的文件的输入流
* @param bucketName OSS参数
* @param bucketDomain OSS参数
* @param originalName 要上传的文件的原始文件名
* @return 包含上传结果以及上传的文件在OSS上的访问路径
*/
public static ResultEntity<String> uploadFileToOss(
String endpoint,
String accessKeyId,
String accessKeySecret,
InputStream inputStream,
String bucketName,
String bucketDomain,
String originalName) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 生成上传文件的目录
String folderName = new SimpleDateFormat("yyyyMMdd").format(new Date());
// 生成上传文件在OSS服务器上保存时的文件名
// 原始文件名:beautfulgirl.jpg
// 生成文件名:wer234234efwer235346457dfswet346235.jpg
// 使用UUID生成文件主体名称
String fileMainName = UUID.randomUUID().toString().replace("-", "");
// 从原始文件名中获取文件扩展名
String extensionName = originalName.substring(originalName.lastIndexOf("."));
// 使用目录、文件主体名称、文件扩展名称拼接得到对象名称
String objectName = folderName + "/" + fileMainName + extensionName;
try {
// 调用OSS客户端对象的方法上传文件并获取响应结果数据
PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
// 从响应结果中获取具体响应消息
ResponseMessage responseMessage = putObjectResult.getResponse();
// 根据响应状态码判断请求是否成功
if(responseMessage == null) {
// 拼接访问刚刚上传的文件的路径
String ossFileAccessPath = bucketDomain + "/" + objectName;
// 当前方法返回成功
return ResultEntity.successWithData(ossFileAccessPath);
} else {
// 获取响应状态码
int statusCode = responseMessage.getStatusCode();
// 如果请求没有成功,获取错误消息
String errorMessage = responseMessage.getErrorResponseAsString();
// 当前方法返回失败
return ResultEntity.failed("当前响应状态码="+statusCode+" 错误消息="+errorMessage);
}
} catch (Exception e) {
e.printStackTrace();
// 当前方法返回失败
return ResultEntity.failed(e.getMessage());
} finally {
if(ossClient != null) {
// 关闭OSSClient。
ossClient.shutdown();
}
}
}
3 跳转到发起项目页面
3.1 前端部分
修改authentication-consumer\src\main\resources\templates\member-center.html
<div class="list-group-item " style="cursor:pointer;">
<a th:href="@{/member/my/crowd}">我的众筹</a><span class="badge"><i class="glyphicon glyphicon-chevron-right"></i></span>
</div>
新建authentication-consumer\src\main\resources\templates\member-crowd.html
<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<base th:href="@{/}"/>
<link rel="stylesheet" href="bootstrap/css/bootstrap.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="css/theme.css">
<script src="jquery/jquery-3.6.0.js"></script>
<script src="bootstrap/js/bootstrap.js"></script>
<script src="script/docs.min.js"></script>
<script src="script/back-to-top.js"></script>
<style>
#footer {
padding: 15px 0;
background: #fff;
border-top: 1px solid #ddd;
text-align: center;
}
#topcontrol {
color: #fff;
z-index: 99;
width: 30px;
height: 30px;
font-size: 20px;
background: #222;
position: relative;
right: 14px !important;
bottom: 11px !important;
border-radius: 3px !important;
}
#topcontrol:after {
/*top: -2px;*/
left: 8.5px;
content: "\f106";
position: absolute;
text-align: center;
font-family: FontAwesome;
}
#topcontrol:hover {
color: #fff;
background: #18ba9b;
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
}
</style>
</head>
<body>
<div class="navbar-wrapper">
<div class="container">
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#" style="font-size:32px;">尚筹网-创意产品众筹平台</a>
</div>
<div id="navbar" class="navbar-collapse collapse" style="float:right;">
<ul class="nav navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="glyphicon glyphicon-user"></i> [[${session.loginMember.username}]] <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="member.html"><i class="glyphicon glyphicon-scale"></i> 会员中心</a></li>
<li><a href="#"><i class="glyphicon glyphicon-comment"></i> 消息</a></li>
<li class="divider"></li>
<li><a href="index.html" th:href="@{/auth/member/logout}"><i class="glyphicon glyphicon-off"></i> 退出系统</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</div>
</div>
<div class="container">
<div class="row clearfix">
<div class="col-sm-3 col-md-3 column">
<div class="row">
<div class="col-md-12">
<div class="thumbnail" style=" border-radius: 0px;">
<img src="img/services-box1.jpg" class="img-thumbnail" alt="A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera">
<div class="caption" style="text-align:center;">
<h3>
[[${session.loginMember.username}]]
</h3>
<span class="label label-danger" style="cursor:pointer;" onclick="window.location.href='cert.html'">未实名认证</span>
</div>
</div>
</div>
</div>
<div class="list-group">
<div class="list-group-item" style="cursor:pointer;" onclick="window.location.href='member.html'">
资产总览<span class="badge"><i class="glyphicon glyphicon-chevron-right"></i></span>
</div>
<div class="list-group-item active">
我的众筹<span class="badge"><i class="glyphicon glyphicon-chevron-right"></i></span>
</div>
</div>
</div>
<div class="col-sm-9 col-md-9 column">
<ul id="myTab" style="" class="nav nav-pills" role="tablist">
<li role="presentation" class="active"><a href="#home" role="tab" data-toggle="tab" aria-controls="home" aria-expanded="true">我的众筹</a></li>
<li role="presentation"><a href="#profile">众筹资产</a></li>
</ul>
<div id="myTabContent" class="tab-content" style="margin-top:10px;">
<div role="tabpanel" class="tab-pane fade active in" id="home" aria-labelledby="home-tab">
<ul id="myTab1" class="nav nav-tabs">
<li role="presentation" class="active"><a href="#support">我支持的</a></li>
<li role="presentation"><a href="#attension">我关注的</a></li>
<li role="presentation"><a href="#add">我发起的</a></li>
<li class=" pull-right">
<button type="button" class="btn btn-warning" onclick="window.location.href='start.html'">发起众筹</button>
</li>
</ul>
<div id="myTab1" class="tab-content" style="margin-top:10px;">
<div role="tabpanel" class="tab-pane fade active in" id="support" aria-labelledby="home-tab">
<div class="container-fluid">
<div class="row clearfix">
<div class="col-md-12 column">
<span class="label label-warning">全部</span> <span class="label" style="color:#000;">已支付</span> <span class="label " style="color:#000;">未支付</span>
</div>
<div class="col-md-12 column" style="margin-top:10px;padding:0;">
<table class="table table-bordered" style="text-align:center;">
<thead>
<tr style="background-color:#ddd;">
<td>项目信息</td>
<td width="90">支持日期</td>
<td width="120">支持金额(元)</td>
<td width="80">回报数量</td>
<td width="80">交易状态</td>
<td width="120">操作</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align:middle;">
<div class="thumbnail">
<div class="caption">
<h3>
活性富氢净水直饮机
</h3>
<p>
订单编号:2x002231111
</p>
<p>
<div style="float:left;"><i class="glyphicon glyphicon-screenshot" title="目标金额" ></i> 已完成 100% </div>
<div style="float:right;"><i title="截至日期" class="glyphicon glyphicon-calendar"></i> 剩余8天 </div>
</p>
<br>
<div class="progress" style="margin-bottom: 4px;">
<div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">
<span >众筹中</span>
</div>
</div>
</div>
</div>
</td>
<td style="vertical-align:middle;">2017-05-23 11:31:22</td>
<td style="vertical-align:middle;">1.00<br>(运费:0.00 )</td>
<td style="vertical-align:middle;">1</td>
<td style="vertical-align:middle;">交易关闭</td>
<td style="vertical-align:middle;">
<div class="btn-group-vertical" role="group" aria-label="Vertical button group">
<button type="button" class="btn btn-default">删除订单</button>
<button type="button" class="btn btn-default">交易详情</button>
</div>
</td>
</tr>
<tr>
<td style="vertical-align:middle;">
<div class="thumbnail">
<div class="caption">
<h3>
BAVOSN便携折叠移动电源台灯
</h3>
<p>
订单编号:2x002231111
</p>
<p>
<div style="float:left;"><i class="glyphicon glyphicon-screenshot" title="目标金额" ></i> 已完成 100% </div>
<div style="float:right;"><i title="截至日期" class="glyphicon glyphicon-calendar"></i> 剩余8天 </div>
</p>
<br>
<div class="progress" style="margin-bottom: 4px;">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">
<span >众筹成功</span>
</div>
</div>
</div>
</div>
</td>
<td style="vertical-align:middle;">2017-05-23 11:31:22</td>
<td style="vertical-align:middle;">1.00<br>(运费:0.00 )</td>
<td style="vertical-align:middle;">1</td>
<td style="vertical-align:middle;">交易关闭</td>
<td style="vertical-align:middle;">
<div class="btn-group-vertical" role="group" aria-label="Vertical button group">
<button type="button" class="btn btn-default">删除订单</button>
<button type="button" class="btn btn-default">交易详情</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="attension" aria-labelledby="attension-tab">
<div class="container-fluid">
<div class="row clearfix">
<div class="col-md-12 column" style="padding:0;">
<table class="table table-bordered" style="text-align:center;">
<thead>
<tr style="background-color:#ddd;">
<td>项目信息</td>
<td width="120">支持人数</td>
<td width="120">关注人数</td>
<td width="120">操作</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align:middle;">
<div class="thumbnail">
<div class="caption">
<p>
BAVOSN便携折叠移动电源台灯
</p>
<p>
<i class="glyphicon glyphicon-jpy"></i> 已筹集 1000.0元
</p>
<p>
<div style="float:left;"><i class="glyphicon glyphicon-screenshot" title="目标金额" ></i> 已完成 100% </div>
<div style="float:right;"><i class="glyphicon glyphicon-calendar"></i> 剩余2天 </div>
</p>
<br>
<div class="progress" style="margin-bottom: 4px;">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">
<span >众筹中</span>
</div>
</div>
</div>
</div>
</td>
<td style="vertical-align:middle;">1</td>
<td style="vertical-align:middle;">1</td>
<td style="vertical-align:middle;">
<div class="btn-group-vertical" role="group" aria-label="Vertical button group">
<button type="button" class="btn btn-default">取消关注</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade " id="add" aria-labelledby="add-tab">
<div class="container-fluid">
<div class="row clearfix">
<div class="col-md-12 column">
<span class="label label-warning">全部</span> <span class="label" style="color:#000;">众筹中</span> <span class="label " style="color:#000;">众筹成功</span> <span class="label " style="color:#000;">众筹失败</span>
</div>
<div class="col-md-12 column" style="padding:0;margin-top:10px;">
<table class="table table-bordered" style="text-align:center;">
<thead>
<tr style="background-color:#ddd;">
<td>项目信息</td>
<td width="120">募集金额(元)</td>
<td width="80">当前状态</td>
<td width="120">操作</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align:middle;">
<div class="thumbnail">
<div class="caption">
<p>
BAVOSN便携折叠移动电源台灯
</p>
<p>
<div style="float:left;"><i class="glyphicon glyphicon-screenshot" title="目标金额" ></i> 已完成 100% </div>
<div style="float:right;"><i title="截至日期" class="glyphicon glyphicon-calendar"></i> 剩余8天 </div>
</p>
<br>
<div class="progress" style="margin-bottom: 4px;">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">
<span >众筹中</span>
</div>
</div>
</div>
</div>
</td>
<td style="vertical-align:middle;">1.00<br>(运费:0.00 )</td>
<td style="vertical-align:middle;">草稿</td>
<td style="vertical-align:middle;">
<div class="btn-group-vertical" role="group" aria-label="Vertical button group">
<button type="button" class="btn btn-default">项目预览</button>
<button type="button" class="btn btn-default">修改项目</button>
<button type="button" class="btn btn-default">删除项目</button>
<button type="button" class="btn btn-default">问题管理</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="profile" aria-labelledby="profile-tab">
众筹资产
</div>
</div>
</div>
</div>
</div>
<div class="container" style="margin-top:20px;">
<div class="row clearfix">
<div class="col-md-12 column">
<div id="footer">
<div class="footerNav">
<a rel="nofollow" href="http://www.atguigu.com">关于我们</a> | <a rel="nofollow" href="http://www.atguigu.com">服务条款</a> | <a rel="nofollow" href="http://www.atguigu.com">免责声明</a> | <a rel="nofollow" href="http://www.atguigu.com">网站地图</a> | <a rel="nofollow" href="http://www.atguigu.com">联系我们</a>
</div>
<div class="copyRight">
Copyright ?2017-2017atguigu.com 版权所有
</div>
</div>
</div>
</div>
</div>
<script>
$('#myTab a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
$('#myTab1 a').click(function (e) {
e.preventDefault()
$(this).tab('show')
})
</script>
</body>
</html>
修改authentication-consumer\src\main\java\com\atguigu\crowd\config\CrowdWebMvcConfig.java
registry.addViewController("/member/my/crowd").setViewName("member-crowd");
3.2 测试
进入资产总览页面,点击我的众筹即可进入:
3.3 Zuul重定向地址
修改authentication-consumer\src\main\java\com\atguigu\crowd\handler\MemberHandler.java
return "redirect:http://www.crowd.com/";
return "redirect:http://www.crowd.com/auth/member/to/center/page";
return "redirect:http://www.crowd.com/auth/member/to/login/page";
等一切重定向地址均添加crowd.com前缀
3.4 login参数无法序列化处理
修改atcrowdfunding09-member-entity\src\main\java\com\atguigu\crowd\entity\vo\MemberLoginVO.java
public class MemberLoginVO implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String email;
}
3.5 Zuulfilter反序列化处理
修改zuul\src\main\java\com\atguigu\crowd\filter\CrowdAccessFilter.java
// 3.尝试从 Session 对象中获取已登录用户
MemberLoginVO loginMember = (MemberLoginVO) session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER);
并根据提示增加entity的依赖即可
3.6 crowd.com 系列测试