需求说明:

需求是填写一个表单时暂时保存输入项,不提交表单

回来再次填写时可以恢复或者放弃,或者更改内容继续暂存

放两张UI图,一个移动端,一个手机端:

逻辑分析:

存储方式有这么几种,Cookie存,LocalStorage存,数据库存

用Web客户端存就是存取方便,不需要鉴别用户身份,但是用户不能跨端访问,就是换一个浏览器就没用了

用数据库存就要记录用户身份,操作的业务模块位置

老板确定要用db存,就没什么选型争议的了

由于每个业务的表单数据是不一样的,存入表中的数据类型是序列化的json, 后台不对表单数据操作

区分标识: 用户标识 + 业务模块标识

记录内容:用户标识 ,业务模块标识,表单JSON,创建时间

处理流程如下:

1、点击【暂存】按钮,填写的表单输入项通过了表单校验后,将表单数据json序列化,调用存入接口存表,允许重复暂存(即更新暂存内容)

2、每次点击新增操作,展开表单弹窗时,调用获取接口检查是否存在暂存数据,如果存在暂存数据,弹出确认提示框让用户选择 [放弃] 或 [加载]

3、加载,就把获取接口返回的数据反序列化即可

4、放弃,调用移除接口把暂存移除

表结构:

CREATE TABLE `sys_co_draft` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '系统编码',
`dr_ident` varchar(32) NOT NULL COMMENT '业务标识',
`dr_content` text NOT NULL COMMENT '业务内容 JSON字符串',
`creator` varchar(32) NOT NULL COMMENT '创建用户',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='暂存信息';

  

功能需要的接口:

/**
* 暂存或更新数据
*
* @param dto
* @return boolean
* @author Cloud9
* @createTime 2022/10/18 11:52
*/
@PostMapping("/save")
public boolean saveData(@RequestBody SysCoDraftDTO dto) {
return sysCoDraftService.saveData(dto);
} /**
* 载入暂存数据
*
* @param dto
* @return java.lang.String
* @author Cloud9
* @createTime 2022/10/18 11:54
*/
@PostMapping("/get")
public SysCoDraftDTO getData(@RequestBody SysCoDraftDTO dto) {
return sysCoDraftService.getData(dto);
} /**
* 放弃暂存数据
*
* @param dto
* @return java.lang.String
* @author Cloud9
* @createTime 2022/10/18 11:55
*/
@PostMapping("/remove")
public boolean removeData(@RequestBody SysCoDraftDTO dto) {
return sysCoDraftService.removeData(dto);
}

  

接口逻辑:

注意前端序列化传给java的时候引号会被转义,这里用Apache包的字符处理工具类进行反转处理了

@Override
public SysCoDraftDTO getData(SysCoDraftDTO dto) {
QueryWrapper<SysCoDraftDTO> query = Wrappers.<SysCoDraftDTO>query()
.eq("dr_ident", dto.getDrIdent())
.eq("creator", LoginUserContext.getUser().getLoginName());
return this.baseMapper.selectOne(query);
} @Override
public boolean saveData(SysCoDraftDTO dto) {
String drIdent = dto.getDrIdent();
String loginName = LoginUserContext.getUser().getLoginName();
String drContent = StringEscapeUtils.unescapeHtml4(dto.getDrContent()); int res;
QueryWrapper<SysCoDraftDTO> query = Wrappers.<SysCoDraftDTO>query()
.eq("dr_ident", drIdent)
.eq("creator", loginName);
SysCoDraftDTO sysCoDraftDTO = this.baseMapper.selectOne(query);
if (Objects.isNull(sysCoDraftDTO)) {
sysCoDraftDTO = new SysCoDraftDTO()
.setCreator(loginName)
.setDrIdent(drIdent)
.setDrContent(drContent)
.setCreateTime(new Date());
res = this.baseMapper.insert(sysCoDraftDTO);
} else {
sysCoDraftDTO.setDrContent(drContent);
sysCoDraftDTO.setCreateTime(new Date());
res = this.baseMapper.updateById(sysCoDraftDTO);
}
return Constant.RESULT_SUCCESS.equals(res);
} @Override
public boolean removeData(SysCoDraftDTO dto) {
QueryWrapper<SysCoDraftDTO> query = Wrappers.<SysCoDraftDTO>query()
.eq("dr_ident", dto.getDrIdent())
.eq("creator", LoginUserContext.getUser().getLoginName());
int delete = this.baseMapper.delete(query);
return Constant.RESULT_SUCCESS.equals(delete);
}

  

前端Demo

1、涉及暂存逻辑的关键变量:

/* 业务ID标识 */
businessIdentity: 'finExApply', /* 表单元素ref标识 */
formRef: 'formRefKey', /* 更新或新增的Flag变量 */
isUpdate: false

2、组件引入暂存接口

import { getDraftData, saveDraftData, removeDraftData } from '@/api/system/common/draft'

3、提交按钮位置追加暂存按钮,暂存的功能只在新增时提供:

<div align="center" style="position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%)">
<el-button type="primary" @click="submit">确定</el-button>
<el-button v-if="!isUpdate" @click="staging">暂存</el-button>
<el-button @click="cancel">取消</el-button>
</div>

