diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java new file mode 100644 index 0000000..00c8b34 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java @@ -0,0 +1,138 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +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.vo.ProdNewVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +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.busi.domain.BusiProdNew; +import com.ruoyi.busi.service.IBusiProdNewService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +import static com.ruoyi.constant.DictConstants.FILE_TYPE_PRODUCT; + +/** + * 产品Controller + * + * @author vinjor-m + * @date 2025-06-25 + */ +@RestController +@RequestMapping("/busi/prod") +public class BusiProdController extends BaseController +{ + @Autowired + private IBusiProdNewService busiProdNewService; + @Autowired + private IBasePicsService basePicsService; + + /** + * 查询产品列表 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:list')") + @GetMapping("/list") + public AjaxResult list(BusiProdNew busiProdNew, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiProdNewService.queryListPage(busiProdNew,page); + return success(list); + } + + /** + * 导出产品列表 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:export')") + @Log(title = "产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiProdNew busiProdNew) + { + List list = busiProdNewService.list(); + ExcelUtil util = new ExcelUtil(BusiProdNew.class); + util.exportExcel(response, list, "产品、文章数据"); + } + + /** + * 获取产品详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiProdNewService.getById(id)); + } + + /** + * 获取产品表当前最大排序 + */ + @GetMapping(value = "/getMaxSort") + public AjaxResult getMaxSort(String tenantId) + { + return success(busiProdNewService.getMaxSort(tenantId)); + } + + /** + * 新增产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:add')") + @Log(title = "产品", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdNewVO prodNewVO){ + busiProdNewService.save(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_PRODUCT); + }); + } + return success(); + } + + /** + * 修改产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:edit')") + @Log(title = "产品", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdNewVO prodNewVO){ + busiProdNewService.updateById(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_PRODUCT); + }); + } + return success(); + } + + /** + * 删除产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:remove')") + @Log(title = "产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids){ + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiProdNewService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java new file mode 100644 index 0000000..171737f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java @@ -0,0 +1,84 @@ +package com.ruoyi.busi.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 产品、文章对象 dl_busi_prod_new + * + * @author vinjor-m + * @date 2025-06-25 + */ +@TableName("dl_busi_prod_new") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiProdNew extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 所属栏目id */ + @Excel(name = "所属栏目id") + private String catgId; + + /** 产品名称或文章标题 */ + @Excel(name = "产品名称或文章标题") + private String title; + + /** 页面title */ + @Excel(name = "页面title") + private String prodTitle; + + /** 页面keyword */ + @Excel(name = "页面keyword") + private String prodKeyword; + + /** 页面description */ + @Excel(name = "页面description") + private String prodDescription; + + /** 文章来源 */ + @Excel(name = "文章来源") + private String newsFrom; + + /** 产品主图或文章图片 */ + @Excel(name = "产品主图或文章图片") + private String mainPic; + + /** 产品图(多张) */ + @Excel(name = "产品图", readConverterExp = "多=张") + private String pics; + + /** 产品简介或文章简介(支持换行符) */ + @Excel(name = "产品简介或文章简介", readConverterExp = "支=持换行符") + private String description; + + /** 产品内容或文章内容(富文本) */ + private String content; + + /** 排序 */ + private Long sort; + + /** 是否首页推荐显示 */ + @Excel(name = "是否首页推荐显示") + private Integer ifReco; + + /** 是否发布(未发布的在草稿箱) */ + @Excel(name = "是否发布", readConverterExp = "未=发布的在草稿箱") + private Integer ifPublic; + + /** 站点唯一编码(租户id) */ + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java new file mode 100644 index 0000000..25fbc02 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java @@ -0,0 +1,24 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.vo.ProdNewVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 产品、文章Mapper接口 + * + * @author vinjor-m + * @date 2025-06-25 + */ +@Mapper +public interface BusiProdNewMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiProdNew entity, Page page); + + Long selectMaxSort(@Param("tenantId")String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java new file mode 100644 index 0000000..04363eb --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java @@ -0,0 +1,28 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.vo.ProdNewVO; + +/** + * 产品、文章Service接口 + * + * @author vinjor-m + * @date 2025-06-25 + */ +public interface IBusiProdNewService extends IService +{ + IPage queryListPage(BusiProdNew pageReqVO, Page page); + + /** + * 获取产品表当前最大排序 + * @author vinjor-M + * @date 16:15 2025/6/25 + * @param tenantId 站点id + * @return java.lang.Long + **/ + Long getMaxSort(String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java new file mode 100644 index 0000000..4a84ba6 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java @@ -0,0 +1,46 @@ +package com.ruoyi.busi.service.impl; + +import java.util.List; + +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiProdNewMapper; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.service.IBusiProdNewService; + +/** + * 产品、文章Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-25 + */ +@Service +public class BusiProdNewServiceImpl extends ServiceImpl implements IBusiProdNewService +{ + @Autowired + private BusiProdNewMapper busiProdNewMapper; + + @Override + public IPage queryListPage(BusiProdNew pageReqVO, Page page) { + return busiProdNewMapper.queryListPage(pageReqVO, page); + } + + /** + * 获取产品表当前最大排序 + * + * @param tenantId 站点id + * @return java.lang.Long + * @author vinjor-M + * @date 16:15 2025/6/25 + **/ + @Override + public Long getMaxSort(String tenantId) { + Long sort = busiProdNewMapper.selectMaxSort(tenantId); + return null==sort?1:sort+1; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java new file mode 100644 index 0000000..3403a2e --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java @@ -0,0 +1,32 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.base.domain.BasePics; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 产品、文章VO + * @author vinjor-M + * @date 14:49 2025/6/25 +**/ +@EqualsAndHashCode(callSuper = true) +@Data +public class ProdNewVO extends BusiProdNew { + + /** 所属栏目名称 */ + @Excel(name = "所属栏目名称") + private String catgName; + + /** 产品发布者 */ + @Excel(name = "产品发布者") + private String userName; + + /** + * 批量传的图片 + **/ + private List fileList; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java index 50e1060..b4f7814 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java @@ -12,9 +12,22 @@ import java.util.Locale; public class DictConstants { /** - * 博主类型字典key + * 图片所属分类字典-KEY */ - public static final String BLOGGER_TYPES_KEY ="dl_blogger_type"; + public static final String FILE_TYPE_KEY ="file_type"; + + /** + * 图片所属分类字典-产品 + */ + public static final String FILE_TYPE_PRODUCT ="product"; + /** + * 图片所属分类字典-新闻 + */ + public static final String FILE_TYPE_NEWS ="news"; + /** + * 图片所属分类字典-其他 + */ + public static final String FILE_TYPE_OTHER ="other"; /** diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java index f525007..feec9e8 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java @@ -5,9 +5,7 @@ package com.ruoyi.constant; * * @author ruoyi */ -public class StrConstants -{ - +public class StrConstants { } diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml new file mode 100644 index 0000000..766b22d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, + catg_id, + title, + prod_title, + prod_keyword, + prod_description, + news_from, + main_pic, + pics, + description, + content, + sort, + if_reco, + if_public, + tenant_id, + creator, + create_time, + updater, + update_time, + del_flag + from dl_busi_prod_new + + + + + \ No newline at end of file diff --git a/dl_vue/.env.development b/dl_vue/.env.development index 91debb8..4369277 100644 --- a/dl_vue/.env.development +++ b/dl_vue/.env.development @@ -1,10 +1,10 @@ # 页面标题 -VUE_APP_TITLE = 成事达运营平台 +VUE_APP_TITLE = 成事达管理平台 # 开发环境配置 ENV = 'development' -# 成事达运营平台/开发环境 +# 成事达管理平台/开发环境 VUE_APP_BASE_API = '/dev-api' # 路由懒加载 diff --git a/dl_vue/.env.staging b/dl_vue/.env.staging index ba3ccae..f4d8776 100644 --- a/dl_vue/.env.staging +++ b/dl_vue/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 成事达运营平台 +VUE_APP_TITLE = 成事达管理平台 BABEL_ENV = production @@ -8,5 +8,5 @@ NODE_ENV = production # 测试环境配置 ENV = 'staging' -# 成事达运营平台/测试环境 +# 成事达管理平台/测试环境 VUE_APP_BASE_API = '/stage-api' diff --git a/dl_vue/public/UEditor/ueditor.config.js b/dl_vue/public/UEditor/ueditor.config.js index 72f3809..39d7492 100644 --- a/dl_vue/public/UEditor/ueditor.config.js +++ b/dl_vue/public/UEditor/ueditor.config.js @@ -121,9 +121,9 @@ "insertimage", // 多图上传 "emotion", // 表情 "scrawl", // 涂鸦 - "insertvideo", // 视频 - "insertaudio", // 音频 - "attachment", // 附件 + // "insertvideo", // 视频 + // "insertaudio", // 音频 + // "attachment", // 附件 "insertframe", // 插入Iframe "insertcode", // 插入代码 "pagebreak", // 分页 @@ -261,7 +261,7 @@ //,theme:'default' //,themePath:URL +"themes/" - //,zIndex : 900 //编辑器层级的基数,默认是900 + ,zIndex : 900 //编辑器层级的基数,默认是900 //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 //,charset:"utf-8" diff --git a/dl_vue/src/App.vue b/dl_vue/src/App.vue index b92ea37..06cd695 100644 --- a/dl_vue/src/App.vue +++ b/dl_vue/src/App.vue @@ -25,4 +25,9 @@ export default { #app .theme-picker { display: none; } +/deep/.dl-flex-column { + display: flex; + justify-content: start; + align-items: center +} diff --git a/dl_vue/src/api/busi/prod.js b/dl_vue/src/api/busi/prod.js new file mode 100644 index 0000000..74f2aaf --- /dev/null +++ b/dl_vue/src/api/busi/prod.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询产品、文章列表 +export function listProdNew(query) { + return request({ + url: '/busi/prod/list', + method: 'get', + params: query + }) +} + +// 查询产品、文章列表 +export function getMaxSort(query) { + return request({ + url: '/busi/prod/getMaxSort', + method: 'get', + params: query + }) +} + +// 查询产品、文章详细 +export function getProdNew(id) { + return request({ + url: '/busi/prod/' + id, + method: 'get' + }) +} + +// 新增产品、文章 +export function addProdNew(data) { + return request({ + url: '/busi/prod', + method: 'post', + data: data + }) +} + +// 修改产品、文章 +export function updateProdNew(data) { + return request({ + url: '/busi/prod', + method: 'put', + data: data + }) +} + +// 删除产品、文章 +export function delProdNew(id) { + return request({ + url: '/busi/prod/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/assets/images/login_logo.png b/dl_vue/src/assets/images/login_logo.png new file mode 100644 index 0000000..21ecde5 Binary files /dev/null and b/dl_vue/src/assets/images/login_logo.png differ diff --git a/dl_vue/src/assets/images/loginleft.png b/dl_vue/src/assets/images/loginleft.png index 47399bc..70ff8b1 100644 Binary files a/dl_vue/src/assets/images/loginleft.png and b/dl_vue/src/assets/images/loginleft.png differ diff --git a/dl_vue/src/assets/images/x.png b/dl_vue/src/assets/images/x.png index 78b1c36..6f82ad0 100644 Binary files a/dl_vue/src/assets/images/x.png and b/dl_vue/src/assets/images/x.png differ diff --git a/dl_vue/src/components/Editor/index.vue b/dl_vue/src/components/Editor/index.vue index d89e226..78be4bd 100644 --- a/dl_vue/src/components/Editor/index.vue +++ b/dl_vue/src/components/Editor/index.vue @@ -38,7 +38,7 @@ export default { UEDITOR_HOME_URL: '/UEditor/', //**代码补充231218** UEDITOR_CORS_URL: '/UEditor/', - zIndex: 99999,//设置z轴顺序值,避免工具栏下拉组件被遮挡 + zIndex: 999,//设置z轴顺序值,避免工具栏下拉组件被遮挡 } } } diff --git a/dl_vue/src/router/index.js b/dl_vue/src/router/index.js index 71907b6..3f21f4a 100644 --- a/dl_vue/src/router/index.js +++ b/dl_vue/src/router/index.js @@ -87,6 +87,20 @@ export const constantRoutes = [ meta: { title: '个人中心', icon: 'user' } } ] + }, + { + path: '/product', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'prodForm', + component: () => import('@/views/busi/prod/prodForm'), + name: 'ProdForm', + meta: { title: '产品详情' } + } + ] } ] diff --git a/dl_vue/src/views/base/info/index.vue b/dl_vue/src/views/base/info/index.vue index e0fd21f..98766f9 100644 --- a/dl_vue/src/views/base/info/index.vue +++ b/dl_vue/src/views/base/info/index.vue @@ -29,9 +29,11 @@ -
+
- +
@@ -123,31 +125,31 @@ export default { // 表单校验 rules: { companyName: [ - { required: true, message: '请输入公司名称', trigger: 'blur' }, + { required: true, message: '请输入公司名称', trigger: 'blur' } ], tel: [ - { required: true, message: '请输入手机号码', trigger: 'blur' }, + { required: true, message: '请输入手机号码', trigger: 'blur' } ], email: [ { required: true, message: '请输入Email账号', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' } ], teams: [ - { required: true, message: '请输入Teams账号', trigger: 'blur' }, + { required: true, message: '请输入Teams账号', trigger: 'blur' } ], icon: [ - { required: true, message: '请上传站点icon', trigger: 'blur' }, + { required: true, message: '请上传站点icon', trigger: 'blur' } ], logo: [ - { required: true, message: '请上传站点logo', trigger: 'blur' }, + { required: true, message: '请上传站点logo', trigger: 'blur' } ], qrCode: [ - { required: true, message: '请上传站点二维码', trigger: 'blur' }, - ], + { required: true, message: '请上传站点二维码', trigger: 'blur' } + ] } } }, - onShow(){ + onShow() { this.getDataInfo() }, methods: { @@ -177,7 +179,11 @@ export default { } } }) - }, + } } } + + diff --git a/dl_vue/src/views/busi/prod/index.vue b/dl_vue/src/views/busi/prod/index.vue new file mode 100644 index 0000000..5bcedc5 --- /dev/null +++ b/dl_vue/src/views/busi/prod/index.vue @@ -0,0 +1,217 @@ + + + diff --git a/dl_vue/src/views/busi/prod/prodForm.vue b/dl_vue/src/views/busi/prod/prodForm.vue new file mode 100644 index 0000000..a680a3d --- /dev/null +++ b/dl_vue/src/views/busi/prod/prodForm.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/dl_vue/src/views/index.vue b/dl_vue/src/views/index.vue index 271db7f..9bcc212 100644 --- a/dl_vue/src/views/index.vue +++ b/dl_vue/src/views/index.vue @@ -1,6 +1,6 @@ diff --git a/dl_vue/src/views/login.vue b/dl_vue/src/views/login.vue index 63b1199..89213c3 100644 --- a/dl_vue/src/views/login.vue +++ b/dl_vue/src/views/login.vue @@ -2,11 +2,13 @@