日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学生通讯录

發布時間:2023/12/10 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学生通讯录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目簡介

這是一個前后端分離的項目,基本技術棧是SpringBoot+SpringDataJPA+EasyExcel+Vue+ElementUI。這里說明一下,Easy Excel是阿里巴巴一個開源項目,可以方便的將數據庫數據導出為Excel,也可以根據提供的模板將Excel中的數據導入到數據庫中。SpringDataJPA(Hibernate)使用起來比較方便,可以動態拼寫sql語句,當然感興趣的朋友也可以使用MyBatis,這里不再贅述。這個項目可以:
1、使用SpringDataJPA實現基本的增刪改查,分頁查詢(每頁10條數據,自動計算頁數)
2、動態查詢(給出的查詢條件不確定個)
3、模糊查詢(關鍵字查詢,比如給我一個“王”字可以找出所有姓王的同學)
4、將數據庫數據導出為Excel并下載到本地,也可以根據模板將本地Excel中的數據導入到數據庫,學號已存在的信息不會導入數據庫。
5、根據不同的專業查找信息
6、備份功能:本項目有設置回收站,當從Student表中刪除數據后會保存在回收站中,還可以恢復或者徹底刪除。
7、添加信息檢查:如果學號已經存在,或者郵箱、手機不合法則不能插入信息,會彈出警告;生日自動計算,選擇專業時選項是從數據庫中查詢出來的,而不是自己錄入。
項目展示:

代碼目錄:

以下內容是項目說明,具體源碼請移步GitHub
https://github.com/Nown1/contacts

跨域訪問問題

這是一個前后端分離的項目,后端SpringBoot+SpringDataJPA+EasyExcel,服務端口是8181,需要在application.yml文件添加以下信息

spring:datasource:url: jdbc:mysql://localhost:3306/nown_test02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverjpa:show-sql: trueproperties:hibernate:format_sql: true server:port: 8181

前端服務端口是8080,當8080端口去向8181端口發送請求時便涉及到了跨域訪問,因此需要添加配置類信息,代碼如下:

import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class CorsConfig implements WebMvcConfigurer { //重載WebMvcConfigurer的addCorsMappings方法@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS").allowCredentials(true).maxAge(3600).allowedHeaders("*");} }

基本思路應該是,前端向后端發送請求,后端Controller要給出響應,然后去調用Service類的方法,Service又需要去調用Dao層接口。關于學生的信息,我們不妨設置一個StudentController去響應請求,設置一個StudentService類去調用StudentDao的方法。SpringDataJPA最大的好處就是,我們不需要自己去寫SQL語句,只要繼承一些接口就可以實現增刪改查功能。JpaRepository接口繼承了PagingAndSortingRepository和QueryByExampleExecutor兩個接口,能夠實現增刪改查。為了實現動態查詢,需要再繼承JpaSpecificationExecutor接口。這樣StudentDao可以通過方法名來自動拼寫sql,實現方法。比如通過id查找信息,方法名就是findById(Integer id)。如果是模糊查詢,就要加一個關鍵字Like。比如通過名字模糊查詢,方法名就是findByNameLike。代碼如下:
StudentDao

import com.nown.contacts.entity.Student; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.PagingAndSortingRepository;import java.util.List;public interface StudentDao extends JpaRepository<Student,Integer> ,JpaSpecificationExecutor<Student> {Student findStudentByNumber(String number);List<Student> findStudentsByNameLike(String name); }

StudentService:

import com.nown.contacts.entity.Student; import com.nown.contacts.entity.StudentDaoSpec; import com.nown.contacts.repository.StudentDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service;import java.util.Iterator; import java.util.List;@Service public class StudentService {@Autowiredprivate StudentDao studentDao;public List<Student> findByParams(Student student){List<Student> list = studentDao.findAll(StudentDaoSpec.getSpec(student.getNumber(),student.getName(),student.getSex(),student.getAge(),student.getBirthday(),student.getTel(),student.getAddress(),student.getMail(),student.getMajor()));return list;}public Page<Student> findAll(PageRequest request) {return studentDao.findAll(request);}public Student save(Student student) {return studentDao.save(student);}public void save(List<Student> list){Iterator<Student> iterator=list.iterator();while (iterator.hasNext()){Student student= iterator.next();if (findByNumber(student.getNumber())==null){save(student);}else{System.out.println("學號已存在,未添加到數據庫:"+student);}}}public Student findById(Integer id) {return studentDao.findById(id).get();}public void deleteById(Integer id) {studentDao.deleteById(id);}public List<Student> findAll(){return studentDao.findAll();}public Student findByNumber(String number){return studentDao.findStudentByNumber(number);}public List<Student> findByNameLike(String name){return studentDao.findStudentsByNameLike("%"+name+"%");} }

關于Vue

Vue是一個比較好用的前端框架,官網有教程,官網地址:https://cn.vuejs.org/v2/guide/
為了方便向后端發送請求,我安裝了axios插件。為了盡量讓視圖美觀,提高開發效率,我又安裝了elementUI插件。當我們開發時可以找到想要的模板,直接把代碼copy下來修改一下就可以使用。npm安裝命令:

$ npm install axios $ npm i element-ui -S

這里附上ElementUI地址:https://element.eleme.cn/#/zh-CN
vue我理解為是一個嵌套的視圖。它有一個App.vue 的主頁面。當我們要“跳轉”到其他頁面時,需要在App.vue開辟一個入口,使用<router-view>標簽。這樣我們要訪問的頁面就會呈現在這個標簽里面。
Vue目錄:

為了解決頁面跳轉的路徑問題,需要把我們寫的所有視圖導入,比如import AddStudent from '../views/AddStudent' 。在const routes里面添加路徑,重點是path和component兩個屬性。在index.js添加如下信息:

import Vue from 'vue' import VueRouter from 'vue-router' import StudentManage from '../views/StudentManage' import AddStudent from '../views/AddStudent' import Index from '../views/Index' import StudentUpdate from '../views/StudentUpdate' import StudentSearch from '../views/StudentSearch.vue' import List from '../views/List.vue' import Dustbin from '../views/Dustbin.vue' import Fuzzy from '../views/Fuzzy.vue'Vue.use(VueRouter)const routes = [{path: "/",name: "通信錄",component: Index,redirect: "/StudentManage",},{path: "/StudentManage",name: "信息查詢",component: StudentManage},{path: "/AddStudent",name: "添加信息",component: AddStudent},{path: "/StudentSearch",name: "查找",component: StudentSearch},{path: '/update',component: StudentUpdate},{path: '/list',component: List},{path:'/dustbin',component:Dustbin},{path:'/Fuzzy',component:Fuzzy} ]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes })export default router

App.vue代碼:

