若依后端管理系统学习日志

文章目录

    • 遇到的问题
      • 1. 自定义模块404
    • 解决方案
      • 1. 自定义后台异常返回
      • 2. 添加导入按钮
      • 3. 树形列表搜索

遇到的问题

1. 自定义模块404

idea没有报错,但是点击进去页面显示404。
F12查看错误信息,原来是访问后端controller接口没有成功,找不到导致404。
那么肯定是controller的问题,我的包结构是这样的:
在这里插入图片描述

competiton是我自定义的模块,那么很有可能是controlle没有被扫描到。
尝试在启动类添加包扫描注解没有解决,反而导致mapper找不到。
解决方案:
在启动类上添加:

@MapperScan(value = {"cn.sd.*.mapper","com.ruoyi.*.*.mapper"})
@ComponentScan(value = {"cn.sd.bzu","com.ruoyi"} )

参考连接:

  1. https://gitee.com/y_project/RuoYi/issues/I121LM
  2. https://blog.csdn.net/weixin_44248755/article/details/110450972
    根本原因:
    SpringBootApplication注解和ComponentScan注解生效关系和范围的问题
    在这里插入图片描述

解决方案

1. 自定义后台异常返回

如下,在catch中抛出异常

    public long selectDeptHigh(String deptName) {
        try {
            SysDept dept = new SysDept();
            dept.setDeptName(deptName);
            return sysDeptMapper.selectDept(dept).getDeptId();
        } catch (Exception e) {
            throw new RuntimeException("检查学院/年级/专业/班级是否已提前导入");
        }
    }

2. 添加导入按钮

虽然官方文档有写,但是直接弄下来有些地方有会问题。
1. controller
解释:两个方法,第一个是接收导入操作,第二个是下载导入模板。根据需要更换实体类即可

    /**
     * 批量新增部门
     */
    @Log(title = "部门管理", businessType = BusinessType.IMPORT)
    @PreAuthorize("@ss.hasPermi('system:student:import')")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
        ExcelUtil<StudentInfo> util = new ExcelUtil<StudentInfo>(StudentInfo.class);
        List<StudentInfo> studentInfoList = util.importExcel(file.getInputStream());
        String operName = getUsername();
        String message = studentInfoService.importStudent(studentInfoList, updateSupport, operName);
        return success(message);
    }
    
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response)
    {
        ExcelUtil<StudentInfo> util = new ExcelUtil<StudentInfo>(StudentInfo.class);
        util.importTemplateExcel(response, "用户数据");
    }

2. 服务层
接口

    public String importStudent(List<StudentInfo> StudentInfoList, Boolean isUpdateSupport, String operName);

