This commit is contained in:
Vinjor 2025-10-09 16:45:27 +08:00
parent 5bef820790
commit a8bf76fbca
11 changed files with 148 additions and 34 deletions

View File

@ -172,10 +172,13 @@ public class WebController extends BaseController {
* @date 10:04 2025/7/8
**/
@ApiOperation("热门产品-前10")
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/hotProduct")
public R<List<BusiProdNew>> hotProduct(@RequestParam(required = true) String tenantId) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, true));
public R<List<BusiProdNew>> hotProduct(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, true,showPlat));
}
/**
@ -186,10 +189,13 @@ public class WebController extends BaseController {
* @date 10:04 2025/7/8
**/
@ApiOperation("普通产品-前10")
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/product")
public R<List<BusiProdNew>> product(@RequestParam(required = true) String tenantId) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, false));
public R<List<BusiProdNew>> product(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, false,showPlat));
}
/**
@ -200,10 +206,13 @@ public class WebController extends BaseController {
* @date 10:04 2025/7/8
**/
@ApiOperation("热门新闻-前10")
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/hotNews")
public R<List<BusiProdNew>> hotNews(@RequestParam(required = true) String tenantId) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_NEWS, true));
public R<List<BusiProdNew>> hotNews(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) {
return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_NEWS, true,showPlat));
}
/**
@ -237,16 +246,18 @@ public class WebController extends BaseController {
@ApiImplicitParam(name = "pageNum", value = "页码1开始", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/prodPageList")
public R<IPage<BusiProdNew>> prodPageList(String tenantId, String catgId, String text,
public R<IPage<BusiProdNew>> prodPageList(String tenantId, @RequestParam(required = false) String catgId, @RequestParam(required = false) String text,String showPlat,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.eq(BusiProdNew::getDataType, DATA_TYPE_PRODUCT)
.eq(BusiProdNew::getIfPublic, true)
.like(BusiProdNew::getShowPlat,showPlat)
.eq(BusiProdNew::getTenantId, tenantId);
if (StringUtils.isNotEmpty(text)) {
queryWrapper.and(wq -> wq
@ -291,16 +302,18 @@ public class WebController extends BaseController {
@ApiImplicitParam(name = "pageNum", value = "页码1开始", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/newsPageList")
public R<IPage<BusiProdNew>> newsPageList(String tenantId, String catgId, String text,
public R<IPage<BusiProdNew>> newsPageList(String tenantId, @RequestParam(required = false) String catgId, @RequestParam(required = false) String text,String showPlat,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.eq(BusiProdNew::getDataType, DATA_TYPE_NEWS)
.eq(BusiProdNew::getIfPublic, true)
.like(BusiProdNew::getShowPlat,showPlat)
.eq(BusiProdNew::getTenantId, tenantId);
if (StringUtils.isNotEmpty(text)) {
queryWrapper.and(wq -> wq
@ -354,14 +367,15 @@ public class WebController extends BaseController {
@ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "pageNum", value = "页码1开始", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "text", value = "搜索内容", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
@ApiImplicitParam(name = "text", value = "搜索内容", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
})
@GetMapping("/searchText")
public R<IPage<BusiProdNew>> searchText(String tenantId, String text,
public R<IPage<BusiProdNew>> searchText(String tenantId, String text,String showPlat,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> page = new Page<>(pageNum, pageSize);
return R.ok(prodNewService.searchTextAll(tenantId, text, page));
return R.ok(prodNewService.searchTextAll(tenantId, text, page,showPlat));
}
/**

View File

@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.base.service.IBasePicsService;
import com.ruoyi.busi.domain.BusiProdNew;
import com.ruoyi.busi.domain.BusiProdRandom;
import com.ruoyi.busi.domain.BusiRelation;
import com.ruoyi.busi.service.IBusiProdNewService;
import com.ruoyi.busi.service.IBusiProdRandomService;
import com.ruoyi.busi.service.IBusiRelationService;
import com.ruoyi.busi.utils.SimHash;
import com.ruoyi.busi.utils.TextPreprocessor;
import com.ruoyi.busi.vo.ProdNewVO;
@ -15,6 +17,7 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@ -43,6 +46,8 @@ public class BusiNewController extends BaseController
private IBasePicsService basePicsService;
@Autowired
private IBusiProdRandomService prodRandomService;
@Autowired
private IBusiRelationService relationService;
/**
* 查询新闻列表
@ -121,6 +126,13 @@ public class BusiNewController extends BaseController
});
basePicsService.saveBatch(prodNewVO.getFileList());
}
//默认负责人就是当前用户
BusiRelation relation = new BusiRelation();
relation.setUserId(SecurityUtils.getUserId());
relation.setProdId(prodNewVO.getId());
relation.setTenantId(prodNewVO.getTenantId());
relationService.save(relation);
busiProdNewService.setAmount(prodNewVO.getTenantId());
return success();
}

View File

@ -10,11 +10,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.base.service.IBasePicsService;
import com.ruoyi.busi.domain.BusiProdRandom;
import com.ruoyi.busi.domain.BusiRelation;
import com.ruoyi.busi.service.IBusiProdRandomService;
import com.ruoyi.busi.service.IBusiRelationService;
import com.ruoyi.busi.utils.SimHash;
import com.ruoyi.busi.utils.TextPreprocessor;
import com.ruoyi.busi.vo.ProdNewVO;
import com.ruoyi.busi.vo.ProdRandomVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
@ -54,6 +57,8 @@ public class BusiProdController extends BaseController
private IBasePicsService basePicsService;
@Autowired
private IBusiProdRandomService prodRandomService;
@Autowired
private IBusiRelationService relationService;
/**
* 查询产品列表
@ -132,6 +137,13 @@ public class BusiProdController extends BaseController
});
basePicsService.saveBatch(prodNewVO.getFileList());
}
//默认负责人就是当前用户
BusiRelation relation = new BusiRelation();
relation.setUserId(SecurityUtils.getUserId());
relation.setProdId(prodNewVO.getId());
relation.setTenantId(prodNewVO.getTenantId());
relationService.save(relation);
busiProdNewService.setAmount(prodNewVO.getTenantId());
return success();
}

View File

@ -89,7 +89,7 @@ public class BusiRelationController extends BaseController
List<BusiRelation> busiRelationList = new ArrayList<>();
userIdList.forEach(item->{
BusiRelation relation = new BusiRelation();
relation.setUserId(item);
relation.setUserId(Long.valueOf(item));
relation.setProdId(busiRelation.getProdId());
relation.setTenantId(busiRelation.getTenantId());
busiRelationList.add(relation);

View File

@ -30,7 +30,7 @@ public class BusiRelation extends DlBaseEntity
/** 用户id */
@Excel(name = "用户id")
private String userId;
private Long userId;
/** 产品、新闻id */
@Excel(name = "产品、新闻id")

