内容bug修复

This commit is contained in:
xiao-fajia 2024-07-29 16:42:21 +08:00
parent 8b4a0d0009
commit a9481db8e5
26 changed files with 658 additions and 1382 deletions

View File

@ -5,10 +5,7 @@ import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Anonymous @Anonymous
@ -29,4 +26,14 @@ public class CMSContentAPI extends BaseController {
return success(contentService.selectCmsContentById(id)); return success(contentService.selectCmsContentById(id));
} }
/**
* 搜索
* @param query
* @return
*/
@GetMapping("/search")
public AjaxResult searchContent(@RequestParam("query") String query){
return success(contentService.searchContent(query));
}
} }

View File

@ -86,7 +86,6 @@ public class CmsContentController extends BaseController
@PostMapping @PostMapping
public AjaxResult add(@RequestBody CmsContent cmsContent) public AjaxResult add(@RequestBody CmsContent cmsContent)
{ {
System.out.println(cmsContent);
return toAjax(cmsContentService.insertCmsContent(cmsContent)); return toAjax(cmsContentService.insertCmsContent(cmsContent));
} }

View File

@ -1,20 +1,44 @@
package com.ruoyi.cms.core; package com.ruoyi.cms.core;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.cms.domain.CmsCategory; import com.ruoyi.cms.domain.CmsCategory;
import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.TreeSelect;
import lombok.Data;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* 新增NewTreeSelect类继承TreeSelect * 新增NewTreeSelect
* 增加构造方法使用TreeSelect
*/ */
public class NewTreeSelect extends TreeSelect { @Data
public class NewTreeSelect{
private static final long serialVersionUID = 1L;
/** 节点ID */
private Long id;
/** 节点名称 */
private String label;
/** 跳转路径 */
private String jumpUrl;
/** 子节点 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<NewTreeSelect> children;
public NewTreeSelect()
{
}
public NewTreeSelect(CmsCategory category) public NewTreeSelect(CmsCategory category)
{ {
super.setId(category.getId()); this.id = category.getId();
super.setLabel(category.getCategoryName()); this.label = category.getCategoryName();
super.setChildren(category.getChildren().stream().map(NewTreeSelect::new).collect(Collectors.toList())); this.jumpUrl = category.getCategoryUrl();
this.children = category.getChildren().stream().map(NewTreeSelect::new).collect(Collectors.toList());
} }
} }

View File

@ -54,11 +54,11 @@ public class HitRegistrationStudentInfo extends BaseEntity
/** 领队教师ID集合 */ /** 领队教师ID集合 */
@Excel(name = "领队教师ID集合") @Excel(name = "领队教师ID集合")
private List<String> leaderIds; private List<Long> leaderIds;
/** 指导老师ID集合 */ /** 指导老师ID集合 */
@Excel(name = "指导老师ID集合") @Excel(name = "指导老师ID集合")
private List<String> guideIds; private List<Long> guideIds;
/** 逻辑删除0未删除1真删除 */ /** 逻辑删除0未删除1真删除 */
private Integer delFlag; private Integer delFlag;

View File

@ -4,6 +4,7 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ruoyi.cms.core.NewTreeSelect;
import com.ruoyi.cms.domain.CmsCategory; import com.ruoyi.cms.domain.CmsCategory;
import com.ruoyi.cms.domain.CmsContent; import com.ruoyi.cms.domain.CmsContent;
import com.ruoyi.cms.domain.vo.CMSCategoryVo; import com.ruoyi.cms.domain.vo.CMSCategoryVo;
@ -83,7 +84,7 @@ public interface ICmsCategoryService extends IService<CmsCategory>
* @param category 栏目信息 * @param category 栏目信息
* @return 栏目树信息集合 * @return 栏目树信息集合
*/ */
public List<TreeSelect> selectCmsCategoryTreeList(CmsCategory category); public List<NewTreeSelect> selectCmsCategoryTreeList(CmsCategory category);
/** /**
* 构建前端所需要树结构 * 构建前端所需要树结构
@ -99,7 +100,7 @@ public interface ICmsCategoryService extends IService<CmsCategory>
* @param categorys 栏目列表 * @param categorys 栏目列表
* @return 下拉树结构列表 * @return 下拉树结构列表
*/ */
public List<TreeSelect> buildCmsCategoryTreeSelect(List<CmsCategory> categorys); public List<NewTreeSelect> buildCmsCategoryTreeSelect(List<CmsCategory> categorys);
/** /**
* 获取栏目下的子栏目及文章 * 获取栏目下的子栏目及文章

View File

@ -72,4 +72,11 @@ public interface ICmsContentService extends IService<CmsContent>
* @return * @return
*/ */
int changeContentByIds(Long[] ids, String username); int changeContentByIds(Long[] ids, String username);
/**
* 搜索
* @param query
* @return
*/
List<CmsContent> searchContent(String query);
} }

View File

@ -135,7 +135,7 @@ public class CmsCategoryServiceImpl extends ServiceImpl<CmsCategoryMapper, CmsCa
* @return 栏目树信息集合 * @return 栏目树信息集合
*/ */
@Override @Override
public List<TreeSelect> selectCmsCategoryTreeList(CmsCategory category) { public List<NewTreeSelect> selectCmsCategoryTreeList(CmsCategory category) {
List<CmsCategory> categorys = SpringUtils.getAopProxy(this).selectCmsCategoryList(category); List<CmsCategory> categorys = SpringUtils.getAopProxy(this).selectCmsCategoryList(category);
return buildCmsCategoryTreeSelect(categorys); return buildCmsCategoryTreeSelect(categorys);
} }
@ -170,7 +170,7 @@ public class CmsCategoryServiceImpl extends ServiceImpl<CmsCategoryMapper, CmsCa
* @return 下拉树结构列表 * @return 下拉树结构列表
*/ */
@Override @Override
public List<TreeSelect> buildCmsCategoryTreeSelect(List<CmsCategory> categorys) { public List<NewTreeSelect> buildCmsCategoryTreeSelect(List<CmsCategory> categorys) {
List<CmsCategory> categoryTrees = buildCmsCategoryTree(categorys); List<CmsCategory> categoryTrees = buildCmsCategoryTree(categorys);
return categoryTrees.stream().map(NewTreeSelect::new).collect(Collectors.toList()); return categoryTrees.stream().map(NewTreeSelect::new).collect(Collectors.toList());
} }

View File

@ -5,6 +5,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
@ -165,4 +166,20 @@ public class CmsContentServiceImpl extends ServiceImpl<CmsContentMapper, CmsCont
} }
return result; return result;
} }
/**
* 搜索
* @param query
* @return
*/
public List<CmsContent> searchContent(String query){
List<CmsContent> list = baseMapper.selectList(new QueryWrapper<CmsContent>()
.like("content_title", query)
.or()
.like("content_detail", query)
.or()
.like("summary", query)
);
return list;
}
} }

