2.企业级权限管理系统 部门的更新,同级目录下的校验

本文介绍了一个部门信息更新的实现方案,包括验证、级联更新、级别计算等关键步骤,并使用MyBatis进行数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

update

    public void update(DeptParam param) {
        BeanValidator.check(param);
        if(checkExist(param.getParentId(), param.getName(), param.getId())) {
            throw new ParamException("同一层级下存在相同名称的部门");
        }
        SysDept before = sysDeptMapper.selectByPrimaryKey(param.getId());
        //判断原来的部门,如果不存在 抛出异常
        Preconditions.checkNotNull(before, "待更新的部门不存在");
        //设置 值,包括ID,从参数中取出的
        SysDept after = SysDept.builder().id(param.getId()).name(param.getName()).parentId(param.getParentId())
                .seq(param.getSeq()).remark(param.getRemark()).build();
        //设置level,规则不变        
        after.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
        after.setOperator(RequestHolder.getCurrentUser().getUsername());
        after.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest()));
        after.setOperateTime(new Date());

        updateWithChild(before, after);
        sysLogService.saveDeptLog(before, after);
    }
    private boolean checkExist(Integer parentId, String deptName, Integer deptId) {
        return sysDeptMapper.countByNameAndParentId(parentId, deptName, deptId) > 0;

int countByNameAndParentId(@Param("parentId") Integer parentId, @Param("name") String name, @Param("id") Integer id);
参数有多个,可以统一写成map
  <select id="countByNameAndParentId" parameterType="map" resultType="int">
    SELECT count(1)
    FROM sys_dept
    WHERE name = #{name}
    <if test="parentId != null">
      AND parent_id = #{parentId}
    </if>
    <if test="id != null"> --添加的时候,没有ID,更新的时候,如果当前 不相等 的 还能查出,就是已经存在过了
      AND id != #{id}
    </if>
  </select>
    @Transactional // 如果要保证事务生效,需要调整这个方法,一个可行的方法是重新创建一个service类,然后把这个方法转移过去
    public void updateWithChild(SysDept before, SysDept after) {
        //获得更新后level
        String newLevelPrefix = after.getLevel();
        //获得更新前level
        String oldLevelPrefix = before.getLevel();
        //如果两个level不相同
        if (!after.getLevel().equals(before.getLevel())) {
            //之前的level.id
            String curLevel = before.getLevel() + "." + before.getId();
            //查询到之前的level的 子数据,和 子子数据
            List<SysDept> deptList = sysDeptMapper.getChildDeptListByLevel(curLevel + "%");
            if (CollectionUtils.isNotEmpty(deptList)) {
            //如果子数据 存在,遍历
                for (SysDept dept : deptList) {
                    //获得到这个子数据
                    String level = dept.getLevel();
                    //如果level相同 或者 level的开头 是 curLevel
                    if (level.equals(curLevel) || level.indexOf(curLevel + ".") == 0) {
                        // getChildAclModuleListByLevel可能会取出多余的内容,因此需要加个判断
                        // 比如0.1* 可能取出0.1、0.1.3、0.11、0.11.3,而期望取出  0.1、0.1.3, 因此呢需要判断等于0.1或者以0.1.为前缀才满足条件
                        level = newLevelPrefix + level.substring(oldLevelPrefix.length()); //如hello substring(2) 为 llo 起始索引开
                        dept.setLevel(level);
                    }
                }
                sysDeptMapper.batchUpdateLevel(deptList);
            }
        }
        sysDeptMapper.updateByPrimaryKey(after);
    }
    List<SysDept> getChildDeptListByLevel(@Param("level") String level);

  <select id="getChildDeptListByLevel" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from sys_dept
    WHERE level like #{level}
  </select>

    void batchUpdateLevel(@Param("sysDeptList") List<SysDept> sysDeptList);
//参数是list 可以写成map
  <update id="batchUpdateLevel" parameterType="map">
  //遍历 执行sql
    <foreach collection="sysDeptList" item="dept" separator=";">//分隔符为 ;
      UPDATE sys_dept
      SET level = #{dept.level}
      WHERE id = #{dept.id} //根据dept的id更新
    </foreach>
  </update>

@Getter
@Setter
@ToString
public class DeptParam {
    private Integer id;

    @NotBlank(message = "部门名称不可以为空")

    private String name;
    private Integer parentId = 0;

    @NotNull(message = "展示顺序不可以为空")
    private Integer seq;

    @Length(max = 150, message = "备注的长度需要在150个字以内")
    private String remark;
}
  1. 这里感觉用oracle的树查询会更简单,用了level 增加了很多没必要的麻烦
<think>嗯,用户想了解package.json文件所在的同级目录位置。我需要先回想一下Node.js项目的结构。通常,package.json位于项目的根目录下,也就是项目的顶层目录。比如,当使用npm init初始化项目时,会在当前目录生成这个文件。那同级目录应该包括src、node_modules、public这些文件夹,还有其他的配置文件如README.md、.gitignore等。 用户可能是在配置项目时遇到了路径问题,比如在引用模块或者配置环境变量时,需要知道package.json的位置来确定相对路径。比如在vue项目中,根据引用[3]和[4],配置文件放在src/Config下,而package.json在根目录,所以从src目录到根目录的路径应该是../package.json之类的。 另外,用户可能对“同级目录”不太清楚,需要明确说明根目录下的文件和文件夹都是package.json的同级。同时,可能需要提醒用户,不同环境下路径可能不同,比如开发环境和生产环境,但package.json的位置通常不变。 还要注意用户可能的错误,比如在子目录中寻找package.json,或者误以为安装的模块里有这个文件。需要指出node_modules里的包都有自己的package.json,但项目根目录的才是用户自己定义的。 最后,确保回答结构清晰,分点说明,并引用提供的资料中的例子,比如vue项目的配置,来加强可信度。</think>### package.json 文件同级目录位置说明 在 Node.js 或 Vue 项目中,**`package.json` 文件始终位于项目的根目录**,即项目的最顶层目录。其同级目录内容如下: 1. **常见同级目录结构示例**: ``` ├── package.json # 项目配置文件 ├── node_modules/ # 依赖安装目录(自动生成) ├── src/ # 源代码目录 ├── public/ # 静态资源目录(常见于 Vue/React 项目) ├── .gitignore # Git 忽略配置 ├── README.md # 项目说明文档 └── vue.config.js # Vue 项目自定义配置(可选) ``` 2. **路径验证方法**: - **通过命令行定位**: 在项目根目录执行 `ls`(Linux/macOS)或 `dir`(Windows),可直接看到 `package.json` 文件。 - **通过代码引用路径**: 例如在 Vue 项目中,配置文件 `src/Config/env.development.js` 引用根目录时,路径应为 `../../package.json`[^3][^4]。 3. **特殊场景说明**: - **子包项目(Monorepo)**: 若使用 Lerna 或 Yarn Workspaces 等工具,每个子包目录下会有独立的 `package.json`。 - **依赖模块内部**: `node_modules` 中每个第三方包的目录下也有自己的 `package.json`,但这是依赖包的配置,非项目主文件。 ### 示例:Vue 项目中的实际应用 根据引用[3][^3]和[4][^4],Vue 项目的环境配置通常位于 `src/Config` 目录,而 `package.json` 始终在项目根目录。在 `package.json` 中配置的脚本命令(如 `npm run build`)默认以根目录为执行起点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值