-
简易的学生管理系统框架
2019-03-07 14:56:06django_test系统中学生管理功能:增加,删除,修改,展示 展示base.html代码
-
在http://www.bootcss.com/找模板和渲染
{% load static %} <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>{% block title %}Dashboard Template for Bootstrap{% endblock %}</title> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link href="{% static 'students/css/base.css' %}" rel="stylesheet"> <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">CRM管理系统</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-right"> <li><a href="#">后台</a></li> <li><a href="#">论坛</a></li> <li><a href="#">学员</a></li> <li><a href="#">退出</a></li> </ul> </div> </div> </nav> <div class="container-fluid"> <div class="row"> <div class="col-sm-3 col-md-2 sidebar"> <ul class="nav nav-sidebar"> <li class="active"><a href="#">学生管理 <span class="sr-only">(current)</span></a></li> <li><a href="#">订单管理</a></li> <li><a href="#">课程管理</a></li> <li><a href="#">班级管理</a></li> </ul> <ul class="nav nav-sidebar"> <li><a href="">系统设置</a></li> <li><a href="">菜单管理</a></li> <li><a href="">权限管理</a></li> </ul> </div> <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <h2 class="sub-header">{%block section %}Section title{% endblock %}</h2> {% block content %} <div class="table-responsive"> <table class="table table-striped"> <thead> <tr> <th>#</th> <th>Header</th> <th>Header</th> <th>Header</th> <th>Header</th> </tr> </thead> <tbody> <tr> <td>1,001</td> <td>Lorem</td> <td>ipsum</td> <td>dolor</td> <td>sit</td> </tr> <tr> <td>1,002</td> <td>amet</td> <td>consectetur</td> <td>adipiscing</td> <td>elit</td> </tr> <tr> <td>1,003</td> <td>Integer</td> <td>nec</td> <td>odio</td> <td>Praesent</td> </tr> <tr> <td>1,003</td> <td>libero</td> <td>Sed</td> <td>cursus</td> <td>ante</td> </tr> <tr> <td>1,004</td> <td>dapibus</td> <td>diam</td> <td>Sed</td> <td>nisi</td> </tr> <tr> <td>1,005</td> <td>Nulla</td> <td>quis</td> <td>sem</td> <td>at</td> </tr> <tr> <td>1,006</td> <td>nibh</td> <td>elementum</td> <td>imperdiet</td> <td>Duis</td> </tr> <tr> <td>1,007</td> <td>sagittis</td> <td>ipsum</td> <td>Praesent</td> <td>mauris</td> </tr> <tr> <td>1,008</td> <td>Fusce</td> <td>nec</td> <td>tellus</td> <td>sed</td> </tr> <tr> <td>1,009</td> <td>augue</td> <td>semper</td> <td>porta</td> <td>Mauris</td> </tr> <tr> <td>1,010</td> <td>massa</td> <td>Vestibulum</td> <td>lacinia</td> <td>arcu</td> </tr> <tr> <td>1,011</td> <td>eget</td> <td>nulla</td> <td>Class</td> <td>aptent</td> </tr> <tr> <td>1,012</td> <td>taciti</td> <td>sociosqu</td> <td>ad</td> <td>litora</td> </tr> <tr> <td>1,013</td> <td>torquent</td> <td>per</td> <td>conubia</td> <td>nostra</td> </tr> <tr> <td>1,014</td> <td>per</td> <td>inceptos</td> <td>himenaeos</td> <td>Curabitur</td> </tr> <tr> <td>1,015</td> <td>sodales</td> <td>ligula</td> <td>in</td> <td>libero</td> </tr> </tbody> </table> </div> {% endblock %} </div> </div> </div> <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </body> </html>
students.html代码
{% extends 'students/base.html' %} {% block title %}学生列表{% endblock %} {% block link %}{% endblock %} {% block section %}{{section}}{% endblock %} {% block content %} <div class="table-responsive"> <form action="" class="form-inline" style="margin-bottom:10px;"> <div class="form-group"> <input type="text" class="form-control" value="{{search}}" name="search" placeholder="姓名,qq,电话"> </div> <button type="submit" class="btn btn-default">搜索</button> <a href="{% url 'students:add' %}" class="btn btn-primary" role="button">添加</a> <a href="{% url 'students:students' %}" class="btn btn-primary" role="button">重置</a> </form> <table class="table table-striped table-bordered"> <thead> <tr> <th>序号</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>qq</th> <th>电话</th> <th>操作</th> </tr> </thead> <tbody> {% for stu in students %} <tr> <td>{{forloop.counter}}</td> <td>{{stu.name}}</td> <td>{{stu.age}}</td> <td>{{stu.gender}}</td> <td>{{stu.qq|default:'未填'}}</td> <td>{{stu.phone|default:'未填'}}</td> <td><a href="{% url 'students:edit' stu.id %}" class="btn btn-primary btn-xs" role="button">编辑</a> <a href="{% url 'students:delete' %}?pk={{stu.id}}" class="btn btn-danger btn-xs" role="button">删除</a></td> </tr> {% endfor %} </tbody> </table> </div> {% endblock %}
student_edit代码
<!--继承模板--> {% extends 'students/base.html' %} {% block title %}添加学生{% endblock %} {% block section %}{{section}}{% endblock %} {% block content %} <form class="form-horizontal" method="post"> {% csrf_token %} <div class="form-group"> <!--lable标签中的for:当鼠标点到input标签的前面时,光标也进入input标签内,for的值和name的值一样,如果不一样,for不起作用--> <label for="name" class="col-sm-2 control-label">姓名</label> <div class="col-sm-3"> <input type="text" class="form-control" id="name" name="name" value="{{student.name}}"> </div> </div> <div class="form-group"> <label for="age" class="col-sm-2 control-label">年龄</label> <div class="col-sm-2"> <input type="text" class="form-control" id="age" name="age" value="{{student.age}}"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">性别</label> <div class="col-sm-10"> <label class="radio-inline"> <input type="radio" name="gender" {% if student.gender == 1 %}checked{% endif %} id="inlineRadio1" value="1"> 男 </label> <label class="radio-inline"> <input type="radio" name="gender" {% if student.gender == 0 %}checked{% endif %} id="inlineRadio2" value="0"> 女 </label> </div> </div> <div class="form-group"> <label for="qq" class="col-sm-2 control-label">qq</label> <div class="col-sm-3"> <input type="text" class="form-control" id="qq" name="qq" value="{{student.qq}}"> </div> </div> <div class="form-group"> <label for="phone" class="col-sm-2 control-label">电话</label> <div class="col-sm-3"> <input type="text" class="form-control" id="phone" name="phone" value="{{student.phone}}"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">年级</label> <div class="col-sm-3"> <select class="form-control" name="grade"> <option value="">未选班级</option> {% for grade in grades %} <option {% if student.grade_id == grade.id %}selected{% endif %} value="{{grade.id}}">{{grade.name}}</option> {% endfor %} </select> </div> </div> <div class="form-group"> <label for="num" class="col-sm-2 control-label">身份证</label> <div class="col-sm-3"> <input type="text" class="form-control" id="num" name="num" value="{{student.studentdetail.num}}"> </div> </div> <div class="form-group"> <label for="college" class="col-sm-2 control-label">毕业院校</label> <div class="col-sm-3"> <input type="text" class="form-control" id="college" name="college" value="{{student.studentdetail.college}}"> </div> </div> <button type="submit" class="btn btn-primary">保存</button> </form> {% endblock %}
views.py代码
from django.shortcuts import render,redirect,reverse from django.http import HttpResponse,JsonResponse from django.template.loader import get_template from datetime import datetime import os from django_test.settings import UPLOAD_ROOT from students.models import Student,Grade,StudentDetail from django.db.models import Q def students(request): #主页面,students页面 section = '学生列表' # 获取查询参数 search = request.GET.get('search','').strip() if search: if search.isdigit(): # 是qq或者电话号码 sts = Student.objects.filter(Q(qq=search)|Q(phone=search),is_deleted=False).order_by('-e_time') else: # 说明是姓名 sts = Student.objects.filter(name__contains=search,is_deleted=False).order_by('-e_time') else: sts = Student.objects.filter(is_deleted=False).order_by('-e_time') return render(request,'students/students.html',context={'students':sts,'section':section,'search':search}) def delete_student(request): #删除方法 pk = request.GET.get('pk',None) if pk: student = Student.objects.get(pk=pk) student.is_deleted = True student.save() return redirect(reverse('students:students')) def add_student(request): #添加页面 section = '添加学生' grades = Grade.objects.all() if request.method == 'GET': return render(request,'students/student_edit.html',context={ 'section':section, 'grades':grades, }) if request.method == 'POST': data = { 'name':request.POST.get('name'), 'age':request.POST.get('age'), 'gender':request.POST.get('gender'), 'qq':request.POST.get('qq'), 'phone':request.POST.get('phone'), 'grade_id':request.POST.get('grade'), } student = Student(**data) student.save() student_detail = StudentDetail( num = request.POST.get('num'), college = request.POST.get('college'), student=student ) student_detail.save() return redirect(reverse('students:students')) def edit_student(request,pk): #编辑页面 student = Student.objects.get(pk=pk) grades = Grade.objects.all() if request.method == 'GET': return render(request,'students/student_edit.html',context={ 'student':student, 'grades':grades, }) if request.method == 'POST': student.name = request.POST.get('name') student.age = request.POST.get('age') student.qq = request.POST.get('qq') student.gender = request.POST.get('gender') student.phone = request.POST.get('phone') student.grade_id = request.POST.get('grade') student.save() #判断一下,student有没有详情,如果没有,创建一个 try: student_detail = student.studentdetail except: student_detail = StudentDetail() student_detail.student = student student_detail.num = request.POST.get('num') student_detail.college = request.POST.get('college') student.studentdetail.save() return redirect(reverse('students:students'))
urls.py代码
from django.urls import path, re_path from students import views app_name = 'students' urlpatterns = [ path('index/', views.index, name='index'), path('detail/<int:pk>/',views.detail, name='aaa'), path('login/',views.login,name='login'), path('upload/',views.upload, name='upload'), path('students_api/',views.students_api,name='students_api'), path('students/',views.students,name='students'), path('delete/',views.delete_student,name='delete'), path('add/',views.add_student,name='add'), path('edit/<int:pk>/',views.edit_student,name='edit'), ]
base.css代码
-
通过模板查到的渲染
/* * Base structure */ /* Move down content because we have a fixed navbar that is 50px tall */ body { padding-top: 50px; } /* * Global add-ons */ .sub-header { padding-bottom: 10px; border-bottom: 1px solid #eee; } /* * Top navigation * Hide default border to remove 1px line. */ .navbar-fixed-top { border: 0; } /* * Sidebar */ /* Hide for mobile, show later */ .sidebar { display: none; } @media (min-width: 768px) { .sidebar { position: fixed; top: 51px; bottom: 0; left: 0; z-index: 1000; display: block; padding: 20px; overflow-x: hidden; overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ background-color: #f5f5f5; border-right: 1px solid #eee; } } /* Sidebar navigation */ .nav-sidebar { margin-right: -21px; /* 20px padding + 1px border */ margin-bottom: 20px; margin-left: -20px; } .nav-sidebar > li > a { padding-right: 20px; padding-left: 20px; } .nav-sidebar > .active > a, .nav-sidebar > .active > a:hover, .nav-sidebar > .active > a:focus { color: #fff; background-color: #428bca; } /* * Main content */ .main { padding: 20px; } @media (min-width: 768px) { .main { padding-right: 40px; padding-left: 40px; } } .main .page-header { margin-top: 0; } /* * Placeholder dashboard ideas */ .placeholders { margin-bottom: 30px; text-align: center; } .placeholders h4 { margin-bottom: 0; } .placeholder { margin-bottom: 20px; } .placeholder img { display: inline-block; border-radius: 50%; }
效果图
- 主界面
- 搜索界面
添加界面
- 修改界面
异常
- 运行时出现如下报错,找了好久没找到问题
- 后来在开发者知识库找到这个贴,再次查看
- 原来自己也犯这样的错误,college被错打成collage,改正后成功
分页
手动分页
-
students.html部分代码:
<div class="btn-group" role="group"> <div class="btn-group" role="group"> <nav aria-label="Page navigation"> {% pagination_html %} </nav> </div> <div class="btn-group" role="group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ per_page }}条/页<span class="caret"></span></button> <ul class="dropdown-menu"> <li><a href="{{ request.path }}?search={{ search }}&per_page=10">10条/页</a></li> <li><a href="{{ request.path }}?search={{ search }}&per_page=20">20条/页</a></li> <li><a href="{{ request.path }}?search={{ search }}&per_page=50">50条/页</a></li> </ul> </div> </div>
-
views.py的students的代码修改为:
def students(request): section = '学生列表' # 获取查询参数 search = request.GET.get('search','').strip() if search: if search.isdigit(): # 是qq或者电话号码 sts = Student.objects.filter(Q(qq=search)|Q(phone=search),is_deleted=False).order_by('-e_time') else: # 说明是姓名 sts = Student.objects.filter(name__contains=search,is_deleted=False).order_by('-e_time') else: sts = Student.objects.filter(is_deleted=False).order_by('-e_time') #当前页码 page = request.GET.get('page',1) page = int(page) #每页显示多少数据 per_page = request.GET.get('per_page',10) per_page = int(per_page) total_num = sts.count() sts = sts[(page-1)*per_page:page*per_page] return render(request,'students/students.html',context={'students':sts,'section':section,'search':search,'per_page':per_page,'page':page,'total_num':total_num,})
-
pagination.html的代码:
<ul class="pagination" style="margin:0px;"> <li {% if page_num == 1 %}class="disabled"{% endif %}> <a href="{{request.path}}?search={{context.search}}&page={{page_num|add:'-1'}}&per_page={{context.per_page}}" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% for num in page_num_list %} <li {% if num == page_num %}class="active"{% endif %}><a href="{{request.path}}?search={{context.search}}&page={{num}}&per_page={{context.per_page}}">{{num}}</a></li> {% endfor %} <li {% if page_num == total_page %}class="disabled"{% endif %}> <a href="{{request.path}}?search={{context.search}}&page={{page_num|add:'1'}}&per_page={{context.per_page}}" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> </ul>
-
customer_tags.py代码:
@register.inclusion_tag('students/pagination.html',takes_context=True) def pagination_html(context): num =3 #总共显示多少页码 page_num = context['page'] per_page = context['per_page'] students = context['students'] total_num = context['total_num'] #总学生数 total_page = math.ceil(total_num/per_page) #总页数 #页码列表 page_list = [] #生成当前页以及左边的页数 if page_num - (num-1)//2 <= 0: #左边页数从1开始 for i in range(page_num): page_list.append(i+1) else: #左边的页数应该从page_num - (num-1)//2开始 for i in range(page_num-(num-1)//2,page_num+1): page_list.append(i) #生成当前页右边的页数 if page_num + (num-1)//2 >= total_page: for i in range(page_num+1,total_page+1): page_list.append(i) else: for i in range(page_num+1,page_num+(num-1)//2+1): page_list.append(i) return { 'page_num_list':page_list, 'page_num':page_num, 'context':context, 'total_page':total_page, }
内置分页
-
调试:
In [1]: from students.models import Student In [2]: from django.core.paginator import Paginator In [5]: p = Paginator(Student.objects.all().order_by('-c_time'),3) In [6]: p.count #总共多少数据 Out[6]: 1 In [7]: Student.objects.all().count() #总共多少数据 Out[7]: 1 In [8]: p.num_pages #总页数 Out[8]: 1 In [9]: p.page_range #页码范围 Out[9]: range(1, 2) In [10]: page1 = p.page(1) #第一页的数据 索引从1开始 In [11]: page1.object_list Out[11]: <QuerySet [<Student: wen-25>]> In [12]: page1.has_previous() #有没有上一页 Out[12]: False In [13]: page1.has_next() #有没有下一页 Out[13]: False In [14]: page1.next_page_number() #下一页的页码,因为目前只有第一页,所以下一页为空 --------------------------------------------------------------------------- EmptyPage Traceback (most recent call last) <ipython-input-14-cf6648317ae3> in <module> ----> 1 page1.next_page_number() ~/PycharmProjects/django/lib/python3.6/site-packages/django/core/paginator.py in next_page_number(self) 162 163 def next_page_number(self): --> 164 return self.paginator.validate_number(self.number + 1) 165 166 def previous_page_number(self): ~/PycharmProjects/django/lib/python3.6/site-packages/django/core/paginator.py in validate_number(self, number) 47 pass 48 else: ---> 49 raise EmptyPage(_('That page contains no results')) 50 return number 51 EmptyPage: That page contains no results
-
-
千锋逆战班day36(Stream API 学生管理系统框架)
2020-03-23 21:06:19} } 学生管理系统(框架) SE Project StudentSystem 实体类: Student 学号、姓名、年龄、性别、班级、java成绩、HTML成绩、Spring成绩、总分 功能: 增 删 改 查 过滤 排序 分层: com.qf.project.entity 实体类...Stream API
案例一package com.qf.day36.t1.streams; public class Employee { private String name; private int age; private double salary; @Override public int hashCode() { return (int)(this.name.hashCode()+this.age+this.salary); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary)) return false; return true; } public Employee() { super(); } public Employee(String name, int age, double salary) { super(); this.name = name; this.age = age; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Employee [name=" + name + ", age=" + age + ", salary=" + salary + "]"; } }
package com.qf.day36.t1.streams; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestStreamMethod { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); list.add("zhaosi"); list.add("zhangsan"); //filter--->过滤 指定规则 System.out.println("---------------filter----------------"); list.stream().filter(s->s.startsWith("z")).filter(s->s.contains("s")).forEach(System.out::println); //limit--->截断,返回不超过指定数量 System.out.println("---------------limit----------------"); list.stream().limit(3).forEach(System.out::println); //distinct--->筛选,利用hashCode和equals(去重) System.out.println("---------------distinct----------------"); List<Employee> elist=new ArrayList<>(); elist.add(new Employee("李易峰",30,60000)); elist.add(new Employee("李宇春",32,70000)); elist.add(new Employee("宋威龙",20,20000)); elist.add(new Employee("李钟硕",27,40000)); elist.add(new Employee("任嘉伦",29,30000)); elist.add(new Employee("李宇春",32,70000));//地址不同,hashCode不相等,equals是相等的 //不会影响原数据 elist.stream().distinct().forEach(System.out::println); elist.forEach(System.out::println); //Map指的是<T,R> 不是集合! System.out.println("---------------map----------------"); //emp--->T getName--->R elist.stream().map((emp)->emp.getName()).forEach(System.out::println); elist.stream().map((emp)->emp.getSalary()).forEach(System.out::println); List<String> strlist=Arrays.asList("aaa","bbb","ccc","ddd","eee"); // strlist.stream().map((s)->s.toUpperCase()).forEach(System.out::println); strlist.stream().map(String::toUpperCase).forEach(System.out::println); System.out.println("---------------sorted----------------"); //sorted调用的是Comparable list.stream().sorted().forEach(System.out::println); // elist.stream().sorted().forEach(System.out::println); System.out.println("---------------sorted(Comparator)----------------"); elist.stream().sorted((x,y)->Double.compare(x.getAge(), y.getAge())).forEach(System.out::println); } }
案例二(创建—中间操作—终止操作)
package com.qf.day36.t1.streams; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class TestCreateStream { public static void main(String[] args) { //Stream--->集合、数组 List<String> list=new ArrayList<>(); list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); list.add("zhaosi"); //Stream做什么,而不是怎么做 //Stream里存的是数据的操作,自身不保存数据 //1、创建Stream // Stream<String> stream=list.stream(); // //2、中间操作 // Stream<String> center=stream.filter((s)->s.length()>=5); // //3、最终操作 // center.forEach(System.out::println); //简化版 list.stream().filter((s)->s.length()>=5).forEach(System.out::println); // List<String> newlist=new ArrayList<>(); // for(String s:list){ // if(s.length()>=5){ // newlist.add(s); // } // } // for (String string : newlist) { // System.out.println(string); // } } }
案例三(常用方法—终止操作)
package com.qf.day36.t2.end; import java.util.ArrayList; import java.util.List; import java.util.Optional; import com.qf.day36.t1.streams.Employee; public class TestEndMethod { public static void main(String[] args) { //1、forEach--->遍历 List<String> list=new ArrayList<String>(); list.add("Alist"); list.add("BSet"); list.add("C罗"); list.add("D弟"); list.add("Eelement"); //2、count--->流中元素的个数 System.out.println("---------------count----------------"); long count=list.stream().filter(s->s.length()>=3).count(); // int count=(int)list.stream().filter(s->s.length()>=3).count(); System.out.println("流中有:"+count); //是否至少匹配一个 System.out.println("---------------anyMatch----------------"); boolean b1=list.stream().filter(s->s.length()>=3).anyMatch(s->s.startsWith("A")); System.out.println("有没有A开头的:"+b1); //是否匹配所有元素 System.out.println("---------------allMatch----------------"); boolean b2=list.stream().filter(s->s.length()>=3).allMatch(s->s.contains("t")); System.out.println("是否全包含t:"+b2); //检查 是否 没有匹配 System.out.println("---------------noneMatch----------------"); boolean b3=list.stream().filter(s->s.length()>=3).noneMatch(s->s.contains("A")); System.out.println("是否全部不包含A:"+b3); //返回第一个 System.out.println("---------------firstFirst----------------"); String ss=list.stream().filter(s->s.length()>=3).findFirst().get(); System.out.println("第一为:"+ss); //返回任意一个 System.out.println("---------------firstAny----------------"); String ss2=list.parallelStream().findAny().get(); System.out.println("任意一个为:"+ss2); //返回最大 System.out.println("---------------max----------------"); List<Employee> elist=new ArrayList<>(); elist.add(new Employee("李易峰",30,60000)); elist.add(new Employee("李宇春",32,70000)); elist.add(new Employee("宋威龙",20,20000)); elist.add(new Employee("李钟硕",27,40000)); elist.add(new Employee("任嘉伦",29,30000)); Optional<Employee>max=elist.stream().max((e1,e2)->e1.getAge()-e2.getAge()); System.out.println("年龄最大的为"+max); //返回最小 System.out.println("---------------min----------------"); Optional<Employee> min=elist.stream().min((e1,e2)->e1.getAge()-e2.getAge()); System.out.println("年龄最小的为"+min); } }
案例四(串行、并行)
package com.qf.day36.t3.threads; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TestStream { public static void main(String[] args) { List<String> list=new ArrayList<>(); for(int i=0;i<100000;i++){ UUID u=UUID.randomUUID(); list.add(u.toString()); } System.out.println("串行……"); //串行-->一条执行路径 单线程 // long start=System.currentTimeMillis(); // long count=list.stream().sorted().count(); // System.out.println("排序了:"+count); // long end=System.currentTimeMillis(); // System.out.println("用时:"+(end-start)); //并行-->多条执行路径 多线程 System.out.println("并行……"); long start=System.currentTimeMillis(); long count=list.parallelStream().sorted().count(); System.out.println("排序了:"+count); long end=System.currentTimeMillis(); System.out.println("用时:"+(end-start)); } }
学生管理系统(框架)
SE Project StudentSystem
实体类:
Student
学号、姓名、年龄、性别、班级、java成绩、HTML成绩、Spring成绩、总分
功能:
增
删
改
查
过滤
排序分层:
com.qf.project.entity 实体类包—>存放类Student
com.qf.project.manger 管理类—>StudentManger
com.qf.project.menu 菜单类—>SystemMain
com.qf.project.util 存放接口—>MyList、MyFilter、MyComparator
com.qf.project.util.impl 存放实现类—>MyArrayList、MyFilterImpl、MyComparatormpl
知识点:面向对象、接口、集合(自定义)、Filter、Comparable、Java81、com.qf.project.entity 实体类包—>存放类Student
package com.qf.project.entity; public class Student { private int id; private String name; private int age; private char gender; private String className; private double javaScore; private double htmlScore; private double springScore; private double totalScore; //无参 public Student() { super(); } //无成绩有参 基本信息 public Student(int id, String name, int age, char gender, String className) { super(); this.id = id; this.name = name; this.age = age; this.gender = gender; this.className = className; } //有成绩有参构造 public Student(int id, String name, int age, char gender, String className, double javaScore, double htmlScore, double springScore) { this(id,name,age,gender,className); this.javaScore = javaScore; this.htmlScore = htmlScore; this.springScore = springScore; //总分不用传递,由三科成绩决定 this.totalScore =javaScore+htmlScore+springScore; } //公共的get/set public int getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public double getJavaScore() { return javaScore; } public void setJavaScore(double javaScore) { this.totalScore-=this.javaScore;//把原本的java成绩减掉 this.javaScore = javaScore;//正常赋值 this.totalScore+=this.javaScore;//加上新成绩 } public double getHtmlScore() { return htmlScore; } public void setHtmlScore(double htmlScore) { this.totalScore-=this.htmlScore;//把原本的成绩减掉 this.htmlScore= htmlScore;//正常赋值 this.totalScore+=this.htmlScore;//加上新成绩 } public double getSpringScore() { return springScore; } public void setSpringScore(double springScore) { this.totalScore-=this.springScore;//把原本的成绩减掉 this.springScore = springScore;//正常赋值 this.totalScore+=this.springScore;//加上新成绩 } //总分只能看,不能改 public double getTotalScore() { return totalScore; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", className=" + className + ", javaScore=" + javaScore + ", htmlScore=" + htmlScore + ", springScore=" + springScore + ", totalScore=" + totalScore + "]"; } }
2、com.qf.project.manger 管理类—>StudentManger
package com.qf.project.manager; import com.qf.project.entity.Student; /** * 完成所有学生管理系统的相关功能 * 逻辑代码、输入数据 * */ public class StudentManager { //只负责接收前端数据、调用后端 /** * 添加学生对象的方法,采用尾插法,插入集合末端 * @param stu Student类对象 * @return 添加学生成功,返回true,否则返回false */ public boolean add(Student stu){ return false; } /** * 根据学生的唯一ID,删除指定的学生 * @param studentId 要删除的学生编号 * @return 删除的学生对象 */ public Student remove(int studentId){ return null; } /** * 修改方法 ,指定学生编号 * @param studentId 学号 * @return 成功修改返回true,否则false */ public boolean modify(int studentId){ return false; } /** * 根据学生编号,查询单个学生对象 * @param studentId 学号 * @return 查询到的学生对象或null */ public Student get(int studentId){ return null; } /** * 查询所有,直接遍历集合 */ public void get(){ //打印所有学生信息 } }
3、com.qf.project.menu 菜单类—>SystemMain
package com.qf.project.menu; import com.qf.project.entity.Student; import com.qf.project.util.MyList; import com.qf.project.util.impl.MyArrayList; public class SystemMain { public static void main(String[] args) { //只有菜单 //1、查看 //2、修改、 //3、添加 //4、删 MyList<Student> list=new MyArrayList<>(); list.add(new Student(1,"李宇春",18,'女',"NZ2001")); list.add(new Student(2,"李易峰",17,'男',"NZ2001")); list.add(new Student(3,"李钟硕",18,'男',"NZ2002")); list.add(new Student(4,"任嘉伦",19,'男',"NZ2003")); list.add(new Student(5,"宋威龙",20,'男',"NZ2002")); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
4、com.qf.project.util 存放接口—>MyList、MyFilter、MyComparator
package com.qf.project.util; /** * 增加: * add(E e); * add(int index,E e); *删除: *remove(E e); *remove(int index); *改: *set(int index,E e); *获取: *int size(); *Object[] toArray(); *boolean isEmpty(); *boolean contains(Object o); *MyArrayList<E> subList(int start,int end); *int indexOf(Object o); *int lastIndexOf(Object o); *E get(int index); * * @param <E> 泛型 应用在不同类型下,作为集合 */ public interface MyList<E>{ /** * 添加方法,添加元素到集合末尾 * @param e 泛型 * @return true成功 false失败 */ boolean add(E e); /** * 添加方法,指定位置进行添加 * @param index 指定的下标位置 * @param e 泛型 * @return true成功 false失败 */ boolean add(int index,E e); /** * 移除方法,指定移除元素 * @param o 元素 * @return 移除的元素 */ E remove (Object o); /** * 移除方法,指定移除的下标 * @param index 指定的下标 * @return 移除的元素 */ E remove(int index); /** * 覆盖方法,替换指定下标的元素 * @param index 指定的下标 * @param e 替换的元素 * @return 被替换的元素 */ E set(int index,E e); /** * 获取集合中有效元素的个数 * @return 有效元素的个数 */ int size(); /** * 获取当前集合中,所有元素的Object类型的数组 * @return Object[] 包含集合中所有的对象 */ Object[] toArray(); /** * 判断当前集合是否为空 * @return 为空返回true,有元素返回false */ boolean isEmpty(); /** * 判断某个对象o,在集合中是否存在 * @param o 需要查找的对象 * @return 存在返回true,不存在false */ boolean contains(Object o); /** * 根据需求,返回start到end之间的MyList集合的子集合 * @param start 要求有效下标的范围,不能大于end * @param end 要求有效下标的范围,不能小于等于start * @return 数据符合要求,返回当前集合的子集合。若数据不符合要求,返回null */ MyList<E> subList(int start,int end); /** * 获得指定元素在集合中第一次出现的位置 * @param o 指定元素 * @return 找到返回值,返回下标,否则返回-1 */ int indexOf(Object o); /** * 获得指定元素在集合中最后一次出现的位置 * @param o 指定元素 * @return 找到返回下标,否则返回-1 */ int lastIndexOf(Object o); /** * 根据指定下标位置,获得元素 * @param index 下标 * @return 元素对象 */ E get(int index); }
5、com.qf.project.util.impl 存放实现类—>MyArrayList、MyFilterImpl、MyComparatormpl
package com.qf.project.util.impl; import java.util.Arrays; import com.qf.project.util.MyList; public class MyArrayList<E> implements MyList<E> { //1、保存任意类型数据的数组,集合的底层 private Object[] elementData=null; //2、集合的初始容量 private static final int DEFAULT_CAPACITY=10; //3、保存数组中有效元素个数(下一个元素插入的下标) private int size=0; public MyArrayList() { // elementData=new Object[DEFAULT_CAPACITY]; //统一化当前集合页的初始化方式 this(DEFAULT_CAPACITY); } /** * 手工初始化集合的容量 * @param initCapacity 传入的容量大小:要求传入的容量大于0并且小于Integer.MAX_VALUE -8 */ public MyArrayList(int initCapacity){ //判断 initCapacity是否符合要求 if(initCapacity<0||initCapacity>Integer.MAX_VALUE-8){ throw new IllegalArgumentException("传递了一个不符合规范的初始容量:"+initCapacity); }else{ elementData=new Object[initCapacity]; } } @Override public boolean add(E e) { if(size==elementData.length){//数组是否满了 //扩容 grow(size+1); } elementData[size]=e; size++; return true; } /** * 为底层数组elementData做扩容 * @param minCapacity 扩容需要的最小容量 */ private void grow(int minCapacity){ int oldCapacity=elementData.length; int newCapacity=oldCapacity+(oldCapacity>>1);//要扩容的大小 if(newCapacity>Integer.MAX_VALUE-8){ throw new OutOfMemoryError("集合溢出了!"); } if(newCapacity-minCapacity<=0){ newCapacity=minCapacity; } /* * 1、创建新数组 * 2、拷贝原数据到新数组 * 3、返回新数组的首地址 * 4、替换 */ elementData=Arrays.copyOf(elementData, newCapacity); } @Override public boolean add(int index, E e) { checkIndex(index);//1、先判断下标是否合理,不合理,抛异常,程序因异常而终止 if(size==elementData.length){ grow(size+1); } for(int i=size;i>index;i--){ elementData[i]=elementData[i-1]; } elementData[index]=e; size++; return true; } /** * 指定下标的安全检查!如果下标值不符合要求,抛异常 * @param index 下标 */ private void checkIndex(int index){ if(index<0||index>=size){ throw new ArrayIndexOutOfBoundsException(index); } } @Override public E remove(Object o) { for(int i=0;i<elementData.length;i++){ if(elementData[i]==o){ for(int j=i;j<size-1;j++){ elementData[i]=elementData[i+1]; } } } size--; return null; } @Override public E remove(int index) { checkIndex(index); for(int i=index;i<size-1;i++){ elementData[i]=elementData[i+1]; } size--; return null; } @Override public E set(int index, E e) { checkIndex(index); elementData[index]=e; return null; } @Override public int size() { return size; } @Override public Object[] toArray() { return null; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public MyList<E> subList(int start, int end) { return null; } @Override public int indexOf(Object o) { return 0; } @Override public int lastIndexOf(Object o) { return 0; } @Override public E get(int index) { checkIndex(index);//检查下标 return (E)elementData[index];//返回指定下标的元素 } }
-
学生管理系统SSM框架
2018-08-02 10:53:55JAVA学习学生管理系统SSM框架,基础SSM框架,内含SQL文件 -
laravel 框架 学生管理系统
2018-11-13 10:04:18laravel 开发的学生管理系统,适合laravel框架学习使用。 -
c语言学生成绩管理系统框架
2020-07-26 22:03:26简易版学生成绩管理系统框架 代码如下 #include “stdafx.h” #include #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> ...简易版学生成绩管理系统框架
代码如下
#include “stdafx.h”
#include
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
using namespace std;//学号长度
#define NO_LENGTH 20
//姓名长度
#define NAME_LENGTH 11
//定义学生结构体的数据结构
typedef struct Student
{
char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH];
} St;
//定义结点的数据结构
typedef struct node
{
St data; struct node *next;
} Node, *Link;
//功能菜单
void myMenu(void);
//输入学生信息
void inputNode(Link p);
//新增学生记录
bool addNode(Link head);
//删除学生记录
bool deleteNode(Link head);
//输入学号
void inputStudentNo(char s[], char no[]);
//打印链表
void displayNode(Link head);
//查询学生记录
bool queryNode(Link head);
//插入一个学生记录
void insertNode(Link head, Link newNode);
//修改学生记录
bool modifyNode(Link head);
//统计学生人数
int countNode(Link head);
//清除链表
void clearLink(Link head);
int _tmain(int argc, _TCHAR* argv[])
{int select; //功能选项代码 int count; //学生人数 //链表头 Link head; head = (Link)malloc(sizeof(Node)); head->next = NULL; while (1) { myMenu(); printf("\n请输入你的选择(1-7):"); cin>>select; switch (select) { case 1: if (addNode(head)) { printf("成功增加一个学生记录。\n"); ; } break; case 2: if (deleteNode(head)) { printf("成功删除一个学生记录。\n"); } else { printf("没有找到要删除的学生记录。\n"); } break; case 3: if (queryNode(head)) { printf("成功找到学生记录。\n"); } else { printf("没有找到要查询的学生记录。\n"); } break; case 4: if (modifyNode(head)) { printf("成功修改一个学生记录。\n"); } else { printf("没有找到要修改的学生记录。\n"); } break; case 5: count = countNode(head); printf("学生人数为:%d\n", count); break; case 6: displayNode(head); break; case 7: clearLink(head); return 0; ; default: printf("输入不正确,请输入1-7之间的数。\n"); break; } }
}
//功能菜单
void myMenu(void)
{
printf("\n"); printf(" * * * * * * * * * 菜 单 * * * * * * * * * *\n"); printf(" 1 增加学生记录 2 删除学生记录 \n"); printf(" 3 查找学生记录 4 修改学生记录 \n"); printf(" 5 统计学生人数 6 显示学生记录 \n"); printf(" 7 退出系统 \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * *\n");
}
//输入学生信息
void inputNode(Link newNode)
{
printf("请输入学生学号:"); cin>>newNode->data.studentNo; printf("请输入学生姓名:"); cin>>newNode->data.studentName; newNode->next = NULL;
}
//增加学生记录
bool addNode(Link head)
{
Link p, q; Link newNode; //空结点指针 bool flag = false; //是否增加成功 newNode = (Link)malloc(sizeof(Node)); inputNode(newNode); p = head; q = head->next; //如果是空链表 if (head->next == NULL) { head->next = newNode; flag = true; } else { while (q != NULL) { if (strcmp(newNode->data.studentNo, q->data.studentNo) < 0) { p->next = newNode; newNode->next = q; flag = true; break; } else { p = q; q = q->next; } } } if (q == NULL && flag == false) { p->next = newNode; flag = true; } return flag;
}
void inputStudentNo(char s[], char no[])
{
printf("请输入要%s的学生学号:", s); cin>> no;
}
//按照给定的学号删除学生记录,如果删除成功返回true,否则返回false
bool deleteNode(Link head)
{
char no[NO_LENGTH]; //要删除学生的学号 Link p, q; inputStudentNo("删除", no); p = head; q = head->next; while (q != NULL) { if (strcmp(q->data.studentNo, no) == 0) { p->next = q->next; free(q); return true; } else { p = q; q = q->next; } } return false;
}
void displayNode(Link head)
{
printf("\n\t***学生信息***\n"); printf("\t学号\t\t姓名\n"); Link p = head->next; while (p != NULL) { printf("\t%s\t\t%s\n", p->data.studentNo, p->data.studentName); p = p->next; }
}
//按照给定的学号查询学生记录,找到返回true,没有找到返回false
bool queryNode(Link head)
{
char no[NO_LENGTH]; inputStudentNo("查询", no); Link p = head->next; while (p != NULL) { if (strcmp(p->data.studentNo, no) == 0) { printf("%s的姓名是%s\n", no, p->data.studentName); return true; } else { p = p->next; } } return false;
}
//修改学生记录,修改成功,返回true,否则返回false
bool modifyNode(Link head)
{
char no[NO_LENGTH]; char no_new[NO_LENGTH]; //新学号 char name_new[NAME_LENGTH]; //新姓名 int select; //功能选择 Link p, q; inputStudentNo("修改", no); printf("请输入需要修改的项目: 1 学号 2 姓名\n"); cin>>select; p = head; q = head->next; while (q != NULL) { if (strcmp(q->data.studentNo, no) == 0) { if (select == 1) { p->next = q->next; q->next = NULL; printf("请输入该学生的新学号:"); cin>> no_new; strcpy_s(q->data.studentNo, no_new); insertNode(head, q); } else { printf("请输入该学生的新姓名:"); cin>> name_new; strcpy_s(q->data.studentName, name_new); } return true; } else { p = q; q = q->next; } } return false;
}
//插入一个学生记录
void insertNode(Link head, Link newNode)
{
Link p, q; bool flag = false; //是否插入成功 p = head; q = head->next; //如果是空链表 if (head->next == NULL) { head->next = newNode; flag = true; } else { //不是空链表 while (q != NULL) { if (strcmp(newNode->data.studentNo, q->data.studentNo) < 0) { p->next = newNode; newNode->next = q; flag = true; break; } else { p = q; q = q->next; } } } if (q == NULL && flag == false) { p->next = newNode; }
}
//统计学生人数
int countNode(Link head)
{
Link p; int count = 0; p = head->next; while (p != NULL) { count++; p = p->next; } return count;
}
//清除链表
void clearLink(Link head)
{
Link p, q; p = head; q = head->next; while (q != NULL) { free(p); p = q; q = q->next; } free(p);
}
-
SSM框架搭建的学生管理系统
2017-12-19 14:43:24SSM框架搭建的学生管理系统 -
SSH框架实现的学生管理系统
2018-03-27 11:43:53ssh框架实现的学生管理系统,其中也实现了前台界面的学生管理。 -
学生管理系统(ssm框架).zip
2020-06-27 09:24:26学生管理系统,采用Spring Spring MVC MyBatis框架,使用easyui前端框架开发,使用MySQL8.0数据库 -
java web管理系统框架_SSM框架下的javaweb学生管理系统--搭建系统结构
2021-03-04 08:29:08业务需求:一个登录页面,一个学生展示页面,添加、修改、删除三个功能目的是给大家了解一个初级系统的构造,不写那么复杂的需求了。从第一步开始:创建项目打开eclipse,点击右上角的File-->New-->Dynamic ...业务需求:一个登录页面,一个学生展示页面,添加、修改、删除三个功能
目的是给大家了解一个初级系统的构造,不写那么复杂的需求了。
从第一步开始:创建项目
打开eclipse,点击右上角的File-->New-->Dynamic Web project,弹出如下图的窗口
点击Next按钮后,呈现的是如下的窗口
再次点击Next按钮,呈现的是如下窗口
点击Finish按钮后就生成了student项目,可以在左侧查看到生成的student项目,下图就是刚刚生成的项目,初始的结构就是这样的
我们现在要创建各种java包src-->new-->package
点击package后,弹出如下窗口
点击Finish按钮,就新建了一个 com.student.pojo包
重复这样的动作,我们依次新建下边的包,com.student.mapper com.student.service com.student.service.impl com.student.controller
-
学生管理系统——框架
2019-06-17 15:11:23需要运用的:窗口、输入输出、类、方法、重载。异常处理 -
框架写的简单学生管理系统
2018-07-05 16:13:06ssm框架整合,springMVC+mybatis做的简单学生信息管理系统,实现其增删改查功能,用的mysql数据库。 -
学生信息管理系统-easyui框架
2019-01-28 17:13:37easyui框架下的学生信息管理系统,基于easyui的强大界面控件。 -
构建系统框架(学生管理系统)
2020-04-02 11:58:06while(true) { System.out.println("------学生管理系统------"); System.out.println(" 1.查看所有学生"); System.out.println(" 2.增加学生"); System.out.println(" 3.删除学生"); System.out.println(" 4.修改... -
ssh框架的学生成绩管理系统
2018-03-29 15:38:58基于springmvc 的ssh框架的学生管理系统,里面有教程,数据库是mysql,都已经写好了 -
学生信息管理系统:SSM框架实现学生信息的增删改查
2019-01-04 13:10:42该项目主要实现对学生信息的管理,通过学生信息管理系统能够进行学生信息的增加、查看,查询,删除等功能,实现学生管理工作的系统化和自动化。 该项目已经上传到github了,想看源码请移步:... -
基于SSM框架的学生信息管理系统
2018-06-25 11:37:26本系统是基于SSM框架的学生管理系统,其中功能有登录、注册。学生信息的增、删、改、查。和查询信息时的分页功能。 -
SSM框架简单的学生管理系统
2020-04-10 16:59:48项目比较简单,适合SSM初学者查看。 包括基本的学生信息的增删改查和成绩的录入,还包括课程的设置学分成绩的设置,页面比较简单,还没有完善登录功能。 -
使用ssh框架制作的学生管理系统
2018-03-30 08:14:04这是初学者可以操作的一个简单的使用ssh制作的学生管理系统,有需要的可以下载看看,对于你学习ssh肯定会有很大的帮助 -
基于ssm框架的学生信息管理系统
2020-07-10 21:58:50大学java ee软件开发课程的课程设计项目,基于ssm框架的学生信息管理系统,支持上传文件和下载文件 -
基于ThinkPHP框架的学生管理系统+留言板后台管理系统
2018-07-10 17:46:56系统后端采用thinkphp3.2框架,前端采用boostrap,数据库采用mysql。网站首页:学生管理系统设计思路:①首先实现管理员登录功能:管理员注册,登录,修改密码。②专业和班级信息列表功能:获取数据库中专业和班... -
JAVA_MVC框架编写的学生管理系统
2013-08-05 17:05:57eclipse中利用JAVA_MVC框架编写的学生管理系统,比较适合大学毕业设计及初学者参考 -
SSH框架做的学生成绩管理系统
2010-11-12 13:46:29用ssh框架做的一个学生成绩管理系统,有学生成绩管理,学生管理等功能。 -
Qt框架C++学生信息管理系统
2017-02-23 11:10:00学生信息管理系统 Qt窗体程序 包括用户登录、学生信息展示、新增,编辑,删除功能 、根据学号、姓名进行查询。 -
学生管理系统(ssm框架)
2020-06-27 09:29:07首先放图: 开发工具:idea 数据库:MySQL 技术:Spring Spring MVC MyBaits ajax easyui等 蓝奏云:https://zyjblogs.lanzous.com/ir9jBe2j0te -
基python的Django框架学生信息管理系统.zip
2020-04-03 10:47:08基python的Django框架学生信息管理系统.zip -
SSM框架整合开发学生管理系统后台
2016-07-02 18:06:47支持拦截、有助于理解ssm框架的基本机制 -
基于SSM框架学生管理系统的实现
2017-08-25 09:33:22这是我一年前做的项目的,算是SSM框架入门的实例,maven管理工具所用到的仓库私服为阿里云的仓库。 整个项目的目录: jdbc.properties是对数据库信息的配置:#mysql version database setting jdbc.driver=... -
基于jsp的大学生成绩管理系统ssh框架
2020-10-25 16:49:26使用java开发的学生成绩管理系统,其主要功能是完成对学生成绩的基本管理,主要模块包括:用户管理模块,学生档案模块,课程模块,成绩管理模块,打印报表模块。数据库mysql,开发工具Myeclipse,利用struts2,... -
基于SSM框架的学生班务管理系统HEUClassAffair
2018-07-12 19:26:46该项目是本人基本团队为本人所在大学学院所编写的学生版务管理系统,前端页面使用bootstrap,后台使用SSM框架