admin/src/api/business/seo.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ import request from '../../utils/request' // æ¥è¯¢ export function fetchList (data) { return request.post('/business/seo/page', data, { trim: true }) } // å建 export function create (data) { return request.post('/business/seo/create', data) } // ä¿®æ¹ export function updateById (data) { return request.post('/business/seo/updateById', data) } // å é¤ export function deleteById (id) { return request.get(`/business/seo/delete/${id}`) } // æ¹éå é¤ export function deleteByIdInBatch (ids) { return request.get('/business/seo/delete/batch', { params: { ids } }) } admin/src/components/business/OperaSeoWindow.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,71 @@ <template> <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm" > <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="页é¢åç§°" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥é¡µé¢åç§°" v-trim/> </el-form-item> <el-form-item label="页é¢å°å" prop="pageAddr"> <el-input v-model="form.pageAddr" placeholder="请è¾å ¥é¡µé¢å°åï¼/default.html 表示ç½ç«é»è®¤é 置项ï¼" v-trim/> </el-form-item> <el-form-item label="æ é¢" prop="title"> <el-input v-model="form.title" placeholder="请è¾å ¥æ é¢" v-trim/> </el-form-item> <el-form-item label="å ³é®å" prop="keywords"> <el-input type="textarea" v-model="form.keywords" placeholder="请è¾å ¥å ³é®å" v-trim/> </el-form-item> <el-form-item label="ä½è ä¿¡æ¯" prop="author"> <el-input v-model="form.author" placeholder="请è¾å ¥ä½è ä¿¡æ¯" v-trim/> </el-form-item> <el-form-item label="æåºç (ååº)" prop="sortnum"> <el-input v-model="form.sortnum" type="number" placeholder="请è¾å ¥æåºç " v-trim/> </el-form-item> <el-form-item label="æè¿°" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请è¾å ¥æè¿°" v-trim/> </el-form-item> <el-form-item label="å¾çalt" prop="imgalt"> <el-input v-model="form.imgalt" placeholder="请è¾å ¥å¾çalt" v-trim/> </el-form-item> </el-form> </GlobalWindow> </template> <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' export default { name: 'OperaSeoWindow', extends: BaseOpera, components: { GlobalWindow }, data () { return { // è¡¨åæ°æ® form: { id: null, remark: '', name: '', title: '', keywords: '', author: '', icon: '', pageAddr: '', sortnum: '', imgalt: '' }, // éªè¯è§å rules: { } } }, created () { this.config({ api: '/business/seo', 'field.id': 'id' }) } } </script> admin/src/views/business/seo.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ <template> <TableLayout :permissions="['business:seo:query']"> <!-- æç´¢è¡¨å --> <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> <el-form-item label="页é¢åç§°" prop="name"> <el-input v-model="searchForm.name" placeholder="请è¾å ¥é¡µé¢åç§°" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item label="æ é¢" prop="title"> <el-input v-model="searchForm.title" placeholder="请è¾å ¥æ é¢" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item label="å ³é®å" prop="keywords"> <el-input v-model="searchForm.keywords" placeholder="请è¾å ¥å ³é®å" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item label="页é¢å°å" prop="pageAddr"> <el-input v-model="searchForm.pageAddr" placeholder="请è¾å ¥é¡µé¢å°å" @keypress.enter.native="search"></el-input> </el-form-item> <section> <el-button type="primary" @click="search">æç´¢</el-button> <el-button @click="reset">éç½®</el-button> </section> </el-form> <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['business:seo:create', 'business:seo:delete']"> <li><el-button type="primary" @click="$refs.operaSeoWindow.open('æ°å»ºç½ç«SEOé ç½®')" icon="el-icon-plus" v-permissions="['business:seo:create']">æ°å»º</el-button></li> <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:seo:delete']">å é¤</el-button></li> </ul> <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="页é¢åç§°" min-width="100px"></el-table-column> <el-table-column prop="title" label="æ é¢" min-width="100px"></el-table-column> <el-table-column prop="keywords" label="å ³é®å" min-width="150px"></el-table-column> <el-table-column prop="author" label="ä½è ä¿¡æ¯" min-width="100px"></el-table-column> <el-table-column prop="pageAddr" label="页é¢å°å" min-width="150px"></el-table-column> <el-table-column prop="remark" label="æè¿°" min-width="100px"></el-table-column> <el-table-column prop="imgalt" label="å¾çalt" min-width="100px"></el-table-column> <el-table-column prop="sortnum" label="æåºç " min-width="100px"></el-table-column> <el-table-column prop="editDate" label="æä½æ¶é´" min-width="150px"></el-table-column> <el-table-column prop="editorName" label="æä½äºº" min-width="100px"></el-table-column> <el-table-column v-if="containPermissions(['business:seo:update', 'business:seo:delete'])" label="æä½" min-width="120" fixed="right" > <template slot-scope="{row}"> <el-button type="text" @click="$refs.operaSeoWindow.open('ç¼è¾ç½ç«SEOé ç½®', row)" icon="el-icon-edit" v-permissions="['business:seo:update']">ç¼è¾</el-button> <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:seo:delete']">å é¤</el-button> </template> </el-table-column> </el-table> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination" > </pagination> </template> <!-- æ°å»º/ä¿®æ¹ --> <OperaSeoWindow ref="operaSeoWindow" @success="handlePageChange"/> </TableLayout> </template> <script> import BaseTable from '@/components/base/BaseTable' import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import OperaSeoWindow from '@/components/business/OperaSeoWindow' export default { name: 'Seo', extends: BaseTable, components: { TableLayout, Pagination, OperaSeoWindow }, data () { return { // æç´¢ searchForm: { name: '', title: '', keywords: '', author: '', pageAddr: '' } } }, created () { this.config({ module: 'ç½ç«SEOé ç½®', api: '/business/seo', 'field.id': 'id', 'field.main': 'id' }) this.search() } } </script> server/src/main/java/com/doumee/api/business/SeoController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,85 @@ package com.doumee.api.business; import com.doumee.api.BaseController; import com.doumee.core.annotation.excel.ExcelExporter; import com.doumee.core.annotation.pr.PreventRepeat; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageWrap; import com.doumee.core.model.PageData; import com.doumee.dao.business.model.Seo; import com.doumee.service.business.SeoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; /** * @author æ±è¹è¹ * @since 2025/07/02 11:35 */ @Api(tags = "ç½ç«SEOé ç½®") @RestController @RequestMapping("/business/seo") public class SeoController extends BaseController { @Autowired private SeoService seoService; @PreventRepeat @ApiOperation("æ°å»º") @PostMapping("/create") @RequiresPermissions("business:seo:create") public ApiResponse create(@RequestBody Seo seo) { return ApiResponse.success(seoService.create(seo)); } @ApiOperation("æ ¹æ®IDå é¤") @GetMapping("/delete/{id}") @RequiresPermissions("business:seo:delete") public ApiResponse deleteById(@PathVariable Integer id) { seoService.deleteById(id); return ApiResponse.success(null); } @ApiOperation("æ¹éå é¤") @GetMapping("/delete/batch") @RequiresPermissions("business:seo:delete") public ApiResponse deleteByIdInBatch(@RequestParam String ids) { seoService.deleteByIdInBatch(this.getIdList(ids)); return ApiResponse.success(null); } @ApiOperation("æ ¹æ®IDä¿®æ¹") @PostMapping("/updateById") @RequiresPermissions("business:seo:update") public ApiResponse updateById(@RequestBody Seo seo) { seoService.updateById(seo); return ApiResponse.success(null); } @ApiOperation("å页æ¥è¯¢") @PostMapping("/page") @RequiresPermissions("business:seo:query") public ApiResponse<PageData<Seo>> findPage (@RequestBody PageWrap<Seo> pageWrap) { return ApiResponse.success(seoService.findPage(pageWrap)); } @ApiOperation("导åºExcel") @PostMapping("/exportExcel") @RequiresPermissions("business:seo:exportExcel") public void exportExcel (@RequestBody PageWrap<Seo> pageWrap, HttpServletResponse response) { ExcelExporter.build(Seo.class).export(seoService.findPage(pageWrap).getRecords(), "ç½ç«SEOé ç½®", response); } @ApiOperation("æ ¹æ®IDæ¥è¯¢") @GetMapping("/{id}") @RequiresPermissions("business:seo:query") public ApiResponse findById(@PathVariable Integer id) { return ApiResponse.success(seoService.findById(id)); } } server/src/main/java/com/doumee/dao/business/SeoMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.doumee.dao.business; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.doumee.dao.business.model.Seo; import com.github.yulichang.base.MPJBaseMapper; /** * @author æ±è¹è¹ * @since 2025/07/02 11:35 */ public interface SeoMapper extends MPJBaseMapper<Seo> { } server/src/main/java/com/doumee/dao/business/model/Information.java
@@ -81,6 +81,11 @@ @ApiModelProperty(value = "ç¶æ 0æ£å¸¸ 1ç¦ç¨", example = "1") @ExcelColumn(name="ç¶æ 0æ£å¸¸ 1ç¦ç¨") private Integer status; @ApiModelProperty(value = "æå±æ¨¡å 0è¡ä¸èµè®¯ã1è¿è¥ç»éªã2åè½ä»ç»ã3å¸åºä¿¡æ¯", example = "1") @ExcelColumn(name="module 0æ£å¸¸ 1ç¦ç¨") private Integer module; @ApiModelProperty(value = "å°é¢å¾çå°å") @TableField(exist = false) server/src/main/java/com/doumee/dao/business/model/Seo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,91 @@ package com.doumee.dao.business.model; import com.baomidou.mybatisplus.annotation.TableField; import com.doumee.core.annotation.excel.ExcelColumn; import com.doumee.core.annotation.excel.ExcelColumn; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; /** * ç½ç«SEOé ç½® * @author æ±è¹è¹ * @since 2025/07/02 11:35 */ @Data @ApiModel("ç½ç«SEOé ç½®") @TableName("`seo`") public class Seo { @TableId(type = IdType.AUTO) @ApiModelProperty(value = "主é®", example = "1") @ExcelColumn(name="主é®") private Integer id; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") @ExcelColumn(name="å建人ç¼ç ") private Integer creator; @ApiModelProperty(value = "å建æ¶é´") @ExcelColumn(name="å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date createDate; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") @ExcelColumn(name="æ´æ°äººç¼ç ") private Integer editor; @ApiModelProperty(value = "æ´æ°æ¶é´") @ExcelColumn(name="æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date editDate; @ApiModelProperty(value = "æ¯å¦å é¤0å¦ 1æ¯", example = "1") @ExcelColumn(name="æ¯å¦å é¤0å¦ 1æ¯") private Integer isdeleted; @ApiModelProperty(value = "夿³¨") @ExcelColumn(name="夿³¨") private String remark; @ApiModelProperty(value = "页é¢åç§°") @ExcelColumn(name="页é¢åç§°") private String name; @ApiModelProperty(value = "æ é¢") @ExcelColumn(name="æ é¢") private String title; @ApiModelProperty(value = "å ³é®å") @ExcelColumn(name="å ³é®å") private String keywords; @ApiModelProperty(value = "ä½è ä¿¡æ¯") @ExcelColumn(name="ä½è ä¿¡æ¯") private String author; @ApiModelProperty(value = "徿 å°å", example = "1") @ExcelColumn(name="徿 å°å") private Integer icon; @ApiModelProperty(value = "页é¢å°åï¼/default.html 表示ç½ç«é»è®¤é 置项ï¼") @ExcelColumn(name="页é¢å°åï¼/default.html 表示ç½ç«é»è®¤é 置项ï¼") private String pageAddr; @ApiModelProperty(value = "å¾çalt屿§å¼") @ExcelColumn(name="å¾çalt屿§å¼") private String imgalt; @ApiModelProperty(value = "æåºç ", example = "1") @ExcelColumn(name="æåºç ") private Integer sortnum; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") @TableField(exist = false) private String editorName; } server/src/main/java/com/doumee/service/business/SeoService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ package com.doumee.service.business; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.Seo; import java.util.List; /** * ç½ç«SEOé ç½®Serviceå®ä¹ * @author æ±è¹è¹ * @since 2025/07/02 11:35 */ public interface SeoService { /** * å建 * * @param seo å®ä½å¯¹è±¡ * @return Integer */ Integer create(Seo seo); /** * 主é®å é¤ * * @param id ä¸»é® */ void deleteById(Integer id); /** * å é¤ * * @param seo å®ä½å¯¹è±¡ */ void delete(Seo seo); /** * æ¹é主é®å é¤ * * @param ids 主é®é */ void deleteByIdInBatch(List<Integer> ids); /** * 䏻鮿´æ° * * @param seo å®ä½å¯¹è±¡ */ void updateById(Seo seo); /** * æ¹é䏻鮿´æ° * * @param seos å®ä½é */ void updateByIdInBatch(List<Seo> seos); /** * 䏻鮿¥è¯¢ * * @param id ä¸»é® * @return Seo */ Seo findById(Integer id); /** * æ¡ä»¶æ¥è¯¢åæ¡è®°å½ * * @param seo å®ä½å¯¹è±¡ * @return Seo */ Seo findOne(Seo seo); /** * æ¡ä»¶æ¥è¯¢ * * @param seo å®ä½å¯¹è±¡ * @return List<Seo> */ List<Seo> findList(Seo seo); /** * å页æ¥è¯¢ * * @param pageWrap å页对象 * @return PageData<Seo> */ PageData<Seo> findPage(PageWrap<Seo> pageWrap); /** * æ¡ä»¶ç»è®¡ * * @param seo å®ä½å¯¹è±¡ * @return long */ long count(Seo seo); } server/src/main/java/com/doumee/service/business/impl/CarouselServiceImpl.java
@@ -86,7 +86,9 @@ if (CollectionUtils.isEmpty(ids)) { return; } carouselMapper.deleteBatchIds(ids); for(Integer id :ids){ this.deleteById(id); } } @Override server/src/main/java/com/doumee/service/business/impl/InformationServiceImpl.java
@@ -77,7 +77,9 @@ if (CollectionUtils.isEmpty(ids)) { return; } informationMapper.deleteBatchIds(ids); for (Integer id : ids) { this.deleteById(id); } } @Override @@ -140,6 +142,7 @@ queryWrapper.lambda() .eq(Information::getIsdeleted,Constants.ZERO) .eq(pageWrap.getModel().getId() != null, Information::getId, pageWrap.getModel().getId()) .eq(pageWrap.getModel().getModule() != null, Information::getModule, pageWrap.getModel().getModule()) .eq(pageWrap.getModel().getType() != null, Information::getType, pageWrap.getModel().getType()) .eq(pageWrap.getModel().getStatus() != null, Information::getStatus, pageWrap.getModel().getStatus()) .eq(pageWrap.getModel().getRemark() != null, Information::getRemark, pageWrap.getModel().getRemark()) server/src/main/java/com/doumee/service/business/impl/SeoServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,169 @@ package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.SeoMapper; import com.doumee.dao.business.model.Carousel; import com.doumee.dao.business.model.Seo; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.SeoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Objects; /** * ç½ç«SEOé ç½®Serviceå®ç° * @author æ±è¹è¹ * @since 2025/07/02 11:35 */ @Service public class SeoServiceImpl implements SeoService { @Autowired private SeoMapper seoMapper; @Override public Integer create(Seo seo) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(Objects.isNull(seo) || Objects.isNull(seo.getPageAddr()) || Objects.isNull(seo.getName()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(seoMapper.selectCount(new LambdaQueryWrapper<Seo>().eq(Seo::getIsdeleted,Constants.ZERO) .eq(Seo::getPageAddr,seo.getPageAddr())) >0 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"该页é¢å°åå·²é ç½®ï¼è¯·å¿éå¤é ç½®ï¼"); } seo.setIsdeleted(Constants.ZERO); seo.setCreateDate(new Date()); seo.setCreator(user.getId()); seo.setEditDate(new Date()); seo.setEditor(user.getId()); seoMapper.insert(seo); return seo.getId(); } @Override public void deleteById(Integer id) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); seoMapper.update(new UpdateWrapper<Seo>().lambda() .set(Seo::getEditDate,new Date()) .set(Seo::getEditor,user.getId()) .set(Seo::getIsdeleted,Constants.ONE) .eq(Seo::getId,id)); } @Override public void delete(Seo seo) { UpdateWrapper<Seo> deleteWrapper = new UpdateWrapper<>(seo); seoMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List<Integer> ids) { if (CollectionUtils.isEmpty(ids)) { return; } for(Integer id :ids){ this.deleteById(id); } } @Override public void updateById(Seo seo) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(StringUtils.isNotBlank(seo.getPageAddr()) && seoMapper.selectCount(new LambdaQueryWrapper<Seo>().eq(Seo::getIsdeleted,Constants.ZERO) .eq(Seo::getPageAddr,seo.getPageAddr()).ne(Seo::getId,seo.getId())) >0 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"该页é¢å°åå·²é ç½®ï¼è¯·å¿éå¤é ç½®ï¼"); } seo.setIsdeleted(Constants.ZERO); seo.setEditDate(new Date()); seo.setEditor(user.getId()); seoMapper.updateById(seo); } @Override public void updateByIdInBatch(List<Seo> seos) { if (CollectionUtils.isEmpty(seos)) { return; } for (Seo seo: seos) { this.updateById(seo); } } @Override public Seo findById(Integer id) { return seoMapper.selectById(id); } @Override public Seo findOne(Seo seo) { QueryWrapper<Seo> wrapper = new QueryWrapper<>(seo); return seoMapper.selectOne(wrapper); } @Override public List<Seo> findList(Seo seo) { seo.setIsdeleted(Constants.ZERO); QueryWrapper<Seo> wrapper = new QueryWrapper<>(seo); return seoMapper.selectList(wrapper); } @Override public PageData<Seo> findPage(PageWrap<Seo> pageWrap) { IPage<Seo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper<Seo> queryWrapper = new MPJLambdaWrapper<Seo>(); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setIsdeleted(Constants.ZERO); queryWrapper.selectAll(Seo.class ) .selectAs(SystemUser::getUsername,Seo::getEditorName) .leftJoin(SystemUser.class,SystemUser::getId,Seo::getEditor) .eq(pageWrap.getModel().getId() != null, Seo::getId, pageWrap.getModel().getId()) .eq(pageWrap.getModel().getCreator() != null, Seo::getCreator, pageWrap.getModel().getCreator()) .ge(pageWrap.getModel().getCreateDate() != null, Seo::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())) .le(pageWrap.getModel().getCreateDate() != null, Seo::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())) .eq(pageWrap.getModel().getEditor() != null, Seo::getEditor, pageWrap.getModel().getEditor()) .ge(pageWrap.getModel().getEditDate() != null, Seo::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())) .le(pageWrap.getModel().getEditDate() != null, Seo::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())) .eq(pageWrap.getModel().getIsdeleted() != null, Seo::getIsdeleted, pageWrap.getModel().getIsdeleted()) .eq(pageWrap.getModel().getRemark() != null, Seo::getRemark, pageWrap.getModel().getRemark()) .like(pageWrap.getModel().getName() != null, Seo::getName, pageWrap.getModel().getName()) .like(pageWrap.getModel().getTitle() != null, Seo::getTitle, pageWrap.getModel().getTitle()) .like(pageWrap.getModel().getKeywords() != null, Seo::getKeywords, pageWrap.getModel().getKeywords()) .like(pageWrap.getModel().getAuthor() != null, Seo::getAuthor, pageWrap.getModel().getAuthor()) .eq(pageWrap.getModel().getIcon() != null, Seo::getIcon, pageWrap.getModel().getIcon()) .like(pageWrap.getModel().getImgalt() != null, Seo::getImgalt, pageWrap.getModel().getImgalt()) .like(pageWrap.getModel().getPageAddr() != null, Seo::getPageAddr, pageWrap.getModel().getPageAddr()) .eq(pageWrap.getModel().getSortnum() != null, Seo::getSortnum, pageWrap.getModel().getSortnum()) .orderByAsc(Seo::getSortnum); return PageData.from(seoMapper.selectPage(page, queryWrapper)); } @Override public long count(Seo seo) { QueryWrapper<Seo> wrapper = new QueryWrapper<>(seo); return seoMapper.selectCount(wrapper); } }