项目介绍 :

Spring Boot + SpringMVC + MyBatis+ Mysql + druid + Vue 开发的前后端分离的社区养老院管理系统

项目演示:
https://www.bilibili.com/video/BV1pHUuY8E9v/

运行环境:

最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。

IDE环境:

Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以

适用于:

由于本程序规模不大,可供课程设计,毕业设计学习演示之用

内置功能

管理员角色包含以下功能:

  1. 管理员登录
  2. 用户管理
  3. 床位类型管理
  4. 床位管理
  5. 护工管理
  6. 老人管理
  7. 预约登记管理
  8. 来访登记管理
  9. 健康记录管理
  10. 费用管理
  11. 外出记录管理

护工角色包含以下功能

  1. 护工登录
  2. 床位类型查看
  3. 床位查看
  4. 护工查看
  5. 老人查看
  6. 健康信息上报管理
  7. 费用查看等功能
项目预览

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
用户管理控制层:

package com.laowangjava.nursinghome.controller;

import com.github.pagehelper.PageInfo;
import com.laowangjava.nursinghome.entity.User;
import com.laowangjava.nursinghome.service.UserService;
import com.laowangjava.nursinghome.util.request.PageRequest;
import com.laowangjava.nursinghome.util.response.Result;
import com.laowangjava.nursinghome.util.response.ResultTable;


import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;

/**
 * 用户表(User)表控制层
 *
 * @author 老王
 * @since 2022-03-21 16:02:42
 */
@RestController
@RequestMapping("admin/user")
public class UserController extends ResultController {


    /**
     * 服务对象
     */
    @Resource
    private UserService userService;


    /**
     * 查询User列表
     *
     * @param user        筛选条件
     * @param pageRequest 分页对象
     * @return 查询结果
     */
    @GetMapping("/data")
    public ResultTable list(User user, PageRequest pageRequest) {
        PageInfo<User> pageInfo = userService.selectUserPage(user, pageRequest);

        return pageTable(pageInfo.getList(), pageInfo.getTotal());
    }


    /**
     * 新增保存User
     */

    @PostMapping("/save")
    public Result save(@RequestBody User user) {
        User dbUser = userService.selectUserByAccountName(user.getAccountName());
        if (dbUser != null) {
            return failure("添加失败,账号已存在,请重新输入!");
        }
        int result = userService.insertUser(user);
        return decide(result);
    }

    /**
     * 获取要修改User信息
     */
    @GetMapping("/getUser")
    public Result getUser(Integer userId) {
        User user = userService.selectUserById(userId);
        return successData(user);
    }

    /**
     * 修改保存User
     */
    @PutMapping("/update")
    public Result update(@RequestBody User user) {
        User dbUser = userService.selectUserByAccountName(user.getAccountName());
        if (dbUser != null && !dbUser.getUserId().equals(user.getUserId())) {
            return failure("修改失败,账号已存在,请重新输入!");
        }
        int result = userService.updateUser(user);
        return decide(result);
    }

    /**
     * 批量删除User
     */
    @DeleteMapping("/batchRemove/{ids}")
    public Result batchRemove(@PathVariable Integer[] ids) {
        return decide(userService.deleteUserByIds(ids));
    }


}


用户信息主页

