疯狂的狮子li
2021-09-13 2af534eea471f4adb104906c7a814bcc66d4d68d
Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue into dev

 Conflicts:
 pom.xml
 ruoyi-admin/pom.xml
 ruoyi-admin/src/main/resources/application.yml
 ruoyi-common/pom.xml
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
 ruoyi-framework/pom.xml
 ruoyi-generator/pom.xml
 ruoyi-quartz/pom.xml
 ruoyi-system/pom.xml
 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java
 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
 ruoyi-ui/package.json
 ruoyi-ui/src/components/ImageUpload/index.vue
 ruoyi-ui/src/components/ThemePicker/index.vue
 ruoyi-ui/src/layout/components/Sidebar/Link.vue
 ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue
 ruoyi-ui/src/router/index.js
 ruoyi-ui/src/views/index.vue
 ruoyi-ui/src/views/tool/gen/editTable.vue
 ruoyi-ui/src/views/tool/gen/index.vue
 sql/ry_20210908.sql
已重命名2个文件
已修改25个文件
3815 ■■■■ 文件已修改
pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/day.vue 358 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/index.vue 850 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/month.vue 256 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/result.vue 1132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/second.vue 266 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/week.vue 334 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Crontab/year.vue 288 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/ImageUpload/index.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/ThemePicker/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/layout/components/Sidebar/Link.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/router/index.js 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/system/menu/index.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/tool/gen/editTable.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/tool/gen/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/quartz.sql 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_20210908.sql 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -48,7 +48,7 @@
        <docker.namespace>ruoyi</docker.namespace>
        <docker.plugin.version>1.2.2</docker.plugin.version>
    </properties>
    <!-- ä¾èµ–声明 -->
    <dependencyManagement>
        <dependencies>
@@ -362,4 +362,4 @@
        </profile>
    </profiles>
</project>
</project>
ruoyi-admin/pom.xml
@@ -110,4 +110,4 @@
        </plugins>
    </build>
</project>
</project>
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -66,6 +66,11 @@
    @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
    private String component;
    /**
     * è·¯ç”±å‚æ•°
     */
    private String query;
    /**
     * æ˜¯å¦ä¸ºå¤–链(0是 1否)
     */
ruoyi-framework/pom.xml
@@ -69,4 +69,4 @@
    </dependencies>
</project>
</project>
ruoyi-quartz/pom.xml
@@ -37,4 +37,4 @@
    </dependencies>
</project>
</project>
ruoyi-system/pom.xml
@@ -31,4 +31,4 @@
    </dependencies>
</project>
</project>
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java
@@ -42,6 +42,11 @@
    private String component;
    /**
     * è·¯ç”±å‚数:如 {"id": 1, "name": "ry"}
     */
    private String query;
    /**
     * å½“你一个路由下面的 children å£°æ˜Žçš„路由大于1个时,自动会变成嵌套的模式--如组件页面
     */
    private Boolean alwaysShow;
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
@@ -135,6 +135,7 @@
            router.setName(getRouteName(menu));
            router.setPath(getRouterPath(menu));
            router.setComponent(getComponent(menu));
            router.setQuery(menu.getQuery());
            router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
            List<SysMenu> cMenus = menu.getChildren();
            if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -12,7 +12,8 @@
        <result property="orderNum" column="order_num"/>
        <result property="path" column="path"/>
        <result property="component" column="component"/>
        <result property="isFrame" column="is_frame"/>
        <result property="query" column="query"/>
        <result property="isFrame" column="is_frame"/>
        <result property="isCache" column="is_cache"/>
        <result property="menuType" column="menu_type"/>
        <result property="visible" column="visible"/>
@@ -33,6 +34,7 @@
               order_num,
               path,
               component,
               query,
               is_frame,
               is_cache,
               menu_type,
@@ -51,7 +53,8 @@
                        m.menu_name,
                        m.path,
                        m.component,
                        m.visible,
                        m.query,
                        m.visible,
                        m.status,
                        ifnull(m.perms, '') as perms,
                        m.is_frame,
@@ -67,7 +70,7 @@
    </select>
    <select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.visible, m.status,
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query, m.visible, m.status,
        ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
        from sys_menu m
        left join sys_role_menu rm on m.menu_id = rm.menu_id
@@ -92,6 +95,7 @@
                        m.menu_name,
                        m.path,
                        m.component,
                        m.query,
                        m.visible,
                        m.status,
                        ifnull(m.perms, '') as perms,
ruoyi-ui/src/components/Crontab/day.vue
@@ -1,179 +1,179 @@
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                æ—¥ï¼Œå…è®¸çš„通配符[, - * / L M]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                ä¸æŒ‡å®š
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="0" :max="31" /> -
                <el-input-number v-model='cycle02' :min="0" :max="31" /> æ—¥
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                ä»Ž
                <el-input-number v-model='average01' :min="0" :max="31" /> å·å¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min="0" :max="31" /> æ—¥æ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="5">
                æ¯æœˆ
                <el-input-number v-model='workday' :min="0" :max="31" /> å·æœ€è¿‘的那个工作日
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="6">
                æœ¬æœˆæœ€åŽä¸€å¤©
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="7">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 31" :key="item" :value="item">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            workday: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-day',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            ('day rachange');
            if (this.radioValue === 1) {
                this.$emit('update', 'day', '*', 'day');
                this.$emit('update', 'week', '?', 'day');
                this.$emit('update', 'mouth', '*', 'day');
            } else {
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'day');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'day');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'day');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'day', '?');
                    break;
                case 3:
                    this.$emit('update', 'day', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'day', this.average01 + '/' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'day', this.workday + 'W');
                    break;
                case 6:
                    this.$emit('update', 'day', 'L');
                    break;
                case 7:
                    this.$emit('update', 'day', this.checkboxString);
                    break;
            }
            ('day rachange end');
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'day', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'day', this.averageTotal);
            }
        },
        // æœ€è¿‘工作日值变化时
        workdayChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'day', this.workday + 'W');
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '7') {
                this.$emit('update', 'day', this.checkboxString);
            }
        },
        // çˆ¶ç»„件传递的week发生变化触发
        weekChange() {
            //判断week值与day不能同时为“?”
            if (this.cron.week == '?' && this.radioValue == '2') {
                this.radioValue = '1';
            } else if (this.cron.week !== '?' && this.radioValue != '2') {
                this.radioValue = '2';
            }
        },
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'workdayCheck': 'workdayChange',
        'checkboxString': 'checkboxChange',
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 31)
            this.cycle02 = this.checkNum(this.cycle02, 1, 31)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 31)
            this.average02 = this.checkNum(this.average02, 1, 31)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—工作日格式
        workdayCheck: function () {
            this.workday = this.checkNum(this.workday, 1, 31)
            return this.workday;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                æ—¥ï¼Œå…è®¸çš„通配符[, - * / L M]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                ä¸æŒ‡å®š
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="0" :max="31" /> -
                <el-input-number v-model='cycle02' :min="0" :max="31" /> æ—¥
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                ä»Ž
                <el-input-number v-model='average01' :min="0" :max="31" /> å·å¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min="0" :max="31" /> æ—¥æ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="5">
                æ¯æœˆ
                <el-input-number v-model='workday' :min="0" :max="31" /> å·æœ€è¿‘的那个工作日
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="6">
                æœ¬æœˆæœ€åŽä¸€å¤©
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="7">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 31" :key="item" :value="item">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            workday: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-day',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            ('day rachange');
            if (this.radioValue === 1) {
                this.$emit('update', 'day', '*', 'day');
                this.$emit('update', 'week', '?', 'day');
                this.$emit('update', 'month', '*', 'day');
            } else {
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'day');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'day');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'day');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'day', '?');
                    break;
                case 3:
                    this.$emit('update', 'day', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'day', this.average01 + '/' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'day', this.workday + 'W');
                    break;
                case 6:
                    this.$emit('update', 'day', 'L');
                    break;
                case 7:
                    this.$emit('update', 'day', this.checkboxString);
                    break;
            }
            ('day rachange end');
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'day', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'day', this.averageTotal);
            }
        },
        // æœ€è¿‘工作日值变化时
        workdayChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'day', this.workday + 'W');
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '7') {
                this.$emit('update', 'day', this.checkboxString);
            }
        },
        // çˆ¶ç»„件传递的week发生变化触发
        weekChange() {
            //判断week值与day不能同时为“?”
            if (this.cron.week == '?' && this.radioValue == '2') {
                this.radioValue = '1';
            } else if (this.cron.week !== '?' && this.radioValue != '2') {
                this.radioValue = '2';
            }
        },
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'workdayCheck': 'workdayChange',
        'checkboxString': 'checkboxChange',
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 31)
            this.cycle02 = this.checkNum(this.cycle02, 1, 31)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 31)
            this.average02 = this.checkNum(this.average02, 1, 31)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—工作日格式
        workdayCheck: function () {
            this.workday = this.checkNum(this.workday, 1, 31)
            return this.workday;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
ruoyi-ui/src/components/Crontab/index.vue
@@ -1,425 +1,425 @@
<template>
  <div>
    <el-tabs type="border-card">
      <el-tab-pane label="秒" v-if="shouldHide('second')">
        <CrontabSecond @update="updateContabValue" :check="checkNumber" ref="cronsecond" />
      </el-tab-pane>
      <el-tab-pane label="分钟" v-if="shouldHide('min')">
        <CrontabMin
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronmin"
        />
      </el-tab-pane>
      <el-tab-pane label="小时" v-if="shouldHide('hour')">
        <CrontabHour
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronhour"
        />
      </el-tab-pane>
      <el-tab-pane label="日" v-if="shouldHide('day')">
        <CrontabDay
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronday"
        />
      </el-tab-pane>
      <el-tab-pane label="月" v-if="shouldHide('mouth')">
        <CrontabMouth
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronmouth"
        />
      </el-tab-pane>
      <el-tab-pane label="周" v-if="shouldHide('week')">
        <CrontabWeek
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronweek"
        />
      </el-tab-pane>
      <el-tab-pane label="å¹´" v-if="shouldHide('year')">
        <CrontabYear
          @update="updateContabValue"
          :check="checkNumber"
          :cron="contabValueObj"
          ref="cronyear"
        />
      </el-tab-pane>
    </el-tabs>
    <div class="popup-main">
      <div class="popup-result">
        <p class="title">时间表达式</p>
        <table>
          <thead>
            <th v-for="item of tabTitles" width="40" :key="item">{{item}}</th>
            <th>Cron è¡¨è¾¾å¼</th>
          </thead>
          <tbody>
            <td>
              <span>{{contabValueObj.second}}</span>
            </td>
            <td>
              <span>{{contabValueObj.min}}</span>
            </td>
            <td>
              <span>{{contabValueObj.hour}}</span>
            </td>
            <td>
              <span>{{contabValueObj.day}}</span>
            </td>
            <td>
              <span>{{contabValueObj.mouth}}</span>
            </td>
            <td>
              <span>{{contabValueObj.week}}</span>
            </td>
            <td>
              <span>{{contabValueObj.year}}</span>
            </td>
            <td>
              <span>{{contabValueString}}</span>
            </td>
          </tbody>
        </table>
      </div>
      <CrontabResult :ex="contabValueString"></CrontabResult>
      <div class="pop_btn">
        <el-button size="small" type="primary" @click="submitFill">确定</el-button>
        <el-button size="small" type="warning" @click="clearCron">重置</el-button>
        <el-button size="small" @click="hidePopup">取消</el-button>
      </div>
    </div>
  </div>
</template>
<script>
import CrontabSecond from "./second.vue";
import CrontabMin from "./min.vue";
import CrontabHour from "./hour.vue";
import CrontabDay from "./day.vue";
import CrontabMouth from "./mouth.vue";
import CrontabWeek from "./week.vue";
import CrontabYear from "./year.vue";
import CrontabResult from "./result.vue";
export default {
  data() {
    return {
      tabTitles: ["秒", "分钟", "小时", "日", "月", "周", "å¹´"],
      tabActive: 0,
      myindex: 0,
      contabValueObj: {
        second: "*",
        min: "*",
        hour: "*",
        day: "*",
        mouth: "*",
        week: "?",
        year: "",
      },
    };
  },
  name: "vcrontab",
  props: ["expression", "hideComponent"],
  methods: {
    shouldHide(key) {
      if (this.hideComponent && this.hideComponent.includes(key)) return false;
      return true;
    },
    resolveExp() {
      //反解析 è¡¨è¾¾å¼
      if (this.expression) {
        let arr = this.expression.split(" ");
        if (arr.length >= 6) {
          //6 ä½ä»¥ä¸Šæ˜¯åˆæ³•表达式
          let obj = {
            second: arr[0],
            min: arr[1],
            hour: arr[2],
            day: arr[3],
            mouth: arr[4],
            week: arr[5],
            year: arr[6] ? arr[6] : "",
          };
          this.contabValueObj = {
            ...obj,
          };
          for (let i in obj) {
            if (obj[i]) this.changeRadio(i, obj[i]);
          }
        }
      } else {
        //没有传入的表达式 åˆ™è¿˜åŽŸ
        this.clearCron();
      }
    },
    // tab切换值
    tabCheck(index) {
      this.tabActive = index;
    },
    // ç”±å­ç»„件触发,更改表达式组成的字段值
    updateContabValue(name, value, from) {
      "updateContabValue", name, value, from;
      this.contabValueObj[name] = value;
      if (from && from !== name) {
        console.log(`来自组件 ${from} æ”¹å˜äº† ${name} ${value}`);
        this.changeRadio(name, value);
      }
    },
    //赋值到组件
    changeRadio(name, value) {
      let arr = ["second", "min", "hour", "mouth"],
        refName = "cron" + name,
        insVlaue;
      if (!this.$refs[refName]) return;
      if (arr.includes(name)) {
        if (value === "*") {
          insVlaue = 1;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insVlaue = 2;
        } else if (value.indexOf("/") > -1) {
          let indexArr = value.split("/");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 0)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insVlaue = 3;
        } else {
          insVlaue = 4;
          this.$refs[refName].checkboxList = value.split(",");
        }
      } else if (name == "day") {
        if (value === "*") {
          insVlaue = 1;
        } else if (value == "?") {
          insVlaue = 2;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insVlaue = 3;
        } else if (value.indexOf("/") > -1) {
          let indexArr = value.split("/");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 0)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insVlaue = 4;
        } else if (value.indexOf("W") > -1) {
          let indexArr = value.split("W");
          isNaN(indexArr[0])
            ? (this.$refs[refName].workday = 0)
            : (this.$refs[refName].workday = indexArr[0]);
          insVlaue = 5;
        } else if (value === "L") {
          insVlaue = 6;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insVlaue = 7;
        }
      } else if (name == "week") {
        if (value === "*") {
          insVlaue = 1;
        } else if (value == "?") {
          insVlaue = 2;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insVlaue = 3;
        } else if (value.indexOf("#") > -1) {
          let indexArr = value.split("#");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 1)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insVlaue = 4;
        } else if (value.indexOf("L") > -1) {
          let indexArr = value.split("L");
          isNaN(indexArr[0])
            ? (this.$refs[refName].weekday = 1)
            : (this.$refs[refName].weekday = indexArr[0]);
          insVlaue = 5;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insVlaue = 7;
        }
      } else if (name == "year") {
        if (value == "") {
          insVlaue = 1;
        } else if (value == "*") {
          insVlaue = 2;
        } else if (value.indexOf("-") > -1) {
          insVlaue = 3;
        } else if (value.indexOf("/") > -1) {
          insVlaue = 4;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insVlaue = 5;
        }
      }
      this.$refs[refName].radioValue = insVlaue;
    },
    // è¡¨å•选项的子组件校验数字格式(通过-props传递)
    checkNumber(value, minLimit, maxLimit) {
      //检查必须为整数
      value = Math.floor(value);
      if (value < minLimit) {
        value = minLimit;
      } else if (value > maxLimit) {
        value = maxLimit;
      }
      return value;
    },
    // éšè—å¼¹çª—
    hidePopup() {
      this.$emit("hide");
    },
    // å¡«å……表达式
    submitFill() {
      this.$emit("fill", this.contabValueString);
      this.hidePopup();
    },
    clearCron() {
      // è¿˜åŽŸé€‰æ‹©é¡¹
      ("准备还原");
      this.contabValueObj = {
        second: "*",
        min: "*",
        hour: "*",
        day: "*",
        mouth: "*",
        week: "?",
        year: "",
      };
      for (let j in this.contabValueObj) {
        this.changeRadio(j, this.contabValueObj[j]);
      }
    },
  },
  computed: {
    contabValueString: function() {
      let obj = this.contabValueObj;
      let str =
        obj.second +
        " " +
        obj.min +
        " " +
        obj.hour +
        " " +
        obj.day +
        " " +
        obj.mouth +
        " " +
        obj.week +
        (obj.year == "" ? "" : " " + obj.year);
      return str;
    },
  },
  components: {
    CrontabSecond,
    CrontabMin,
    CrontabHour,
    CrontabDay,
    CrontabMouth,
    CrontabWeek,
    CrontabYear,
    CrontabResult,
  },
  watch: {
    expression: "resolveExp",
    hideComponent(value) {
      // éšè—éƒ¨åˆ†ç»„ä»¶
    },
  },
  mounted: function() {
    this.resolveExp();
  },
};
</script>
<style scoped>
.pop_btn {
  text-align: center;
  margin-top: 20px;
}
.popup-main {
  position: relative;
  margin: 10px auto;
  background: #fff;
  border-radius: 5px;
  font-size: 12px;
  overflow: hidden;
}
.popup-title {
  overflow: hidden;
  line-height: 34px;
  padding-top: 6px;
  background: #f2f2f2;
}
.popup-result {
  box-sizing: border-box;
  line-height: 24px;
  margin: 25px auto;
  padding: 15px 10px 10px;
  border: 1px solid #ccc;
  position: relative;
}
.popup-result .title {
  position: absolute;
  top: -28px;
  left: 50%;
  width: 140px;
  font-size: 14px;
  margin-left: -70px;
  text-align: center;
  line-height: 30px;
  background: #fff;
}
.popup-result table {
  text-align: center;
  width: 100%;
  margin: 0 auto;
}
.popup-result table span {
  display: block;
  width: 100%;
  font-family: arial;
  line-height: 30px;
  height: 30px;
  white-space: nowrap;
  overflow: hidden;
  border: 1px solid #e8e8e8;
}
.popup-result-scroll {
  font-size: 12px;
  line-height: 24px;
  height: 10em;
  overflow-y: auto;
}
</style>
<template>
  <div>
    <el-tabs type="border-card">
      <el-tab-pane label="秒" v-if="shouldHide('second')">
        <CrontabSecond @update="updateCrontabValue" :check="checkNumber" ref="cronsecond" />
      </el-tab-pane>
      <el-tab-pane label="分钟" v-if="shouldHide('min')">
        <CrontabMin
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronmin"
        />
      </el-tab-pane>
      <el-tab-pane label="小时" v-if="shouldHide('hour')">
        <CrontabHour
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronhour"
        />
      </el-tab-pane>
      <el-tab-pane label="日" v-if="shouldHide('day')">
        <CrontabDay
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronday"
        />
      </el-tab-pane>
      <el-tab-pane label="月" v-if="shouldHide('month')">
        <CrontabMonth
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronmonth"
        />
      </el-tab-pane>
      <el-tab-pane label="周" v-if="shouldHide('week')">
        <CrontabWeek
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronweek"
        />
      </el-tab-pane>
      <el-tab-pane label="å¹´" v-if="shouldHide('year')">
        <CrontabYear
          @update="updateCrontabValue"
          :check="checkNumber"
          :cron="crontabValueObj"
          ref="cronyear"
        />
      </el-tab-pane>
    </el-tabs>
    <div class="popup-main">
      <div class="popup-result">
        <p class="title">时间表达式</p>
        <table>
          <thead>
            <th v-for="item of tabTitles" width="40" :key="item">{{item}}</th>
            <th>Cron è¡¨è¾¾å¼</th>
          </thead>
          <tbody>
            <td>
              <span>{{crontabValueObj.second}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.min}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.hour}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.day}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.month}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.week}}</span>
            </td>
            <td>
              <span>{{crontabValueObj.year}}</span>
            </td>
            <td>
              <span>{{crontabValueString}}</span>
            </td>
          </tbody>
        </table>
      </div>
      <CrontabResult :ex="crontabValueString"></CrontabResult>
      <div class="pop_btn">
        <el-button size="small" type="primary" @click="submitFill">确定</el-button>
        <el-button size="small" type="warning" @click="clearCron">重置</el-button>
        <el-button size="small" @click="hidePopup">取消</el-button>
      </div>
    </div>
  </div>
