谷粒学院项目笔记6——oss、EasyExcel、课程分类、nginx
尚硅谷谷粒學(xué)院項(xiàng)目第六天內(nèi)容之對(duì)象存儲(chǔ)oss服務(wù)、使用EasyExcel添加課程分類功能、課程列表分類、ningx的使用
對(duì)象存儲(chǔ)oss
打開(kāi)阿里云官網(wǎng)——對(duì)象存儲(chǔ)——oss管理控制臺(tái)
創(chuàng)建bucket:選擇默認(rèn)地域、低頻訪問(wèn)、公共讀
創(chuàng)建oss許可證
對(duì)象存儲(chǔ)oss——概覽——常用入口——Access key
?點(diǎn)擊繼續(xù)使用Accesskey
創(chuàng)建AccessKey——復(fù)制——確定
在service下創(chuàng)建SpringBoot子模塊service_oss
引入依賴
<!-- 阿里云oss依賴 --> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--日期工具欄依賴--> <dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId> </dependency>配置application.properties
注意:地域節(jié)點(diǎn)、key、密鑰要換成你自己的
#服務(wù)端口 server.port=8002 #服務(wù)名 spring.application.name=service-oss #環(huán)境設(shè)置:dev、test、prod spring.profiles.active=dev #阿里云 OSS aliyun.oss.file.endpoint=oss-cn-hangzhou.aliyuncs.com aliyun.oss.file.keyid=LTAI5t6R5cWusp7MeWpKgT1W aliyun.oss.file.keysecret=Dd6Ku0j5dQja9jh4d7cl8ULepWcNE7 #bucket aliyun.oss.file.bucketname=bucket--a創(chuàng)建啟動(dòng)類,啟動(dòng)模塊
報(bào)錯(cuò)
在啟動(dòng)類上添加:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)創(chuàng)建一個(gè)常量類,用來(lái)讀取配置文件中的屬性值
創(chuàng)建utils.ConstantRead類
@Component public class ConstantRead implements InitializingBean {@Value("${aliyun.oss.file.endpoint}")private String endpoint;@Value("${aliyun.oss.file.keyid}")private String keyId;@Value("${aliyun.oss.file.keysecret}")private String keySecret;@Value("${aliyun.oss.file.bucketname}")private String bucketName;public static String ENDPOINT;public static String KEY_ID;public static String KEY_SECRET;public static String BUCKET_NAME;@Overridepublic void afterPropertiesSet() throws Exception {ENDPOINT=endpoint;KEY_ID=keyId;KEY_SECRET=keySecret;BUCKET_NAME=bucketName;} }創(chuàng)建OssController
@RestController @RequestMapping("/ossservice") public class OssController {@Autowiredprivate OssService ossService;//上傳頭像@PostMapping("uploadAvatar")public R uploadFile(MultipartFile file){String url = ossService.uploadAvatar(file);return R.ok().data("url",url);}}創(chuàng)建OssService
@Service public interface OssService {//上傳頭像String uploadAvatar(MultipartFile file); }創(chuàng)建OssServiceImpl
@Component public class OssServiceImpl implements OssService {@Overridepublic String uploadAvatar(MultipartFile file) {String endpoint = ConstantRead.ENDPOINT;String accessKeyId = ConstantRead.KEY_ID;String accessKeySecret = ConstantRead.KEY_SECRET;String bucketName = ConstantRead.BUCKET_NAME;String filename = file.getOriginalFilename();OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {InputStream inputStream = file.getInputStream();// 創(chuàng)建PutObject請(qǐng)求。ossClient.putObject(bucketName, filename, inputStream);} catch (Exception e) {e.printStackTrace();} finally {if (ossClient != null) {ossClient.shutdown();}}return "http://"+bucketName+"."+endpoint+"/"+filename;} }swagger測(cè)試
如果多個(gè)用戶上傳的文件名字相同,后上傳的文件會(huì)把先上傳的文件覆蓋掉
我們?cè)谖募凹由蟯uid值,讓每個(gè)文件名都不同
在OssServiceImpl里添加
String filename = file.getOriginalFilename(); String uuid = UUID.randomUUID().toString().replaceAll("-", ""); filename=uuid+filename;此時(shí)上傳的文件都是在bucket的根目錄下
把文件按照日期進(jìn)行分類
在OssServiceImpl里添加
String date = new DateTime().toString("yyyy/MM/dd"); filename=date+"/"+uuid+filename;測(cè)試
nginx:反向代理服務(wù)器
功能:請(qǐng)求轉(zhuǎn)發(fā)、負(fù)載均衡、動(dòng)靜分離
下載windows版的nginx,解壓
在cmd中通過(guò)nginx.exe命令啟動(dòng)
關(guān)閉cmd窗口,nginx不會(huì)關(guān)閉
關(guān)閉nginx:nginx.exe -s stop
配置nginx實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)功能
編輯nginx安裝目錄/conf/nginx.conf
將默認(rèn)端口從80改為81,不改會(huì)端口沖突?
添加端口映射規(guī)則
server {listen 9001;server_name localhost;location ~ /eduservice/ {proxy_pass http://localhost:8001;}location ~ /ossservice/ {proxy_pass http://localhost:8002;} }?將前端模板中config/dev.env.js中的BASE_API端口號(hào)改為9001?
重啟ningx、重啟前后端,測(cè)試
講師上傳頭像功能
將組件 ImageCropper和PanThumb 復(fù)制到項(xiàng)目中的 src/components 目錄下
在save.vue中添加上傳頭像的組件
<!-- 講師頭像 --><el-form-item label="講師頭像"><!-- 頭銜縮略圖 --><pan-thumb :image="teacher.avatar"/><!-- 文件上傳按鈕 --><el-button type="primary" icon="el-icon-upload" @click="imagecropperShow=true">更換頭像</el-button><!--v-show:這個(gè)組件是否顯示:key:類似于id,如果一個(gè)頁(yè)面多個(gè)圖片上傳控件,可以做區(qū)分@crop-upload-success:上傳成功后的回調(diào) field:這個(gè)組件的name@close:關(guān)閉組件時(shí)會(huì)調(diào)用close()方法--><image-cropperv-show="imagecropperShow" :width="300":height="300":key="imagecropperKey":url="BASE_API+'/eduoss/fileoss'"field="file"@close="close"@crop-upload-success="cropSuccess"/></el-form-item>引入組件?
import ImageCropper from '@/components/ImageCropper' import PanThumb from '@/components/PanThumb'聲明組件
?components: { ImageCropper, PanThumb },?
定義變量
imagecropperShow:false,imagecropperKey:0,BASE_API:process.env.BASE_API,修改上傳url
寫兩個(gè)方法
close(){this.imagecropperShow=false},cropSuccess(data){ //data是后端返回的數(shù)據(jù),相當(dāng)于response.data,這里做了封裝this.imagecropperShow=falsethis.teacher.avatar=data.url},上傳了頭像后,再次點(diǎn)擊更換頭像,出現(xiàn)上傳成功字樣,而不是“將圖片拖拽至此處”
解決:
改變imagecropperKey的值相當(dāng)于讓上傳組件初始化?
?課程分類管理模塊
?課程分類使用二級(jí)分類:通過(guò)parentId實(shí)現(xiàn)
創(chuàng)建edu_subject表
CREATE TABLE `edu_subject` (`id` char(19) NOT NULL COMMENT '課程類別ID',`title` varchar(10) NOT NULL COMMENT '類別名稱',`parent_id` char(19) NOT NULL DEFAULT '0' COMMENT '父ID',`sort` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序字段',`gmt_create` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',`gmt_modified` datetime NOT NULL COMMENT '更新時(shí)間',PRIMARY KEY (`id`),KEY `idx_parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='課程科目';向edu_subject表中添加數(shù)據(jù)
INSERT INTO `edu_subject` VALUES ('1178214681118568449','后端開(kāi)發(fā)','0',1,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681139539969','Java','1178214681118568449',1,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681181483010','前端開(kāi)發(fā)','0',3,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681210843137','JavaScript','1178214681181483010',4,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681231814658','云計(jì)算','0',5,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681252786178','Docker','1178214681231814658',5,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681294729217','Linux','1178214681231814658',6,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681324089345','系統(tǒng)/運(yùn)維','0',7,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681353449473','Linux','1178214681324089345',7,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681382809602','Windows','1178214681324089345',8,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681399586817','數(shù)據(jù)庫(kù)','0',9,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681428946945','MySQL','1178214681399586817',9,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681454112770','MongoDB','1178214681399586817',10,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681483472898','大數(shù)據(jù)','0',11,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681504444418','Hadoop','1178214681483472898',11,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681529610242','Spark','1178214681483472898',12,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681554776066','人工智能','0',13,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681584136193','Python','1178214681554776066',13,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681613496321','編程語(yǔ)言','0',14,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178214681626079234','Java','1178214681613496321',14,'2019-09-29 15:47:25','2019-09-29 15:47:25'),('1178585108407984130','Python','1178214681118568449',2,'2019-09-30 16:19:22','2019-09-30 16:19:22'),('1178585108454121473','HTML/CSS','1178214681181483010',3,'2019-09-30 16:19:22','2019-09-30 16:19:22');EasyExcel
EasyExcel是處理excel表格的工具,將excel里的數(shù)據(jù)一行一行讀進(jìn)內(nèi)存,高效簡(jiǎn)單
新建一個(gè)SpringBoot模塊用來(lái)測(cè)試easyexcel
創(chuàng)建excel表格,用于測(cè)試
寫操作
首先,引入依賴,easyecxel(2.1.1)+poi(3.17),版本之間有對(duì)應(yīng)關(guān)系
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>創(chuàng)建與excel表對(duì)應(yīng)的實(shí)體類
@Data public class Entity {@ExcelProperty("學(xué)生編號(hào)")private Integer sno;@ExcelProperty("學(xué)生姓名")private String name; }使用easyexcel向excel表格中寫入數(shù)據(jù)
public class WriteTest {public static void main(String[] args) {String filename="F:\\temp\\test.xlsx";EasyExcel.write(filename,Entity.class).sheet("學(xué)生列表").doWrite(getData());//會(huì)自動(dòng)關(guān)流}public static List<Entity> getData(){ArrayList<Entity> list = new ArrayList<>();for (int i=0;i<10;i++){Entity entity = new Entity();entity.setSno(i);entity.setName("lucy"+i);list.add(entity);}return list;} }執(zhí)行結(jié)果
?讀操作
創(chuàng)建與excel表對(duì)應(yīng)的實(shí)體類
@Data public class ReadEntity {@ExcelProperty(value = "學(xué)生編號(hào)",index = 0)private Integer sno;@ExcelProperty(value = "學(xué)生姓名",index = 1)private String sname; }創(chuàng)建監(jiān)聽(tīng)器
public class EasyExcelListener extends AnalysisEventListener<ReadEntity> {//一行一行讀取數(shù)據(jù)(不讀表頭),數(shù)據(jù)封裝在 readEntity@Overridepublic void invoke(ReadEntity readEntity, AnalysisContext analysisContext) {System.out.println(readEntity);}//讀取表頭@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println(headMap);}//讀取完成后的處理@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {} }使用easyexcel讀excel表格的數(shù)據(jù)
public class ReadTest {public static void main(String[] args) {String filename="F:\\temp\\test.xlsx";EasyExcel.read(filename,ReadEntity.class,new EasyExcelListener()).sheet().doRead();} }?執(zhí)行結(jié)果
課程分類管理功能實(shí)現(xiàn)
生成代碼框架:在service_edu模塊,打開(kāi)之前寫的代碼編輯器:src\test\java\com\jiabei\demo\CodeGenerator.java
修改數(shù)據(jù)庫(kù)表名
?執(zhí)行后生成代碼框架。
添加依賴
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency>? ?
創(chuàng)建與xlsx對(duì)應(yīng)的實(shí)體類?com\jiabei\eduservice\entity\xlsx\SubjectSort.java
@Data public class SubjectSort {@ExcelProperty(index=0)private String oneSubjectName;@ExcelProperty(index=1)private String twoSubjectName; }在實(shí)體類EduSubject中添加屬性自動(dòng)填充注解
@TableId(value = "id", type = IdType.ID_WORKER_STR)private String id; @TableField(fill=FieldFill.INSERT)private Date gmtCreate;@TableField(fill=FieldFill.INSERT_UPDATE)private Date gmtModified;controller
@RestController @RequestMapping("/eduservice/subject") @CrossOrigin public class EduSubjectController {@Autowiredprivate EduSubjectService subjectService;//添加學(xué)科類別:將上傳的xlsx文件添加到數(shù)據(jù)庫(kù)中@PostMapping("addSubjectSort")public R addSubjectSort(MultipartFile file){subjectService.addSubjectSort(file);return R.ok();} }service
public interface EduSubjectService extends IService<EduSubject> {void addSubjectSort(MultipartFile file); }serviceImpl
@Service public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {@Autowiredprivate SubjectSortListener listener;@Overridepublic void addSubjectSort(MultipartFile file) {try {InputStream in = file.getInputStream();EasyExcel.read(in, SubjectSort.class,listener).sheet().doRead();//讀取學(xué)科分類數(shù)據(jù),listener.invoke()監(jiān)聽(tīng)器負(fù)責(zé)將它們讀到數(shù)據(jù)庫(kù)}catch (Exception e){e.printStackTrace();}} }listener
@Component public class SubjectSortListener extends AnalysisEventListener<SubjectSort> {@Autowiredprivate EduSubjectService subjectService;@Overridepublic void invoke(SubjectSort subjectSort, AnalysisContext analysisContext) {if (subjectSort==null){throw new GuliException(20001,"excel表中沒(méi)有數(shù)據(jù),讀取失敗");}String pid = addOne(subjectSort.getOneSubjectName());addTwo(subjectSort.getTwoSubjectName(),pid);}//添加一級(jí)分類private String addOne(String name){QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();queryWrapper.eq("title",name);queryWrapper.eq("parent_id","0");EduSubject subject = subjectService.getOne(queryWrapper);//該分類是否已存在if (subject==null){//不存在時(shí)添加EduSubject s = new EduSubject();s.setParentId("0");s.setTitle(name);subjectService.save(s);}return subjectService.getOne(queryWrapper).getId();}//添加二級(jí)分類private void addTwo(String name,String pid){QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();queryWrapper.eq("title",name);queryWrapper.eq("parent_id",pid);EduSubject subject = subjectService.getOne(queryWrapper);if(subject==null){EduSubject s = new EduSubject();s.setTitle(name);s.setParentId(pid);subjectService.save(s);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) { } }將edu_subject表中數(shù)據(jù)清空,然后swagger測(cè)試,成功把excel表中的數(shù)據(jù)讀到了數(shù)據(jù)庫(kù)
總結(jié)
以上是生活随笔為你收集整理的谷粒学院项目笔记6——oss、EasyExcel、课程分类、nginx的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 知乎热议:为什么华为天才计划博士刚毕业2
- 下一篇: html表白代码