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

背景

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

文档收藏

完善实体模型

文档收藏夹我们原先配置了三个关键属性,分别是对象类型、对象标识和用户标识。
对于前端展现,需要名称、类型、大小等关键信息,我们使用平台低代码配置功能,在原模型属性的基础上,添加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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学海无涯,行者无疆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值