当前位置: 首页 > 工具软件 > CalendarStyle > 使用案例 >

基于element ui的Calendar实现添加自定义内容

支淮晨
2023-12-01

目标

实现的内容是在Element UI的 Calenda 中可以自己添加内容

官方文档

通过设置名为 dateCell 的 scoped-slot 来自定义日历单元格中显示的内容。在 scoped-slot 可以获取到 date(当前单元格的日期), data(包括 type,isSelected,day 属性)。

自定义要改的内容

直接看下面code

  1. value的值是选中月份的值
  2. calendarData中的每一对象的dutyDate的格式是2021-01-20
  3. 主要方法handleAddClick,handleEventClick
  4. 用户信息格式:
 {
            "id": 14,
            "loginName": "nige",
            "userName": "倪割",
            "ding_user_id": "23123123"
        },

以下为完整代码:

<template>
  <div id="app">
    <div class="search-container">
      <div class="search-item-container">

        <el-dropdown trigger="click">
          <el-button plain>
            产品:{{ productList.find(o=>o.key===product).name
            }}
            <i
              class="el-icon-caret-bottom el-icon--right"
            />
          </el-button>
          <el-dropdown-menu slot="dropdown" class="no-border">
            <el-radio-group v-model="product" style="padding: 5px 15px;">
              <el-radio
                v-for="item in productList"
                :key="item.key"
                :value="item.key"
                :label="item.key"
              >{{ item.name }}</el-radio>
            </el-radio-group>
          </el-dropdown-menu>
        </el-dropdown>

        <el-button
          class="filter-item"
          type="primary"
          icon="el-icon-search"
          @click="getCalendarData()"
        >{{ $t('table.search') }}</el-button>
      </div>
    </div>
    <el-aside direction="horizontal" style="margin-left:10px;padding-right:10px;background-color:skyblue" width="100%">
      您可以直接在以下日历中点击<b style="background-color:rgb(163, 241, 238);">日期</b> 添加值班人员;点击 <b style="color: #f8a535;">名字</b> 修改值班人员。
    </el-aside>
  <!--value的值是选中月份的值 -->
    <el-calendar id="calendar" v-model="value">
      <template slot="dateCell" slot-scope="{date, data}">
        <!--自定义内容 item.dutyDate的格式是2021-01-20,-->
        <div @click="handleAddClick(data)">
          <div class="calendar-day">{{ data.day.split('-').slice(2).join('-') }}</div>
          <div v-for="(item,index) in calendarData" :key="index">
           
            <div v-if="(item.dutyDate.split('-')[1]).indexOf(data.day.split('-').slice(1)[0])!=-1">
              <div
                v-if="(item.dutyDate.split('-')[2]).indexOf(data.day.split('-').slice(2).join('-'))!=-1"
              >
                <el-tooltip class="item" effect="dark" :content="item.loginName" placement="right">
                  <div class="is-selected" @click="handleEventClick(item)">{{ item.userName }}</div>
                </el-tooltip>
              </div>
              <div v-else />
            </div>
            <div v-else />
          </div>
        </div>
      </template>
    </el-calendar>
    <el-dialog :visible.sync="dialogVisible" width="30%">
      <el-form ref="varform" :model="formData" label-position="right" label-width="80px">

        <el-form-item label="值班人员" prop="loginName">
          <!-- 此处必须加value-key,否则每次都显示最后一个选项 -->
          <el-select
            v-model="formData.loginName"
            placeholder="选择人员"
            value-key="loginName"
            filterable
            clearable
            icon="el-icon-caret-bottom el-icon--right"
          >
            <el-option
              v-for="(item) in userList"
              :key="item.loginName"
              :value="item"
              :label="item.loginName"
            />
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false;cancel()">取 消</el-button>
        <el-button v-if="!isupdate" type="primary" @click="dialogVisible = false;add()">确 定</el-button>
        <el-button v-if="isupdate" type="primary" @click="dialogVisible = false;update()">更新</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { fetch } from '@/utils/requestJira'
let jiraBugServer="http://192.168.11.12:8080"

