文章目录
- 运行若依项目
 
- 科室管理
 - 科室查询-后端代码实现
 - 科室查询-前端代码实现
 - 科室名称状态搜索
 - 科室删除-后端代码实现
 - 科室删除-前端代码实现
 - 科室新增-后端代码实现
 - 科室新增-前端代码实现
 - 科室修改-后端代码实现
 - 前端代码实现
 - 角色权限实现
 
运行若依项目
运行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')")
                


