实现类
其中的一些判断逻辑根据需要修改即可

 /**
     * 导入用户数据
     *
     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
     * @param operName        操作用户
     * @return 结果
     */
    @Override
    public String importStudent(List<StudentInfo> studentList, Boolean isUpdateSupport, String operName) {
        if (StringUtils.isNull(studentList) || studentList.size() == 0) {
            throw new ServiceException("导入部门数据不能为空!");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        StudentInfo s = new StudentInfo();
        for (StudentInfo studentInfo : studentList) {
            try {
                s.setStudentNo(studentInfo.getStudentNo()); // 学号是唯一的
                // 验证是否存在这个用户
                StudentInfo u = studentInfoMapper.selectOneStudentInfo(s);
                if (StringUtils.isNull(u)) {
                    studentInfo.setCreateBy(operName);
                    insertStudentInfo(studentInfo);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、学生 " + studentInfo.getName() + " 导入成功");
                } else if (isUpdateSupport) {

                    studentInfo.setCreateBy(operName);
                    updateStudentInfo(studentInfo);

                    successNum++;
                    successMsg.append("<br/>" + successNum + "、学生 " + studentInfo.getName() + " 更新成功");
                } else {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、学生 " + studentInfo.getName() + " 已存在");
                }
            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、学生 " + studentInfo.getName() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new ServiceException(failureMsg.toString());
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }

3. 前端
3.1 放到data-return中

  data() {
    return {放这里面}

url根据需要修改

   // 用户导入参数
      upload: {
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: "",
        // 是否禁用上传
        isUploading: false,
        // 是否更新已经存在的用户数据
        updateSupport: 0,
        // 设置上传的请求头部
        headers: {Authorization: "Bearer " + getToken()},
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + "/user/student/importData"
      },

3.2 放在methods中

/** 导入按钮操作 */
    handleImport() {
      this.upload.title = "用户导入";
      this.upload.open = true;
    },
    /** 下载模板操作 */
    importTemplate() {
      this.download('user/student/importTemplate', {}, `student_template_${new Date().getTime()}.xlsx`)
    },

    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
      this.upload.isUploading = true;
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
      this.upload.open = false;
      this.upload.isUploading = false;
      this.$refs.upload.clearFiles();
      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true});
      this.getList();
    },
    // 提交上传文件
    submitFileForm() {
      this.$refs.upload.submit();
    }

3.3 按钮
注意修改: v-hasPermi="['system:student:import']"

  <el-col :span="1.5">
        <el-button
          type="info"
          plain
          icon="el-icon-upload2"
          size="mini"
          @click="handleImport"
          v-hasPermi="['system:student:import']"
        >导入
        </el-button>
      </el-col>

3.4 用户导入对话框
放到这个位置正好
在这里插入图片描述
最后引入一个东西:

import {getToken} from "@/utils/auth";

在这里插入图片描述

<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
      <el-upload
        ref="upload"
        :limit="1"
        accept=".xlsx, .xls"
        :headers="upload.headers"
        :action="upload.url + '?updateSupport=' + upload.updateSupport"
        :disabled="upload.isUploading"
        :on-progress="handleFileUploadProgress"
        :on-success="handleFileSuccess"
        :auto-upload="false"
        drag
      >
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip text-center" slot="tip">
          <div class="el-upload__tip" slot="tip">
            <el-checkbox v-model="upload.updateSupport"/>
            是否更新已经存在的用户数据
          </div>
          <span>仅允许导入xls、xlsx格式文件。</span>
          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
                   @click="importTemplate">下载模板
          </el-link>
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>

3. 树形列表搜索

在其他模块实现部门树形展示图
在这里插入图片描述
为了布局,需要下注意结构:
最外面放一个el-row, 里面是两个el-col
在这里插入图片描述
结构分析

 <el-row :gutter="20">
       <!--部门数据-->
      <el-col :span="4" :xs="24">
      </el-col>
      <el-col :span="20" :xs="24">
      之前的页面内容
      </el-col>
</el-row>

树形结构代码

      <!--部门数据-->
      <el-col :span="4" :xs="24">
        <div class="head-container">
          <el-input
            v-model="deptName"
            placeholder="请输入部门名称"
            clearable
            size="small"
            prefix-icon="el-icon-search"
            style="margin-bottom: 20px"
          />
        </div>
        <div class="head-container">
          <el-tree
            :data="deptOptions"
            :props="defaultProps"
            :expand-on-click-node="false"
            :filter-node-method="filterNode"
            ref="tree"
            node-key="id"
            default-expand-all
            highlight-current
            @node-click="handleNodeClick"
          />
        </div>
      </el-col>

data()中加入:

	deptOptions: undefined,
      deptName: undefined,
      defaultProps: {
        children: "children",
        label: "label"
      },

methods中加入
记得deta里边queryParams中要有deptId定义

    // 筛选节点
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    // 节点单击事件
    handleNodeClick(data) {
      this.queryParams.deptId = data.id;
      this.handleQuery();
    },
    /** 查询部门下拉树结构 */
    getDeptTree() {
      deptTreeSelect().then(response => {
        this.deptOptions = response.data;
      });
    },

created()方法中加入:

  created() {
    this.getDeptTree();
  },

加入依赖

import {deptTreeSelect} from "@/api/system/user";

搜索过程简单分析:
监听鼠标点击操作,获取dept_id,调用handleQuery进行查询,记得sql中得写上dept_id的条件哦

树状图初始化简单分析:
在生命周期函数created()中调用getDeptTree()方法,而getDeptTree()方法是调用了原本user的API"@/api/system/user",在这个api中,继续去调用usercontroller

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5679.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上传文件—ajax

目录 一、上传图片文件 1.写基本html 完成页面主框架 2.script部分 2-0 主框架 上传文件按钮被点击触发事件 2-1验证使得否选择文件 2-2 介绍 FormData 2-3 监听onreadystatechange事件 小结 二、实现上传文件进度条 1. 在bootstrap找进度条组件 2.script 完成进度条算法…

Java锁深入理解2——ReentrantLock

前言 本篇博客是《Java锁深入理解》系列博客的第二篇&#xff0c;建议依次阅读。 各篇博客链接如下&#xff1a; Java锁深入理解1——概述及总结 Java锁深入理解2——ReentrantLock Java锁深入理解3——synchronized Java锁深入理解4——ReentrantLock VS synchronized Java锁…

QT Qwidget 事件处理机制

qlineEdit Qt事件处理是指在Qt应用程序中处理各种事件的过程。事件是指在应用程序中发生的各种操作&#xff0c;例如按键、鼠标点击、窗口移动等。Qt提供了一个事件处理机制&#xff0c;使得开发者可以对这些事件进行处理&#xff0c;以实现应用程序的各种功能。 Qt中的事件处…

CMake设置Visual Studio工程的调试环境变量和工作目录cwd的方法

1、设置在Visual Studio中调试的环境变量&#xff0c;此设置仅仅在VS中点击那个绿色三角运行时有效&#xff0c;与你直接双击打开exe文件运行无关&#xff0c;有效避免多版本动态库全部写入系统环境变量的污染问题&#xff1b; # Visual Studio中调试依赖的独立环境变量 set_p…

代码随想录算法训练营第五十天| ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

309.最佳买卖股票时机含冷冻期 看完题后的思路 dp[i][] 0: 第i天不持有股票的最大利润 1: 持有 递推公式 dp[i][0]max(第i-1天不持有,第i-1天持有,在第i天卖了) dp[i][1]max(第i-1天持有, 第i-2天不持有,第i天持有) 初始化 dp[0][0]0; dp[0][1]-price[i]; dp[1][0]max(x,x) d…

PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范

目录PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范一、LDO线性稳压电源组成与概念二、LDO的电路的主干道布局要点PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范 一、LDO线性稳压电源组成与概念 LDO线性稳压器是最基本的稳压电源变换&#xff0c;…

STM32时钟与定时器

目录 一、STM32的时钟系统 二、SysTick定时器 三、HAL_Delay的实现 四、通用定时器 一、STM32的时钟系统 概念时钟系统是由振荡器&#xff08;信号源&#xff09;、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。 意义时钟是嵌入式系统的脉搏&…

自然语言处理中的数据预处理:理论与实践

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

2020-2022年美赛C题信件汇总

2020-2022年美赛O奖C题写信汇总(机翻) 2020 <1> Dear Marketing Director of Sunshine Company , According to your requirements, we analyze the ratings and reviews of competitive products on Amazon for baby pacifier, microwave and hair dryer to be intro…

C++ 模板、函数模板、类模板

函数模板、类模板 文章目录函数模板、类模板前言1.模板1.1 模板的概念1.2 模板的特点2. 函数模板2.1 函数模板语法2.2 函数模板注意事项2.3 普通函数与函数模板的区别2.4 普通函数与函数模板的调用规则2.5 模板的局限性2.6 函数模板案例3. 类模板3.1 类模板语法3.2 类模板与函数…

2023年Java程序员生存指南,8个中肯建议度过寒潮!

最近小源看到一个2023Java程序员生存指南&#xff0c;觉得挺有意思的&#xff0c;今天分享给大家&#xff01; 第一&#xff0c;不要在互联网公司基于低代码做开发。 第二&#xff0c;保证一定强度的刷题&#xff0c;原因嘛你懂的~ 第三&#xff0c;凡是要求名校的岗位&#xf…

C#,码海拾贝(08)——埃特金(Aitken)逐步曲线插值算法,《C#数值计算算法编程》源代码升级改进版

埃特金逐步线性插值法&#xff08;Aitken successive linear interpolation method&#xff09;一种能逐步升阶的插值方法.用拉格朗日插值多项式计算函数近似值时&#xff0c;如果精度不满足要求&#xff0c;需增加插值节点以提高插值多项式次数时&#xff0c;原来算出的结果均…

字节二面,原来我对自动化测试的理解太浅了

如果你入职一家新的公司&#xff0c;领导让你开展自动化测试&#xff0c;作为一个新人&#xff0c;你肯定会手忙脚乱&#xff0c;你会如何落地自动化测试呢&#xff1f; 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚&#xff0c;这样的人也是很悲…

七、网络安全

&#xff08;一&#xff09;网络安全设计 1、网络安全体系设计 &#xff08;1&#xff09;物理安全 通信线路的可靠性、硬软件设备的安全性、设备的备份、防灾害防干扰能力、设备的运行环境、不间断电源 eg机房安全 &#xff08;2&#xff09;系统安全 操作系统本身的缺陷…

vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】

文章目录4.完成非路由组件Header与Footer业务4.1使用组件的步骤&#xff08;非路由组件&#xff09;本人其他相关文章链接4.完成非路由组件Header与Footer业务 在咱们项目开发中&#xff0c;不在以HTML CSS 为主&#xff0c;主要搞业务、逻辑 开发项目的流程&#xff1a; (1)…

模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)

