学生选课管理系统

  • 前端遇到的问题
    • 一、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);}});    };
  1. ajax中属性要小写(如:data
  2. 如果要在地址栏后拼接参数(如: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">&times;</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模态框共用

目的: 添加按钮和编辑按钮共用同一个模态框,如下图所示

  1. 触发模态框条件,按钮中必须得有data-toggle="modal" data-target="#updateModal"这两个属性。注意: target中的值要填写你自己模态框中的id值。

  2. 添加按钮编辑按钮处设置同一方法不同参数

  3. 添加按钮:设置id=add

  4. 编辑按钮:设置class=edit 为什么编辑设置class,而添加设置id呢?
    因为我的编辑按钮是跟随数据遍历出来的,看下图你就明白了。添加只有一个,id有唯一性(只能有唯一的一个id)。而编辑可能有多个,如果使用id则只有第一个编辑能触发模态框,其他编辑按钮因为id值重复导致不能触发模态框

  5. 当点击添加 会触发edit('add')方法,点击编辑时触发edit('edit')方法
    attr(参数1,参数2)–>参数1是属性,参数2是给这个属性赋的值

  6. 共用模态框效果如下图所示:

  7. 编辑按钮需要信息的回显,后续跟新。


四、编辑框回显

目的: 数据回显并根据性别的数字选中不同的option 数字1:女 数字0:男

思路:

  1. 点击编辑按钮,发送带有id值的请求到后台查询此id的老师信息
  2. 判断返回的性别数字。如果是1,则显示女,如果是0,显示男

遇到的问题:

  1. 性别判断成功后如何选中下拉框中的女或者男,可直接从//TODO 编辑代码从此处看 3看起。

  2. 如何选中下拉框中的第二个男?$("#select").find("option:nth-child(2)").prop("selected","selected");
    2.1 #select<select>标签的id
    2.2 "option:nth-child(2)"选中下拉框中的第二个
    2.3 prop("selected","selected");将第二个下拉框设置为selected,这样form表提交时,只会提交selected="selected"的下拉框中的value值

  3. 使用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>
    

思路:

  1. 选中排序条件时,发送对应数字到后台

  2. 后台接受前端的排序数字

    @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";}
    
  3. 逻辑层完善逻辑

    //排序@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);}}
    

八、分页后续

问题: 上一个分页有瑕疵,选中排序条件,只排序了当前页,当点击上一页,下一页,首页,尾页时页面并没有进行排序。
思路:

  1. 我的排序做法是点击排序条件,发送对应的orderby数据

  2. 参考上方,我们可以在分页处的请求代码加上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>
    
  3. 问题是怎么获取orderby的值呢?

  4. 在查询方法接受到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";
    }
  5. 注释掉的代码也可以使用,测试了model.addAttribute()可以存放多个键值对

  6. 这样每点击一次下一页,首页,上一页,尾页等都能保证有排序的效果


九、模糊搜索+排序(巨坑!!)

目的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>
    

对于坑的总结:

  1. 模糊查询和排序不能使用#,只能是$,原因上面有讲到
  2. button得和form表单连用,在button中添加onclick无法得到返回的数据,导致模糊查询没有效果

十、请求成功到后台,前端报404

因为我用的是ajax发送的请求,所以后台返回值类型应该是JSON类型的结果,所以在方法上加个@ResponseBody即可。

后端遇到的问题

一、提示没有get方法

猛戳此链接:There is no getter for property named

保持更新中…

SSM学生选课管理系统项目中问题总结(未完待续)相关推荐

  1. 深度学习(三十八)初识DL在自然语言序列标注中的应用-未完待续

    初识DL在自然语言中的应用 原文地址: 作者: 一.自然语言序列标注 虽然之前自己对于HMM.CRF.Word2vec.Attention机制.Encode-Decode等,在自然语言领域的应用已经比 ...

  2. 【JAVA程序设计】(C00095)基于SSM框架的学生选课管理系统

    基于SSM框架的学生选课管理系统 项目获取 文章结构 一.开发框架及业务方向 1.开发环境 2.开发框架 3.整体业务 二.项目结构及页面展示 1.项目整体结构 2.学生页面 3.教师页面 4.管理员 ...

  3. 【JAVA程序设计】(C00094)基于SSM学生考勤管理系统

    基于SSM学生考勤管理系统 项目获取 文章结构 一.开发框架及业务方向 1.开发环境 2.开发框架 3.整体业务 二.项目结构及页面展示 1.项目整体结构 2.学生页面 3.教师页面 4.管理员页面 ...

  4. ssm学生宿舍管理系统源码

    项目访问 localhost:8080 端口根据自己的环境变动 不要项目名访问. 默认密码123456 MD5Util加密方式 #eclipse 修改访问地址不带项目名称 :https://blog. ...

  5. 基于javaweb的学生选课管理系统(java+ssm+bootstrap+javascript+mysql)

    基于javaweb的学生选课管理系统(java+ssm+bootstrap+javascript+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/ ...

  6. 基于SSM搭建的学生信息管理系统项目源码+学习视频

    基于SSM搭建的学生信息管理系统 目录 基于SSM搭建的学生信息管理系统 1.为什么要编写学生信息管理系统 1.1编写项目的起因: 2.编写学生信息管理系统的过程 2.1项目成果的展示: 登录界面: ...

  7. 数据库课程设计-学生选课管理系统(实训报告+答辩ppt+源码+sql文件+打包好的程序)springboot项目-javaweb

    作者:ChenZhen 博客地址:https://www.chenzhen.space/ 版权:本文为博主 ChenZhen 的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明. 如果对你 ...

  8. (附源码)mysql+ssm学生选课系统 毕业设计 170920

     摘 要 本论文主要论述了如何使用JAVA语言开发一个学生选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述学生选课系统的当前 ...

  9. ssm+mysql+ssm学生选课系统 毕业设计-附源码170920

    摘 要 本论文主要论述了如何使用JAVA语言开发一个学生选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述学生选课系统的当前背 ...

最新文章

  1. disconf 中文乱码
  2. 如果文件夹不存在,请创建它
  3. R语言中的聚类的使用
  4. Dubbo源码学习总结系列三 dubbo-cluster集群模块
  5. .NET自定义多文件(图片)上传的实现方式
  6. redis的bigkeys命令之原理
  7. MySQL 中 AUTO_INCREMENT 的“坑”--id不连续
  8. linux连接教程视频,[原创]linux视频教程之连接
  9. 【转】.NET框架简介
  10. Ibatis.Net 数据库操作(四)
  11. ORB-SLAM2 窗口显示Viewer线程
  12. 扩展欧几里得算法详解
  13. 外贸自建站优势渐明,你还要观望多久!2018加油
  14. 捷径app 未能连接到服务器,iOS13快捷指令无法添加第三方捷径的解决办法
  15. 计算机不支持win10 1809更新,Win10 1809更新失败解决方法
  16. 解决两台路由器串联上网问题
  17. ARCHPR(暴力破解压缩包密码软件)
  18. 故事版(storyBoard)-lllegal configuration connection object cannot have a prototype objct as
  19. 如何提高孩子专注力?
  20. TotalControl之手机录屏神器

热门文章

  1. linux mbr转换成gpt分区格式,MBR怎么转换为GPT?硬盘MBR格式转换成GPT格式教程
  2. FPGA学习笔记——计数器
  3. java web 分享功能实现_微信开发(一)基于Wx-java的微信分享功能
  4. 三生三世十里桃花手游怎么用电脑玩 三生三世十里桃花模拟器教程
  5. 【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据
  6. dolphinscheduler搭建以及搭建使用中遇到的问题
  7. postgres-----pgrouting
  8. Python实现简易的信息管理系统
  9. sklearn库主要模块功能简介
  10. STP生成树详解_01