4、表单弹窗创建周期函数需要执行:

created() {
/* 判断当前表单弹窗要进行的是新增,还是修改操作 */
this.isUpdate = !!this.form.id /* 调用封装的暂存表单恢复方法 */
this.recoverStaging() /* 加载字典数据 */
this.initialApRoTypeList()
this.initialProjectList()
this.initialCompanyList()
if (this.isUpdate) this.initialAllocatedDepartmentList(this.form.sysArCoId)
this.initialRoNameList()
}

5、暂存方法与恢复暂存方法实现:

async staging() {
/* 复用表单校验 */
this.$refs[this.formRef].validate(async valid => {
if (!valid) return this.$message.error('请完善表单信息')
const param = {
drIdent: this.businessIdentity,
drContent: JSON.stringify(this.form)
}
await saveDraftData(param)
this.$message.success('暂存成功')
})
},
async recoverStaging() {
/* 不是新增操作跳过 */
if (this.isUpdate) return
const param = { drIdent: this.businessIdentity }
const { data: res } = await getDraftData(param)
/* 没有暂存数据跳过 */
if (!res) return /* 弹出确认框 */
this.$confirm(`当前页面存在 ${res.createTime} 编辑过但未提交的数据 是否载入?`, '暂存数据导入', {
confirmButtonText: '加载',
cancelButtonText: '丢弃',
distinguishCancelAndClose: true,
type: 'none'
}).then(() => {
this.form = JSON.parse(res.drContent)
/* 回显字典数据 */
this.initialAllocatedDepartmentList(this.form.sysArCoId)
this.initialRoNameList()
}).catch(async(action) => {
if (action === 'close') return
const param = { drIdent: this.businessIdentity }
await removeDraftData(param)
})
}

 

效果:

【Java】暂存逻辑的更多相关文章

  1. SSIS Design5:使用暂存

    以数据流的方式来设计Package,将核心数据处理移动到数据流中,一般情况下,能够减少临时表的创建,获得较高的处理性能,在某些情况下,使用暂存表(staging table)能够优化package设计 ...

  2. Package 设计3:数据源的提取和使用暂存

    SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 在使用SSIS Package处理海量数据时, ...

  3. Java编程的逻辑 (3) - 基本运算

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  4. Java编程的逻辑 (11) - 初识函数

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. Java编程的逻辑 (14) - 类的组合

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. Java编程的逻辑 (16) - 继承的细节

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  7. Java编程的逻辑 (18) - 为什么说继承是把双刃剑

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. Java编程的逻辑 (32) - 剖析日期和时间

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  9. Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  10. Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

随机推荐

  1. 忘记root密码,破解root密码

    破解root用户密码: 1.按e进入内核参数重置界面 2.找到开头Linux的段落,行尾输入rd.break 3.按ctrl+x 进入可选步骤 5.以读写方式挂载sysyroot 修改root密码要挂 ...

  2. mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.

    在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...

  3. U-Boot命令使用

    帮助命令 help 所有命令提示: h ? help 某一条命令提示: ? 命令名 help 命令名 信息查询命令 bdinfo 查看板子信息: => bdinfo arch_number = ...

  4. ETL工具-nifi干货系列 第三讲 nifi web ui 使用教程

    1.nifi 服务启动之后,浏览器输入https://localhost:8443/nifi ,匿名登录或者输入用户名密码进入操作页面,如下图所示: 2.组件工具栏 处理器,鼠标放到图标上提示Proc ...

  5. CICD介绍

    1.学习背景 当公司的服务器架构越来越复杂,需要频繁的发布新配置文件,以及新代码: 但是如果机器部署数量较多,发布的效率必然很低: 并且如果代码没有经过测试环境,预生产环境层层测试,最终才到生产环境, ...

  6. 地铁查询app 结对作业三

    经过今天一下午的奋斗 安卓app 只剩下最难的部分了 最短路径问题 我们考虑用迪杰斯特拉算法 不过 没有做出来 还要继续去学习一下这个代码 并寻求网上代码的帮助

  7. CUDA程序优化-1.基础介绍

    简介 本合集主要介绍我在开发分布式异构训练框架时的CUDA编程实践和性能优化的相关内容.主要包含以下几个部分: 介绍CUDA的基本概念和架构,帮助读者建立对CUDA的初步认识,包括硬件架构/CUDA基 ...

  8. Vulnhub Fall Walkthrough

    Recon 二层本地扫描,发现目标靶机. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently scanning: ...

  9. linux下后台运行程序

    文章目录 背景 nohup命令 setsid命令 pm2 背景 后台运行程序的时候,如果退出当前的终端(session),你运行的所有程序(包括后台程序),都将被关闭. 原因是:你运行的程序都是你的终 ...

  10. Linux连接wifi,亲测成功

    环境: 装有CentOS-7的物理机 步骤: 搜索日志,查看是否有安装固件的请求: 1.dmesg | grep firmware #查看是否需要安装wifi固件 如果需要安装固件:(可以先跳过此步骤 ...