View File

@ -1,13 +1,10 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.service.ISysMenuService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
@ -23,6 +20,9 @@ import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 个人信息 业务处理 * 个人信息 业务处理
* *
@ -38,6 +38,9 @@ public class SysProfileController extends BaseController
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
@Autowired
private ISysMenuService menuService;
/** /**
* 个人信息 * 个人信息
*/ */
@ -134,4 +137,15 @@ public class SysProfileController extends BaseController
} }
return error("上传图片异常,请联系管理员"); return error("上传图片异常,请联系管理员");
} }
/**
* 获取当前用户的菜单
* @return
*/
@GetMapping("/shortcuts")
public AjaxResult getHomeShortcuts(){
List<SysMenu> sysMenus = menuService.selectMenuList(SecurityUtils.getLoginUser().getUserId());
List<SysMenu> menus = menuService.getHomeShortcuts(sysMenus);
return success(menus);
}
} }

View File

@ -5,57 +5,87 @@
<mapper namespace="com.ruoyi.cms.mapper.CmsContentMapper"> <mapper namespace="com.ruoyi.cms.mapper.CmsContentMapper">
<resultMap type="CmsContent" id="CmsContentResult"> <resultMap type="CmsContent" id="CmsContentResult">
<result property="id" column="id" /> <result property="id" column="id"/>
<result property="categoryId" column="category_id" /> <result property="categoryId" column="category_id"/>
<result property="contentType" column="content_type" /> <result property="contentType" column="content_type"/>
<result property="contentTitle" column="content_title" /> <result property="contentTitle" column="content_title"/>
<result property="contentImg" column="content_img" /> <result property="contentImg" column="content_img"/>
<result property="contentDetail" column="content_detail" /> <result property="contentDetail" column="content_detail"/>
<result property="source" column="source" /> <result property="source" column="source"/>
<result property="sourceUrl" column="source_url" /> <result property="sourceUrl" column="source_url"/>
<result property="original" column="original" /> <result property="original" column="original"/>
<result property="author" column="author" /> <result property="author" column="author"/>
<result property="editor" column="editor" /> <result property="editor" column="editor"/>
<result property="summary" column="summary" /> <result property="summary" column="summary"/>
<result property="status" column="status" /> <result property="status" column="status"/>
<result property="publishDate" column="publish_date" /> <result property="publishDate" column="publish_date"/>
<result property="offlineDate" column="offline_date" /> <result property="offlineDate" column="offline_date"/>
<result property="isAccessory" column="is_accessory" /> <result property="isAccessory" column="is_accessory"/>
<result property="accessoryUrl" column="accessory_url" javaType="java.util.List" typeHandler="com.ruoyi.system.handler.MysqlTypeHandler" /> <result property="accessoryUrl" column="accessory_url" javaType="java.util.List"
<result property="remark" column="remark" /> typeHandler="com.ruoyi.system.handler.MysqlTypeHandler"/>
<result property="delFlag" column="del_flag" /> <result property="remark" column="remark"/>
<result property="createTime" column="create_time" /> <result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by" /> <result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time" /> <result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time"/>
<result property="imageUrl" column="image_url" javaType="java.util.List" typeHandler="com.ruoyi.system.handler.MysqlTypeHandler"/> <result property="updateBy" column="update_by"/>
<result property="videoUrl" column="video_url" javaType="java.util.List" typeHandler="com.ruoyi.system.handler.MysqlTypeHandler"/> <result property="imageUrl" column="image_url" javaType="java.util.List"
typeHandler="com.ruoyi.system.handler.MysqlTypeHandler"/>
<result property="videoUrl" column="video_url" javaType="java.util.List"
typeHandler="com.ruoyi.system.handler.MysqlTypeHandler"/>
</resultMap> </resultMap>
<sql id="selectCmsContentVo"> <sql id="selectCmsContentVo">
select id, category_id, content_type,image_url, video_url, content_title, content_img, content_detail, source, source_url, original, author, editor, summary, status, publish_date, offline_date, is_accessory, accessory_url, remark, del_flag, create_time, create_by, update_time, update_by from cms_content select id,
category_id,
content_type,
image_url,
video_url,
content_title,
content_img,
content_detail,
source,
source_url,
original,
author,
editor,
summary,
status,
publish_date,
offline_date,
is_accessory,
accessory_url,
remark,
del_flag,
create_time,
create_by,
update_time,
update_by
from cms_content
</sql> </sql>
<select id="selectCmsContentList" parameterType="CmsContent" resultMap="CmsContentResult"> <select id="selectCmsContentList" parameterType="CmsContent" resultMap="CmsContentResult">
<include refid="selectCmsContentVo"/> <include refid="selectCmsContentVo"/>
<where> <where>
<if test="categoryId != null "> and category_id = #{categoryId}</if> <if test="categoryId != null ">and category_id = #{categoryId}</if>
<if test="contentType != null "> and content_type = #{contentType}</if> <if test="contentType != null ">and content_type = #{contentType}</if>
<if test="contentTitle != null and contentTitle != ''"> and content_title like concat('%', #{contentTitle}, '%')</if> <if test="contentTitle != null and contentTitle != ''">and content_title like concat('%', #{contentTitle},
<if test="contentImg != null and contentImg != ''"> and content_img = #{contentImg}</if> '%')
<if test="contentDetail != null and contentDetail != ''"> and content_detail = #{contentDetail}</if> </if>
<if test="source != null and source != ''"> and source = #{source}</if> <if test="contentImg != null and contentImg != ''">and content_img = #{contentImg}</if>
<if test="sourceUrl != null and sourceUrl != ''"> and source_url = #{sourceUrl}</if> <if test="contentDetail != null and contentDetail != ''">and content_detail = #{contentDetail}</if>
<if test="original != null "> and original = #{original}</if> <if test="source != null and source != ''">and source = #{source}</if>
<if test="author != null and author != ''"> and author = #{author}</if> <if test="sourceUrl != null and sourceUrl != ''">and source_url = #{sourceUrl}</if>
<if test="editor != null and editor != ''"> and editor = #{editor}</if> <if test="original != null ">and original = #{original}</if>
<if test="summary != null and summary != ''"> and summary = #{summary}</if> <if test="author != null and author != ''">and author = #{author}</if>
<if test="status != null "> and status = #{status}</if> <if test="editor != null and editor != ''">and editor = #{editor}</if>
<if test="publishDate != null "> and publish_date = #{publishDate}</if> <if test="summary != null and summary != ''">and summary = #{summary}</if>
<if test="offlineDate != null "> and offline_date = #{offlineDate}</if> <if test="status != null ">and status = #{status}</if>
<if test="isAccessory != null "> and is_accessory = #{isAccessory}</if> <if test="publishDate != null ">and publish_date = #{publishDate}</if>
<if test="accessoryUrl != null and accessoryUrl != ''"> and accessory_url = #{accessoryUrl}</if> <if test="offlineDate != null ">and offline_date = #{offlineDate}</if>
<if test="delFlag != null"> and del_flag = #{delFlag}</if> <if test="isAccessory != null ">and is_accessory = #{isAccessory}</if>
<if test="accessoryUrl != null and accessoryUrl != ''">and accessory_url = #{accessoryUrl}</if>
<if test="delFlag != null">and del_flag = #{delFlag}</if>
</where> </where>
order by create_time desc, update_time desc order by create_time desc, update_time desc
</select> </select>
@ -111,51 +141,59 @@
<if test="publishDate != null">#{publishDate},</if> <if test="publishDate != null">#{publishDate},</if>
<if test="offlineDate != null">#{offlineDate},</if> <if test="offlineDate != null">#{offlineDate},</if>
<if test="isAccessory != null and isAccessory != ''">#{isAccessory},</if> <if test="isAccessory != null and isAccessory != ''">#{isAccessory},</if>
<if test="accessoryUrl != null and accessoryUrl.size() != 0">#{accessoryUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> <if test="accessoryUrl != null and accessoryUrl.size() != 0">
#{accessoryUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
</if>
<if test="remark != null">#{remark},</if> <if test="remark != null">#{remark},</if>
<if test="delFlag != null">#{delFlag},</if> <if test="delFlag != null">#{delFlag},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>
<if test="imageUrl != null and imageUrl.size() != 0">#{imageUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> <if test="imageUrl != null and imageUrl.size() != 0">
<if test="videoUrl != null and videoUrl.size() != 0">#{videoUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> #{imageUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
</if>
<if test="videoUrl != null and videoUrl.size() != 0">
#{videoUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
</if>
</trim> </trim>
</insert> </insert>
<update id="updateCmsContent" parameterType="CmsContent"> <update id="updateCmsContent" parameterType="CmsContent">
update cms_content update cms_content
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
<if test="categoryId != null">category_id = #{categoryId},</if> category_id = #{categoryId},
<if test="contentType != null">content_type = #{contentType},</if> content_type = #{contentType},
<if test="contentTitle != null and contentTitle != ''">content_title = #{contentTitle},</if> content_title = #{contentTitle},
<if test="contentImg != null and contentImg != ''">content_img = #{contentImg},</if> content_img = #{contentImg},
<if test="contentDetail != null and contentDetail != '' ">content_detail = #{contentDetail},</if> content_detail = #{contentDetail},
<if test="source != null and source != ''">source = #{source},</if> source = #{source},
<if test="sourceUrl != null and sourceUrl != ''">source_url = #{sourceUrl},</if> source_url = #{sourceUrl},
<if test="original != null and original != ''">original = #{original},</if> original = #{original},
<if test="author != null and author != ''">author = #{author},</if> author = #{author},
<if test="editor != null and editor != ''">editor = #{editor},</if> editor = #{editor},
<if test="summary != null and summary != ''">summary = #{summary},</if> summary = #{summary},
<if test="status != null and status != ''">status = #{status},</if> status = #{status},
<if test="publishDate != null">publish_date = #{publishDate},</if> publish_date = #{publishDate},
<if test="offlineDate != null">offline_date = #{offlineDate},</if> offline_date = #{offlineDate},
<if test="isAccessory != null and isAccessory != ''">is_accessory = #{isAccessory},</if> is_accessory = #{isAccessory},
<if test="accessoryUrl != null and accessoryUrl.size() != 0">accessory_url = #{accessoryUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> accessory_url = #{accessoryUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
<if test="remark != null">remark = #{remark},</if> remark = #{remark},
<if test="delFlag != null">del_flag = #{delFlag},</if> del_flag = #{delFlag},
<if test="createTime != null">create_time = #{createTime},</if> create_time = #{createTime},
<if test="createBy != null">create_by = #{createBy},</if> create_by = #{createBy},
<if test="updateTime != null">update_time = #{updateTime},</if> update_time = #{updateTime},
<if test="updateBy != null">update_by = #{updateBy},</if> update_by = #{updateBy},
<if test="imageUrl != null and imageUrl.size() != 0">image_url = #{imageUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> image_url = #{imageUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
<if test="videoUrl != null and videoUrl.size() != 0">video_url = #{videoUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},</if> video_url = #{videoUrl,jdbcType=OTHER,typeHandler=com.ruoyi.system.handler.MysqlTypeHandler},
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>
<delete id="deleteCmsContentById" parameterType="Long"> <delete id="deleteCmsContentById" parameterType="Long">
delete from cms_content where id = #{id} delete
from cms_content
where id = #{id}
</delete> </delete>
<delete id="deleteCmsContentByIds" parameterType="String"> <delete id="deleteCmsContentByIds" parameterType="String">

View File

@ -33,6 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="parentId != null "> and parent_id = #{parentId}</if> <if test="parentId != null "> and parent_id = #{parentId}</if>
<if test="isFrame != null "> and is_frame = #{isFrame}</if> <if test="isFrame != null "> and is_frame = #{isFrame}</if>
<if test="isDisable != null "> and is_disable = #{isDisable}</if> <if test="isDisable != null "> and is_disable = #{isDisable}</if>
and del_flag = 0
</where> </where>
order by parent_id, category_sort order by parent_id, category_sort
</select> </select>

View File

@ -141,4 +141,6 @@ public interface ISysMenuService
* @return 结果 * @return 结果
*/ */
public boolean checkMenuNameUnique(SysMenu menu); public boolean checkMenuNameUnique(SysMenu menu);
List<SysMenu> getHomeShortcuts(List<SysMenu> sysMenus);
} }

