1. 程式人生 > 實用技巧 >SpringBoot+ElementUI實現多選設定一月中指定幾天的屬性,SpringBoot中通過反射實現

SpringBoot+ElementUI實現多選設定一月中指定幾天的屬性,SpringBoot中通過反射實現

場景

在某管理系統中,需要對指定員工的指定月份的指定天設定為指定的狀態

注:

部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。

實現

首先設計資料庫

依次新增d1到d31代表每月的1到31號,設定型別為varchar,儲存的是字串型別。

然後生成相應的實體類和各業務層程式碼,實體類屬性如下

然後在前端,選擇某條記錄點選修改時

              <el-button
                size="mini"
                type
="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" >修改</el-button>

呼叫handleUpdate方法

    handleUpdate(row) {
      this.reset();
      const id = row.id || this.checkedId;
      getKqyb(id).then((response) => {
        this.form.id = response.data.id;
        
this.form.xm = response.data.xm; this.form.gh = response.data.gh; this.form.dabh = response.data.dabh; this.form.bm = response.data.bm; this.form.year = response.data.year; this.form.mouth = response.data.mouth; this.open = true; this.title = "
修改月統計"; }); },

上面是根據選中的id查詢出要設定的員工的資訊以及設定的是哪一年的哪個月,然後將隱藏的修改的dialog進行顯示

<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-row>
          <el-col :span="10">
            <el-form-item label="工號:" prop="gh">
              <el-input v-model="form.gh" :disabled="true" />
            </el-form-item>
          </el-col>
          <el-col :span="10">
            <el-form-item label="姓名:" prop="gh">
              <el-input v-model="form.xm" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="10">
            <el-form-item label="部門:" prop="bm">
              <el-input v-model="form.bm" :disabled="true" />
            </el-form-item>
          </el-col>
          <el-col :span="10">
            <el-form-item label="檔案編號:" prop="dabh">
              <el-input v-model="form.dabh" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="10">
            <el-form-item label="年:" prop="year">
              <el-input v-model="form.year" :disabled="true" />
            </el-form-item>
          </el-col>
          <el-col :span="10">
            <el-form-item label="月:" prop="mouth">
              <el-input v-model="form.mouth" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="20">
            <el-form-item label="請勾選要設定的當月號數" label-width="200"></el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col>
            <el-checkbox-group v-model="form.checkList" @change="handleCheckedDatesChange">
              <el-checkbox v-for="date in dates" :label="date.key" :key="date.key">{{date.label}}</el-checkbox>
            </el-checkbox-group>
          </el-col>
        </el-row>

        <el-row>
          <el-col>
            <el-form-item label="設定考勤狀態為:" prop="kqzt" label-width="300">
              <el-select
                v-model="form.kqzt"
                placeholder="請選擇考勤狀態"
                clearable
                :style="{ width: '300px' }"
              >
                <el-option
                  v-for="dict in kqztOptions"
                  :key="dict.bbmc"
                  :label="dict.jqmc"
                  :value="dict.bbmc"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">確 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>

上面的輸入框用來顯示基本資訊,下面是勾選要設定的每月幾號和要設定為的狀態

怎樣對這些個多選框進行初始化

            <el-checkbox-group v-model="form.checkList" @change="handleCheckedDatesChange">
              <el-checkbox v-for="date in dates" :label="date.key" :key="date.key">{{date.label}}</el-checkbox>
            </el-checkbox-group>

使用多選框組,迴圈的是dates這個物件陣列 ,繫結的label屬性就是此多選框的值,即勾選後獲取到的內容,要顯示的內容

是通過{{}}來顯示,顯示的是每個對像的label屬性即實際要顯示的值。

因為每月每天的物件屬性是固定的,所以將dates宣告

dates: dateOptions,

然後宣告並賦值dateOptions

const dateOptions = [
  {
    key: "d1",
    label: "1號",
  },
  {
    key: "d2",
    label: "2號",
  },
  {
    key: "d3",
    label: "3號",
  },
  {
    key: "d4",
    label: "4號",
  },
  {
    key: "d5",
    label: "5號",
  },
  {
    key: "d6",
    label: "6號",
  },
  {
    key: "d7",
    label: "7號",
  },
  {
    key: "d8",
    label: "8號",
  },
  {
    key: "d9",
    label: "9號",
  },
  {
    key: "d10",
    label: "10號",
  },
  {
    key: "d11",
    label: "11號",
  },
  {
    key: "d12",
    label: "12號",
  },
  {
    key: "d13",
    label: "13號",
  },
  {
    key: "d13",
    label: "13號",
  },
  {
    key: "d14",
    label: "14號",
  },
  {
    key: "d15",
    label: "15號",
  },
  {
    key: "d16",
    label: "16號",
  },
  {
    key: "d17",
    label: "17號",
  },
  {
    key: "d18",
    label: "18號",
  },
  {
    key: "d19",
    label: "19號",
  },
  {
    key: "d20",
    label: "20號",
  },
  {
    key: "d21",
    label: "21號",
  },
  {
    key: "d22",
    label: "22號",
  },
  {
    key: "d23",
    label: "23號",
  },
  {
    key: "d24",
    label: "24號",
  },
  {
    key: "d25",
    label: "25號",
  },
  {
    key: "d26",
    label: "26號",
  },
  {
    key: "d27",
    label: "27號",
  },
  {
    key: "d28",
    label: "28號",
  },
  {
    key: "d29",
    label: "29號",
  },
  {
    key: "d30",
    label: "30號",
  },
  {
    key: "d31",
    label: "31號",
  },
];

宣告位置

這樣在勾選後就會將所勾選的多選框的label屬性對應的值繫結在改多選組的v-model繫結的屬性。

繫結的是form物件的checklist屬性,此屬性是陣列。

      form: {
        id: undefined,
        gh: undefined,
        xm: undefined,
        dabh: undefined,
        bm: undefined,
        year: undefined,
        mouth: undefined,
        checkList: [],
        kqzt: undefined,
      },

然後在點選確定時會將此表單提交,並將form引數進行傳遞

      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">確 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>

在提交按鈕對應的方法中

    submitForm: function () {
      this.$refs["form"].validate((valid) => {
        
        if (valid) {
          if (this.form.id != undefined) {
            updateKqyb(this.form).then((response) => {
              if (response.code === 200) {
                this.msgSuccess("修改成功");
                this.open = false;
                this.getList();
              }
            });
          } 
        }
      });
    },

將form引數傳遞給請求介面js的方法

export function updateKqyb(data) {
  return request({
    url: '/kqbb/kqyb',
    method: 'put',
    data: data
  })
}

然後傳遞到SpringBoot後臺

    @PutMapping
    public AjaxResult edit(@RequestBody KqbbKqyb kqbbKqyb)
   {
   
    }

使用後臺生成的實體類進行接收,因為傳遞的選中的月份的陣列的在原實體類中不存在,所以需要新增

private String[] checkList;

屬性以及get和set方法來接受引數

然後接受到引數後是陣列,每一項對應後臺實體類的屬性d1 d2這種

怎樣根據屬性名設定屬性值

先獲取要設定哪些天即要設定哪些屬性

String[] checkList = kqbbKqyb.getCheckList();

然後

        KqbbKqyb kqbbKqybNew = new KqbbKqyb();
        kqbbKqybNew.setId(kqbbKqyb.getId());
        for (String shuxing:checkList) {
            Field field = kqbbKqybNew.getClass().getDeclaredField(shuxing);   
            if(field!=null)
            {
                field.setAccessible(true);
                if(kqzt!=null)
                {
                    field.set(kqbbKqybNew, kqzt+"(改)");
                }
            }
        }

     kqbbKqybService.updateKqbbKqyb(kqbbKqybNew);

宣告一個要設定屬性的物件,賦予修改時要用到的id,然後遍歷傳遞過來的所有屬性

利用JDK的反射,根據屬性名獲取屬性,再設定屬性可訪問然後呼叫set方法設定其值

field.set(kqbbKqybNew, kqzt+"(改)");

其中kqbbKqybNew是要設定屬性的物件,後面的引數是要設定的內容。