当前位置: 首页 > news >正文

基于Java,SpringBoot,Vue,HTML家政服务预约系统设计

摘要

本文聚焦于基于Java、SpringBoot、Vue和HTML技术的家政服务预约系统的设计与实现。该系统旨在为家政服务的供需双方搭建一个便捷、高效的在线交互平台。后端采用Java语言结合SpringBoot框架,充分利用SpringBoot的自动配置和快速开发特性,实现系统业务逻辑的高效处理,如用户管理、服务订单管理、家政人员信息管理等功能。数据库采用[具体数据库名称],确保数据的安全存储和快速访问。前端基于Vue框架和HTML技术进行开发,通过Vue组件化开发模式和响应式设计,打造出操作流畅、界面友好的用户交互界面,方便用户进行家政服务的浏览、预约以及家政人员的接单和服务反馈。同时,利用HTML和CSS3实现页面的布局和样式美化,提升用户体验。系统还具备完善的安全机制,如用户身份认证、数据加密传输等,保障用户信息和交易的安全性。经测试,该家政服务预约系统运行稳定,功能满足实际业务需求,为家政服务行业的信息化管理提供了有效的解决方案,具有一定的实用价值和推广意义。

功能介绍

管理员、雇员、雇主三种用户角色,三种角色均有后台管理,雇主和雇员还有前台页面;

管理员:个人中心、雇主管理、雇员管理、资料认证管理、项目类型管理、服务项目管理、需求信息管理、服务预约管理、申请预约管理、签订合同管理、电子签名管理、评价管理、意见反馈、系统管理等;

雇主:个人中心、、需求信息管理、申请预约管理、服务预约管理、签订合同管理、电子签名管理、评价管理、咨询管理等,以及对应前台。

雇员:个人中心、资料认证管理、服务项目管理、申请预约管理、签订合同管理、电子签名管理、评价管理、咨询管理等,以及对应前台。

技术介绍

后端:Java语言的Spring Boot框架、MySQL数据库、Maven依赖管理等;

前端:后台使用Vue、element-ui、axios等,前台使用HTML、layUI、element-ui等。

登录页面代码

