先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
//调用方法查询
this.gotoPage(1)
},
//课程第一次查询
initCourseFirst() {
courseApi.getConditionPage(1, 8, this.searchObj).then((resp) => {
this.data = resp.data.data;
});
},
//查询所有一级分类
initSubject() {
courseApi.getAllSubject().then((resp) => {
this.subjectNestedList = resp.data.data.list;
// this.subSubjectList = resp.data.data.list.children
});
},
//分页切换方法
gotoPage(page) {
courseApi.getConditionPage(page, 8, this.searchObj).then((resp) => {
this.data = resp.data.data;
});
},
//点击某个一级分类,查询对应的二级分类
seacherOne(subjectParentId, index) {
//把传递来的index赋值给ondex,为了active样式生效
// this.oneIndex = index
// this.twoIndex = -1
// this.searchObj.subjectId=‘’
// this.subSubjectList=[]
//把一级分类点击的id值,赋值给searchObj
this.searchObj.subjectParentId = subjectParentId;
//点击某个一级分类进行条件查询
this.gotoPage(1);
//拿着点击的一级分类id 和 所有一级分类id进行比较
//如果id相同,从那个一级分类中获取他的二级分类
for (let i = 0; i < this.subjectNestedList.length; i++) {
//获取每个一级分类
var oneSubject = this.subjectNestedList[i];
//比较id是否相同
if (oneSubject.id == subjectParentId) {
this.subSubjectList = oneSubject.children;
}
}
},
//点击某个二级分类实现查询
searchTwo(subjectId, index) {
//把index赋值,为了样式生效
this.twoIndex = index;
//把二级分类点击id值,赋给searchObj
this.searchObj.subjectId = subjectId;
//点击某个二级分类进行调节查询
this.gotoPage(1);
},
},
created() {
//课程第一次查询
this.initCourseFirst();
//一级分类显示
this.initSubject();
},
};
3、页面
全部课程
课程类别
-
v-for=“subjectNested in subjectNestedList”
:key=“subjectNested.id”
<a
:title=“subjectNested.title”
@click=“seacherOne(subjectNested.id, index)”
href=“#”
{{ subjectNested.title }}</a
<a
:title=“subject.title”
@click=“searchTwo(subject.id, index)”
href=“#”
{{ subject.title }}</a
1/
1
<a
title=“销量”
href=“javascript:void(0);”
@click=“searchBuyCount()”
销量
↓
<a
title=“最新”
href=“javascript:void(0);”
@click=“searchGmtCreate()”
最新
↓
<a
title=“价格”
href=“javascript:void(0);”
@click=“searchPrice()”
价格
↓
<span class=“c-666 fsize14 ml10 vam”
没有相关数据,小编正在努力整理 中…</span
<img
:src=“item.cover”
class=“img-responsive”
:alt=“item.title”
/>
<a
href=“/course/1”
title=“开始学习”
class=“comm-btn c- btn-1”
开始学习</a
<a
href=“/course/1”
:title=“item.title”
class=“course-title fsize18 c-333”
{{ item.title }}</a
<span
class=“fr jgTag bg-green”
v-if=“Number(item.price) === 0”
免费
9634人学习
|
9634评论
<a
:class=“{ undisable: !data.hasPrevious }”
href=“#”
title=“首页”
@click.prevent=“gotoPage(1)”
首</a
<a
:class=“{ undisable: !data.hasPrevious }”
href=“#”
title=“前一页”
@click.prevent=“gotoPage(data.current - 1)”
<</a
<a
v-for=“page in data.pages”
:key=“page”
:class="{
current: data.current == page,
undisable: data.current == page,
}"
:title=“‘第’ + page + ‘页’”
href=“#”
@click.prevent=“gotoPage(page)”
{{ page }}</a
<a
:class=“{ undisable: !data.hasNext }”
href=“#”
title=“后一页”
@click.prevent=“gotoPage(data.current + 1)”
></a
<a
:class=“{ undisable: !data.hasNext }”
href=“#”
title=“末页”
@click.prevent=“gotoPage(data.pages)”
末</a
4、测试
===============================================================
- controller
com.achang.eduservice.controller.front.CourseFrontController
@RestController
@CrossOrigin
@RequestMapping(“/eduservice/courseFront”)
public class CourseFrontController {
@Autowired
private EduCourseService eduCourseService;
@Autowired
private EduChapterService eduChapterService;
…
//课程详情的方法
@GetMapping(“/getFrontCourseInfo/{courseId}”)
public R getFrontCourseInfo(@PathVariable String courseId){
//根据课程id,编写sql语句查询课程信息
CourseWebVo courseWebVo = eduCourseService.getBaseCourseInfo(courseId);
//根据课程id,查询章节和小节信息
List chapterVideoList = eduChapterService.getChapterVideoByCourseId(courseId);
return R.ok().data(“courseWebVo”,courseWebVo).data(“chapterVideoList”,chapterVideoList);
}
}
- service
接口
//前台根据课程id,查询课程基础信息
CourseWebVo getBaseCourseInfo(String courseId);
Impl
//前台根据课程id,查询课程基础信息
@Override
public CourseWebVo getBaseCourseInfo(String courseId) {
return baseMapper.getBaseCourseInfo(courseId);
}
- dao
EduCourseMapper接口
@Component
public interface EduCourseMapper extends BaseMapper {
…
//前台根据课程id,查询课程基础信息
CourseWebVo getBaseCourseInfo(String courseId);
}
Impl实现类xml文件
SELECT
ec.id,
ec.title,
ec.cover,
ec.lesson_num AS lessonNum,
ec.price,
ec.cover,
ec.buy_count as buyCount,
ec.view_count as viewCount,
esd.description,
s1.title AS subjectLevelOne,
s1.id as subjectLevelOneId,
s2.id as subjectLevelTwoId,
s2.title AS subjectLevelTwo,
t.name AS teacherName,
t.id as teacherId,
t.avatar,
t.intro
FROM
edu_course ec
LEFT JOIN edu_teacher t ON ec.teacher_id = t.id
LEFT JOIN edu_subject s1 ON ec.subject_parent_id = s1.id
LEFT JOIN edu_subject s2 ON ec.id = s2.id
left join edu_course_description esd on ec.id = esd.id
WHERE
ec.id = #{id}
- 记得要指定xml配置文件配置,在properties配置文件中
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/achang/eduservice/mapper/xml/*.xml
- 测试
- api
guli-front\api\course.js
import request from ‘@/utils/request’
export default{
…
//根据课程id,查询课程详细信息
getFrontCourseInfo(courseId){
return request({
url:
/eduservice/courseFront/getFrontCourseInfo/${courseId}
,method: ‘get’
})
}
}
- 页面js脚本
pages/course/_id.vue
- 页面html
\
course.subjectLevelOne
}}
\
{{ course.subjectLevelTwo }}
<img
:src=“course.cover”
:alt=“course.title”
class=“dis c-v-pic”
height=“355px”
width=“630px”
/>
{{ course.title }}
价格:
<b class=“c-yellow” style=“font-size: 24px”
¥{{ course.price }}</b
<span class=“c-fff fsize14”
主讲: {{ course.teacherName }} </span
<a href=“#” title=“立即观看” class=“comm-btn c-btn-3”
立 即 观 看</a
销量
{{ course.buyCount }}
课时数
{{ course.lessonNum }}
浏览数
{{ course.viewCount }}
id=“c-i-tabTitle”
class=“c-infor-tabTitle c-tab- title”
课程介绍
{{ course.description }}
课程大纲
<a
href=“javascript: void(0)”
:title=“chapter.title”
class=“current-1”
{{chapter.title}}
-
免费试听
</em
{{video.title}}
<img
:src=“course.avatar”
width=“50”
height=“50”
alt
/>
{{course.intro}}
- 测试效果
===================================================================
获取播放地址
参考文档: https://help.aliyun.com/document_detail/61064.html
前面的 03-使用服务端SDK 介绍了如何获取非加密视频的播放地址。直接使用03节的例子获取加密视频播放地址会返回如下错误信息
因此在testGetPlayInfo 测试方法中 添加 ResultType 参数,并设置为true
privateParams.put(“ResultType”, “Multiple”);
此种方式获取的视频文件不能直接播放,必须使用阿里云播放器播放
参考文档: https://help.aliyun.com/document_detail/61109.html
1 、视频播放器介绍
阿里云播放器 SDK ( ApsaraVideo Player SDK )是阿里视频服务的重要一环,除了支持点播和直播的基
础播放功能外,深度融合视频云业务,如支持视频的加密播放、安全下载、清晰度切换、直播答题等业
务场景,为用户提供简单、快速、安全、稳定的视频播放服务。
2 、集成视频播放器
参考文档: https://help.aliyun.com/document_detail/51991.html
参考 【播放器简单使用说明】一节
引入脚本文件和 css 文件
href=“https://g.alicdn.com/de/prismplayer/2.8.1/skins/default/aliplayer-min.css” />
初始化视频播放器
3、播放地址播放
在 Aliplayer 的配置参数中添加如下属性
//播放方式一:支持播放地址播放,此播放优先级最高,此种方式不能播放加密视频
source : ‘你的视频播放地址’,
启动浏览器运行,测试视频的播放
- 效果
4 、播放凭证播放(推荐)
阿里云播放器支持通过播放凭证自动换取播放地址进行播放,接入方式更为简单,且安全性更高。播放
凭证默认时效为100秒(最大为3000秒),只能用于获取指定视频的播放地址,不能混用或重复使用。
如果凭证过期则无法获取播放地址,需要重新获取凭证。
encryptType:‘1’,//如果播放加密视频,则需设置encryptType=1,非加密视频无需设置此项
vid : ‘视频id’,
playauth : ‘视频授权码’,
注意:播放凭证有过期时间,默认值:100秒 。取值范围:100~3000。
设置播放凭证的有效期
在获取播放凭证的测试用例中添加如下代码
request.setAuthInfoTimeout(200L);
在线配置参考:https://player.alicdn.com/aliplayer/setting/setting.html
====================================================================
- VodController
//根据视频id获取视频凭证
@GetMapping(“/getPlayAuth/{id}”)
public R getPlayAuth(@PathVariable String id){
try {
String playAuth = vodService.getPlayAuth(id);
return R.ok().data(“PlayAuth”,playAuth);
} catch (Exception e) {
e.printStackTrace();
throw new AchangException(20001,“获取视频凭证失败”);
}
}
- service
接口
//根据视频id获取视频凭证
String getPlayAuth(String id);
impl
//根据视频id获取视频凭证
@Override
public String getPlayAuth(String id) {
String accesskeyId = ConstantVodUtils.ACCESSKEY_ID;
String accesskeySecret = ConstantVodUtils.ACCESSKEY_SECRET;
try {
//创建初始化对象
DefaultAcsClient cl = InitObject.initVodClient(accesskeyId,accesskeySecret);
//创建获取视频地址request对象和response对象
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
//向request对象设置视频id值
request.setVideoId(id);
GetVideoPlayAuthResponse response = cl.getAcsResponse(request);
//获取视频播放凭证
return response.getPlayAuth();
} catch (ClientException e) {
e.printStackTrace();
throw new AchangException(20001,“获取视频凭证失败”);
}
}
- ConstantVodUtils
@Component
public class ConstantVodUtils implements InitializingBean {
@Value(“${aliyun.vod.file.keyid}”)
private String accessKeyId;
@Value(“${aliyun.vod.file.keysecret}”)
private String accessKeySecret;
public static String ACCESSKEY_ID;
public static String ACCESSKEY_SECRET;
@Override
public void afterPropertiesSet() throws Exception {
ACCESSKEY_ID = this.accessKeyId;
ACCESSKEY_SECRET = this.accessKeySecret;
}
}
- InitObject
//初始化类
public class InitObject {
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
String regionId = “cn-shanghai”; // 点播服务接入区域
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
sskeyId = ConstantVodUtils.ACCESSKEY_ID;String accesskeySecret = ConstantVodUtils.ACCESSKEY_SECRET;
try {
//创建初始化对象
DefaultAcsClient cl = InitObject.initVodClient(accesskeyId,accesskeySecret);
//创建获取视频地址request对象和response对象
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
//向request对象设置视频id值
request.setVideoId(id);
GetVideoPlayAuthResponse response = cl.getAcsResponse(request);
//获取视频播放凭证
return response.getPlayAuth();
} catch (ClientException e) {
e.printStackTrace();
throw new AchangException(20001,“获取视频凭证失败”);
}
}
- ConstantVodUtils
@Component
public class ConstantVodUtils implements InitializingBean {
@Value(“${aliyun.vod.file.keyid}”)
private String accessKeyId;
@Value(“${aliyun.vod.file.keysecret}”)
private String accessKeySecret;
public static String ACCESSKEY_ID;
public static String ACCESSKEY_SECRET;
@Override
public void afterPropertiesSet() throws Exception {
ACCESSKEY_ID = this.accessKeyId;
ACCESSKEY_SECRET = this.accessKeySecret;
}
}
- InitObject
//初始化类
public class InitObject {
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
String regionId = “cn-shanghai”; // 点播服务接入区域
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-5umhGPka-1713122639453)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!