</template>
<script>
import CrontabSecond from "./second.vue";
import CrontabMin from "./min.vue";
import CrontabHour from "./hour.vue";
import CrontabDay from "./day.vue";
import CrontabMonth from "./month.vue";
import CrontabWeek from "./week.vue";
import CrontabYear from "./year.vue";
import CrontabResult from "./result.vue";
export default {
  data() {
    return {
      tabTitles: ["秒", "分钟", "小时", "日", "月", "周", "å¹´"],
      tabActive: 0,
      myindex: 0,
      crontabValueObj: {
        second: "*",
        min: "*",
        hour: "*",
        day: "*",
        month: "*",
        week: "?",
        year: "",
      },
    };
  },
  name: "vcrontab",
  props: ["expression", "hideComponent"],
  methods: {
    shouldHide(key) {
      if (this.hideComponent && this.hideComponent.includes(key)) return false;
      return true;
    },
    resolveExp() {
      // åè§£æž è¡¨è¾¾å¼
      if (this.expression) {
        let arr = this.expression.split(" ");
        if (arr.length >= 6) {
          //6 ä½ä»¥ä¸Šæ˜¯åˆæ³•表达式
          let obj = {
            second: arr[0],
            min: arr[1],
            hour: arr[2],
            day: arr[3],
            month: arr[4],
            week: arr[5],
            year: arr[6] ? arr[6] : "",
          };
          this.crontabValueObj = {
            ...obj,
          };
          for (let i in obj) {
            if (obj[i]) this.changeRadio(i, obj[i]);
          }
        }
      } else {
        // æ²¡æœ‰ä¼ å…¥çš„表达式 åˆ™è¿˜åŽŸ
        this.clearCron();
      }
    },
    // tab切换值
    tabCheck(index) {
      this.tabActive = index;
    },
    // ç”±å­ç»„件触发,更改表达式组成的字段值
    updateCrontabValue(name, value, from) {
      "updateCrontabValue", name, value, from;
      this.crontabValueObj[name] = value;
      if (from && from !== name) {
        console.log(`来自组件 ${from} æ”¹å˜äº† ${name} ${value}`);
        this.changeRadio(name, value);
      }
    },
    // èµ‹å€¼åˆ°ç»„ä»¶
    changeRadio(name, value) {
      let arr = ["second", "min", "hour", "month"],
        refName = "cron" + name,
        insValue;
      if (!this.$refs[refName]) return;
      if (arr.includes(name)) {
        if (value === "*") {
          insValue = 1;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insValue = 2;
        } else if (value.indexOf("/") > -1) {
          let indexArr = value.split("/");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 0)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insValue = 3;
        } else {
          insValue = 4;
          this.$refs[refName].checkboxList = value.split(",");
        }
      } else if (name == "day") {
        if (value === "*") {
          insValue = 1;
        } else if (value == "?") {
          insValue = 2;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insValue = 3;
        } else if (value.indexOf("/") > -1) {
          let indexArr = value.split("/");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 0)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insValue = 4;
        } else if (value.indexOf("W") > -1) {
          let indexArr = value.split("W");
          isNaN(indexArr[0])
            ? (this.$refs[refName].workday = 0)
            : (this.$refs[refName].workday = indexArr[0]);
          insValue = 5;
        } else if (value === "L") {
          insValue = 6;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insValue = 7;
        }
      } else if (name == "week") {
        if (value === "*") {
          insValue = 1;
        } else if (value == "?") {
          insValue = 2;
        } else if (value.indexOf("-") > -1) {
          let indexArr = value.split("-");
          isNaN(indexArr[0])
            ? (this.$refs[refName].cycle01 = 0)
            : (this.$refs[refName].cycle01 = indexArr[0]);
          this.$refs[refName].cycle02 = indexArr[1];
          insValue = 3;
        } else if (value.indexOf("#") > -1) {
          let indexArr = value.split("#");
          isNaN(indexArr[0])
            ? (this.$refs[refName].average01 = 1)
            : (this.$refs[refName].average01 = indexArr[0]);
          this.$refs[refName].average02 = indexArr[1];
          insValue = 4;
        } else if (value.indexOf("L") > -1) {
          let indexArr = value.split("L");
          isNaN(indexArr[0])
            ? (this.$refs[refName].weekday = 1)
            : (this.$refs[refName].weekday = indexArr[0]);
          insValue = 5;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insValue = 7;
        }
      } else if (name == "year") {
        if (value == "") {
          insValue = 1;
        } else if (value == "*") {
          insValue = 2;
        } else if (value.indexOf("-") > -1) {
          insValue = 3;
        } else if (value.indexOf("/") > -1) {
          insValue = 4;
        } else {
          this.$refs[refName].checkboxList = value.split(",");
          insValue = 5;
        }
      }
      this.$refs[refName].radioValue = insValue;
    },
    // è¡¨å•选项的子组件校验数字格式(通过-props传递)
    checkNumber(value, minLimit, maxLimit) {
      // æ£€æŸ¥å¿…须为整数
      value = Math.floor(value);
      if (value < minLimit) {
        value = minLimit;
      } else if (value > maxLimit) {
        value = maxLimit;
      }
      return value;
    },
    // éšè—å¼¹çª—
    hidePopup() {
      this.$emit("hide");
    },
    // å¡«å……表达式
    submitFill() {
      this.$emit("fill", this.crontabValueString);
      this.hidePopup();
    },
    clearCron() {
      // è¿˜åŽŸé€‰æ‹©é¡¹
      ("准备还原");
      this.crontabValueObj = {
        second: "*",
        min: "*",
        hour: "*",
        day: "*",
        month: "*",
        week: "?",
        year: "",
      };
      for (let j in this.crontabValueObj) {
        this.changeRadio(j, this.crontabValueObj[j]);
      }
    },
  },
  computed: {
    crontabValueString: function() {
      let obj = this.crontabValueObj;
      let str =
        obj.second +
        " " +
        obj.min +
        " " +
        obj.hour +
        " " +
        obj.day +
        " " +
        obj.month +
        " " +
        obj.week +
        (obj.year == "" ? "" : " " + obj.year);
      return str;
    },
  },
  components: {
    CrontabSecond,
    CrontabMin,
    CrontabHour,
    CrontabDay,
    CrontabMonth,
    CrontabWeek,
    CrontabYear,
    CrontabResult,
  },
  watch: {
    expression: "resolveExp",
    hideComponent(value) {
      // éšè—éƒ¨åˆ†ç»„ä»¶
    },
  },
  mounted: function() {
    this.resolveExp();
  },
};
</script>
<style scoped>
.pop_btn {
  text-align: center;
  margin-top: 20px;
}
.popup-main {
  position: relative;
  margin: 10px auto;
  background: #fff;
  border-radius: 5px;
  font-size: 12px;
  overflow: hidden;
}
.popup-title {
  overflow: hidden;
  line-height: 34px;
  padding-top: 6px;
  background: #f2f2f2;
}
.popup-result {
  box-sizing: border-box;
  line-height: 24px;
  margin: 25px auto;
  padding: 15px 10px 10px;
  border: 1px solid #ccc;
  position: relative;
}
.popup-result .title {
  position: absolute;
  top: -28px;
  left: 50%;
  width: 140px;
  font-size: 14px;
  margin-left: -70px;
  text-align: center;
  line-height: 30px;
  background: #fff;
}
.popup-result table {
  text-align: center;
  width: 100%;
  margin: 0 auto;
}
.popup-result table span {
  display: block;
  width: 100%;
  font-family: arial;
  line-height: 30px;
  height: 30px;
  white-space: nowrap;
  overflow: hidden;
  border: 1px solid #e8e8e8;
}
.popup-result-scroll {
  font-size: 12px;
  line-height: 24px;
  height: 10em;
  overflow-y: auto;
}
</style>
ruoyi-ui/src/components/Crontab/month.vue
ÎļþÃû´Ó ruoyi-ui/src/components/Crontab/mouth.vue ÐÞ¸Ä
@@ -1,128 +1,128 @@
<template>
    <el-form size='small'>
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                æœˆï¼Œå…è®¸çš„通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="1" :max="12" /> -
                <el-input-number v-model='cycle02' :min="1" :max="12" /> æœˆ
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                ä»Ž
                <el-input-number v-model='average01' :min="1" :max="12" /> æœˆå¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min="1" :max="12" /> æœˆæœˆæ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            checkNum: this.check
        }
    },
    name: 'crontab-mouth',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.radioValue === 1) {
                this.$emit('update', 'mouth', '*');
                this.$emit('update', 'year', '*');
            } else {
                if (this.cron.day === '*') {
                    this.$emit('update', 'day', '0', 'mouth');
                }
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'mouth');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'mouth');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'mouth');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'mouth', this.cycle01 + '-' + this.cycle02);
                    break;
                case 3:
                    this.$emit('update', 'mouth', this.average01 + '/' + this.average02);
                    break;
                case 4:
                    this.$emit('update', 'mouth', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '2') {
                this.$emit('update', 'mouth', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'mouth', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'mouth', this.checkboxString);
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange'
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 12)
            this.cycle02 = this.checkNum(this.cycle02, 1, 12)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 12)
            this.average02 = this.checkNum(this.average02, 1, 12)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