<template>
  <div class="app-container">
    <div class="filter-container">
      <!--搜索条件-->
      <el-form ref="queryForm" :model="queryParams" :inline="true" size="small" label-width="68px">
        <el-form-item label="用户名称" prop="accountName">
          <el-input v-model="queryParams.accountName" size="small" placeholder="请输入用户名称" clearable @keyup.enter.native="handleQuery" />
        </el-form-item>
        <el-form-item label="姓名" prop="userName">
          <el-input v-model="queryParams.userName" size="small" placeholder="请输入用户名称" clearable @keyup.enter.native="handleQuery" />
        </el-form-item>

        <el-button class="filter-item" type="primary" size="small" icon="el-icon-search" @click="handleQuery">
          搜索
        </el-button>
        <el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
      </el-form>

      <el-row :gutter="10" class="mb8">
        <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-plus" plain size="small" @click="handleCreate">
          新增
        </el-button>
        <el-button class="filter-item" style="margin-left: 10px;" type="danger" icon="el-icon-delete" plain size="small" @click="handleDelete">
          批量删除
        </el-button>
      </el-row>

    </div>
    <!-- 用户列表-->
    <el-table :key="tableKey" v-loading="listLoading" :data="list" style="width: 100%; margin-top: 10px" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="50" align="center" />
      <el-table-column label="编号" prop="userId" align="center" width="80">
        <template slot-scope="{row}">
          <span>{{ row.userId }}</span>
        </template>
      </el-table-column>
      <el-table-column label="用户名" width="150px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.accountName }}</span>
        </template>
      </el-table-column>
      <el-table-column label="姓名" width="150px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.userName }}</span>
        </template>
      </el-table-column>
      <el-table-column label="出生日期" width="150px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.birthdate }}</span>
        </template>
      </el-table-column>
      <el-table-column label="性别" width="150px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.sex === 1 ? "女" : "男" }}</span>
        </template>
      </el-table-column>
      <el-table-column label="联系方式" width="110px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.phone }}</span>
        </template>
      </el-table-column>
      <el-table-column label="角色类型" width="150px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.roleType === 1 ? "护工" : "管理员" }}</span>
        </template>
      </el-table-column>

      <el-table-column label="操作" align="center" width="230" class-name="small-padding fixed-width">
        <template slot-scope="{row,$index}">
          <el-button type="primary" size="mini" @click="handleUpdate(row)">
            编辑
          </el-button>
          <el-button v-if="row.status!='deleted'" size="mini" type="danger" @click="handleDelete(row)">
            删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页插件-->
    <pagination v-show="total>0" :total="total" :page.sync="queryParams.page" :limit.sync="queryParams.limit" @pagination="getList" />

    <!-- 添加或修改用户配置对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
      <el-form ref="form" :rules="rules" :model="form" label-width="80px" size="small">
        <el-row>
          <el-col :span="12">
            <el-form-item label="用户名" prop="accountName">
              <el-input v-model="form.accountName" placeholder="请输入用户名" maxlength="20" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item v-if="form.password == undefined" label="用户密码" prop="password">
              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="60" show-password />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="12">
            <el-form-item label="姓名" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入姓名" maxlength="20" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="出生日期" prop="birthdate">
              <el-date-picker v-model="form.birthdate" value-format="yyyy-MM-dd" type="date" placeholder="请输入出生日期" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="性别">
              <el-radio-group v-model="form.sex">
                <el-radio v-for="item in sexArr" :key="item.value" :label="item.value">{{ item.key }}
                </el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="电话" prop="phone">
              <el-input v-model="form.phone" placeholder="请输入电话" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="12">
            <el-form-item label="qq" prop="qq">
              <el-input v-model="form.qq" placeholder="请输入qq" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="微信" prop="weChat">
              <el-input v-model="form.weChat" placeholder="请输入微信" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="12">
            <el-form-item label="籍贯" prop="nativePlace">
              <el-input v-model="form.nativePlace" placeholder="请输入籍贯" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="家庭住址" prop="homeAddress">
              <el-input v-model="form.homeAddress" placeholder="请输入家庭住址" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-form-item label="身份类型">
          <el-radio-group v-model="form.roleType">
            <el-radio v-for="item in roleTypeArr" :key="item.value" :label="item.value">{{ item.key }}
            </el-radio>
          </el-radio-group>
        </el-form-item>

        <el-form-item label="备注">
          <el-input v-model="form.remark" :autosize="{ minRows: 2, maxRows: 4}" type="textarea" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" size="small" @click="submitForm">
          确认
        </el-button>
        <el-button size="small" @click="cancel">
          取消
        </el-button>

      </div>
    </el-dialog>

    <el-dialog :visible.sync="dialogPvVisible" title="Reading statistics">
      <el-table :data="pvData" border fit highlight-current-row style="width: 100%">
        <el-table-column prop="key" label="Channel" />
        <el-table-column prop="pv" label="Pv" />
      </el-table>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="dialogPvVisible = false">Confirm</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { userList, createUser, getUser, updateUser, deletUser } from '@/api/user';

