这几天接到了个学生的需求,挺简单的,大概就是按照她的需求做一个疫情期间常态化管理的小程序,由于我对java不熟悉,基本上是边做边学,这里我将对本次项目做个记录
✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨
❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!
愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️❤️❤️
快速预览:
前端gif
后端gif
目录
需求分析
数据库设计
接口设计
统一返回接口
新建base包
新建Result类
package com.example.minipro_cov.base; import lombok.Data; import java.io.Serializable; @Data public class Result implements Serializable { private Integer code; private String message; private Object data; public Result(ResultCode resultCode,Object data){ this.code = resultCode.getCode(); this.message = resultCode.getMsg(); this.data = data; } }
新建ResultCode类
package com.example.minipro_cov.base; /** * @Description: * @author: 夜七天 * @create: 2021/08/07 15:07 */ public enum ResultCode { SUCCESS(200, "成功"), FAILLER(100,"失败"), ; private Integer code; private String msg; public Integer getCode() { return this.code; } public String getMsg() { return this.msg; } ResultCode(Integer code, String msg) { this.code = code; this.msg = msg; } }
使用方法,在控制器里面返回
return Result result = new Result(ResultCode.SUCCESS,"你的数据");
测试结果
登录接口设计
新建userController.java
写入相关接口代码(这个接口不太严谨,第一次做不太清楚又有点赶,后面懒得改了)
//登录接口 @RequestMapping("/login") public Result login(@RequestParam("username") String username, @RequestParam("password") String password){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.select("id","nickname","uname","pwd").like("uname" , username).like("pwd",password); //把select()放在最后面也可以,但我一般喜欢放在最前面,和sql语法保持一致 List<User> userList = userMapper.selectList(userQueryWrapper); if (!userList.isEmpty()){ Result result = new Result(ResultCode.SUCCESS,userList); return result; }else{ Result result = new Result(ResultCode.FAILLER,userList); return result; } }
注册用户接口设计
// 注册用户 @RequestMapping("/regidt") public Result regidt(@RequestParam String nickname, @RequestParam String uname, @RequestParam String pwd){ User user=new User(); user.setNickname(nickname);//设置昵称 user.setUname(uname);//设置学号、工号 user.setPwd(pwd);//设置密码 int result= userMapper.insert(user); if (result==1){ return new Result(ResultCode.SUCCESS,result); } else{ return new Result(ResultCode.FAILLER,result); } }
小程序设计
请求封装
在utils文件夹里面,新建requests.js
代码:
const GET = 'GET'; const POST = 'POST'; const baseURL = 'http://127.0.0.1:8080'; // 接口请求地址 function request(method, url, data) { wx.showLoading({ title: '请求中..', }) console.log(baseURL + url) return new Promise(function(resolve, reject) { let header = { 'content-type': 'application/json' }; wx.request({ url: baseURL + url, method: method, data: method === POST ? JSON.stringify(data) : data, header: header, success(res) { console.log(res.data); //请求成功返回数据 resolve(res.data); wx.hideLoading() }, fail(err) { wx.hideLoading() //请求失败 reject(err) console.log(err); }, complete: function () { // 配对使用(loading消失) wx.hideLoading(); } }) }) } const API = { // 登录 login: (data) => request(GET, `/login`, data) }; module.exports = { API: API }
在需要用的login.js里面引用
const $api = require('../../utils/request').API;
使用方法(登录)
//登录请求封装 $api.login(params).then(res => { console.log(res); })
首页
登录
登录页面制作
app.json里面新建
“pages/login/login”
login.js
const $api = require('../../utils/request').API; Page({ /** * 页面的初始数据 */ data: { username:'', password:'' }, content:function(ee){ let that=this; console.log(ee.detail.value); that.setData({ username:ee.detail.value }) }, goadmin:function(){ let that=this; let params = { username: that.data.username, password: that.data.password } //登录请求封装 $api.login(params).then(res => { console.log(res); if (res.code==200) { wx.showToast({ title: '登录成功', icon:'none' }) } else { wx.showToast({ title: '登录失败', icon:'none' }) } }) //登录请求封装 }, password:function(ee){ let that=this; console.log(ee.detail.value); that.setData({ password:ee.detail.value }) }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { } })
login.wxml
<view class="v1" style="height:{{clientHeight?clientHeight+'px':'auto'}}"> <!-- v2父容器 子view使用绝对布局 --> <view class="v2"> <view class="dltext" style="width: 232rpx; height: 92rpx; display: block; box-sizing: border-box; left: 0rpx; top: -2rpx">登录</view> <!-- 手机号 --> <view class="phoneCs"> <!-- <image src="/images/zhang.png" class="ph"></image> --> <input placeholder="请输入账号" type="number" bindinput="content" /> </view> <!-- 密码 --> <view class=passwordCs"> <!-- <image src="/images/mi.png" class="ps"></image> --> <input placeholder="请输入密码" type="password" bindinput="password" /> </view> <!-- 登录按钮 --> <view class="denglu"> <button class="btn-dl" type="primary" bindtap="goadmin">登录</button> </view> </view> </view>
login.wxss
/* pages/login/login.wxss *//* 最大的父元素 */ .v1{ display: block; position:absolute; width: 100%; background-color: rgb(250, 248, 248); } /* 白色区域 */ .v1 .v2{ position: relative; margin-top: 150rpx; left: 100rpx; width: 545rpx; height: 600rpx; background-color: rgb(250, 248, 248); border-radius: 50rpx; } /* 白色区域内的登录文本 */ .v1 .v2 .dltext{ margin-top: 50rpx; position: absolute; margin-left:50rpx; width: 150rpx; height: 100rpx; font-size: 60rpx; font-family: Helvetica; color: #000000; line-height: 100rpx; letter-spacing: 2rpx; } /* 手机图片+输入框+下划线的父容器view */ .v1 .v2 .phoneCs{ margin-top: 200rpx; margin-left: 25rpx; position: absolute; display: flex; width:480rpx ; height: 90rpx ; background-color: white; } /* 手机图标 */ .v1 .v2 .phoneCs .ph{ margin-top: 5rpx; margin-left: 30rpx; width: 55rpx; height: 55rpx; } /* 手机号输入框 */ .v1 .v2 .phoneCs input{ width: 400rpx; font-size: 30rpx ; margin-top: 25rpx; margin-left: 30rpx; } /* 密码图标+输入框+小眼睛图标+下划线父容器view */ .v1 .v2 .passwordCs{ margin-top: 350rpx; margin-left: 25rpx; position: absolute; display: flex; width:480rpx ; height: 90rpx ; background-color: white; } /* 密码图标 */ .v1 .v2 .passwordCs .ps{ margin-top: 5rpx; margin-left: 30rpx; width: 55rpx; height: 55rpx; } /* 眼睛 图标*/ .v1 .v2 .passwordCs .eye{ margin-top: 5rpx; margin-left: 65rpx; width: 55rpx; height: 55rpx; } /* 密码输入框 */ .v1 .v2 .passwordCs input{ width: 400rpx; font-size: 30rpx ; margin-top: 25rpx; margin-left: 30rpx; } /* 登录按钮容器view */ .v1 .v2 .denglu{ width: 480rpx; height: 80rpx; position: absolute; margin-top:515rpx; margin-left:25rpx; } /* 登录按钮 */ .v1 .v2 .denglu button{ padding: 0rpx; line-height: 70rpx; font-size: 30rpx; width: 100%; height: 100%; border-radius: 5rpx; }
打卡
姓名和学号不可修改,可以在用户管理修改
在app.json里面加入 “pages/ls_recod/ls_recod”,开发工具就会生成目录
ls_recod.wxml
<view> <block wx:for="{{healthy_data}}" wx:key="index"> <tui-card> <view slot="body" class="tui-default" style="height: 80rpx;display: flex;flex-direction: row;align-items: center;"> <image src="{{avatarUrl}}" mode="widthFix" style="width: 80rpx;height: 80rpx;border-radius: 10rpx;"/> <text style="margin-left: 10rpx;">{{name}}</text> <text style="margin-left: 10rpx;">{{sno_id}}</text> </view> <view slot="body" class="tui-default" style="display: flex;flex-direction: column;"> <text>地点:{{item.address}}</text> <text wx:if="{{item.state=='1'}}">身体状况:健康</text> <text wx:if="{{item.state=='0'}}">身体状况:不适</text> <text wx:if="{{item.sp=='0'}}" style="color: #24B1F9;">未审批</text> <text wx:if="{{item.sp=='1'}}" style="color: #3CDE6D;">审批通过</text> <text wx:if="{{item.sp=='2'}}" style="color: red;">审批不通过</text> <textarea value="申请理由:{{item.reason}}" style="height: 120rpx;"/> </view> <view slot="footer" class="tui-default"> <tui-tag type="light-green" size="small" tui-tag-class="tui-inline">{{item.creatTime}}</tui-tag> </view> </tui-card> </block> </view>
ls_recod.js
const $api = require('../../utils/request').API; Page({ data: { name:'', sno_id:'', healthy_data:[], avatarUrl:'', }, onLoad: function (options) { let that=this; that.get_usernfo(); }, get_usernfo:function(){ let that=this; var user_list=wx.getStorageSync('user')||[]; if (user_list=='') { console.log("kong"); wx.showToast({ title: '请先登录.', icon:'none' }) setTimeout(function(){ wx.navigateTo({ url: '/pages/login/login' }) },1100) } else { console.log("bu kong"); that.setData({ name:user_list[0]['nickname'], sno_id:user_list[0]['uname'] }) that.setData({ avatarUrl:wx.getStorageSync('avatarUrl')||'/static/denglu-copy.png', }) that.get_healthy_mydata(); } }, get_healthy_mydata(){ let that=this; let params = { sno_id: that.data.sno_id } //登录请求封装 $api.query_leavschool(params).then(res => { console.log(res); if (res.code==200) { wx.showToast({ title: '数据获取成功', icon:'none' }) that.setData({ healthy_data:res.data }) } else { wx.showToast({ title: '数据获取失败', icon:'none' }) } }) //登录请求封装 }, })
个人信息修改
可以进行修改编辑自己的个人信息和登录密码
我的打卡
含有打卡记录轨迹
离校申请
离校申请记录
部分相关代码
ls_recod.wxml
<view> <block wx:for="{{healthy_data}}" wx:key="index"> <tui-card> <view slot="body" class="tui-default" style="height: 80rpx;display: flex;flex-direction: row;align-items: center;"> <image src="{{avatarUrl}}" mode="widthFix" style="width: 80rpx;height: 80rpx;border-radius: 10rpx;"/> <text style="margin-left: 10rpx;">{{name}}</text> <text style="margin-left: 10rpx;">{{sno_id}}</text> </view> <view slot="body" class="tui-default" style="display: flex;flex-direction: column;"> <text>地点:{{item.address}}</text> <text wx:if="{{item.state=='1'}}">身体状况:健康</text> <text wx:if="{{item.state=='0'}}">身体状况:不适</text> <text wx:if="{{item.sp=='0'}}" style="color: #24B1F9;">未审批</text> <text wx:if="{{item.sp=='1'}}" style="color: #3CDE6D;">审批通过</text> <text wx:if="{{item.sp=='2'}}" style="color: red;">审批不通过</text> <textarea value="申请理由:{{item.reason}}" style="height: 120rpx;"/> </view> <view slot="footer" class="tui-default"> <tui-tag type="light-green" size="small" tui-tag-class="tui-inline">{{item.creatTime}}</tui-tag> </view> </tui-card> </block> </view>
后端管理设计
这个项目用到的技术都是我第一次接触的,可能会存在不规范的情况,大佬勿喷哈,用到的技术vue2 +element
登录
用户管理
打卡管理
离校管理
相关代码
handleDelete(row,ee){ //驳回操作 console.log(row); console.log(ee); const params = { id: ee.id, sp:2 }; this.$http({ url: 'http://localhost:8088/edit_shenpi_lea',params }).then((res)=>{ console.log('res',res.data); this.tableData=res.data.data; this.$message({ message: '驳回成功', type: 'success' }); },(err)=>{ this.$message('网络请求失败'); console.log('err',err); }); },
编辑用户信息
相关代码
edit_submit(){ // this.$message(this.tableData[0].id); //提交数据 this.$message({ message: '编辑成功', type: 'success' }); this.dialogFormVisible=false; const params = { id: this.id, nickname: this.nickname, uname: this.uname, pwd:this.pwd }; this.$http({ url: 'http://localhost:8088/user_edit',params }).then((res)=>{ console.log('res',res.data); this.tableData=res.data.data; this.$message('修改成功'); },(err)=>{ this.$message('网络请求失败'); console.log('err',err); }); },
退出登录
相关代码
quit(){ this.$message({ message: '退出中', type: 'success' }); sessionStorage.clear(); this.login_=false; location.reload()//刷新一次 },
运行部署方法
- 1、倒入后端java代码到idea ,配置数据库连接,下载依赖文件,运行run
- 2、hbuilderx打开后端管理系统文件夹,执行 npm install 然后执行npm run serve,访问localhost:8080即可默认 账户密码admin 123
- 3、部署小程序代码,修改requests.js文件里面的const baseURL = ‘http://127.0.0.1:8088’; 运行即可