<template>
    <el-form size='small'>
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                æœˆï¼Œå…è®¸çš„通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="1" :max="12" /> -
                <el-input-number v-model='cycle02' :min="1" :max="12" /> æœˆ
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                ä»Ž
                <el-input-number v-model='average01' :min="1" :max="12" /> æœˆå¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min="1" :max="12" /> æœˆæœˆæ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            checkNum: this.check
        }
    },
    name: 'crontab-month',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.radioValue === 1) {
                this.$emit('update', 'month', '*');
                this.$emit('update', 'year', '*');
            } else {
                if (this.cron.day === '*') {
                    this.$emit('update', 'day', '0', 'month');
                }
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'month');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'month');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'month');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'month', this.cycle01 + '-' + this.cycle02);
                    break;
                case 3:
                    this.$emit('update', 'month', this.average01 + '/' + this.average02);
                    break;
                case 4:
                    this.$emit('update', 'month', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '2') {
                this.$emit('update', 'month', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'month', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'month', this.checkboxString);
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange'
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 12)
            this.cycle02 = this.checkNum(this.cycle02, 1, 12)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 12)
            this.average02 = this.checkNum(this.average02, 1, 12)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
ruoyi-ui/src/components/Crontab/result.vue
@@ -1,566 +1,566 @@
<template>
    <div class="popup-result">
        <p class="title">最近5次运行时间</p>
        <ul class="popup-result-scroll">
            <template v-if='isShow'>
                <li v-for='item in resultList' :key="item">{{item}}</li>
            </template>
            <li v-else>计算结果中...</li>
        </ul>
    </div>