View File

@ -54,7 +54,7 @@ public interface IBusiProdNewService extends IService<BusiProdNew>
* @param tenantId 租户id
* @return java.util.List<com.ruoyi.busi.domain.BusiProdNew>
**/
List<BusiProdNew> hotProdOrNews(String tenantId,String dateType,Boolean ifHot);
List<BusiProdNew> hotProdOrNews(String tenantId,String dateType,Boolean ifHot,String showPlat);
/**
* web站点查看详情
@ -74,7 +74,7 @@ public interface IBusiProdNewService extends IService<BusiProdNew>
* @param page 分页对象
* @return com.baomidou.mybatisplus.core.metadata.IPage<com.ruoyi.busi.vo.ProdNewVO>
**/
IPage<BusiProdNew> searchTextAll(String tenantId, String text,Page<BusiProdNew> page);
IPage<BusiProdNew> searchTextAll(String tenantId, String text,Page<BusiProdNew> page,String showPlat);
/**
* 相似度检测

View File

@ -146,13 +146,14 @@ public class BusiProdNewServiceImpl extends ServiceImpl<BusiProdNewMapper,BusiPr
* @date 11:33 2025/7/8
**/
@Override
public List<BusiProdNew> hotProdOrNews(String tenantId,String dateType,Boolean ifHot) {
public List<BusiProdNew> hotProdOrNews(String tenantId,String dateType,Boolean ifHot,String showPlat) {
Page<BusiProdNew> page = new Page<>(1, 10);
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.eq(BusiProdNew::getTenantId,tenantId)
.eq(BusiProdNew::getDataType,dateType)
.eq(BusiProdNew::getIfPublic,true)
.eq(BusiProdNew::getIfReco,ifHot)
.like(BusiProdNew::getShowPlat,showPlat)
.orderByDesc(BusiProdNew::getSort);
//查所有栏目
BusiCategory category = new BusiCategory();
@ -202,10 +203,11 @@ public class BusiProdNewServiceImpl extends ServiceImpl<BusiProdNewMapper,BusiPr
* @date 13:55 2025/7/9
**/
@Override
public IPage<BusiProdNew> searchTextAll(String tenantId, String text, Page<BusiProdNew> page) {
public IPage<BusiProdNew> searchTextAll(String tenantId, String text, Page<BusiProdNew> page,String showPlat) {
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.eq(BusiProdNew::getTenantId,tenantId)
.eq(BusiProdNew::getIfPublic,true)
.like(BusiProdNew::getShowPlat,showPlat)
.and(wq->wq
.like(BusiProdNew::getTitle,text)
.or().like(BusiProdNew::getDescription,text)

View File

@ -4,6 +4,16 @@
<el-form-item label="分类" prop="catgId">
<treeselect style="width: 200px" v-model="queryParams.catgId" :options="catgOptions" :normalizer="normalizer" :noResultsText="'暂无数据'" placeholder="选择分类" />
</el-form-item>
<el-form-item label="展示平台" prop="showPlat">
<el-select v-model="queryParams.showPlat" placeholder="请选择展示平台" clearable>
<el-option
v-for="dict in dict.type.show_plateform"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="新闻标题" prop="title">
<el-input
v-model="queryParams.title"
@ -75,6 +85,7 @@
</template>
</el-table-column>
<el-table-column label="新闻负责人" align="center" prop="leaderName" />
<el-table-column label="展示平台" align="center" prop="showPlat" />
<!-- <el-table-column label="产品简介" align="center" prop="description" />-->
<el-table-column width="100" label="排序" align="center" prop="sort">
<template slot="header" slot-scope="scope">
@ -190,7 +201,7 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "New",
dicts: ['sys_yes_no'],
dicts: ['sys_yes_no','show_plateform'],
components: { selectAllUser,selectProduct,randomProduct ,Treeselect},
data() {
return {

View File

@ -202,10 +202,21 @@
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="展示平台" prop="showPlat">
<el-checkbox-group v-model="showPlatList" @change="changeCheckBox">
<el-checkbox v-for="dict in dict.type.show_plateform" :label="dict.label" :value="dict.value"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="新闻内容">
<editor :key="showKeywords" v-model="form.content" :min-height="192"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-col>
</el-row>
@ -248,6 +259,7 @@ import SimilarityNew from './similarityNew'
export default {
name: 'newForm',
components: { SimilarityNew, Treeselect, selectPic , Hamburger , countTo},
dicts: ['show_plateform'],
data() {
return {
//--
@ -269,6 +281,7 @@ export default {
prodTitle: null,
prodKeyword: null,
prodDescription: null,
showPlat: '网站,App',
newsFrom: null,
publicDate: null,
mainPic: null,
@ -287,6 +300,8 @@ export default {
//
fileList: []
},
//
showPlatList:['网站','App'],
formSeo: {
title: '',
needUrl: true,
@ -327,6 +342,9 @@ export default {
],
description: [
{ required: true, message: '请输入新闻简介', trigger: 'blur' }
],
showPlat: [
{ required: true, message: '请选择展示平台', trigger: 'blur' }
]
},
rulesSeo:{
@ -358,6 +376,12 @@ export default {
}
},
methods: {
/**
* 选中展示平台
*/
changeCheckBox(value){
this.form.showPlat = value.join(",")
},
useProdName(){
this.formSeo.title = this.form.title
},
@ -471,6 +495,7 @@ export default {
getProdInfo(id, type) {
getProdNew(id).then(response => {
this.form = response.data
this.showPlatList = this.form.showPlat.split(',')
if (this.form.pics && this.form.pics.length > 0) {
this.canPicsNum = this.picsNum - this.form.pics.split(',').length
}

View File

@ -4,6 +4,16 @@
<el-form-item label="分类" prop="catgId">
<treeselect style="width: 200px" v-model="queryParams.catgId" :options="catgOptions" :normalizer="normalizer" :noResultsText="'暂无数据'" placeholder="选择分类" />
</el-form-item>
<el-form-item label="展示平台" prop="showPlat">
<el-select v-model="queryParams.showPlat" placeholder="请选择展示平台" clearable>
<el-option
v-for="dict in dict.type.show_plateform"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="产品名称" prop="title">
<el-input
v-model="queryParams.title"
@ -74,7 +84,8 @@
<image-preview :src="scope.row.mainPic" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="产品负责人" align="center" prop="leaderName" :min-width="200" />
<el-table-column label="产品负责人" align="center" prop="leaderName" :min-width="100" />
<el-table-column label="展示平台" align="center" prop="showPlat" />
<!-- <el-table-column label="产品简介" align="center" prop="description" />-->
<el-table-column width="100" label="排序" align="center" prop="sort">
<template slot="header" slot-scope="scope">
@ -190,7 +201,7 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "Prod",
dicts: ['sys_yes_no'],
dicts: ['sys_yes_no','show_plateform'],
components: { selectAllUser ,selectProduct,randomProduct,Treeselect},
data() {
return {

View File

@ -172,11 +172,20 @@
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="首页显示" prop="ifReco">
<el-form-item label="展示平台" prop="showPlat">
<el-checkbox-group v-model="showPlatList" @change="changeCheckBox">
<el-checkbox v-for="dict in dict.type.show_plateform" :label="dict.label" :value="dict.value"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="网站首页显示" prop="ifReco">
<template v-slot:label>
<span>首页显示</span>
<el-tooltip class="item" effect="dark" content="开启后将在首页优先显示"
<span>网站首页显示</span>
<el-tooltip class="item" effect="dark" content="开启后将在网站首页优先显示"
placement="bottom"
>
<i class="el-icon-question"></i>
@ -189,9 +198,13 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="产品内容">
<editor :key="showKeywords" v-model="form.content" :min-height="192"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-col>
</el-row>
@ -234,6 +247,7 @@ import SimilarityProduct from './similarityProduct'
export default {
name: 'prodForm',
components: { SimilarityProduct, Treeselect, selectPic, Hamburger , countTo},
dicts: ['show_plateform'],
data() {
return {
//--
@ -255,6 +269,7 @@ export default {
prodTitle: null,
prodKeyword: null,
prodDescription: null,
showPlat: '网站,App',
newsFrom: null,
mainPic: null,
pics: null,
@ -272,6 +287,8 @@ export default {
//
fileList: []
},
//
showPlatList:['网站','App'],
formSeo: {
title: '',
needUrl: true,
@ -306,6 +323,9 @@ export default {
],
description: [
{ required: true, message: '请输入产品简介', trigger: 'blur' }
],
showPlat: [
{ required: true, message: '请选择展示平台', trigger: 'blur' }
]
},
rulesSeo:{
@ -337,6 +357,12 @@ export default {
}
},
methods: {
/**
* 选中展示平台
*/
changeCheckBox(value){
this.form.showPlat = value.join(",")
},
useProdName(){
this.formSeo.title = this.form.title
},
@ -450,6 +476,7 @@ export default {
getProdInfo(id, type) {
getProdNew(id).then(response => {
this.form = response.data
this.showPlatList = this.form.showPlat.split(',')
if (this.form.pics && this.form.pics.length > 0) {
this.canPicsNum = this.picsNum - this.form.pics.split(',').length
}