在页面输入查询条件,查询符合条件的页面信息。
查询条件如下:
站点Id:精确匹配
模板Id:精确匹配
页面别名:模糊匹配
…
使用 findAll(Example
方法实现,无需定义。 var1, Pageable var2)
下边测试 findAll 方法
实现自定义条件查询:
//自定义条件查询测试
@Test
public void testFindAll() {
//条件匹配器
ExampleMatcher exampleMatcher = ExampleMatcher.matching();
exampleMatcher = exampleMatcher.withMatcher("pageAliase",
ExampleMatcher.GenericPropertyMatchers.contains());
//页面别名模糊查询,需要自定义字符串的匹配器实现模糊查询
//ExampleMatcher.GenericPropertyMatchers.contains() 包含
//ExampleMatcher.GenericPropertyMatchers.startsWith()//开头匹配
//条件值
CmsPage cmsPage = new CmsPage();
//站点ID
cmsPage.setSiteId("5a751fab6abb5044e0d19ea1");
//模板ID
cmsPage.setTemplateId("5a962c16b00ffc514038fafd");
// cmsPage.setPageAliase("分类导航");
//创建条件实例
Example<CmsPage> example = Example.of(cmsPage, exampleMatcher);
Pageable pageable = new PageRequest(0, 10);
Page<CmsPage> all = cmsPageRepository.findAll(example, pageable);
System.out.println(all);
}
在 PageService 的 findlist 方法中增加自定义条件查询代码
/**
* 页面查询方法
* @param page 页码,从1开始记数;但是调用dao时是从0开始
* @param size 每页记录数
* @param queryPageRequest 查询条件
* @return
*/
public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){
if(queryPageRequest == null){
queryPageRequest = new QueryPageRequest();
}
//自定义条件查询
//定义条件匹配器
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("pageAliase", ExampleMatcher.GenericPropertyMatchers.contains());
//条件值对象
CmsPage cmsPage = new CmsPage();
//设置条件值(站点id)
if(StringUtils.isNotEmpty(queryPageRequest.getSiteId())){
cmsPage.setSiteId(queryPageRequest.getSiteId());
}
//设置模板id作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getTemplateId())){
cmsPage.setTemplateId(queryPageRequest.getTemplateId());
}
//设置页面别名作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getPageAliase())){
cmsPage.setPageAliase(queryPageRequest.getPageAliase());
}
//定义条件对象Example
Example<CmsPage> example = Example.of(cmsPage,exampleMatcher);
//分页参数
if(page <=0){
page = 1;
}
page = page -1;
if(size<=0){
size = 10;
}
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(example, pageable); // 实现自定义条件查询并且分页查询
QueryResult queryResult = new QueryResult();
queryResult.setList(all.getContent()); // 数据列表
queryResult.setTotal(all.getTotalElements()); // 数据总记录数
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
无需修改
1、增加查询表单
<el-form :model="params">
<el-select v-model="params.siteId" placeholder="请选择站点">
<el-option
v-for="item in siteList"
:key="item.siteId"
:label="item.siteName"
:value="item.siteId">
el-option>
el-select>
页面别名:<el-input v-model="params.pageAliase" style="width: 100px">el-input>
<el-button type="primary" size="small" v-on:click="query">查询el-button>
el-form>
2、数据模型对象
增加siteList、pageAliase、siteId,如下:
data() {
return {
siteList:[],//站点列表
list: [],
total:0,
params:{
siteId:'',
pageAliase:'',
page:1,
size:10
}
}
}
3、在钩子方法中 构建siteList站点列表
mounted(){
//当DOM元素渲染完成后调用query
this.query()
//初始化站点列表
this.siteList = [
{
siteId:'5a751fab6abb5044e0d19ea1',
siteName:'门户主站'
},
{
siteId:'102',
siteName:'测试站'
}
]
}
1、向服务端传递查询条件,修改 cms.js
,如下:
import http from './../../../base/api/public'
import querystring from 'querystring'
let sysConfig = require('@/../config/sysConfig')
let apiUrl = sysConfig.xcApiUrlPre;
//页面查询
export const page_list = (page,size,params) =>{
//将params对象数据拼装成key/value串
let queryString = querystring.stringify(params);
//请求服务端的页面查询接口
return http.requestQuickGet(apiUrl+'/cms/page/list/'+page+'/'+size+"?"+queryString);
}
2、页面调用api方法
//页面查询
query:function(){
// alert('查询')
//调用服务端的接口
cmsApi.page_list(this.params.page,this.params.size,this.params).then((res)=>{
//将res结果数据赋值给数据模型对象
this.list = res.queryResult.list;
this.total = res.queryResult.total;
})
}
1、定义响应模型
/**
* Created by mrt on 2018/3/31.
*/
@Data
public class CmsPageResult extends ResponseResult {
CmsPage cmsPage;
public CmsPageResult(ResultCode resultCode,CmsPage cmsPage) {
super(resultCode);
this.cmsPage = cmsPage;
}
}
2、定义添加Api
在api工程中添加接口:
//新增页面
@ApiOperation("新增页面")
public CmsPageResult add(CmsPage cmsPage);
在 cms_page集合 上创建页面名称、站点Id、页面webpath
为唯一索引
1、添加根据页面名称、站点Id、页面webpath查询页面方法,此方法用于校验页面是否存在
public interface CmsPageRepository extends MongoRepository<CmsPage, String> {
//根据页面名称、站点Id、页面webpath查询
CmsPage findByPageNameAndSiteIdAndPageWebPath(String pageName, String siteId, String pageWebPath);
}
2、使用 CmsPageRepository 提供的 save 方法 。
// 新增页面
public CmsPageResult add(CmsPage cmsPage){
//校验页面名称、站点Id、页面webpath的唯一性
//根据页面名称、站点Id、页面webpath去cms_page集合,如果查到说明此页面已经存在,如果查询不到再继续添加
CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
if(cmsPage1==null){
//调用dao新增页面
cmsPage.setPageId(null);
cmsPageRepository.save(cmsPage);
return new CmsPageResult(CommonCode.SUCCESS,cmsPage);
}
//添加失败
return new CmsPageResult(CommonCode.FAIL,null);
}
// 添加页面
@Override
@PostMapping("/add")
public CmsPageResult add(@RequestBody CmsPage cmsPage) {
return pageService.add(cmsPage);
}
page_add.vue
页面使用Element-UI的form组件编写添加表单内容,页面效果如下:
1、创建page_add.vue页面
2、配置路由
在cms模块的路由文件中配置“添加页面”的路由:
{path:'/cms/page/add',name:'新增页面',component: page_add,hidden:true}
注意:由于“添加页面”不需要显示为一个菜单,这里hidden设置为true隐藏菜单。
测试,在浏览器地址栏输入http://localhost:11000/#/cms/page/add
3、在页面列表添加“添加页面”的按钮
实际情况是用户进入页面查询列表,点击“新增页面”按钮进入新增页面窗口。
在查询按钮的旁边添加:
<router-link :to="{path:'/cms/page/add',query:{
page:this.params.page,
siteId:this.params.siteId
}}">
<el-button type="primary" size="small">新增页面</el-button>
</router-link>
说明:router-link是vue提供的路由功能,用于在页面生成路由链接,最终在html渲染后就是 to:目标路由地址
4、完善页面内容
代码如下:
<template>
<div>
<el-form :model="pageForm" label-width="80px" :rules="pageFormRules" ref="pageForm">
<el-form-item label="所属站点" prop="siteId">
<el-select v-model="pageForm.siteId" placeholder="请选择站点">
<el-option
v-for="item in siteList"
:key="item.siteId"
:label="item.siteName"
:value="item.siteId">
el-option>
el-select>
el-form-item>
<el-form-item label="选择模版" prop="templateId">
<el-select v-model="pageForm.templateId" placeholder="请选择">
<el-option
v-for="item in templateList"
:key="item.templateId"
:label="item.templateName"
:value="item.templateId">
el-option>
el-select>
el-form-item>
<el-form-item label="页面名称" prop="pageName">
<el-input v-model="pageForm.pageName" auto-complete="off" >el-input>
el-form-item>
<el-form-item label="别名" prop="pageAliase">
<el-input v-model="pageForm.pageAliase" auto-complete="off" >el-input>
el-form-item>
<el-form-item label="访问路径" prop="pageWebPath">
<el-input v-model="pageForm.pageWebPath" auto-complete="off" >el-input>
el-form-item>
<el-form-item label="物理路径" prop="pagePhysicalPath">
<el-input v-model="pageForm.pagePhysicalPath" auto-complete="off" >el-input>
el-form-item>
<el-form-item label="类型">
<el-radio-group v-model="pageForm.pageType">
<el-radio class="radio" label="0">静态el-radio>
<el-radio class="radio" label="1">动态el-radio>
el-radio-group>
el-form-item>
<el-form-item label="创建时间">
<el-date-picker type="datetime" placeholder="创建时间" v-model="pageForm.pageCreateTime">el-date-picker>
el-form-item>
el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="addSubmit" >提交el-button>
<el-button type="primary" @click="go_back" >返回el-button>
div>
div>
template>
Form Attributes说明:
Form-Item Attributes说明:
详情属性及事件参考http://element.eleme.io/#/zh-CN/component/form
5、数据对象
data() {
return {
siteList:[],
templateList:[],
pageForm:{
siteId:'',
templateId:'',
pageName: '',
pageAliase: '',
pageWebPath: '',
pageParameter:'',
pagePhysicalPath:'',
pageType:'',
pageCreateTime: new Date()
}
}
},
methods:{
addSubmit:function(){
alert("提交")
}
}
6、站点及模板数据(先使用静态数据)
在created钩子方法中定义,created是在html渲染之前执行,这里推荐使用created。
created:function(){
//初始化站点列表
this.siteList = [
{
siteId:'5a751fab6abb5044e0d19ea1',
siteName:'门户主站'
},
{
siteId:'102',
siteName:'测试站'
}
]
//模板列表
this.templateList = [
{
templateId:'5a962b52b00ffc514038faf7',
templateName:'首页'
},
{
templateId:'5a962bf8b00ffc514038fafa',
templateName:'轮播图'
}
]
}
进入新增页面后只能通过菜单再次进入页面列表,可以在新增页面添加“返回”按钮,点击返回按钮返回到页面列表。
新增页面按钮带上参数
<router-link :to="{path:'/cms/page/add',query:{
page:this.params.page,
siteId:this.params.siteId
}}">
<el-button type="primary" size="small">新增页面</el-button>
</router-link>
说明:query表示在路由url上带上参数
2)定义返回方法
在page_add.vue上定义返回按钮
<el-button type="primary" @click="go_back" >返回</el-button>
在page_add.vue
上定义返回方法
//返回
go_back:function () {
this.$router.push({
path:'/cms/page/list',
query:{
page:this.$route.query.page,//取出路由中的参数
siteId:this.$route.query.siteId
}
})
}
说明:this.$route.query
表示取出路由上的参数列表,有两个取路由参数的方法:
a、通过在路由上添加key/value串使用this.$route.query来取参数,例如:/router1?id=123 ,/router1?id=456 可以通过this.$route.query.id获取参数id的值。
b、通过将参数作为路由一部分进行传参数使用this.$route.params来获取,例如:定义的路由为/router1/:id ,请求/router1/123时可以通过this.$route.params.id来获取,此种情况用this.$route.query.id是拿不到的。
3)查询列表支持回显
进入查询列表,从url中获取页码和站点id并赋值给数据模型对象,从而实现页面回显。
url例子:http://localhost:12000/#/cms/page/list?page=2&siteId=5a751fab6abb5044e0d19ea1
created() {
//从路由上获取参数
this.params.page = Number.parseInt(this.$route.query.page||1);
this.params.siteId = this.$route.query.siteId||'';
.....
小技巧:使用 ||返回第一个有效值
1、配置校验规则
:
Element-UI 的 Form 组件提供表单校验的方法:
在 form 属性上配置 rules(表单验证规则)
<el‐form :model="pageForm" :rules="pageFormRules" label‐width="80px" >
在数据模型中配置校验规则:
pageFormRules: {
siteId:[
{required: true, message: '请选择站点', trigger: 'blur'}
],
templateId:[
{required: true, message: '请选择模版', trigger: 'blur'}
],
pageName: [
{required: true, message: '请输入页面名称', trigger: 'blur'}
],
pageWebPath: [
{required: true, message: '请输入访问路径', trigger: 'blur'}
],
pagePhysicalPath: [
{required: true, message: '请输入物理路径', trigger: 'blur'}
]
}
更多的校验规则参考 http://element.eleme.io/#/zh-CN/component/form 中“表单验证”的例子。
2、点击提交按钮触发校验
1)在form表单上添加 ref属性(ref=“pageForm”)在校验时引用此表单对象
<el‐form :model="pageForm" :rules="pageFormRules" label‐width="80px" ref="pageForm">
2)执行校验
this.$refs.pageForm.validate((valid) => {
if (valid) {
alert('提交');
} else {
alert('校验失败');
return false;
}
})
1、在cms.js
中定义page_add方法。
//新增页面
export const page_add = params =>{
return http.requestPost(apiUrl+'/cms/page/add',params)
}
2、添加事件
本功能使用到两个UI组件:
1、使用element-ui的message-box组件弹出确认提交窗口(http://element.eleme.io/#/zhCN/component/message-box)。
this.$confirm('确认提交吗?', '提示', {}).then(() => {})
2、使用 message组件提示操作结果 (http://element.eleme.io/#/zh-CN/component/message)
this.$message({
message: '提交成功',
type: 'success'
})
完整的代码如下:
addSubmit:function(){
this.$refs['pageForm'].validate((valid) => {
if (valid) {//表单校验成功
//确认提示
this.$confirm('您确认提交吗?', '提示', { }).then(() => {
//调用page_add方法请求服务端的新增页面接口
cmsApi.page_add(this.pageForm).then(res=>{
//解析服务端响应内容
if(res.success){
/*this.$message({
message: '提交成功',
type: 'success'
})*/
this.$message.success("提交成功")
//将表单清空
this.$refs['pageForm'].resetFields();
}else if(res.message){
this.$message.error(res.message)
}else{
this.$message.error("提交失败")
}
});
})
}
});
}
修改页面用户操作流程:
1、用户进入修改页面,在页面上显示了修改页面的信息
2、用户修改页面的内容,点击“提交”,提示“修改成功”或“修改失败”
修改页面需要定义的API如下:
//根据页面id查询页面信息
@ApiOperation("根据页面id查询页面信息")
public CmsPage findById(String id);
//修改页面
@ApiOperation("修改页面")
public CmsPageResult edit(String id, CmsPage cmsPage);
说明:提交数据使用post、put都可以,只是根据http方法的规范,put方法是对服务器指定资源进行修改,所以这里使用put方法对页面修改进行修改。
使用 Spring Data提供的findById方法完成根据主键查询 。
使用 Spring Data提供的save方法完成数据保存 。
//根据页面id查询页面
public CmsPage getById(String id){
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
CmsPage cmsPage = optional.get();
return cmsPage;
}
return null;
}
//修改页面
public CmsPageResult update(String id,CmsPage cmsPage){
//根据id从数据库查询页面信息
CmsPage one = this.getById(id);
if(one != null){
//准备更新数据
//设置要修改的数据
//更新模板id
one.setTemplateId(cmsPage.getTemplateId());
//更新所属站点
one.setSiteId(cmsPage.getSiteId());
//更新页面别名
one.setPageAliase(cmsPage.getPageAliase());
//更新页面名称
one.setPageName(cmsPage.getPageName());
//更新访问路径
one.setPageWebPath(cmsPage.getPageWebPath());
//更新物理路径
one.setPagePhysicalPath(cmsPage.getPagePhysicalPath());
//提交修改
cmsPageRepository.save(one);
return new CmsPageResult(CommonCode.SUCCESS,one);
}
//修改失败
return new CmsPageResult(CommonCode.FAIL,null);
}
1、根据id查询页面
@Override
@GetMapping("/get/{id}")
public CmsPage findById(@PathVariable("id") String id) {
return pageService.getById(id);
}
2、保存页面信息
@Override
@PutMapping("/edit/{id}")//这里使用put方法,http 方法中put表示更新
public CmsPageResult edit(@PathVariable("id")String id, @RequestBody CmsPage cmsPage) {
return pageService.update(id, cmsPage);
}
测试:使用 Swagger UI 测试
页面的处理流程如下:
1、进入页面,通过钩子方法请求服务端获取页面信息,并赋值给数据模型对象
2、页面信息通过数据绑定在表单显示
3、用户修改信息点击“提交”请求服务端修改页面信息接口
page_edit
页面修改页面的布局同添加页面,可以直接复制添加页面,在添加页面基础上修改。
下边编写页面内容:
1、编写page_edit.vue
页面布局同添加页面,略。
2、配置路由
进入修改页面传入pageId
import page_edit from '@/module/cms/page/page_edit.vue';
{ path: '/cms/page/edit/:pageId', name:'修改页面',component: page_edit,hidden:true},
3、在页面列表添加“编辑”链接
参考table组件的例子,在page_list.vue上添加“操作”列
<el-table-column label="操作" width="80">
<template slot-scope="page">
<el-button
size="small"type="text"
@click="edit(page.row.pageId)">编辑
</el-button>
</template>
</el-table-column>
编写edit方法
edit:function(pageId){
//打开修改页面
this.$router.push({
path:'/cms/page/edit/'+pageId
})
}
点击“编辑”打开修改页面窗口。
本功能实现:进入修改页面立即显示要修改的页面信息。
1、定义api方法
//根据id查询页面
export const page_get = id =>{
return http.requestQuickGet(apiUrl+'/cms/page/get/'+id)
}
2、定义数据对象
进入修改页面传入pageId参数,在数据模型中添加pageId
data(){
return {
......
//页面id
pageId:'',
......
}
}
3、在created钩子方法 中查询页面信息
created: function () {
this.pageId=this.$route.params.pageId;
//根据主键查询页面信息
cmsApi.page_get(this.pageId).then((res) => {
console.log(res);
if(res){
this.pageForm = res;
}
});
}
1、定义api方法
//修改页面提交
export const page_edit = (id,params) =>{
return http.requestPut(apiUrl+'/cms/page/edit/'+id,params)
}
2、提交按钮方法
添加提交按钮事件:
<el‐button type="primary" @click="editSubmit" >提交</el‐button>
3、提交按钮事件内容
:
editSubmit(){
this.$refs.pageForm.validate((valid) => {//表单校验
if (valid) {//表单校验通过
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.addLoading = true;
//修改提交请求服务端的接口
cmsApi.page_edit(this.pageId,this.pageForm).then((res) => {
console.log(res);
if(res.success){
this.addLoading = false;
this.$message({
message: '提交成功',
type: 'success'
});
//返回
this.go_back();
}else{
this.addLoading = false;
this.$message.error('提交失败');
}
});
});
}
});
}
}
4、测试
修改页面信息,点击提交。
用户操作流程:
1、用户进入用户列表,点击“删除”
2、执行删除操作,提示“删除成功”或“删除失败”
//删除页面
@ApiOperation("删除页面")
public ResponseResult delete(String id);
使用 Spring Data提供的deleteById方法完成删除操作 。
//根据id删除页面
public ResponseResult delete(String id){
//先查询一下
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
cmsPageRepository.deleteById(id);
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
@Override
@DeleteMapping("/del/{id}")
public ResponseResult delete(@PathVariable("id") String id) {
return pageService.delete(id);
}
/*页面删除*/
export const page_del = id => {
return http.requestDelete(apiUrl+'/cms/page/del/'+id)
}
1、在page_list.vue页面添加删除按钮
<el-table-column label="操作" width="80">
<template slot-scope="page">
<el-button
size="small"type="text"
@click="edit(page.row.pageId)">编辑
</el-button>
<el-button
size="small"type="text"
@click="del(page.row.pageId)">删除
</el-button>
</template>
</el-table-column>
2、删除事件
//删除
del:function (pageId) {
this.$confirm('您确认删除吗?', '提示', { }).then(() => {
//调用服务端接口
cmsApi.page_del(pageId).then(res=>{
if(res.success){
this.$message.success("删除成功")
//刷新页面
this.query()
}else{
this.$message.error("删除失败")
}
})
})
}
},
此部分为自学内容,根据今天所学知识完成下边的任务。
页面查询条件增加:页面名称、页面类型。
页面名称对应CmsPage模型类中的pageName属性。
页面类型对应CmsPage模型类中的pageType属性。
查询要求:
页面名称:模糊查询
页面类型:精确匹配,页面类型包括:静态和动态,在数据库中静态用“0”表示,动态用“1”表示。
在CmsPage.java模型类型中有一个dataUrl属性,此属性在页面静态化时需要填写。
本需求要求:
1、在新增页面增加dataUrl输入框,并支持添加。
2、在修改页面增加dataUrl输入框,并支持修改