</template>
<script>
export default {
    data() {
        return {
            dayRule: '',
            dayRuleSup: '',
            dateArr: [],
            resultList: [],
            isShow: false
        }
    },
    name: 'crontab-result',
    methods: {
        // è¡¨è¾¾å¼å€¼å˜åŒ–时,开始去计算结果
        expressionChange() {
            // è®¡ç®—开始-隐藏结果
            this.isShow = false;
            // èŽ·å–è§„åˆ™æ•°ç»„[0秒、1分、2时、3日、4月、5星期、6å¹´]
            let ruleArr = this.$options.propsData.ex.split(' ');
            // ç”¨äºŽè®°å½•进入循环的次数
            let nums = 0;
            // ç”¨äºŽæš‚时存符号时间规则结果的数组
            let resultArr = [];
            // èŽ·å–å½“å‰æ—¶é—´ç²¾ç¡®è‡³[年、月、日、时、分、秒]
            let nTime = new Date();
            let nYear = nTime.getFullYear();
            let nMouth = nTime.getMonth() + 1;
            let nDay = nTime.getDate();
            let nHour = nTime.getHours();
            let nMin = nTime.getMinutes();
            let nSecond = nTime.getSeconds();
            // æ ¹æ®è§„则获取到近100年可能年数组、月数组等等
            this.getSecondArr(ruleArr[0]);
            this.getMinArr(ruleArr[1]);
            this.getHourArr(ruleArr[2]);
            this.getDayArr(ruleArr[3]);
            this.getMouthArr(ruleArr[4]);
            this.getWeekArr(ruleArr[5]);
            this.getYearArr(ruleArr[6], nYear);
            // å°†èŽ·å–åˆ°çš„æ•°ç»„èµ‹å€¼-方便使用
            let sDate = this.dateArr[0];
            let mDate = this.dateArr[1];
            let hDate = this.dateArr[2];
            let DDate = this.dateArr[3];
            let MDate = this.dateArr[4];
            let YDate = this.dateArr[5];
            // èŽ·å–å½“å‰æ—¶é—´åœ¨æ•°ç»„ä¸­çš„ç´¢å¼•
            let sIdx = this.getIndex(sDate, nSecond);
            let mIdx = this.getIndex(mDate, nMin);
            let hIdx = this.getIndex(hDate, nHour);
            let DIdx = this.getIndex(DDate, nDay);
            let MIdx = this.getIndex(MDate, nMouth);
            let YIdx = this.getIndex(YDate, nYear);
            // é‡ç½®æœˆæ—¥æ—¶åˆ†ç§’的函数(后面用的比较多)
            const resetSecond = function () {
                sIdx = 0;
                nSecond = sDate[sIdx]
            }
            const resetMin = function () {
                mIdx = 0;
                nMin = mDate[mIdx]
                resetSecond();
            }
            const resetHour = function () {
                hIdx = 0;
                nHour = hDate[hIdx]
                resetMin();
            }
            const resetDay = function () {
                DIdx = 0;
                nDay = DDate[DIdx]
                resetHour();
            }
            const resetMouth = function () {
                MIdx = 0;
                nMouth = MDate[MIdx]
                resetDay();
            }
            // å¦‚果当前年份不为数组中当前值
            if (nYear !== YDate[YIdx]) {
                resetMouth();
            }
            // å¦‚果当前月份不为数组中当前值
            if (nMouth !== MDate[MIdx]) {
                resetDay();
            }
            // å¦‚果当前“日”不为数组中当前值
            if (nDay !== DDate[DIdx]) {
                resetHour();
            }
            // å¦‚果当前“时”不为数组中当前值
            if (nHour !== hDate[hIdx]) {
                resetMin();
            }
            // å¦‚果当前“分”不为数组中当前值
            if (nMin !== mDate[mIdx]) {
                resetSecond();
            }
            // å¾ªçŽ¯å¹´ä»½æ•°ç»„
            goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) {
                let YY = YDate[Yi];
                // å¦‚果到达最大值时
                if (nMouth > MDate[MDate.length - 1]) {
                    resetMouth();
                    continue;
                }
                // å¾ªçŽ¯æœˆä»½æ•°ç»„
                goMouth: for (let Mi = MIdx; Mi < MDate.length; Mi++) {
                    // èµ‹å€¼ã€æ–¹ä¾¿åŽé¢è¿ç®—
                    let MM = MDate[Mi];
                    MM = MM < 10 ? '0' + MM : MM;
                    // å¦‚果到达最大值时
                    if (nDay > DDate[DDate.length - 1]) {
                        resetDay();
                        if (Mi == MDate.length - 1) {
                            resetMouth();
                            continue goYear;
                        }
                        continue;
                    }
                    // å¾ªçŽ¯æ—¥æœŸæ•°ç»„
                    goDay: for (let Di = DIdx; Di < DDate.length; Di++) {
                        // èµ‹å€¼ã€æ–¹ä¾¿åŽé¢è¿ç®—
                        let DD = DDate[Di];
                        let thisDD = DD < 10 ? '0' + DD : DD;
                        // å¦‚果到达最大值时
                        if (nHour > hDate[hDate.length - 1]) {
                            resetHour();
                            if (Di == DDate.length - 1) {
                                resetDay();
                                if (Mi == MDate.length - 1) {
                                    resetMouth();
                                    continue goYear;
                                }
                                continue goMouth;
                            }
                            continue;
                        }
                        // åˆ¤æ–­æ—¥æœŸçš„合法性,不合法的话也是跳出当前循环
                        if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && this.dayRule !== 'workDay' && this.dayRule !== 'lastWeek' && this.dayRule !== 'lastDay') {
                            resetDay();
                            continue goMouth;
                        }
                        // å¦‚果日期规则中有值时
                        if (this.dayRule == 'lastDay') {
                            //如果不是合法日期则需要将前将日期调到合法日期即月末最后一天
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                        } else if (this.dayRule == 'workDay') {
                            //校验并调整如果是2月30号这种日期传进来时需调整至正常月底
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                            // èŽ·å–è¾¾åˆ°æ¡ä»¶çš„æ—¥æœŸæ˜¯æ˜ŸæœŸX
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
                            // å½“星期日时
                            if (thisWeek == 0) {
                                //先找下一个日,并判断是否为月底
                                DD++;
                                thisDD = DD < 10 ? '0' + DD : DD;
                                //判断下一日已经不是合法日期
                                if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD -= 3;
                                }
                            } else if (thisWeek == 6) {
                                //当星期6时只需判断不是1号就可进行操作
                                if (this.dayRuleSup !== 1) {
                                    DD--;
                                } else {
                                    DD += 2;
                                }
                            }
                        } else if (this.dayRule == 'weekDay') {
                            //如果指定了是星期几
                            //获取当前日期是属于星期几
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
                            //校验当前星期是否在星期池(dayRuleSup)中
                            if (Array.indexOf(this.dayRuleSup, thisWeek) < 0) {
                                // å¦‚果到达最大值时
                                if (Di == DDate.length - 1) {
                                    resetDay();
                                    if (Mi == MDate.length - 1) {
                                        resetMouth();
                                        continue goYear;
                                    }
                                    continue goMouth;
                                }
                                continue;
                            }
                        } else if (this.dayRule == 'assWeek') {
                            //如果指定了是第几周的星期几
                            //获取每月1号是属于星期几
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
                            if (this.dayRuleSup[1] >= thisWeek) {
                                DD = (this.dayRuleSup[0] - 1) * 7 + this.dayRuleSup[1] - thisWeek + 1;
                            } else {
                                DD = this.dayRuleSup[0] * 7 + this.dayRuleSup[1] - thisWeek + 1;
                            }
                        } else if (this.dayRule == 'lastWeek') {
                            //如果指定了每月最后一个星期几
                            //校验并调整如果是2月30号这种日期传进来时需调整至正常月底
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                            //获取月末最后一天是星期几
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
                            //找到要求中最近的那个星期几
                            if (this.dayRuleSup < thisWeek) {
                                DD -= thisWeek - this.dayRuleSup;
                            } else if (this.dayRuleSup > thisWeek) {
                                DD -= 7 - (this.dayRuleSup - thisWeek)
                            }
                        }
                        // åˆ¤æ–­æ—¶é—´å€¼æ˜¯å¦å°äºŽ10置换成“05”这种格式
                        DD = DD < 10 ? '0' + DD : DD;
                        // å¾ªçŽ¯â€œæ—¶â€æ•°ç»„
                        goHour: for (let hi = hIdx; hi < hDate.length; hi++) {
                            let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi]
                            // å¦‚果到达最大值时
                            if (nMin > mDate[mDate.length - 1]) {
                                resetMin();
                                if (hi == hDate.length - 1) {
                                    resetHour();
                                    if (Di == DDate.length - 1) {
                                        resetDay();
                                        if (Mi == MDate.length - 1) {
                                            resetMouth();
                                            continue goYear;
                                        }
                                        continue goMouth;
                                    }
                                    continue goDay;
                                }
                                continue;
                            }
                            // å¾ªçޝ"分"数组
                            goMin: for (let mi = mIdx; mi < mDate.length; mi++) {
                                let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi];
                                // å¦‚果到达最大值时
                                if (nSecond > sDate[sDate.length - 1]) {
                                    resetSecond();
                                    if (mi == mDate.length - 1) {
                                        resetMin();
                                        if (hi == hDate.length - 1) {
                                            resetHour();
                                            if (Di == DDate.length - 1) {
                                                resetDay();
                                                if (Mi == MDate.length - 1) {
                                                    resetMouth();
                                                    continue goYear;
                                                }
                                                continue goMouth;
                                            }
                                            continue goDay;
                                        }
                                        continue goHour;
                                    }
                                    continue;
                                }
                                // å¾ªçޝ"秒"数组
                                goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) {
                                    let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si];
                                    // æ·»åŠ å½“å‰æ—¶é—´ï¼ˆæ—¶é—´åˆæ³•æ€§åœ¨æ—¥æœŸå¾ªçŽ¯æ—¶å·²ç»åˆ¤æ–­ï¼‰
                                    if (MM !== '00' && DD !== '00') {
                                        resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss)
                                        nums++;
                                    }
                                    //如果条数满了就退出循环
                                    if (nums == 5) break goYear;
                                    //如果到达最大值时
                                    if (si == sDate.length - 1) {
                                        resetSecond();
                                        if (mi == mDate.length - 1) {
                                            resetMin();
                                            if (hi == hDate.length - 1) {
                                                resetHour();
                                                if (Di == DDate.length - 1) {
                                                    resetDay();
                                                    if (Mi == MDate.length - 1) {
                                                        resetMouth();
                                                        continue goYear;
                                                    }
                                                    continue goMouth;
                                                }
                                                continue goDay;
                                            }
                                            continue goHour;
                                        }
                                        continue goMin;
                                    }
                                } //goSecond
                            } //goMin
                        }//goHour
                    }//goDay
                }//goMouth
            }
            // åˆ¤æ–­100年内的结果条数
            if (resultArr.length == 0) {
                this.resultList = ['没有达到条件的结果!'];
            } else {
                this.resultList = resultArr;
                if (resultArr.length !== 5) {
                    this.resultList.push('最近100年内只有上面' + resultArr.length + '条结果!')
                }
            }
            // è®¡ç®—完成-显示结果
            this.isShow = true;
        },
        //用于计算某位数字在数组中的索引
        getIndex(arr, value) {
            if (value <= arr[0] || value > arr[arr.length - 1]) {
                return 0;
            } else {
                for (let i = 0; i < arr.length - 1; i++) {
                    if (value > arr[i] && value <= arr[i + 1]) {
                        return i + 1;
                    }
                }
            }
        },
        // èŽ·å–"å¹´"数组
        getYearArr(rule, year) {
            this.dateArr[5] = this.getOrderArr(year, year + 100);
            if (rule !== undefined) {
                if (rule.indexOf('-') >= 0) {
                    this.dateArr[5] = this.getCycleArr(rule, year + 100, false)
                } else if (rule.indexOf('/') >= 0) {
                    this.dateArr[5] = this.getAverageArr(rule, year + 100)
                } else if (rule !== '*') {
                    this.dateArr[5] = this.getAssignArr(rule)
                }
            }
        },
        // èŽ·å–"月"数组
        getMouthArr(rule) {
            this.dateArr[4] = this.getOrderArr(1, 12);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[4] = this.getCycleArr(rule, 12, false)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[4] = this.getAverageArr(rule, 12)
            } else if (rule !== '*') {
                this.dateArr[4] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"日"数组-主要为日期规则
        getWeekArr(rule) {
            //只有当日期规则的两个值均为“”时则表达日期是有选项的
            if (this.dayRule == '' && this.dayRuleSup == '') {
                if (rule.indexOf('-') >= 0) {
                    this.dayRule = 'weekDay';
                    this.dayRuleSup = this.getCycleArr(rule, 7, false)
                } else if (rule.indexOf('#') >= 0) {
                    this.dayRule = 'assWeek';
                    let matchRule = rule.match(/[0-9]{1}/g);
                    this.dayRuleSup = [Number(matchRule[0]), Number(matchRule[1])];
                    this.dateArr[3] = [1];
                    if (this.dayRuleSup[1] == 7) {
                        this.dayRuleSup[1] = 0;
                    }
                } else if (rule.indexOf('L') >= 0) {
                    this.dayRule = 'lastWeek';
                    this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
                    this.dateArr[3] = [31];
                    if (this.dayRuleSup == 7) {
                        this.dayRuleSup = 0;
                    }
                } else if (rule !== '*' && rule !== '?') {
                    this.dayRule = 'weekDay';
                    this.dayRuleSup = this.getAssignArr(rule)
                }
                //如果weekDay时将7调整为0【week值0即是星期日】
                if (this.dayRule == 'weekDay') {
                    for (let i = 0; i < this.dayRuleSup.length; i++) {
                        if (this.dayRuleSup[i] == 7) {
                            this.dayRuleSup[i] = 0;
                        }
                    }
                }
            }
        },
        // èŽ·å–"日"数组-少量为日期规则
        getDayArr(rule) {
            this.dateArr[3] = this.getOrderArr(1, 31);
            this.dayRule = '';
            this.dayRuleSup = '';
            if (rule.indexOf('-') >= 0) {
                this.dateArr[3] = this.getCycleArr(rule, 31, false)
                this.dayRuleSup = 'null';
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[3] = this.getAverageArr(rule, 31)
                this.dayRuleSup = 'null';
            } else if (rule.indexOf('W') >= 0) {
                this.dayRule = 'workDay';
                this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
                this.dateArr[3] = [this.dayRuleSup];
            } else if (rule.indexOf('L') >= 0) {
                this.dayRule = 'lastDay';
                this.dayRuleSup = 'null';
                this.dateArr[3] = [31];
            } else if (rule !== '*' && rule !== '?') {
                this.dateArr[3] = this.getAssignArr(rule)
                this.dayRuleSup = 'null';
            } else if (rule == '*') {
                this.dayRuleSup = 'null';
            }
        },
        // èŽ·å–"时"数组
        getHourArr(rule) {
            this.dateArr[2] = this.getOrderArr(0, 23);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[2] = this.getCycleArr(rule, 24, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[2] = this.getAverageArr(rule, 23)
            } else if (rule !== '*') {
                this.dateArr[2] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"分"数组
        getMinArr(rule) {
            this.dateArr[1] = this.getOrderArr(0, 59);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[1] = this.getCycleArr(rule, 60, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[1] = this.getAverageArr(rule, 59)
            } else if (rule !== '*') {
                this.dateArr[1] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"秒"数组
        getSecondArr(rule) {
            this.dateArr[0] = this.getOrderArr(0, 59);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[0] = this.getCycleArr(rule, 60, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[0] = this.getAverageArr(rule, 59)
            } else if (rule !== '*') {
                this.dateArr[0] = this.getAssignArr(rule)
            }
        },
        // æ ¹æ®ä¼ è¿›æ¥çš„min-max返回一个顺序的数组
        getOrderArr(min, max) {
            let arr = [];
            for (let i = min; i <= max; i++) {
                arr.push(i);
            }
            return arr;
        },
        // æ ¹æ®è§„则中指定的零散值返回一个数组
        getAssignArr(rule) {
            let arr = [];
            let assiginArr = rule.split(',');
            for (let i = 0; i < assiginArr.length; i++) {
                arr[i] = Number(assiginArr[i])
            }
            arr.sort(this.compare)
            return arr;
        },
        // æ ¹æ®ä¸€å®šç®—术规则计算返回一个数组
        getAverageArr(rule, limit) {
            let arr = [];
            let agArr = rule.split('/');
            let min = Number(agArr[0]);
            let step = Number(agArr[1]);
            while (min <= limit) {
                arr.push(min);
                min += step;
            }
            return arr;
        },
        // æ ¹æ®è§„则返回一个具有周期性的数组
        getCycleArr(rule, limit, status) {
            //status--表示是否从0开始(则从1开始)
            let arr = [];
            let cycleArr = rule.split('-');
            let min = Number(cycleArr[0]);
            let max = Number(cycleArr[1]);
            if (min > max) {
                max += limit;
            }
            for (let i = min; i <= max; i++) {
                let add = 0;
                if (status == false && i % limit == 0) {
                    add = limit;
                }
                arr.push(Math.round(i % limit + add))
            }
            arr.sort(this.compare)
            return arr;
        },
        //比较数字大小(用于Array.sort)
        compare(value1, value2) {
            if (value2 - value1 > 0) {
                return -1;
            } else {
                return 1;
            }
        },
        // æ ¼å¼åŒ–日期格式如:2017-9-19 18:04:33
        formatDate(value, type) {
            // è®¡ç®—日期相关值
            let time = typeof value == 'number' ? new Date(value) : value;
            let Y = time.getFullYear();
            let M = time.getMonth() + 1;
            let D = time.getDate();
            let h = time.getHours();
            let m = time.getMinutes();
            let s = time.getSeconds();
            let week = time.getDay();
            // å¦‚果传递了type的话
            if (type == undefined) {
                return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
            } else if (type == 'week') {
                return week;
            }
        },
        // æ£€æŸ¥æ—¥æœŸæ˜¯å¦å­˜åœ¨
        checkDate(value) {
            let time = new Date(value);
            let format = this.formatDate(time)
            return value == format ? true : false;
        }
    },
    watch: {
        'ex': 'expressionChange'
    },
    props: ['ex'],
    mounted: function () {
        // åˆå§‹åŒ– èŽ·å–ä¸€æ¬¡ç»“æžœ
        this.expressionChange();
    }
}
</script>
<template>
    <div class="popup-result">
        <p class="title">最近5次运行时间</p>
        <ul class="popup-result-scroll">
            <template v-if='isShow'>
                <li v-for='item in resultList' :key="item">{{item}}</li>
            </template>
            <li v-else>计算结果中...</li>
        </ul>
    </div>
</template>
<script>
export default {
    data() {
        return {
            dayRule: '',
            dayRuleSup: '',
            dateArr: [],
            resultList: [],
            isShow: false
        }
    },
    name: 'crontab-result',
    methods: {
        // è¡¨è¾¾å¼å€¼å˜åŒ–时,开始去计算结果
        expressionChange() {
            // è®¡ç®—开始-隐藏结果
            this.isShow = false;
            // èŽ·å–è§„åˆ™æ•°ç»„[0秒、1分、2时、3日、4月、5星期、6å¹´]
            let ruleArr = this.$options.propsData.ex.split(' ');
            // ç”¨äºŽè®°å½•进入循环的次数
            let nums = 0;
            // ç”¨äºŽæš‚时存符号时间规则结果的数组
            let resultArr = [];
            // èŽ·å–å½“å‰æ—¶é—´ç²¾ç¡®è‡³[年、月、日、时、分、秒]
            let nTime = new Date();
            let nYear = nTime.getFullYear();
            let nMonth = nTime.getMonth() + 1;
            let nDay = nTime.getDate();
            let nHour = nTime.getHours();
            let nMin = nTime.getMinutes();
            let nSecond = nTime.getSeconds();
            // æ ¹æ®è§„则获取到近100年可能年数组、月数组等等
            this.getSecondArr(ruleArr[0]);
            this.getMinArr(ruleArr[1]);
            this.getHourArr(ruleArr[2]);
            this.getDayArr(ruleArr[3]);
            this.getMonthArr(ruleArr[4]);
            this.getWeekArr(ruleArr[5]);
            this.getYearArr(ruleArr[6], nYear);
            // å°†èŽ·å–åˆ°çš„æ•°ç»„èµ‹å€¼-方便使用
            let sDate = this.dateArr[0];
            let mDate = this.dateArr[1];
            let hDate = this.dateArr[2];
            let DDate = this.dateArr[3];
            let MDate = this.dateArr[4];
            let YDate = this.dateArr[5];
            // èŽ·å–å½“å‰æ—¶é—´åœ¨æ•°ç»„ä¸­çš„ç´¢å¼•
            let sIdx = this.getIndex(sDate, nSecond);
            let mIdx = this.getIndex(mDate, nMin);
            let hIdx = this.getIndex(hDate, nHour);
            let DIdx = this.getIndex(DDate, nDay);
            let MIdx = this.getIndex(MDate, nMonth);
            let YIdx = this.getIndex(YDate, nYear);
            // é‡ç½®æœˆæ—¥æ—¶åˆ†ç§’的函数(后面用的比较多)
            const resetSecond = function () {
                sIdx = 0;
                nSecond = sDate[sIdx]
            }
            const resetMin = function () {
                mIdx = 0;
                nMin = mDate[mIdx]
                resetSecond();
            }
            const resetHour = function () {
                hIdx = 0;
                nHour = hDate[hIdx]
                resetMin();
            }
            const resetDay = function () {
                DIdx = 0;
                nDay = DDate[DIdx]
                resetHour();
            }
            const resetMonth = function () {
                MIdx = 0;
                nMonth = MDate[MIdx]
                resetDay();
            }
            // å¦‚果当前年份不为数组中当前值
            if (nYear !== YDate[YIdx]) {
                resetMonth();
            }
            // å¦‚果当前月份不为数组中当前值
            if (nMonth !== MDate[MIdx]) {
                resetDay();
            }
            // å¦‚果当前“日”不为数组中当前值
            if (nDay !== DDate[DIdx]) {
                resetHour();
            }
            // å¦‚果当前“时”不为数组中当前值
            if (nHour !== hDate[hIdx]) {
                resetMin();
            }
            // å¦‚果当前“分”不为数组中当前值
            if (nMin !== mDate[mIdx]) {
                resetSecond();
            }
            // å¾ªçŽ¯å¹´ä»½æ•°ç»„
            goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) {
                let YY = YDate[Yi];
                // å¦‚果到达最大值时
                if (nMonth > MDate[MDate.length - 1]) {
                    resetMonth();
                    continue;
                }
                // å¾ªçŽ¯æœˆä»½æ•°ç»„
                goMonth: for (let Mi = MIdx; Mi < MDate.length; Mi++) {
                    // èµ‹å€¼ã€æ–¹ä¾¿åŽé¢è¿ç®—
                    let MM = MDate[Mi];
                    MM = MM < 10 ? '0' + MM : MM;
                    // å¦‚果到达最大值时
                    if (nDay > DDate[DDate.length - 1]) {
                        resetDay();
                        if (Mi == MDate.length - 1) {
                            resetMonth();
                            continue goYear;
                        }
                        continue;
                    }
                    // å¾ªçŽ¯æ—¥æœŸæ•°ç»„
                    goDay: for (let Di = DIdx; Di < DDate.length; Di++) {
                        // èµ‹å€¼ã€æ–¹ä¾¿åŽé¢è¿ç®—
                        let DD = DDate[Di];
                        let thisDD = DD < 10 ? '0' + DD : DD;
                        // å¦‚果到达最大值时
                        if (nHour > hDate[hDate.length - 1]) {
                            resetHour();
                            if (Di == DDate.length - 1) {
                                resetDay();
                                if (Mi == MDate.length - 1) {
                                    resetMonth();
                                    continue goYear;
                                }
                                continue goMonth;
                            }
                            continue;
                        }
                        // åˆ¤æ–­æ—¥æœŸçš„合法性,不合法的话也是跳出当前循环
                        if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && this.dayRule !== 'workDay' && this.dayRule !== 'lastWeek' && this.dayRule !== 'lastDay') {
                            resetDay();
                            continue goMonth;
                        }
                        // å¦‚果日期规则中有值时
                        if (this.dayRule == 'lastDay') {
                            // å¦‚果不是合法日期则需要将前将日期调到合法日期即月末最后一天
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                        } else if (this.dayRule == 'workDay') {
                            // æ ¡éªŒå¹¶è°ƒæ•´å¦‚果是2月30号这种日期传进来时需调整至正常月底
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                            // èŽ·å–è¾¾åˆ°æ¡ä»¶çš„æ—¥æœŸæ˜¯æ˜ŸæœŸX
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
                            // å½“星期日时
                            if (thisWeek == 0) {
                                // å…ˆæ‰¾ä¸‹ä¸€ä¸ªæ—¥ï¼Œå¹¶åˆ¤æ–­æ˜¯å¦ä¸ºæœˆåº•
                                DD++;
                                thisDD = DD < 10 ? '0' + DD : DD;
                                // åˆ¤æ–­ä¸‹ä¸€æ—¥å·²ç»ä¸æ˜¯åˆæ³•日期
                                if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD -= 3;
                                }
                            } else if (thisWeek == 6) {
                                // å½“星期6时只需判断不是1号就可进行操作
                                if (this.dayRuleSup !== 1) {
                                    DD--;
                                } else {
                                    DD += 2;
                                }
                            }
                        } else if (this.dayRule == 'weekDay') {
                            // å¦‚果指定了是星期几
                            // èŽ·å–å½“å‰æ—¥æœŸæ˜¯å±žäºŽæ˜ŸæœŸå‡ 
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
                            // æ ¡éªŒå½“前星期是否在星期池(dayRuleSup)中
                            if (Array.indexOf(this.dayRuleSup, thisWeek) < 0) {
                                // å¦‚果到达最大值时
                                if (Di == DDate.length - 1) {
                                    resetDay();
                                    if (Mi == MDate.length - 1) {
                                        resetMonth();
                                        continue goYear;
                                    }
                                    continue goMonth;
                                }
                                continue;
                            }
                        } else if (this.dayRule == 'assWeek') {
                            // å¦‚果指定了是第几周的星期几
                            // èŽ·å–æ¯æœˆ1号是属于星期几
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
                            if (this.dayRuleSup[1] >= thisWeek) {
                                DD = (this.dayRuleSup[0] - 1) * 7 + this.dayRuleSup[1] - thisWeek + 1;
                            } else {
                                DD = this.dayRuleSup[0] * 7 + this.dayRuleSup[1] - thisWeek + 1;
                            }
                        } else if (this.dayRule == 'lastWeek') {
                            // å¦‚果指定了每月最后一个星期几
                            // æ ¡éªŒå¹¶è°ƒæ•´å¦‚果是2月30号这种日期传进来时需调整至正常月底
                            if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
                                    DD--;
                                    thisDD = DD < 10 ? '0' + DD : DD;
                                }
                            }
                            // èŽ·å–æœˆæœ«æœ€åŽä¸€å¤©æ˜¯æ˜ŸæœŸå‡ 
                            let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
                            // æ‰¾åˆ°è¦æ±‚中最近的那个星期几
                            if (this.dayRuleSup < thisWeek) {
                                DD -= thisWeek - this.dayRuleSup;
                            } else if (this.dayRuleSup > thisWeek) {
                                DD -= 7 - (this.dayRuleSup - thisWeek)
                            }
                        }
                        // åˆ¤æ–­æ—¶é—´å€¼æ˜¯å¦å°äºŽ10置换成“05”这种格式
                        DD = DD < 10 ? '0' + DD : DD;
                        // å¾ªçŽ¯â€œæ—¶â€æ•°ç»„
                        goHour: for (let hi = hIdx; hi < hDate.length; hi++) {
                            let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi]
                            // å¦‚果到达最大值时
                            if (nMin > mDate[mDate.length - 1]) {
                                resetMin();
                                if (hi == hDate.length - 1) {
                                    resetHour();
                                    if (Di == DDate.length - 1) {
                                        resetDay();
                                        if (Mi == MDate.length - 1) {
                                            resetMonth();
                                            continue goYear;
                                        }
                                        continue goMonth;
                                    }
                                    continue goDay;
                                }
                                continue;
                            }
                            // å¾ªçޝ"分"数组
                            goMin: for (let mi = mIdx; mi < mDate.length; mi++) {
                                let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi];
                                // å¦‚果到达最大值时
                                if (nSecond > sDate[sDate.length - 1]) {
                                    resetSecond();
                                    if (mi == mDate.length - 1) {
                                        resetMin();
                                        if (hi == hDate.length - 1) {
                                            resetHour();
                                            if (Di == DDate.length - 1) {
                                                resetDay();
                                                if (Mi == MDate.length - 1) {
                                                    resetMonth();
                                                    continue goYear;
                                                }
                                                continue goMonth;
                                            }
                                            continue goDay;
                                        }
                                        continue goHour;
                                    }
                                    continue;
                                }
                                // å¾ªçޝ"秒"数组
                                goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) {
                                    let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si];
                                    // æ·»åŠ å½“å‰æ—¶é—´ï¼ˆæ—¶é—´åˆæ³•æ€§åœ¨æ—¥æœŸå¾ªçŽ¯æ—¶å·²ç»åˆ¤æ–­ï¼‰
                                    if (MM !== '00' && DD !== '00') {
                                        resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss)
                                        nums++;
                                    }
                                    // å¦‚果条数满了就退出循环
                                    if (nums == 5) break goYear;
                                    // å¦‚果到达最大值时
                                    if (si == sDate.length - 1) {
                                        resetSecond();
                                        if (mi == mDate.length - 1) {
                                            resetMin();
                                            if (hi == hDate.length - 1) {
                                                resetHour();
                                                if (Di == DDate.length - 1) {
                                                    resetDay();
                                                    if (Mi == MDate.length - 1) {
                                                        resetMonth();
                                                        continue goYear;
                                                    }
                                                    continue goMonth;
                                                }
                                                continue goDay;
                                            }
                                            continue goHour;
                                        }
                                        continue goMin;
                                    }
                                } //goSecond
                            } //goMin
                        }//goHour
                    }//goDay
                }//goMonth
            }
            // åˆ¤æ–­100年内的结果条数
            if (resultArr.length == 0) {
                this.resultList = ['没有达到条件的结果!'];
            } else {
                this.resultList = resultArr;
                if (resultArr.length !== 5) {
                    this.resultList.push('最近100年内只有上面' + resultArr.length + '条结果!')
                }
            }
            // è®¡ç®—完成-显示结果
            this.isShow = true;
        },
        // ç”¨äºŽè®¡ç®—某位数字在数组中的索引
        getIndex(arr, value) {
            if (value <= arr[0] || value > arr[arr.length - 1]) {
                return 0;
            } else {
                for (let i = 0; i < arr.length - 1; i++) {
                    if (value > arr[i] && value <= arr[i + 1]) {
                        return i + 1;
                    }
                }
            }
        },
        // èŽ·å–"å¹´"数组
        getYearArr(rule, year) {
            this.dateArr[5] = this.getOrderArr(year, year + 100);
            if (rule !== undefined) {
                if (rule.indexOf('-') >= 0) {
                    this.dateArr[5] = this.getCycleArr(rule, year + 100, false)
                } else if (rule.indexOf('/') >= 0) {
                    this.dateArr[5] = this.getAverageArr(rule, year + 100)
                } else if (rule !== '*') {
                    this.dateArr[5] = this.getAssignArr(rule)
                }
            }
        },
        // èŽ·å–"月"数组
        getMonthArr(rule) {
            this.dateArr[4] = this.getOrderArr(1, 12);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[4] = this.getCycleArr(rule, 12, false)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[4] = this.getAverageArr(rule, 12)
            } else if (rule !== '*') {
                this.dateArr[4] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"日"数组-主要为日期规则
        getWeekArr(rule) {
            // åªæœ‰å½“日期规则的两个值均为“”时则表达日期是有选项的
            if (this.dayRule == '' && this.dayRuleSup == '') {
                if (rule.indexOf('-') >= 0) {
                    this.dayRule = 'weekDay';
                    this.dayRuleSup = this.getCycleArr(rule, 7, false)
                } else if (rule.indexOf('#') >= 0) {
                    this.dayRule = 'assWeek';
                    let matchRule = rule.match(/[0-9]{1}/g);
                    this.dayRuleSup = [Number(matchRule[0]), Number(matchRule[1])];
                    this.dateArr[3] = [1];
                    if (this.dayRuleSup[1] == 7) {
                        this.dayRuleSup[1] = 0;
                    }
                } else if (rule.indexOf('L') >= 0) {
                    this.dayRule = 'lastWeek';
                    this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
                    this.dateArr[3] = [31];
                    if (this.dayRuleSup == 7) {
                        this.dayRuleSup = 0;
                    }
                } else if (rule !== '*' && rule !== '?') {
                    this.dayRule = 'weekDay';
                    this.dayRuleSup = this.getAssignArr(rule)
                }
                // å¦‚æžœweekDay时将7调整为0【week值0即是星期日】
                if (this.dayRule == 'weekDay') {
                    for (let i = 0; i < this.dayRuleSup.length; i++) {
                        if (this.dayRuleSup[i] == 7) {
                            this.dayRuleSup[i] = 0;
                        }
                    }
                }
            }
        },
        // èŽ·å–"日"数组-少量为日期规则
        getDayArr(rule) {
            this.dateArr[3] = this.getOrderArr(1, 31);
            this.dayRule = '';
            this.dayRuleSup = '';
            if (rule.indexOf('-') >= 0) {
                this.dateArr[3] = this.getCycleArr(rule, 31, false)
                this.dayRuleSup = 'null';
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[3] = this.getAverageArr(rule, 31)
                this.dayRuleSup = 'null';
            } else if (rule.indexOf('W') >= 0) {
                this.dayRule = 'workDay';
                this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
                this.dateArr[3] = [this.dayRuleSup];
            } else if (rule.indexOf('L') >= 0) {
                this.dayRule = 'lastDay';
                this.dayRuleSup = 'null';
                this.dateArr[3] = [31];
            } else if (rule !== '*' && rule !== '?') {
                this.dateArr[3] = this.getAssignArr(rule)
                this.dayRuleSup = 'null';
            } else if (rule == '*') {
                this.dayRuleSup = 'null';
            }
        },
        // èŽ·å–"时"数组
        getHourArr(rule) {
            this.dateArr[2] = this.getOrderArr(0, 23);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[2] = this.getCycleArr(rule, 24, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[2] = this.getAverageArr(rule, 23)
            } else if (rule !== '*') {
                this.dateArr[2] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"分"数组
        getMinArr(rule) {
            this.dateArr[1] = this.getOrderArr(0, 59);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[1] = this.getCycleArr(rule, 60, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[1] = this.getAverageArr(rule, 59)
            } else if (rule !== '*') {
                this.dateArr[1] = this.getAssignArr(rule)
            }
        },
        // èŽ·å–"秒"数组
        getSecondArr(rule) {
            this.dateArr[0] = this.getOrderArr(0, 59);
            if (rule.indexOf('-') >= 0) {
                this.dateArr[0] = this.getCycleArr(rule, 60, true)
            } else if (rule.indexOf('/') >= 0) {
                this.dateArr[0] = this.getAverageArr(rule, 59)
            } else if (rule !== '*') {
                this.dateArr[0] = this.getAssignArr(rule)
            }
        },
        // æ ¹æ®ä¼ è¿›æ¥çš„min-max返回一个顺序的数组
        getOrderArr(min, max) {
            let arr = [];
            for (let i = min; i <= max; i++) {
                arr.push(i);
            }
            return arr;
        },
        // æ ¹æ®è§„则中指定的零散值返回一个数组
        getAssignArr(rule) {
            let arr = [];
            let assiginArr = rule.split(',');
            for (let i = 0; i < assiginArr.length; i++) {
                arr[i] = Number(assiginArr[i])
            }
            arr.sort(this.compare)
            return arr;
        },
        // æ ¹æ®ä¸€å®šç®—术规则计算返回一个数组
        getAverageArr(rule, limit) {
            let arr = [];
            let agArr = rule.split('/');
            let min = Number(agArr[0]);
            let step = Number(agArr[1]);
            while (min <= limit) {
                arr.push(min);
                min += step;
            }
            return arr;
        },
        // æ ¹æ®è§„则返回一个具有周期性的数组
        getCycleArr(rule, limit, status) {
            // status--表示是否从0开始(则从1开始)
            let arr = [];
            let cycleArr = rule.split('-');
            let min = Number(cycleArr[0]);
            let max = Number(cycleArr[1]);
            if (min > max) {
                max += limit;
            }
            for (let i = min; i <= max; i++) {
                let add = 0;
                if (status == false && i % limit == 0) {
                    add = limit;
                }
                arr.push(Math.round(i % limit + add))
            }
            arr.sort(this.compare)
            return arr;
        },
        // æ¯”较数字大小(用于Array.sort)
        compare(value1, value2) {
            if (value2 - value1 > 0) {
                return -1;
            } else {
                return 1;
            }
        },
        // æ ¼å¼åŒ–日期格式如:2017-9-19 18:04:33
        formatDate(value, type) {
            // è®¡ç®—日期相关值
            let time = typeof value == 'number' ? new Date(value) : value;
            let Y = time.getFullYear();
            let M = time.getMonth() + 1;
            let D = time.getDate();
            let h = time.getHours();
            let m = time.getMinutes();
            let s = time.getSeconds();
            let week = time.getDay();
            // å¦‚果传递了type的话
            if (type == undefined) {
                return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
            } else if (type == 'week') {
                return week;
            }
        },
        // æ£€æŸ¥æ—¥æœŸæ˜¯å¦å­˜åœ¨
        checkDate(value) {
            let time = new Date(value);
            let format = this.formatDate(time)
            return value == format ? true : false;
        }
    },
    watch: {
        'ex': 'expressionChange'
    },
    props: ['ex'],
    mounted: function () {
        // åˆå§‹åŒ– èŽ·å–ä¸€æ¬¡ç»“æžœ
        this.expressionChange();
    }
}
</script>
ruoyi-ui/src/components/Crontab/second.vue
@@ -1,133 +1,133 @@
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                ç§’,允许的通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="0" :max="60" /> -
                <el-input-number v-model='cycle02' :min="0" :max="60" /> ç§’
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                ä»Ž
                <el-input-number v-model='average01' :min="0" :max="60" /> ç§’开始,每
                <el-input-number v-model='average02' :min="0" :max="60" /> ç§’执行一次
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 0,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-second',
    props: ['check', 'radioParent'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            switch (this.radioValue) {
                case 1:
                    this.$emit('update', 'second', '*', 'second');
                    this.$emit('update', 'min', '*', 'second');
                    break;
                case 2:
                    this.$emit('update', 'second', this.cycle01 + '-' + this.cycle02);
                    break;
                case 3:
                    this.$emit('update', 'second', this.average01 + '/' + this.average02);
                    break;
                case 4:
                    this.$emit('update', 'second', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '2') {
                this.$emit('update', 'second', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'second', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'second', this.checkboxString);
            }
        },
        othChange() {
            //反解析
            let ins = this.cron.second
            ('反解析 second', ins);
            if (ins === '*') {
                this.radioValue = 1;
            } else if (ins.indexOf('-') > -1) {
                this.radioValue = 2
            } else if (ins.indexOf('/') > -1) {
                this.radioValue = 3
            } else {
                this.radioValue = 4
                this.checkboxList = ins.split(',')
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange',
        radioParent() {
            this.radioValue = this.radioParent
        }
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 0, 59)
            this.cycle02 = this.checkNum(this.cycle02, 0, 59)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 0, 59)
            this.average02 = this.checkNum(this.average02, 1, 59)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                ç§’,允许的通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min="0" :max="60" /> -
                <el-input-number v-model='cycle02' :min="0" :max="60" /> ç§’
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                ä»Ž
                <el-input-number v-model='average01' :min="0" :max="60" /> ç§’开始,每
                <el-input-number v-model='average02' :min="0" :max="60" /> ç§’执行一次
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 0,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-second',
    props: ['check', 'radioParent'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            switch (this.radioValue) {
                case 1:
                    this.$emit('update', 'second', '*', 'second');
                    this.$emit('update', 'min', '*', 'second');
                    break;
                case 2:
                    this.$emit('update', 'second', this.cycle01 + '-' + this.cycle02);
                    break;
                case 3:
                    this.$emit('update', 'second', this.average01 + '/' + this.average02);
                    break;
                case 4:
                    this.$emit('update', 'second', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '2') {
                this.$emit('update', 'second', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'second', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'second', this.checkboxString);
            }
        },
        othChange() {
            // åè§£æž
            let ins = this.cron.second
            ('反解析 second', ins);
            if (ins === '*') {
                this.radioValue = 1;
            } else if (ins.indexOf('-') > -1) {
                this.radioValue = 2
            } else if (ins.indexOf('/') > -1) {
                this.radioValue = 3
            } else {
                this.radioValue = 4
                this.checkboxList = ins.split(',')
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange',
        radioParent() {
            this.radioValue = this.radioParent
        }
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 0, 59)
            this.cycle02 = this.checkNum(this.cycle02, 0, 59)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 0, 59)
            this.average02 = this.checkNum(this.average02, 1, 59)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
ruoyi-ui/src/components/Crontab/week.vue
@@ -1,167 +1,167 @@
<template>
    <el-form size='small'>
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                å‘¨ï¼Œå…è®¸çš„通配符[, - * / L #]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                ä¸æŒ‡å®š
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                å‘¨æœŸä»Žæ˜ŸæœŸ
                <el-input-number v-model='cycle01' :min="1" :max="7" /> -
                <el-input-number v-model='cycle02' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                ç¬¬
                <el-input-number v-model='average01' :min="1" :max="4" /> å‘¨çš„æ˜ŸæœŸ
                <el-input-number v-model='average02' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="5">
                æœ¬æœˆæœ€åŽä¸€ä¸ªæ˜ŸæœŸ
                <el-input-number v-model='weekday' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="6">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="(item,index) of weekList" :key="index" :value="index+1">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 2,
            weekday: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            weekList: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-week',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.radioValue === 1) {
                this.$emit('update', 'week', '*');
                this.$emit('update', 'year', '*');
            } else {
                if (this.cron.mouth === '*') {
                    this.$emit('update', 'mouth', '0', 'week');
                }
                if (this.cron.day === '*') {
                    this.$emit('update', 'day', '0', 'week');
                }
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'week');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'week');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'week');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'week', '?');
                    break;
                case 3:
                    this.$emit('update', 'week', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'week', this.average01 + '#' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'week', this.weekday + 'L');
                    break;
                case 6:
                    this.$emit('update', 'week', this.checkboxString);
                    break;
            }
        },
        // æ ¹æ®äº’斥事件,更改radio的值
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'week', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'week', this.averageTotal);
            }
        },
        // æœ€è¿‘工作日值变化时
        weekdayChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'week', this.weekday + 'L');
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '6') {
                this.$emit('update', 'week', this.checkboxString);
            }
        },
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'weekdayCheck': 'weekdayChange',
        'checkboxString': 'checkboxChange',
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 7)
            this.cycle02 = this.checkNum(this.cycle02, 1, 7)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 4)
            this.average02 = this.checkNum(this.average02, 1, 7)
            return this.average01 + '#' + this.average02;
        },
        // æœ€è¿‘的工作日(格式)
        weekdayCheck: function () {
            this.weekday = this.checkNum(this.weekday, 1, 7)
            return this.weekday;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
<template>
    <el-form size='small'>
        <el-form-item>
            <el-radio v-model='radioValue' :label="1">
                å‘¨ï¼Œå…è®¸çš„通配符[, - * / L #]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="2">
                ä¸æŒ‡å®š
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="3">
                å‘¨æœŸä»Žæ˜ŸæœŸ
                <el-input-number v-model='cycle01' :min="1" :max="7" /> -
                <el-input-number v-model='cycle02' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="4">
                ç¬¬
                <el-input-number v-model='average01' :min="1" :max="4" /> å‘¨çš„æ˜ŸæœŸ
                <el-input-number v-model='average02' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="5">
                æœ¬æœˆæœ€åŽä¸€ä¸ªæ˜ŸæœŸ
                <el-input-number v-model='weekday' :min="1" :max="7" />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio v-model='radioValue' :label="6">
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
                    <el-option v-for="(item,index) of weekList" :key="index" :value="index+1">{{item}}</el-option>
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            radioValue: 2,
            weekday: 1,
            cycle01: 1,
            cycle02: 2,
            average01: 1,
            average02: 1,
            checkboxList: [],
            weekList: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-week',
    props: ['check', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.radioValue === 1) {
                this.$emit('update', 'week', '*');
                this.$emit('update', 'year', '*');
            } else {
                if (this.cron.month === '*') {
                    this.$emit('update', 'month', '0', 'week');
                }
                if (this.cron.day === '*') {
                    this.$emit('update', 'day', '0', 'week');
                }
                if (this.cron.hour === '*') {
                    this.$emit('update', 'hour', '0', 'week');
                }
                if (this.cron.min === '*') {
                    this.$emit('update', 'min', '0', 'week');
                }
                if (this.cron.second === '*') {
                    this.$emit('update', 'second', '0', 'week');
                }
            }
            switch (this.radioValue) {
                case 2:
                    this.$emit('update', 'week', '?');
                    break;
                case 3:
                    this.$emit('update', 'week', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'week', this.average01 + '#' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'week', this.weekday + 'L');
                    break;
                case 6:
                    this.$emit('update', 'week', this.checkboxString);
                    break;
            }
        },
        // æ ¹æ®äº’斥事件,更改radio的值
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'week', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'week', this.averageTotal);
            }
        },
        // æœ€è¿‘工作日值变化时
        weekdayChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'week', this.weekday + 'L');
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '6') {
                this.$emit('update', 'week', this.checkboxString);
            }
        },
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'weekdayCheck': 'weekdayChange',
        'checkboxString': 'checkboxChange',
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, 1, 7)
            this.cycle02 = this.checkNum(this.cycle02, 1, 7)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, 1, 4)
            this.average02 = this.checkNum(this.average02, 1, 7)
            return this.average01 + '#' + this.average02;
        },
        // æœ€è¿‘的工作日(格式)
        weekdayCheck: function () {
            this.weekday = this.checkNum(this.weekday, 1, 7)
            return this.weekday;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str == '' ? '*' : str;
        }
    }
}
</script>
ruoyi-ui/src/components/Crontab/year.vue
@@ -1,144 +1,144 @@
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio :label="1" v-model='radioValue'>
                ä¸å¡«ï¼Œå…è®¸çš„通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="2" v-model='radioValue'>
                æ¯å¹´
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="3" v-model='radioValue'>
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min='fullYear' /> -
                <el-input-number v-model='cycle02' :min='fullYear' />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="4" v-model='radioValue'>
                ä»Ž
                <el-input-number v-model='average01' :min='fullYear' /> å¹´å¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min='fullYear' /> å¹´æ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="5" v-model='radioValue'>
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple>
                    <el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" />
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            fullYear: 0,
            radioValue: 1,
            cycle01: 0,
            cycle02: 0,
            average01: 0,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-year',
    props: ['check', 'mouth', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.cron.mouth === '*') {
                this.$emit('update', 'mouth', '0', 'year');
            }
            if (this.cron.day === '*') {
                this.$emit('update', 'day', '0', 'year');
            }
            if (this.cron.hour === '*') {
                this.$emit('update', 'hour', '0', 'year');
            }
            if (this.cron.min === '*') {
                this.$emit('update', 'min', '0', 'year');
            }
            if (this.cron.second === '*') {
                this.$emit('update', 'second', '0', 'year');
            }
            switch (this.radioValue) {
                case 1:
                    this.$emit('update', 'year', '');
                    break;
                case 2:
                    this.$emit('update', 'year', '*');
                    break;
                case 3:
                    this.$emit('update', 'year', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'year', this.average01 + '/' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'year', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'year', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'year', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'year', this.checkboxString);
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange'
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, this.fullYear, this.fullYear + 100)
            this.cycle02 = this.checkNum(this.cycle02, this.fullYear + 1, this.fullYear + 101)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, this.fullYear, this.fullYear + 100)
            this.average02 = this.checkNum(this.average02, 1, 10)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str;
        }
    },
    mounted: function () {
        // ä»…获取当前年份
        this.fullYear = Number(new Date().getFullYear());
    }
}
</script>
<template>
    <el-form size="small">
        <el-form-item>
            <el-radio :label="1" v-model='radioValue'>
                ä¸å¡«ï¼Œå…è®¸çš„通配符[, - * /]
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="2" v-model='radioValue'>
                æ¯å¹´
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="3" v-model='radioValue'>
                å‘¨æœŸä»Ž
                <el-input-number v-model='cycle01' :min='fullYear' /> -
                <el-input-number v-model='cycle02' :min='fullYear' />
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="4" v-model='radioValue'>
                ä»Ž
                <el-input-number v-model='average01' :min='fullYear' /> å¹´å¼€å§‹ï¼Œæ¯
                <el-input-number v-model='average02' :min='fullYear' /> å¹´æ‰§è¡Œä¸€æ¬¡
            </el-radio>
        </el-form-item>
        <el-form-item>
            <el-radio :label="5" v-model='radioValue'>
                æŒ‡å®š
                <el-select clearable v-model="checkboxList" placeholder="可多选" multiple>
                    <el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" />
                </el-select>
            </el-radio>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    data() {
        return {
            fullYear: 0,
            radioValue: 1,
            cycle01: 0,
            cycle02: 0,
            average01: 0,
            average02: 1,
            checkboxList: [],
            checkNum: this.$options.propsData.check
        }
    },
    name: 'crontab-year',
    props: ['check', 'month', 'cron'],
    methods: {
        // å•选按钮值变化时
        radioChange() {
            if (this.cron.month === '*') {
                this.$emit('update', 'month', '0', 'year');
            }
            if (this.cron.day === '*') {
                this.$emit('update', 'day', '0', 'year');
            }
            if (this.cron.hour === '*') {
                this.$emit('update', 'hour', '0', 'year');
            }
            if (this.cron.min === '*') {
                this.$emit('update', 'min', '0', 'year');
            }
            if (this.cron.second === '*') {
                this.$emit('update', 'second', '0', 'year');
            }
            switch (this.radioValue) {
                case 1:
                    this.$emit('update', 'year', '');
                    break;
                case 2:
                    this.$emit('update', 'year', '*');
                    break;
                case 3:
                    this.$emit('update', 'year', this.cycle01 + '-' + this.cycle02);
                    break;
                case 4:
                    this.$emit('update', 'year', this.average01 + '/' + this.average02);
                    break;
                case 5:
                    this.$emit('update', 'year', this.checkboxString);
                    break;
            }
        },
        // å‘¨æœŸä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        cycleChange() {
            if (this.radioValue == '3') {
                this.$emit('update', 'year', this.cycleTotal);
            }
        },
        // å¹³å‡ä¸¤ä¸ªå€¼å˜åŒ–æ—¶
        averageChange() {
            if (this.radioValue == '4') {
                this.$emit('update', 'year', this.averageTotal);
            }
        },
        // checkbox值变化时
        checkboxChange() {
            if (this.radioValue == '5') {
                this.$emit('update', 'year', this.checkboxString);
            }
        }
    },
    watch: {
        "radioValue": "radioChange",
        'cycleTotal': 'cycleChange',
        'averageTotal': 'averageChange',
        'checkboxString': 'checkboxChange'
    },
    computed: {
        // è®¡ç®—两个周期值
        cycleTotal: function () {
            this.cycle01 = this.checkNum(this.cycle01, this.fullYear, this.fullYear + 100)
            this.cycle02 = this.checkNum(this.cycle02, this.fullYear + 1, this.fullYear + 101)
            return this.cycle01 + '-' + this.cycle02;
        },
        // è®¡ç®—平均用到的值
        averageTotal: function () {
            this.average01 = this.checkNum(this.average01, this.fullYear, this.fullYear + 100)
            this.average02 = this.checkNum(this.average02, 1, 10)
            return this.average01 + '/' + this.average02;
        },
        // è®¡ç®—勾选的checkbox值合集
        checkboxString: function () {
            let str = this.checkboxList.join();
            return str;
        }
    },
    mounted: function () {
        // ä»…获取当前年份
        this.fullYear = Number(new Date().getFullYear());
    }
}
</script>
ruoyi-ui/src/components/ImageUpload/index.vue
@@ -18,7 +18,7 @@
    >
      <i class="el-icon-plus"></i>
    </el-upload>
    <!-- ä¸Šä¼ æç¤º -->
    <div class="el-upload__tip" slot="tip" v-if="showTip">
      è¯·ä¸Šä¼ 