模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09; 文章目录模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09;硬间隔&#xff08;Hard-Margin&#xff09;软间隔&#xff08;Soft…

52LeetCode刷题_LeetCode刷题手册

虽然刷题一直饱受诟病&#xff0c;不过不可否认刷题确实能锻炼我们的编程能力&#xff0c;相信每个认真刷题的人都会有体会。现在提供在线编程评测的平台有很多&#xff0c;比较有名的有 hihocoder&#xff0c;LintCode&#xff0c;以及这里我们关注的 LeetCode。 LeetCode收录…

Spring 注解和 XML 配置文件重复定义 Bean,会怎样?

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

iPhone屏幕适配(之屏幕尺寸)

Device screen size 各设备屏幕尺寸 DeviceDimensions (portrait)iPhone 14 Pro Max430x932 pt (1290x2796 px 3x)iPhone 14 Pro393x852 pt (1179x2556 px 3x)iPhone 14 Plus428x926 pt (1284x2778 px 3x)iPhone 14390x844 pt (1170x2532 px 3x)iPhone 13 Pro Max428x926 pt (…

Element Plus 实例详解(七)___Typography 排版

Element Plus 实例详解&#xff08;七&#xff09;___Typography 排版 目录 一、前言 二、搭建Element Plus试用环境 1、搭建Vue3项目&#xff08;基于Vite Vue&#xff09; 2、安装Element Plus 三、Element Plus Typography 排版功能试用 1、字号 2、行高 3、Font-fam…