目 录
第1章 绪论 1
1.1研究背景及意义 1
1.2 国内外研究现状 1
1.3 研究工作和论文结构 2
第2章 相关技术 3
2.1 HTML 和Python 语言 3
2.2 知识图谱 3
2.3 数据库技术 4
2.4 Django 框架 4
第3章 系统分析 5
3.1 总体需求分析 5
3.2 功能需求分析 5
3.2.1学生数据采集模块功能需求分析 5
3.2.2教学资源管理模块功能需求分析 6
3.2.3个性化学习推荐模块功能需求分析 6
3.3 基于知识图谱的非功能需求分析 7
3.4 基于知识图谱的系统可行性分析 8
第4章 系统设计 9
4.1 系统功能设计 9
4.1.1 用户模块设计 9
4.1.2 用户行为采集模块设计 10
4.1.3 个性化推荐模块设计 11
4.1.4 后台管理模块设计 12
4.2 数据库设计 13
4.2.1 数据库概念设计 13
4.2.2 数据表设计 14
第5章 系统实现 17
5.1 系统开发环境 17
5.2 用户模块实现 17
5.3 用户行为采集模块实现 22
5.4 个性化推荐模块实现 25
5.5 后台管理模块实现 26
第6章 系统测试 30
6.1 系统测试环境 30
6.2 用户模块测试 30
6.3 用户行为采集模块测试 31
6.4 个性化推荐模块测试 31
6.5 后台管理模块测试 32
第7章 总结与展望 34
参考文献 35
致 谢 36
1.3 研究工作和论文结构
首先,本系统针对不同用户的不同需要,推送适合的学习资源。同时能为使用者创造一个更方便认识自身不足并加以弥补的平台,提高使用者学习能力。系统大体上包括以下四个模型板块。第一,用户模块:对于个体单独用户,第一次登陆的用户需要先注册自己的用户后再进行登录,在注册之后过一段时间才可以完善和修改自己的个人信息等;第二,用户行为采集模块:个人用户可对自身浏览过的学习资料进行打分评价,以及收藏或删除收藏资料等操作;第三,个性化推荐模块:在用户的注册进入主页之后,能够查看系统按照该用户的兴趣爱好所推送得出的学习资料;第四,后台管理模块,赋予平台管理员管理用户自己的信息和学习资源信息等的权利。
本篇论文用全网络平台公开的学习资源未基础的数据库,从创建系统需要用到的主要技术、系统可行性分析、系统的功能性能和非功能性能的分析和设计系统的仔细情况、系统现实的情况和测试情况进行分析研究,一共有七部分内容。
第一章绪论。从本题的国内外研究背景开始,以个性化学习推荐系统的国内外情况和发展趋势为基础阐述研究发明的问题,最后表达本题主要研究的是什么东西。
第二章相关技术。开头对个性化推荐系统进行简要的阐述,然后叙述了要实现个性化学习系统需要使用到的框架和需要应用到的相关技术。
第三章系统分析。首先对系统进行可行性分析,然后对系统的功能需求进行阐述。
第四章系统设计。先叙述了系统的整个设计流程,然后阐述了整个系统数据库的概念框架设计的流程,描述了整个系统数据库概念架构设计的E-R图,最后以数据表为基础详细设计实体。
第五章系统实现。阐述开发的环境,仔细说明了用户模块、用户行为采集模块、个性化推荐模块、后台管理模块这四个功能模块如何实现。
第六章系统测试。介绍测试环境,仔细测试用户模块、用户行为采集模块、个性化推荐模块和后台管理模块这四个模块,最后得到的测试结果与最开始的期望效果一致。
第七章总结与展望。总结系统在进行本课题研究时,前期所进行的工作及其有关技术手段,并说明在系统下进一步研究可以扩展的方向及其进行方式。
<template>
<div class="content" :style='{"minHeight":"100vh","padding":"0","alignItems":"flex-start","textAlign":"center","flexWrap":"wrap","background":"none","display":"block","justifyContent":"center","height":"auto"}'>
<div class="text" :style='{"padding":"20px 0 0","margin":"0 auto","color":"#333","textAlign":"center","background":"url() no-repeat center top","width":"100%","fontSize":"32px","fontWeight":"bold"}'>欢迎使用 {{this.$project.projectName}}</div>
<div class="cardView">
<div class="cards" :style='{"margin":"50px auto","alignItems":"center","flexWrap":"wrap","background":"none","display":"flex","width":"100%","justifyContent":"center"}'>
<div :style='{"border":"0px solid #ccc","margin":"0 0px 10px","borderRadius":"0px","background":"none","display":"flex","width":"80%","justifyContent":"center"}' v-if="isAuth('yonghu','首页总数')">
<div :style='{"borderColor":"#c7ebdb","background":"url(http://codegen.caihongy.cn/20230216/4a480d618e3e48c7bd50cafd078d2b9c.png) no-repeat center center / auto 80%","borderWidth":"1px 0 1px 1px","width":"auto","minWidth":"200px","borderStyle":"solid","height":"120px"}'></div>
<div :style='{"borderColor":"#c7ebdb","alignItems":"center","flexDirection":"column","background":"#fff","borderWidth":"1px","display":"flex","width":"auto","minWidth":"50%","borderStyle":"solid","justifyContent":"center"}'>
<div :style='{"margin":"5px 0","lineHeight":"24px","fontSize":"20px","color":"#333","fontWeight":"bold","height":"24px"}'>{{yonghuCount}}</div>
<div :style='{"margin":"5px 0","lineHeight":"24px","fontSize":"16px","color":"#666","height":"24px"}'>用户总数</div>
</div>
</div>
<div :style='{"border":"0px solid #ccc","margin":"0 0px 10px","borderRadius":"0px","background":"none","display":"flex","width":"80%","justifyContent":"center"}' v-if="isAuth('xuexishipin','首页总数')">
<div :style='{"borderColor":"#c7ebdb","background":"url(http://codegen.caihongy.cn/20230216/4a480d618e3e48c7bd50cafd078d2b9c.png) no-repeat center center / auto 80%","borderWidth":"1px 0 1px 1px","width":"auto","minWidth":"200px","borderStyle":"solid","height":"120px"}'></div>
<div :style='{"borderColor":"#c7ebdb","alignItems":"center","flexDirection":"column","background":"#fff","borderWidth":"1px","display":"flex","width":"auto","minWidth":"50%","borderStyle":"solid","justifyContent":"center"}'>
<div :style='{"margin":"5px 0","lineHeight":"24px","fontSize":"20px","color":"#333","fontWeight":"bold","height":"24px"}'>{{xuexishipinCount}}</div>
<div :style='{"margin":"5px 0","lineHeight":"24px","fontSize":"16px","color":"#666","height":"24px"}'>学习视频总数</div>
</div>
</div>
</div>
<div style="display: flex;align-items: center;width: 100%;margin-bottom: 10px;">
<el-card style="width: 33.3%;margin: 0 10px;" v-if="isAuth('yonghu','首页统计')">
<div id="yonghuChart1" style="width:100%;height:400px;"></div>
</el-card>
<el-card style="width: 33.3%;margin: 0 10px;" v-if="isAuth('yonghu','首页统计')">
<div id="yonghuChart2" style="width:100%;height:400px;"></div>
</el-card>
<el-card style="width: 33.3%;margin: 0 10px;" v-if="isAuth('xuexishipin','首页统计')">
<div id="xuexishipinChart" style="width:100%;height:400px;"></div>
</el-card>
</div>
</div>
</div>
</template>
<script>
//3
import router from '@/router/router-static'
import * as echarts from 'echarts'
export default {
data() {
return {
yonghuCount: 0,
xuexishipinCount: 0,
};
},
mounted(){
this.init();
this.getyonghuCount();
this.yonghuChat1();
this.yonghuChat2();
this.getxuexishipinCount();
this.xuexishipinChat();
},
methods:{
init(){
if(this.$storage.get('Token')){
this.$http({
url: `${this.$storage.get('sessionTable')}/session`,
method: "get"
}).then(({ data }) => {
if (data && data.code != 0) {
router.push({ name: 'login' })
}
});
}else{
router.push({ name: 'login' })
}
},
getyonghuCount() {
this.$http({
url: `yonghu/count`,
method: "get"
}).then(({
data
}) => {
if (data && data.code == 0) {
this.yonghuCount = data.data
}
})
},
yonghuChat1() {
this.$nextTick(()=>{
var yonghuChart1 = echarts.init(document.getElementById("yonghuChart1"),'macarons');
this.$http({
url: "yonghu/group/xingbie",
method: "get",
}).then(({ data }) => {
if (data && data.code === 0) {
let res = data.data;
let xAxis = [];
let yAxis = [];
let pArray = []
for(let i=0;i<res.length;i++){
xAxis.push(res[i].xingbie);
yAxis.push(parseFloat((res[i].total)));
pArray.push({
value: parseFloat((res[i].total)),
name: res[i].xingbie
})
}
var option = {};
option = {
title: {
text: '性别占比',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{b} : {c}'
},
xAxis: {
type: 'category',
data: xAxis
},
yAxis: {
type: 'value'
},
series: [{
data: yAxis,
type: 'bar'
}]
};
// 使用刚指定的配置项和数据显示图表。
yonghuChart1.setOption(option);
//根据窗口的大小变动图表
window.onresize = function() {
yonghuChart1.resize();
};
}
});
})
},
yonghuChat2() {
this.$nextTick(()=>{
var yonghuChart2 = echarts.init(document.getElementById("yonghuChart2"),'macarons');
this.$http({
url: "yonghu/sectionStat/nianling",
method: "get",
}).then(({ data }) => {
if (data && data.code === 0) {
let res = data.data;
let xAxis = [];
let yAxis = [];
let pArray = []
for(let i=0;i<res.length;i++){
xAxis.push(res[i].nianling);
yAxis.push(parseFloat((res[i].total)));
pArray.push({
value: parseFloat((res[i].total)),
name: res[i].nianling
})
}
var option = {};
option = {
title: {
text: '年龄占比',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{b} : {c}'
},
xAxis: {
type: 'category',
data: xAxis
},
yAxis: {
type: 'value'
},
series: [{
data: yAxis,
type: 'bar'
}]
};
// 使用刚指定的配置项和数据显示图表。
yonghuChart2.setOption(option);
//根据窗口的大小变动图表
window.onresize = function() {
yonghuChart2.resize();
};
}
});
})
},
getxuexishipinCount() {
this.$http({
url: `xuexishipin/count`,
method: "get"
}).then(({
data
}) => {
if (data && data.code == 0) {
this.xuexishipinCount = data.data
}
})
},
xuexishipinChat() {
this.$nextTick(()=>{
var xuexishipinChart = echarts.init(document.getElementById("xuexishipinChart"),'macarons');
this.$http({
url: "xuexishipin/group/xuexileixing",
method: "get",
}).then(({ data }) => {
if (data && data.code === 0) {
let res = data.data;
let xAxis = [];
let yAxis = [];
let pArray = []
for(let i=0;i<res.length;i++){
xAxis.push(res[i].xuexileixing);
yAxis.push(parseFloat((res[i].total)));
pArray.push({
value: parseFloat((res[i].total)),
name: res[i].xuexileixing
})
var option = {};
option = {
title: {
text: '学习视频',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{b} : {c} ({d}%)'
},
series: [
{
type: 'pie',
radius: ['25%', '55%'],
center: ['50%', '60%'],
data: pArray,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
xuexishipinChart.setOption(option);
//根据窗口的大小变动图表
window.onresize = function() {
xuexishipinChart.resize();
};
}
}
});
// xcolumn ycolumn
})
},
}
};
</script>
<style lang="scss" scoped>
.cardView {
display: flex;
flex-wrap: wrap;
width: 100%;
.cards {
display: flex;
align-items: center;
width: 100%;
margin-bottom: 10px;
justify-content: center;
.card {
width: calc(25% - 20px);
margin: 0 10px;
/deep/.el-card__body{
padding: 0;
}
}
}
}
</style>