jeecgboot 可编辑表格弹窗富文本框

        最近使用jeecgboot框架的JEditableTable做一个数据维护,有一个需求是用户要录入SQL语句,帮他顺序执行SQL,由于SQL又臭又长,小小的input框没办法显示全,导致每次需要在txt里编辑好了再贴进去,修改也是一样。

       如图,只能显示几个字,多了就看不到了。

        于是乎,测试的胖子提出需求,需要点击弹出一个框,完全显示编辑内容。

        实现步骤:

  1. 给可编辑表格特定类型的框添加事件监听,不能影响可编辑表格现有的功能
  2. 做一个模态框组件,用于显示和编辑
  3. 完善父页面和模态框组件之间的数据通信

        直接上代码:

源码里没有点击事件,需要自己加

 源码里增加一个处理函数,用于父子组件传值

 父组件中的column,增加使能点击事件的属性

 父组件监听子组件的事件

 

父组件处理子组件传过来的数据

最后再新建一个弹窗页面即可

这里使用了compute,用于防止子组件直接修改父组件的值

<template>
  <j-modal
    :title="title"
    :width="width"
    :visible="visible"
    switchFullscreen
    @ok="handleOk"
    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
    @cancel="handleCancel"
    cancelText="关闭">
    <div>
      <j-editor v-model="paramCopy"/>
      <!-- <a-textarea v-model="paramCopy" rows="20" placeholder="SQL编辑处" /> -->
    </div>
  </j-modal>
</template>

<script>
  import store from '@/store'
  import { mapGetters } from 'vuex'
  import { getAction, postAction, getFileAccessHttpUrl } from '@/api/manage'
  import moment from 'moment'

  export default {
    name: 'FckEditerDialog',
    components: {},
    props: {
      paramData: {
        type: String,
        default: ''
      },
    },
    computed: {
      paramCopy: {
        get() {
          return this.paramData
        },
        set(val) {
          this.$emit('saveContentInfo', val)   
        }
      }
    },
    data () {
      return {
        title:'编辑器',
        width:896,
        visible: false,
        disableSubmit: false,
        usercode: '',
        userId: '',
        execProcess: '',
      }
    },
    created() {
      this.userId = this.userInfo().id;
    },
    mounted() {
    },
    destroyed: function () {
    },
    methods: {
      ...mapGetters(['nickname', 'avatar', 'userInfo']),
      add () {
        this.execProcess = '';
        this.visible=true
      },
      edit (record) {
        this.visible=true
      },
      close () {
        this.$emit('close');
        this.visible = false;
      },
      handleOk () {
        this.$emit('close');
        this.visible = false;
        // let data = this.paramData
        // this.$emit('saveContentInfo', data);
        // this.paramData = '';
      },
      submitCallback(){
        this.$emit('ok');
        this.visible = false;
      },
      handleCancel () {
        this.close()
        this.visible = false;
      },
    }
  }
</script>

 效果图:

 

全屏效果

 

这样保存后会有很多HTML后台处理的时候需要去除,附上工具类:

 

public class FckEditorUtil {

    public static Pattern p = Pattern.compile("\\s*|\t|\r|\n|");

