SSM学生选课管理系统项目中问题总结(未完待续)
学生选课管理系统
- 前端遇到的问题
- 一、ajax的注意事项
- 二、引入bootstrap的模态框
- 三、bootstrap模态框共用
- 四、编辑框回显
- 五、删除数据页面不刷新
- 六、分页
- 七、排序
- 八、分页后续
- 九、模糊搜索+排序(巨坑!!)
- 十、请求成功到后台,前端报404
- 后端遇到的问题
- 一、提示没有get方法
- 保持更新中...
前端遇到的问题
一、ajax的注意事项
var showAll = function(aid) {console.log(aid)$.ajax({url:"${ctx}/admin/showOneAdminUser",data:{"aid":aid},type:"get",success:function(response){$("#uname").val(response.uname);$("#upassword").val(response.upassword);$("#aname").val(response.aname);$("#aphone").val(response.aphone);}}); };
- ajax中属性要小写(如:
data
) - 如果要在地址栏后拼接参数(如:
admin/showOneAdminUser?1000
),需要这样写data:{"aid":aid}
二、引入bootstrap的模态框
<!--模态框--><form method="post" name="user" class="form-horizontal" role="form"id="form-data" style="margin: 20px;">//将id="updateModal"填入编辑按钮中触发模态框<div class="modal fade" id="updateModal" tabindex="-1" role="dialog"aria-labelledby="updateModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"aria-hidden="true">×</button><h4 class="modal-title" id="updateModalLabel">用户信息</h4></div><div class="modal-body"><form action="" class="form-horizontal"><!--userid为隐藏的input,便于update时的传值--><input type="text" id="userID" name="userID" hidden><div class="form-group"><label for="username" class="col-sm-3 control-label">登录名</label><div class="col-sm-9"><input type="text" class="form-control" id="uname"name="uname" placeholder="用户名长度在5-18字符之间"></div></div><div class="form-group"><label for="password" class="col-sm-3 control-label">密码</label><div class="col-sm-9"><input type="text" class="form-control" id="upassword"name="upassword" placeholder="密码长度在5-20字符之间"></div></div><div class="form-group"><label for="phone" class="col-sm-3 control-label">姓名</label><div class="col-sm-9"><input type="text" class="form-control" id="aname" name="aname"placeholder="请输入真实姓名"></div></div><div class="form-group"><label for="email" class="col-sm-3 control-label">电话</label><div class="col-sm-9"><input type="text" class="form-control" id="aphone"name="aphone" placeholder="请输入手机号"></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><!--type为submit时,会自动调用该表单的验证,但是不会调用自己定义的动态的username的验证,所以把按钮类型改为input,再手动调用封装好的验证函数--><button type="input" class="btn btn-primary" onclick="vali();">提交</button><span id="tip"></span></div></div></div></div></form>
2.1模态框样式:
- 触发编辑框(模态框):在我的项目中触发条件是
点击编辑按钮时
- 要想触发模态框,得在编辑按钮处添加data-toggle=“modal” data-target="#updateModal",关联上述模态框中第一个div的id值
data-target="#updateModal
<button class="btn btn-info" data-toggle="modal" data-target="#updateModal" type="button" onclick="showAll('${admin.aid}')">编辑</button>
三、bootstrap模态框共用
目的: 添加按钮和编辑按钮共用同一个模态框,如下图所示
触发模态框条件,按钮中必须得有
data-toggle="modal" data-target="#updateModal"
这两个属性。注意: target中的值要填写你自己模态框中的id值。在
添加按钮
和编辑按钮
处设置同一方法不同参数
添加按钮:
设置id=add
编辑按钮:
设置class=edit
为什么编辑设置class,而添加设置id呢?
因为我的编辑按钮是跟随数据遍历出来的,看下图你就明白了。添加只有一个,id有唯一性(只能有唯一的一个id)。而编辑可能有多个,如果使用id则只有第一个编辑能触发模态框,其他编辑按钮因为id值重复导致不能触发模态框
当点击
添加
会触发edit('add')
方法,点击编辑
时触发edit('edit')
方法
attr(参数1,参数2)–>参数1是属性,参数2是给这个属性赋的值共用模态框效果如下图所示:
编辑按钮需要信息的回显,后续跟新。
四、编辑框回显
目的: 数据回显并根据性别的数字
选中不同的option
数字1:女 数字0:男
思路:
- 点击编辑按钮,发送带有id值的请求到后台查询此id的老师信息
- 判断返回的性别数字。如果是1,则显示女,如果是0,显示男
遇到的问题:
性别判断成功后如何选中下拉框中的女或者男,可直接从
//TODO 编辑代码从此处看 3
看起。如何选中下拉框中的第二个男?
$("#select").find("option:nth-child(2)").prop("selected","selected");
2.1#select
是<select>
标签的id
2.2"option:nth-child(2)"
选中下拉框中的第二个
2.3prop("selected","selected");
将第二个下拉框设置为selected,这样form表提交时,只会提交selected="selected"的下拉框中的value值使用attr(),并没有效果,没有选中对应的下拉框。使用prop就可以。
3.1 因为,attr()只能选择自己设置的属性值,如$("#add").attr("data-toggle","modal");
3.2 prop()选择固有的属性值,如<a href>
a标签中的href属性。
3.3 所以下拉框选择使用prop方法var edit = function (param,tid) {if( param == 'add'){//当传进来的参数是add时,模态框表头展示添加教师信息,1和2是给触发此方法的按钮添加属性和赋值$("#updateModalLabel").text("添加教师信息");$("#add").attr("data-toggle","modal"); //1$("#add").attr("data-target","#updateModal"); //2$("#form-data").attr("action","${ctx}/teacher/add"); //将请求设置为添加请求}else {/TODO 编辑代码从此处看 3//当传进来的参数是edit时,模态框标表头展示编辑教师信息//并发送ajax请求到后台查询Teacher类作为JSON数据格式返回$.post("${ctx}/teacher/selectOne?tid="+tid,function(data){//数据回显$("#tname").val(data.tname);$("#tcard").val(data.tcard);$("#tphone").val(data.tphone);if (data.tsex == 1) {//如果回显的性别为1,则选中第一个下拉框 女$("#select option:first").prop("selected", "selected"); }else {//否则,选中第二个下拉框 男$("#select").find("option:nth-child(2)").prop("selected","selected");}$("#tdescribe").val(data.tdescribe);});$("#updateModalLabel").text("编辑教师信息");$(".edit").attr("data-toggle","modal");$(".edit").attr("data-target","#updateModal");$("#form-data").attr("action","${ctx}/teacher/edit");//将请求设置为编辑请求}};
点击编辑按钮时数据成功回显:
五、删除数据页面不刷新
问题:
发送ajax请求到后台,删除数据后重定向到查询方法,查询方法返回页面数据没刷新,导致用户要删除的那条数据还存在。
点击删除按钮后,测试4数据还存在。查询数据库数据已经被删除,确定是前端没有刷新。
删除方法写了重定向,但是因为请求是ajax发送的,所以返回的
return "admin/guanli/admin_list"
是一个页面,但是浏览器没有解析他。//删除@RequestMapping("del")public String delete(Integer aid, HttpServletRequest request) {Result result = adminService.delete(aid);request.setAttribute("result", result);return "redirect:query";}
//查询出所有管理员@RequestMapping("query")public String showAdmins(HttpServletRequest request) {List<Admin> adminList = adminService.showAll();request.setAttribute("adminList", adminList);return "admin/guanli/admin_list";}
返回的页面
解决:
- 在ajax中设置刷新语句:
window.location.reload();
六、分页
导包: pagehelper-4.1.6.jar
分页代码:
<!-- 分页-前端代码-代码要放到table标签内 -->
<tr align="right" bgcolor="#dfe4ea"><td height="36" colspan="12" align="center">当前是第${requestScope.teacherList.pageNum}页 <a href="query?pageNum=1">首页</a> //teacherList是后端查询的多个teacher,用list集合装,具体看后端代码<c:if test="${requestScope.teacherList.pageNum != 1}"><a href="query?pageNum=${requestScope.teacherList.prePage}">上一页</a></c:if> //pages是最后一页,当前页pageNum!=最后一页时,显示下一页<c:if test="${requestScope.teacherList.pageNum!=requestScope.teacherList.pages}"><a href="query?pageNum=${requestScope.teacherList.nextPage}">下一页</a></c:if> <a href="query?pageNum=${requestScope.teacherList.pages}">尾页</a>共有${requestScope.teacherList.pages}页</td>
</tr>
//查询所有老师,并跳转页面//value=pageNum--接收传进来的路径中pageNum的值,如果没有则使用默认值1//接收到的当前页的值放入pageIndex变量中@RequestMapping("query")public String showAll(@RequestParam(value="pageNum", defaultValue="1") Integer pageIndex, Model model) {//当前第pageIndex页,每页显示4条PageHelper.startPage(pageIndex, 4);//查询所有老师List<Teacher> teacherList = teacherService.showAll();//将查询的结果放入pageInfo中,自动将查询的结果封装进pageInfo内PageInfo<Teacher> teacherPageInfo = new PageInfo<Teacher>(teacherList);//model等同于HttpServletRequest,将已经分页好的数据装入request域对象中model.addAttribute("teacherList", teacherPageInfo);return "admin/teacher/teacher_list";}
注意: 包别导错了
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo
问题: 在前端遍历数据时使用的是${teacherList.list}
而不是单纯的${teacherList}
<c:forEach varStatus="status" var="teacher" items="${teacherList.list}"><tr><td>${status.index+1}</td><td>${teacher.tcard}</td><td>${teacher.tname}</td><td>${teacher.tphone}</td><td></tr>
</c:forEach>
查看输出的PageInfo信息如下:
PageInfo<Teacher> teacherPageInfo = new PageInfo<Teacher> (teacherList);
System.out.println("teacherPageInfo=="+teacherPageInfo);
//teacherList.list里面并没有teacher的tcard,tname,tphone等属性
//但前端teacherList.list这样能遍历出来,大家可以一起探讨一下
teacherPageInfo==
PageInfo{pageNum=1, pageSize=2, size=2, startRow=1, endRow=2, total=3, pages=2,
list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=3, pages=2, countSignal=false, orderBy='null', orderByOnly=false, reasonable=true, pageSizeZero=false},
firstPage=1, prePage=0, nextPage=2, lastPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8, navigatepageNums=[1, 2]}
七、排序
目的: 根据选择的条件进行数据的排序。
方法:
前端:在前端加了一个下拉菜单,效果如下图所示
<div class="btn-group"><button type="button" class="btn btn-default" onclick="orderbyNO()" >排序</button><!--data-toggle="dropdown" 显示右侧的下拉框--><button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"><!--显示按钮右侧向下的箭头--><span class="caret"></span><span class="sr-only">切换下拉菜单</span></button><ul class="dropdown-menu" role="menu"><li><a href="${ctx }/teacher/query?oderby=1">工号正序</a></li><li><a href="${ctx }/teacher/query?oderby=2">工号倒序</a></li><li class="divider"></li><li><a href="${ctx }/teacher/query?oderby=3">热度正序</a></li>li><a href="${ctx }/teacher/query?oderby=4">热度倒序</a></li></ul> </div>
思路:
选中排序条件时,发送对应数字到后台
后台接受前端的排序数字
@RequestMapping("query")public String showAll(@RequestParam(value="pageNum", defaultValue="1") Integer pageIndex, Integer oderby, Model model) {//从pageIndex页开始,每页显示2条数据PageHelper.startPage(pageIndex, 2);//将传进来的排序数字传入查询方法中List<Teacher> teacherList = teacherService.showAll(oderby);PageInfo<Teacher> teacherPageInfo = new PageInfo<Teacher>(teacherList);model.addAttribute("teacherList", teacherPageInfo);return "admin/teacher/teacher_list";}
逻辑层完善逻辑
//排序@Overridepublic List<Teacher> showAll(Integer oderby) {TeacherExample example = new TeacherExample();//判断是否选中了排序条件,为null则是没选择排序条件进行的查询if (oderby != null) {switch (oderby) {case 1://tcard正序example.setOrderByClause("tcard ASC");break;case 2://tcard倒序example.setOrderByClause("tcard DESC");break;case 3://thot正序,如果thot值相同,以tcard值排序example.setOrderByClause("thot ASC, tcard ASC");break;case 4://tcard倒序,如果thot值相同,以tcard值排序example.setOrderByClause("thot DESC, tcard DESC");break;}//返回排序后的数据return teacherMapper.selectByExample(example);}else {//默认不排序return teacherMapper.selectByExample(null);}}
八、分页后续
问题: 上一个分页有瑕疵,选中排序条件,只排序了当前页,当点击上一页,下一页,首页,尾页时页面并没有进行排序。
思路:
我的排序做法是点击排序条件,发送对应的orderby数据
参考上方,我们可以在分页处的请求代码加上orderby的值,如下
<!-- 分页 --><tr align="right" bgcolor="#dfe4ea">td height="36" colspan="12" align="center">当前是第${requestScope.teacherList.pageNum}页 <a href="query?pageNum=1&oderby=${requestScope.orderby }">首页</a> <c:if test="${requestScope.teacherList.pageNum != 1}"><a href="query?pageNum=${requestScope.teacherList.prePage}&oderby=${requestScope.orderby }">上一页</a></c:if> <c:if test="${requestScope.teacherList.pageNum!=requestScope.teacherList.pages}"><a href="query?pageNum=${requestScope.teacherList.nextPage}&oderby=${requestScope.orderby }">下一页</a></c:if> <a href="query?pageNum=${requestScope.teacherList.pages}&oderby=${requestScope.orderby }">尾页</a>共有${requestScope.teacherList.pages}页</td> </tr>
问题是怎么获取orderby的值呢?
在查询方法接受到orderby值的时候,就放入request域对象中,随着返回的页面一起传到前端
@RequestMapping("query") public String showAll(@RequestParam(value="pageNum", defaultValue="1") Integer pageIndex, Integer oderby, Model model) {//从pageIndex页开始,每页显示2条数据PageHelper.startPage(pageIndex, 2);//将传进来的排序数字传入查询方法中List<Teacher> teacherList = teacherService.showAll(oderby);PageInfo<Teacher> teacherPageInfo = new PageInfo<Teacher>(teacherList);//model.addAttribute("orderby", oderby); //model.addAttribute("teacherList", teacherPageInfo);Map<String, Object> map = new HashMap<String, Object>();map.put("teacherList", teacherPageInfo);//将传进来的排序数据放入request域对象中map.put("orderby", oderby);model.addAllAttributes(map);return "admin/teacher/teacher_list"; }
注释掉的代码也可以使用,测试了model.addAttribute()可以存放多个键值对
这样每点击一次下一页,首页,上一页,尾页等都能保证有排序的效果
九、模糊搜索+排序(巨坑!!)
目的1: 根据下拉条件在输入框进行模糊搜索,默认是以工号进行搜索
目的2: 对模糊搜索出来的数据进行排序
模糊搜索的思路:
最初的SQL查询设想,但是tname和
'%测试%'
是随时变化的,不能设置成死值
不能设置成死值,那就用变量代替,sql结构大致搞定,万万没想到这是个大坑,往下看
如何得到这两个变量的值?那就要从前端传过来。因为要先选中下拉框中的条件,确定搜索的是什么字段,这样方便后端不用去进行判断。所以我在下拉框中设置了value值为数据库的字段名,当选中姓名条件时,
stext=tname
<!-- 条件框 --> <select name="stext" id="stext"><option value="tcard">工号</option><option value="tname">姓名</option><option value="tphone">手机</option><option value="thot">受欢迎度</option><option value="tsex">性别</option><option value="tdescribe">简介</option> </select>
搜索框name值为sinput,当输入框输入
测试
两个字时,sinput=测试
<input id="sinput" name="sinput" placeholder="根据右侧条件进行搜索" type="text">
坑1:
点击搜索按钮,发出请求。这里搜索是button
按钮,所以要和form表单连用。我之前在button中设置onclick(),搜索到的数据没有给我显示,依旧是之前的页面,这是个坑。//当点击搜索按钮时,form表单会将每个标签中的value值赋给name属性 //例如我选中姓名条件,输入测试,点击搜索后的路径为 //http://localhost:8080/xuanke_ssm/teacher/query?sinput=%E6%B5%8B%E8%AF%95&stext=tname,sinput那里的乱码代表测试,后端会接收到不用担心 <form method="get" action="${ctx}/teacher/query" ><input id="sinput" placeholder="根据右侧条件进行搜索" type="text" name="sinput" class="form-control" style="width:200px;"><!-- 条件框 --><select name="stext" id="stext"><option value="tcard">工号</option><option value="tname">姓名</option><option value="tphone">手机</option><option value="thot">受欢迎度</option><option value="tsex">性别</option><option value="tdescribe">简介</option></select><button class="btn btn-default" type="submit" id="select" style="position: relative;left: auto;right: 3px;margin-bottom: 2px;">搜索</button> </form>
后端需要接受sinput和stext的值,为了缩短方法的参数长度,我把sinput,stext,orderby(排序字段)封装进类中,方便接收。orderby暂且不理会它,后面会讲到。
将接收到的数据传入service层,准备对数据库进行查询,因为已经将stext,sinput封装进MoHuOderby类中,所以方法中的参数就放入MoHuOderby的对象
List<Teacher> teacherList = teacherService.showAll(moHuOderby);
这时要考虑到万一用户没有在输入框搜索数据呢,所以要添加条件,如果sinput(输入框的数据)如果为空串或者为null则不拼接模糊查询语句。
坑2:
模糊查询时要用$
不能用#
。- 因为使用
#
时,语句是这样的where 'tname' like '%测试%'
,传进来的字段和搜索值都会有单引号
,导致查询出错。 - 使用
$
时,语句是where tname like %测试%
,这里不用考虑sql注入问题,因为你是进行模糊查询,而不是进行登录角色的判断。
<!-- List<Teacher> selectMoHu(MoHuOderby moHuOderby); --><select id="selectMoHu" parameterType="com.xk.pojo.vo.MoHuOderby" resultType="com.xk.pojo.Teacher">select * from teacher<if test="sinput != null and sinput != '' ">where ${stext} like '%${sinput}%'</if>
- 因为使用
模糊搜索的排序:
目的: 对搜索出来的数据进行排序时,数据保持是筛选出来的数据,根据排序的条件
只改变数据的顺序,不改变数据
;比如我模糊搜索测试
,查出四条数据,点击以工号排序后,还是四条带有测试
的数据进行排序,而不会显示所有的数据。
- 模糊查询出来的数据如果有4条,点击排序后结果是4条有顺序的数据
- 点击下一页,显示的仍然是模糊查询后的数据,并且保持排序状态
思路:
模糊查询时,controller层接收到
查询的值(sinput),查询条件的值(stext),排序的条件值(oderby)
,马上就将他们存入request域对象中,跟随返回的页面一起到前端。@RequestMapping("query") public String showAll(@RequestParam(value="pageNum", defaultValue="1") Integer pageIndex, MoHuOderby moHuOderby, Model model) {PageHelper.startPage(pageIndex, 2);List<Teacher> teacherList = teacherService.showAll(moHuOderby);PageInfo<Teacher> teacherPageInfo = new PageInfo<Teacher(teacherList);//将传进来的排序数字,搜索数据,搜索条件保持不变的传回前端,使得页面变化时,之前的查询,排序操作不变HashMap<String, Object> map = new HashMap<String, Object>();map.put("teacherList", teacherPageInfo);map.put("orderby", moHuOderby.getOderby());map.put("stext", moHuOderby.getStext());map.put("sinput", moHuOderby.getSinput());model.addAllAttributes(map);return "admin/teacher/teacher_list"; }
前端首页,下一页,上一页,尾页都保持发送带有sinput,stext,orderby的请求,这样就能保证点击页数的时候数据不会发生改变,排序的规则也不会发生改变。
<!-- 分页 --> <tr align="right" bgcolor="#dfe4ea"><td height="36" colspan="12" align="center">当前是第${requestScope.teacherList.pageNum}页 <!-- 获取后端传来的排序的数字,模糊搜索的条件stext和搜索的内容sinput --><a href="query?pageNum=1&oderby=${requestScope.orderby }&stext=${stext }&sinput=${sinput}">首页</a> <c:if test="${requestScope.teacherList.pageNum != 1}"><a href="query?pageNum=${requestScope.teacherList.prePage}&oderby=${requestScope.orderby }&stext=${stext }&sinput=${sinput}">上一页</a></c:if> <c:if test="${requestScope.teacherList.pageNum!=requestScope.teacherList.pages}"><a href="query?pageNum=${requestScope.teacherList.nextPage}&oderby=${requestScope.orderby }&stext=${stext }&sinput=${sinput}">下一页</a></c:if> <a href="query?pageNum=${requestScope.teacherList.pages}&oderby=${requestScope.orderby }&stext=${stext }&sinput=${sinput}">尾页</a>共有${requestScope.teacherList.pages}页</td> </tr>
排序的字段一定要判断是否为
null
和空值
,不然如果为空,switch会报空指针异常排序的数字1-4,如下所示:
将数字对应的sql赋值给oderbyText,随便你后期怎么增加或者修改,我不用改动xml里的sql语句,提高后期的维护效率
//根据oderby的数字进行排序 if (moHuOderby.getOderby() != null && moHuOderby.getOderby().toString() != "") {switch (moHuOderby.getOderby()) {case 1://tcard正序moHuOderby.setOderbyText("tcard ASC");break;case 2://tcard倒序moHuOderby.setOderbyText("tcard DESC");reak;case 3://thot正序moHuOderby.setOderbyText("thot ASC");break;case 4://thot倒序moHuOderby.setOderbyText("thot DESC");break;} }
mapper.xml里进行SQL语句的书写
<!-- List<Teacher> selectMoHu(MoHuOderby moHuOderby); --> <select id="selectMoHu" parameterType="com.xk.pojo.vo.MoHuOderby" resultType="com.xk.pojo.Teacher">select *from teacher<if test="sinput != null and sinput != '' ">where ${stext} like '%${sinput}%'</if><if test="oderby != null and oderby != '' ">order by ${oderbyText}</if></select>
对于坑的总结:
- 模糊查询和排序不能使用
#
,只能是$
,原因上面有讲到 button
得和form表单连用,在button
中添加onclick
无法得到返回的数据,导致模糊查询没有效果
十、请求成功到后台,前端报404
因为我用的是ajax发送的请求,所以后台返回值类型应该是JSON类型的结果,所以在方法上加个@ResponseBody
即可。
后端遇到的问题
一、提示没有get方法
猛戳此链接:There is no getter for property named
保持更新中…
SSM学生选课管理系统项目中问题总结(未完待续)相关推荐
- 深度学习(三十八)初识DL在自然语言序列标注中的应用-未完待续
初识DL在自然语言中的应用 原文地址: 作者: 一.自然语言序列标注 虽然之前自己对于HMM.CRF.Word2vec.Attention机制.Encode-Decode等,在自然语言领域的应用已经比 ...
- 【JAVA程序设计】(C00095)基于SSM框架的学生选课管理系统
基于SSM框架的学生选课管理系统 项目获取 文章结构 一.开发框架及业务方向 1.开发环境 2.开发框架 3.整体业务 二.项目结构及页面展示 1.项目整体结构 2.学生页面 3.教师页面 4.管理员 ...
- 【JAVA程序设计】(C00094)基于SSM学生考勤管理系统
基于SSM学生考勤管理系统 项目获取 文章结构 一.开发框架及业务方向 1.开发环境 2.开发框架 3.整体业务 二.项目结构及页面展示 1.项目整体结构 2.学生页面 3.教师页面 4.管理员页面 ...
- ssm学生宿舍管理系统源码
项目访问 localhost:8080 端口根据自己的环境变动 不要项目名访问. 默认密码123456 MD5Util加密方式 #eclipse 修改访问地址不带项目名称 :https://blog. ...
- 基于javaweb的学生选课管理系统(java+ssm+bootstrap+javascript+mysql)
基于javaweb的学生选课管理系统(java+ssm+bootstrap+javascript+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/ ...
- 基于SSM搭建的学生信息管理系统项目源码+学习视频
基于SSM搭建的学生信息管理系统 目录 基于SSM搭建的学生信息管理系统 1.为什么要编写学生信息管理系统 1.1编写项目的起因: 2.编写学生信息管理系统的过程 2.1项目成果的展示: 登录界面: ...
- 数据库课程设计-学生选课管理系统(实训报告+答辩ppt+源码+sql文件+打包好的程序)springboot项目-javaweb
作者:ChenZhen 博客地址:https://www.chenzhen.space/ 版权:本文为博主 ChenZhen 的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明. 如果对你 ...
- (附源码)mysql+ssm学生选课系统 毕业设计 170920
摘 要 本论文主要论述了如何使用JAVA语言开发一个学生选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述学生选课系统的当前 ...
- ssm+mysql+ssm学生选课系统 毕业设计-附源码170920
摘 要 本论文主要论述了如何使用JAVA语言开发一个学生选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述学生选课系统的当前背 ...
最新文章
- disconf 中文乱码
- 如果文件夹不存在,请创建它
- R语言中的聚类的使用
- Dubbo源码学习总结系列三 dubbo-cluster集群模块
- .NET自定义多文件(图片)上传的实现方式
- redis的bigkeys命令之原理
- MySQL 中 AUTO_INCREMENT 的“坑”--id不连续
- linux连接教程视频,[原创]linux视频教程之连接
- 【转】.NET框架简介
- Ibatis.Net 数据库操作(四)
- ORB-SLAM2 窗口显示Viewer线程
- 扩展欧几里得算法详解
- 外贸自建站优势渐明,你还要观望多久!2018加油
- 捷径app 未能连接到服务器,iOS13快捷指令无法添加第三方捷径的解决办法
- 计算机不支持win10 1809更新,Win10 1809更新失败解决方法
- 解决两台路由器串联上网问题
- ARCHPR(暴力破解压缩包密码软件)
- 故事版(storyBoard)-lllegal configuration connection object cannot have a prototype objct as
- 如何提高孩子专注力?
- TotalControl之手机录屏神器
热门文章
- linux mbr转换成gpt分区格式,MBR怎么转换为GPT?硬盘MBR格式转换成GPT格式教程
- FPGA学习笔记——计数器
- java web 分享功能实现_微信开发(一)基于Wx-java的微信分享功能
- 三生三世十里桃花手游怎么用电脑玩 三生三世十里桃花模拟器教程
- 【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据
- dolphinscheduler搭建以及搭建使用中遇到的问题
- postgres-----pgrouting
- Python实现简易的信息管理系统
- sklearn库主要模块功能简介
- STP生成树详解_01