SCRUM部分:
每个成员描述:
(1)我今天的进度(完成了哪些任务,花了多少时间,还剩余多少时间),今天遇到了哪些问题,今天解决了哪些问题,(参见前面计划的要求),明天的计划。(可以以表格形式列出)
今天的进度 |
遇到的问题 |
解决问题方法 |
明天的计划 |
贺勇负责的管理员对查询到的数据进行增删改除 |
好多好多,点击无效,点击报错,点击后404都有,连接不到数据库都来了 |
在网上疯狂找资料,问了问强的离谱大佬,加了一些相关QQ群总之就是疯狂问,问问题又不收费 |
用户部分的实现 |
陈强 |
怎么解决搜索功能的实现,怎么将数据传到其他网页且不跳转 |
在网上尤其是MDN上查找网络数据传输的相关知识点 |
/ |
黎志洋 |
/ |
/ |
/ |
罗宇梁 |
/ |
/ |
/ |
喻达龙 |
/ |
/ |
/ |
陈子扬 |
/ |
/ |
/ |
(2)团队成员的工作如果是开发工作必须有代码签入,给出签入记录对应的Issue内容与链接,代码必须每天可执行(当天截屏,没有倒扣分)
代码
搜索功能
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="dao.newinterfaceDAO"%>
<%@ page import="kechensheji.newinterfaces"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>搜索页面</title>
<base href="<%=basePath%>">
<link rel="stylesheet" href="CSS/search2.css">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
</head>
<body>
<div class="container">
<input type="text" name="A" placeholder="请输入搜索所内容" class="A">
<input type="button" name="A" value="搜索" onclick="Ck()">
</div>
<script>
var input=document.getElementsByClassName("A");
console.log(input);
var div2=document.createElement("div");
document.body.appendChild(div2);
function Ck(){
if(div2.lastElementChild!=null){
while(i!=0){
var last=div2.lastElementChild;
var i=div2.childElementCount;
if(last!=null){
console.log("1212");
div2.removeChild(last);
}
}
}
var str=input[0].value;
<%
newinterfaceDAO itemsDao = new newinterfaceDAO();
ArrayList<newinterfaces> list = itemsDao.getAllnewinterfaces();
if(list!=null&&list.size()>0){
for(int i=0;i<list.size();i++){
newinterfaces item = list.get(i);
%>
var str2="<%= item.getTopic()%>"
if(str2.indexOf(str)>=0){
var a=document.createElement("a");
a.setAttribute("href","information.jsp?id=<%=item.getGoodId()%>&name=<%=request.getParameter("username")%>");
var img=document.createElement("img");
img.src="<%= item.getImg()%>";
a.appendChild(img);
div2.appendChild(a);
}
<%
}
}
%>
}
</script>
</body>
</html>
个人信息界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>管理界面</title>
<link rel="stylesheet" href="CSS/Administration.css">
</head>
<body>
<%!
//public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";//定义数据库驱动程序
public static final String DBURL = "jdbc:mysql://localhost:3306/mesige?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";//数据库链接地址
public static final String DBUSER = "root";//数据库连接用户名
public static final String DBPASS = "changw1164816347";//数据库连接密码
%>
<%
Connection conn = null;//声明数据库连接对象
PreparedStatement pstmt = null;//声明数据库操作
ResultSet rs = null;//声明数据库结果集
boolean flag = false;//定义标志位
String name = null;//接受用户的真实姓名
%>
<%
try {
String admId = request.getParameter("admId");
System.out.println(admId);
Class.forName(DBDRIVER);//加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);//取得数据库连接
//编写要使用的SqL语句,验证用户id和密码,如果正确,则取数真实姓名
String sql = "select topic,Ttype,area,goodId from goods where admId = ?";
System.out.print("ssss");
pstmt = conn.prepareStatement(sql);//实例化数据库操作对象
pstmt.setString(1,admId);//设置查询所需的内容
rs = pstmt.executeQuery();//执行查询
%>
<div class="container">
<div>
<span>个人二手信息管理</span>
</div>
<div>
<table>
<tr>
<th>商品编号</th>
<th>信息标题</th>
<th>类型</th>
<th>交易地区</th>
<th>删除</th>
</tr>
<%
while(rs.next()) {//如果可以查询到,则表示合法用户
flag = true;//修改标志位,如果为true,表示登陆成功
String topic=rs.getString(1);
String Ttype=rs.getString(2);
String area=rs.getString(3);
String goodId=rs.getString(4);
%>
<tr>
<td><span><%=goodId%></span></td>
<td><span><%=topic%></span></td>
<td><span><%=Ttype%></span></td>
<td><span><%=area%></span></td>
<td><button onclick="jump(<%=goodId%>);">删除</button></td>
</tr>
<script>
function jump(i) {
// var s = document.getElementsByTagName('span')[0];
location.href='delete.jsp?'+'txt=' + encodeURI(i);
alert("你将删除该商品");
}
</script>
<%
}
%>
</table>
</div>
</div>
<%
} catch (Exception e) {
System.out.println(e);
} finally {
try {//关闭操作会抛出异常,使用try catch处理
rs.close();//关闭查询对象
pstmt.close();//关闭操作对象
conn.close();//关闭数据库连接
} catch (Exception e) {}
}
%>
<%
if (flag) {//登陆成功,跳转到成功页面
%>
<%
} else {//登陆失败,跳转到失败页面
%>
<h1>实拍</h1>
<%
}
%>
</body>
</html>
商品发布界面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>信息发布界面</title>
<link rel="stylesheet" href="CSS/release.css">
</head>
<body>
<div class="container">
<div class="header">
<p>信息发布</p>
</div>
<div class="information">
<form action="release.jsp" method="POST">
<table>
<tr>
<td>信息标题</td>
<td><input type="text" name="topic" onblur="blurFunction()"/><span>*内容不可大于30个字</span></td>
</tr>
<tr>
<td>新旧程度</td>
<td>
<select name="newoold">
<script>
for(var i=1;i<=10;i++)
{
document.write("<option value="+i+'成新'+">"+i+'成新'+"</option>");
}
</script>
</select>
</td>
</tr>
<tr>
<td>交易类型</td>
<td>
<select name="Ttype">
<option value="求购">求购</option>
<option value="出售">出售</option>
</select>
</td>
</tr>
<tr>
<td>所属类型</td>
<td>
<select name="typee">
<option value="电脑配件">电脑配件</option>
<option value="通讯器制">通讯器制</option>
<option value="视听设备">视听设备</option>
<option value="书馆报刊">书馆报刊</option>
</select>
</td>
</tr>
<tr>
<td>交易地区</td>
<td>
<select name="area">
<option value="食堂一楼">食堂一楼</option>
<option value="图书馆">图书馆</option>
<option value="一教学楼">一教学楼</option>
<option value="校门口">校门口</option>
</select>
</td>
</tr>
<tr>
<td>物品价格</td>
<td>
<input type="text" name="price" onblur="prices()" /><span>*(请输入数字)</span>
</td>
</tr>
<tr>
<td>联系人</td>
<td>
<input type="text" name="admId" onblur="admIds()"/>
</td>
</tr>
<tr>
<td>E-mail</td>
<td>
<input type="text" name="Email" onblur="Emails()"><span>*最好为QQ邮箱或网易邮箱</span>
</td>
</tr>
<tr>
<td>联系方式</td>
<td><textarea name="way" cols="40" rows="5"></textarea></td>
</tr>
<tr>
<td>物品简介</td>
<td><textarea name="product" cols="50" rows="10"></textarea></td>
</tr>
<tr style="width: 250px;height: 250px;">
<td>图片</td>
<td><input type="file" name="img"></input><div id="s"></div></td>
</tr>
</table>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</div>
</div>
<script>
function blurFunction() {
var topic=document.getElementById("topic");
console.log(topic.value);
console.log(topic.value.length);
// alert("dasds");
if(topic.value.length>10){
alert("标题内容大于30个字");
}
};
function prices() {
var o=0;
var price =document.getElementById("price");
console.log(price.value[0]);
var pricetexts=price.value;
console.log(typeof pricetexts);
for(var i=0;i<pricetexts.length;i++){
if(pricetexts.charCodeAt(i)<49||pricetexts.charCodeAt(i)>57){
alert("请输入数字");
break;
}
console.log(pricetexts.charCodeAt(i));
console.log(typeof o);
}
};
function admIds() {
var admid=document.getElementById("admId").value;
if(admid.length>=12){
alert("请输入有效的电话号码");
}
};
function Emails() {
var pattern = /^([A-Za-z0-9_\-\.])+\@(163.com|qq.com|42du.cn)$/;
var email=document.getElementById("Email").value;
if(!pattern.test(email)){
alert("请输入有效的邮箱");
}
};
// 定义一个接收转为base64图片的数组
let ArrayImg=[]
var index = 0; //给图片加唯一标识 好删除
// 获取页面上的元素
let input=document.getElementsByName('img')[0];
console.log(input);
// 绑定oncheange事件
input.onchange=function(){
var file=this.files[0] //获取页面上选择的文件[N]指的是获取第几个
// console.log(file);
var iLen = this.files.length; //获取图片长度
// console.log(iLen);
for(var i=0;i<iLen;i++){ //通过循环把多张图片显示到页面上或者上传
// 本地缓存 预览
var filereader = new FileReader() //创建一个本地缓存的对象
// 把获取到的文件本地缓存转为bese64
filereader.readAsDataURL(this.files[i]) //转成base64,并存在了自由属性reader.result里
console.log([i]);
filereader.onload = function () { //通过onload 事件把this.result 取出来
// console.log(this.result,333);
ArrayImg.push(this.result)
// 通过html标签包括到img显示图片 放到一个变量中储存
let img1=`<div id="divimg"><img src="${this.result}" alt="" id="id_img" width=200px height=200px></div>`
// 创建一个新的div
let div = document.createElement('div')
div['index'] = index; // 给div加唯一标识好移除
// 把上传存好的img1放到新建的div里面
div.innerHTML=img1
console.log(ArrayImg,'图片数组');
//然后通过dom操作插入到dom树中 显示图片
document.getElementById("s").appendChild(div) //插入dom树
// console.log(img);
// 通过给div绑定单击事件 删除当前点击的div跟当前点击的图片数组中的base64地址
div.onclick = function(){
this.remove(); // 在页面中删除该图片元素
delete ArrayImg[this.index]; // 删除ArrayImg数组对应的数据
console.log(ArrayImg,'图片数组');
}
//inddex记录当前循环了多少次好移除ArrayImg数组中的链接地址
index++
}
}
}
</script>
</body>
</html>
截图
一、搜索功能
二、个人信息界面
三、信息发布界面
(3)团队成员的工作如果是测试等其他工作,那要有具体的结果(截屏,测试报告等)
测试详情见测试总结
(4)SCRUM 会议的照片一张,会议照片应该是每天冲刺会议的真实非摆拍照片,可以挡住脸保护隐私。照片如果出现复用的情况倒扣分。
(5)至少一张项目程序/模块的最新(运行)截图。
搜索前
搜索后
PM 报告:
(1)整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’)
任务量完成度 |
已花费时间 |
剩余时间 |
十分之六 |
七天半 |
一天半 |
(2)PM 画出燃尽图
(3)画出一个“任务总量变化线”,体现在工作中发现了多少以前没有想到的事情。
工作中发现了多少以前没有想到的事情:可能有几天项目会没有进展,这几天手都打酸了,我真的有点小裂开,还有些细节做得不够好,我还得完善,剩下的给组员陈强接手用户部分的功能实现吧,我乏了。
(4)表格形式列出每名成员的贡献比
小组成员 |
贡献比 |
贺勇 |
18% |
陈强 |
24% |
喻达龙 |
16% |
罗宇梁 |
16% |
陈子杨 |
16% |
黎志洋 |
16% |