export default {
    name: 'User',
    components: {},
    data() {
        return {
            tableKey: 0,
            // 用户表格数据
            list: null,
            // 总条数
            total: 0,
            // 选中数组
            ids: [],
            // 遮罩层
            listLoading: true,
            // 查询参数
            queryParams: {
                page: 1,
                limit: 10,
                accountName: undefined,
                userName: undefined
            },
            sexArr: [{ key: '男', value: 0 }, { key: '女', value: 1 }],
            roleTypeArr: [{ key: '管理员', value: 0 }, { key: '护工', value: 1 }],
            form: {
                id: undefined,
                accountName: undefined,
                password: undefined,
                userName: undefined,
                birthdate: new Date(),
                sex: 1,
                phone: undefined,
                qq: undefined,
                weChat: undefined,
                nativePlace: undefined,
                homeAddress: undefined,
                roleType: 1,
                remark: undefined
            },
            // 是否显示弹出层
            open: false,
            // 弹出层标题
            title: '',
            dialogPvVisible: false,
            pvData: [],
            rules: {
                accountName: [
                    { required: true, message: '用户名不能为空', trigger: 'blur' },
                    { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
                ],
                password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
                userName: [
                    { required: true, message: '姓名不能为空', trigger: 'blur' },
                    { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
                ],
                birthdate: [{ required: true, message: '出生日期不能为空', trigger: 'blur' }],

                phone: [
                    {
                        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
                        message: '请输入正确的手机号码',
                        trigger: 'blur'
                    }
                ]
            },
            downloadLoading: false
        };
    },
    created() {
        this.getList();
    },
    methods: {
        /** 查询用户列表 */
        getList() {
            this.listLoading = true;
            userList(this.queryParams).then(response => {
                this.list = response.data;
                this.total = response.count;

                // Just to simulate the time of the request
                setTimeout(() => {
                    this.listLoading = false;
                }, 0.1 * 1000);
            });
        },
        /** 重置按钮操作 */
        resetQuery() {
            this.resetForm('queryForm');
            this.handleQuery();
        },
        /** 搜索按钮操作 */
        handleQuery() {
            this.queryParams.page = 1;
            this.getList();
        },
        /** 表单重置 */
        reset() {
            this.form = {
                id: undefined,
                accountName: undefined,
                password: undefined,
                userName: undefined,
                birthdate: new Date(),
                sex: 1,
                phone: undefined,
                qq: undefined,
                weChat: undefined,
                nativePlace: undefined,
                homeAddress: undefined,
                roleType: 1,
                remark: undefined
            };
            this.resetForm('form');
        },
        /** 新增按钮操作 */
        handleCreate() {
            this.reset();
            this.open = true;
            this.title = '添加用户';
        },
        /** 修改按钮操作 */
        handleUpdate(row) {
            // 重置
            this.reset();
            // 获取用户id
            const userId = row.userId;
            getUser(userId).then(response => {
                this.form = response.data;
                this.open = true;
                this.title = '修改用户';
                this.form.password = '';
            });
        },
        /** 取消按钮操作 */
        cancel() {
            this.open = false;
            this.reset();
        },
        /** 多选框选中数据 */
        handleSelectionChange(selection) {
            this.ids = selection.map(item => item.userId);
        },
        /** 提交按钮 */
        submitForm: function () {
            this.$refs['form'].validate(valid => {
                if (valid) {
                    if (this.form.userId != undefined) {
                        updateUser(this.form).then(response => {
                            if (response.success) {
                                this.$modal.msgSuccess(response.msg);
                                this.open = false;
                                this.getList();
                            } else {
                                this.$modal.msgError(response.msg);
                            }
                        });
                    } else {
                        createUser(this.form).then(response => {
                            if (response.success) {
                                this.$modal.msgSuccess(response.msg);
                                this.open = false;
                                this.getList();
                            } else {
                                this.$modal.msgError(response.msg);
                            }
                        });
                    }
                }
            });
        },

        /** 删除按钮操作 */
        handleDelete(row) {
            const userIds = row.userId || this.ids;
            this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () {
                return deletUser(userIds);
            }).then(() => {
                this.getList();
                this.$modal.msgSuccess('删除成功');
            }).catch(() => {
            });
        }
    }
};
</script>

创作不易,源码非无偿提供,需要获取源码的私信博主

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