export default {
  name: 'Calendar',
  data() {
    return {
      product: 'bixin',
      productList: [
        { key: 'xxx', name: '测试之迷' },
        
      ],
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() < Date.now()
        }
      },
      isupdate: false,
      formData: {
        data: '',
        component: undefined,
        loginName: undefined
      },
      userList: [],
      dialogVisible: false,
      calendarData: [
        // {
        //   id: 1,
        //   dutyDate: "2021-01-15",
        //   loginName: "zhangsan",
        //   username: "张三",
        //   component: "feixiang"
        // },
      ],
      value: new Date()
    }
  },

  watch: {
    value: function() {
      var month = this.value.getMonth() + 1
      if (month >= 1 && month <= 9) {
        month = '0' + month
      }
    }
  },
  created() {
    this.getUserList()
  },
  mounted() { this.getCalendarData() },
  methods: {
    getCalendarData() {
      const url = jiraBugServer + '/api/getList'
      const params = { component: this.product }
      this.$post(url, params).then(res => {
        if (res.code == 8000) {
          this.calendarData = res.result
        } else {
          this.$message.error('获取数据出错')
        }
      })
    },
    getUserList() {
      const url =
        'https://user_info_api_url'
      fetch(url).then(res => {
        this.userList = res.data
        // console.log(this.userList);
      })
    },
    threeBtnListener() {
      this.$nextTick(() => {
        // 点击上个月
        const prevBtn1 = document.querySelector(
          '.el-calendar__button-group .el-button-group>button:nth-child(1)'
        )
        prevBtn1.addEventListener('click', () => {
          console.log('上个月')
        })
        // 点击今天
        const prevBtn2 = document.querySelector(
          '.el-calendar__button-group .el-button-group>button:nth-child(2)'
        )
        prevBtn2.addEventListener('click', () => {
          console.log('今天')
        })
        // 点击下个月
        const prevBtn3 = document.querySelector(
          '.el-calendar__button-group .el-button-group>button:nth-child(3)'
        )
        prevBtn3.addEventListener('click', () => {
          console.log('下个月')
        })
      })
    },
    handleAddClick(data) {
      // debugger;
      // console.log(data);
      this.dialogVisible = true
      this.formData.data = data.day
    },
    handleEventClick(item) {
    //   console.log("update...");
      this.formData.component = item.component
      this.formData.loginName = item.loginName
      this.formData.id = item.id
      this.isupdate = true
    },
    add() {
      const url = jiraBugServer + '/api/addContent'
      const params = {
        dutyDate: this.formData.data,
        loginName: this.formData.loginName.loginName,
        userName: this.formData.loginName.userName,
        component: this.product
      }
      this.calendarData.push(params)
      this.$post(url, params).then(res => {
        if (res.code == 8000) {
          this.$message.success(res.msg)
          this.getCalendarData()
        }
      })
    //   console.log(this.calendarData);
      // console.log(this.formData);
      // this.formData = {};
    },
    update() {
      const url = jiraBugServer + '/api/editContent'

      this.calendarData.forEach(item => {
        if (item.id == this.formData.id) {
          item.component = this.product
          item.dutyDate = this.formData.data
          item.loginName = this.formData.loginName.loginName
          item.userName = this.formData.loginName.userName
          this.$post(url, item).then(res => {
            if (res.code == 8000) {
              this.$message.success(res.msg)
              this.getCalendarData()
            }
          })
        }
      })
      this.isupdate = false
      // this.formData = {};
    },
    cancel() {
      this.isupdate = false
      // this.formData = {};
    }
  }
}
</script>

<style>
.calendar-day {
  text-align: center;
  color: #202535;
  background-color:rgb(163, 241, 238);
  line-height: 30px;
  font-size: 12px;
}
.is-selected {
  color: #f8a535;
  font-size: 10px;
  margin-top: 5px;
}
#calendar
  .el-button-group
  > .el-button:not(:first-child):not(:last-child):after {
  content: "当月";
}

.fc-day-grid-event {
  margin: 1px 2px 0;
  padding: 0 1px;
}
</style>

创建axios实例


import axios from "axios";

// For common config
axios.defaults.headers.post["Content-Type"] = "application/json";

const mainAxios = axios.create({
  baseURL: 'https://dingtalk.nige.com',
  timeout: 30000
});

export function fetch(url, config = {}) {
  return new Promise((resolve, reject) => {
    mainAxios.get(url, { params: config })
      .then(response => {
        resolve(response.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

统一改变后端返回的java Long类型

当后端的Long类型返回超过前端JS能处理的长度时,那么可以在前端统一处理成String.

  1. 安装json-bigint
  2. 在的JS文件中使用var jsonBig = require(‘json-bigint’)
  3. 在请求的方法中使用:
export function post(url, data = {}, config = { transformResponse: [data => jsonBig.parse(data)] }) {
  // export function post(url, data = {}, config = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data, config)
      .then(response => {
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
}

参考链接,感谢 https://blog.csdn.net/qq_39863107/article/details/105712061

 类似资料: