Commit fca2c200 authored by 陈浩玮's avatar 陈浩玮

系统管理

parent b49612b9
......@@ -4,6 +4,7 @@
"homepage": "https://iczer.github.io/vue-antd-admin",
"private": true,
"scripts": {
"start": "vue-cli-service serve",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
......
import { delReq, getReq, postReq, putReq } from '@/utils';
function getJobsApi(data) {
return getReq('/api/v1/jobs', data);
}
function addJobsApi(data) {
return postReq('/api/v1/jobs', data);
}
......@@ -8,12 +12,28 @@ function updateJobsApi(data) {
return putReq('/api/v1/jobs', data);
}
function getOrganizationList(data) {
function getOrganizationListApi(data) {
return getReq('/api/v1/organizations', data);
}
function getOrganizationDetailsApi(id) {
return getReq(`/api/v1/organizations/${id}`);
}
function addOrgApi(data) {
return postReq('/api/v1/organizations', data);
}
function updateOrgApi(data) {
return putReq('/api/v1/organizations', data);
}
export default {
addJobs: addJobsApi,
updateJobs: updateJobsApi,
getOrganizationList: getOrganizationList,
getOrganizationList: getOrganizationListApi,
getJobs: getJobsApi,
getOrganizationDetails: getOrganizationDetailsApi,
addOrg: addOrgApi,
updateOrg: updateOrgApi,
};
<template>
<div class="components-input-demo-presuffix">
<a-input :placeholder="placeholder" :value="cron" @input="handleinput">
<a-icon slot="prefix" type="schedule" title="corn控件" @click="openModal" />
<a-icon v-if="cron" slot="suffix" type="close-circle" @click="handleEmpty" title="清空" />
</a-input>
<AntCron ref="innerVueCron" :data="afterCron" @ok="handleOK"></AntCron>
</div>
</template>
<script>
import AntCron from "./AntCron";
import { replaceWeekName } from "./validator";
export default {
name: "ACron",
components: {
AntCron
},
props: {
value: {
required: false,
type: String,
default: ""
},
placeholder: {
required: false,
type: String,
default: ""
}
},
data() {
return {
cron: this.value,
afterCron: ""
};
},
watch: {
value(val) {
this.cron = val;
},
cron(val) {
console.log(replaceWeekName(val));
this.afterCron = replaceWeekName(val);
console.log(val);
this.$emit("input", val);
}
},
methods: {
openModal() {
this.$refs.innerVueCron.show();
},
handleOK(val) {
this.cron = val;
this.$emit("change", this.cron);
},
handleinput(evt) {
this.cron = evt.target.value;
if (this.cron !== "") {
this.$emit("change", this.cron);
} else {
this.$emit("change", undefined);
}
},
handleEmpty() {
this.handleOK("");
}
},
model: {
prop: "value",
event: "change"
}
};
</script>
<style scoped>
.components-input-demo-presuffix .anticon-close-circle {
cursor: pointer;
color: #ccc;
transition: color 0.3s;
font-size: 12px;
}
.components-input-demo-presuffix .anticon-close-circle:hover {
color: #f5222d;
}
.components-input-demo-presuffix .anticon-close-circle:active {
color: #666;
}
</style>
\ No newline at end of file
<template>
<a-modal
title="corn表达式"
:width="modalWidth"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleSubmit"
@cancel="close"
cancelText="关闭"
>
<div class="card-container">
<a-tabs type="card">
<a-tab-pane key="1" type="card">
<span slot="tab">
<a-icon type="schedule" />
</span>
<a-radio-group v-model="result.second.cronEvery">
<a-row>
<a-radio value="1">每一秒钟</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.second.incrementIncrement"
:min="1"
:max="60"
></a-input-number>秒执行 从
<a-input-number
size="small"
v-model="result.second.incrementStart"
:min="0"
:max="59"
></a-input-number>秒开始
</a-radio>
</a-row>
<a-row>
<a-radio value="3">具体秒数(可多选)</a-radio>
<a-select
style="width:354px;"
size="small"
mode="multiple"
v-model="result.second.specificSpecific"
>
<a-select-option v-for="(val,index) in 60" :key="index" :value="index">{{ index }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="4">
周期从
<a-input-number size="small" v-model="result.second.rangeStart" :min="1" :max="60"></a-input-number>
<a-input-number size="small" v-model="result.second.rangeEnd" :min="0" :max="59"></a-input-number>
</a-radio>
</a-row>
</a-radio-group>
</a-tab-pane>
<a-tab-pane key="2">
<span slot="tab">
<a-icon type="schedule" />
</span>
<div class="tabBody">
<a-radio-group v-model="result.minute.cronEvery">
<a-row>
<a-radio value="1">每一分钟</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.minute.incrementIncrement"
:min="1"
:max="60"
></a-input-number>分执行 从
<a-input-number
size="small"
v-model="result.minute.incrementStart"
:min="0"
:max="59"
></a-input-number>分开始
</a-radio>
</a-row>
<a-row>
<a-radio value="3">具体分钟数(可多选)</a-radio>
<a-select
style="width:340px;"
size="small"
mode="multiple"
v-model="result.minute.specificSpecific"
>
<a-select-option
v-for="(val,index) in Array(60)"
:key="index"
:value="index"
>{{ index }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="4">
周期从
<a-input-number
size="small"
v-model="result.minute.rangeStart"
:min="1"
:max="60"
></a-input-number>
<a-input-number size="small" v-model="result.minute.rangeEnd" :min="0" :max="59"></a-input-number>
</a-radio>
</a-row>
</a-radio-group>
</div>
</a-tab-pane>
<a-tab-pane key="3">
<span slot="tab">
<a-icon type="schedule" />
</span>
<div class="tabBody">
<a-radio-group v-model="result.hour.cronEvery">
<a-row>
<a-radio value="1">每一小时</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.hour.incrementIncrement"
:min="0"
:max="23"
></a-input-number>小时执行 从
<a-input-number
size="small"
v-model="result.hour.incrementStart"
:min="0"
:max="23"
></a-input-number>小时开始
</a-radio>
</a-row>
<a-row>
<a-radio class="long" value="3">具体小时数(可多选)</a-radio>
<a-select
style="width:340px;"
size="small"
mode="multiple"
v-model="result.hour.specificSpecific"
>
<a-select-option v-for="(val,index) in Array(24)" :key="index">{{ index }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="4">
周期从
<a-input-number size="small" v-model="result.hour.rangeStart" :min="0" :max="23"></a-input-number>
<a-input-number size="small" v-model="result.hour.rangeEnd" :min="0" :max="23"></a-input-number>小时
</a-radio>
</a-row>
</a-radio-group>
</div>
</a-tab-pane>
<a-tab-pane key="4">
<span slot="tab">
<a-icon type="schedule" />
</span>
<div class="tabBody">
<a-radio-group v-model="result.day.cronEvery">
<a-row>
<a-radio value="1">每一天</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.week.incrementIncrement"
:min="1"
:max="7"
></a-input-number>周执行 从
<a-select size="small" v-model="result.week.incrementStart">
<a-select-option
v-for="(val,index) in Array(7)"
:key="index"
:value="index-1"
>{{ weekDays[index-1] }}</a-select-option>
</a-select>开始
</a-radio>
</a-row>
<a-row>
<a-radio value="3">
每隔
<a-input-number
size="small"
v-model="result.day.incrementIncrement"
:min="1"
:max="31"
></a-input-number>天执行 从
<a-input-number
size="small"
v-model="result.day.incrementStart"
:min="1"
:max="31"
></a-input-number>日开始
</a-radio>
</a-row>
<a-row>
<a-radio class="long" value="4">具体星期几(可多选)</a-radio>
<a-select
style="width:340px;"
size="small"
mode="multiple"
v-model="result.week.specificSpecific"
>
<a-select-option
v-for="(val,index) in Array(7)"
:key="index"
:value="index-1"
>{{ weekDays[index-1] }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio class="long" value="5">具体天数(可多选)</a-radio>
<a-select
style="width:354px;"
size="small"
mode="multiple"
v-model="result.day.specificSpecific"
>
<a-select-option
v-for="(val,index) in Array(31)"
:key="index"
:value="index+1"
>{{ index+1 }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="6">在这个月的最后一天</a-radio>
</a-row>
<a-row>
<a-radio value="7">在这个月的最后一个工作日</a-radio>
</a-row>
<a-row>
<a-radio value="8">
在这个月的最后一个
<a-select size="small" v-model="result.day.cronLastSpecificDomDay">
<a-select-option
v-for="(val,index) in Array(7)"
:key="index"
:value="index+1"
>{{ weekDays[index] }}</a-select-option>
</a-select>
</a-radio>
</a-row>
<a-row>
<a-radio value="9">
在本月底前
<a-input-number
size="small"
v-model="result.day.cronDaysBeforeEomMinus"
:min="1"
:max="31"
></a-input-number>
</a-radio>
</a-row>
<a-row>
<a-radio value="10">
最近的工作日(周一至周五)至本月
<a-input-number
size="small"
v-model="result.day.cronDaysNearestWeekday"
:min="1"
:max="31"
></a-input-number>
</a-radio>
</a-row>
<a-row>
<a-radio value="11">
在这个月的第
<a-input-number
size="small"
v-model="result.week.cronNthDayNth"
:min="1"
:max="5"
></a-input-number>
<a-select size="small" v-model="result.week.cronNthDayDay">
<a-select-option
v-for="(val,index) in Array(7)"
:key="index"
:value="index"
>{{ weekDays[index] }}</a-select-option>
</a-select>
</a-radio>
</a-row>
</a-radio-group>
</div>
</a-tab-pane>
<a-tab-pane key="5">
<span slot="tab">
<a-icon type="schedule" />
</span>
<div class="tabBody">
<a-radio-group v-model="result.month.cronEvery">
<a-row>
<a-radio value="1">每一月</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.month.incrementIncrement"
:min="0"
:max="12"
></a-input-number>月执行 从
<a-input-number
size="small"
v-model="result.month.incrementStart"
:min="0"
:max="12"
></a-input-number>月开始
</a-radio>
</a-row>
<a-row>
<a-radio class="long" value="3">具体月数(可多选)</a-radio>
<a-select
style="width:354px;"
size="small"
filterable
mode="multiple"
v-model="result.month.specificSpecific"
>
<a-select-option
v-for="(val,index) in Array(12)"
:key="index"
:value="index+1"
>{{ index+1 }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="4">
<a-input-number size="small" v-model="result.month.rangeStart" :min="1" :max="12"></a-input-number>
<a-input-number size="small" v-model="result.month.rangeEnd" :min="1" :max="12"></a-input-number>月之间的每个月
</a-radio>
</a-row>
</a-radio-group>
</div>
</a-tab-pane>
<a-tab-pane key="6">
<span slot="tab">
<a-icon type="schedule" />
</span>
<div class="tabBody">
<a-radio-group v-model="result.year.cronEvery">
<a-row>
<a-radio value="1">每一年</a-radio>
</a-row>
<a-row>
<a-radio value="2">
每隔
<a-input-number
size="small"
v-model="result.year.incrementIncrement"
:min="1"
:max="99"
></a-input-number>年执行 从
<a-input-number
size="small"
v-model="result.year.incrementStart"
:min="curYear"
:max="curYear+100"
></a-input-number>年开始
</a-radio>
</a-row>
<a-row>
<a-radio class="long" value="3">具体年份(可多选)</a-radio>
<a-select
style="width:354px;"
size="small"
filterable
mode="multiple"
v-model="result.year.specificSpecific"
>
<a-select-option
v-for="(val,index) in Array(100)"
:key="index"
:value="curYear+index-1"
>{{ curYear+index-1 }}</a-select-option>
</a-select>
</a-row>
<a-row>
<a-radio value="4">
<a-input-number
size="small"
v-model="result.year.rangeStart"
:min="curYear"
:max="curYear+100"
></a-input-number>
<a-input-number
size="small"
v-model="result.year.rangeEnd"
:min="curYear"
:max="curYear+100"
></a-input-number>年之间的每一年
</a-radio>
</a-row>
</a-radio-group>
</div>
</a-tab-pane>
</a-tabs>
<div class="bottom">
<span class="value">{{this.cron }}</span>
</div>
</div>
</a-modal>
</template>
<script>
const now = new Date();
const curYear = now.getFullYear();
export default {
name: "AntCron",
props: ["data"],
data() {
return {
curYear,
visible: false,
confirmLoading: false,
size: "large",
weekDays: ["", "", "", "", "", "", ""].map(
val => "星期" + val
),
result: {
second: {},
minute: {},
hour: {},
day: {},
week: {},
month: {},
year: {}
},
defaultValue: {
second: {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: 0,
specificSpecific: []
},
minute: {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: "0",
specificSpecific: []
},
hour: {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: "0",
rangeEnd: "0",
specificSpecific: []
},
day: {
cronEvery: "",
incrementStart: 1,
incrementIncrement: "1",
rangeStart: "",
rangeEnd: "",
specificSpecific: [],
cronLastSpecificDomDay: 1,
cronDaysBeforeEomMinus: 1,
cronDaysNearestWeekday: 1
},
week: {
cronEvery: "",
incrementStart: 1,
incrementIncrement: 1,
specificSpecific: [],
cronNthDayDay: 1,
cronNthDayNth: 1
},
month: {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: 1,
specificSpecific: []
},
year: {
cronEvery: "",
incrementStart: curYear,
incrementIncrement: 1,
rangeStart: curYear,
rangeEnd: curYear,
specificSpecific: []
},
label: ""
}
};
},
computed: {
modalWidth() {
return 608;
},
secondsText() {
let seconds = "";
let cronEvery = this.result.second.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
seconds = "*";
break;
case "2":
seconds =
this.result.second.incrementStart +
"/" +
this.result.second.incrementIncrement;
break;
case "3":
this.result.second.specificSpecific.map(val => {
seconds += val + ",";
});
seconds = seconds.slice(0, -1);
break;
case "4":
seconds =
this.result.second.rangeStart + "-" + this.result.second.rangeEnd;
break;
}
return seconds;
},
minutesText() {
let minutes = "";
let cronEvery = this.result.minute.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
minutes = "*";
break;
case "2":
minutes =
this.result.minute.incrementStart +
"/" +
this.result.minute.incrementIncrement;
break;
case "3":
this.result.minute.specificSpecific.map(val => {
minutes += val + ",";
});
minutes = minutes.slice(0, -1);
break;
case "4":
minutes =
this.result.minute.rangeStart + "-" + this.result.minute.rangeEnd;
break;
}
return minutes;
},
hoursText() {
let hours = "";
let cronEvery = this.result.hour.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
hours = "*";
break;
case "2":
hours =
this.result.hour.incrementStart +
"/" +
this.result.hour.incrementIncrement;
break;
case "3":
this.result.hour.specificSpecific.map(val => {
hours += val + ",";
});
hours = hours.slice(0, -1);
break;
case "4":
hours = this.result.hour.rangeStart + "-" + this.result.hour.rangeEnd;
break;
}
return hours;
},
daysText() {
let days = "";
let cronEvery = this.result.day.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
break;
case "2":
case "4":
case "11":
days = "?";
break;
case "3":
days =
this.result.day.incrementStart +
"/" +
this.result.day.incrementIncrement;
break;
case "5":
this.result.day.specificSpecific.map(val => {
days += val + ",";
});
days = days.slice(0, -1);
break;
case "6":
days = "L";
break;
case "7":
days = "LW";
break;
case "8":
days = this.result.day.cronLastSpecificDomDay + "L";
break;
case "9":
days = "L-" + this.result.day.cronDaysBeforeEomMinus;
break;
case "10":
days = this.result.day.cronDaysNearestWeekday + "W";
break;
}
return days;
},
weeksText() {
let weeks = "";
let cronEvery = this.result.day.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
case "3":
case "5":
weeks = "?";
break;
case "2":
weeks =
this.result.week.incrementStart +
"/" +
this.result.week.incrementIncrement;
break;
case "4":
this.result.week.specificSpecific.map(val => {
weeks += val + ",";
});
weeks = weeks.slice(0, -1);
break;
case "6":
case "7":
case "8":
case "9":
case "10":
weeks = "?";
break;
case "11":
weeks =
this.result.week.cronNthDayDay +
"#" +
this.result.week.cronNthDayNth;
break;
}
return weeks;
},
monthsText() {
let months = "";
let cronEvery = this.result.month.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
months = "*";
break;
case "2":
months =
this.result.month.incrementStart +
"/" +
this.result.month.incrementIncrement;
break;
case "3":
this.result.month.specificSpecific.map(val => {
months += val + ",";
});
months = months.slice(0, -1);
break;
case "4":
months =
this.result.month.rangeStart + "-" + this.result.month.rangeEnd;
break;
}
return months;
},
yearsText() {
let years = "";
let cronEvery = this.result.year.cronEvery || "";
switch (cronEvery.toString()) {
case "1":
years = "*";
break;
case "2":
years =
this.result.year.incrementStart +
"/" +
this.result.year.incrementIncrement;
break;
case "3":
this.result.year.specificSpecific.map(val => {
years += val + ",";
});
years = years.slice(0, -1);
break;
case "4":
years = this.result.year.rangeStart + "-" + this.result.year.rangeEnd;
break;
}
return years;
},
cron() {
return `${this.secondsText || "*"} ${this.minutesText || "*"} ${this
.hoursText || "*"} ${this.daysText || "*"} ${this.monthsText ||
"*"} ${this.weeksText || "?"} ${this.yearsText || "*"}`;
}
},
watch: {
visible: {
handler() {
let label = this.data;
if (label) {
label = label.trim();
const len = label.split(" ").length;
switch (true) {
case len > 0:
this.secondsReverseExp(label);
case len > 1:
this.minutesReverseExp(label);
case len > 2:
this.hoursReverseExp(label);
case len > 3:
this.daysReverseExp(label);
case len > 4:
this.daysReverseExp(label);
case len > 5:
this.monthsReverseExp(label);
case len > 6:
this.yearReverseExp(label);
}
} else {
this.result = JSON.parse(JSON.stringify(this.defaultValue));
}
}
}
},
methods: {
show() {
this.visible = true;
},
handleSubmit() {
this.$emit("ok", this.cron);
this.close();
this.visible = false;
},
close() {
this.visible = false;
},
secondsReverseExp(seconds) {
let val = seconds.split(" ")[0];
let second = {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: 0,
specificSpecific: []
};
switch (true) {
case val.includes("*"):
second.cronEvery = "1";
break;
case val.includes("/"):
second.cronEvery = "2";
second.incrementStart = val.split("/")[0];
second.incrementIncrement = val.split("/")[1];
break;
case val.includes(","):
second.cronEvery = "3";
second.specificSpecific = val
.split(",")
.map(Number)
.sort();
break;
case val.includes("-"):
second.cronEvery = "4";
second.rangeStart = val.split("-")[0];
second.rangeEnd = val.split("-")[1];
break;
default:
second.cronEvery = "3";
second.specificSpecific = [val];
}
this.result.second = second;
},
minutesReverseExp(minutes) {
let val = minutes.split(" ")[1];
let minute = {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: 0,
specificSpecific: []
};
switch (true) {
case val.includes("*"):
minute.cronEvery = "1";
break;
case val.includes("/"):
minute.cronEvery = "2";
minute.incrementStart = val.split("/")[0];
minute.incrementIncrement = val.split("/")[1];
break;
case val.includes(","):
minute.cronEvery = "3";
minute.specificSpecific = val
.split(",")
.map(Number)
.sort();
break;
case val.includes("-"):
minute.cronEvery = "4";
minute.rangeStart = val.split("-")[0];
minute.rangeEnd = val.split("-")[1];
break;
default:
minute.cronEvery = "3";
minute.specificSpecific = [val];
}
this.result.minute = minute;
},
hoursReverseExp(hours) {
let val = hours.split(" ")[2];
let hour = {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: "0",
specificSpecific: []
};
switch (true) {
case val.includes("*"):
hour.cronEvery = "1";
break;
case val.includes("/"):
hour.cronEvery = "2";
hour.incrementStart = val.split("/")[0];
hour.incrementIncrement = val.split("/")[1];
break;
case val.includes(","):
hour.cronEvery = "3";
hour.specificSpecific = val
.split(",")
.map(Number)
.sort();
break;
case val.includes("-"):
hour.cronEvery = "4";
hour.rangeStart = val.split("-")[0];
hour.rangeEnd = val.split("-")[1];
break;
default:
hour.cronEvery = "3";
hour.specificSpecific = [val];
}
this.result.hour = hour;
},
daysReverseExp(cron) {
let days = cron.split(" ")[3];
let weeks = cron.split(" ")[5];
let day = {
cronEvery: "",
incrementStart: 1,
incrementIncrement: 1,
rangeStart: 1,
rangeEnd: 1,
specificSpecific: [],
cronLastSpecificDomDay: 1,
cronDaysBeforeEomMinus: 1,
cronDaysNearestWeekday: 1
};
let week = {
cronEvery: "",
incrementStart: 1,
incrementIncrement: 1,
specificSpecific: [],
cronNthDayDay: 1,
cronNthDayNth: 1
};
if (!days.includes("?")) {
switch (true) {
case days.includes("*"):
day.cronEvery = "1";
break;
case days.includes("?"):
break;
case days.includes("/"):
day.cronEvery = "3";
day.incrementStart = days.split("/")[0];
day.incrementIncrement = days.split("/")[1];
break;
case days.includes(","):
day.cronEvery = "5";
day.specificSpecific = days
.split(",")
.map(Number)
.sort();
break;
case days.includes("LW"):
day.cronEvery = "7";
break;
case days.includes("L-"):
day.cronEvery = "9";
day.cronDaysBeforeEomMinus = days.split("L-")[1];
break;
case days.includes("L"):
if (days.len == 1) {
day.cronEvery = "6";
day.cronLastSpecificDomDay = "1";
} else {
day.cronEvery = "8";
day.cronLastSpecificDomDay = Number(days.split("L")[0]);
}
break;
case days.includes("W"):
day.cronEvery = "10";
day.cronDaysNearestWeekday = days.split("W")[0];
break;
default:
day.cronEvery = "5";
day.specificSpecific = [days];
}
} else {
switch (true) {
case weeks.includes("/"):
day.cronEvery = "2";
week.incrementStart = parseInt(weeks.split("/")[0]);
week.incrementIncrement = parseInt(weeks.split("/")[1]);
break;
case weeks.includes(","):
day.cronEvery = "4";
week.specificSpecific = weeks
.split(",")
.map(Number)
.sort();
break;
case weeks.includes("#"):
day.cronEvery = "11";
week.cronNthDayDay = parseInt(weeks.split("#")[0]);
week.cronNthDayNth = parseInt(weeks.split("#")[1]);
break;
// case weeks.includes("-"):
// day.cronEvery = "11";
// week.cronNthDayDay = parseInt(weeks.split("#")[0]);
// week.cronNthDayNth = parseInt(weeks.split("#")[1]);
// break;
default:
day.cronEvery = "4";
week.cronEvery = "4";
week.specificSpecific = [parseInt(weeks)];
}
}
this.result.day = day;
this.result.week = week;
},
monthsReverseExp(cron) {
let months = cron.split(" ")[4];
let month = {
cronEvery: "",
incrementStart: 3,
incrementIncrement: 5,
rangeStart: 1,
rangeEnd: 1,
specificSpecific: []
};
switch (true) {
case months.includes("*"):
month.cronEvery = "1";
break;
case months.includes("/"):
month.cronEvery = "2";
month.incrementStart = months.split("/")[0];
month.incrementIncrement = months.split("/")[1];
break;
case months.includes(","):
month.cronEvery = "3";
month.specificSpecific = months
.split(",")
.map(Number)
.sort();
break;
case months.includes("-"):
month.cronEvery = "4";
month.rangeStart = months.split("-")[0];
month.rangeEnd = months.split("-")[1];
break;
default:
month.cronEvery = "3";
month.specificSpecific = [months];
}
this.result.month = month;
},
yearReverseExp(cron) {
let years = cron.split(" ")[6];
let year = {
cronEvery: "",
incrementStart: curYear,
incrementIncrement: 5,
rangeStart: curYear,
rangeEnd: curYear,
specificSpecific: []
};
if (years !== undefined) {
switch (true) {
case years.includes("*"):
year.cronEvery = "1";
break;
case years.includes("/"):
year.cronEvery = "2";
year.incrementStart = years.split("/")[0];
year.incrementIncrement = years.split("/")[1];
break;
case years.includes(","):
year.cronEvery = "3";
year.specificSpecific = years
.split(",")
.map(Number)
.sort();
break;
case years.includes("-"):
year.cronEvery = "4";
year.rangeStart = years.split("-")[0];
year.rangeEnd = years.split("-")[1];
break;
default:
year.cronEvery = "3";
year.specificSpecific = [years];
}
} else {
year.cronEvery = "1";
}
this.result.year = year;
}
}
};
</script>
<style lang="scss">
.card-container {
background: #fff;
overflow: hidden;
padding: 12px;
position: relative;
width: 100%;
.ant-tabs {
border: 1px solid #e6ebf5;
padding: 0;
.ant-tabs-bar {
margin: 0;
outline: none;
border-bottom: none;
.ant-tabs-nav-container {
margin: 0;
.ant-tabs-tab {
padding: 0 24px !important;
background-color: #f5f7fa !important;
margin-right: 0px !important;
border-radius: 0;
line-height: 38px;
border: 1px solid transparent !important;
border-bottom: 1px solid #e6ebf5 !important;
}
.ant-tabs-tab-active.ant-tabs-tab {
color: #409eff;
background-color: #fff !important;
border-right: 1px solid #e6ebf5 !important;
border-left: 1px solid #e6ebf5 !important;
border-bottom: 1px solid #fff !important;
font-weight: normal;
transition: none !important;
}
}
}
.ant-tabs-tabpane {
padding: 15px;
.ant-row {
margin: 10px 0;
}
.ant-select,
.ant-input-number {
width: 100px;
}
}
}
}
</style>
<style lang="scss" scoped>
.container-widthEn {
width: 755px;
}
.container-widthCn {
width: 608px;
}
.language {
text-align: center;
position: absolute;
right: 13px;
top: 13px;
border: 1px solid transparent;
height: 40px;
line-height: 38px;
font-size: 16px;
color: #409eff;
z-index: 1;
background: #f5f7fa;
outline: none;
width: 47px;
border-bottom: 1px solid #e6ebf5;
border-radius: 0;
}
.card-container {
.bottom {
display: flex;
justify-content: center;
padding: 10px 0 0 0;
.cronButton {
margin: 0 10px;
line-height: 40px;
}
}
}
.tabBody {
.a-row {
margin: 10px 0;
.long {
.a-select {
width: 354px;
}
}
.a-input-number {
width: 110px;
}
}
}
</style>
\ No newline at end of file
import ACron from './ACron'
export default ACron
\ No newline at end of file
// import CronParser from 'cron-parser'
export const WEEK_MAP_EN = {
'sun': '0',
'mon': '1',
'tue': '2',
'wed': '3',
'thu': '4',
'fri': '5',
'sat': '6',
}
export const replaceWeekName = (c) => {
if (c) {
c = c.toLowerCase()
Object.keys(WEEK_MAP_EN).forEach(k => {
c = c.replace(new RegExp(k, 'g'), WEEK_MAP_EN[k])
})
c = c.replace(new RegExp('7', 'g'), '0')
}
return c
}
<template>
<a-select
:value="value"
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="Please select"
allow-clear
:options="data"
v-on="$listeners"
v-bind="$attrs"
/>
</template>
<script>
import { formatObj } from '@/utils';
export default {
model: {
prop: 'value',
event: 'change',
},
props: {
value: [String, Number, Array],
request: Function,
},
data() {
return {
data: [],
};
},
async mounted() {
if (this.request) {
const newArr = await this.request();
this.data = await formatObj(newArr, { value: 'jobId', label: 'jobName', key: 'jobId' });
}
},
};
</script>
......@@ -24,13 +24,22 @@
<a-button :type="btn.primary" :key="btn.text">{{ btn.text }}</a-button>
</template>
</a-space>
<div class="tw-mb-2">
<a-alert
v-if="selectedRowKeys.length"
:message="`已选择${selectedRowKeys.length}项`"
type="success"
closable
:after-close="handleClose"
/>
</div>
<a-table
:data-source="data"
:loading="loading"
v-bind="$attrs"
:pagination="pagination"
@change="pageChange"
:row-selection="isRowSelection"
>
<slot />
</a-table>
......@@ -85,6 +94,7 @@ export default {
},
formatData: Function,
noPage: Boolean,
rowSelection: Object, // radio OR checkbox
},
data() {
return {
......@@ -114,6 +124,8 @@ export default {
wrapperCol: { span: 20 },
},
total: 0,
selectedRowKeys: [],
selectedRows: [],
};
},
watch: {
......@@ -135,6 +147,15 @@ export default {
total: this.total,
};
},
isRowSelection() {
return this.rowSelection
? {
...this.rowSelection,
selectedRowKeys: this.selectedRowKeys,
onChange: this.onSelectChange,
}
: undefined;
},
},
methods: {
......@@ -202,6 +223,21 @@ export default {
this.initQuery.pageNum = page.current;
this.getData();
},
onSelectChange(selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys;
this.selectedRows = selectedRows;
},
handleClose() {
this.selectedRowKeys = [];
this.selectedRows = [];
},
getSelectedRowKeys() {
return this.selectedRowKeys;
},
getTableData() {
return this.data;
},
},
};
</script>
......
<template>
<div>
<a-tree-select
:value="value"
show-search
......@@ -11,9 +10,7 @@
tree-default-expand-all
:replaceFields="replaceFields"
v-on="$listeners"
>
</a-tree-select>
</div>
/>
</template>
<script>
......@@ -25,7 +22,7 @@ export default {
event: 'change',
},
props: {
value: [Object, Array],
value: Number,
showMenu: Boolean,
},
data() {
......
import Jobs from './Jobs';
export default Jobs;
<template>
<my-table
url="/api/v1/organizations"
rowKey="orgId"
:addBtn="addBtn"
ref="table"
:formatData="formatData"
noPage
:rowSelection="{ type: 'radio', getCheckboxProps, selections: true }"
>
<template #drawer>
<Form ref="form" :tableRef="$refs['table']" />
</template>
<a-table-column title="名称" data-index="orgName" />
<a-table-column title="组织分类" #default="row">
<a-tag color="#87d068" v-if="row.orgType === 'ORGANIZATION'"> {{ row.orgTypeName }}</a-tag>
<a-tag color="#108ee9" v-if="row.orgType === 'DEPARTMENT'"> {{ row.orgTypeName }}</a-tag>
</a-table-column>
<a-table-column title="说明" data-index="remark" />
<a-table-column title="操作">
<template #default="row">
<a @click="() => view(row, 1)">编辑</a>
<a-divider type="vertical" />
<PopconfirmDelete :url="`/api/v1/organizations/${row.orgId}`" :cb="refreshTable" />
</template>
</a-table-column>
</my-table>
</template>
<script>
import Form from './form.vue';
import PopconfirmDelete from '@/components/popconfirm_delete/index.vue';
import { arrayToTree } from '@/utils';
import api from '@/api/organization';
export default {
components: { Form, PopconfirmDelete },
data() {
return {
addBtn: { width: 600, onOk: () => this.$refs['form']?.submit(), openBefore: () => {} },
selectedRowKeys: [],
};
},
methods: {
refreshTable() {
this.$refs['table']?.getData();
},
async view(data, type) {
this.$refs['table']?.show({ type });
const detailData = await api.getOrganizationDetails(data.orgId);
this.$nextTick(() => {
this.$refs['form'].setData({ ...detailData }, type);
});
},
formatData(data) {
const newArr = new arrayToTree({
data: data,
rootValue: 0,
parentKey: 'parentOrgId',
key: 'orgId',
}).treeData;
return newArr;
},
getCheckboxProps(record) {
return {
props: {
...record,
disabled: record.orgType === 'DEPARTMENT',
},
};
},
},
};
</script>
\ No newline at end of file
<template>
<a-form-model layout="vertical" :model="form" :rules="rules" ref="DrawerForm">
<a-form-model-item label="组织分类" prop="orgType">
<a-select v-model="form.orgType" :disabled="isView">
<a-select-option value="ORGANIZATION"> 组织 </a-select-option>
<a-select-option value="DEPARTMENT"> 部门 </a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="名称" prop="orgName">
<a-input v-model="form.orgName" :disabled="isView" />
</a-form-model-item>
<a-form-model-item label="上级组织名称" prop="parentOrgId">
<a-select v-model="form.parentOrgId" disabled :options="options" />
</a-form-model-item>
<a-form-model-item v-if="form.orgType === 'DEPARTMENT'" label="岗位" prop="orgJobs">
<MySelect :request="Api.getJobs" v-model="form.orgJobs" mode="multiple" :disabled="isView" />
</a-form-model-item>
<a-form-model-item label="显示顺序" prop="viewIndex">
<a-input v-model="form.viewIndex" :disabled="isView" />
</a-form-model-item>
<a-form-model-item label="描述" prop="remark">
<a-textarea v-model="form.remark" :disabled="isView" :rows="4" />
</a-form-model-item>
</a-form-model>
</template>
<script>
import Api from '@/api/organization';
import FormMixin from '@/components/FormMixin';
import MySelect from '@/components/MySelect/index.vue';
export default {
mixins: [FormMixin],
components: { MySelect },
props: {
tableRef: Object,
},
created() {
const dataArr = this.tableRef
?.getTableData()
.map((i) => ({ value: i.orgId, label: i.orgName, key: i.orgId }));
const parentOrgId = this.tableRef?.getSelectedRowKeys()[0];
this.options = [...this.options, ...dataArr];
this.form.parentOrgId = parentOrgId || 0;
},
data() {
return {
options: [{ value: 0, label: '组织更目录', key: 0 }],
form: {
parentOrgId: 0,
},
rules: {
orgName: [{ required: true, message: 'Please select Activity zone', trigger: 'change' }],
orgType: [{ required: true, message: 'Please select Activity zone', trigger: 'change' }],
viewIndex: [{ required: true, message: 'Please select Activity zone', trigger: 'change' }],
},
Api,
};
},
methods: {
add() {
return Api.addOrg({ ...this.form });
},
edit() {
return Api.updateOrg({ ...this.form });
},
},
};
</script>
import User from './User';
export default User;
......@@ -79,20 +79,21 @@ const options = {
path: 'job_management',
name: '岗位管理',
component: () =>
import('@/pages/system/view/organization/jobsmanagement'),
import('@/pages/system/view/organization/jobsmanagement/Jobs.vue'),
},
{
path: 'user_management',
name: '用户管理',
component: () =>
import('@/pages/system/view/organization/usermanagement'),
},
],
import('@/pages/system/view/organization/usermanagement/User.vue'),
},
{
path: 'user_management',
name: '用户管理',
component: () => import('@/pages/system/view/user'),
path: 'org_management',
name: '机构管理',
component: () =>
import('@/pages/system/view/organization/orgmanagement/Org.vue'),
},
],
},
{
path: 'role_management',
......
......@@ -66,6 +66,7 @@ export function arrayToTree(options) {
const THISDATA = JSON.parse(JSON.stringify(this.data));
for (let i = 0; i < this.data.length; i++) {
let currentElement = this.data[i];
currentElement.selectable = currentElement.orgType === 'DEPARTMENT';
let tempCurrentElementParent = this.indexStorage[currentElement[this.parentKey]]; // 临时变量里面的当前元素的父元素
if (tempCurrentElementParent) {
// 如果存在父元素
......@@ -88,3 +89,16 @@ export function arrayToTree(options) {
this.toTree();
return this;
}
// select组件 数据格式化
export const formatObj = async (ArrObj, obj) => {
const newData = [...ArrObj];
const newDataOne = await newData.map(i => {
const newObj = { ...i };
Object.keys(obj).forEach(key => {
newObj[key] = i[obj[key]];
});
return newObj;
});
return newDataOne;
};
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment