バックエンド Java は SQL クエリ テーブル データを動的に結合し、フロントエンドの elementui ポップアップ ウィンドウが動的に表示されます。

elementui el-table フロントエンドは、テーブルデータを表示するテーブル名を動的に選択します。

elementui 表示クエリデータベースすべてのテーブルデータ

シーン:

     フロントエンドはテーブル名とクエリ条件をバックエンドに渡します。バックエンドはクエリ用に SQL に接続されます。次に、フロントエンドに戻って表示します。

  例: 3 つのフロントエンド パラメーター、tableName="t_test"、columnName="userName"、columnValue="Zhang San"

  userName = 'Zhang San' の t_test から選択した特定のフィールドに結合する必要があります

 バックエンドコード:

 フロントエンドに返されるデータの例:

 [{"NAME_name":"チャン・サン","AGE_age":"18"},{"NAME_name":"リー・シー","AGE_age":"19"}]

 @GetMapping("/info")
    public R info(@RequestParam("tableName") String tableName,
                  @RequestParam(value = "columnName",required = false) String columnName,
                  @RequestParam(value = "columnValue",required = false) String columnValue){
        //1、先根据tableName查询出该表的字段和字段注释
        /**
         * TableInfo :字段(columnName ,columnComment)
         * sql:
         *    select column_name,column_comment from information_schema.columns where table_name='表名' and table_schema='数据库名'
         */
        List<TableInfo> list = service.getColumnInfo(tableName);
        
        // 2、拼接查询的sql
        String sqlColumn = getSqlColumn(list);
        String sql = "select "+sqlColumn+" from "+tableName;
        
        if(StringUtils.isNotBlank(columnName) && StringUtils.isNotBlank(columnValue) ){
            sql= sql + " where " +columnName+"="+columnValue;
        }
        // 执行sql 查询
        /**
         * xml
         * <select id="runSql" parameterType="java.lang.String" resultType="java.util.Map">
         *  ${sqlStr,jdbcType=VARCHAR}    
         * </select>
         * 
         * dao
         * List <Map> runSql(String sqlStr)
         * 
         */
        List<Map> mapList = service.runSql(sql);

        return R.ok(mapList) ;
    }

    private  String getSqlColumn(List<TableInfo> list){
        StringBuilder sqlColumn = new StringBuilder();
        for(TableInfo tableInfo : list){
            String desc = tableInfo.getColumnComment();
            //避免有括号内的注释 去掉括号内容
            if(desc.indexOf("(")!=-1){
                desc = desc.substring(0,desc.indexOf("("));
            }
            //别名拼接 eg:NAME as NAME_姓名
            sqlColumn.append(tableInfo.getColumnName()+" as "+tableInfo.getColumnName()+"_"+desc+",");
        }
        // 去掉最后一个逗号
        return sqlColumn.toString().substring(0,sqlColumn.toString().length()-1);
    }

フロントエンドコード:

  以下はポップアップ ウィンドウ サブコンポーネントのコードです。ホームページからテーブル名と条件 (フィールド名とフィールド値) を選択し、[クエリ] をクリックしてウィンドウをポップアップし、クエリ後のページを表示します。el-table-column 動的サイクル表示テーブル データ

  注: ポップアップ ウィンドウを閉じるとき、またはポップアップ ウィンドウを初期化するときは、キャッシュを避けるためにデータ内のフィールド割り当てをクリアする必要があります。

   <el-table :data="dataList">
      <div v-for="(item,index) in cols" :key="index">
        <el-table-column :prop="item.prop" :label="item.label" header-align="center">
            <!-- 日期字段格式化 使用过滤器方法中的 formatDate -->
             <template slot-scope="scope">
                  <span v-if="item.label.indexOf('日期')!=-1">{
   
   {scope.row[item.prop] | formatDate}}</span>
                  <span v-else >{
   
   {scope.row[item.prop]}}</span >
             </template>
        </el-table-column>
      </div>
    </el-table>
 
//data 定义
dataList:[],
cols:[],
tableMap:{},
data:{}//查询的参数 对象 有:tableName columnName columnValue

//方法

async queryTableInfo(){
    var param = this.data;
    // 后端接口调用
    const{ code ,message,data} = await getTableInfo()
    
    if(code=='1000'){
        for(let i=0;i<data.length;i++){
            let obj = data[i];
            var newObj = new Object();
            //循环对象
            for (let key in obj){
                var descKey = key.substring(key.lastIndexOf('_')+1);//这个是中文:姓名  
                var newKey = key.substring(0,key.lastIndexOf('_'));//key的英文:NAME
                this.tableMap(newKey] = descKey ;//{'NAME':'姓名','AGE':'年龄'}

                var val = obj [key];
                newObj[newKey] = val;//新的对象变为:{'NAME':'张三','AGE':'18'}
            }
           this.dataList.push(newObj);

        }
         // cols:[{"label":"姓名","prop":"NAME"},{"label":"年龄","prop":"AGE"}]
         for (let key in this.tableMap){
            var colObj = {label:this.tableMap[key],prop:key};
            this.cols.push(colObj)
         }
        
    }
    
}

おすすめ

転載: blog.csdn.net/ss_Tina/article/details/131470761