• bugxxx


    <template>
      <div class="page">
        <a-page-header
          style="border: 1px solid rgb(235, 237, 240)"
          title="表访问申请"
          @back="() => $router.go(-1)"
        />
        <a-card>
          <a-form
            :model="formState"
            :label-col="labelCol"
            :wrapper-col="wrapperCol"
            :ref="formRef"
            :rules="rules"
          >
            <a-form-item label="申请用户"  name="type">
              <a-select
                :show-arrow="true"
                v-model:value="formState.type"
                placeholder="请选择"
                :filter-option="true"
                notFoundContent="暂无数据"
              >
                <a-select-option
                  v-for="(item, index) in appllylist"
                  :key="item.type"
                  :label="item.type"
                  :value="item.type"
                  >{{ item.name }}</a-select-option
                >
              </a-select>
              <div class='hint'  v-if='!flag&&formState.type===0' >当前用户不存在</div>
            </a-form-item>
            <a-form-item label="用户组" v-if="formState.type === 1">
              <a-select
                :show-arrow="true"
                v-model:value="formState.groupId"
                placeholder="请选择"
                @change='groupChange'
                :filter-option="true"
                notFoundContent="暂无数据"
              >
                <a-select-option
                  v-for="(item, index) in grouplist"
                  :key="item.groupId"
                  :label="item.groupId"
                  :value="item.groupId"
                  >{{ item.groupName }}</a-select-option
                >
              </a-select>
            </a-form-item>
            <a-form-item label="库名">
              <a-select
                :show-arrow="true"
                v-model:value="formState.dbId"
                placeholder="请选择"
                :filter-option="true"
                @change="handleChange"
                notFoundContent="暂无数据"
              >
                <a-select-option
                  v-for="(item, index) in list"
                  :key="item.dbId"
                  :label="item.dbId"
                  :value="item.dbId"
                  >{{ item.dbName }}</a-select-option
                >
              </a-select>
            </a-form-item>
            <a-form-item label="表名">
              <a-select
                v-model:value="formState.tableId"
                mode="tags"
                show-search
                style="width: 100%"
                 :filterOption="filterOption"
                placeholder="请选择表名"
              >
                <a-select-option
                  v-for="(item, index) in options"
                  :key="item.tableId"
                  :label="item.tableName"
                  :value="item.tableId"
                >
                  <div>
                    {{ item.tableName }}
                  </div>
                </a-select-option>
              </a-select>
              <a-table
                :dataSource="dataSourceCopy"
                :columns="columns"
                :pagination="false"
              >
                <template #bodyCell="{ column, index }">
                  <template v-if="column.key === 'index'">
                    {{ index + 1 }}
                  </template>
                </template>
              </a-table>
            </a-form-item>
            <a-form-item label="数据权限">
              <a-radio-group v-model:value="formState.permission">
                <a-radio :value="0">查看权限</a-radio>
              </a-radio-group>
            </a-form-item>
    
            <a-form-item label="权限有效期">
              <a-select
                :show-arrow="true"
                v-model:value="formState.validTime"
                placeholder="请选择"
                :filter-option="true"
                notFoundContent="暂无数据"
              >
                <a-select-option
                  v-for="(item, index) in durationlist"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id"
                  >{{ item.name }}</a-select-option
                >
              </a-select>
            </a-form-item>
            <a-form-item label="申请原因">
              <a-textarea
                v-model:value="formState.reason"
                type="textarea"
                placeholder="请输入原因"
                :rows="4"
              />
            </a-form-item>
            <a-form-item :wrapper-col="{ span: 14, offset: 4 }">
              <a-button type="primary" :disabled='(!flag&&formState.type===0)' @click="showModal">提交</a-button>
              <a-button style="margin-left: 10px" @click="() => $router.go(-1)"
                >取消</a-button
              >
            </a-form-item>
          </a-form>
        </a-card>
      </div>
    
      <a-modal v-model:visible="visible" title="确认" @ok="handleOk" :width="1000">
        <a-form :model="formState" :label-col="labelCol" :wrapper-col="wrapperCol">
          <a-form-item label="申请用户" name="type">
            <a-select
              :show-arrow="true"
              v-model:value="formState.type"
              disabled
              placeholder="请选择"
              :filter-option="true"
              notFoundContent="暂无数据"
            >
              <a-select-option
                v-for="(item, index) in appllylist"
                :key="item.type"
                :label="item.type"
                :value="item.type"
                >{{ item.name }}</a-select-option
              >
            </a-select>
          </a-form-item>
          <a-form-item label="用户组" v-if="formState.type === 1">
            <a-select
              :show-arrow="true"
              v-model:value="formState.groupId"
              placeholder="请选择"
              disabled
              :filter-option="true"
              notFoundContent="暂无数据"
            >
              <a-select-option
                v-for="(item, index) in grouplist"
                :key="item.groupId"
                :label="item.groupId"
                :value="item.groupId"
                >{{ item.groupName }}</a-select-option
              >
            </a-select>
          </a-form-item>
          <a-form-item label="库名">
            <a-select
              :show-arrow="true"
              v-model:value="formState.dbId"
              placeholder="请选择"
              disabled
              :filter-option="true"
              @change="handleChange"
              notFoundContent="暂无数据"
            >
              <a-select-option
                v-for="(item, index) in list"
                :key="item.dbId"
                :label="item.dbId"
                :value="item.dbId"
                >{{ item.dbName }}</a-select-option
              >
            </a-select>
          </a-form-item>
          <a-form-item label="表名">
            <a-select
              v-model:value="formState.tableId"
              mode="tags"
              show-search
              style="width: 100%"
              placeholder="请选择表名"
              :filter-option="false"
              disabled
              @search="searchkeyword"
              @popupScroll="searchChange"
            >
              <a-select-option
                v-for="(item, index) in options"
                :key="item.tableId"
                :label="item.tableName"
                :value="item.tableId"
              >
                <div>
                  {{ item.tableName }}
                </div>
              </a-select-option>
            </a-select>
            <a-table
              :dataSource="dataSourceCopy"
              :columns="columns"
              :pagination="false"
            >
              <template #bodyCell="{ column, index }">
                <template v-if="column.key === 'index'">
                  {{ index + 1 }}
                </template>
              </template>
            </a-table>
          </a-form-item>
        </a-form>
        <template #footer>
          <a-button key="submit" type="primary"  :loading="loading" @click="onSubmit"
            >确认</a-button
          >
          <a-button key="back" @click="handleCancel">取消</a-button>
        </template>
      </a-modal>
    </template>
    <script >
    import { defineComponent, ref, computed, onBeforeMount } from "vue";
    import { useRoute, useRouter } from "vue-router"; //引入路由组件
    import {
      submitData,
      fetchStoreList,
      fetchSheetList,
      fetchAudit,
      redashUser,
    } from "../../../service/datamapApi";
    import store from "../../../store/index";
    import { useStore } from "vuex";
    export default defineComponent({
      beforeRouteLeave(to, from, next) {
        // 离开的时候,非以下页面则删除缓存组件 name
        // 记录路由处的name值
        let coms = ["datamaplist"];
        console.log(coms.indexOf(to.name) === -1, to.name);
        if (coms.indexOf(to.name) === -1) {
          store.commit("routerCache/REMOVE_KEEP_ALIVE_COM", "datamaplist");
        }
        next();
      },
      setup() {
        const route = useRoute();
        const router = useRouter();
        const stores = useStore();
        const id = ref(route.query.id);
        const loading = ref(false);
        const page = ref(1);
        const formRef = ref();
        const total = ref(0);
        const list = ref([]);
        const grouplist = ref([]);
        const options = ref([]);
        const cachebean = ref({});
        const visible = ref(false);
        const flag = ref(false);
        onBeforeMount(() => {
          getStoreList();
          getRedashList();
        });
    
        const formState = ref({
          type: 0,
          groupId: undefined,
          groupName:'',
          tableId: undefined,
          dbId: undefined,
          permission: 0,
          validTime: 0,
          reason: "",
        });
        const getStoreList = (parms) => {
          fetchStoreList()
            .then((res) => {
              let result = res.data;
              if (result.code === 200) {
                list.value = result.data;
                let condition = {};
                result.data.map((itm) => {
                  condition[itm.dbId] = { tableIds: [], tableList: [] };
                });
                cachebean.value = condition;
                getAudit();
              }
            })
            .catch((err) => {
              console.log(err);
            });
        };
        const getRedashList = (parms) => {
          redashUser()
            .then((res) => {
              let result = res.data;
              if (result.code === 200) {
                flag.value = result.data.userExits;
                grouplist.value = result.data.groups;
              }
            })
            .catch((err) => {
              console.log(err);
            });
        };
        const showModal = () => {
          visible.value = true;
        };
    
        const handleOk = () => {};
    
        const handleCancel = () => {
          visible.value = false;
        };
        const dataSourceCopy = computed(() => {
          let temp = cachebean.value[formState.value.dbId];
    
          if (!temp) {
            return;
          }
          cachebean.value[formState.value.dbId]["tableIds"] = Array.isArray(
            formState.value.tableId
          )
            ? formState.value.tableId
            : [formState.value.tableId];
          cachebean.value[formState.value.dbId]["tableList"] = options.value;
          let tableIdsArr = [];
          let tableListArr = [];
          for (let key in cachebean.value) {
            tableIdsArr = tableIdsArr.concat(cachebean.value[key].tableIds);
            tableListArr = tableListArr.concat(cachebean.value[key].tableList);
          }
          return tableListArr.filter((item) => {
            return tableIdsArr.includes(item.tableId);
          });
          // return options.value.filter((item) => {
          //   if(Array.isArray(formState.value.tableId)){
          //     return formState.value.tableId.includes(item.tableId)
          //   }else{
          //     return item.tableId === formState.value.tableId
          //    }
          // });
        });
        const searchChange = () => {
          if (page.value * 60000 >= total.value) {
            return;
          }
          page.value++;
          getSheetList({
            id: formState.value.dbId,
            pageSize: 60000,
            pageNo: page.value,
          });
        };
        const searchkeyword = (e) => {
          fetchSheetList({
            id: formState.value.dbId,
            pageSize: 60000,
            pageNo: 1,
            keyword: e,
          })
            .then((res) => {
              let result = res.data;
              if (result.code === 200) {
                // options.value = [];
                let templist = options.value.concat(result.data);
                let newobj = {};
                templist = templist.reduce((preVal, curVal) => {
                  newobj[curVal.tableId]
                    ? ""
                    : (newobj[curVal.tableId] = preVal.push(curVal));
                  return preVal;
                }, []);
                options.value= templist
                total.value = total.value + result.total;
              }
            })
            .catch((err) => {
              console.log(err);
            });
        };
        const getSheetList = (parms) => {
          fetchSheetList(parms)
            .then((res) => {
              let result = res.data;
              if (result.code === 200) {
                options.value = options.value.concat(result.data);
                total.value = result.total;
              } else {
                page.value--;
              }
            })
            .catch((err) => {
              page.value--;
              console.log(err);
            });
        };
        const getAudit = (parms) => {
          fetchAudit({ id: id.value })
            .then((res) => {
              let result = res.data;
              if (result.code === 200) {
                formState.value = result.data;
                (formState.value.permission = 0),
                  (formState.value.validTime = 0),
                  (formState.value.type = 0),
                  (formState.value.reason = "");
                getSheetList({
                  id: result.data.dbId,
                  pageSize: 60000,
                  pageNo: page.value,
                });
              }
            })
            .catch((err) => {
              console.log(err);
            });
        };
        const onSubmit = () => {
          loading.value = true;
          let param = {
            userName: stores.state.user.user.userName,
            cname: stores.state.user.user.cname,
            type: formState.value.type,
            groupId: formState.value.groupId,
            groupName: formState.value.groupName,
            permission: formState.value.permission,
            validTime: formState.value.validTime,
            reason: formState.value.reason,
            tables: dataSourceCopy.value,
          };
          submitData(param)
            .then((res) => {
              loading.value = false;
              let result = res.data;
              if (result.code === 200) {
                handleOk();
                router.push("/datamaplist");
              }
            })
            .catch((err) => {
              loading.value = false;
              console.log(err);
            });
        };
        const handleChange = (value) => {
          formState.value.tableId =
            cachebean.value[formState.value.dbId]["tableIds"];
          options.value = [];
          getSheetList({ id: value, pageSize: 60000, pageNo: 1 });
        };
        const groupChange =(value)=>{
            formState.value.groupName = ''
            grouplist.value.forEach(element => {
               if(element.groupId===value){
                 formState.value.groupName = element.groupName
               }
            });
        }
        const validateNutrients = async (rule, value) => {
          // 15       if(!value) {
          // 16         return Promise.reject(new Error('请输入数值'));
          // 17       }
          // 18       const numReg = /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/
          // 19       if(!numReg.exec(value)) {
          // 20         return Promise.reject(new Error('请输入正确数字'));
          // 21       }
          // if (!flag.value && formState.value.type === 0) {
          //   return Promise.reject(new Error("当前用户不存在"));
          // }
        };
        const rules = {
          type: [{ validator: validateNutrients, trigger: "change" }],
        };
          const  filterOption =(value, option)=> {
          return option.componentOptions.children[0].text.indexOf(value) >= 0
        }
        return {
          id,
          loading,
          rules,
          page,
          total,
          cachebean,
          searchkeyword,
          dataSourceCopy,
          columns: [
            {
              title: "序号",
              dataIndex: "index",
              key: "index",
            },
            {
              title: "表名",
              dataIndex: "tableName",
              key: "tableName",
            },
            {
              title: "表注释",
              dataIndex: "comment",
              key: "comment",
            },
            {
              title: "责任人",
              dataIndex: "owner",
              key: "owner",
            },
          ],
          labelCol: { style: { width: "150px" } },
          wrapperCol: { span: 14 },
          formState,
          onSubmit,
          handleChange,
          searchChange,
          // validateNutrients,
          list,
          durationlist: [
            { id: 0, name: "一个月" },
            { id: 1, name: "三个月" },
            { id: 2, name: "半年" },
            { id: 3, name: "一年" },
            { id: 4, name: "永久有效" },
          ],
          appllylist: [
            { type: 0, name: "当前用户" },
            { type: 1, name: "按用户组申请" },
          ],
          options,
          getStoreList,
          getSheetList,
          getAudit,
          visible,
          showModal,
          handleOk,
          handleCancel,
          flag,
          getRedashList,
          grouplist,
          formRef,
          groupChange,
          filterOption
        };
      },
    });
    </script>
    <style lang='less' scoped>
    .page {
    }
    .hint{
      color: #ff4d4f;
    }
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
    • 499
    • 500
    • 501
    • 502
    • 503
    • 504
    • 505
    • 506
    • 507
    • 508
    • 509
    • 510
    • 511
    • 512
    • 513
    • 514
    • 515
    • 516
    • 517
    • 518
    • 519
    • 520
    • 521
    • 522
    • 523
    • 524
    • 525
    • 526
    • 527
    • 528
    • 529
    • 530
    • 531
    • 532
    • 533
    • 534
    • 535
    • 536
    • 537
    • 538
    • 539
    • 540
    • 541
    • 542
    • 543
    • 544
    • 545
    • 546
    • 547
    • 548
    • 549
    • 550
    • 551
    • 552
    • 553
    • 554
    • 555
    • 556
    • 557
    • 558
    • 559
    • 560
    • 561
    • 562
    • 563
    • 564
    • 565
    • 566
    • 567
    • 568
    • 569
    • 570
    • 571
    • 572
    • 573
    • 574
  • 相关阅读:
    CockroachDB-备份与恢复(4)管理备份计划
    k8s 服务升级为啥 pod 会部署到我们不期望的节点上??看来你还不懂污点和容忍度
    nodeJs+jwt实现小程序tonken鉴权
    【数据结构】树与二叉树(十九):树的存储结构——左儿子右兄弟链接结构(树、森林与二叉树的转化)
    精华推荐 | 【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的存储系统的实现原理和持久化机制
    IE浏览器攻击:MS11-003_IE_CSS_IMPORT
    eclipse创建Maven项目(保姆级教学)
    Service Mesh目的:是解决系统架构微服务化后的服务间通信和治理问题。
    经验分享,两个在线图片处理网站在线抠图和删除不需要的元素
    微机原理与接口技术
  • 原文地址:https://blog.csdn.net/sinat_36017053/article/details/128107035