结对作业二
这个作业属于哪个课程 | 2021春软件工程实践S班 |
---|---|
这个作业要求在哪里 | 结对第二次作业 |
结对学号 | 041801114 & 071808114 |
这个作业的目标 | 实现原型的功能 、部署云服务器 |
作业正文 | 结对第二次作业 |
其他参考文献 | 《构建之法》、CSDN上相关文章 |
目录
链接
git仓库链接
代码规范链接
云服务器访问链接
PSP表格
Personal Software Process Stages | 预估耗时 | 实际耗时 |
---|---|---|
计划 | ||
• 估计这个任务需要多少时间 | 10min | 10min |
开发 | ||
• 需求分析 (包括学习新技术) | 30min | 40min |
• 生成设计文档 | 30min | 40min |
• 设计复审 | 10min | 10min |
• 代码规范 (为目前的开发制定合适的规范) | 20min | 30min |
• 具体设计 | 1h | 45min |
• 具体编码 | 16h | 20h |
• 代码复审 | 1h | 2h |
• 测试(自我测试,修改代码,提交修改) | 1h | 4h |
报告 | ||
• 测试报告 | 1h | 2h |
• 计算工作量 | 10min | 5min |
• 事后总结, 并提出过程改进计划 | 20min | 10min |
合计 | 21h10min | 30h20min |
成品展示
界面展示
文章搜索功能
文章删除功能
文章查看功能
热词统计功能(单击热词)
搜索热词功能(双击热词)
关于我们
结对讨论过程描述
在结对作业一完成之后,我们就开始讨论接下来该如何实现。
在开学布置结对作业二之后,我们就开始具体讨论改任如何实现以及实现的方法,并进行明确的分工规划,之后我们也是一直按照规划进行着。因为我们是舍友并且上课下课都是一起的,我们之间的交流和沟通都是在线下进行的,因此就没有相应的截图。:)
设计实现过程
本次作业的大致设计思路:客户端给浏览器传送一个动作,浏览器通过互联网将数据请求发送给服务端,服务端再通过WordPress从数据库中查找数据,再将数据发回给服务端,将php加工成HTML、JS和数据发送回给浏览器进行渲染,最终将结果呈现给客户端。
用到的语言有:PHP、HTML、JS、JS库(Ajax、Jquery)
用到的平台和工具有:DW、MySql、WordPress、python、vs
代码说明
//重定向
function templateRedirect() {
$basename = basename($_SERVER['REQUEST_URI'], '?' . $_SERVER['QUERY_STRING']);
loadCustomTemplate(TEMPLATEPATH.'/quickfind/'."$basename.php");}
add_action('template_redirect', 'templateRedirect');
//用于防止Sql注入
function safe_num_str($str) {
$arr = explode(',', $str);
$impl = array();
foreach($arr as $num) {
if (is_numeric($num) && $num > 0) {
array_push($impl, $num);
}
}
array_push($impl, 0);
return implode(",", $impl);
}
//根据关键词查文章
function keyword_search(){
global $wpdb;
$impl = safe_num_str($_POST['except']);
if($_POST['kwd'] == '') {
$myrows = $wpdb->get_results($wpdb->prepare("SELECT id, title FROM cv_posts WHERE id NOT IN(".$impl.") LIMIT %d, 5;", (number_format($_POST['curr_page']) - 1) * 5));
$leng = $wpdb->get_col("SELECT count(*) AS cnt FROM cv_posts;");
} else {
$myrows = $wpdb->get_results($wpdb->prepare( "SELECT id, title FROM cv_posts WHERE id NOT IN(".$impl.") AND id IN (SELECT posts_id FROM cv_keyword WHERE word LIKE '%%%s%%') LIMIT %d, 5;", $_POST['kwd'], (number_format($_POST['curr_page']) - 1) * 5 ));
$leng = $wpdb->get_col($wpdb->prepare( "SELECT count(*) AS cnt FROM cv_posts WHERE id IN (SELECT posts_id FROM cv_keyword WHERE word LIKE '%%%s%%');", $_POST['kwd'] ))[0];
}
echo json_encode(array('leng'=> $leng, 'row'=>$myrows));
wp_die();
}
add_action( 'wp_ajax_keyword_search', 'keyword_search' );
add_action( 'wp_ajax_nopriv_keyword_search', 'keyword_search' );
//生成词频
function wordcloud_process() {
global $wpdb;
$impl = safe_num_str($_POST['except']);
$myrows = $wpdb->get_results( "SELECT word, count(*) AS cnt FROM cv_keyword WHERE posts_id NOT IN(".$impl.") GROUP BY word ORDER BY cnt DESC LIMIT 10;" );
echo json_encode($myrows);
wp_die();
}
add_action( 'wp_ajax_wordcloud_process', 'wordcloud_process' );
add_action( 'wp_ajax_nopriv_wordcloud_process', 'wordcloud_process' );
//根据文章id查找文章详细信息
function paper_detail() {
global $wpdb;
$myrows = $wpdb->get_results($wpdb->prepare( "SELECT * FROM cv_posts WHERE id = %d;", $_POST['paper_id'] ));
echo json_encode($myrows[0]);
wp_die();
}
add_action( 'wp_ajax_paper_detail', 'paper_detail' );
add_action( 'wp_ajax_nopriv_paper_detail', 'paper_detail' );
//统计某一关键词多年来的信息
function keyword_count() {
global $wpdb;
$impl = safe_num_str($_POST['except']);
$myrows = $wpdb->get_results($wpdb->prepare("SELECT meeting, year, count(*) as cnt FROM cv_keyword WHERE posts_id NOT IN(".$impl.") AND word = %s GROUP BY year, meeting;", $_POST['kwd']));
echo json_encode($myrows);
wp_die();
}
add_action( 'wp_ajax_keyword_count', 'keyword_count' );
add_action( 'wp_ajax_nopriv_keyword_count', 'keyword_count' );
//数据库建表代码
CREATE TABLE `cv_keyword` (
`posts_id` int(11) NOT NULL,
`word` varchar(191) COLLATE utf8mb4_bin NOT NULL,
`year` int(11) NOT NULL,
`meeting` char(4) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`posts_id`,`word`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
CREATE TABLE `cv_posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`year` int(11) NOT NULL,
`meeting` char(4) COLLATE utf8mb4_bin NOT NULL,
`title` mediumtext COLLATE utf8mb4_bin NOT NULL,
`keywords` mediumtext COLLATE utf8mb4_bin,
`abstract` mediumtext COLLATE utf8mb4_bin NOT NULL,
`url` mediumtext COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23248 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
//通过Ajaxpost的代码
$.ajax({
type:'post',
url:ajaxurl,
data:{'action':'keyword_search',
'kwd':document.getElementById('searchtext').value.trim(),
'except':sessionStorage['except'],
'curr_page':sessionStorage['curr_page']},
cache:false,
dataType:'json',
success:succ,// succ 是前端处理数据的函数
error:function(data){
console.log("error")
}
});
心路历程和收获
李家成:
这次作业我主要负责前端的页面开发,一开始我认为有了上个学期web课程的基础,开发起页面应该信手拈来。但真正到了页面开发阶段,发现若没有付之以认真严谨的态度,在页面的布局上后期会出现各种各样的问题,也以至于我在完成设计后情况百出,因此修改了好多次的布局,事半功倍。这次参与结对作业,我收获最大的是学会了如何设计出一个严谨的页面和如何通过echarts绘制图表,同时我也学会了各类响应事件的编码,以及更加熟练掌握了github的应用,可以说是受益匪浅。
柯少彬:
这次作业我主要负责的是后端的开发以及云服务器的搭建。因为我以前有搭建云服务器的经验,所以这次作业很快就完成了搭建工作。在数据库和后端的开发中,也是没多大问题就能完成相应的功能。在这次的结对中,遇到的问题主要是如何对大批量论文信息的处理以及优化,最终我使用python完成了对助教提供的论文资料的处理。经过这次结对作业,我接触到了python并学会如何使用它,同时我还借助这次作业,加强了自己操作数据库以及编码js的能力,收获丰富!
评价结对队友
李家成:
此次结对的对象是快乐摩尔柯少彬,因为是舍友所以我们两个人在此次任务的交流和沟通上没有问题,在任务的分配上我们也是很快地分配好各自的任务。在此次结对作业中,少彬做了许多较为繁琐的工作,并且编码的效率也是很高,这同时也把我的积极性和投入性也带动了起来。在设计和编码的过程中,我向少彬询问了一些我无法解决的问题,少彬也耐心地向我解答,在这里非常之感谢少彬。同时在他的编码过程中,我也站在他的边上观摩学习,和他一起查找资料解决问题,学到许多以前从未触及到的知识。
柯少彬:
这是我和jc的第二次结对编程,同第一次作业比较我们之间任务的分配和两个人之间的沟通更加高效、默契,原因可能是有了第一次结对的经验,也可能是线下可以更好地面对面交流需求。总的来说,jc在这次结对过程中积极地完成各项分配到的任务,面对各种需求变更都主动去完成,这也充分调动我的积极性,让我们结对双方的效率更上一个台阶。