View File

@ -1,13 +1,8 @@
package com.ruoyi.system.service.impl; package com.ruoyi.system.service.impl;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
@ -27,12 +22,11 @@ import com.ruoyi.system.service.ISysMenuService;
/** /**
* 菜单 业务层处理 * 菜单 业务层处理
* *
* @author ruoyi * @author ruoyi
*/ */
@Service @Service
public class SysMenuServiceImpl implements ISysMenuService public class SysMenuServiceImpl implements ISysMenuService {
{
public static final String PREMISSION_STRING = "perms[\"{0}\"]"; public static final String PREMISSION_STRING = "perms[\"{0}\"]";
@Autowired @Autowired
@ -46,33 +40,28 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 根据用户查询系统菜单列表 * 根据用户查询系统菜单列表
* *
* @param userId 用户ID * @param userId 用户ID
* @return 菜单列表 * @return 菜单列表
*/ */
@Override @Override
public List<SysMenu> selectMenuList(Long userId) public List<SysMenu> selectMenuList(Long userId) {
{
return selectMenuList(new SysMenu(), userId); return selectMenuList(new SysMenu(), userId);
} }
/** /**
* 查询系统菜单列表 * 查询系统菜单列表
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 菜单列表 * @return 菜单列表
*/ */
@Override @Override
public List<SysMenu> selectMenuList(SysMenu menu, Long userId) public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
{
List<SysMenu> menuList = null; List<SysMenu> menuList = null;
// 管理员显示所有菜单信息 // 管理员显示所有菜单信息
if (SysUser.isAdmin(userId)) if (SysUser.isAdmin(userId)) {
{
menuList = menuMapper.selectMenuList(menu); menuList = menuMapper.selectMenuList(menu);
} } else {
else
{
menu.getParams().put("userId", userId); menu.getParams().put("userId", userId);
menuList = menuMapper.selectMenuListByUserId(menu); menuList = menuMapper.selectMenuListByUserId(menu);
} }
@ -81,19 +70,16 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 根据用户ID查询权限 * 根据用户ID查询权限
* *
* @param userId 用户ID * @param userId 用户ID
* @return 权限列表 * @return 权限列表
*/ */
@Override @Override
public Set<String> selectMenuPermsByUserId(Long userId) public Set<String> selectMenuPermsByUserId(Long userId) {
{
List<String> perms = menuMapper.selectMenuPermsByUserId(userId); List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
Set<String> permsSet = new HashSet<>(); Set<String> permsSet = new HashSet<>();
for (String perm : perms) for (String perm : perms) {
{ if (StringUtils.isNotEmpty(perm)) {
if (StringUtils.isNotEmpty(perm))
{
permsSet.addAll(Arrays.asList(perm.trim().split(","))); permsSet.addAll(Arrays.asList(perm.trim().split(",")));
} }
} }
@ -102,19 +88,16 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 根据角色ID查询权限 * 根据角色ID查询权限
* *
* @param roleId 角色ID * @param roleId 角色ID
* @return 权限列表 * @return 权限列表
*/ */
@Override @Override
public Set<String> selectMenuPermsByRoleId(Long roleId) public Set<String> selectMenuPermsByRoleId(Long roleId) {
{
List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId); List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
Set<String> permsSet = new HashSet<>(); Set<String> permsSet = new HashSet<>();
for (String perm : perms) for (String perm : perms) {
{ if (StringUtils.isNotEmpty(perm)) {
if (StringUtils.isNotEmpty(perm))
{
permsSet.addAll(Arrays.asList(perm.trim().split(","))); permsSet.addAll(Arrays.asList(perm.trim().split(",")));
} }
} }
@ -123,20 +106,16 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 根据用户ID查询菜单 * 根据用户ID查询菜单
* *
* @param userId 用户名称 * @param userId 用户名称
* @return 菜单列表 * @return 菜单列表
*/ */
@Override @Override
public List<SysMenu> selectMenuTreeByUserId(Long userId) public List<SysMenu> selectMenuTreeByUserId(Long userId) {
{
List<SysMenu> menus = null; List<SysMenu> menus = null;
if (SecurityUtils.isAdmin(userId)) if (SecurityUtils.isAdmin(userId)) {
{
menus = menuMapper.selectMenuTreeAll(); menus = menuMapper.selectMenuTreeAll();
} } else {
else
{
menus = menuMapper.selectMenuTreeByUserId(userId); menus = menuMapper.selectMenuTreeByUserId(userId);
} }
return getChildPerms(menus, 0); return getChildPerms(menus, 0);
@ -144,29 +123,26 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 根据角色ID查询菜单树信息 * 根据角色ID查询菜单树信息
* *
* @param roleId 角色ID * @param roleId 角色ID
* @return 选中菜单列表 * @return 选中菜单列表
*/ */
@Override @Override
public List<Long> selectMenuListByRoleId(Long roleId) public List<Long> selectMenuListByRoleId(Long roleId) {
{
SysRole role = roleMapper.selectRoleById(roleId); SysRole role = roleMapper.selectRoleById(roleId);
return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
} }
/** /**
* 构建前端路由所需要的菜单 * 构建前端路由所需要的菜单
* *
* @param menus 菜单列表 * @param menus 菜单列表
* @return 路由列表 * @return 路由列表
*/ */
@Override @Override
public List<RouterVo> buildMenus(List<SysMenu> menus) public List<RouterVo> buildMenus(List<SysMenu> menus) {
{
List<RouterVo> routers = new LinkedList<RouterVo>(); List<RouterVo> routers = new LinkedList<RouterVo>();
for (SysMenu menu : menus) for (SysMenu menu : menus) {
{
RouterVo router = new RouterVo(); RouterVo router = new RouterVo();
router.setHidden("1".equals(menu.getVisible())); router.setHidden("1".equals(menu.getVisible()));
router.setName(getRouteName(menu)); router.setName(getRouteName(menu));
@ -175,14 +151,11 @@ public class SysMenuServiceImpl implements ISysMenuService
router.setQuery(menu.getQuery()); router.setQuery(menu.getQuery());
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
List<SysMenu> cMenus = menu.getChildren(); List<SysMenu> cMenus = menu.getChildren();
if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
{
router.setAlwaysShow(true); router.setAlwaysShow(true);
router.setRedirect("noRedirect"); router.setRedirect("noRedirect");
router.setChildren(buildMenus(cMenus)); router.setChildren(buildMenus(cMenus));
} } else if (isMenuFrame(menu)) {
else if (isMenuFrame(menu))
{
router.setMeta(null); router.setMeta(null);
List<RouterVo> childrenList = new ArrayList<RouterVo>(); List<RouterVo> childrenList = new ArrayList<RouterVo>();
RouterVo children = new RouterVo(); RouterVo children = new RouterVo();
@ -193,9 +166,7 @@ public class SysMenuServiceImpl implements ISysMenuService
children.setQuery(menu.getQuery()); children.setQuery(menu.getQuery());
childrenList.add(children); childrenList.add(children);
router.setChildren(childrenList); router.setChildren(childrenList);
} } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
{
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
router.setPath("/"); router.setPath("/");
List<RouterVo> childrenList = new ArrayList<RouterVo>(); List<RouterVo> childrenList = new ArrayList<RouterVo>();
@ -215,27 +186,23 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 构建前端所需要树结构 * 构建前端所需要树结构
* *
* @param menus 菜单列表 * @param menus 菜单列表
* @return 树结构列表 * @return 树结构列表
*/ */
@Override @Override
public List<SysMenu> buildMenuTree(List<SysMenu> menus) public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
{
List<SysMenu> returnList = new ArrayList<SysMenu>(); List<SysMenu> returnList = new ArrayList<SysMenu>();
List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList());
for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();) for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext(); ) {
{
SysMenu menu = (SysMenu) iterator.next(); SysMenu menu = (SysMenu) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点 // 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(menu.getParentId())) if (!tempList.contains(menu.getParentId())) {
{
recursionFn(menus, menu); recursionFn(menus, menu);
returnList.add(menu); returnList.add(menu);
} }
} }
if (returnList.isEmpty()) if (returnList.isEmpty()) {
{
returnList = menus; returnList = menus;
} }
return returnList; return returnList;
@ -243,104 +210,95 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 构建前端所需要下拉树结构 * 构建前端所需要下拉树结构
* *
* @param menus 菜单列表 * @param menus 菜单列表
* @return 下拉树结构列表 * @return 下拉树结构列表
*/ */
@Override @Override
public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
{
List<SysMenu> menuTrees = buildMenuTree(menus); List<SysMenu> menuTrees = buildMenuTree(menus);
return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
} }
/** /**
* 根据菜单ID查询信息 * 根据菜单ID查询信息
* *
* @param menuId 菜单ID * @param menuId 菜单ID
* @return 菜单信息 * @return 菜单信息
*/ */
@Override @Override
public SysMenu selectMenuById(Long menuId) public SysMenu selectMenuById(Long menuId) {
{
return menuMapper.selectMenuById(menuId); return menuMapper.selectMenuById(menuId);
} }
/** /**
* 是否存在菜单子节点 * 是否存在菜单子节点
* *
* @param menuId 菜单ID * @param menuId 菜单ID
* @return 结果 * @return 结果
*/ */
@Override @Override
public boolean hasChildByMenuId(Long menuId) public boolean hasChildByMenuId(Long menuId) {
{
int result = menuMapper.hasChildByMenuId(menuId); int result = menuMapper.hasChildByMenuId(menuId);
return result > 0; return result > 0;
} }
/** /**
* 查询菜单使用数量 * 查询菜单使用数量
* *
* @param menuId 菜单ID * @param menuId 菜单ID
* @return 结果 * @return 结果
*/ */
@Override @Override
public boolean checkMenuExistRole(Long menuId) public boolean checkMenuExistRole(Long menuId) {
{
int result = roleMenuMapper.checkMenuExistRole(menuId); int result = roleMenuMapper.checkMenuExistRole(menuId);
return result > 0; return result > 0;
} }
/** /**
* 新增保存菜单信息 * 新增保存菜单信息
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertMenu(SysMenu menu) public int insertMenu(SysMenu menu) {
{
return menuMapper.insertMenu(menu); return menuMapper.insertMenu(menu);
} }
/** /**
* 修改保存菜单信息 * 修改保存菜单信息
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateMenu(SysMenu menu) public int updateMenu(SysMenu menu) {
{
return menuMapper.updateMenu(menu); return menuMapper.updateMenu(menu);
} }
/** /**
* 删除菜单管理信息 * 删除菜单管理信息
* *
* @param menuId 菜单ID * @param menuId 菜单ID
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteMenuById(Long menuId) public int deleteMenuById(Long menuId) {
{
return menuMapper.deleteMenuById(menuId); return menuMapper.deleteMenuById(menuId);
} }
/** /**
* 校验菜单名称是否唯一 * 校验菜单名称是否唯一
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
@Override @Override
public boolean checkMenuNameUnique(SysMenu menu) public boolean checkMenuNameUnique(SysMenu menu) {
{
Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
{
return UserConstants.NOT_UNIQUE; return UserConstants.NOT_UNIQUE;
} }
return UserConstants.UNIQUE; return UserConstants.UNIQUE;
@ -348,15 +306,13 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 获取路由名称 * 获取路由名称
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 路由名称 * @return 路由名称
*/ */
public String getRouteName(SysMenu menu) public String getRouteName(SysMenu menu) {
{
// 非外链并且是一级目录类型为目录 // 非外链并且是一级目录类型为目录
if (isMenuFrame(menu)) if (isMenuFrame(menu)) {
{
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
return getRouteName(menu.getRouteName(), menu.getPath()); return getRouteName(menu.getRouteName(), menu.getPath());
@ -364,40 +320,35 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 获取路由名称如没有配置路由名称则取路由地址 * 获取路由名称如没有配置路由名称则取路由地址
* *
* @param routerName 路由名称 * @param routerName 路由名称
* @param path 路由地址 * @param path 路由地址
* @return 路由名称驼峰格式 * @return 路由名称驼峰格式
*/ */
public String getRouteName(String name, String path) public String getRouteName(String name, String path) {
{
String routerName = StringUtils.isNotEmpty(name) ? name : path; String routerName = StringUtils.isNotEmpty(name) ? name : path;
return StringUtils.capitalize(routerName); return StringUtils.capitalize(routerName);
} }
/** /**
* 获取路由地址 * 获取路由地址
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 路由地址 * @return 路由地址
*/ */
public String getRouterPath(SysMenu menu) public String getRouterPath(SysMenu menu) {
{
String routerPath = menu.getPath(); String routerPath = menu.getPath();
// 内链打开外网方式 // 内链打开外网方式
if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
{
routerPath = innerLinkReplaceEach(routerPath); routerPath = innerLinkReplaceEach(routerPath);
} }
// 非外链并且是一级目录类型为目录 // 非外链并且是一级目录类型为目录
if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
&& UserConstants.NO_FRAME.equals(menu.getIsFrame())) && UserConstants.NO_FRAME.equals(menu.getIsFrame())) {
{
routerPath = "/" + menu.getPath(); routerPath = "/" + menu.getPath();
} }
// 非外链并且是一级目录类型为菜单 // 非外链并且是一级目录类型为菜单
else if (isMenuFrame(menu)) else if (isMenuFrame(menu)) {
{
routerPath = "/"; routerPath = "/";
} }
return routerPath; return routerPath;
@ -405,23 +356,17 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 获取组件信息 * 获取组件信息
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 组件信息 * @return 组件信息
*/ */
public String getComponent(SysMenu menu) public String getComponent(SysMenu menu) {
{
String component = UserConstants.LAYOUT; String component = UserConstants.LAYOUT;
if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
{
component = menu.getComponent(); component = menu.getComponent();
} } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu))
{
component = UserConstants.INNER_LINK; component = UserConstants.INNER_LINK;
} } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) {
else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu))
{
component = UserConstants.PARENT_VIEW; component = UserConstants.PARENT_VIEW;
} }
return component; return component;
@ -429,54 +374,48 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 是否为菜单内部跳转 * 是否为菜单内部跳转
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
public boolean isMenuFrame(SysMenu menu) public boolean isMenuFrame(SysMenu menu) {
{
return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
&& menu.getIsFrame().equals(UserConstants.NO_FRAME); && menu.getIsFrame().equals(UserConstants.NO_FRAME);
} }
/** /**
* 是否为内链组件 * 是否为内链组件
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
public boolean isInnerLink(SysMenu menu) public boolean isInnerLink(SysMenu menu) {
{
return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath());
} }
/** /**
* 是否为parent_view组件 * 是否为parent_view组件
* *
* @param menu 菜单信息 * @param menu 菜单信息
* @return 结果 * @return 结果
*/ */
public boolean isParentView(SysMenu menu) public boolean isParentView(SysMenu menu) {
{
return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
} }
/** /**
* 根据父节点的ID获取所有子节点 * 根据父节点的ID获取所有子节点
* *
* @param list 分类表 * @param list 分类表
* @param parentId 传入的父节点ID * @param parentId 传入的父节点ID
* @return String * @return String
*/ */
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
{
List<SysMenu> returnList = new ArrayList<SysMenu>(); List<SysMenu> returnList = new ArrayList<SysMenu>();
for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();) for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
{
SysMenu t = (SysMenu) iterator.next(); SysMenu t = (SysMenu) iterator.next();
// 根据传入的某个父节点ID,遍历该父节点的所有子节点 // 根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId) if (t.getParentId() == parentId) {
{
recursionFn(list, t); recursionFn(list, t);
returnList.add(t); returnList.add(t);
} }
@ -486,19 +425,16 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 递归列表 * 递归列表
* *
* @param list 分类表 * @param list 分类表
* @param t 子节点 * @param t 子节点
*/ */
private void recursionFn(List<SysMenu> list, SysMenu t) private void recursionFn(List<SysMenu> list, SysMenu t) {
{
// 得到子节点列表 // 得到子节点列表
List<SysMenu> childList = getChildList(list, t); List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList); t.setChildren(childList);
for (SysMenu tChild : childList) for (SysMenu tChild : childList) {
{ if (hasChild(list, tChild)) {
if (hasChild(list, tChild))
{
recursionFn(list, tChild); recursionFn(list, tChild);
} }
} }
@ -507,15 +443,12 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 得到子节点列表 * 得到子节点列表
*/ */
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
{
List<SysMenu> tlist = new ArrayList<SysMenu>(); List<SysMenu> tlist = new ArrayList<SysMenu>();
Iterator<SysMenu> it = list.iterator(); Iterator<SysMenu> it = list.iterator();
while (it.hasNext()) while (it.hasNext()) {
{
SysMenu n = (SysMenu) it.next(); SysMenu n = (SysMenu) it.next();
if (n.getParentId().longValue() == t.getMenuId().longValue()) if (n.getParentId().longValue() == t.getMenuId().longValue()) {
{
tlist.add(n); tlist.add(n);
} }
} }
@ -525,19 +458,43 @@ public class SysMenuServiceImpl implements ISysMenuService
/** /**
* 判断是否有子节点 * 判断是否有子节点
*/ */
private boolean hasChild(List<SysMenu> list, SysMenu t) private boolean hasChild(List<SysMenu> list, SysMenu t) {
{
return getChildList(list, t).size() > 0; return getChildList(list, t).size() > 0;
} }
/** /**
* 内链域名特殊字符替换 * 内链域名特殊字符替换
* *
* @return 替换后的内链域名 * @return 替换后的内链域名
*/ */
public String innerLinkReplaceEach(String path) public String innerLinkReplaceEach(String path) {
{ return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"},
return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":" }, new String[]{"", "", "", "/", "/"});
new String[] { "", "", "", "/", "/" }); }
/**
* 获取当前用户的菜单
*
* @return
*/
@Override
public List<SysMenu> getHomeShortcuts(List<SysMenu> sysMenus) {
// 取出所有非按钮的
List<SysMenu> result = sysMenus.stream()
.filter(item -> !item.getMenuType().equals("F"))
.filter(item -> item.getVisible().equals("0"))
.collect(Collectors.toList());
// 取出所有一级菜单转成mapid为keypath为value
Map<Long, String> parent = result.stream()
.filter(item -> item.getMenuType().equals("M"))
.collect(Collectors.toMap(SysMenu::getMenuId, SysMenu::getPath));
// 取出所有二级菜单拼接path
List<SysMenu> menus = result.stream()
.filter(item -> item.getMenuType().equals("C"))
.map(item -> {
item.setPath(parent.get(item.getParentId()) + "/" + item.getPath());
return item;
}).collect(Collectors.toList());
return menus;
} }
} }

View File

@ -1,11 +1,12 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 若依管理系统 VUE_APP_TITLE = 后台管理系统
# 开发环境配置 # 开发环境配置
ENV = 'development' ENV = 'development'
# 若依管理系统/开发环境 # 若依管理系统/开发环境
VUE_APP_BASE_API = 'https://f382b38516.zicp.fun' # VUE_APP_BASE_API = 'https://f382b38516.zicp.fun'
VUE_APP_BASE_API = 'http://localhost:8080'
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true

View File

@ -134,3 +134,19 @@ export function deptTreeSelect() {
method: 'get' method: 'get'
}) })
} }
// 获取用户信息
export function getHomeUserInfo() {
return request({
url: "/system/user/profile",
method: "get"
})
}
// 获取当前用户的菜单信息
export function getHomeShortcuts() {
return request({
url: "/system/user/profile/shortcuts",
method: "get"
})
}