@@ -113,8 +113,10 @@
    // åˆ é™¤å›¾ç‰‡
    handleRemove(file, fileList) {
      const findex = this.fileList.map(f => f.name).indexOf(file.name);
      this.fileList.splice(findex, 1);
      this.$emit("input", this.listToString(this.fileList));
      if(findex > -1) {
        this.fileList.splice(findex, 1);
        this.$emit("input", this.listToString(this.fileList));
      }
    },
    // ä¸Šä¼ æˆåŠŸå›žè°ƒ
    handleUploadSuccess(res) {
@@ -187,24 +189,23 @@
      for (let i in list) {
        strs += list[i].url + separator;
      }
      return strs != "" ? strs.substr(0, strs.length - 1) : "";
    },
  },
      return strs != '' ? strs.substr(0, strs.length - 1) : '';
    }
  }
};
</script>
<style scoped lang="scss">
// .el-upload--picture-card æŽ§åˆ¶åŠ å·éƒ¨åˆ†
::v-deep.hide .el-upload--picture-card {
  display: none;
    display: none;
}
// åŽ»æŽ‰åŠ¨ç”»æ•ˆæžœ
::v-deep .el-list-enter-active,
::v-deep .el-list-leave-active {
  transition: all 0s;
    transition: all 0s;
}
::v-deep .el-list-enter,
.el-list-leave-active {
::v-deep .el-list-enter, .el-list-leave-active {
  opacity: 0;
  transform: translateY(0);
}
ruoyi-ui/src/components/ThemePicker/index.vue
@@ -47,14 +47,6 @@
      const themeCluster = this.getThemeCluster(val.replace('#', ''))
      const originalCluster = this.getThemeCluster(oldVal.replace('#', ''))
      const $message = this.$message({
        message: '  æ­£åœ¨åˆ‡æ¢ä¸»é¢˜ï¼Œè¯·ç¨åŽ...',
        customClass: 'theme-message',
        type: 'success',
        duration: 0,
        iconClass: 'el-icon-loading'
      })
      const getHandler = (variable, id) => {
        return () => {
          const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))
@@ -91,9 +83,6 @@
      })
      this.$emit('change', val)
      $message.close()
    },
    updateStyle(style, oldCluster, newCluster) {
ruoyi-ui/src/layout/components/Sidebar/Link.vue
@@ -10,7 +10,7 @@
export default {
  props: {
    to: {
      type: String,
      type: [String, Object],
      required: true
    }
  },
ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue
@@ -1,7 +1,7 @@
<template>
  <div v-if="!item.hidden">
    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
          <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
        </el-menu-item>
@@ -82,13 +82,17 @@
      return false
    },
    resolvePath(routePath) {
    resolvePath(routePath, routeQuery) {
      if (isExternal(routePath)) {
        return routePath
      }
      if (isExternal(this.basePath)) {
        return this.basePath
      }
      if (routeQuery) {
        let query = JSON.parse(routeQuery);
        return { path: path.resolve(this.basePath, routePath), query: query }
      }
      return path.resolve(this.basePath, routePath)
    }
  }
ruoyi-ui/src/router/index.js
@@ -9,19 +9,20 @@
/**
 * Note: è·¯ç”±é…ç½®é¡¹
 *
 * hidden: true                   // å½“设置 true çš„æ—¶å€™è¯¥è·¯ç”±ä¸ä¼šå†ä¾§è¾¹æ å‡ºçް å¦‚401,login等页面,或者如一些编辑页面/edit/1
 * alwaysShow: true               // å½“你一个路由下面的 children å£°æ˜Žçš„路由大于1个时,自动会变成嵌套的模式--如组件页面
 *                                // åªæœ‰ä¸€ä¸ªæ—¶ï¼Œä¼šå°†é‚£ä¸ªå­è·¯ç”±å½“做根路由显示在侧边栏--如引导页面
 *                                // è‹¥ä½ æƒ³ä¸ç®¡è·¯ç”±ä¸‹é¢çš„ children å£°æ˜Žçš„个数都显示你的根路由
 *                                // ä½ å¯ä»¥è®¾ç½® alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
 * redirect: noRedirect           // å½“设置 noRedirect çš„æ—¶å€™è¯¥è·¯ç”±åœ¨é¢åŒ…屑导航中不可被点击
 * name:'router-name'             // è®¾å®šè·¯ç”±çš„名字,一定要填写不然使用<keep-alive>时会出现各种问题
 * hidden: true                     // å½“设置 true çš„æ—¶å€™è¯¥è·¯ç”±ä¸ä¼šå†ä¾§è¾¹æ å‡ºçް å¦‚401,login等页面,或者如一些编辑页面/edit/1
 * alwaysShow: true                 // å½“你一个路由下面的 children å£°æ˜Žçš„路由大于1个时,自动会变成嵌套的模式--如组件页面
 *                                  // åªæœ‰ä¸€ä¸ªæ—¶ï¼Œä¼šå°†é‚£ä¸ªå­è·¯ç”±å½“做根路由显示在侧边栏--如引导页面
 *                                  // è‹¥ä½ æƒ³ä¸ç®¡è·¯ç”±ä¸‹é¢çš„ children å£°æ˜Žçš„个数都显示你的根路由
 *                                  // ä½ å¯ä»¥è®¾ç½® alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
 * redirect: noRedirect             // å½“设置 noRedirect çš„æ—¶å€™è¯¥è·¯ç”±åœ¨é¢åŒ…屑导航中不可被点击
 * name:'router-name'               // è®¾å®šè·¯ç”±çš„名字,一定要填写不然使用<keep-alive>时会出现各种问题
 * query: '{"id": 1, "name": "ry"}' // è®¿é—®è·¯ç”±çš„默认传递参数
 * meta : {
    noCache: true                // å¦‚果设置为true,则不会被 <keep-alive> ç¼“å­˜(默认 false)
    title: 'title'               // è®¾ç½®è¯¥è·¯ç”±åœ¨ä¾§è¾¹æ å’Œé¢åŒ…屑中展示的名字
    icon: 'svg-name'             // è®¾ç½®è¯¥è·¯ç”±çš„图标,对应路径src/assets/icons/svg
    breadcrumb: false            // å¦‚果设置为false,则不会在breadcrumb面包屑中显示
    activeMenu: '/system/user'   // å½“路由设置了该属性,则会高亮相对应的侧边栏。
    noCache: true                   // å¦‚果设置为true,则不会被 <keep-alive> ç¼“å­˜(默认 false)
    title: 'title'                  // è®¾ç½®è¯¥è·¯ç”±åœ¨ä¾§è¾¹æ å’Œé¢åŒ…屑中展示的名字
    icon: 'svg-name'                // è®¾ç½®è¯¥è·¯ç”±çš„图标,对应路径src/assets/icons/svg
    breadcrumb: false               // å¦‚果设置为false,则不会在breadcrumb面包屑中显示
    activeMenu: '/system/user'      // å½“路由设置了该属性,则会高亮相对应的侧边栏。
  }
 */
@@ -156,7 +157,7 @@
    hidden: true,
    children: [
      {
        path: 'index/:tableId(\\d+)',
        path: 'index',
        component: (resolve) => require(['@/views/tool/gen/editTable'], resolve),
        name: 'GenEdit',
        meta: { title: '修改生成配置', activeMenu: '/tool/gen'}
ruoyi-ui/src/utils/request.js
@@ -66,7 +66,7 @@
          location.href = '/index';
        })
      }).catch(() => {});
      return Promise.reject('令牌验证失败')
      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
    } else if (code === 500) {
      Message({
        message: msg,
ruoyi-ui/src/views/system/menu/index.vue
@@ -206,6 +206,31 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item v-if="form.menuType == 'C'">
              <el-input v-model="form.query" placeholder="请输入路由参数" maxlength="255" />
              <span slot="label">
                <el-tooltip content='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`' placement="top">
                <i class="el-icon-question"></i>
                </el-tooltip>
                è·¯ç”±å‚æ•°
              </span>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item v-if="form.menuType == 'C'">
              <span slot="label">
                <el-tooltip content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致" placement="top">
                <i class="el-icon-question"></i>
                </el-tooltip>
                æ˜¯å¦ç¼“å­˜
              </span>
              <el-radio-group v-model="form.isCache">
                <el-radio label="0">缓存</el-radio>
                <el-radio label="1">不缓存</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item v-if="form.menuType != 'F'">
              <span slot="label">
                <el-tooltip content="选择隐藏则路由将不会出现在侧边栏,但仍然可以访问" placement="top">
@@ -236,20 +261,6 @@
                  :key="dict.dictValue"
                  :label="dict.dictValue"
                >{{dict.dictLabel}}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item v-if="form.menuType == 'C'">
              <span slot="label">
                <el-tooltip content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致" placement="top">
                <i class="el-icon-question"></i>
                </el-tooltip>
                æ˜¯å¦ç¼“å­˜
              </span>
              <el-radio-group v-model="form.isCache">
                <el-radio label="0">缓存</el-radio>
                <el-radio label="1">不缓存</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
ruoyi-ui/src/views/tool/gen/editTable.vue
@@ -157,7 +157,7 @@
    };
  },
  created() {
    const tableId = this.$route.params && this.$route.params.tableId;
    const tableId = this.$route.query && this.$route.query.tableId;
    if (tableId) {
      // èŽ·å–è¡¨è¯¦ç»†ä¿¡æ¯
      getGenTable(tableId).then(res => {
@@ -212,7 +212,7 @@
    /** å…³é—­æŒ‰é’® */
    close() {
      this.$store.dispatch("tagsView/delView", this.$route);
      this.$router.push({ path: "/tool/gen", query: { t: Date.now()}})
      this.$router.push({ path: "/tool/gen", query: { t: Date.now(), pageNum: this.$route.query.pageNum } })
    }
  },
  mounted() {
ruoyi-ui/src/views/tool/gen/index.vue
@@ -238,7 +238,8 @@
    const time = this.$route.query.t;
    if (time != null && time != this.uniqueId) {
      this.uniqueId = time;
      this.resetQuery();
      this.queryParams.pageNum = Number(this.$route.query.pageNum);
      this.getList();
    }
  },
  methods: {
@@ -319,7 +320,7 @@
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleEditTable(row) {
      const tableId = row.tableId || this.ids[0];
      this.$router.push("/tool/gen-edit/index/" + tableId);
      this.$router.push({ path: '/tool/gen-edit/index', query: { tableId: tableId, pageNum: this.queryParams.pageNum } });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
@@ -337,4 +338,4 @@
    }
  }
};
</script>
</script>
sql/quartz.sql
@@ -56,7 +56,7 @@
-- ----------------------------
create table QRTZ_SIMPLE_TRIGGERS (
    sched_name           varchar(120)    not null            comment '调度名称',
    trigger_name         varchar(200)    not null            comment 'qrtz_triggers表trigger_ name的外键',
    trigger_name         varchar(200)    not null            comment 'qrtz_triggers表trigger_name的外键',
    trigger_group        varchar(200)    not null            comment 'qrtz_triggers表trigger_group的外键',
    repeat_count         bigint(7)       not null            comment '重复的次数统计',
    repeat_interval      bigint(12)      not null            comment '重复的间隔时间',
@@ -134,7 +134,7 @@
-- ---------------------------- 
create table QRTZ_SCHEDULER_STATE (
    sched_name           varchar(120)    not null            comment '调度名称',
    instance_name        varchar(200)    not null            comment '之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段',
    instance_name        varchar(200)    not null            comment '实例名称',
    last_checkin_time    bigint(13)      not null            comment '上次检查时间',
    checkin_interval     bigint(13)      not null            comment '检查间隔时间',
    primary key (sched_name, instance_name)
@@ -154,7 +154,7 @@
-- ---------------------------- 
create table QRTZ_SIMPROP_TRIGGERS (
    sched_name           varchar(120)    not null            comment '调度名称',
    trigger_name         varchar(200)    not null            comment 'qrtz_triggers表trigger_ name的外键',
    trigger_name         varchar(200)    not null            comment 'qrtz_triggers表trigger_name的外键',
    trigger_group        varchar(200)    not null            comment 'qrtz_triggers表trigger_group的外键',
    str_prop_1           varchar(512)    null                comment 'String类型的trigger的第一个参数',
    str_prop_2           varchar(512)    null                comment 'String类型的trigger的第二个参数',
sql/ry_20210908.sql
ÎļþÃû´Ó sql/ry_20210731.sql ÐÞ¸Ä
@@ -137,6 +137,7 @@
  order_num         int(4)          default 0                  comment '显示顺序',
  path              varchar(200)    default ''                 comment '路由地址',
  component         varchar(255)    default null               comment '组件路径',
  query             varchar(255)    default null               comment '路由参数',
  is_frame          int(1)          default 1                  comment '是否为外链(0是 1否)',
  is_cache          int(1)          default 0                  comment '是否缓存(0缓存 1不缓存)',
  menu_type         char(1)         default ''                 comment '菜单类型(M目录 C菜单 F按钮)',
@@ -156,107 +157,107 @@
-- åˆå§‹åŒ–-菜单信息表数据
-- ----------------------------
-- ä¸€çº§èœå•
insert into sys_menu values('1', '系统管理', '0', '1', 'system',           null,   1, 0, 'M', '0', '0', '', 'system',   'admin', sysdate(), '', null, '系统管理目录');
insert into sys_menu values('2', '系统监控', '0', '2', 'monitor',          null,   1, 0, 'M', '0', '0', '', 'monitor',  'admin', sysdate(), '', null, '系统监控目录');
insert into sys_menu values('3', '系统工具', '0', '3', 'tool',             null,   1, 0, 'M', '0', '0', '', 'tool',     'admin', sysdate(), '', null, '系统工具目录');
insert into sys_menu values('4', 'PLUS官网', '0', '4', 'https://gitee.com/JavaLionLi/RuoYi-Vue-Plus', null ,  0, 0, 'M', '0', '0', '', 'guide',    'admin', sysdate(), '', null, 'RuoYi-Vue-Plus官网地址');
insert into sys_menu values('1', '系统管理', '0', '1', 'system',           null, '', 1, 0, 'M', '0', '0', '', 'system',   'admin', sysdate(), '', null, '系统管理目录');
insert into sys_menu values('2', '系统监控', '0', '2', 'monitor',          null, '', 1, 0, 'M', '0', '0', '', 'monitor',  'admin', sysdate(), '', null, '系统监控目录');
insert into sys_menu values('3', '系统工具', '0', '3', 'tool',             null, '', 1, 0, 'M', '0', '0', '', 'tool',     'admin', sysdate(), '', null, '系统工具目录');
insert into sys_menu values('4', 'PLUS官网', '0', '4', 'https://gitee.com/JavaLionLi/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide',    'admin', sysdate(), '', null, 'RuoYi-Vue-Plus官网地址');
-- äºŒçº§èœå•
insert into sys_menu values('100',  '用户管理', '1',   '1', 'user',       'system/user/index',        1, 0, 'C', '0', '0', 'system:user:list',        'user',          'admin', sysdate(), '', null, '用户管理菜单');
insert into sys_menu values('101',  '角色管理', '1',   '2', 'role',       'system/role/index',        1, 0, 'C', '0', '0', 'system:role:list',        'peoples',       'admin', sysdate(), '', null, '角色管理菜单');
insert into sys_menu values('102',  '菜单管理', '1',   '3', 'menu',       'system/menu/index',        1, 0, 'C', '0', '0', 'system:menu:list',        'tree-table',    'admin', sysdate(), '', null, '菜单管理菜单');
insert into sys_menu values('103',  '部门管理', '1',   '4', 'dept',       'system/dept/index',        1, 0, 'C', '0', '0', 'system:dept:list',        'tree',          'admin', sysdate(), '', null, '部门管理菜单');
insert into sys_menu values('104',  '岗位管理', '1',   '5', 'post',       'system/post/index',        1, 0, 'C', '0', '0', 'system:post:list',        'post',          'admin', sysdate(), '', null, '岗位管理菜单');
insert into sys_menu values('105',  '字典管理', '1',   '6', 'dict',       'system/dict/index',        1, 0, 'C', '0', '0', 'system:dict:list',        'dict',          'admin', sysdate(), '', null, '字典管理菜单');
insert into sys_menu values('106',  '参数设置', '1',   '7', 'config',     'system/config/index',      1, 0, 'C', '0', '0', 'system:config:list',      'edit',          'admin', sysdate(), '', null, '参数设置菜单');
insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     'system/notice/index',      1, 0, 'C', '0', '0', 'system:notice:list',      'message',       'admin', sysdate(), '', null, '通知公告菜单');
insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate(), '', null, '日志管理菜单');
insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate(), '', null, '在线用户菜单');
insert into sys_menu values('110',  '定时任务', '2',   '2', 'job',        'monitor/job/index',        1, 0, 'C', '0', '0', 'monitor:job:list',        'job',           'admin', sysdate(), '', null, '定时任务菜单');
insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate(), '', null, '数据监控菜单');
# insert into sys_menu values('112',  '服务监控', '2',   '4', 'server',     'monitor/server/index',     1, 0, 'C', '0', '0', 'monitor:server:list',     'server',        'admin', sysdate(), '', null, '服务监控菜单');
insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate(), '', null, '缓存监控菜单');
insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '表单构建菜单');
insert into sys_menu values('115',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '代码生成菜单');
insert into sys_menu values('116',  '系统接口', '3',   '3', 'swagger',    'tool/swagger/index',       1, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '系统接口菜单');
insert into sys_menu values('100',  '用户管理', '1',   '1', 'user',       'system/user/index',        '', 1, 0, 'C', '0', '0', 'system:user:list',        'user',          'admin', sysdate(), '', null, '用户管理菜单');
insert into sys_menu values('101',  '角色管理', '1',   '2', 'role',       'system/role/index',        '', 1, 0, 'C', '0', '0', 'system:role:list',        'peoples',       'admin', sysdate(), '', null, '角色管理菜单');
insert into sys_menu values('102',  '菜单管理', '1',   '3', 'menu',       'system/menu/index',        '', 1, 0, 'C', '0', '0', 'system:menu:list',        'tree-table',    'admin', sysdate(), '', null, '菜单管理菜单');
insert into sys_menu values('103',  '部门管理', '1',   '4', 'dept',       'system/dept/index',        '', 1, 0, 'C', '0', '0', 'system:dept:list',        'tree',          'admin', sysdate(), '', null, '部门管理菜单');
insert into sys_menu values('104',  '岗位管理', '1',   '5', 'post',       'system/post/index',        '', 1, 0, 'C', '0', '0', 'system:post:list',        'post',          'admin', sysdate(), '', null, '岗位管理菜单');
insert into sys_menu values('105',  '字典管理', '1',   '6', 'dict',       'system/dict/index',        '', 1, 0, 'C', '0', '0', 'system:dict:list',        'dict',          'admin', sysdate(), '', null, '字典管理菜单');
insert into sys_menu values('106',  '参数设置', '1',   '7', 'config',     'system/config/index',      '', 1, 0, 'C', '0', '0', 'system:config:list',      'edit',          'admin', sysdate(), '', null, '参数设置菜单');
insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     'system/notice/index',      '', 1, 0, 'C', '0', '0', 'system:notice:list',      'message',       'admin', sysdate(), '', null, '通知公告菜单');
insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate(), '', null, '日志管理菜单');
insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate(), '', null, '在线用户菜单');
insert into sys_menu values('110',  '定时任务', '2',   '2', 'job',        'monitor/job/index',        '', 1, 0, 'C', '0', '0', 'monitor:job:list',        'job',           'admin', sysdate(), '', null, '定时任务菜单');
insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', 1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate(), '', null, '数据监控菜单');
insert into sys_menu values('112',  '服务监控', '2',   '4', 'server',     'monitor/server/index',     '', 1, 0, 'C', '0', '0', 'monitor:server:list',     'server',        'admin', sysdate(), '', null, '服务监控菜单');
insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate(), '', null, '缓存监控菜单');
insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '表单构建菜单');
insert into sys_menu values('115',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '代码生成菜单');
insert into sys_menu values('116',  '系统接口', '3',   '3', 'swagger',    'tool/swagger/index',       '', 1, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '系统接口菜单');
-- springboot-admin监控
insert into sys_menu values('117',  'Admin监控', '2',  '5', 'Admin',      'monitor/admin/index',      1, 0, 'C', '0', '0', 'monitor:admin:list',      'dashboard',     'admin', sysdate(), '', null, 'Admin监控菜单');
insert into sys_menu values('117',  'Admin监控', '2',  '5', 'Admin',      'monitor/admin/index',      '', 1, 0, 'C', '0', '0', 'monitor:admin:list',      'dashboard',     'admin', sysdate(), '', null, 'Admin监控菜单');
-- ä¸‰çº§èœå•
insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    1, 0, 'C', '0', '0', 'monitor:operlog:list',    'form',          'admin', sysdate(), '', null, '操作日志菜单');
insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    'admin', sysdate(), '', null, '登录日志菜单');
insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    '', 1, 0, 'C', '0', '0', 'monitor:operlog:list',    'form',          'admin', sysdate(), '', null, '操作日志菜单');
insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    'admin', sysdate(), '', null, '登录日志菜单');
-- ç”¨æˆ·ç®¡ç†æŒ‰é’®
insert into sys_menu values('1001', '用户查询', '100', '1',  '', '', 1, 0, 'F', '0', '0', 'system:user:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1002', '用户新增', '100', '2',  '', '', 1, 0, 'F', '0', '0', 'system:user:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1003', '用户修改', '100', '3',  '', '', 1, 0, 'F', '0', '0', 'system:user:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1004', '用户删除', '100', '4',  '', '', 1, 0, 'F', '0', '0', 'system:user:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1005', '用户导出', '100', '5',  '', '', 1, 0, 'F', '0', '0', 'system:user:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1006', '用户导入', '100', '6',  '', '', 1, 0, 'F', '0', '0', 'system:user:import',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1007', '重置密码', '100', '7',  '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1001', '用户查询', '100', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1002', '用户新增', '100', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1003', '用户修改', '100', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1004', '用户删除', '100', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1005', '用户导出', '100', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1006', '用户导入', '100', '6',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:import',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1007', '重置密码', '100', '7',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd',       '#', 'admin', sysdate(), '', null, '');
-- è§’色管理按钮
insert into sys_menu values('1008', '角色查询', '101', '1',  '', '', 1, 0, 'F', '0', '0', 'system:role:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1009', '角色新增', '101', '2',  '', '', 1, 0, 'F', '0', '0', 'system:role:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1010', '角色修改', '101', '3',  '', '', 1, 0, 'F', '0', '0', 'system:role:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1011', '角色删除', '101', '4',  '', '', 1, 0, 'F', '0', '0', 'system:role:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1012', '角色导出', '101', '5',  '', '', 1, 0, 'F', '0', '0', 'system:role:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1008', '角色查询', '101', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1009', '角色新增', '101', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1010', '角色修改', '101', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1011', '角色删除', '101', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1012', '角色导出', '101', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:export',         '#', 'admin', sysdate(), '', null, '');
-- èœå•管理按钮
insert into sys_menu values('1013', '菜单查询', '102', '1',  '', '', 1, 0, 'F', '0', '0', 'system:menu:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1014', '菜单新增', '102', '2',  '', '', 1, 0, 'F', '0', '0', 'system:menu:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1015', '菜单修改', '102', '3',  '', '', 1, 0, 'F', '0', '0', 'system:menu:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1016', '菜单删除', '102', '4',  '', '', 1, 0, 'F', '0', '0', 'system:menu:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1013', '菜单查询', '102', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1014', '菜单新增', '102', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1015', '菜单修改', '102', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1016', '菜单删除', '102', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove',         '#', 'admin', sysdate(), '', null, '');
-- éƒ¨é—¨ç®¡ç†æŒ‰é’®
insert into sys_menu values('1017', '部门查询', '103', '1',  '', '', 1, 0, 'F', '0', '0', 'system:dept:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1018', '部门新增', '103', '2',  '', '', 1, 0, 'F', '0', '0', 'system:dept:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1019', '部门修改', '103', '3',  '', '', 1, 0, 'F', '0', '0', 'system:dept:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1020', '部门删除', '103', '4',  '', '', 1, 0, 'F', '0', '0', 'system:dept:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1017', '部门查询', '103', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1018', '部门新增', '103', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1019', '部门修改', '103', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1020', '部门删除', '103', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove',         '#', 'admin', sysdate(), '', null, '');
-- å²—位管理按钮
insert into sys_menu values('1021', '岗位查询', '104', '1',  '', '', 1, 0, 'F', '0', '0', 'system:post:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1022', '岗位新增', '104', '2',  '', '', 1, 0, 'F', '0', '0', 'system:post:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1023', '岗位修改', '104', '3',  '', '', 1, 0, 'F', '0', '0', 'system:post:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1024', '岗位删除', '104', '4',  '', '', 1, 0, 'F', '0', '0', 'system:post:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1025', '岗位导出', '104', '5',  '', '', 1, 0, 'F', '0', '0', 'system:post:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1021', '岗位查询', '104', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1022', '岗位新增', '104', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1023', '岗位修改', '104', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1024', '岗位删除', '104', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1025', '岗位导出', '104', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:export',         '#', 'admin', sysdate(), '', null, '');
-- å­—典管理按钮
insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', 1, 0, 'F', '0', '0', 'system:dict:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', 1, 0, 'F', '0', '0', 'system:dict:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', 1, 0, 'F', '0', '0', 'system:dict:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', 1, 0, 'F', '0', '0', 'system:dict:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', 1, 0, 'F', '0', '0', 'system:dict:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export',         '#', 'admin', sysdate(), '', null, '');
-- å‚数设置按钮
insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', 1, 0, 'F', '0', '0', 'system:config:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', 1, 0, 'F', '0', '0', 'system:config:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', 1, 0, 'F', '0', '0', 'system:config:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', 1, 0, 'F', '0', '0', 'system:config:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', 1, 0, 'F', '0', '0', 'system:config:export',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export',       '#', 'admin', sysdate(), '', null, '');
-- é€šçŸ¥å…¬å‘ŠæŒ‰é’®
insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', 1, 0, 'F', '0', '0', 'system:notice:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', 1, 0, 'F', '0', '0', 'system:notice:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', 1, 0, 'F', '0', '0', 'system:notice:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', 1, 0, 'F', '0', '0', 'system:notice:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove',       '#', 'admin', sysdate(), '', null, '');
-- æ“ä½œæ—¥å¿—按钮
insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query',      '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove',     '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export',     '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query',      '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove',     '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export',     '#', 'admin', sysdate(), '', null, '');
-- ç™»å½•日志按钮
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query',   '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove',  '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export',  '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query',   '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove',  '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export',  '#', 'admin', sysdate(), '', null, '');
-- åœ¨çº¿ç”¨æˆ·æŒ‰é’®
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:query',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, '');
-- å®šæ—¶ä»»åŠ¡æŒ‰é’®
insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus',   '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1054', '任务导出', '110', '7', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:export',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus',   '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1054', '任务导出', '110', '7', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export',         '#', 'admin', sysdate(), '', null, '');
-- ä»£ç ç”ŸæˆæŒ‰é’®
insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '');
insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '');
-- ----------------------------
@@ -687,4 +688,4 @@
  update_by         varchar(64)     default ''                 comment '更新者',
  update_time       datetime                                   comment '更新时间',
  primary key (column_id)
) engine=innodb auto_increment=1 comment = '代码生成业务表字段';
) engine=innodb auto_increment=1 comment = '代码生成业务表字段';