項目管理功能,目前還剩下條件查詢還沒實現。前端
通過這麼多章,能夠看出用得套路都是差很少的。就像條件查詢這個功能,我須要在後端實現一個條件查詢的接口,供前端調用。vue
前端須要在組件裏實現對應的方法與後端進行交互,最後頁面查詢按鈕上綁定對應的方法。spring
因爲JPA也是支持動態查詢的,因此優先仍是使用現成的。sql
在dao層裏須要作個修改,讓ProjectDAO
再多繼承一個類:JpaSpecificationExecutor
。數據庫
package com.mock.platform.dao; import com.mock.platform.pojo.Project; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; public interface ProjectDAO extends JpaRepository<Project, Integer>, JpaSpecificationExecutor { }
能夠看一下JpaSpecificationExecutor
類,提供了5個方法,不過每一個方法都有一個Specification<T> var1
,這裏是關鍵哦。後端
這裏是修改的重點,誰叫它是幹活的呢。api
public Page<Project> searchProject(Project project, int number, int size) { Sort sort = Sort.by(Sort.Direction.DESC, "id"); Pageable pageable = PageRequest.of(number - 1, size , sort); Specification<Project> query = new Specification<Project>() { @Override public Predicate toPredicate(Root<Project> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> predicates = new ArrayList<>(); if (project.getId() != null) { predicates.add(criteriaBuilder.equal(root.get("id"), project.getId())); } if (StringUtils.isNotEmpty(project.getProjectName())) { predicates.add(criteriaBuilder.like(root.get("projectName"), "%" + project.getProjectName() + "%")); } return criteriaBuilder.and(predicates.toArray(new Predicate[0])); } }; return projectDAO.findAll(query, pageable); }
這裏就用了上述5個方法的第3個,由於查詢後的結果也須要分頁。app
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
代碼裏實現的是能夠經過項目名稱或者項目id來查詢,以項目名稱爲例:ide
predicates.add(criteriaBuilder.like(root.get("projectName"), "%" + project.getProjectName() + "%"));
"projectName"
對應project
實體裏的projectName
屬性。root.get("projectName")
獲取屬性對應的數據庫表字段。project.getProjectName()
獲取當前傳入的查詢條件值。like
就是模糊匹配了,配合%xxx%
使用。criteriaBuilder
會構建出對應的sql
語句 。固然這只是一個簡單查詢,and
或者or
就不展開了,後面用到的時候再說。測試
這裏就很簡單了,由於活兒都派給service
了。
@GetMapping("/searchProject") public Object searchProject(Project project, int number, int size) throws Exception { return Result.success(projectService.searchProject(project, number, size)); }
測試經過。
前端此次只須要改動project.vue
就行了,增長對應的查詢方法。
對了,在此以前,還要增長對應的api 。
//src/api/project.js export function searchProject(projectName, number, size) { return request({ url: '/my_platform/project/searchProject', method: 'get', params: { 'projectName': projectName, 'number': number, 'size': size } }) }
vue組件裏methods
裏增長對應的方法.
當projectName
是空的時候,若是點擊了查詢
按鈕,就從新請求下列表頁。
當projectName
不爲空,那就能夠調用搜索項目的方法 searchProject()
。
handleProjectSearch() { //條件查詢 if (this.listQueryInfo.projectName === undefined || this.listQueryInfo.projectName === '') { this.projectGet() } else { searchProject(this.listQueryInfo.projectName, this.pageInfo.number, this.pageInfo.size).then(response => { this.list = response.data.content this.pageInfo.size = response.data.size this.pageInfo.number = response.data.number + 1 this.pageInfo.totalElements = response.data.totalElements this.pageInfo.totalPages = response.data.totalPages this.pageInfo.numberOfElements = response.data.numberOfElements this.listLoading = false }) } }
頁面元素部分,就是改動查詢條件輸入框和查詢按鈕部分。
<div class="filter-container"> <el-input placeholder="項目名稱" style="width: 200px;" class="filter-item" v-model="listQueryInfo.projectName" @keyup.enter.native="handleProjectSearch(listQueryInfo.projectName)" clearable/> <el-button class="filter-item" type="primary" icon="el-icon-search" style="margin-left:10px;" @click="handleProjectSearch(listQueryInfo.projectName)"> 查詢 </el-button> <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="projectCreate(createInfo)"> 新建 </el-button> </div>
@keyup.enter.native
屬性能夠敲回車鍵查詢 ,clearable
則是增長一個清空輸入的按鈕。
所有弄完了,測試一下模糊查詢。
經過。
後面的功能實現基本都是這樣的套路了,應該不會像這樣先後端鋪開寫了,有知識點或者思路想法之類的會記錄。