    /**
     * 去掉字符串中的 \t \r \n
     * <p>
     * param str
     *
     * @return
     * @author Rex
     */
    public static String replaceBlank(String str) {
        String dest = "";
        if (str != null) {
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }


    /**
     * 删除Html标签
     * <p>
     * param inputString
     *
     * @return
     * @author Rex
     */
    public static String removeHtmlTag(String inputString) {
        if (inputString == null) {
            return null;
        }
        String htmlStr = inputString; // 含html标签的字符串
        String textStr = "";
        try {
            //定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
            String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
            //定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
            String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
            // 定义HTML标签的正则表达式
            String regEx_html = "<[^>]+>";
            // 定义一些特殊字符的正则表达式 如:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            String regEx_special = "\\&[a-zA-Z]{1,10};";
            textStr = getString(htmlStr, regEx_script, regEx_style, regEx_html, regEx_special);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return textStr;// 返回文本字符串
    }

    private static String getString(String htmlStr, String... args) {
        Pattern p_script;
        Matcher m_script;
        for (String regEx: args) {
            p_script = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
            m_script = p_script.matcher(htmlStr);
            htmlStr = m_script.replaceAll(" "); // 过滤
        }
        return htmlStr;
    }

}

### 使用 JeecgBoot 创建可编辑行的表格组件 JeecgBoot 提供了丰富的功能来简化开发过程,其中包括强大的代码生成功能。为了创建一个可编辑行的表格组件,可以利用 JeecgBoot 的在线表单设计工具以及其内置的前端框架 Ant Design 和 Vue3。 #### 准备工作 首先克隆 JeecgBoot 项目的最新源码: ```bash git clone https://github.com/zhangdaiscott/jeecg-boot.git cd jeecg-boot/ant-design-jeecg-vue ``` 安装依赖并启动项目[^1]。 #### 设计数据库表结构 通过 JeecgBoot 的 Online Coding 功能,在线设计所需的数据库表结构。假设要创建一张名为 `editable_table` 的表用于存储数据记录。完成表的设计后保存设置以便后续操作。 #### 配置实体类与 Mapper 接口 基于之前定义好的数据库表自动生成对应的 Java 实体类和 MyBatis Plus 的 Mapper 接口文件。这一步骤可以通过 JeecgBoot 自带的代码生成器轻松实现,确保所选模板支持 CRUD 操作[^2]。 #### 开发前端页面逻辑 进入前端工程目录下找到相应的模块位置,编写或修改已有组件以适应需求。这里将以 Vue 组件为例展示如何构建具备编辑能力的数据列表视图。 ##### 编写 EditableTable.vue 文件 在 src/views 下新建一个名为 editable-table 的文件夹,并在其内部建立 EditableTable.vue 文件作为主要渲染单元。以下是该组件的部分核心代码片段: ```vue <template> <a-table :columns="columns" :data-source="dataSource"> <!-- 定义列配置 --> <template #bodyCell="{ column, record }"> <template v-if="record.editable && (column.dataIndex === 'name' || column.dataIndex === 'age')"> <a-input v-model:value="record[column.dataIndex]" /> </template> <template v-else>{{ record[column.dataIndex] }}</template> <span slot="operation" slot-scope="text, record"> <div class="editable-row-operations"> <a @click="edit(record)">Edit</a> <a-popconfirm title="Sure to delete?" @confirm="deleteRecord(record)"> <a>Delete</a> </a-popconfirm> </div> </span> </template> </a-table> </template> <script lang="ts"> import { defineComponent, ref } from "vue"; export default defineComponent({ setup() { const columns = [ { title: "Name", dataIndex: "name", key: "name" }, { title: "Age", dataIndex: "age", key: "age" }, { title: "Action", dataIndex: "", slots: { customRender: "operation" } } ]; let dataSource = ref([ { id: 1, name: "John Brown", age: 32, address: "New York No. 1 Lake Park", editable: false }, ... ]); function edit(record) { Object.assign(dataSource.value.find(item => item.id === record.id), { ...record }, { editable: true }); } async function save(id) { try { await new Promise((resolve) => setTimeout(() => resolve(), 1000) ); message.success(`Row ${id} saved`); Object.assign( dataSource.value.find(item => id === item.id), { editable: false } ); } catch (errInfo) { console.log('Save failed:', errInfo); } } return { columns, dataSource, edit, save }; } }); </script> ``` 此段代码实现了基本的功能——显示带有编辑选项的一张简单表格;当点击某一行中的 “Edit” 按钮时会切换到输入框状态允许更改内容,而再次点击则提交更新后的信息给服务器处理[^3]。 #### 测试验证效果 最后部署应用至本地环境测试上述改动是否正常运作。如果一切顺利的话应该能够看到预期的结果:即拥有一份交互式的、可以直接对其中某些字段进行即时编辑保存的 HTML 表格界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值