Bladeren bron

1. 完成 Job 的新增和修改
2. 优化代码生成器的模板

YunaiV 4 jaren geleden
bovenliggende
commit
bc1504d991

+ 1 - 1
ruoyi-ui/.env.development

@@ -1,7 +1,7 @@
 # 开发环境配置
 ENV = 'development'
 
-# 若依管理系统/开发环境
+# 芋道管理系统/开发环境
 VUE_APP_BASE_API = '/dev-api'
 # VUE_APP_BASE_API = '/api'
 

+ 1 - 1
ruoyi-ui/.env.production

@@ -1,5 +1,5 @@
 # 生产环境配置
 ENV = 'production'
 
-# 若依管理系统/生产环境
+# 芋道管理系统/生产环境
 VUE_APP_BASE_API = '/prod-api'

+ 1 - 1
ruoyi-ui/.env.staging

@@ -3,5 +3,5 @@ NODE_ENV = production
 # 测试环境配置
 ENV = 'staging'
 
-# 若依管理系统/测试环境
+# 芋道管理系统/测试环境
 VUE_APP_BASE_API = '/stage-api'

+ 2 - 2
ruoyi-ui/package.json

@@ -1,8 +1,8 @@
 {
   "name": "ruoyi",
   "version": "3.3.0",
-  "description": "若依管理系统",
-  "author": "若依",
+  "description": "芋道管理系统",
+  "author": "芋道",
   "license": "MIT",
   "scripts": {
     "dev": "vue-cli-service serve",

+ 7 - 7
ruoyi-ui/src/api/monitor/job.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询定时任务调度列表
 export function listJob(query) {
   return request({
-    url: '/monitor/job/list',
+    url: '/infra/job/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listJob(query) {
 // 查询定时任务调度详细
 export function getJob(jobId) {
   return request({
-    url: '/monitor/job/' + jobId,
+    url: '/infra/job/get?id=' + jobId,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getJob(jobId) {
 // 新增定时任务调度
 export function addJob(data) {
   return request({
-    url: '/monitor/job',
+    url: '/infra/job/create',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addJob(data) {
 // 修改定时任务调度
 export function updateJob(data) {
   return request({
-    url: '/monitor/job',
+    url: '/infra/job/update',
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateJob(data) {
 // 删除定时任务调度
 export function delJob(jobId) {
   return request({
-    url: '/monitor/job/' + jobId,
+    url: '/infra/job/delete?id=' + jobId,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delJob(jobId) {
 // 导出定时任务调度
 export function exportJob(query) {
   return request({
-    url: '/monitor/job/export',
+    url: '/infra/job/export',
     method: 'get',
     params: query
   })
@@ -77,4 +77,4 @@ export function runJob(jobId, jobGroup) {
     method: 'put',
     data: data
   })
-}
+}

+ 1 - 1
ruoyi-ui/src/layout/components/Sidebar/Logo.vue

@@ -35,7 +35,7 @@ export default {
   },
   data() {
     return {
-      title: '若依管理系统',
+      title: '芋道管理系统',
       logo: logoImg
     }
   }

+ 1 - 1
ruoyi-ui/src/settings.js

@@ -1,5 +1,5 @@
 module.exports = {
-  title: '若依管理系统',
+  title: '芋道管理系统',
 
   /**
    * 侧边栏主题 深色主题theme-dark,浅色主题theme-light

+ 1 - 0
ruoyi-ui/src/utils/dict.js

@@ -17,6 +17,7 @@ export const DICT_TYPE = {
   SYS_CONFIG_TYPE: 'sys_config_type',
 
   INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type',
+  INF_JOB_STATUS: 'inf_job_status',
 
   TOOL_CODEGEN_TEMPLATE_TYPE: 'tool_codegen_template_type',
 }

+ 5 - 5
ruoyi-ui/src/views/index.vue

@@ -39,9 +39,9 @@
     </el-row>
     <el-row :gutter="20">
       <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>若依后台管理框架</h2>
+        <h2>芋道后台管理框架</h2>
         <p>
-          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
+          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了芋道管理系统。,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
         </p>
         <p>
           <b>当前版本:</b> <span>v{{ version }}</span>
@@ -127,14 +127,14 @@
             <p>
               <i class="el-icon-chat-dot-round"></i> 微信:<a
                 href="javascript:;"
-                >/ *若依</a
+                >/ *芋道</a
               >
             </p>
             <p>
               <i class="el-icon-money"></i> 支付宝:<a
                 href="javascript:;"
                 class="支付宝信息"
-                >/ *若依</a
+                >/ *芋道</a
               >
             </p>
           </div>
@@ -460,7 +460,7 @@
             </el-collapse-item>
             <el-collapse-item title="v1.0.0 - 2019-10-08">
               <ol>
-                <li>若依前后端分离系统正式发布</li>
+                <li>芋道前后端分离系统正式发布</li>
               </ol>
             </el-collapse-item>
           </el-collapse>

+ 1 - 1
ruoyi-ui/src/views/login.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">若依后台管理系统</h3>
+      <h3 class="title">芋道后台管理系统</h3>
       <el-form-item prop="username">
         <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

+ 93 - 271
ruoyi-ui/src/views/monitor/job/index.vue

@@ -1,35 +1,18 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="任务名称" prop="jobName">
-        <el-input
-          v-model="queryParams.jobName"
-          placeholder="请输入任务名称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="任务组名" prop="jobGroup">
-        <el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable size="small">
-          <el-option
-            v-for="dict in jobGroupOptions"
-            :key="dict.dictValue"
-            :label="dict.dictLabel"
-            :value="dict.dictValue"
-          />
-        </el-select>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="任务名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入任务名称" clearable size="small" @keyup.enter.native="handleQuery"/>
       </el-form-item>
       <el-form-item label="任务状态" prop="status">
         <el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable size="small">
-          <el-option
-            v-for="dict in statusOptions"
-            :key="dict.dictValue"
-            :label="dict.dictLabel"
-            :value="dict.dictValue"
-          />
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.INF_JOB_STATUS)"
+                     :key="dict.value" :label="dict.label" :value="dict.value"/>
         </el-select>
       </el-form-item>
+      <el-form-item label="处理器的名字" prop="handlerName">
+        <el-input v-model="queryParams.handlerName" placeholder="请输入处理器的名字" clearable size="small" @keyup.enter.native="handleQuery"/>
+      </el-form-item>
       <el-form-item>
         <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -38,171 +21,69 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['monitor:job:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['monitor:job:edit']"
-        >修改</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['monitor:job:add']">新增</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['monitor:job:remove']"
-        >删除</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
+                   v-hasPermi="['monitor:job:export']">导出</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="warning"
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['monitor:job:export']"
-        >导出</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          icon="el-icon-s-operation"
-          size="mini"
-          @click="handleJobLog"
-          v-hasPermi="['monitor:job:query']"
-        >日志</el-button>
+        <el-button type="info" icon="el-icon-s-operation" size="mini" @click="handleJobLog"
+                   v-hasPermi="['monitor:job:query']">日志</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="任务编号" align="center" prop="jobId" />
-      <el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
-      <el-table-column label="任务组名" align="center" prop="jobGroup" :formatter="jobGroupFormat" />
-      <el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
-      <el-table-column label="cron执行表达式" align="center" prop="cronExpression" :show-overflow-tooltip="true" />
-      <el-table-column label="状态" align="center">
+    <el-table v-loading="loading" :data="jobList">
+      <el-table-column label="任务编号" align="center" prop="id" />
+      <el-table-column label="任务名称" align="center" prop="name" />
+      <el-table-column label="任务状态" align="center" prop="status">
         <template slot-scope="scope">
-          <el-switch
-            v-model="scope.row.status"
-            active-value="0"
-            inactive-value="1"
-            @change="handleStatusChange(scope.row)"
-          ></el-switch>
+          <span>{{ getDictDataLabel(DICT_TYPE.INF_JOB_STATUS, scope.row.status) }}</span>
         </template>
-      </el-table-column>
+      </el-table-column>>
+      <el-table-column label="处理器的名字" align="center" prop="handlerName" />
+      <el-table-column label="处理器的参数" align="center" prop="handlerParam" />
+      <el-table-column label="CRON 表达式" align="center" prop="cronExpression" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)"
+                     v-hasPermi="['monitor:job:query']">详细</el-button>
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['monitor:job:query']">修改</el-button>
           <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-caret-right"
-            @click="handleRun(scope.row)"
-            v-hasPermi="['monitor:job:changeStatus']"
+              size="mini"
+              type="text"
+              icon="el-icon-caret-right"
+              @click="handleRun(scope.row)"
+              v-hasPermi="['monitor:job:changeStatus']"
           >执行一次</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-view"
-            @click="handleView(scope.row)"
-            v-hasPermi="['monitor:job:query']"
-          >详细</el-button>
         </template>
       </el-table-column>
     </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
 
     <!-- 添加或修改定时任务对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="任务名称" prop="jobName">
-              <el-input v-model="form.jobName" placeholder="请输入任务名称" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="任务分组" prop="jobGroup">
-              <el-select v-model="form.jobGroup" placeholder="请选择">
-                <el-option
-                  v-for="dict in jobGroupOptions"
-                  :key="dict.dictValue"
-                  :label="dict.dictLabel"
-                  :value="dict.dictValue"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item prop="invokeTarget">
-              <span slot="label">
-                调用方法
-                <el-tooltip placement="top">
-                  <div slot="content">
-                    Bean调用示例:ryTask.ryParams('ry')
-                    <br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')
-                    <br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型
-                  </div>
-                  <i class="el-icon-question"></i>
-                </el-tooltip>
-              </span>
-              <el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="cron表达式" prop="cronExpression">
-              <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="是否并发" prop="concurrent">
-              <el-radio-group v-model="form.concurrent" size="small">
-                <el-radio-button label="0">允许</el-radio-button>
-                <el-radio-button label="1">禁止</el-radio-button>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="错误策略" prop="misfirePolicy">
-              <el-radio-group v-model="form.misfirePolicy" size="small">
-                <el-radio-button label="1">立即执行</el-radio-button>
-                <el-radio-button label="2">执行一次</el-radio-button>
-                <el-radio-button label="3">放弃执行</el-radio-button>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="状态">
-              <el-radio-group v-model="form.status">
-                <el-radio
-                  v-for="dict in statusOptions"
-                  :key="dict.dictValue"
-                  :label="dict.dictValue"
-                >{{dict.dictLabel}}</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <el-form-item label="任务名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入任务名称" />
+        </el-form-item>
+        <el-form-item label="处理器的名字" prop="handlerName">
+          <el-input v-model="form.handlerName" placeholder="请输入处理器的名字" v-bind:readonly="form.id !== undefined" />
+        </el-form-item>
+        <el-form-item label="处理器的参数" prop="handlerParam">
+          <el-input v-model="form.handlerParam" placeholder="请输入处理器的参数" />
+        </el-form-item>
+        <el-form-item label="CRON 表达式" prop="cronExpression">
+          <el-input v-model="form.cronExpression" placeholder="请输入CRON 表达式" />
+        </el-form-item>
+        <el-form-item label="监控超时时间" prop="monitorTimeout">
+          <el-input v-model="form.monitorTimeout" placeholder="请输入监控超时时间,单位:毫秒" />
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -212,44 +93,20 @@
 
     <!-- 任务日志详细 -->
     <el-dialog title="任务详细" :visible.sync="openView" width="700px" append-to-body>
-      <el-form ref="form" :model="form" label-width="120px" size="mini">
+      <el-form ref="form" :model="form" label-width="200px" size="mini">
         <el-row>
-          <el-col :span="12">
-            <el-form-item label="任务编号:">{{ form.jobId }}</el-form-item>
-            <el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item>
-            <el-form-item label="创建时间:">{{ form.createTime }}</el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="cron表达式:">{{ form.cronExpression }}</el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="下次执行时间:">{{ parseTime(form.nextValidTime) }}</el-form-item>
-          </el-col>
           <el-col :span="24">
-            <el-form-item label="调用目标方法:">{{ form.invokeTarget }}</el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="任务状态:">
-              <div v-if="form.status == 0">正常</div>
-              <div v-else-if="form.status == 1">失败</div>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="是否并发:">
-              <div v-if="form.concurrent == 0">允许</div>
-              <div v-else-if="form.concurrent == 1">禁止</div>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="执行策略:">
-              <div v-if="form.misfirePolicy == 0">默认策略</div>
-              <div v-else-if="form.misfirePolicy == 1">立即执行</div>
-              <div v-else-if="form.misfirePolicy == 2">执行一次</div>
-              <div v-else-if="form.misfirePolicy == 3">放弃执行</div>
-            </el-form-item>
+            <el-form-item label="任务编号:">{{ form.id }}</el-form-item>
+            <el-form-item label="任务名称:">{{ form.name }}</el-form-item>
+            <el-form-item label="任务名称:">{{ getDictDataLabel(DICT_TYPE.INF_JOB_STATUS, form.status) }}</el-form-item>
+            <el-form-item label="处理器的名字:">{{ form.handlerName }}</el-form-item>
+            <el-form-item label="处理器的参数:">{{ form.handlerParam }}</el-form-item>
+            <el-form-item label="cron表达式:">{{ form.cronExpression }}</el-form-item>
+            <el-form-item label="最后一次执行的开始时间:">{{ parseTime(form.executeBeginTime) }}</el-form-item>
+            <el-form-item label="最后一次执行的开始时间:">{{ parseTime(form.executeEndTime) }}</el-form-item>
+            <el-form-item label="上一次触发时间:">{{ parseTime(form.firePrevTime) }}</el-form-item>
+            <el-form-item label="下一次触发时间:">{{ parseTime(form.fireNextTime) }}</el-form-item>
+            <el-form-item label="监控超时时间:">{{ form.monitorTimeout > 0 ? form.monitorTimeout + " 毫秒" : "未开启" }}</el-form-item>
           </el-col>
         </el-row>
       </el-form>
@@ -257,6 +114,7 @@
         <el-button @click="openView = false">关 闭</el-button>
       </div>
     </el-dialog>
+
   </div>
 </template>
 
@@ -269,12 +127,6 @@ export default {
     return {
       // 遮罩层
       loading: true,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
       // 显示搜索条件
       showSearch: true,
       // 总条数
@@ -287,83 +139,59 @@ export default {
       open: false,
       // 是否显示详细弹出层
       openView: false,
-      // 任务组名字典
-      jobGroupOptions: [],
       // 状态字典
       statusOptions: [],
       // 查询参数
       queryParams: {
-        pageNum: 1,
+        pageNo: 1,
         pageSize: 10,
-        jobName: undefined,
-        jobGroup: undefined,
-        status: undefined
+        name: undefined,
+        status: undefined,
+        handlerName: undefined
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
-        jobName: [
-          { required: true, message: "任务名称不能为空", trigger: "blur" }
-        ],
-        invokeTarget: [
-          { required: true, message: "调用目标字符串不能为空", trigger: "blur" }
-        ],
-        cronExpression: [
-          { required: true, message: "cron执行表达式不能为空", trigger: "blur" }
-        ]
+        name: [{ required: true, message: "任务名称不能为空", trigger: "blur" }],
+        handlerName: [{ required: true, message: "处理器的名字不能为空", trigger: "blur" }],
+        cronExpression: [{ required: true, message: "CRON 表达式不能为空", trigger: "blur" }],
       }
     };
   },
   created() {
     this.getList();
-    this.getDicts("sys_job_group").then(response => {
-      this.jobGroupOptions = response.data;
-    });
-    this.getDicts("sys_job_status").then(response => {
-      this.statusOptions = response.data;
-    });
   },
   methods: {
     /** 查询定时任务列表 */
     getList() {
       this.loading = true;
       listJob(this.queryParams).then(response => {
-        this.jobList = response.rows;
-        this.total = response.total;
+        this.jobList = response.data.list;
+        this.total = response.data.total;
         this.loading = false;
       });
     },
-    // 任务组名字典翻译
-    jobGroupFormat(row, column) {
-      return this.selectDictLabel(this.jobGroupOptions, row.jobGroup);
-    },
-    // 状态字典翻译
-    statusFormat(row, column) {
-      return this.selectDictLabel(this.statusOptions, row.status);
-    },
-    // 取消按钮
+    /** 取消按钮 */
     cancel() {
       this.open = false;
       this.reset();
     },
-    // 表单重置
+    /** 表单重置 */
     reset() {
       this.form = {
-        jobId: undefined,
-        jobName: undefined,
-        jobGroup: undefined,
-        invokeTarget: undefined,
+        id: undefined,
+        name: undefined,
+        handlerName: undefined,
+        handlerParam: undefined,
         cronExpression: undefined,
-        misfirePolicy: 1,
-        concurrent: 1,
-        status: "0"
+        monitorTimeout: undefined,
       };
       this.resetForm("form");
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.pageNum = 1;
+      this.queryParams.pageNo = 1;
       this.getList();
     },
     /** 重置按钮操作 */
@@ -371,21 +199,15 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.jobId);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
     // 任务状态修改
     handleStatusChange(row) {
       let text = row.status === "0" ? "启用" : "停用";
-      this.$confirm('确认要"' + text + '""' + row.jobName + '"任务吗?', "警告", {
+      this.$confirm('确认要"' + text + '""' + row.name + '"任务吗?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
         }).then(function() {
-          return changeJobStatus(row.jobId, row.status);
+          return changeJobStatus(row.id, row.status);
         }).then(() => {
           this.msgSuccess(text + "成功");
         }).catch(function() {
@@ -394,19 +216,19 @@ export default {
     },
     /* 立即执行一次 */
     handleRun(row) {
-      this.$confirm('确认要立即执行一次"' + row.jobName + '"任务吗?', "警告", {
+      this.$confirm('确认要立即执行一次"' + row.name + '"任务吗?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
         }).then(function() {
-          return runJob(row.jobId, row.jobGroup);
+          return runJob(row.id, row.jobGroup);
         }).then(() => {
           this.msgSuccess("执行成功");
         })
     },
     /** 任务详细信息 */
     handleView(row) {
-      getJob(row.jobId).then(response => {
+      getJob(row.id).then(response => {
         this.form = response.data;
         this.openView = true;
       });
@@ -424,8 +246,8 @@ export default {
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const jobId = row.jobId || this.ids;
-      getJob(jobId).then(response => {
+      const id = row.id;
+      getJob(id).then(response => {
         this.form = response.data;
         this.open = true;
         this.title = "修改任务";
@@ -435,7 +257,7 @@ export default {
     submitForm: function() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          if (this.form.jobId != undefined) {
+          if (this.form.id !== undefined) {
             updateJob(this.form).then(response => {
               this.msgSuccess("修改成功");
               this.open = false;
@@ -453,13 +275,13 @@ export default {
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const jobIds = row.jobId || this.ids;
-      this.$confirm('是否确认删除定时任务编号为"' + jobIds + '"的数据项?', "警告", {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除定时任务编号为"' + ids + '"的数据项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
         }).then(function() {
-          return delJob(jobIds);
+          return delJob(ids);
         }).then(() => {
           this.getList();
           this.msgSuccess("删除成功");
@@ -480,4 +302,4 @@ export default {
     }
   }
 };
-</script>
+</script>

+ 1 - 1
ruoyi-ui/src/views/tool/codegen/editTable.vue

@@ -212,7 +212,7 @@ export default {
     /** 关闭按钮 */
     close() {
       this.$store.dispatch("tagsView/delView", this.$route);
-      this.$router.push({ path: "/tool/gen", query: { t: Date.now()}})
+      this.$router.push({ path: "/tool/codegen", query: { t: Date.now()}})
     }
   },
   mounted() {

+ 1 - 1
ruoyi-ui/src/views/tool/codegen/index.vue

@@ -59,7 +59,7 @@
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+      <el-table-column label="更新时间" align="center" prop="createTime" width="160">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.updateTime) }}</span>
         </template>

+ 1 - 1
ruoyi-ui/vue.config.js

@@ -6,7 +6,7 @@ function resolve(dir) {
   return path.join(__dirname, dir)
 }
 
-const name = defaultSettings.title || '若依管理系统' // 标题
+const name = defaultSettings.title || '芋道管理系统' // 标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口
 

+ 1 - 1
src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java

@@ -89,7 +89,7 @@ public class InfJobController {
     @PreAuthorize("@ss.hasPermission('infra:job:export')")
     @OperateLog(type = EXPORT)
     public void exportJobExcel(@Valid InfJobExportReqVO exportReqVO,
-              HttpServletResponse response) throws IOException {
+                               HttpServletResponse response) throws IOException {
         List<InfJobDO> list = jobService.getJobList(exportReqVO);
         // 导出 Excel
         List<InfJobExcelVO> datas = InfJobConvert.INSTANCE.convertList02(list);

+ 0 - 28
src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java

@@ -2,12 +2,8 @@ package cn.iocoder.dashboard.modules.infra.controller.job.vo.job;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
-import java.util.Date;
-
-import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 /**
 * 定时任务 Base VO,提供给添加、修改、详细的子 VO 使用
@@ -20,14 +16,6 @@ public class InfJobBaseVO {
     @NotNull(message = "任务名称不能为空")
     private String name;
 
-    @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 InfJobStatusEnum 枚举")
-    @NotNull(message = "任务状态不能为空")
-    private Integer status;
-
-    @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
-    @NotNull(message = "处理器的名字不能为空")
-    private String handlerName;
-
     @ApiModelProperty(value = "处理器的参数", example = "yudao")
     private String handlerParam;
 
@@ -35,22 +23,6 @@ public class InfJobBaseVO {
     @NotNull(message = "CRON 表达式不能为空")
     private String cronExpression;
 
-    @ApiModelProperty(value = "最后一次执行的开始时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private Date executeBeginTime;
-
-    @ApiModelProperty(value = "最后一次执行的结束时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private Date executeEndTime;
-
-    @ApiModelProperty(value = "上一次触发时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private Date firePrevTime;
-
-    @ApiModelProperty(value = "下一次触发时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private Date fireNextTime;
-
     @ApiModelProperty(value = "监控超时时间", example = "1000")
     private Integer monitorTimeout;
 

+ 7 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java

@@ -1,14 +1,21 @@
 package cn.iocoder.dashboard.modules.infra.controller.job.vo.job;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+import javax.validation.constraints.NotNull;
+
 @ApiModel("定时任务创建 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class InfJobCreateReqVO extends InfJobBaseVO {
 
+    @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
+    @NotNull(message = "处理器的名字不能为空")
+    private String handlerName;
+
 }

+ 20 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 @ApiModel("定时任务 Response VO")
@@ -17,6 +18,25 @@ public class InfJobRespVO extends InfJobBaseVO {
     @ApiModelProperty(value = "任务编号", required = true, example = "1024")
     private Long id;
 
+    @ApiModelProperty(value = "任务状态", required = true, example = "1")
+    private Integer status;
+
+    @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
+    @NotNull(message = "处理器的名字不能为空")
+    private String handlerName;
+
+    @ApiModelProperty(value = "最后一次执行的开始时间")
+    private Date executeBeginTime;
+
+    @ApiModelProperty(value = "最后一次执行的结束时间")
+    private Date executeEndTime;
+
+    @ApiModelProperty(value = "上一次触发时间")
+    private Date firePrevTime;
+
+    @ApiModelProperty(value = "下一次触发时间")
+    private Date fireNextTime;
+
     @ApiModelProperty(value = "创建时间", required = true)
     private Date createTime;
 

+ 1 - 1
src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java

@@ -80,10 +80,10 @@ public class InfJobDO extends BaseDO {
     // ========== 监控相关字段 ==========
     /**
      * 监控超时时间,单位:毫秒
+     * 为空时,表示不监控
      *
      * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长
      */
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer monitorTimeout;
 
     // TODO misfirePolicy

+ 6 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java

@@ -35,6 +35,9 @@ public class InfJobServiceImpl implements InfJobService {
     public Long createJob(InfJobCreateReqVO createReqVO) {
         // 插入
         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
+        if (job.getMonitorTimeout() == null) {
+            job.setMonitorTimeout(0);
+        }
         jobMapper.insert(job);
         // 返回
         return job.getId();
@@ -46,6 +49,9 @@ public class InfJobServiceImpl implements InfJobService {
         this.validateJobExists(updateReqVO.getId());
         // 更新
         InfJobDO updateObj = InfJobConvert.INSTANCE.convert(updateReqVO);
+        if (updateObj.getMonitorTimeout() == null) {
+            updateObj.setMonitorTimeout(0);
+        }
         jobMapper.updateById(updateObj);
     }
 

+ 5 - 0
src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java

@@ -5,6 +5,11 @@ import cn.iocoder.dashboard.framework.quartz.core.handler.JobHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+/**
+ * 用户 Session 超时 Job
+ *
+ * @author 芋道源码
+ */
 @Component
 @Slf4j
 public class SysUserSessionTimeoutJob implements JobHandler {

+ 1 - 1
src/main/resources/codegen/java/controller/vo/baseVO.vm

@@ -6,7 +6,7 @@ import io.swagger.annotations.*;
 import javax.validation.constraints.*;
 ## 处理 Date 字段的引入
 #foreach ($column in $columns)
-#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作
+#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult}
     && ${column.javaType} == "Date")## 时间类型
 import org.springframework.format.annotation.DateTimeFormat;
 

+ 11 - 1
src/main/resources/codegen/vue/views/index.vue.vm

@@ -218,11 +218,13 @@ export default {
       // 是否显示弹出层
       open: false,
       #foreach ($column in $columns)## 时间范围
+      #if ($column.listOperation)
       #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
       #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
       dateRange${AttrName}: [],
       #end
       #end
+      #end
       // 查询参数
       queryParams: {
         pageNo: 1,
@@ -256,11 +258,13 @@ export default {
       // 处理查询参数
       let params = {...this.queryParams};
       #foreach ($column in $columns)
+      #if ($column.listOperation)
       #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
       #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
       this.addBeginAndEndTime(params, this.dateRange${AttrName}, '${column.javaField}');
       #end
       #end
+      #end
       // 执行查询
       get${simpleClassName}Page(params).then(response => {
         this.list = response.data.list;
@@ -277,12 +281,14 @@ export default {
     reset() {
       this.form = {
         #foreach ($column in $columns)
-        #if($column.htmlType == "checkbox")
+        #if ($column.createOperation || $column.updateOperation)
+        #if ($column.htmlType == "checkbox")
         $column.javaField: [],
         #else
         $column.javaField: undefined,
         #end
         #end
+        #end
       };
       this.resetForm("form");
     },
@@ -294,11 +300,13 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       #foreach ($column in $columns)
+      #if ($column.listOperation)
       #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
       #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
       this.dateRange${AttrName} = [];
       #end
       #end
+      #end
       this.resetForm("queryForm");
       this.handleQuery();
     },
@@ -372,11 +380,13 @@ export default {
       params.pageNo = undefined;
       params.pageSize = undefined;
       #foreach ($column in $columns)
+      #if ($column.listOperation)
       #if ($column.htmlType == "datetime" && $column.listOperationCondition == "BETWEEN")
       #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
       this.addBeginAndEndTime(params, this.dateRange${AttrName}, '${column.javaField}');
       #end
       #end
+      #end
       // 执行导出
       this.$confirm('是否确认导出所有${table.classComment}数据项?', "警告", {
           confirmButtonText: "确定",