项目介绍 :
Spring Boot + SpringMVC + MyBatis+ Mysql + druid + Vue 开发的前后端分离的社区养老院管理系统
运行环境:
最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
IDE环境:
Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以
适用于:
由于本程序规模不大,可供课程设计,毕业设计学习演示之用
内置功能
管理员角色包含以下功能:
- 管理员登录
- 用户管理
- 床位类型管理
- 床位管理
- 护工管理
- 老人管理
- 预约登记管理
- 来访登记管理
- 健康记录管理
- 费用管理
- 外出记录管理
护工角色包含以下功能
- 护工登录
- 床位类型查看
- 床位查看
- 护工查看
- 老人查看
- 健康信息上报管理
- 费用查看等功能
项目预览
用户管理控制层:
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>
创作不易,源码非无偿提供,需要获取源码的私信博主