View File

@ -8,7 +8,7 @@
filterable filterable
default-first-option default-first-option
remote remote
placeholder="Search" placeholder="搜索"
class="header-search-select" class="header-search-select"
@change="change" @change="change"
> >

View File

@ -9,19 +9,19 @@
<template v-if="device!=='mobile'"> <template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item" /> <search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">-->
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> <!-- <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
</el-tooltip> <!-- </el-tooltip>-->
<el-tooltip content="文档地址" effect="dark" placement="bottom"> <!-- <el-tooltip content="文档地址" effect="dark" placement="bottom">-->
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> <!-- <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
</el-tooltip> <!-- </el-tooltip>-->
<screenfull id="screenfull" class="right-menu-item hover-effect" /> <!-- <screenfull id="screenfull" class="right-menu-item hover-effect" />-->
<el-tooltip content="布局大小" effect="dark" placement="bottom"> <!-- <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
<size-select id="size-select" class="right-menu-item hover-effect" /> <!-- <size-select id="size-select" class="right-menu-item hover-effect" />-->
</el-tooltip> <!-- </el-tooltip>-->
</template> </template>
@ -34,9 +34,9 @@
<router-link to="/user/profile"> <router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item> <el-dropdown-item>个人中心</el-dropdown-item>
</router-link> </router-link>
<el-dropdown-item @click.native="setting = true"> <!-- <el-dropdown-item @click.native="setting = true">-->
<span>布局设置</span> <!-- <span>布局设置</span>-->
</el-dropdown-item> <!-- </el-dropdown-item>-->
<el-dropdown-item divided @click.native="logout"> <el-dropdown-item divided @click.native="logout">
<span>退出登录</span> <span>退出登录</span>
</el-dropdown-item> </el-dropdown-item>

