采用若依vue 快速开发系统功能模块

news2025/5/19 22:09:45

文章目录

            • 运行若依项目
          • 科室管理
            • 科室查询-后端代码实现
            • 科室查询-前端代码实现
            • 科室名称状态搜索
            • 科室删除-后端代码实现
            • 科室删除-前端代码实现
            • 科室新增-后端代码实现
            • 科室新增-前端代码实现
            • 科室修改-后端代码实现
            • 前端代码实现
            • 角色权限实现


运行若依项目

运行redis 创建数据库 修改数据库配置 启动后端 启动前端

先创建目录

在这里插入图片描述

新增菜单

在这里插入图片描述
新建角色 勾选所需的菜单
在这里插入图片描述

新建用户

在这里插入图片描述

分配角色

在这里插入图片描述

退出重新登录即可看到

在这里插入图片描述

新建模型和表字段

在这里插入图片描述

服务端代码文件分类 domain (pojo) controller mapper service

设计模型视图表结构

在这里插入图片描述
在这里插入图片描述

导出sql文件

在这里插入图片描述

navicat 执行sql语句创建下面的表

CREATE TABLE `his_depts` (
  `depts_id` int(11) NOT NULL COMMENT '科室编号---deptsId',
  `depts_name` varchar(255) NOT NULL COMMENT '科室名称---deptsName',
  `depts_code` varchar(255) NOT NULL COMMENT '科室编码---deptsCode',
  `depts_num` int(11) NOT NULL DEFAULT '0' COMMENT '科室挂号量 ---deptsNum',
  `depts_leader` varchar(255) DEFAULT NULL COMMENT '科室领导---deptsLeader',
  `depts_phone` varchar(255) DEFAULT NULL COMMENT '科室电话---deptsPhone',
  `status` int(11) NOT NULL COMMENT '科室状态---status',
  `create_by` varchar(255) DEFAULT NULL COMMENT '创建者---createBy',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间--createTime',
  `update_by` varbinary(255) DEFAULT NULL COMMENT '更新者---updateBy',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间--updateTime'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO his_depts VALUES 
(101,"内科","HIS-Nk",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(102,"外科","HIS-WK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(103,"儿科","HIS-EK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(104,"妇科","HIS-FK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(105,"眼科","HIS-YK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(106,"耳鼻喉科","HIS-EBHK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(107,"口腔科","HIS-KQK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(108,"皮肤科","HIS-PFK",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW()),
(109,"其他","HIS-OTHER",0,"雷哥","17512344321",1,"admin",NOW(),"admin",NOW());
科室管理
科室查询-后端代码实现

仿照岗位管理实现 对应表sys_post

在这里插入图片描述

在这里插入图片描述

通过代码生成器 导入表

复制HisDepts.java 代码到domain类

package com.ruoyi.system.domain;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;

/**
 * 【请填写功能名称】对象 his_depts
 * 
 * @author ruoyi
 * @date 2025-04-13
 */
public class HisDepts extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 科室编号---deptsId */
    @Excel(name = "科室编号---deptsId")
    private Long deptsId;

    /** 科室名称---deptsName */
    @Excel(name = "科室名称---deptsName")
    private String deptsName;

    /** 科室编码---deptsCode */
    @Excel(name = "科室编码---deptsCode")
    private String deptsCode;

    /** 科室挂号量 ---deptsNum */
    @Excel(name = "科室挂号量 ---deptsNum")
    private Long deptsNum;

    /** 科室领导---deptsLeader */
    @Excel(name = "科室领导---deptsLeader")
    private String deptsLeader;

    /** 科室电话---deptsPhone */
    @Excel(name = "科室电话---deptsPhone")
    private String deptsPhone;

    /** 科室状态---status */
    @Excel(name = "科室状态---status")
    private Long status;

    public void setDeptsId(Long deptsId) 
    {
        this.deptsId = deptsId;
    }

    public Long getDeptsId() 
    {
        return deptsId;
    }

    public void setDeptsName(String deptsName) 
    {
        this.deptsName = deptsName;
    }

    public String getDeptsName() 
    {
        return deptsName;
    }

    public void setDeptsCode(String deptsCode) 
    {
        this.deptsCode = deptsCode;
    }

    public String getDeptsCode() 
    {
        return deptsCode;
    }

    public void setDeptsNum(Long deptsNum) 
    {
        this.deptsNum = deptsNum;
    }

    public Long getDeptsNum() 
    {
        return deptsNum;
    }

    public void setDeptsLeader(String deptsLeader) 
    {
        this.deptsLeader = deptsLeader;
    }

    public String getDeptsLeader() 
    {
        return deptsLeader;
    }

    public void setDeptsPhone(String deptsPhone) 
    {
        this.deptsPhone = deptsPhone;
    }

    public String getDeptsPhone() 
    {
        return deptsPhone;
    }

    public void setStatus(Long status) 
    {
        this.status = status;
    }

    public Long getStatus() 
    {
        return status;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("deptsId", getDeptsId())
            .append("deptsName", getDeptsName())
            .append("deptsCode", getDeptsCode())
            .append("deptsNum", getDeptsNum())
            .append("deptsLeader", getDeptsLeader())
            .append("deptsPhone", getDeptsPhone())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .toString();
    }
}

仿照SysPostMapper格式 创建HisDeptsMapper文件 到mapper文件夹里

创建mapper 和 mapper.xml

package com.ruoyi.system.mapper;

import com.ruoyi.system.domain.HisDepts;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author Admin
 * @title: HisDeptsMapper
 * @projectName RuoYi-Vue-master
 * @description: HisDeptsMapper
 * @date 2025/4/13 13:35
 */
@Mapper
public interface HisDeptsMapper {
    List<HisDepts> selectHisDeptsList(HisDepts hisDepts);
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.HisDeptsMapper">

    <select id="selectHisDeptsList" resultType="hisDepts">
        select * from his_depts
        <where>
            <if test="deptsName != null and deptsName != ''">
            and depts_name like concat('%', #{deptName}, '%')</if>

            <if test="status != null">
                and status = #{status}</if>
        </where>
    </select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.HisDeptsMapper">
    <sql id="selectHisDeptsVo">
        select depts_id, depts_name, depts_code, depts_num, depts_leader, depts_phone, status, create_by, create_time, update_by, update_time from his_depts
    </sql>

    <select id="selectHisDeptsList" resultType="hisDepts">

        <include refid="selectHisDeptsVo"/>
        <where>
            <if test="deptsName != null and deptsName != ''">
            and depts_name like concat('%', #{deptName}, '%')</if>

            <if test="status != null">
                and status = #{status}</if>
        </where>
    </select>
</mapper>

创建service文件 和实现类

package com.ruoyi.system.service;

import com.ruoyi.system.domain.HisDepts;

import java.util.List;

/**
 * @author Admin
 * @title: IHisDeptsService
 * @projectName RuoYi-Vue-master
 * @description: IHisDeptsService
 * @date 2025/4/13 13:49
 */
public interface IHisDeptsService {
    List<HisDepts> selectDeptsList(HisDepts hisDepts);
}

仿照创建controller

package com.ruoyi.web.controller.system;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.HisDepts;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.IHisDeptsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author Admin
 * @title: HisDeptController
 * @projectName RuoYi-Vue-master
 * @description: HisDeptController
 * @date 2025/4/13 19:00
 */
@RestController
@RequestMapping("/his/depts")
public class HisDeptController extends BaseController {
    @Autowired
    private IHisDeptsService hisDeptsService;

    /**
     * 获取科室列表
     */
    //@PreAuthorize("@ss.hasPermi('system:post:list')")
    @GetMapping("/list")
    public TableDataInfo list(HisDepts hisDepts)
    {
        startPage();
        List<HisDepts> list = hisDeptsService.selectDeptsList(hisDepts);
        return getDataTable(list);
    }
}
科室查询-前端代码实现

新建菜单 系统设置

在系统设置下新增菜单 科室管理

参考岗位管理路由参数/system/post

分析若依代码

岗位管理组件路径 system/post/index

对应数据库下的组件参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

复制前端代码post下的index.vue

仿照 岗位管理post前端代码 在views目录下创建his/depts/index.vue

修改科室管理组件路径参数为 his/depts/index

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击菜单 科室管理 即可看到页面显示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改前端代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

状态值获取

<el-select v-model="queryParams.status" placeholder="科室状态" clearable>
          <el-option
            v-for="dict in dict.type.sys_normal_disable"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>

获取状态函数为main.js下

import { getDicts } from "@/api/system/dict/data";

// 根据字典类型查询字典数据信息
export function getDicts(dictType) {
  return request({
    url: '/system/dict/data/type/' + dictType,
    method: 'get'
  })
}

取字典里的数据由前端封装函数调用 即获取到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

去掉导出按钮

修改表单列表

获取岗位列表代码

import { listPost, getPost, delPost, addPost, updatePost } from "@/api/system/post";

// 查询参数
queryParams: {
    pageNum: 1,
        pageSize: 10,
            postCode: undefined,
                postName: undefined,
                    status: undefined
},

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

        getList() {
            this.loading = true;
            listPost(this.queryParams).then(response => {
                this.postList = response.rows;
                this.total = response.total;
                this.loading = false;
            });
        },

复制api/system/post.js 到his下depts.js

修改为科室代码

import { listPost, getPost, delPost, addPost, updatePost } from "@/api/his/depts";
// 查询科室列表
export function listPost(query) {
  return request({
    url: '/his/depts/list',
    method: 'get',
    params: query
  })
}

打印列表显示为空 console.log(response.rows) 更换匹配参数

      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="科室ID" align="center" prop="deptsId" />
      <el-table-column label="科室名称" align="center" prop="deptsName" />
      <el-table-column label="科室编号" align="center" prop="deptsCode" />
      <el-table-column label="科室挂号量" align="center" prop="deptsNum" />
      <el-table-column label="负责人" align="center" prop="deptsLeader" />
      <el-table-column label="电话" align="center" prop="deptsPhone" />
      <el-table-column label="状态" align="center" prop="status">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
        </template>
      </el-table-column>
      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.createTime) }}</span>
        </template>
      </el-table-column>

打印数据为空 后端mapper没有对应

修改后端代码 列名和实体名不一样 采用resultMap映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.HisDeptsMapper">
    <resultMap type="HisDepts" id="HisDeptsResult">
        <result property="deptsId"    column="depts_id"    />
        <result property="deptsName"    column="depts_name"    />
        <result property="deptsCode"    column="depts_code"    />
        <result property="deptsNum"    column="depts_num"    />
        <result property="deptsLeader"    column="depts_leader"    />
        <result property="deptsPhone"    column="depts_phone"    />
        <result property="status"    column="status"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
    </resultMap>

    <sql id="selectHisDeptsVo">
        select depts_id, depts_name, depts_code, depts_num, depts_leader, depts_phone, status, create_by, create_time, update_by, update_time from his_depts
    </sql>

    <select id="selectHisDeptsList" resultMap="HisDeptsResult">

        <include refid="selectHisDeptsVo"/>
        <where>
            <if test="deptsName != null and deptsName != ''">
            and depts_name like concat('%', #{deptsName}, '%')</if>

            <if test="status != null">
                and status = #{status}</if>
        </where>
    </select>
</mapper>

完整前端代码

<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="科室名称" prop="postCode">
        <el-input
          v-model="queryParams.postCode"
          placeholder="请输入科室名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="queryParams.status" placeholder="科室状态" clearable>
          <el-option
            v-for="dict in dict.type.sys_normal_disable"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['system:post:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['system:post:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['system:post:remove']"
        >删除</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="科室ID" align="center" prop="deptsId" />
      <el-table-column label="科室名称" align="center" prop="deptsName" />
      <el-table-column label="科室编号" align="center" prop="deptsCode" />
      <el-table-column label="科室挂号量" align="center" prop="deptsNum" />
      <el-table-column label="负责人" align="center" prop="deptsLeader" />
      <el-table-column label="电话" align="center" prop="deptsPhone" />
      <el-table-column label="状态" align="center" prop="status">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
        </template>
      </el-table-column>
      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.createTime) }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:post:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:post:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />

    <!-- 添加或修改岗位对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="岗位名称" prop="postName">
          <el-input v-model="form.postName" placeholder="请输入岗位名称" />
        </el-form-item>
        <el-form-item label="岗位编码" prop="postCode">
          <el-input v-model="form.postCode" placeholder="请输入编码名称" />
        </el-form-item>
        <el-form-item label="岗位顺序" prop="postSort">
          <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
        </el-form-item>
        <el-form-item label="岗位状态" prop="status">
          <el-radio-group v-model="form.status">
            <el-radio
              v-for="dict in dict.type.sys_normal_disable"
              :key="dict.value"
              :label="dict.value"
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { listPost, getPost, delPost, addPost, updatePost } from "@/api/his/depts";

export default {
  name: "Post",
  dicts: ['sys_normal_disable'],
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 岗位表格数据
      postList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        postCode: undefined,
        postName: undefined,
        status: undefined
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
        postName: [
          { required: true, message: "岗位名称不能为空", trigger: "blur" }
        ],
        postCode: [
          { required: true, message: "岗位编码不能为空", trigger: "blur" }
        ],
        postSort: [
          { required: true, message: "岗位顺序不能为空", trigger: "blur" }
        ]
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询岗位列表 */
    getList() {
      this.loading = true;
      listPost(this.queryParams).then(response => {
        console.log(response.rows)
        this.postList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        postId: undefined,
        postCode: undefined,
        postName: undefined,
        postSort: 0,
        status: "0",
        remark: undefined
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.postId)
      this.single = selection.length!=1
      this.multiple = !selection.length
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加岗位";
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      const postId = row.postId || this.ids
      getPost(postId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改岗位";
      });
    },
    /** 提交按钮 */
    submitForm: function() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.postId != undefined) {
            updatePost(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addPost(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const postIds = row.postId || this.ids;
      this.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() {
        return delPost(postIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** 导出按钮操作 */
    handleExport() {
      this.download('system/post/export', {
        ...this.queryParams
      }, `post_${new Date().getTime()}.xlsx`)
    }
  }
};
</script>

接口代码

import request from '@/utils/request'

// 查询科室列表
export function listPost(query) {
  return request({
    url: '/his/depts/list',
    method: 'get',
    params: query
  })
}

// 查询岗位详细
export function getPost(postId) {
  return request({
    url: '/system/post/' + postId,
    method: 'get'
  })
}

// 新增岗位
export function addPost(data) {
  return request({
    url: '/system/post',
    method: 'post',
    data: data
  })
}

// 修改岗位
export function updatePost(data) {
  return request({
    url: '/system/post',
    method: 'put',
    data: data
  })
}

// 删除岗位
export function delPost(postId) {
  return request({
    url: '/system/post/' + postId,
    method: 'delete'
  })
}
科室名称状态搜索
<el-form-item label="科室名称" prop="postCode">
    <el-input
              v-model="queryParams.deptsName"
              placeholder="请输入科室名称"
              clearable
              @keyup.enter.native="handleQuery"
              />
</el-form-item>
<el-form-item label="状态" prop="status">
    <el-select v-model="queryParams.status" placeholder="科室状态" clearable>
        <el-option
                   v-for="dict in dict.type.sys_normal_disable"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
                   />
    </el-select>
</el-form-item>
科室删除-后端代码实现

mapper文件

@Mapper
public interface HisDeptsMapper {
    List<HisDepts> selectHisDeptsList(HisDepts hisDepts);

    int deleteHisDeptsById(Long deptsId);
}

xml文件

<delete id="deleteHisDeptsById" parameterType="Long">
    delete from his_depts where depts_id = #{deptsId}
</delete>

service方法

/**
     * 删除科室信息
     *
     * @param deptsId
     * @return 结果
     */
public int deleteDeptsById(Long deptsId);

impl实现类

@Override
public int deleteDeptsById(Long deptsId) {
    return hisDeptsMapper.deleteHisDeptsById(deptsId);
}

controller借口方法

/**
     * 科室删除
     */
//@PreAuthorize("@ss.hasPermi('system:post:remove')")
@Log(title = "科室管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{deptsId}")
public AjaxResult remove(@PathVariable Long deptsId)
{
    return toAjax(hisDeptsService.deleteDeptsById(deptsId));
}
科室删除-前端代码实现
import { listPost, getPost, delPost, addPost, updatePost } from "@/api/his/depts";
/** 删除按钮操作 */
handleDelete(row) {
	const postIds = row.deptsId || this.ids;
	this.$modal.confirm('是否确认删除科室编号为"' + postIds + '"的数据项?').then(function() {
	return delPost(postIds);
}).then(() => {
	this.getList();
		this.$modal.msgSuccess("删除成功");
	}).catch(() => {});
},
// 删除科室
export function delPost(postId) {
  return request({
    url: '/his/depts/' + postId,
    method: 'delete'
  })
}
科室新增-后端代码实现

修改HisDeptsMapper.java代码

int insertHisDepts(HisDepts hisDepts);

修改HisDeptsMapper.xml代码

<insert id="insertHisDepts" parameterType="HisDepts">
    insert into his_depts
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="deptsId != null">depts_id,</if>
        <if test="deptsName != null and deptsName != ''">depts_name,</if>
        <if test="deptsCode != null and deptsCode != ''">depts_code,</if>
        <if test="deptsNum != null">depts_num,</if>
        <if test="deptsLeader != null">depts_leader,</if>
        <if test="deptsPhone != null">depts_phone,</if>
        <if test="status != null">status,</if>
        <if test="createBy != null">create_by,</if>
        <if test="createTime != null">create_time,</if>
        <if test="updateBy != null">update_by,</if>
        <if test="updateTime != null">update_time,</if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
        <if test="deptsId != null">#{deptsId},</if>
        <if test="deptsName != null and deptsName != ''">#{deptsName},</if>
        <if test="deptsCode != null and deptsCode != ''">#{deptsCode},</if>
        <if test="deptsNum != null">#{deptsNum},</if>
        <if test="deptsLeader != null">#{deptsLeader},</if>
        <if test="deptsPhone != null">#{deptsPhone},</if>
        <if test="status != null">#{status},</if>
        <if test="createBy != null">#{createBy},</if>
        <if test="createTime != null">#{createTime},</if>
        <if test="updateBy != null">#{updateBy},</if>
        <if test="updateTime != null">#{updateTime},</if>
    </trim>
</insert>

添加接口IHisDeptsService.java

/**
     * 新增科室信息
     * @param hisDepts
     * @return
     */
public int insertHisDepts(HisDepts hisDepts);

实现接口HisDeptsServiceImpl.java

/**
     * 科室新增
     * @param hisDepts
     * @return
     */
@Override
public int insertHisDepts(HisDepts hisDepts) {
    return hisDeptsMapper.insertHisDepts(hisDepts);
}

仿照岗位管理SysPostController 修改controller类代码

//@PreAuthorize("@ss.hasPermi('system:post:add')")
@Log(title = "科室新增", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody HisDepts hisDepts)
{
    //if (!postService.checkPostNameUnique(post))
    //{
    //    return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
    //}
    //else if (!postService.checkPostCodeUnique(post))
    //{
    //    return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
    //}
    //添加创建人名称
    hisDepts.setCreateBy(getUsername());
    hisDepts.setCreateTime(new Date());
    return toAjax(hisDeptsService.insertHisDepts(hisDepts));
}

这里引入@Validated注解 实体类 可以添加@NotBlank 注解

@NotBlank(message = "科室名称不能为空")
@Excel(name = "科室名称---deptsName")
private String deptsName;

修改数据库表设计 id设置自增1 时间设置timestamp格式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

科室新增-前端代码实现

修改表单代码

<el-form ref="form" :model="form" :rules="rules" label-width="80px">
    <el-form-item label="岗位名称" prop="deptsName">
        <el-input v-model="form.deptsName" placeholder="请输入科室名称" />
    </el-form-item>
    <el-form-item label="科室编码" prop="deptsCode">
        <el-input v-model="form.deptsCode" placeholder="请输入科室编码" />
    </el-form-item>
    <el-form-item label="负责人" prop="deptsLeader">
        <el-input v-model="form.deptsLeader" placeholder="请输入负责人" />
    </el-form-item>
    <el-form-item label="电话" prop="deptsPhone">
        <el-input v-model="form.deptsPhone" placeholder="请输入电话" />
    </el-form-item>
    <el-form-item label="挂号量" prop="deptsNum">
        <el-input v-model="form.deptsNum" placeholder="请输入挂号量" />
    </el-form-item>
    <el-form-item label="科室状态" prop="status">
        <el-radio-group v-model="form.status">
            <el-radio
                      v-for="dict in dict.type.sys_normal_disable"
                      :key="dict.value"
                      :label="dict.value"
                      >{{dict.label}}</el-radio>
        </el-radio-group>
    </el-form-item>
</el-form>

表单重置代码修改

// 表单重置
reset() {
    this.form = {
        deptsId: undefined,
        deptsCode: undefined,
        deptsName: undefined,
        deptsLeader: undefined,
        deptsPhone: undefined,
        deptsNum: 0,
        status: "0",
    };
    this.resetForm("form");
},

表单校验

// 表单校验
rules: {
    deptsName: [
        { required: true, message: "科室名称不能为空", trigger: "blur" }
    ],
        deptsCode: [
            { required: true, message: "科室编码不能为空", trigger: "blur" }
        ],
            deptsNum: [
                { required: true, message: "挂号量不能为空", trigger: "blur" }
            ]
}

提交按钮代码修改

/** 提交按钮 */
    submitForm: function() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.deptsId != undefined) {
            updatePost(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addPost(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },

新增岗位api接口路径代码修改

// 新增岗位
export function addPost(data) {
  return request({
    url: '/his/depts',
    method: 'post',
    data: data
  })
}
科室修改-后端代码实现

科室信息回显

HisDeptsMapper.xml

<select id="selectHisDeptsById" resultMap="HisDeptsResult">
    <include refid="selectHisDeptsVo"/>
    where depts_id = #{deptsId}
</select>

HisDeptsMapper.java

HisDepts selectHisDeptsById(Long deptsId);

IHisDeptsService.java

HisDepts selectHisDeptsById(Long deptsId);

IHisDeptsServiceImpl.java

@Override
public HisDepts selectHisDeptsById(Long deptsId) {
    return hisDeptsMapper.selectHisDeptsById(deptsId);
}

HisDeptController.java

/**
 * 根据科室id回显信息
 * @param deptsId
 * @return
 */
//@PreAuthorize("@ss.hasPermi('system:post:query')")
@GetMapping(value = "/{deptsId}")
public AjaxResult getInfo(@PathVariable Long deptsId)
{
    return success(hisDeptsService.selectHisDeptsById(deptsId));
}

修改科室

<update id="updateHisDepts">
        update his_depts
        <trim prefix="SET" suffixOverrides=",">
            <if test="deptsName != null and deptsName != ''">depts_name = #{deptsName},</if>
            <if test="deptsCode != null and deptsCode != ''">depts_code = #{deptsCode},</if>
            <if test="deptsNum != null">depts_num = #{deptsNum},</if>
            <if test="deptsLeader != null">depts_leader = #{deptsLeader},</if>
            <if test="deptsPhone != null">depts_phone = #{deptsPhone},</if>
            <if test="status != null">status = #{status},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
        </trim>
        where depts_id = #{deptsId}
    </update>

HisDeptsMapper.java

int updateHisDepts(HisDepts hisDepts);

IHisDeptsService.java

 int updateHisDepts(HisDepts hisDepts);

IHisDeptsServiceImpl.java

@Override
public int updateHisDepts(HisDepts hisDepts) {
    return hisDeptsMapper.updateHisDepts(hisDepts);
}

HisDeptController.java

/**
     * 修改科室
     */
//@PreAuthorize("@ss.hasPermi('system:post:edit')")
@Log(title = "科室管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody HisDepts hisDepts)
{
    //if (!postService.checkPostNameUnique(post))
    //{
    //    return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
    //}
    //else if (!postService.checkPostCodeUnique(post))
    //{
    //    return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
    //}
    hisDepts.setUpdateBy(getUsername());
    hisDepts.setUpdateTime(new Date());
    return toAjax(hisDeptsService.updateHisDepts(hisDepts));
}
前端代码实现
/** 修改按钮操作 */
handleUpdate(row) {
    this.reset();
    const deptsId = row.deptsId || this.ids
    getPost(deptsId).then(response => {
        this.form = response.data;
        this.form.status = this.form.status.toString();
        this.open = true;
        this.title = "修改岗位";
    });
},
// 查询岗位详细
export function getPost(postId) {
  return request({
    url: '/his/depts/' + postId,
    method: 'get'
  })
}
// 修改科室
export function updatePost(data) {
  return request({
    url: '/his/depts',
    method: 'put',
    data: data
  })
}
角色权限实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

普通用户没有界面权限 按钮权限操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

权限跟随菜单 修改菜单权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给角色添加菜单权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

放开权限注解

/**
     * 获取科室列表
     */
@PreAuthorize("@ss.hasPermi('his:depts:list')")
@GetMapping("/list")
public TableDataInfo list(HisDepts hisDepts) {
    startPage();
    List<HisDepts> list = hisDeptsService.selectDeptsList(hisDepts);
    return getDataTable(list);
}

前端放开权限代码

<el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['his:depts:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['his:depts:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['his:depts:remove']"
        >删除</el-button>
      </el-col>


   <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['his:depts:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['his:depts:remove']"
          >删除</el-button>
        </template>
      </el-table-column>

添加权限按钮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

角色添加上权限按钮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

放开权限代码

@PreAuthorize("@ss.hasPermi('his:depts:list')")
@PreAuthorize("@ss.hasPermi('his:depts:add')")
@PreAuthorize("@ss.hasPermi('his:depts:query')")
@PreAuthorize("@ss.hasPermi('his:depts:edit')")
@PreAuthorize("@ss.hasPermi('his:depts:remove')")

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML:表格数据展示区

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人员信息表</title><link rel"styl…

Oracle测试题目及笔记(单选)

所有题目来自于互联网搜索 当 Oracle 服务器启动时&#xff0c;下列哪种文件不是必须的&#xff08;D&#xff09;。 A&#xff0e;数据文件 B&#xff0e;控制文件 C&#xff0e;日志文件 D&#xff0e;归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…

Jmeter创建使用变量——能够递增递减的计数器

Jmeter创建使用变量——能够递增递减的计数器 如下图所示&#xff0c;创建一个 取值需限定为0 2 4这三个值内的变量。 Increment&#xff1a;每次迭代后 递增的值&#xff0c;给计数器增加的值 Maximum value&#xff1a;计数器的最大值&#xff0c;如果超过最大值&#xff0…

数据结构之BFS广度优先算法(腐烂的苹果)

队列这个数据结构在很多场景下都有使用&#xff0c;比如在实现二叉树的层序遍历&#xff0c;floodfill问题(等等未完成)中&#xff0c;都需要借助队列的先进先出特性&#xff0c;下面给出这几个问题的解法 经典的二叉树的层序遍历 算法图示&#xff0c;以下图所示的二叉树为例…

火车头采集动态加载Ajax数据(无分页瀑布流网站)

为了先填充好数据在上线&#xff0c;在本地搭建了一个网站&#xff0c;并用火车头采集数据填充到里面。 开始很上手&#xff0c;因为找的网站的分类中是有分页的。很快捷的找到页面标识。 但是问题来了&#xff0c;如今很多网站都是采用的Ajax加载数据&#xff0c;根本没有分…

Node.js模块化与npm

目录 一、模块化简介 二、CommonJS 规范 1. 基本语法 2. 导出模块 3. 导入模块 三、ECMAScript 标准&#xff08;ESM&#xff09; 1. 启用 ESM 一、默认导出与导入 1. 基本语法 2. 默认导出&#xff08;每个模块仅一个&#xff09; 3. 默认导入 二、命名导出与导入…

nginx中的代理缓存

1.缓存存放路径 对key取哈希值之后&#xff0c;设置cache内容&#xff0c;然后得到的哈希值的倒数第一位作为第一个子目录&#xff0c;倒数第三位和倒数第二位组成的字符串作为第二个子目录&#xff0c;如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值

【前端vue生成二维码和条形码——MQ】

前端vue生成二维码和条形码——MQ 前端vue生成二维码和条形码——MQ一、安装所需要的库1、安装qrcode2、安装jsbarcode 二、使用步骤1、二维码生成2、条形码生成 至此&#xff0c;大功告成&#xff01; 前端vue生成二维码和条形码——MQ 一、安装所需要的库 1、安装qrcode 1…

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为&#xff08;大小/位置&#xff09;✅&#xff08;基本…

华为OD机试真题——MELON的难题(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《MELON的…

【C++】深入浅出之继承

目录 继承的概念及定义继承的定义继承方式和访问限定符protected与private的区别 默认继承方式继承类模板基类和派生类对象赋值兼容转换继承中的作⽤域(隐藏关系)相关面试题⭐ 派生类的默认成员函数⭐构造函数拷贝构造赋值重载析构函数 继承与友元继承与静态成员继承的方式菱形…

在 macOS 上切换默认 Java 版本

下载javasdk 打开android studio -> setting -> build.execution,dep -> build tools -> gradle -> Gradle JDK -> download JDK… 点击下载&#xff0c;就下载到了 ~/Library/Java/JavaVirtualMachines/ 安装 jenv brew install jenv将 jenv 集成到 Shell …

【安卓开发】【Android Studio】Menu(菜单栏)的使用及常见问题

一、菜单栏选项 在项目中添加顶部菜单栏的方法&#xff1a; 在res目录下新建menu文件夹&#xff0c;在该文件夹下新建用于菜单栏的xml文件&#xff1a; 举例说明菜单栏的写法&#xff0c;只添加一个选项元素&#xff1a; <?xml version"1.0" encoding"ut…

jenkins凭据管理(配置github密钥)

凭据分类 Jenkins可以保存下面几种凭证&#xff1a; Secret text&#xff1a;例如 API Token&#xff08;例如GitHub的个人access token&#xff09;。Username with password&#xff1a;指的是登录GitHub的用户名和密码&#xff0c;可以作为单独的组件处理&#xff0c;也可以…

数据结构|排序算法(三)选择排序 堆排序 归并排序

一、选择排序 1.算法思想 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;其基本思想是&#xff1a;每次都从待排序部分中选出最小的一个数据和待排序的第一个数据交换。 将待排序序列分为已排序和未排序两部分&#xff0c;初始时已排…

MAC Mini M4 上测试Detectron2 图像识别库

断断续续地做图像识别的应用&#xff0c;使用过各种图像识别算法&#xff0c;一开始使用openCV 做教室学生计数的程序。以后又使用YOLO 做医学伤口检测程序。最近&#xff0c;开始使用meta 公司的Detectron2.打算做OCR 文档结构分析 Detectron2 的开发者是 Meta 的 Facebook AI…

OpenCv高阶(四)——角点检测

一、角点检测 在计算机视觉中&#xff0c;角点检测是识别图像中局部区域&#xff08;角点&#xff09;的关键技术&#xff0c;这些区域通常是两条或多条边缘的交点&#xff0c;具有丰富的结构信息&#xff0c;常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…

TOA与AOA联合定位的高精度算法,三维、4个基站的情况,MATLAB例程,附完整代码

本代码实现了三维空间内目标的高精度定位,结合到达角(AOA) 和到达时间(TOA) 两种测量方法,通过4个基站的协同观测,利用最小二乘法解算目标位置。代码支持噪声模拟、误差分析及三维可视化,适用于无人机导航、室内定位等场景。订阅专栏后可获得完整代码 文章目录 运行结果…

揭秘大数据 | 23、软件定义网络

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面&#xff0c;将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式&#xff0c;让服务器的业务部署变得简单&#xff0c;不再依赖于形态和功能各异的硬件交换机&#xf…

Elastic 9.0/8.18:BBQ、EDOT 和 LLM 可观察性、攻击发现、自动导入以及 ES|QL JOIN

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 9.0 和 8.18 的正式发布&#xff01; 如果你觉得 8.x 版本系列已经很令人印象深刻&#xff0c;包含了 ANN、TSDB、ELSER、ES|QL、LTR、BBQ、logsdb 索引模式等功能&#xff0c;那你一定…