<template><div id="app"><el-container style="height: 2000px; border: 1px solid #eee"><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu router :default-openeds="['0']"><el-submenu index="0"><template slot="title"><i class="el-icon-notebook-1"></i>通信錄</template><el-menu-item index="StudentManage"><i class="el-icon-refresh"></i>信息查詢</el-menu-item><el-menu-item index="AddStudent"><i class="el-icon-edit"></i>添加信息</el-menu-item><el-menu-item index="StudentSearch"><i class="el-icon-search"></i>查找</el-menu-item><el-menu-item index="Fuzzy"><i class="el-icon-view"></i>模糊查詢</el-menu-item><el-menu-item index="Dustbin"><i class="el-icon-delete"></i>回收站</el-menu-item></el-submenu><el-submenu index="1"><template slot="title"><i class="el-icon-document"></i>文件</template><el-menu-item @click="exportWord"><i class="el-icon-download"></i>下載文件</el-menu-item><el-upload ref="upload" action :multiple="false" :auto-upload="false" :limit="1" :http-request="importWordConfirm"><el-button slot="trigger" size="small" type="primary" style="margin-bottom: 10px;" plain>選取文件</el-button><el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload" plain>上傳文件</el-button></el-upload></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-folder-opened"></i>分類</template><el-menu-item v-for="item in majors" @click="jump(item.name)"><i class="el-icon-collection-tag"></i>{{item.name}}</el-menu-item></el-submenu></el-menu></el-aside><el-main><router-view></router-view></el-main></el-container></div> </template><style>.el-header {background-color: #B3C0D1;color: #333;line-height: 60px;}.el-aside {color: #333;} </style><script>export default {data() {return {form: {id:null,name: null,number: null,sex: null,age: null,birthday: null,tel: null,address: null,mail: null,major: null,},fileList: [{id: 0,name: ''}],majors:[]};},methods: {exportWord() {//將數據庫數據導出為Excel并下載this.$axios.get('http://localhost:8181/file/download', {responseType: 'blob'}).then(res => {let blob = new Blob([res.data], {type: 'application/ms-excel;charset=utf-8'});let downloadElement = document.createElement('a');let href = window.URL.createObjectURL(blob); //創建下載的鏈接downloadElement.href = href;downloadElement.download = '學生信息.xlsx'; //下載后文件名document.body.appendChild(downloadElement);downloadElement.click(); //點擊下載document.body.removeChild(downloadElement); //下載完成移除元素window.URL.revokeObjectURL(href); //釋放掉blob對象})},submitUpload() {this.$refs.upload.submit();},importWordConfirm(item) {//上傳Excel文件并導入數據庫const _this=this;const fileObj = item.fileconst formData = new FormData()formData.append('file', fileObj)this.$axios.post('http://localhost:8181/file/upload/', formData, {headers: {'Content-Type': 'multipart/form-data'}}).then(res => {_this.$alert('上傳成功!', '消息', {confirmButtonText: '確定',callback: action => {_this.$router.push({path:"/StudentManage"})}})})},jump(x){const _this=this;this.form.major=xthis.$router.push({path:'/list',query:{data:_this.form}})}},created() {const _this = thisaxios.get('http://localhost:8181/major/findAll').then(function(resp) {console.log(resp)_this.majors = resp.data})}}; </script>

下面我們根據功能順序依次介紹實現方法:

分頁查詢

當前端向后端發送分頁查詢請求時,需要有頁數和每頁多少條的參數,所以這里有一個findAll方法:

@GetMapping("/findAll/{page}/{size}")public Page<Student> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size){//當我們分頁查詢時需要一個PageRequest類型的參數//調用它的of方法,第一個參數表示頁碼,第二個表示這一頁多少條數據PageRequest request = PageRequest.of(page,size);return studentService.findAll(request);}

前端Vue的話,要實現分頁查詢,添加了page方法:

page(currentPage) {const _this = thisaxios.get('http://localhost:8181/student/findAll/' + (currentPage - 1) + '/10').then(function (resp) {console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}

為了訪問8080端口時就加載第一頁的數據,要在created方法里面添加如下代碼:

created() {const _this = this //注意下面的this指針,可能不在是指全局的this指針,而是axios的指針,因此設置了一個_this的臨時變量 axios.get('http://localhost:8181/student/findAll/0/10').then(function (resp) {console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}

模糊查詢

只要在StudentController添加findLike(String name)方法即可

@GetMapping("/findLike/{name}")public List<Student> findLike(@PathVariable("name") String name){System.out.println(name); // return studentService.findByNameLike(name);List<Student> list=studentService.findByNameLike(name);Iterator<Student> iterator=list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}return list;}

vue的話要注意傳過來的是一個List集合,要進行匹配

deleteStudent(row) {const _this = thisaxios.delete('http://localhost:8181/student/deleteById/' + row.id).then(function (resp) {_this.$alert('刪除成功!', '消息', {confirmButtonText: '確定',callback: action => {window.location.reload()}})})},editStudent(row) {this.$router.push({path: '/update',query: {id: row.id}})},queryStudents(){const _this=thisaxios.get('http://localhost:8181/student/findLike/'+_this.forml.name).then(function(resp){console.log(resp)_this.datas = resp.data})}},data(){return{forml:{name:''},datas:[]}}

動態查詢

為了實現動態查詢,需要讓StudentDao繼承JpaSpecificationExecutor接口。

public interface JpaSpecificationExecutor<T> {Optional<T> findOne(@Nullable Specification<T> var1);List<T> findAll(@Nullable Specification<T> var1);Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);List<T> findAll(@Nullable Specification<T> var1, Sort var2);long count(@Nullable Specification<T> var1); }

由此可見,要實現findAll方法還要實現Specification接口。實現這個接口需要根據實體類Student類寫一個數據元類Student_.java。

import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.StaticMetamodel;@StaticMetamodel(Student.class) public class Student_ {public static volatile SingularAttribute<Student, Integer> id;// 用戶ID,自增量public static volatile SingularAttribute<Student, String> number;public static volatile SingularAttribute<Student, String> name;public static volatile SingularAttribute<Student, String> sex;public static volatile SingularAttribute<Student, Integer> age;public static volatile SingularAttribute<Student, String> birthday;public static volatile SingularAttribute<Student, String> tel;public static volatile SingularAttribute<Student, String> address;public static volatile SingularAttribute<Student, String> mail;public static volatile SingularAttribute<Student, String> major;}

然后是寫一個獲取Specification接口的方法,用于動態拼寫Sql。在我們動態查詢時,傳過來的是一些條件,如果是空則不需要and,如果不空就要把這個條件拼上。

import org.springframework.data.jpa.domain.Specification;import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root;public class StudentDaoSpec {public static Specification<Student> getSpec(final String number,final String name,final String sex,final Integer age,final String birthday,final String tel,final String address,final String mail,final String major) {return new Specification<Student>() {@SuppressWarnings("unused")@Overridepublic Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {Predicate p1 = null;if (number!=null){System.out.println("正在操作number!!!");Predicate p2 = cb.equal(root.get(Student_.number), number);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (name!=null) {System.out.println("正在操作name!!!");Predicate p2 = cb.equal(root.get(Student_.name), name);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (sex!=null){System.out.println("正在操作sex!!!");Predicate p2 = cb.equal(root.get(Student_.sex), sex);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (age != null) {System.out.println("正在操作age!!!");Predicate p2 = cb.equal(root.get(Student_.age), age);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (birthday!=null) {System.out.println("正在操作birthday!!!");Predicate p2 = cb.equal(root.get(Student_.birthday), birthday);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (tel!=null) {System.out.println("正在操作tel!!!");Predicate p2 = cb.equal(root.get(Student_.tel), tel);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (address!=null) {System.out.println("正在操作address!!!");Predicate p2 = cb.equal(root.get(Student_.address), address);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (mail!=null) {System.out.println("正在操作mail!!!");Predicate p2 = cb.equal(root.get(Student_.mail), mail);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}if (major!=null) {System.out.println("正在操作major!!!");Predicate p2 = cb.equal(root.get(Student_.major), major);if (p1 != null) {p1 = cb.and(p1, p2);} else {p1 = p2;}}return p1;}};} }

由此,我們動態查詢的準備工作已經做好了。在前端要動態查詢的時候,為了方便傳參,我們讓它把條件綁定到一個Student類的對象中,然后依次獲取它的屬性值。
StudentSearch.vue中的部分代碼:

data() {return {form: {id:null,name: null,number: null,sex: null,age: null,birthday: null,tel: null,address: null,mail: null,major: null,},fileList: [{id: 0,name: ''}],tableData: [] };},onSubmit(){this.$router.push({path:'/list',query:{data:this.form}})},

List.vue中的部分代碼:

data() {return {tableData:[] };},created() {const _this = thisaxios.post('http://localhost:8181/student/search', _this.$route.query.data).then(function(resp) {console.log(resp)_this.tableData = resp.data})}

后端要響應的話需要一個search方法:

@PostMapping("/search")public List<Student> search(@RequestBody Student student){System.out.println(student);List<Student> list=studentService.findByParams(student);Iterator<Student> iterator=list.iterator(); // while (iterator.hasNext()){ // System.out.println("查找的數據是:"+iterator.next()); // }return studentService.findByParams(student);}

分類查詢

既然我們已經寫好了動態查詢接口,我們就沒有必要再寫一個findByMajor方法了,直接動態查詢吧。后端StudentController的search方法去處理請求即可。前端的話,分專業查詢,我是把專業直接放在App.vue的左側菜單欄的,只要在App.vue的created方法里面添加查詢所有專業的方法就可以了。

<el-submenu index="2"><template slot="title"><i class="el-icon-folder-opened"></i>分類</template><el-menu-item v-for="item in majors" @click="jump(item.name)"><i class="el-icon-collection-tag"></i>{{item.name}}</el-menu-item> </el-submenu>data() {return {form: {id:null,name: null,number: null,sex: null,age: null,birthday: null,tel: null,address: null,mail: null,major: null,},fileList: [{id: 0,name: ''}],majors:[]};},jump(x){const _this=this;this.form.major=xthis.$router.push({path:'/list',query:{data:_this.form}})}created() {const _this = thisaxios.get('http://localhost:8181/major/findAll').then(function(resp) {console.log(resp)_this.majors = resp.data})}

后端也很簡單,只要寫一個查詢所有方法即可

@GetMapping("/findAll")public List<Major> findAll(){return majorDao.findAll();}

添加信息

在添加數據時,我們要對學號、郵箱、手機號進行校驗,同時計算年齡。要檢查學號是否存在,因此要在StudentController方法里面添加一個findByNum方法。保存的話需要一個Save方法:

@GetMapping("/findByNum/{num}")public String findByNum(@PathVariable("num") String num){System.out.println(num);Student student=studentService.findByNumber(num);if (student!=null){return "已存在";}return "不存在";}@PostMapping("/save")public String save(@RequestBody Student student){System.out.println(student);if (studentService.findByNumber(student.getNumber())!=null){return "學號已存在!";}Student result = studentService.save(student);if(result != null){return "保存成功!";}return "保存失敗!";}

Vue校驗方法:

this.$refs[formName].validate((valid) => {if (valid) {axios.get('http://localhost:8181/student/findByNum/' + _this.form.number).then(function(resp) {if (resp.data == "已存在") {alert("學號已存在")return false;} else {axios.post('http://localhost:8181/student/save', _this.form).then(function(resp) {_this.$alert(resp.data, '消息', {confirmButtonText: '確定',callback: action => {_this.$router.push('/StudentManage')}})})}})}

校驗郵箱和電話號碼我們可以使用正則表達式來完成,為了不讓已填寫的信息丟失,我們只要讓方法return false即可(AddStudent.vue的部分代碼):

const _this = thisvar x = this.form.mailvar atpos = x.indexOf("@");var dotpos = x.lastIndexOf(".");if (atpos < 1 || dotpos < atpos + 2 || dotpos + 2 >= x.length) {alert("不是一個有效的 e-mail 地址");return false;}var myreg = /^[1][3,4,5,7,8][0-9]{9}$/;x = this.form.telif (!myreg.test(x.toString())) {alert("手機號不合法");return false;}

自動計算年齡:

var birth = this.form.birthday;birth = Date.parse(birth.replace('/-/g', "/"));if (birth) {var year = 1000 * 60 * 60 * 24 * 365;var now = new Date();var birthday = new Date(birth);var age = parseInt((now - birthday) / year);}// alert(age);this.form.age = age;

我們傳到后端的數據是要綁定成一個Student對象的,注意數據綁定(AddStudent.vue和StudentUpdate.vue的部分代碼):

form: {name: '',number: '',sex: '',age: '',birthday: '',tel: '',address: '',mail: '',major: '',},

修改信息

我們在修改信息時,要跳到修改界面,需要根據當前學生的id獲得學生信息,所以StudentController要寫一個findById(Integer id)方法和修改的update方法:

@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") Integer id){System.out.println(new Date()+";"+id);return studentService.findById(id);}@PostMapping("/update")public String update(@RequestBody Student student){System.out.println(student);Student result = studentService.save(student);if(result != null){return "修改成功!";}else{return "修改失敗!";}}

在StudentUpdate.vue的created方法里面添加:

created() {const _this = thisaxios.get('http://localhost:8181/student/findById/' + this.$route.query.id).then(function(resp) {console.log(resp)_this.form = resp.data})// alert("this.id="+this.$route.query.id+";_this.id="+_this.$route.query.id)//在選擇學生專業的時候下拉選項需要加載所有專業,因此要向MajorController發送請求axios.get('http://localhost:8181/major/findAll').then(function(resp) {console.log(resp)_this.tableData = resp.data})}

不能修改學號,但是可見,因此學號這個標簽應該添加屬性readOnly(StudentUpdate.vue部分代碼):

<el-form-item label="學生學號" prop="number" ><el-input v-model="form.number" style="width:160px" readOnly></el-input> </el-form-item>

修改完成之后要提交:
vue部分代碼:

onSubmit(formName) {const _this = thisthis.$refs[formName].validate((valid) => {if (valid) {axios.post('http://localhost:8181/student/update', _this.form).then(function(resp) {_this.$alert(resp.data, '消息', {confirmButtonText: '確定',callback: action => {_this.$router.push('/StudentManage')}})})}});},

刪除信息

根據學生的id刪除即可,注意刪除的時候應該是先把這條信息存到dustbin這張表中,然后在student表中是刪除。因此Student Controller的deleteById方法如下:

@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") Integer id){System.out.println("刪除操作"+new Date());dustbinDao.save(converter.toDustbin(studentService.findById(id)));studentService.deleteById(id);}

雖然dustbin和student表中的內容非常相似,但是畢竟是兩個不同的類,所以這里又寫了一個Converter類用于兩者之間的互化:

import com.nown.contacts.entity.Dustbin; import com.nown.contacts.entity.Student; import org.springframework.stereotype.Component;@Component public class Converter {public Student toStudent(Dustbin dustbin){Student student=new Student();student.setName(dustbin.getName());student.setNumber(dustbin.getNumber());student.setAddress(dustbin.getAddress());student.setAge(dustbin.getAge());student.setBirthday(dustbin.getBirthday());student.setId(dustbin.getStuid());student.setMail(dustbin.getMail());student.setMajor(dustbin.getMajor());student.setSex(dustbin.getSex());student.setTel(dustbin.getTel());return student;}public Dustbin toDustbin(Student student){Dustbin dustbin=new Dustbin();dustbin.setStuid(student.getId());dustbin.setNumber(student.getNumber());dustbin.setName(student.getName());dustbin.setAddress(student.getAddress());dustbin.setAge(student.getAge());dustbin.setBirthday(student.getBirthday());dustbin.setMail(student.getMail());dustbin.setMajor(student.getMajor());dustbin.setSex(student.getSex());dustbin.setTel(student.getTel());return dustbin;} }

vue的刪除代碼如下(Student Manage.vue部分代碼):

deleteStudent(row) {const _this = thisaxios.delete('http://localhost:8181/student/deleteById/' + row.id).then(function (resp) {_this.$alert('刪除成功!', '消息', {confirmButtonText: '確定',callback: action => {window.location.reload()}})})},

備份功能

以上已經說明了如何將刪除的數據保存到dustbin表中,下面解決如何從回收站恢復。在訪問Dustbin.vue時我們就要加載所有已刪除的信息,因此后端DustbinController類中有findAll方法,并且是分頁查詢的。然后回收站主要負責恢復和徹底刪除,分別對應著recover和delete方法。不管恢復還是徹底刪除,我們都需要一個id屬性用于確定信息。
DustbinController的部分代碼:

@GetMapping("/findAll/{page}/{size}")public Page<Dustbin> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size){PageRequest request = PageRequest.of(page,size);return dustbinDao.findAll(request);}@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") Integer id){dustbinDao.deleteById(id);}@GetMapping("/recover/{id}")public String recover(@PathVariable("id") Integer id){Student result=studentService.save(converter.toStudent(dustbinDao.findById(id).get()));if (result!=null){dustbinDao.deleteById(id);return "success";}return "failed";}

Dustbin.vue中的部分代碼:

methods: {delete(row) {const _this = thisaxios.delete('http://localhost:8181/dustbin/deleteById/' + row.id).then(function (resp) {_this.$alert('刪除成功!', '消息', {confirmButtonText: '確定',callback: action => {window.location.reload()}})})},recover(row) {const _this=thisaxios.get('http://localhost:8181/dustbin/recover/' + row.id).then(function (resp) {if (resp.data == 'success') {_this.$alert('恢復成功!', '消息', {confirmButtonText: '確定',callback: action => {_this.$router.push('/StudentManage')}})} else {alert('恢復失敗!')return false;}})},page(currentPage) {const _this = thisaxios.get('http://localhost:8181/dustbin/findAll/' + (currentPage - 1) + '/10').then(function (resp) {console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}},data() {return {pageSize: 0,total: 0,tableData: []}},created() {const _this = thisaxios.get('http://localhost:8181/dustbin/findAll/0/10').then(function (resp) {console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}

關于EasyExcel

下面解決導出和導入的問題。關于處理Excel,我選用的時EasyExcel,感興趣的朋友可以去對比一下Apache poi。

EasyExcel地址:https://github.com/alibaba/easyexcel
語雀地址:https://www.yuque.com/easyexcel/doc/easyexcel

首先要對實體類Student類進行補充,為其添加@ExcelProperty注解,后面兩個參數value代表了表格的表頭名稱,index代表了序號。

package com.nown.contacts.entity;import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;import javax.persistence.*;@Data @Entity @Table(name = "student") public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@ExcelProperty(value = "序號",index = 0)private Integer id;@ExcelProperty(value = "學號",index = 1)private String number;@ExcelProperty(value = "姓名",index = 2)private String name;@ExcelProperty(value = "性別",index = 3)private String sex;@ExcelProperty(value = "年齡",index = 4)private Integer age;@ExcelProperty(value = "出生日期",index = 5)private String birthday;@ExcelProperty(value = "手機號碼",index = 6)private String tel;@ExcelProperty(value = "家庭住址",index = 7)private String address;@ExcelProperty(value = "電子郵箱",index = 8)private String mail;@ExcelProperty(value = "專業",index = 9)private String major; }

然后是寫一個監聽器,用于在讀取Excel時將讀出的數據導入到數據庫中:

package com.nown.contacts.util;import java.util.ArrayList; import java.util.List;import com.nown.contacts.entity.Student; import com.nown.contacts.service.StudentService;import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import org.springframework.beans.factory.annotation.Autowired;// 有個很重要的點 DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構造方法傳進去 public class ExcelListener extends AnalysisEventListener<Student> {private static final int BATCH_COUNT = 1;private List<Student> list;private StudentService studentService;@Autowiredpublic ExcelListener(StudentService studentService) {this.studentService=studentService;this.list = new ArrayList<Student>();}@Overridepublic void invoke(Student student, AnalysisContext context) {list.add(student);// 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條數據在內存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存儲完成清理 listlist.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("插入完成");}/*** 加上存儲數據庫*/private void saveData() {System.out.println("{}條數據,開始存儲數據庫!");studentService.save(list);System.out.println("存儲數據庫成功!");} }

這里注意,我們是把Excel表格中的數據讀出后放到了一個List集合里面了,因此我們需要重載StudentService的save方法(之前的save方法參數是Student類,這個方法的參數是List集合),同時注意如果學號已存在則不能將信息插入數據庫

public Student save(Student student) {return studentDao.save(student);}public void save(List<Student> list){Iterator<Student> iterator=list.iterator();while (iterator.hasNext()){Student student= iterator.next();if (findByNumber(student.getNumber())==null){save(student);}else{System.out.println("學號已存在,未添加到數據庫:"+student);}}}

然后是寫一個操作類,Operator類,用于寫doWrite和doRead方法。

package com.nown.contacts.util;import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.nown.contacts.entity.Student; import com.nown.contacts.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile;import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map;@Component public class Operator {@AutowiredStudentService studentService;public void doWrite(OutputStream outputStream, List<Student> list){EasyExcel.write(outputStream, Student.class).sheet("模板").doWrite(list);}public void doRead(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), Student.class, new ExcelListener(studentService)).sheet().doRead();} }

為了方便Controller調用這些方法,我們再來寫一個ExcelService類

package com.nown.contacts.service;import com.nown.contacts.entity.Student; import com.nown.contacts.util.Operator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile;import java.io.IOException; import java.io.OutputStream; import java.util.List;@Service public class ExcelService {@Autowiredprivate Operator operator;@Autowiredprivate StudentService studentService;public void doWrite(OutputStream outputStream){List<Student> list=studentService.findAll();operator.doWrite(outputStream,list);}public void doRead(MultipartFile file) throws IOException {operator.doRead(file);} }

這樣我們在處理請求時,只要Controller去響應請求,調用Service的方法,然后Service再去調用operator的方法就可以了。
至此,使用EasyExcel導入導出Excel已經做好準備,下面開始添加功能:

導出Excel

為了響應上傳下載請求,可以寫一個FileController類。我們先來看一下如何導出Excel。可以獲取Response的輸出流,這樣導出Excel:

@Autowiredprivate ExcelService service;@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 這里注意 有同學反應使用swagger 會導致各種問題,請直接用瀏覽器或者用postmanresponse.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 這里URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關系String fileName = URLEncoder.encode("學生信息", "UTF-8").replaceAll("\\+", "%20");System.out.println(fileName);response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");service.doWrite(response.getOutputStream());}

前端Vue的話,要響應后端傳過來的文件流(App.vue的部分代碼):

exportWord() {this.$axios.get('http://localhost:8181/file/download', {responseType: 'blob'}).then(res => {let blob = new Blob([res.data], {type: 'application/ms-excel;charset=utf-8'});let downloadElement = document.createElement('a');let href = window.URL.createObjectURL(blob); //創建下載的鏈接downloadElement.href = href;downloadElement.download = '學生信息.xlsx'; //下載后文件名document.body.appendChild(downloadElement);downloadElement.click(); //點擊下載document.body.removeChild(downloadElement); //下載完成移除元素window.URL.revokeObjectURL(href); //釋放掉blob對象})},

Excel導入

首先我們前端要發送請求(App.vue的部分代碼):

submitUpload() {this.$refs.upload.submit();},importWordConfirm(item) {const _this=this;const fileObj = item.fileconst formData = new FormData()formData.append('file', fileObj)this.$axios.post('http://localhost:8181/file/upload/', formData, {headers: {'Content-Type': 'multipart/form-data'}}).then(res => {_this.$alert('上傳成功!', '消息', {confirmButtonText: '確定',callback: action => {_this.$router.push({path:"/StudentManage"})}})})},

后端要處理請求(FileController中部分代碼):

@PostMapping("/upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {service.doRead(file);return "success";}

注意:
在使用Excel導入信息到數據庫時,相同學號的信息不會被導入,可以從控制臺看到哪條信息沒有被導入。從Excel導入信息時,模板和下載模板類似,但是要刪除id那一列,否則相同id的數據會覆蓋掉數據庫原有的信息。

OK,整個項目已經介紹完畢,具體代碼已經上傳至我的GitHub,歡迎大家參考,給個Star唄!
Github地址:https://github.com/Nown1/contacts

總結

以上是生活随笔為你收集整理的学生通讯录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩av成人 | 麻豆视频国产 | 黄色片毛片 | 夜夜骑首页 | 色资源网在线观看 | 一区二区av| 2021久久| 伊人一级 | 久久久久久电影 | 啪啪动态视频 | 日韩 在线a| 国产中的精品av小宝探花 | 色视频在线 | 亚洲黄网站 | 日韩欧美一区二区三区在线 | 国产精品久久久免费 | www.久久久com| 黄色在线成人 | 国产特级毛片aaaaaa高清 | 在线看欧美 | 亚洲观看黄色网 | 国内精品久久久久久久97牛牛 | 日日夜夜亚洲 | 成人av片免费观看app下载 | 国产原厂视频在线观看 | 丁香六月婷婷开心 | 99人久久精品视频最新地址 | 日本激情视频中文字幕 | 99成人精品| 四虎在线永久免费观看 | 久久96国产精品久久99漫画 | 99精品国产aⅴ | 在线激情网 | 婷婷综合亚洲 | 国产精品h在线观看 | www.天堂av | 国产精品欧美激情在线观看 | 97视频免费观看 | 欧美一级电影片 | 色99视频 | 国产色在线,com | 亚洲精品18日本一区app | 久草在线视频首页 | 久久久久久国产精品免费 | 精品国产理论片 | 日韩一区二区三区高清免费看看 | 伊甸园av在线 | 蜜臀一区二区三区精品免费视频 | 久久久香蕉视频 | 久草视频看看 | 精品国产伦一区二区三区 | 久久免费看a级毛毛片 | av成人免费观看 | 日日干综合 | 午夜电影久久 | 国产一线二线三线性视频 | 日韩www在线 | 福利久久| 在线免费观看黄色 | 丁香导航 | v片在线播放| 日韩电影黄色 | 韩国三级一区 | 黄色网址a | av无限看 | 亚洲激情p | 国产原创在线 | 欧美一区二区精美视频 | 人人舔人人爱 | 黄色一级大片在线免费看国产一 | 在线观看亚洲电影 | 日日夜夜狠狠 | 麻豆久久一区二区 | 久久99久久99精品 | 亚洲视频999 | 天天操夜夜操 | 婷色在线 | 黄色一级在线观看 | 国产精品九九久久久久久久 | 精品亚洲va在线va天堂资源站 | 免费影视大全推荐 | 毛片.com| 久草在线中文888 | 日色在线视频 | 国际av在线| 免费av电影网站 | 久久99久久久久 | 久久精品中文字幕一区二区三区 | 亚洲精品视频免费看 | 99色视频| 97av色| 欧美一区二区三区免费观看 | 五月天天天操 | 中文一区在线 | 天天舔天天射天天操 | 一级黄色网址 | 亚在线播放中文视频 | 久久久久 | 日韩av片无码一区二区不卡电影 | 91插插插免费视频 | 99色视频在线 | 免费在线播放视频 | 久久99精品久久久久婷婷 | 久久男人免费视频 | 骄小bbw搡bbbb揉bbbb | 天天干,天天射,天天操,天天摸 | 国产高清永久免费 | 欧美精品视 | 国产v在线 | 欧洲精品码一区二区三区免费看 | 色综合天天色 | 中文字幕久久精品亚洲乱码 | 超碰大片 | 欧美一级专区免费大片 | 色综合天天做天天爱 | 999久久国精品免费观看网站 | 精品国产成人在线 | 国产极品尤物在线 | 美女黄色网在线播放 | 国产精品va | 97人人爽 | 久久av伊人 | 久久这里精品视频 | 国产精品日韩精品 | 99精品国自产在线 | www蜜桃视频 | 99在线精品视频 | 亚洲精品国久久99热 | 国产成人精品一区二区 | 国产成人av网站 | 丁香花五月 | 999国内精品永久免费视频 | 男女精品久久 | 国产小视频在线观看 | 国产999精品 | 美女天天操 | 精品国模一区二区 | 成人av网站在线 | 青青久草在线视频 | 伊人看片 | 国产99久久久国产精品免费看 | 色视频网站免费观看 | 色射色| 亚洲欧美国产精品va在线观看 | 日韩亚洲欧美中文字幕 | 精品国产乱码久久久久久1区2匹 | 久久99视频免费观看 | 日本精品在线看 | 999久久久免费视频 午夜国产在线观看 | 国产高清在线一区 | 麻豆成人精品视频 | 日韩美在线 | 婷婷福利影院 | 亚洲一级电影在线观看 | 91精品网站在线观看 | 超碰在线99 | 中文字幕av影院 | 97综合在线| 久久免费一级片 | 69精品久久| 亚洲日本一区二区在线 | 激情久久久 | 久久99久国产精品黄毛片入口 | 日韩欧美在线综合网 | 91成人小视频 | 国产91精品一区二区麻豆亚洲 | 国产资源在线免费观看 | 亚洲一区天堂 | 国产精品久久久久久久毛片 | 欧美成人性网 | 六月色 | 看av在线| 国产精品久久久久久久久费观看 | 国产亚洲一区二区在线观看 | 久久久久久久看片 | 97电影在线看视频 | 麻豆一级视频 | 久久99热这里只有精品国产 | 国产录像在线观看 | 国产色道| 88av色| 五月激情丁香图片 | 91麻豆文化传媒在线观看 | 亚洲精品影视 | 国内精品久久天天躁人人爽 | 婷婷伊人综合 | 欧美色久| 国产成人一区二区三区免费看 | 欧美精品一区二区在线播放 | 人人网av | 亚洲成av人片 | 四虎国产 | 久久国产精品二国产精品中国洋人 | 午夜在线日韩 | 精品国内自产拍在线观看视频 | 久久精品国亚洲 | 狠狠色狠狠综合久久 | 激情电影在线观看 | 免费h精品视频在线播放 | 久久婷婷丁香 | 日本大尺码专区mv | 国产亚洲欧美日韩高清 | 一区二区在线影院 | 国产精品嫩草69影院 | 九九日九九操 | 99久久精品国产欧美主题曲 | 亚洲成av人片在线观看无 | 亚洲成av人影院 | 亚洲精品国产精品国自产 | 国产不卡一二三区 | 美女免费视频观看网站 | 日韩久久精品一区二区三区 | 午夜三级毛片 | 天堂在线视频中文网 | 欧美在线a视频 | 激情欧美一区二区免费视频 | 天天操天天射天天舔 | 18久久久久 | 天堂av影院 | 91精品国产入口 | 99视屏 | 高清av在线免费观看 | 精品亚洲一区二区三区 | 日韩av成人在线 | 91日本在线播放 | 久久精品电影网 | 亚洲免费在线观看视频 | 91九色在线播放 | 99精品久久精品一区二区 | 色www.| 99热日本| 激情综合色综合久久综合 | 欧美日韩中字 | 免费亚洲一区二区 | 亚洲成人精品久久 | 国产高清视频 | 午夜视频导航 | 免费久草视频 | 欧美999| 国产午夜精品一区 | 天天操天天射天天爱 | 99电影456麻豆 | 手机看片中文字幕 | 亚洲午夜精品久久久 | 亚洲欧美国产精品久久久久 | 日本韩国中文字幕 | 中文字幕av一区二区三区四区 | 欧美坐爱视频 | 国产精品入口麻豆www | 亚洲视频在线播放 | 国产香蕉视频 | 在线中文字幕播放 | 午夜三级影院 | 久艹视频免费观看 | 免费黄色网址大全 | 少妇性bbb搡bbb爽爽爽欧美 | 天天综合网久久 | 9在线观看免费高清完整版 玖玖爱免费视频 | 91亚洲精品在线观看 | av福利在线 | 欧美性爽爽 | a在线观看国产 | 中文在线免费看视频 | 欧美一区二区视频97 | 久久久久国产a免费观看rela | 中文字幕在线播放第一页 | 国产一线在线 | 亚洲 欧美变态 另类 综合 | 久草精品免费 | 亚洲欧美怡红院 | 91av片| 久久久久久毛片精品免费不卡 | 一区二区视频欧美 | 99精品在线免费在线观看 | 亚洲最大av在线播放 | 欧美精品国产综合久久 | 一区二区三区四区五区在线 | 91免费日韩 | 99精品国产高清在线观看 | 丰满少妇在线观看资源站 | 91精品国产欧美一区二区成人 | 日韩一区视频在线 | 麻花豆传媒mv在线观看 | 亚洲九九九在线观看 | 日韩av快播电影网 | av在线影视 | 91精品专区| 欧美精品乱码久久久久久按摩 | 亚洲成人欧美 | 一区视频在线 | 韩国精品一区二区三区六区色诱 | 久久久久久久国产精品影院 | 国产免费一区二区三区网站免费 | 日韩一级成人av | 激情综合六月 | 国产资源精品在线观看 | 五月天婷婷在线视频 | 国产字幕在线看 | 久久久久国产精品免费免费搜索 | 丁香花中文在线免费观看 | 婷婷黄色片 | 91亚·色 | 天天玩天天操天天射 | 久久久国产在线视频 | 91麻豆看国产在线紧急地址 | 黄色性av | 天天操月月操 | 中文在线a∨在线 | 久久久久国产精品一区二区 | 久久成人精品电影 | 米奇影视7777| 在线观看免费视频 | 亚洲天堂视频在线 | 91麻豆精品一区二区三区 | 91亚瑟视频 | 怡红院av久久久久久久 | 天天射天天操天天 | 97在线视频免费看 | 久久国产精品久久久 | 亚洲日韩中文字幕 | 中文字幕在线观看91 | 免费久久久 | 最近中文字幕完整高清 | 亚洲精品在线一区二区 | 一区在线免费观看 | 天天射天天 | 五月天婷婷在线观看视频 | 成人国产精品免费 | 超碰在线亚洲 | 黄色三级av | 中文字幕中文字幕在线一区 | 国产成人久久久77777 | 成人午夜黄色 | 波多野结衣在线观看一区 | 在线黄频 | 国产在线更新 | 超碰97人 | 在线观看国产日韩 | 天天操天天干天天插 | 99久久精品国产欧美主题曲 | 精品91视频 | 国内少妇自拍视频一区 | 免费亚洲精品 | 夜添久久精品亚洲国产精品 | 国产福利小视频在线 | 狠狠躁夜夜躁人人爽视频 | 久产久精国产品 | 亚洲视频在线看 | 激情五月婷婷网 | 91精品视屏 | 久久激情久久 | 9久久精品 | 青青看片 | 婷婷中文字幕 | 天天·日日日干 | 美女啪啪图片 | 手机成人av | 国产91国语对白在线 | 久久综合操 | 婷婷亚洲综合五月天小说 | 狠狠色丁香久久综合网 | 色综合天天射 | 天天干,天天干 | 亚洲精品玖玖玖av在线看 | 国产在线高清 | 日韩一二三在线 | 中国一级片在线 | 涩涩网站在线看 | 国产精品尤物 | 99久久www| 国产一级片直播 | 亚洲 欧洲av | 亚洲精品www久久久 www国产精品com | 91av在线免费观看 | 高清久久久久久 | 五月婷婷丁香网 | 麻豆传媒在线免费看 | 99在线观看视频 | 天天天天色射综合 | 亚洲黄色在线观看 | 在线va视频 | 网址你懂的在线观看 | 二区三区在线视频 | 欧美成亚洲 | 欧美一二三专区 | 亚洲精品视频久久 | 黄色精品国产 | 97av视频| 国产一级二级三级视频 | 91视频电影 | 国产亚州av | 久久天天躁夜夜躁狠狠85麻豆 | 久草久草久草久草 | 高清久久久| 男女激情网址 | 久久69av| 精品av在线播放 | 久久综合射 | 日韩国产欧美视频 | 亚洲黄色在线播放 | 伊人久久精品久久亚洲一区 | 国产在线观看,日本 | 日韩午夜小视频 | 亚洲在线免费视频 | 成年人免费观看国产 | 久久国产精品免费一区二区三区 | av在线一二三区 | 久久成人免费电影 | www.色午夜,com | 国产精品欧美久久久久天天影视 | 操操操日日日干干干 | 国产精品国产三级国产aⅴ无密码 | 999久久精品 | 午夜久久福利 | 中文字幕乱码一区二区 | 特级西西www44高清大胆图片 | 亚洲丁香日韩 | 在线观看91 | 天堂网一区二区三区 | 成人国产精品一区二区 | 国产在线精品一区二区不卡了 | 深爱开心激情 | 香蕉视频啪啪 | 亚洲成人免费 | 国产xx视频 | 超碰97成人 | 日本精品一区二区三区在线播放视频 | 午夜999| 一区二区三区手机在线观看 | 国产精品99久久久久久久久 | 日本黄区免费视频观看 | 日狠狠| 精品一区二区三区久久 | 日韩h在线观看 | 国内精品久久久久久中文字幕 | 全久久久久久久久久久电影 | 欧美日韩国产免费视频 | 国产精品国产精品 | 午夜精品久久久久久久久久久久久久 | 91视频免费国产 | 香蕉视频导航 | 黄网在线免费观看 | 国产精品久久久久三级 | 99视频免费观看 | 国产a精品| 国产福利精品在线观看 | 99精品黄色片免费大全 | www久久国产| 美女网站免费福利视频 | 黄色成人影院 | 黄色三级网站 | 国产一区二区在线免费播放 | 91污污视频在线观看 | 欧美日韩国产精品一区 | 国产精品久久久久一区二区国产 | 欧美日韩国产综合一区二区 | 日韩视频一区二区三区 | 乱男乱女www7788 | 97超视频免费观看 | 中文一区二区三区在线观看 | 国产精品成人自产拍在线观看 | 色综合亚洲精品激情狠狠 | 婷婷久久网站 | 亚洲高清精品在线 | 在线v片免费观看视频 | 日韩av成人在线 | 国产69精品久久久久久久久久 | 久久99国产精品久久99 | 97成人在线观看视频 | 国产系列精品av | 国产无区一区二区三麻豆 | 久久理论影院 | 深夜免费网站 | 正在播放 久久 | 久久免费黄色大片 | 成 人 黄 色视频免费播放 | 中文在线免费一区三区 | 久草视频99| 成人91在线观看 | 亚洲黄色小说网址 | 美女精品在线 | 久久久精品欧美 | 一级片视频在线 | 中文字幕国产视频 | 六月婷婷久香在线视频 | 免费无遮挡动漫网站 | 精品久久网站 | 欧美一二三区在线播放 | 久艹在线免费观看 | 亚洲精品777| 久久人人爽人人人人片 | 日日干夜夜操视频 | 欧美在线视频一区二区三区 | 国产黄| 成人性生活大片 | 国产一线天在线观看 | 国产精品黄色在线观看 | 97超碰资源网| 人人爱爱人人 | 婷婷色在线观看 | 91精品导航 | 狠狠操导航 | 精产嫩模国品一二三区 | 亚洲精品在线观 | 欧美一区二区在线 | 天天要夜夜操 | 亚洲成av人片在线观看香蕉 | 永久免费的啪啪网站免费观看浪潮 | 亚洲精品tv | 不卡av电影在线观看 | 亚洲免费av观看 | 久久久久五月 | 日本精品视频在线 | 久久99热精品 | 91精品区 | 毛片区| 免费a一级 | 一级黄色网址 | 福利精品在线 | 808电影 | 99热精品在线 | 超碰公开在线 | 亚洲国产精品成人女人久久 | 中文字幕在线播放视频 | 亚洲午夜精品在线观看 | 欧美另类巨大 | 精品91久久久久 | 中文字幕国产精品一区二区 | 国产精品欧美久久久久三级 | 亚洲少妇影院 | 久久久久久久久久久免费av | 日日夜夜精品网站 | 激情欧美国产 | av在线免费观看黄 | 九九有精品| 久久久精品日本 | 黄色h在线观看 | 免费观看黄色av | 日日夜夜操操操操 | 久久99热国产 | 波多野结衣久久精品 | 黄色www| 国产精品亚洲片在线播放 | av中文在线观看 | 国产精品综合在线观看 | 欧美大片大全 | 国内揄拍国产精品 | 亚洲在线视频免费观看 | 国产精品欧美久久 | 国产在线一区二区三区播放 | 国产久视频 | 久久精品视 | av专区在线 | 亚洲精品国精品久久99热 | 国产精品日韩高清 | 天天搞天天干 | 国产成人黄色网址 | 天天曰天天曰 | 日本精品久久久久中文字幕 | 亚洲高清视频在线播放 | 欧美性超爽| 黄色片网站 | 精品国产免费观看 | 精品自拍网| 中文亚洲欧美日韩 | 伊人五月天婷婷 | 国产精品美女免费视频 | 91九色蝌蚪国产 | 欧美精品乱码99久久影院 | www.天天综合 | 亚洲涩涩涩 | 国产在线精品视频 | 天天草av | 欧美一区二区精美视频 | 人人爱夜夜操 | 国内揄拍国内精品 | 又黄又爽免费视频 | 亚洲精品国产第一综合99久久 | 久久成人午夜 | wwwwww黄 | 国产日韩欧美视频在线观看 | 午夜av在线免费 | 久久久在线 | 精品电影一区 | 国产精品日韩欧美 | 久久国产精品久久精品国产演员表 | 国内精品免费 | 黄色字幕网 | 五月婷网站 | 国产精品免费久久 | 久久久一本精品99久久精品66 | 久久精选视频 | 亚洲精品色视频 | 久久久久久黄 | 四虎5151久久欧美毛片 | 丁香婷婷色综合亚洲电影 | 四虎影视精品成人 | 日本爽妇网| 国产又粗又猛又色又黄视频 | 亚洲人在线视频 | 毛片1000部免费看 | 国产精品情侣视频 | 国产美女在线免费观看 | 亚洲精品午夜一区人人爽 | 日韩免费高清在线观看 | 永久免费观看视频 | 香蕉视频网站在线观看 | 丁香婷婷久久久综合精品国产 | 亚洲 成人 欧美 | 日日操操| 在线播放av网址 | 成人免费在线视频 | 日本aaa在线观看 | 久久av网址 | 人人玩人人爽 | 五月天综合激情 | 91丨九色丨蝌蚪丨对白 | 欧美精品久久人人躁人人爽 | 亚洲成人免费在线 | 亚洲精品欧美精品 | 免费在线观看日韩 | 色婷婷啪啪免费在线电影观看 | 国产精品永久在线 | 欧美日韩国产一区二区三区在线观看 | av网站有哪些 | 日韩欧美在线视频一区二区三区 | 超碰97在线资源 | 欧美色888 | 国产精品18久久久久久首页狼 | 日日夜夜综合网 | 亚洲精品久久久久久中文传媒 | 国产精品av免费 | 国产99爱| 欧美日韩亚洲第一 | 激情伊人五月天久久综合 | 国产精品一区二区三区免费视频 | 国产一区二区三区免费在线观看 | 国产在线黄 | 91久久精品日日躁夜夜躁国产 | 国产 字幕 制服 中文 在线 | 天天爽天天做 | 久草在线免费资源 | 国产精品一区免费在线观看 | 亚洲精品网页 | 亚洲成人免费在线观看 | 久久亚洲私人国产精品va | 91超碰免费在线 | 激情丁香在线 | 我爱av激情网 | 1024手机在线看 | 天天综合人人 | 狠狠ri| 中文视频一区二区 | 在线三级播放 | 日日夜夜天天射 | 国产日本在线观看 | 欧美老女人xx | 久久久久99999 | 欧美激情精品久久久久 | 97超碰影视 | 成人影片在线播放 | 色香蕉网 | 808电影免费观看三年 | 在线黄色av电影 | 三级在线视频观看 | 精品一区免费 | 日韩午夜电影网 | 天天天天综合 | 国产精品久久久久久一区二区 | av一级在线 | 免费在线观看亚洲视频 | 在线色亚洲 | 夜夜操天天摸 | 国产成人亚洲在线电影 | www.天天干.com| 五月婷婷在线播放 | 久久久久日本精品一区二区三区 | 亚洲成年人在线播放 | 成人a视频在线观看 | 国产高清免费在线观看 | 深爱婷婷久久综合 | 久久精品日产第一区二区三区乱码 | 久久久久久久免费 | 精品久久久久久久久久 | av日韩中文 | 日韩二区在线 | 亚洲午夜精品久久久久久久久久久久 | 探花在线观看 | 456成人精品影院 | 97精品国产97久久久久久春色 | 婷婷色网| 久久一精品 | 天天射天天爱天天干 | 国产色视频一区二区三区qq号 | 免费观看一级 | 国产视频日韩视频欧美视频 | 成人全视频免费观看在线看 | 国产剧情一区二区在线观看 | 亚洲欧美视频在线播放 | 久久热首页 | 激情视频91 | 国产亚洲免费观看 | 天天色欧美| 中文字幕中文字幕在线中文字幕三区 | 精品一区二区电影 | 中文字幕在线观看视频一区二区三区 | 一区二区不卡视频在线观看 | 国产一区 在线播放 | 国产亚洲人| www.色综合.com | 亚洲国产精品久久久 | 国产精品女教师 | 中文在线8资源库 | 日韩视频在线观看视频 | 97精品国产一二三产区 | 黄污网站在线 | 91桃色在线免费观看 | 国内丰满少妇猛烈精品播 | 亚洲 成人 一区 | 免费a网站 | 国产一级精品绿帽视频 | 韩国精品视频在线观看 | 国产麻豆精品免费视频 | 最近久乱中文字幕 | 一区二区三区四区不卡 | 久草在线视频中文 | 久久免费精品一区二区三区 | av电影一区 | 国产黄免费在线观看 | 日韩久久激情 | 国产在线国偷精品产拍免费yy | 久久综合中文字幕 | www.国产在线观看 | 伊人永久在线 | 亚洲美女精品视频 | 在线日韩亚洲 | 99国内精品 | 波多野结衣在线中文字幕 | 97精品国产97久久久久久春色 | 日韩另类在线 | 亚洲永久国产精品 | 91网在线看 | 波多野结衣在线播放视频 | 国产精品一区二区三区视频免费 | www.五月婷婷.com | 偷拍福利视频一区二区三区 | 成人91免费视频 | 国产精品久久久久久999 | 色婷婷综合在线 | 亚在线播放中文视频 | 在线视频欧美日韩 | 深爱五月激情五月 | 日韩欧美视频 | 亚洲va在线va天堂va偷拍 | 天天操天天色天天射 | 美女视频是黄的免费观看 | 日韩免费在线观看视频 | 欧美另类亚洲 | 久久涩涩网站 | 中文字幕网站视频在线 | 久久96国产精品久久99软件 | 日韩av片免费在线观看 | 国产精品视频线看 | 在线观看日韩中文字幕 | 成 人 黄 色 视频免费播放 | 男女视频国产 | av韩国在线| 西西444www大胆高清图片 | 久久久久久久久国产 | 中文字幕一区二区在线播放 | 国产999精品久久久影片官网 | 成人午夜剧场在线观看 | 国产成人一区二区三区影院在线 | 欧美极品一区二区三区 | 97超碰在线视 | 亚洲资源在线网 | 免费看高清毛片 | 日韩av播放在线 | 黄色精品久久 | 成人免费观看视频网站 | 黄色tv视频 | 狠狠色丁香婷婷综合最新地址 | 中文字幕一区二区三区四区视频 | 久久久香蕉视频 | 欧日韩在线 | 欧洲亚洲女同hd | 一区二区视频在线看 | 免费网站看v片在线a | 国产精品一区二区免费在线观看 | 中文字幕一区二区在线播放 | 激情婷婷六月 | 国产精品一区二区免费看 | 91九色国产视频 | 在线观av| 亚洲精品午夜一区人人爽 | 夜色资源站wwwcom | 国产精品ⅴa有声小说 | 久草99| www色,com | 天天色宗合| 国产高潮久久 | 天天艹 | 四虎在线永久免费观看 | 六月婷婷色 | 91麻豆国产福利在线观看 | 午夜精品一区二区三区四区 | www.天天草| 91精品免费视频 | 在线观看免费成人av | 1000部18岁以下禁看视频 | 99热九九这里只有精品10 | 九九精品视频在线看 | 免费av大全| 久久国产午夜精品理论片最新版本 | 免费网站黄 | 国产操在线 | 毛片a级片| 天天射综合网视频 | 四虎国产精品永久在线国在线 | 激情五月***国产精品 | 五月天婷亚洲天综合网鲁鲁鲁 | 亚洲欧美视频在线观看 | 五月天网站在线 | 91香蕉视频黄 | 国产精品嫩草55av | 欧美日韩一区二区三区在线观看视频 | 91福利试看 | 久久久久久久久久久综合 | 91视频亚洲 | 午夜精品福利一区二区三区蜜桃 | 少妇激情久久 | 国产三级午夜理伦三级 | 国产一区二区在线影院 | 日韩色在线观看 | 亚洲天堂网视频在线观看 | 日韩经典一区二区三区 | 成年人免费观看在线视频 | 在线播放亚洲 | 久久精品8| 丁香九月激情 | 欧美激情另类文学 | 色婷婷综合久久久久 | 99这里只有久久精品视频 | 三级a毛片 | 精品国产a | 久草在线综合 | 久久久久激情视频 | 日韩二区在线播放 | 永久免费在线 | 91麻豆福利 | 国产资源在线免费观看 | 天天操夜夜做 | 国产精品一区二区在线免费观看 | 久久综合中文字幕 | 精品在线二区 | 色吊丝在线永久观看最新版本 | 69精品久久| 午夜av免费在线观看 | 一区二区 久久 | 99视频精品全部免费 在线 | 日韩精品一区二区三区高清免费 | 天天干天天干天天干天天干天天干天天干 | 日韩有码中文字幕在线 | 丁香五月缴情综合网 | 91成人在线免费观看 | 日韩av免费在线电影 | 日韩精品在线看 | 欧美少妇18p | 天天射天天干天天插 | 超碰国产在线观看 | 中文字幕av最新 | 亚洲高清在线精品 | 日韩黄色av网站 | 日韩免费观看一区二区 | 亚洲精品视频 | 欧美成人理伦片 | 午夜久久久久久久久 | 亚洲三级在线 | 免费69视频 | 成人污视频在线观看 | 色噜噜狠狠色综合中国 | 国产精品免费在线播放 | 摸bbb搡bbb搡bbbb | 操操操夜夜操 | 在线免费黄色片 | 最近乱久中文字幕 | 久久久久一区 | 国产69精品久久久久99尤 | 天天爱综合 | 国产97色在线 | 在线观看免费国产小视频 | 天天av综合网 | 成年人视频在线免费播放 | 成人91免费视频 | 国产精品久久久久影院日本 | 久久综合九色 | 国产永久免费高清在线观看视频 | 日韩三级免费观看 | 激情综合亚洲 | 在线va视频 | 国产精品日韩久久久久 | 天天操天天玩 | 黄色的网站免费看 | 欧美日韩国产精品一区二区三区 | 免费黄色a级毛片 | 97人人澡人人添人人爽超碰 | 国产精品久久久久久久久久久免费 | 日本午夜在线亚洲.国产 | 黄色大片日本免费大片 | 九九免费观看视频 | 日本精品视频免费 | 亚洲九九九在线观看 | 成人国产精品一区二区 | 婷婷新五月 | 亚洲国产精品人久久电影 | 亚洲乱码中文字幕综合 | 国内精自线一二区永久 | 综合五月 | 69亚洲精品 | www久| 欧美精品久久久久性色 | 中文字幕在线网址 | 国产精品久久久视频 | 国产视频日韩视频欧美视频 | 中文字幕在线观看完整 | 亚洲国产精品第一区二区 | 手机在线欧美 | 国产成人久久 | 手机成人av在线 | 日本不卡123区 | 888av| 国产日韩在线播放 | 麻豆av一区二区三区在线观看 | 丁香花在线观看免费完整版视频 | 亚洲视频999| 国产a高清 | 精品福利视频在线观看 | 久久综合欧美精品亚洲一区 | 国内外成人在线视频 | 一区二区三区在线免费观看 | 九九热国产视频 | www.成人精品| 午夜视频日本 | 欧美性受极品xxxx喷水 | 日韩videos | 免费a级大片 | 国产精品麻豆视频 | 一二三区视频在线 | 天天射天天舔天天干 | 色视频在线免费 | 国产免费又粗又猛又爽 | 伊人热| 波多野结衣资源 | 开心综合网 | 国产精品wwwwww | 日韩高清一区 | 黄色影院在线观看 | 日本系列中文字幕 | 国产玖玖在线 | 中文字幕久久精品亚洲乱码 | 91av视频免费在线观看 | 久久激情视频 久久 | 黄色片免费看 | 国产精品视频永久免费播放 | 久久久电影 | 麻豆视频91 | 欧美一级看片 | 黄色国产大片 | 国产精品久久久久久久免费大片 | 黄网av在线| 91视频在线国产 | 天堂久色 | 99热9 | 日韩av图片 | 午夜神马福利 | 色资源在线 | 人人爽人人爽人人片av | 久久国产一区二区三区 | 国产亚洲成人精品 | 色橹橹欧美在线观看视频高清 | 99热超碰在线 | 亚洲一级片免费观看 | 免费色黄| 国产成人一区二区三区久久精品 | 国产精品第一视频 | 久精品视频免费观看2 | 午夜国产福利视频 | 免费在线视频一区二区 | 在线免费观看欧美日韩 | 久久a久久 | 欧美极度另类性三渗透 | 91中文字幕永久在线 | 日韩手机视频 | 婷香五月 | 亚洲最大成人免费网站 | 91.精品高清在线观看 | 亚洲精品www久久久久久 | 五月婷在线观看 |