View File

@ -1,14 +1,18 @@
<template> <template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> <div class="sidebar-logo-container" :class="{'collapse':collapse}"
:style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
<transition name="sidebarLogoFade"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <router-link key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" /> <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> </router-link>
</router-link> <!-- <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">-->
<router-link v-else key="expand" class="sidebar-logo-link" to="/"> <!-- <img v-if="logo" :src="logo" class="sidebar-logo" />-->
<img v-if="logo" :src="logo" class="sidebar-logo" /> <!-- <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>-->
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> <!-- </router-link>-->
</router-link> <!-- <router-link v-else key="expand" class="sidebar-logo-link" to="/">-->
<!-- <img v-if="logo" :src="logo" class="sidebar-logo" />-->
<!-- <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>-->
<!-- </router-link>-->
</transition> </transition>
</div> </div>
</template> </template>

View File

@ -3,7 +3,7 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<div class="grid-btn-bar bg-purple-white"> <div class="grid-btn-bar bg-purple-white">
<el-button plain type="success" size="mini" icon="el-icon-edit" @click="handleSave">保存</el-button> <el-button plain type="success" size="mini" icon="el-icon-edit" @click="handlerSaveBefore">保存</el-button>
<el-button plain type="primary" size="mini" icon="el-icon-s-promotion" @click="handlePublish">发布</el-button> <el-button plain type="primary" size="mini" icon="el-icon-s-promotion" @click="handlePublish">发布</el-button>
</div> </div>
</el-col> </el-col>
@ -238,28 +238,33 @@ export default {
// //
handlePublish() { handlePublish() {
this.form.status = "1" this.form.status = "1"
this.form.publishDate = this.formatTimer(new Date())
this.handleSave();
},
//
handlerSaveBefore(){
this.form.status = this.form.id !== null ? "3" : "0"
this.handleSave(); this.handleSave();
}, },
// //
handleSave() { handleSave() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
this.$modal.loading("正在" + (this.form.status == "0" ? "保存" : "发布") + "内容,请稍候..."); this.$modal.loading("正在" + (this.form.status !== "1" ? "保存" : "发布") + "内容,请稍候...");
// ifelse // ifelse
if (this.form.id != null) { if (this.form.id !== null) {
this.form.status = "3"
this.changeUrl() this.changeUrl()
updateContent(this.form).then(res => { updateContent(this.form).then(res => {
if (res.code == 200) { if (res.code === 200) {
this.$modal.msgSuccess(this.form.status == "0" ? "保存成功" : "发布成功"); this.$modal.msgSuccess(this.form.status !== "1" ? "保存成功" : "发布成功");
this.reset() this.reset()
} }
}) })
} else { } else {
this.changeUrl() this.changeUrl()
addContent(this.form).then(res => { addContent(this.form).then(res => {
if (res.code == 200) { if (res.code === 200) {
this.$modal.msgSuccess(this.form.status == "0" ? "保存成功" : "发布成功"); this.$modal.msgSuccess(this.form.status !== "1" ? "保存成功" : "发布成功");
this.reset() this.reset()
} }
}) })
@ -290,6 +295,21 @@ export default {
this.form.videoUrl = this.StrToArr(this.form.videoUrl) this.form.videoUrl = this.StrToArr(this.form.videoUrl)
} }
}, },
formatTimer: function(value) {
let date = new Date(value);
let y = date.getFullYear();
let MM = date.getMonth() + 1;
MM = MM < 10 ? "0" + MM : MM;
let d = date.getDate();
d = d < 10 ? "0" + d : d;
let h = date.getHours();
h = h < 10 ? "0" + h : h;
let m = date.getMinutes();
m = m < 10 ? "0" + m : m;
let s = date.getSeconds();
s = s < 10 ? "0" + s : s;
return y + "-" + MM + "-" + d + " " + h + ":" + m;
}
} }
} }
</script> </script>