<template><div><div class="container loginIn"><div :class="2 == 1 ? 'left' : 2 == 2 ? 'left center' : 'left right'"><el-form class="login-form" label-position="left" :label-width="1 == 3 || 1 == 2 ? '30px': '0px'"><div class="title-container"><h3 class="title">家政服务预约平台登录</h3></div><el-form-item :style='{"padding":"0 0 0 30px","boxShadow":"0 0 6px rgba(0,0,0,0)","margin":"0px 0px 12px 15px","borderColor":"rgba(0,0,0,0)","backgroundColor":"rgba(144, 238, 144, 0)","borderRadius":"0","borderWidth":"0","width":"500px","borderStyle":"solid","height":"auto"}' :label="1 == 3 ? '用户名' : ''" :class="'style'+1"><span v-if="1 != 3" class="svg-container" style="color:rgba(74, 50, 22, 1);line-height:30px;font-size:16px;width:30px;padding:0;margin:8px 0px 0px 20px;radius:0;border-width:0;border-style:solid;border-color:rgba(0,0,0,0);background-color:rgba(0, 206, 209, 0);box-shadow:0 0 6px rgba(0,0,0,0);}"><svg-icon icon-class="user" /></span><el-input placeholder="请输入用户名" name="username" type="text" v-model="rulesForm.username" /></el-form-item><el-form-item :style='{"padding":"0 0 0 30px","boxShadow":"0 0 6px rgba(0,0,0,0)","margin":"0px 0px 12px 15px","borderColor":"rgba(0,0,0,0)","backgroundColor":"rgba(144, 238, 144, 0)","borderRadius":"0","borderWidth":"0","width":"500px","borderStyle":"solid","height":"auto"}' :label="1 == 3 ? '密码' : ''" :class="'style'+1"><span v-if="1 != 3" class="svg-container" style="color:rgba(74, 50, 22, 1);line-height:30px;font-size:16px;width:30px;padding:0;margin:8px 0px 0px 20px;radius:0;border-width:0;border-style:solid;border-color:rgba(0,0,0,0);background-color:rgba(0, 206, 209, 0);box-shadow:0 0 6px rgba(0,0,0,0);"><svg-icon icon-class="password" /></span><el-input placeholder="请输入密码" name="password" type="password" v-model="rulesForm.password" /></el-form-item><el-form-item :style='{"padding":"0 0 0 30px","boxShadow":"0 0 6px rgba(0,0,0,0)","margin":"0px 0px 12px 15px","borderColor":"rgba(0,0,0,0)","backgroundColor":"rgba(144, 238, 144, 0)","borderRadius":"0","borderWidth":"0","width":"500px","borderStyle":"solid","height":"auto"}' v-if="1 == '1'" class="code" :label="1 == 3 ? '验证码' : ''" :class="'style'+1"><span v-if="1 != 3" class="svg-container" style="color:rgba(74, 50, 22, 1);line-height:30px;font-size:16px;width:30px;padding:0;margin:8px 0px 0px 20px;radius:0;border-width:0;border-style:solid;border-color:rgba(0,0,0,0);background-color:rgba(0, 206, 209, 0);box-shadow:0 0 6px rgba(0,0,0,0);"><svg-icon icon-class="code" /></span><el-input placeholder="请输入验证码" name="code" type="text" v-model="rulesForm.code" /><div class="getCodeBt" @click="getRandCode(4)"><span v-for="(item, index) in codes" :key="index" :style="{color:'rgba(255, 255, 255, 1)',transform:item.rotate,fontSize:'16px'}">{{ item.num }}</span></div></el-form-item><el-form-item v-if="roles.length>1" label="角色" prop="loginInRole" class="role" style="display: flex;align-items: center;"><el-radiov-for="item in roles"v-bind:key="item.roleName"v-model="rulesForm.role":label="item.roleName">{{item.roleName}}</el-radio></el-form-item><el-form-item v-if="roles.length==1" label=" " prop="loginInRole" class="role" style="display: flex;align-items: center;"></el-form-item><el-button type="primary" @click="login()" class="loginInBt">{{'1' == '1' ? '登录' : 'login'}}</el-button><el-form-item class="setting"><!-- <div style="color:${template2.back.login.loginInSettingFontColor}" class="reset">修改密码</div> --></el-form-item></el-form></div></div></div>
</template>
<script>import menu from "@/utils/menu";export default {data() {return {rulesForm: {username: "",password: "",role: "",code: '',},menus: [],roles: [],tableName: "",codes: [{num: 1,color: '#000',rotate: '10deg',size: '16px'},{num: 2,color: '#000',rotate: '10deg',size: '16px'},{num: 3,color: '#000',rotate: '10deg',size: '16px'},{num: 4,color: '#000',rotate: '10deg',size: '16px'}],};},mounted() {let menus = menu.list();this.menus = menus;for (let i = 0; i < this.menus.length; i++) {if (this.menus[i].hasBackLogin=='是') {this.roles.push(this.menus[i])}}},created() {this.getRandCode()},methods: {register(tableName){this.$storage.set("loginTable", tableName);this.$router.push({path:'/register'})},// 登陆login() {let code = ''for(let i in this.codes) {code += this.codes[i].num}if ('1' == '1' && !this.rulesForm.code) {this.$message.error("请输入验证码");return;}if ('1' == '1' && this.rulesForm.code.toLowerCase() != code.toLowerCase()) {this.$message.error("验证码输入有误");this.getRandCode()return;}if (!this.rulesForm.username) {this.$message.error("请输入用户名");return;}if (!this.rulesForm.password) {this.$message.error("请输入密码");return;}if(this.roles.length>1) {if (!this.rulesForm.role) {this.$message.error("请选择角色");return;}let menus = this.menus;for (let i = 0; i < menus.length; i++) {if (menus[i].roleName == this.rulesForm.role) {this.tableName = menus[i].tableName;}}} else {this.tableName = this.roles[0].tableName;this.rulesForm.role = this.roles[0].roleName;}this.$http({url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,method: "post"}).then(({ data }) => {if (data && data.code === 0) {this.$storage.set("Token", data.token);this.$storage.set("role", this.rulesForm.role);this.$storage.set("sessionTable", this.tableName);this.$storage.set("adminName", this.rulesForm.username);this.$router.replace({ path: "/index/" });} else {this.$message.error(data.msg);}});},getRandCode(len = 4){this.randomString(len)},randomString(len = 4) {let chars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k","l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v","w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G","H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R","S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2","3", "4", "5", "6", "7", "8", "9"]let colors = ["0", "1", "2","3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]let sizes = ['14', '15', '16', '17', '18']let output = [];for (let i = 0; i < len; i++) {// 随机验证码let key = Math.floor(Math.random()*chars.length)this.codes[i].num = chars[key]// 随机验证码颜色let code = '#'for (let j = 0; j < 6; j++) {let key = Math.floor(Math.random()*colors.length)code += colors[key]}this.codes[i].color = code// 随机验证码方向let rotate = Math.floor(Math.random()*60)let plus = Math.floor(Math.random()*2)if(plus == 1) rotate = '-'+rotatethis.codes[i].rotate = 'rotate('+rotate+'deg)'// 随机验证码字体大小let size = Math.floor(Math.random()*sizes.length)this.codes[i].size = sizes[size]+'px'}},}
};
</script>

演示视频

Java,SpringBoot,Vue,HTML家政服务预约

相关文章:

  • C语言学习之两个数值交换的算法
  • SOME/IP中”客户端消费“及”服务端提供”的解析
  • MCP 集合网站
  • Kotlin集合操作陷阱与突围:如何优雅地边遍历边修改MutableList
  • TestNG 单元测试详解
  • Spring Boot循环依赖全解析:原理、解决方案与最佳实践
  • DDS波形发生器仿真及技术原理
  • rabbitmq引入C++详细步骤
  • Go之Slice和数组:深入理解底层设计与最佳实践
  • 边缘计算场景下的模型轻量化:TensorRT部署YOLOv7的端到端优化指南
  • 云原生周刊:K8s 中的 GPU 共享
  • 【Pandas】pandas DataFrame iterrows
  • WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:
  • 若依RBAC权限控制SpringSecurity(自用)
  • WPF GDI 画 晶圆Mapping图
  • CSS 美化页面(三)
  • MegaTTS3: 下一代高效语音合成技术,重塑AI语音的自然与个性化
  • 浏览器运行Pytorch无法启用显卡
  • poll为什么使用poll_list链表结构而不是数组 - 深入内核源码分析
  • Java文件批量复制工具实现解析
  • 辽宁辽阳市白塔区一饭店发生火灾,当地已启动应急响应机制
  • 俄罗斯纪念卫国战争胜利80周年阅兵式首次彩排在莫斯科举行
  • 国务院安委会对辽宁辽阳一饭店重大火灾事故查处挂牌督办
  • 上海科创的三种品格
  • A股三大股指小幅低收:电力股大幅调整,两市成交10221亿元
  • 找化学的答案,解人类的命题:巴斯夫的“变革者”成长之道