一二三应用开发平台应用开发示例(11)——收藏夹功能高代码改造及总结

news2024/9/29 21:18:08

背景

前面使用低代码配置,把实体配置、库表和模式化的代码生成出来了,实际上是用平台帮忙开发人员把“体力活”给干了。接下来,就需要在此基础上进行个性化逻辑的开发。

文档收藏

完善实体模型

文档收藏夹我们原先配置了三个关键属性,分别是对象类型、对象标识和用户标识。
对于前端展现,需要名称、类型、大小等关键信息,我们使用平台低代码配置功能,在原模型属性的基础上,添加3个属性:名称、类型和大小。
image.png
这三个属性注意选择非库表存储。
image.png
平台生成库表时会忽略这些属性,生成实体类时自动为属性添加注解@TableField(exist = false),如下:

 /********非库表存储属性*****/
/**
 * 名称
 */
@TableField(exist = false)
private String name;

/**
 * 类型
 */
@TableField(exist = false)
private String type;

/**
 * 大小
 */
@TableField(exist = false)
private String size;

调整后端实现

收藏可能是文件夹,也可能是文档,因此我们需要编写自定义sql来做并集查询,遵循window资源管理器的习惯,先显示文件夹,再显示文件,通过排序来实现。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="tech.abc.edoc.edoc.mapper.DocumentFavoriteMapper">
    <select id="getFavoriteList" resultType="tech.abc.edoc.edoc.entity.DocumentFavorite">
        select * from (
                          select t1.id,t1.object_type,t1.object_id,t2.name,'' as size,'文件夹' as type from ed_document_favorite t1
                              left join ed_folder t2 on t1.object_id=t2.id
                          where t1.object_type='FOLDER'
                            and t1.delete_flag='NO'
                            and t1.user_id=#{userId}
                            and t2.name like CONCAT('%', #{name}, '%')
                          union
                          select t1.id,t1.object_type,t1.object_id,t2.name,t2.size,t2.type from ed_document_favorite t1
                              left join ed_document t2 on t1.object_id=t2.id
                          where t1.object_type='DOCUMENT'
                            and t1.delete_flag='NO'
                            and t1.user_id=#{userId}
                            and t2.name like CONCAT('%', #{name}, '%')
                      ) t
        order by object_type desc,name
    </select>
</mapper>

mapper

public interface DocumentFavoriteMapper extends BaseMapper<DocumentFavorite> {

    /**
     * 获取收藏列表
     *
     * @param userId 用户
     * @param name  名称
     * @return {@link List}<{@link DocumentFavorite}>
     */
    List<DocumentFavorite> getFavoriteList(@Param("userId") String userId,@Param("name") String name);
}

服务实现

   public List<DocumentFavorite> getFavoriteList(String name) {
        //获取当前用户的收藏列表
        return documentFavoriteMapper.getFavoriteList(UserUtil.getId(),name);

    }

控制器

    /**
     * 获取收藏列表
     */
    @GetMapping("/getFavoriteList")
    @SystemLog(value = "文档收藏夹-列表")
    @AllowAll
    public ResponseEntity<Result> getFavoriteList(String name) {
        List<DocumentFavorite> list= documentFavoriteService.getFavoriteList(name);
        List<DocumentFavoriteVO> voList=mapperFacade.mapAsList(list,DocumentFavoriteVO.class);
        return ResultUtil.success(list);
    }

配置列表视图

只配置一个列表视图即可,页面刷新和删除按钮,名称作为查询条件,结果显示名称、类型和大小,行按钮是预览、下载和查看。
image.png

调整列表视图

在平台自动化生成的基础上调整,最终实现效果如下:
image.png
行按钮根据类型(文件夹/文件)来动态显示或隐藏,并设置link属性,整体UI更美观协调。

<el-table-column fixed="right" label="操作" width="160">
    <template #default="scope">
      <el-button
        v-if="scope.row.objectType === $constant.POP_DOCUMENT_TYPE_DOCUMENT"
        type="primary"
        link
        @click="previewDocument(scope.row)"
        >预览</el-button
      >
      <el-button
        v-if="scope.row.objectType === $constant.POP_DOCUMENT_TYPE_DOCUMENT"
        type="primary"
        link
        @click="downloadDocument(scope.row)"
        >下载</el-button
      >
      <el-button
        type="primary"
        link
        v-if="scope.row.objectType === $constant.POP_DOCUMENT_TYPE_FOLDER"
        @click="viewFolder(scope.row)"
        >查看</el-button
      >
    </template>
</el-table-column>

覆写加载数据loadData方法,变更默认调用page方法为获取列表getFavoriteList,并传入查询条件。

 // 获取表格数据
    loadData() {
      return new Promise((resolve) => {
        this.loading = true
        this.$api.edoc.documentFavorite
          .getFavoriteList(this.queryCondition.name)
          .then((res) => {
            this.tableData = res.data
            resolve()
          })
          .finally(() => {
            this.loading = false
            this.currentId = this.$constant.NO_ITEM_SELECTED
          })
      })
    }

覆写表格双击操作,根据类型动态处理,如是文件夹则切换到文档库页面,如是文件,则打开预览页面。

    // 处理表格双击
    rowDoubleClick(row) {
      if (row.objectType === this.$constant.POP_DOCUMENT_TYPE_FOLDER) {
        // 文件夹,切换到文档库页面
        this.viewFolder(row)
      } else if (row.objectType === this.$constant.POP_DOCUMENT_TYPE_DOCUMENT) {
        // 文档,预览
        this.previewDocument(row)
      }
    },

预览、下载、查看操作如下:

 previewDocument(row) {
    this.$refs.previewDocument.show(row.objectId, row.name)
  },
  downloadDocument(row) {
    this.$api.edoc.document.download(row.objectId)
  },
  viewFolder(row) {
    // 跳转到文档库并自动展开,当文档库页面已打开的情况下会无法展开,因此先删除tab页
    const view = { path: '/edoc/document', name: 'document' }
    closeTab(view)
    this.$router.push({ name: 'document', query: { id: row.objectId } })
  }

总结

至此,本系列完结。
我们来回顾下,为了更直观地展示如何基于平台进行业务应用开发,以文档管理系统为例的实现进行详细说明。在这个过程中,涵盖了从新增前后端功能模块,到通过低代码配置实体、模型、视图,再到生成库表和代码的全过程。此外,我们还将讨论如何配置权限和菜单,以及如何使用数据字典等辅助功能。
在平台生成的代码基础上,还指导使用者如何进行前端界面的调整和后端业务逻辑的实现。这将有助于使用者更好地发挥平台的灵活性,根据实际需求进行定制化的开发。
通过这份手册的指引,我相信使用者将能够快速上手应用开发平台,充分利用平台提供的各项功能,实现高效、稳定的业务应用开发。同时,遵循最佳实践也将有助于发挥平台的最大价值,提升整体的开发效率和质量。

最后,放几张文档管理系统的最终实现截图:

文档库

收藏夹

文档上传

授权模式

带时效的文档分享

版本查看、预览、恢复!

全文搜索

开发平台资料

平台名称:一二三应用开发平台
平台简介:企业级通用低代码应用开发平台,免费全开源可商用
设计资料:csdn专栏
开源地址:Gitee
开源协议:MIT

应用系统资料

应用名称:一二三文档管理系统
应用简介: 企事业单位一站式文档管理系统,让组织内文档管理有序,协作高效、安全可控
设计文档:csdn专栏
开源地址:Gitee
开源协议:MIT

如果您在阅读本文时获得了帮助或受到了启发,希望您能够喜欢并收藏这篇文章,为它点赞~
请在评论区与我分享您的想法和心得,一起交流学习,不断进步,遇见更加优秀的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mind+】掌控板入门教程04 迷你动画片

还记得小时候每天放学必看的动画片吗&#xff1f;还记得那些年陪伴我一起长大的卡通人物吗&#xff1f;勇救爷爷的葫芦娃&#xff0c;我们的朋友小哪吒&#xff0c;相信这些经典的动画形象已经成为了一代人童年的美好回忆。今天就让我们用掌控板来制作一部迷你动画片吧。 项目示…

stm32入门学习10-I2C和陀螺仪模块

&#xff08;一&#xff09;I2C通信 &#xff08;1&#xff09;通信方式 I2C是一种同步半双工的通信方式&#xff0c;同步指的是通信双方时钟为一个时钟&#xff0c;半双工指的是在同一时间只能进行接收数据或发送数据&#xff0c;其有一条时钟线&#xff08;SCL&#xff09;…

代码随想录——买卖股票的最佳时机 IV(Leetcode 188)

题目链接 动态规划 class Solution {public int maxProfit(int k, int[] prices) {int[][] dp new int[prices.length][2 * k 1];// 初始化for(int i 1; i < 2 * k 1; i i 2){dp[0][i] -prices[0];}// dp更新寻找最大利润for(int i 1; i < prices.length; i){…

使用Halcon变换与校正图像

使用Halcon变换与校正图像 文章目录 使用Halcon变换与校正图像1. 二维图像的平移、旋转和缩放1.图像的平移2.图像的旋转3.图像的缩放2. 图像的仿射变换3. 投影变换4 实例&#xff1a;透视形变图像校正 由于相机拍摄的时候可能存在角度偏差&#xff0c;因此实际获得的画面可能会…

(C23/C++23) 语句末尾的标签

文章目录 &#x1f516;前言&#x1f3f7;️ref&#x1f3f7;️标号 &#x1f516;兼容&#x1f3f7;️23标准前&#x1f3f7;️23标准后&#x1f3f7;️原因 &#x1f516;未兼容&#x1f516;END&#x1f31f;关注我 &#x1f516;前言 &#x1f3f7;️ref C23提案复合语句末…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两数之和绝对值最小(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

基于机器学习和深度学习的时间序列分析和预测(Python)

时间序列数据与其它数据不同主要是因为时间序列数据在时间维度上存在依赖关系&#xff0c;这说明在时间序列数据当中过去的历史数据当中隐藏着一些时间序列数据固有的特性&#xff0c;例如&#xff0c;周期性、趋势性、不规则性等。时间序列预测便是通过不同的方法来捕捉这种规…

【抽象工厂模式】从理论到实战:构建可扩展的软件家族(设计模式系列)

文章目录 Java设计模式系列&#xff1a;抽象工厂模式详解1. 引言抽象工厂模式概述为何选择抽象工厂模式 2. 基础知识回顾Java基础概念复习面向对象编程原则设计模式的原则和目的 3. 抽象工厂模式的定义定义与解释模式的目的与其他工厂模式的区别 4. 抽象工厂模式的结构抽象产品…

【Android】数据持久化——数据存储

持久化技术简介 在你打开完成了一份PPT之后关闭程序&#xff0c;再次打开肯定是希望之前的内容还存在在电脑上&#xff0c;一打开PPT&#xff0c;之前的内容就自动出现了。数据持久化就是将那些内存中的瞬时数据保存到存储设备中&#xff0c;保证即使在手机或电脑关机的情况下…

React 学习——别名路径配置(可以使用@代表src),引用文件时使用;联想路径提示

一.别名路径配置 1、安装craco &#xff08;npm i -D craco/craco&#xff09;&#xff1b;安装成功的截图如下&#xff1a; 2、在项目的根目录下创建一个 名为 craco.config.js 文件&#xff1b;&#xff08;必须是根目录下&#xff0c;名称必须和我这个一样&#xff09;&…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇&#xff1a;实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇&#xff1a;实用指南与案…

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍&#xff0c;但是对于某些复杂的项目来说&#xff0c;会出现心有余而口不足的情况&#xff0c;为了解决这类问题&#xff0c;可以在树莓派上使用扩展板&#xff0c;我们介绍几款常见的扩展板&#xff0c;不仅可以扩展到树莓派&#xff0c;其他单片机或嵌入式…

Vue3 列表自动滚动播放(表头固定、列表内容自动滚动播放)+ vue3-seamless-scroll - 附完整示例

vue3-seamless-scroll&#xff1a;Vue3.0 无缝滚动组件&#xff0c;支持Vite2.0&#xff0c;支持服务端打包 目前组件支持上下左右无缝滚动&#xff0c;单步滚动&#xff0c;并且支持复杂图标的无缝滚动&#xff0c;目前组件支持平台与Vue3.0支持平台一致。 目录 效果 一、介绍…

安装vscode -- linux

前言 相信很多人在刚开始使用linux时&#xff0c;不知道怎么安装vscode来辅助我们编程&#xff0c;那么我将在此记录我所用的安装vscode的方法。 安装方法 方法一&#xff1a;snap 第一步&#xff1a;检查软件更新状况 sudo apt update在终端输入上述命令&#xff0c;会提…

大模型学习笔记 - LLM 之RLHF人类对齐的简单总结

LLM - RLHF人类对齐的简单总结 LLM-人类对齐 1. RLHF(Reinforcement Learning from Human Feedback, RLHF),基于人类反馈的强化学习2 奖励模型训练3 强化学习训练 3.1 PPO介绍3.2 进阶的RLHF的介绍 3.2.1. 过程监督奖励模型3.2.2. 基于AI反馈的强化学习3.2.3. 非强化学习的对齐…

卷积神经网络 - 基本卷积函数的变体篇

序言 在深度学习和卷积神经网络&#xff08; CNN \text{CNN} CNN&#xff09;的广阔领域中&#xff0c;基本卷积函数是构建网络结构的基础&#xff0c;它们通过滑动窗口的方式对输入数据进行特征提取。然而&#xff0c;随着应用场景和数据复杂性的增加&#xff0c;单一的卷积方…

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…

爬1688商品---(测试版)

半成品. from DrissionPage import ChromiumPage import time from selenium import webdriver urlhttps://p4psearch.1688.com/hamlet.html?scene6&cositebaidujj_pz&locationre&trackid885662561117990122602pageChromiumPage()page.get(url)def key_wof():inde…

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…

荒原之梦考研:考研二战会很难吗?

考研二战是不是很难&#xff0c;其实很大程度上取决于我们自己&#xff0c;我们能否认清自己的优势&#xff0c;能否指定和执行合理的计划&#xff0c;有没有强大的心理支撑等&#xff0c;都是决定考研二战能否成功&#xff0c;或者能否比较轻松的成功的关键。 在本文中&#…