View File

@ -0,0 +1,68 @@
<!--<template>-->
<!-- <div class="dashboard-container">-->
<!-- <el-card shadow="hover" class="mb10">-->
<!-- <div slot="header" class="clearfix">-->
<!-- <span>应用信息</span>-->
<!-- </div>-->
<!--&lt;!&ndash; <div class="el-table el-table&#45;&#45;enable-row-hover el-table&#45;&#45;medium">&ndash;&gt;-->
<!--&lt;!&ndash; <table cellspacing="0" style="width: 100%;">&ndash;&gt;-->
<!--&lt;!&ndash; <tbody>&ndash;&gt;-->
<!--&lt;!&ndash; <tr>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('Monitor.Server.AppName') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell">{{ serverInfo.app.name }} [ {{ serverInfo.app.alias }} ] </div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('Monitor.Server.AppVersion') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell">{{ serverInfo.app.version }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; </tr>&ndash;&gt;-->
<!--&lt;!&ndash; <tr>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('Monitor.Server.JVMStartTime') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell">{{ serverInfo.startTime }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('Monitor.Server.JVMRunTime') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell">{{ serverInfo.runTime }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; </tr>&ndash;&gt;-->
<!--&lt;!&ndash; <tr>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('CMS.Dashboard.PublishStrategy') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf" colspan="3"><div class="cell">{{ config.publishStrategy }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; </tr>&ndash;&gt;-->
<!--&lt;!&ndash; <tr>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf"><div class="cell attrname">{{ $t('CMS.Dashboard.ResourceRoot') }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; <td class="el-table__cell is-leaf" colspan="3"><div class="cell">{{ config.resourceRoot }}</div></td>&ndash;&gt;-->
<!--&lt;!&ndash; </tr>&ndash;&gt;-->
<!--&lt;!&ndash; </tbody>&ndash;&gt;-->
<!--&lt;!&ndash; </table>&ndash;&gt;-->
<!--&lt;!&ndash; </div>&ndash;&gt;-->
<!-- </el-card>-->
<!-- </div>-->
<!--</template>-->
<!--<script>-->
<!--import { getDashboardServerInfo } from "@/api/monitor/server";-->
<!--import { getCmsConfiguration } from "@/api/contentcore/dashboard";-->
<!--export default {-->
<!-- name: "ServerInfoDashboard",-->
<!-- data () {-->
<!-- return {-->
<!-- serverInfo: {-->
<!-- app: {}-->
<!-- },-->
<!-- config:{}-->
<!-- };-->
<!-- },-->
<!-- created() {-->
<!-- this.loadServerInfo();-->
<!-- this.loadCmsConfiguration();-->
<!-- },-->
<!-- methods: {-->
<!-- loadServerInfo() {-->
<!-- getDashboardServerInfo().then(response => {-->
<!-- this.serverInfo = response.data;-->
<!-- })-->
<!-- },-->
<!-- loadCmsConfiguration() {-->
<!-- getCmsConfiguration().then(response => {-->
<!-- this.config = response.data;-->
<!-- })-->
<!-- }-->
<!-- }-->
<!--};-->
<!--</script>-->

View File

@ -0,0 +1,64 @@
<template>
<div class="home-shortcut-container">
<el-card shadow="hover" class="mb10">
<div slot="header" class="clearfix">
<span>快捷方式</span>
</div>
<div class="body">
<el-card v-for="shortcut in shortcuts" :key="shortcut.router" shadow="hover" :body-style="{ padding: '0 10px' }" style="float: left;margin-right:10px;margin-bottom:10px;">
<el-link class="shortcut-link" @click="handleShortcutRedirect(shortcut.path)">
<svg-icon :icon-class="shortcut.icon" class-name="card-panel-icon"></svg-icon>
<div class="shortcut-text">
<span>{{ shortcut.menuName }}</span>
</div>
</el-link>
</el-card>
</div>
</el-card>
</div>
</template>
<script>
import { getHomeShortcuts } from "@/api/system/user";
export default {
name: "ShortcutDashboard",
data () {
return {
shortcuts: []
};
},
created() {
this.loadShortcuts();
},
methods: {
loadShortcuts() {
getHomeShortcuts().then(response => {
console.log(response)
this.shortcuts = response.data;
})
},
handleShortcutRedirect(router) {
this.$router.push({ path: router })
}
}
};
</script>
<style>
.home-shortcut-container .shortcut-link {
display: block;
padding: 10px 10px;
text-align: center;
width: 165px;
}
.home-shortcut-container .card-panel-icon {
width: 36px;
height: 36px;
padding: 5px;
}
.home-shortcut-container .shortcut-text {
padding-top: 5px;
text-align: center;
font-size: 14px;
}
</style>

View File

@ -0,0 +1,86 @@
<template>
<div class="home-user-info-container">
<el-card class="box-card" shadow="hover">
<div>
<el-row :gutter="20">
<el-col :span="2">
<div class="div-avatar">
<img :src="userInfo.avatar" class="home-user-avatar" />
</div>
</el-col>
<el-col :span="22">
<div class="user-info-header">欢迎回来<router-link to="/user/profile">{{ userInfo.nickName }}</router-link></div>
<div class="user-info-detail">
<i class="el-icon-time"> 上次登录时间<span>{{ parseTime(userInfo.loginDate, "{y}-{m}-{d} {h}:{m}:{s}") }}</span></i>
<i class="el-icon-map-location">上次登录IP<span>{{ userInfo.loginIp }}</span></i>
</div>
</el-col>
</el-row>
</div>
</el-card>
</div>
</template>
<script>
import { getHomeUserInfo } from "@/api/system/user";
export default {
name: "UserInfoDashboard",
data () {
return {
userInfo: {}
};
},
created() {
this.loadUserInfo();
},
methods: {
loadUserInfo() {
getHomeUserInfo().then(response => {
this.userInfo = response.data;
if (this.userInfo.avatar && this.userInfo.avatar != '') {
this.userInfo.avatar = process.env.VUE_APP_BASE_API + this.userInfo.avatar;
}
})
}
}
};
</script>
<style>
.home-user-info-container {
padding: 10px 0;
}
.home-user-info-container .el-card__body {
padding: 10px 10px 5px 10px;
}
.home-user-info-container .div-avatar {
padding: 5px;
text-align: center;
}
.home-user-info-container .home-user-avatar {
width: 60px;
height: 60px;
border-radius: 50%;
overflow: hidden;
}
.home-user-info-container .user-info-header {
font-size: 16px;
padding: 12px 0;
color: #5a5e66;
}
.home-user-info-container .user-info-header a {
color: #409eff;
padding-left: 10px;
}
.home-user-info-container .user-info-detail {
display: block;
font-size: 12px;
color: #6a6b6e;
}
.home-user-info-container .user-info-detail i {
margin-right: 15px;
}
.home-user-info-container .user-info-detail i span {
color: #909399;
padding-left: 5px;
}
</style>

View File

@ -59,7 +59,7 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['competition:competition:add']" v-hasPermi="['hit:hitCompetition:add']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -70,7 +70,7 @@
size="mini" size="mini"
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
v-hasPermi="['competition:competition:edit']" v-hasPermi="['hit:hitCompetition:edit']"
>修改</el-button> >修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -81,7 +81,7 @@
size="mini" size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['competition:competition:remove']" v-hasPermi="['hit:hitCompetition:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -91,7 +91,7 @@
icon="el-icon-download" icon="el-icon-download"
size="mini" size="mini"
@click="handleExport" @click="handleExport"
v-hasPermi="['competition:competition:export']" v-hasPermi="['hit:hitCompetition:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@ -132,14 +132,14 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['competition:competition:edit']" v-hasPermi="['hit:hitCompetition:edit']"
>修改</el-button> >修改</el-button>
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['competition:competition:remove']" v-hasPermi="['hit:hitCompetition:remove']"
>删除</el-button> >删除</el-button>
</template> </template>
</el-table-column> </el-table-column>

View File

@ -108,7 +108,7 @@
size="mini" size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['registrationStudentInfo:registrationStudentInfo:remove']" v-hasPermi="['hit:hitRegistrationStudentInfo:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -118,7 +118,7 @@
icon="el-icon-download" icon="el-icon-download"
size="mini" size="mini"
@click="handleExport" @click="handleExport"
v-hasPermi="['registrationStudentInfo:registrationStudentInfo:export']" v-hasPermi="['hit:hitRegistrationStudentInfo:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@ -177,7 +177,7 @@
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['registrationStudentInfo:registrationStudentInfo:remove']" v-hasPermi="['hit:hitRegistrationStudentInfo:remove']"
>删除</el-button> >删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -286,8 +286,9 @@ export default {
listHitRegistrationStudentInfo(this.queryParams).then(response => { listHitRegistrationStudentInfo(this.queryParams).then(response => {
this.HitRegistrationStudentInfoList = response.rows; this.HitRegistrationStudentInfoList = response.rows;
this.HitRegistrationStudentInfoList.forEach(item => { this.HitRegistrationStudentInfoList.forEach(item => {
item.leaderNames = item.leaderNames.join(",") console.log(item)
item.guideNames = item.guideNames.join(",") if (item.leaderNames !== null) item.leaderNames = item.leaderNames.join(",");
if (item.guideNames !== null) item.guideNames = item.guideNames.join(",");
}) })
this.total = response.total; this.total = response.total;
this.loading = false; this.loading = false;

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="login"> <div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form"> <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3> <h3 class="title">后台管理系统</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="loginForm.username" v-model="loginForm.username"
@ -56,7 +56,7 @@
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
<span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span> <span></span>
</div> </div>
</div> </div>
</template> </template>
@ -72,8 +72,8 @@ export default {
return { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "" uuid: ""