Merge branch 'master' into net6.0

This commit is contained in:
不做码农 2022-04-04 08:27:47 +08:00
commit 8fd6bba2d1
29 changed files with 1468 additions and 208 deletions

View File

@ -0,0 +1,167 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Enums;
using Infrastructure.Model;
using Mapster;
using ZR.Model.Dto;
using ZR.Model.Models;
using ZR.Service.Business.IBusinessService;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Common;
using Infrastructure.Extensions;
using System.Linq;
namespace ZR.Admin.WebApi.Controllers
{
/// <summary>
/// 演示Controller
///
/// @author zz
/// @date 2022-03-31
/// </summary>
[Verify]
[Route("business/GenDemo")]
public class GenDemoController : BaseController
{
/// <summary>
/// 演示接口
/// </summary>
private readonly IGenDemoService _GenDemoService;
public GenDemoController(IGenDemoService GenDemoService)
{
_GenDemoService = GenDemoService;
}
/// <summary>
/// 查询演示列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "business:gendemo:list")]
public IActionResult QueryGenDemo([FromQuery] GenDemoQueryDto parm)
{
var response = _GenDemoService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询演示详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "business:gendemo:query")]
public IActionResult GetGenDemo(int Id)
{
var response = _GenDemoService.GetFirst(x => x.Id == Id);
return SUCCESS(response);
}
/// <summary>
/// 添加演示
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "business:gendemo:add")]
[Log(Title = "演示", BusinessType = BusinessType.INSERT)]
public IActionResult AddGenDemo([FromBody] GenDemoDto parm)
{
if (parm == null)
{
throw new CustomException("请求参数错误");
}
//从 Dto 映射到 实体
var modal = parm.Adapt<GenDemo>().ToCreate(HttpContext);
var response = _GenDemoService.Insert(modal, it => new
{
it.Name,
it.Icon,
it.ShowStatus,
it.Sex,
it.Sort,
it.Remark,
it.BeginTime,
it.EndTime,
it.Feature,
});
return ToResponse(response);
}
/// <summary>
/// 更新演示
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "business:gendemo:edit")]
[Log(Title = "演示", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateGenDemo([FromBody] GenDemoDto parm)
{
if (parm == null)
{
throw new CustomException("请求实体不能为空");
}
//从 Dto 映射到 实体
var modal = parm.Adapt<GenDemo>().ToUpdate(HttpContext);
var response = _GenDemoService.Update(w => w.Id == modal.Id, it => new GenDemo()
{
//Update 字段映射
Name = modal.Name,
Icon = modal.Icon,
ShowStatus = modal.ShowStatus,
Sex = modal.Sex,
Sort = modal.Sort,
Remark = modal.Remark,
BeginTime = modal.BeginTime,
EndTime = modal.EndTime,
Feature = modal.Feature,
});
return ToResponse(response);
}
/// <summary>
/// 删除演示
/// </summary>
/// <returns></returns>
[HttpDelete("{ids}")]
[ActionPermissionFilter(Permission = "business:gendemo:delete")]
[Log(Title = "演示", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteGenDemo(string ids)
{
int[] idsArr = Tools.SpitIntArrary(ids);
if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); }
var response = _GenDemoService.Delete(idsArr);
return ToResponse(response);
}
/// <summary>
/// 导出演示
/// </summary>
/// <returns></returns>
[Log(Title = "演示", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "business:gendemo:export")]
public IActionResult Export([FromQuery] GenDemoQueryDto parm)
{
parm.PageSize = 10000;
var list = _GenDemoService.GetList(parm).Result;
string sFileName = ExportExcel(list, "GenDemo", "演示");
return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName });
}
}
}

View File

@ -139,7 +139,7 @@ namespace ZR.Admin.WebApi.Controllers
return SUCCESS(new return SUCCESS(new
{ {
url = file.AccessUrl, url = file.AccessUrl,
fileName, fileName = file.FileName,
fileId = file.Id.ToString() fileId = file.Id.ToString()
}); });
} }

View File

@ -9,6 +9,7 @@ using Infrastructure.Attribute;
using Infrastructure.Enums; using Infrastructure.Enums;
using Infrastructure; using Infrastructure;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.Common;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {
@ -106,9 +107,10 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpDelete("{id}")] [HttpDelete("{id}")]
[ActionPermissionFilter(Permission = "system:post:remove")] [ActionPermissionFilter(Permission = "system:post:remove")]
[Log(Title = "岗位删除", BusinessType = BusinessType.DELETE)] [Log(Title = "岗位删除", BusinessType = BusinessType.DELETE)]
public IActionResult Delete(int id = 0) public IActionResult Delete(string id)
{ {
return ToResponse(ToJson(PostService.Delete(id))); int[] ids = Tools.SpitIntArrary(id);
return ToResponse(ToJson(PostService.Delete(ids)));
} }
/// <summary> /// <summary>

View File

@ -15,6 +15,8 @@ using ZR.Common;
using ZR.Model.System.Dto; using ZR.Model.System.Dto;
using ZR.Model.System; using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using Infrastructure.Extensions;
using System.Threading.Tasks;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {
@ -27,6 +29,7 @@ namespace ZR.Admin.WebApi.Controllers.System
private readonly ISysRoleService RoleService; private readonly ISysRoleService RoleService;
private readonly ISysUserPostService UserPostService; private readonly ISysUserPostService UserPostService;
private readonly ISysDeptService DeptService; private readonly ISysDeptService DeptService;
private readonly ISysFileService FileService;
private OptionsSetting OptionsSetting; private OptionsSetting OptionsSetting;
private IWebHostEnvironment hostEnvironment; private IWebHostEnvironment hostEnvironment;
@ -35,6 +38,7 @@ namespace ZR.Admin.WebApi.Controllers.System
ISysRoleService roleService, ISysRoleService roleService,
ISysUserPostService postService, ISysUserPostService postService,
ISysDeptService deptService, ISysDeptService deptService,
ISysFileService sysFileService,
IOptions<OptionsSetting> options, IOptions<OptionsSetting> options,
IWebHostEnvironment hostEnvironment) IWebHostEnvironment hostEnvironment)
{ {
@ -42,6 +46,7 @@ namespace ZR.Admin.WebApi.Controllers.System
RoleService = roleService; RoleService = roleService;
UserPostService = postService; UserPostService = postService;
DeptService = deptService; DeptService = deptService;
FileService = sysFileService;
OptionsSetting = options.Value; OptionsSetting = options.Value;
this.hostEnvironment = hostEnvironment; this.hostEnvironment = hostEnvironment;
} }
@ -124,28 +129,17 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpPost("Avatar")] [HttpPost("Avatar")]
[ActionPermissionFilter(Permission = "common")] [ActionPermissionFilter(Permission = "common")]
[Log(Title = "修改头像", BusinessType = BusinessType.UPDATE, IsSaveRequestData = false)] [Log(Title = "修改头像", BusinessType = BusinessType.UPDATE, IsSaveRequestData = false)]
public IActionResult Avatar([FromForm(Name = "picture")] IFormFile formFile) public async Task<IActionResult> Avatar([FromForm(Name = "picture")] IFormFile formFile)
{ {
LoginUser loginUser = Framework.JwtUtil.GetLoginUser(HttpContext); LoginUser loginUser = Framework.JwtUtil.GetLoginUser(HttpContext);
if (formFile == null) throw new CustomException("请选择文件"); if (formFile == null) throw new CustomException("请选择文件");
string fileExt = Path.GetExtension(formFile.FileName); string fileExt = Path.GetExtension(formFile.FileName);
string savePath = Path.Combine(hostEnvironment.WebRootPath, FileUtil.GetdirPath("uploads")); string fileName = FileUtil.HashFileName() + (fileExt.IsEmpty() ? ".png" : fileExt);
SysFile file = await FileService.SaveFileToLocal(hostEnvironment.WebRootPath, fileName, "", HttpContext.GetName(), formFile);
if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } UserService.UpdatePhoto(new SysUser() { Avatar = file.AccessUrl, UserId = loginUser.UserId });
return SUCCESS(new { imgUrl = file.AccessUrl });
string fileName = FileUtil.HashFileName() + fileExt;
string finalFilePath = savePath + fileName;
using (var stream = new FileStream(finalFilePath, FileMode.Create))
{
formFile.CopyTo(stream);
}
string accessUrl = $"{OptionsSetting.Upload.UploadUrl}/{FileUtil.GetdirPath("uploads")}{fileName}";
UserService.UpdatePhoto(new SysUser() { Avatar = accessUrl, UserId = loginUser.UserId });
return SUCCESS(new { imgUrl = accessUrl });
} }
} }
} }

View File

@ -15,6 +15,7 @@ using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.Tasks; using ZR.Tasks;
using Snowflake.Core; using Snowflake.Core;
using Infrastructure.Extensions;
namespace ZR.Admin.WebApi.Controllers namespace ZR.Admin.WebApi.Controllers
{ {
@ -62,14 +63,14 @@ namespace ZR.Admin.WebApi.Controllers
/// </summary> /// </summary>
/// <param name="id">编码</param> /// <param name="id">编码</param>
/// <returns></returns> /// <returns></returns>
[HttpGet("{id}")] [HttpGet("get")]
public IActionResult Get(string id) public IActionResult Get(string id)
{ {
if (!string.IsNullOrEmpty(id)) if (!string.IsNullOrEmpty(id))
{ {
return SUCCESS(_tasksQzService.GetId(id)); return SUCCESS(_tasksQzService.GetId(id));
} }
return SUCCESS(_tasksQzService.GetAll()); return SUCCESS(null);
} }
/// <summary> /// <summary>
@ -90,7 +91,10 @@ namespace ZR.Admin.WebApi.Controllers
{ {
throw new CustomException($"cron表达式不正确"); throw new CustomException($"cron表达式不正确");
} }
if (string.IsNullOrEmpty(parm.ApiUrl) && parm.TaskType == 2)
{
throw new CustomException($"地址不能为空");
}
//从 Dto 映射到 实体 //从 Dto 映射到 实体
var tasksQz = parm.Adapt<SysTasksQz>().ToCreate(); var tasksQz = parm.Adapt<SysTasksQz>().ToCreate();
var worker = new IdWorker(1, 1); var worker = new IdWorker(1, 1);
@ -98,7 +102,13 @@ namespace ZR.Admin.WebApi.Controllers
tasksQz.ID = worker.NextId().ToString(); tasksQz.ID = worker.NextId().ToString();
tasksQz.IsStart = false; tasksQz.IsStart = false;
tasksQz.Create_by = HttpContext.GetName(); tasksQz.Create_by = HttpContext.GetName();
tasksQz.TaskType = parm.TaskType;
tasksQz.ApiUrl = parm.ApiUrl;
if (parm.ApiUrl.IfNotEmpty() && parm.TaskType == 2)
{
tasksQz.AssemblyName = "ZR.Tasks";
tasksQz.ClassName = "TaskScheduler.HttpResultfulJob";
}
return SUCCESS(_tasksQzService.Add(tasksQz)); return SUCCESS(_tasksQzService.Add(tasksQz));
} }
@ -125,7 +135,15 @@ namespace ZR.Admin.WebApi.Controllers
throw new CustomException($"cron表达式不正确"); throw new CustomException($"cron表达式不正确");
} }
var tasksQz = _tasksQzService.GetFirst(m => m.ID == parm.ID); var tasksQz = _tasksQzService.GetFirst(m => m.ID == parm.ID);
if (string.IsNullOrEmpty(parm.ApiUrl) && parm.TaskType == 2)
{
throw new CustomException($"api地址不能为空");
}
if (parm.ApiUrl.IfNotEmpty() && parm.TaskType == 2)
{
parm.AssemblyName = "ZR.Tasks";
parm.ClassName = "TaskScheduler.HttpResultfulJob";
}
if (tasksQz.IsStart) if (tasksQz.IsStart)
{ {
throw new CustomException($"该任务正在运行中,请先停止在更新"); throw new CustomException($"该任务正在运行中,请先停止在更新");
@ -142,10 +160,12 @@ namespace ZR.Admin.WebApi.Controllers
TriggerType = parm.TriggerType, TriggerType = parm.TriggerType,
IntervalSecond = parm.IntervalSecond, IntervalSecond = parm.IntervalSecond,
JobParams = parm.JobParams, JobParams = parm.JobParams,
Update_by = User.Identity.Name, Update_by = HttpContextExtension.GetName(HttpContext),
Update_time = DateTime.Now, Update_time = DateTime.Now,
BeginTime = parm.BeginTime, BeginTime = parm.BeginTime,
EndTime = parm.EndTime EndTime = parm.EndTime,
TaskType = parm.TaskType,
ApiUrl = parm.ApiUrl,
}); });
if (response > 0) if (response > 0)
{ {

View File

@ -0,0 +1,21 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
#创建 /app文件夹
WORKDIR /app
#创建挂载目录,用于将程序部署在服务器本地
#VOLUME /app
#设置docker容器对外暴露端口
EXPOSE 8888
VOLUME /app/logs
#COPY bin/Release/net5.0/publish/ app/
COPY . app/
#设置容器内的时区如果不设置默认时区是标准时间比北京时间晚8个小时
RUN echo "Asia/shanghai" > /etc/timezone
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 复制发布文件到工作目录
#COPY . app/
WORKDIR /app
#等价于 dotnet ZR.Admin.WebApi.dll如果不指定启动端口默认在docker里面启动端口是80端口
ENTRYPOINT ["dotnet", "ZR.Admin.WebApi.dll", "--server.urls","http://*:8888"]

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>False</DeleteExistingFiles>
<ExcludeApp_Data>False</ExcludeApp_Data>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,552 @@
<template>
<div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch"
@submit.prevent>
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(columnName = "")
$set(numLabel = "")
$if(column.IsQuery == true)
$set(columnName = column.CsharpFieldFl)
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.CsharpType == "int" || column.CsharpType == "long")
$set(numLabel = ".number")
$end
$if(column.HtmlType == "datetime")
<el-form-item label="$labelName">
<el-date-picker v-model="dateRange${column.CsharpField}" style="width: 240px" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" placeholder="请选择$labelName" :picker-options="{ firstDayOfWeek: 1}"></el-date-picker>
</el-form-item>
$elseif(column.HtmlType == "select" || column.HtmlType == "radio")
<el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
$else
<el-form-item label="${labelName}" prop="${columnName}">
<el-input v-model${numLabel}="queryParams.${columnName}" placeholder="请输入${labelName}" />
</el-form-item>
$end
$end
$end
<el-form-item>
<el-button icon="search" size="small" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" size="small" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 工具区域 -->
<el-row :gutter="10" class="mb8">
$if(replaceDto.ShowBtnAdd)
<el-col :span="1.5">
<el-button type="primary" size="small" v-hasPermi="['${replaceDto.PermissionPrefix}:add']" plain icon="plus" @click="handleAdd">新增</el-button>
</el-col>
$end
$if(replaceDto.ShowBtnEdit)
<el-col :span="1.5">
<el-button type="success" size="small" :disabled="single" v-hasPermi="['${replaceDto.PermissionPrefix}:edit']" plain icon="edit" @click="handleUpdate">修改</el-button>
</el-col>
$end
$if(replaceDto.ShowBtnDelete)
<el-col :span="1.5">
<el-button type="danger" size="small" :disabled="multiple" v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" plain icon="delete" @click="handleDelete">删除</el-button>
</el-col>
$end
$if(replaceDto.ShowBtnExport)
<el-col :span="1.5">
<el-button type="warning" size="small" plain icon="download" @click="handleExport" v-hasPermi="['${replaceDto.PermissionPrefix}:export']">导出</el-button>
</el-col>
$end
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 数据区域 -->
<el-table :data="dataList" v-loading="loading" ref="table" border highlight-current-row @sort-change="sortChange" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center"/>
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(checkboxHtml = "")
$set(showToolTipHtml = "")
$set(columnName = column.CsharpFieldFl)
$if(column.CsharpType == "string" || column.HtmlType == "datetime")
$set(showToolTipHtml = " :show-overflow-tooltip=\"true\"")
$end
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.IsList == true)
$if(column.HtmlType == "customInput" && column.IsPk == false)
<el-table-column prop="${columnName}" label="${labelName}" width="90" sortable align="center">
<template #default="scope">
<span v-show="editIndex != scope.${index}index" @click="editCurrRow(scope.${index}index,'rowkeY')">{{scope.row.${columnName}}}</span>
<el-input :id="scope.${index}index+'rowkeY'" size="mini" v-show="(editIndex == scope.${index}index)"
v-model="scope.row.${columnName}" @blur="handleChangeSort(scope.row)"></el-input>
</template>
</el-table-column>
$elseif(column.HtmlType == "imageUpload")
<el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope">
<el-image class="table-td-thumb" fit="contain" :src="scope.row.${columnName}" :preview-src-list="[scope.row.${columnName}]">
<div><i class="el-icon-document" /></div>
</el-image>
</template>
</el-table-column>
$elseif(column.HtmlType == "checkbox" || column.HtmlType == "select" || column.HtmlType == "radio")
<el-table-column prop="${columnName}" label="${labelName}" align="center">
<template #default="scope">
$if(column.HtmlType == "checkbox")
<dict-tag :options="${columnName}Options" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" />
$else
<dict-tag :options="${columnName}Options" :value="scope.row.${columnName}" />
$end
</template>
</el-table-column>
$else
<el-table-column prop="${columnName}" label="${labelName}" align="center"${showToolTipHtml} />
$end
$end
$end
<el-table-column label="操作" align="center" width="140">
<template #default="scope">
$if(replaceDto.ShowBtnEdit)
<el-button v-hasPermi="['${replaceDto.PermissionPrefix}:edit']" type="success" icon="edit" title="编辑"
@click="handleUpdate(scope.row)"></el-button>
$end
$if(replaceDto.ShowBtnDelete)
<el-button v-hasPermi="['${replaceDto.PermissionPrefix}:delete']" type="danger" icon="delete" title="删除"
@click="handleDelete(scope.row)"></el-button>
$end
</template>
</el-table-column>
</el-table>
<pagination class="mt10" background :total="total" :page="queryParams.pageNum" :limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改${genTable.functionName}对话框 -->
<el-dialog :title="title" :lock-scroll="false" v-model="open" >
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row :gutter="20">
$foreach(column in genTable.Columns)
$set(labelName = "")
$set(labelDisabled = "")
$set(columnName = column.CsharpFieldFl)
$set(value = "item.dictValue")
$if(column.ColumnComment != "")
$set(labelName = column.ColumnComment)
$else
$set(labelName = column.CsharpFieldFl)
$end
$if(column.IsPk == true)
$set(labelDisabled = ":disabled=true")
$end
$if(column.CsharpType == "int" || column.CsharpType == "long")
$set(value = "parseInt(item.dictValue)")
$end
$if(column.IsInsert == false && column.IsEdit == false)
<el-col :lg="12" v-if="opertype == 2">
<el-form-item label="${labelName}">{{form.${columnName}}}</el-form-item>
</el-col>
$elseif(column.IsPK || column.IsIncrement)
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
$if(column.IsIncrement == false)
<el-input-number v-model.number="form.${columnName}" controls-position="right" placeholder="请输入${labelName}" :disabled="title=='修改数据'"/>
$else
<span v-html="form.${columnName}"/>
$end
</el-form-item>
</el-col>
$else
$if(column.HtmlType == "inputNumber")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input-number v-model.number="form.${columnName}" controls-position="right" placeholder="请输入${labelName}" ${labelDisabled}/>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "datetime")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-date-picker v-model="form.${columnName}" type="datetime" placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "imageUpload")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<UploadImage v-model="form.${columnName}" column="${columnName}" @success="handleUploadSuccess" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "fileUpload")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<UploadFile v-model="form.${columnName}" column="${columnName}" @success="handleUploadSuccess" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "radio")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-radio-group v-model="form.${columnName}">
<el-radio v-for="item in ${columnName}Options" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "textarea")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input type="textarea" v-model="form.${columnName}" placeholder="请输入${labelName}"/>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "editor")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<editor v-model="form.${columnName}" :min-height="200" />
</el-form-item>
</el-col>
$elseif(column.HtmlType == "select")
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="form.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option>
</el-select>
</el-form-item>
</el-col>
$elseif(column.HtmlType == "checkbox")
<el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}">
<el-checkbox-group v-model="form.${columnName}Checked">
<el-checkbox v-for="item in ${columnName}Options" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
$else
<el-col :lg="12">
<el-form-item label="${labelName}" prop="${columnName}">
<el-input v-model="form.${columnName}" placeholder="请输入${labelName}" ${labelDisabled}/>
</el-form-item>
</el-col>
$end
$end
$end
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="text" @click="cancel">取 消</el-button>
<el-button type="primary" @click="submitForm">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import {
list${genTable.BusinessName},
add${genTable.BusinessName},
del${genTable.BusinessName},
update${genTable.BusinessName},
get${genTable.BusinessName},
$if(replaceDto.ShowBtnExport)
export${genTable.BusinessName},
$end
$if(showCustomInput)
changeSort
$end
} from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${tool.FirstLowerCase(genTable.BusinessName)}.js';
import { reactive, ref, toRefs, getCurrentInstance } from "vue";
export default {
name: "${genTable.BusinessName.ToLower()}",
setup() {
const { proxy } = getCurrentInstance();
// 选中${replaceDto.FistLowerPk}数组数组
const ids = ref([]);
// 非单选禁用
const single = ref(true);
// 非多个禁用
const multiple = ref(true);
// 遮罩层
const loading = ref(false);
// 显示搜索条件
const showSearch = ref(true);
// 查询参数
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
sort: undefined,
sortType: undefined,
$foreach(item in genTable.Columns)
$if(item.IsQuery == true)
${item.CsharpFieldFl}: undefined,
$end
$end
});
// 弹出层标题
const title = ref("");
// 操作类型 1、add 2、edit
const opertype = ref(0);
// 是否显示弹出层
const open = ref(false);
// 表单参数
const data = reactive({
form: {},
});
const { form } = toRefs(data);
// 总记录数
const total = ref(0);
const dataList = ref([]);
const queryRef = ref(null);
const formRef = ref(null);
$foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox"))
// ${item.ColumnComment}选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
const ${item.CsharpFieldFl}Options = ref([]);
$elseif(item.HtmlType == "datetime" && item.IsQuery == true)
//${item.ColumnComment}时间范围
const dateRange${item.CsharpField} = ref([]);
$elseif(item.HtmlType == "customInput")
const editIndex = ref(-1);
$end
$end
$set(index = 0)
var dictParams = [
$foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox") && item.DictType != "")
{ dictType: "${item.DictType}", columnName: "${item.CsharpFieldFl}Options" },
$set(index = index + 1)
$end
$end
];
$if(index > 0)
proxy.getDicts(dictParams).then((response) => {
response.data.forEach((element) => {
proxy[element.columnName] = element.list;
});
});
$end
// 表单规则校验
const rules = reactive({
$foreach(column in genTable.Columns)
$if(column.IsRequired && column.IsIncrement == false)
${column.CsharpFieldFl}: [
{ required: true, message: "${column.ColumnComment}不能为空", trigger: $if(column.htmlType == "select")"change"$else"blur"$end
$if(column.CsharpType == "int" || column.CsharpType == "long"), type: "number"$end }
],
$end
$end
});
function getList(){
$foreach(item in genTable.Columns)
$if(item.HtmlType == "datetime" && item.IsQuery == true)
proxy.addDateRange(queryParams, proxy.dateRange${item.CsharpField}, '${item.CsharpField}');
$end
$end
loading.value = true;
list${genTable.BusinessName}(queryParams).then(res => {
if (res.code == 200) {
dataList.value = res.data.result;
total.value = res.data.totalNum;
loading.value = false;
}
})
}
function cancel(){
open.value = false;
reset();
}
// 重置表单
function reset() {
proxy.resetForm("formRef");
}
// 查询
function handleQuery() {
queryParams.pageNum = 1;
getList();
}
// 添加
function handleAdd() {
reset();
open.value = true;
title.value = '添加';
opertype.value = 1;
}
// 删除按钮操作
function handleDelete(row) {
const Ids = row.${replaceDto.FistLowerPk} || ids.value;
proxy.${confirm}confirm('是否确认删除参数编号为"' + Ids + '"的数据项?')
.then(function () {
//return del${genTable.BusinessName}(Ids);
})
.then(() => {
handleQuery();
proxy.${modal}modal.msgSuccess("删除成功");
})
.catch(() => {});
}
// 修改按钮操作
function handleUpdate(row) {
reset();
const id = row.${replaceDto.FistLowerPk} || ids.value;
get${genTable.BusinessName}(id).then((res) => {
const { code, data } = res;
if (code == 200) {
open.value = true;
title.value = "修改数据";
opertype.value = 2;
form.value = {
...data,
$foreach(item in genTable.Columns)
$if(item.HtmlType == "checkbox")
${item.CsharpFieldFl}Checked: data.${item.CsharpFieldFl} ? data.${item.CsharpFieldFl}.split(',') : [],
$end
$end
};
}
});
}
// 表单提交
function submitForm() {
proxy.${refs}refs["formRef"].validate((valid) => {
if (valid) {
if (form.value.${replaceDto.FistLowerPk} != undefined && opertype.value === 2) {
update${genTable.BusinessName}(form.value)
.then((res) => {
proxy.${modal}modal.msgSuccess("修改成功");
open.value = false;
getList();
})
.catch((err) => {
//TODO 错误逻辑
});
} else {
add${genTable.BusinessName}(form.value)
.then((res) => {
proxy.${modal}modal.msgSuccess("新增成功");
open.value = false;
getList();
})
.catch((err) => {
//TODO 错误逻辑
});
}
}
});
}
// 重置查询操作
function resetQuery(){
$foreach(item in genTable.Columns)
$if(item.HtmlType == "datetime" && item.IsQuery == true)
//${item.ColumnComment}时间范围
dateRange${item.CsharpField}.value = [];
$end
$end
proxy.resetForm("queryRef");
handleQuery();
}
$if(replaceDto.ShowBtnExport)
// 导出按钮操作
function handleExport() {
proxy.${confirm}confirm("是否确认导出所有${genTable.functionName}数据项?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(function () {
return export${genTable.BusinessName}(queryParams);
})
.then((response) => {
proxy.download(response.data.path);
});
}
$end
// 多选框选中数据
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.${replaceDto.FistLowerPk});
single.value = selection.length != 1
multiple.value = !selection.length;
}
// 自定义排序
function sortChange(column) {
if (column.prop == null || column.order == null) {
queryParams.sort = undefined;
queryParams.sortType = undefined;
} else {
queryParams.sort = column.prop;
queryParams.sortType = column.order;
}
handleQuery();
}
$if(replaceDto.UploadFile == 1)
//图片上传成功方法
function handleUploadSuccess(column, filelist) {
form[column] = filelist;
}
$end
return {
single,
multiple,
loading,
showSearch,
queryParams,
total,
rules,
title,
opertype,
open,
form,
dataList,
$foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox"))
${item.CsharpFieldFl}Options,
$elseif(item.HtmlType == "datetime" && item.IsQuery == true)
dateRange${item.CsharpField},
$elseif(item.HtmlType == "customInput")
editIndex,
$end
$end
handleQuery,
handleAdd,
submitForm,
$if(replaceDto.ShowBtnExport)
handleExport,
$end
resetQuery,
handleDelete,
handleUpdate,
reset,
cancel,
queryRef,
formRef,
sortChange,
getList,
handleSelectionChange,
$if(replaceDto.UploadFile == 1)
handleUploadSuccess,
$end
};
},
};
</script>

View File

@ -34,26 +34,23 @@ namespace ZR.CodeGenerator
sb.AppendLine(" <el-col :lg=\"12\" v-if=\"opertype == 2\">"); sb.AppendLine(" <el-col :lg=\"12\" v-if=\"opertype == 2\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\">{{{{form.{columnName}}}}}</el-form-item>"); sb.AppendLine($" <el-form-item label=\"{labelName}\">{{{{form.{columnName}}}}}</el-form-item>");
sb.AppendLine(" </el-col>"); sb.AppendLine(" </el-col>");
return sb.ToString();
} }
else if (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable.TreeParentCode != null && dbFieldInfo.CsharpField.Equals(genTable.TreeParentCode))
//树
if (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable.TreeParentCode != null && dbFieldInfo.CsharpField.Equals(genTable.TreeParentCode))
{ {
//树
sb.AppendLine(@" <el-col :lg=""24"">"); sb.AppendLine(@" <el-col :lg=""24"">");
sb.AppendLine($@" <el-form-item label=""父级id"" prop=""{columnName}"">"); sb.AppendLine($@" <el-form-item label=""父级id"" prop=""{columnName}"">");
sb.AppendLine($@" <treeselect v-model=""form.{columnName}"" :options=""dataList"" :normalizer=""normalizer"" :show-count=""true"" placeholder=""选择上级菜单"" />"); sb.AppendLine($@" <treeselect v-model=""form.{columnName}"" :options=""dataList"" :normalizer=""normalizer"" :show-count=""true"" placeholder=""选择上级菜单"" />");
sb.AppendLine(@" </el-form-item>"); sb.AppendLine(@" </el-form-item>");
sb.AppendLine(@" </el-col>"); sb.AppendLine(@" </el-col>");
return sb.ToString();
} }
//主键、非自增要插入,不能编辑 //主键、非自增要插入,不能编辑
if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement) else if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement)
{ {
sb.AppendLine(" <el-col :lg=\"12\">"); sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">"); sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
//主键非自增 显示input //主键非自增 显示input
if (dbFieldInfo.IsPk && !dbFieldInfo.IsIncrement) if (!dbFieldInfo.IsIncrement)
{ {
sb.AppendLine($" <el-input-number v-model.number=\"form.{columnName}\" controls-position=\"right\" placeholder=\"请输入{labelName}\" :disabled=\"title=='修改数据'\"/>"); sb.AppendLine($" <el-input-number v-model.number=\"form.{columnName}\" controls-position=\"right\" placeholder=\"请输入{labelName}\" :disabled=\"title=='修改数据'\"/>");
} }
@ -64,105 +61,106 @@ namespace ZR.CodeGenerator
sb.AppendLine(" </el-form-item>"); sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>"); sb.AppendLine(" </el-col>");
return sb.ToString();
}
if (dbFieldInfo.HtmlType == GenConstants.HTML_INPUT_NUMBER)
{
//数字框
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-input-number v-model.number=\"form.{columnName}\" controls-position=\"right\" placeholder=\"请输入{labelName}\" {labelDisabled}/>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_DATETIME)
{
//时间
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-date-picker v-model=\"form.{columnName}\" format=\"yyyy-MM-dd HH:mm:ss\" value-format=\"yyyy-MM-dd HH:mm:ss\" type=\"datetime\" placeholder=\"选择日期时间\"> </el-date-picker>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_IMAGE_UPLOAD)
{
//图片
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($@" <UploadImage v-model=""form.{columnName}"" :data=""{{ 'storeType' : 1}}"" column=""{columnName}"" @input=""handleUploadSuccess"" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_FILE_UPLOAD)
{
//文件
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($@" <UploadFile v-model=""form.{columnName}"" column=""{columnName}"" @input=""handleUploadSuccess"" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_RADIO)
{
//单选按钮
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-radio-group v-model=\"form.{columnName}\">");
sb.AppendLine($" <el-radio v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"{value}\">{{{{item.dictLabel}}}}</el-radio>");
sb.AppendLine(" </el-radio-group>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_TEXTAREA)
{
//文本域
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{ labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-input type=\"textarea\" v-model=\"form.{columnName}\" placeholder=\"请输入{labelName}\"/>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_EDITOR)
{
//编辑器
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <editor v-model=\"form.{columnName}\" :min-height=\"200\" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT)
{
//下拉框
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-select v-model=\"form.{columnName}\" placeholder=\"请选择{labelName}\"> ");
sb.AppendLine($" <el-option v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"{value}\"></el-option>");
sb.AppendLine(" </el-select>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_CHECKBOX)
{
//多选框
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-checkbox-group v-model=\"form.{columnName}Checked\"> ");
sb.AppendLine($" <el-checkbox v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"item.dictValue\">{{{{item.dictLabel}}}}</el-checkbox>");
sb.AppendLine(" </el-checkbox-group>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
} }
else else
{ {
string inputNumTxt = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? ".number" : ""; if (dbFieldInfo.HtmlType == GenConstants.HTML_INPUT_NUMBER)
sb.AppendLine(" <el-col :lg=\"12\">"); {
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">"); //数字框
sb.AppendLine($" <el-input v-model{inputNumTxt}=\"form.{columnName}\" placeholder=\"请输入{labelName}\" {labelDisabled}/>"); sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine(" </el-form-item>"); sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine(" </el-col>"); sb.AppendLine($" <el-input-number v-model.number=\"form.{columnName}\" controls-position=\"right\" placeholder=\"请输入{labelName}\" {labelDisabled}/>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_DATETIME)
{
//时间
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-date-picker v-model=\"form.{columnName}\" format=\"yyyy-MM-dd HH:mm:ss\" value-format=\"yyyy-MM-dd HH:mm:ss\" type=\"datetime\" placeholder=\"选择日期时间\"> </el-date-picker>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_IMAGE_UPLOAD)
{
//图片
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($@" <UploadImage v-model=""form.{columnName}"" column=""{columnName}"" @input=""handleUploadSuccess"" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_FILE_UPLOAD)
{
//文件
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($@" <UploadFile v-model=""form.{columnName}"" column=""{columnName}"" @input=""handleUploadSuccess"" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_RADIO)
{
//单选按钮
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-radio-group v-model=\"form.{columnName}\">");
sb.AppendLine($" <el-radio v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"{value}\">{{{{item.dictLabel}}}}</el-radio>");
sb.AppendLine(" </el-radio-group>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_TEXTAREA)
{
//文本域
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{ labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-input type=\"textarea\" v-model=\"form.{columnName}\" placeholder=\"请输入{labelName}\"/>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_EDITOR)
{
//编辑器
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <editor v-model=\"form.{columnName}\" :min-height=\"200\" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT)
{
//下拉框
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-select v-model=\"form.{columnName}\" placeholder=\"请选择{labelName}\"> ");
sb.AppendLine($" <el-option v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"{value}\"></el-option>");
sb.AppendLine(" </el-select>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else if (dbFieldInfo.HtmlType == GenConstants.HTML_CHECKBOX)
{
//多选框
sb.AppendLine(" <el-col :lg=\"24\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-checkbox-group v-model=\"form.{columnName}Checked\"> ");
sb.AppendLine($" <el-checkbox v-for=\"item in {columnName}Options\" :key=\"item.dictValue\" :label=\"item.dictValue\">{{{{item.dictLabel}}}}</el-checkbox>");
sb.AppendLine(" </el-checkbox-group>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
else
{
string inputNumTxt = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? ".number" : "";
sb.AppendLine(" <el-col :lg=\"12\">");
sb.AppendLine($" <el-form-item label=\"{labelName}\" prop=\"{columnName}\">");
sb.AppendLine($" <el-input v-model{inputNumTxt}=\"form.{columnName}\" placeholder=\"请输入{labelName}\" {labelDisabled}/>");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
} }
return sb.ToString(); return sb.ToString();
} }

View File

@ -85,6 +85,7 @@ namespace ZR.CodeGenerator
GenerateService(replaceDto, dto); GenerateService(replaceDto, dto);
GenerateControllers(replaceDto, dto); GenerateControllers(replaceDto, dto);
GenerateVueViews(replaceDto, dto); GenerateVueViews(replaceDto, dto);
GenerateVue3Views(replaceDto, dto);
GenerateVueJs(replaceDto, dto); GenerateVueJs(replaceDto, dto);
GenerateSql(replaceDto, dto); GenerateSql(replaceDto, dto);
@ -201,7 +202,41 @@ namespace ZR.CodeGenerator
generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result)); generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result));
} }
/// <summary>
/// vue3
/// </summary>
/// <param name="replaceDto"></param>
/// <param name="generateDto"></param>
private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto)
{
string fileName = string.Empty;
switch (generateDto.GenTable.TplCategory)
{
//case "tree":
// fileName = "TplTreeVue.txt";
// break;
case "crud":
fileName = "Vue.txt";
break;
//case "select":
// fileName = "TplVueSelect.txt";
// break;
default:
fileName = "Vue.txt";
break;
}
fileName = Path.Combine("v3", fileName);
var tpl = FileHelper.ReadJtTemplate(fileName);
//tpl.Set("vueQueryFormHtml", replaceDto.VueQueryFormHtml);
//tpl.Set("VueViewEditFormRuleContent", replaceDto.VueViewEditFormRuleContent);//添加、修改表单验证规则
//tpl.Set("VueViewFormContent", replaceDto.VueViewFormHtml);//添加、修改表单
//tpl.Set("VueViewListContent", replaceDto.VueViewListHtml);//查询 table列
var result = tpl.Render();
var fullPath = generateDto.IsPreview ? string.Empty : Path.Combine(generateDto.GenCodePath, "ZR.Vue3", "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue");
//Console.WriteLine(result);
generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result));
}
/// <summary> /// <summary>
/// 生成vue页面api /// 生成vue页面api
/// </summary> /// </summary>
@ -478,6 +513,7 @@ namespace ZR.CodeGenerator
options.OutMode = OutMode.Auto; options.OutMode = OutMode.Auto;
//options.DisableeLogogram = true;//禁用简写 //options.DisableeLogogram = true;//禁用简写
options.Data.Set("refs", "$");//特殊标签替换 options.Data.Set("refs", "$");//特殊标签替换
options.Data.Set("modal", "$");//特殊标签替换
options.Data.Set("index", "$");//特殊标签替换 options.Data.Set("index", "$");//特殊标签替换
options.Data.Set("confirm", "$");//特殊标签替换 options.Data.Set("confirm", "$");//特殊标签替换
options.Data.Set("nextTick", "$"); options.Data.Set("nextTick", "$");

View File

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using ZR.Model.Dto;
using ZR.Model.Models;
namespace ZR.Model.Dto
{
/// <summary>
/// 演示输入对象
/// </summary>
public class GenDemoDto
{
[Required(ErrorMessage = "id不能为空")]
public int Id { get; set; }
[Required(ErrorMessage = "名称不能为空")]
public string Name { get; set; }
public string Icon { get; set; }
[Required(ErrorMessage = "显示状态不能为空")]
public int ShowStatus { get; set; }
public int? Sex { get; set; }
public int? Sort { get; set; }
public string Remark { get; set; }
public DateTime? BeginTime { get; set; }
public DateTime? EndTime { get; set; }
public string Feature { get; set; }
}
/// <summary>
/// 演示查询对象
/// </summary>
public class GenDemoQueryDto : PagerInfo
{
public int? Id { get; set; }
public string Name { get; set; }
public int? ShowStatus { get; set; }
public DateTime? BeginAddTime { get; set; }
public DateTime? EndAddTime { get; set; }
}
}

View File

@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using SqlSugar;
using OfficeOpenXml.Attributes;
namespace ZR.Model.Models
{
/// <summary>
/// 演示,数据实体对象
///
/// @author zz
/// @date 2022-03-31
/// </summary>
[SugarTable("gen_demo")]
public class GenDemo
{
/// <summary>
/// 描述 : id
/// 空值 : false
/// </summary>
[EpplusTableColumn(Header = "id")]
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 描述 : 名称
/// 空值 : false
/// </summary>
[EpplusTableColumn(Header = "名称")]
public string Name { get; set; }
/// <summary>
/// 描述 : 图片
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "图片")]
public string Icon { get; set; }
/// <summary>
/// 描述 : 显示状态
/// 空值 : false
/// </summary>
[EpplusTableColumn(Header = "显示状态")]
public int ShowStatus { get; set; }
/// <summary>
/// 描述 : 添加时间
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "添加时间", NumberFormat = "yyyy-MM-dd HH:mm:ss")]
public DateTime? AddTime { get; set; }
/// <summary>
/// 描述 : 用户性别
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "用户性别")]
public int? Sex { get; set; }
/// <summary>
/// 描述 : 排序
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "排序")]
public int? Sort { get; set; }
/// <summary>
/// 描述 : 备注
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "备注")]
public string Remark { get; set; }
/// <summary>
/// 描述 : 开始时间
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "开始时间", NumberFormat = "yyyy-MM-dd HH:mm:ss")]
public DateTime? BeginTime { get; set; }
/// <summary>
/// 描述 : 结束时间
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "结束时间", NumberFormat = "yyyy-MM-dd HH:mm:ss")]
public DateTime? EndTime { get; set; }
/// <summary>
/// 描述 : 特征
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "特征")]
public string Feature { get; set; }
/// <summary>
/// 描述 : 父级id
/// 空值 : true
/// </summary>
[EpplusTableColumn(Header = "父级id")]
public int? ParentId { get; set; }
}
}

View File

@ -112,6 +112,11 @@ namespace ZR.Model.System.Dto
/// </summary> /// </summary>
[Display(Name = "传入参数")] [Display(Name = "传入参数")]
public string JobParams { get; set; } public string JobParams { get; set; }
public string ApiUrl { get; set; }
/// <summary>
/// 1、程序集任务 2、apiUrl任务
/// </summary>
public int TaskType { get; set; }
} }
/// <summary> /// <summary>
@ -219,6 +224,10 @@ namespace ZR.Model.System.Dto
/// </summary> /// </summary>
[Display(Name = "传入参数")] [Display(Name = "传入参数")]
public string JobParams { get; set; } public string JobParams { get; set; }
public string ApiUrl { get; set; }
/// <summary>
/// 1、程序集任务 2、apiUrl任务
/// </summary>
public int TaskType { get; set; }
} }
} }

View File

@ -157,5 +157,13 @@ namespace ZR.Model.System
/// 最后运行时间 /// 最后运行时间
/// </summary> /// </summary>
public DateTime? LastRunTime { get; set; } public DateTime? LastRunTime { get; set; }
/// <summary>
/// api执行地址
/// </summary>
public string ApiUrl { get; set; }
/// <summary>
/// 任务类型 1程序集2网络请求
/// </summary>
public int TaskType { get; set; }
} }
} }

View File

@ -0,0 +1,20 @@
using System;
using Infrastructure.Attribute;
using ZR.Repository.System;
using ZR.Model.Models;
namespace ZR.Repository
{
/// <summary>
/// 演示仓储
///
/// @author zz
/// @date 2022-03-31
/// </summary>
[AppService(ServiceLifetime = LifeTime.Transient)]
public class GenDemoRepository : BaseRepository<GenDemo>
{
#region
#endregion
}
}

View File

@ -0,0 +1,56 @@
using Infrastructure;
using Infrastructure.Attribute;
using ZR.Model;
using ZR.Model.Dto;
using ZR.Model.Models;
using ZR.Repository;
using ZR.Service.Business.IBusinessService;
using System;
using SqlSugar;
using System.Collections.Generic;
namespace ZR.Service.Business
{
/// <summary>
/// 演示Service业务层处理
///
/// @author zz
/// @date 2022-03-31
/// </summary>
[AppService(ServiceType = typeof(IGenDemoService), ServiceLifetime = LifeTime.Transient)]
public class GenDemoService : BaseService<GenDemo>, IGenDemoService
{
private readonly GenDemoRepository _GenDemorepository;
public GenDemoService(GenDemoRepository repository)
{
_GenDemorepository = repository;
}
#region
/// <summary>
/// 查询演示列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<GenDemo> GetList(GenDemoQueryDto parm)
{
//开始拼装查询条件
var predicate = Expressionable.Create<GenDemo>();
//搜索条件查询语法参考Sqlsugar
predicate = predicate.AndIF(parm.Id != null, it => it.Id == parm.Id);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Name), it => it.Name == parm.Name);
predicate = predicate.AndIF(parm.ShowStatus != null, it => it.ShowStatus == parm.ShowStatus);
predicate = predicate.AndIF(parm.BeginAddTime == null, it => it.AddTime >= DateTime.Now.AddDays(-1));
predicate = predicate.AndIF(parm.BeginAddTime != null, it => it.AddTime >= parm.BeginAddTime && it.AddTime <= parm.EndAddTime);
var response = _GenDemorepository
.Queryable()
.Where(predicate.ToExpression())
.ToPage(parm);
return response;
}
#endregion
}
}

View File

@ -0,0 +1,20 @@
using System;
using ZR.Model;
using ZR.Model.Dto;
using ZR.Model.Models;
using System.Collections.Generic;
namespace ZR.Service.Business.IBusinessService
{
/// <summary>
/// 演示service接口
///
/// @author zz
/// @date 2022-03-31
/// </summary>
public interface IGenDemoService : IBaseService<GenDemo>
{
PagedInfo<GenDemo> GetList(GenDemoQueryDto parm);
}
}

View File

@ -7,7 +7,7 @@ namespace ZR.Tasks
{ {
public class JobFactory : IJobFactory public class JobFactory : IJobFactory
{ {
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
/// <summary> /// <summary>
/// 注入反射获取依赖对象 /// 注入反射获取依赖对象
@ -42,12 +42,10 @@ namespace ZR.Tasks
public void ReturnJob(IJob job) public void ReturnJob(IJob job)
{ {
var disposable = job as IDisposable; if (job is IDisposable disposable)
if (disposable != null)
{ {
disposable.Dispose(); disposable.Dispose();
} }
} }
} }
} }

View File

@ -0,0 +1,33 @@
using Infrastructure;
using Infrastructure.Attribute;
using Quartz;
using Quartz.Impl;
using Quartz.Impl.Triggers;
using System.Threading.Tasks;
using ZR.Service.System.IService;
namespace ZR.Tasks.TaskScheduler
{
[AppService(ServiceType = typeof(Job_HttpRequest), ServiceLifetime = LifeTime.Scoped)]
internal class Job_HttpRequest : JobBase, IJob
{
private readonly ISysTasksQzService tasksQzService;
public Job_HttpRequest(ISysTasksQzService tasksQzService)
{
this.tasksQzService = tasksQzService;
}
public async Task Execute(IJobExecutionContext context)
{
await ExecuteJob(context, async () => await Run(context));
}
public async Task Run(IJobExecutionContext context)
{
AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
var info = await tasksQzService.GetByIdAsync(trigger.Name);
var result = await HttpHelper.HttpPostAsync("http://" + info.ApiUrl, info.JobParams);
//Console.WriteLine(result);
}
}
}

View File

@ -0,0 +1,78 @@
import request from '@/utils/request'
/**
* 演示分页查询
* @param {查询条件} data
*/
export function listDemo(query) {
return request({
url: 'business/Demo/list',
method: 'get',
params: query,
})
}
/**
* 新增演示
* @param data
*/
export function addDemo(data) {
return request({
url: 'business/Demo',
method: 'post',
data: data,
})
}
/**
* 修改演示
* @param data
*/
export function updateDemo(data) {
return request({
url: 'business/Demo',
method: 'PUT',
data: data,
})
}
/**
* 获取演示详情
* @param {Id}
*/
export function getDemo(id) {
return request({
url: 'business/Demo/' + id,
method: 'get'
})
}
/**
* 删除演示
* @param {主键} pid
*/
export function delDemo(pid) {
return request({
url: 'business/Demo/' + pid,
method: 'delete'
})
}
// 导出演示
export function exportDemo(query) {
return request({
url: 'business/Demo/export',
method: 'get',
params: query
})
}
//排序
export function changeSort(data) {
return request({
url: 'business/Demo/ChangeSort',
method: 'get',
params: data
})
}

View File

@ -0,0 +1,70 @@
import request from '@/utils/request'
/**
* 演示分页查询
* @param {查询条件} data
*/
export function listGenDemo(query) {
return request({
url: 'business/GenDemo/list',
method: 'get',
params: query,
})
}
/**
* 新增演示
* @param data
*/
export function addGenDemo(data) {
return request({
url: 'business/GenDemo',
method: 'post',
data: data,
})
}
/**
* 修改演示
* @param data
*/
export function updateGenDemo(data) {
return request({
url: 'business/GenDemo',
method: 'PUT',
data: data,
})
}
/**
* 获取演示详情
* @param {Id}
*/
export function getGenDemo(id) {
return request({
url: 'business/GenDemo/' + id,
method: 'get'
})
}
/**
* 删除演示
* @param {主键} pid
*/
export function delGenDemo(pid) {
return request({
url: 'business/GenDemo/' + pid,
method: 'delete'
})
}
// 导出演示
export function exportGenDemo(query) {
return request({
url: 'business/GenDemo/export',
method: 'get',
params: query
})
}

View File

@ -97,7 +97,7 @@ export default {
if (routes.length === 0) { if (routes.length === 0) {
activePath = this.currentIndex || this.defaultRouter(); activePath = this.currentIndex || this.defaultRouter();
console.log("activePath", activePath); console.log("activePath", activePath);
this.activeRoutes(activePath); this.activeRoutes(activePath);
} }
return activePath; return activePath;

View File

@ -1,11 +1,12 @@
<template> <template>
<div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> <div :class="{'has-logo':showLogo}"
:style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
<logo v-if="showLogo" :collapse="isCollapse" /> <logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper"> <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
<el-menu :default-active="activeMenu" :collapse="isCollapse"
<el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground" :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor" :unique-opened="true" :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
:text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor" :unique-opened="true"
:active-text-color="settings.theme" :collapse-transition="false" mode="vertical"> :active-text-color="settings.theme" :collapse-transition="false" mode="vertical">
<sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route" :base-path="route.path" /> <sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route" :base-path="route.path" />
</el-menu> </el-menu>
</el-scrollbar> </el-scrollbar>
@ -13,34 +14,34 @@
</template> </template>
<script> <script>
import { mapGetters, mapState } from "vuex"; import { mapGetters, mapState } from 'vuex'
import Logo from "./Logo"; import Logo from './Logo'
import SidebarItem from "./SidebarItem"; import SidebarItem from './SidebarItem'
import variables from "@/assets/styles/variables.scss"; import variables from '@/assets/styles/variables.scss'
export default { export default {
components: { SidebarItem, Logo }, components: { SidebarItem, Logo },
computed: { computed: {
...mapState(["settings"]), ...mapState(['settings']),
...mapGetters(["sidebarRouters", "sidebar"]), ...mapGetters(['sidebarRouters', 'sidebar']),
activeMenu() { activeMenu() {
const route = this.$route; const route = this.$route
const { meta, path } = route; const { meta, path } = route
// if set path, the sidebar will highlight the path you set // if set path, the sidebar will highlight the path you set
if (meta.activeMenu) { if (meta.activeMenu) {
return meta.activeMenu; return meta.activeMenu
} }
return path; return path
}, },
showLogo() { showLogo() {
return this.$store.state.settings.sidebarLogo; return this.$store.state.settings.sidebarLogo
}, },
variables() { variables() {
return variables; return variables
}, },
isCollapse() { isCollapse() {
return !this.sidebar.opened; return !this.sidebar.opened
}, }
}, }
}; }
</script> </script>

View File

@ -126,8 +126,7 @@ export default {
this.$store this.$store
.dispatch("Login", this.loginForm) .dispatch("Login", this.loginForm)
.then(() => { .then(() => {
this.msgSuccess("登陆成功"); this.msgSuccess("登录成功");
this.loading = true;
this.$router.push({ path: this.redirect || "/" }); this.$router.push({ path: this.redirect || "/" });
}) })
.catch((error) => { .catch((error) => {

View File

@ -77,46 +77,71 @@
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row> <el-row>
<el-col :span="24" v-if="this.form.id"> <el-col :lg="24" v-if="this.form.id">
<el-form-item label="任务ID"> <el-form-item label="任务ID">
<div>{{form.id}}</div> <div>{{form.id}}</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :lg="12">
<el-form-item label="任务名称" maxlength="200" prop="name"> <el-form-item label="任务名称" maxlength="200" prop="name">
<el-input v-model="form.name" placeholder="请输入任务名称" /> <el-input v-model="form.name" placeholder="请输入任务名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :lg="12">
<el-form-item label="触发器类型" prop="triggerType"> <el-form-item label="触发器类型" prop="triggerType">
<el-select v-model="form.triggerType" placeholder="请选择触发器类型" style="width:100%"> <el-select v-model="form.triggerType" placeholder="请选择触发器类型" style="width:100%">
<el-option v-for="item in triggerTypeOptions" :key="item.value" :label="item.label" :value="parseInt(item.value)" /> <el-option v-for="item in triggerTypeOptions" :key="item.value" :label="item.label" :value="parseInt(item.value)" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :lg="12">
<el-form-item label="任务分组" maxlength="200" prop="jobGroup"> <el-form-item label="任务分组" maxlength="200" prop="jobGroup">
<el-select v-model="form.jobGroup" placeholder="请选择"> <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-option v-for="dict in jobGroupOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :lg="24">
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName"> <el-form-item label="任务类型" prop="taskType">
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" /> <el-radio-group v-model="form.taskType">
<el-radio :label="1">执行程序集</el-radio>
<el-radio :label="2">执行url</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="任务类名" maxlength="200" prop="className"> <el-col :lg="24" v-if="form.taskType == 2">
<el-input v-model="form.className" placeholder="请输入任务类名" /> <el-form-item label="apiUrl" prop="apiUrl">
<el-input v-model="form.apiUrl" placeholder="远程调用接口url">
<template slot="prepend">Http://</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <template v-else>
<el-col :lg="24">
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName">
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="任务类名" maxlength="200" prop="className">
<el-input v-model="form.className" placeholder="请输入任务类名" />
</el-form-item>
</el-col>
</template>
<el-col :lg="24">
<el-form-item label="传入参数" prop="jobParams"> <el-form-item label="传入参数" prop="jobParams">
<span slot="label">
<el-tooltip content="eg{ token: abc123}" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
传入参数
</span>
<el-input v-model="form.jobParams" placeholder="传入参数" /> <el-input v-model="form.jobParams" placeholder="传入参数" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-show="form.triggerType == 1"> <el-col :lg="24" v-show="form.triggerType == 1">
<el-form-item label="间隔(Cron)" prop="cron"> <el-form-item label="间隔(Cron)" prop="cron">
<!-- <el-input placeholder="如10分钟执行一次0/0 0/10 * * * ?" v-model="form.cron"> <!-- <el-input placeholder="如10分钟执行一次0/0 0/10 * * * ?" v-model="form.cron">
<el-link slot="append" href="https://qqe2.com/cron" type="primary" target="_blank" class="mr10">cron在线生成</el-link> <el-link slot="append" href="https://qqe2.com/cron" type="primary" target="_blank" class="mr10">cron在线生成</el-link>
@ -131,22 +156,28 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :lg="12">
<el-form-item label="开始日期" prop="beginTime"> <el-form-item label="开始日期" prop="beginTime">
<span slot="label">
<el-tooltip content="如果不写开始时间和结束时间任务将以当前时间开始执行到9999年结束" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
开始日期
</span>
<el-date-picker v-model="form.beginTime" style="width:100%" type="date" :picker-options="pickerOptions" placeholder="选择开始日期" /> <el-date-picker v-model="form.beginTime" style="width:100%" type="date" :picker-options="pickerOptions" placeholder="选择开始日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :lg="12">
<el-form-item label="结束日期" prop="endTime"> <el-form-item label="结束日期" prop="endTime">
<el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" /> <el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :lg="24">
<el-form-item v-show="form.triggerType == 0" label="执行间隔(秒)" prop="intervalSecond"> <el-form-item v-show="form.triggerType == 0" label="执行间隔(秒)" prop="intervalSecond">
<el-input-number v-model="form.intervalSecond" :max="9999999999" step-strictly controls-position="right" :min="1" /> <el-input-number v-model="form.intervalSecond" :max="9999999999" step-strictly controls-position="right" :min="1" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :lg="24">
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="form.remark" /> <el-input type="textarea" v-model="form.remark" />
</el-form-item> </el-form-item>
@ -178,6 +209,7 @@
<script> <script>
import { import {
queryTasks, queryTasks,
getTasks,
createTasks, createTasks,
updateTasks, updateTasks,
deleteTasks, deleteTasks,
@ -311,6 +343,9 @@ export default {
triggerType: [ triggerType: [
{ required: true, message: '请选择触发器类型', trigger: 'blur' } { required: true, message: '请选择触发器类型', trigger: 'blur' }
], ],
apiUrl: [
{ required: true, message: '请输入apiUrl地址', trigger: 'blur' }
],
cron: [{ validator: cronValidate, trigger: 'blur' }], cron: [{ validator: cronValidate, trigger: 'blur' }],
beginTime: [{ validator: beginTimeValidate, trigger: 'blur' }], beginTime: [{ validator: beginTimeValidate, trigger: 'blur' }],
endTime: [{ validator: endTimeValidate, trigger: 'blur' }], endTime: [{ validator: endTimeValidate, trigger: 'blur' }],
@ -376,9 +411,11 @@ export default {
handleUpdate(row) { handleUpdate(row) {
this.reset() this.reset()
this.form = row getTasks(row.id).then((res) => {
this.open = true this.form = res.data
this.title = '修改计划任务' this.open = true
this.title = '修改计划任务'
})
}, },
/** 任务日志列表查询 */ /** 任务日志列表查询 */
handleJobLog(id, title) { handleJobLog(id, title) {
@ -400,17 +437,14 @@ export default {
}, },
/** 确定后回传值 */ /** 确定后回传值 */
crontabFill(value) { crontabFill(value) {
console.log(value) console.log(value)
this.form.cron = value this.form.cron = value
}, },
// //
handleStart(row) { handleStart(row) {
startTasks(row.id).then((response) => { startTasks(row.id).then((response) => {
if (response.code === 200) { if (response.code === 200) {
this.$message({ this.msgSuccess(response.msg)
message: response.msg,
type: 'success'
})
this.open = false this.open = false
this.getList() this.getList()
} }
@ -420,10 +454,7 @@ export default {
handleStop(row) { handleStop(row) {
stopTasks(row.id).then((response) => { stopTasks(row.id).then((response) => {
if (response.code === 200) { if (response.code === 200) {
this.$message({ this.msgSuccess(response.msg)
message: response.msg,
type: 'success'
})
this.open = false this.open = false
this.getList() this.getList()
} }
@ -446,10 +477,7 @@ export default {
deleteTasks(jobInfo.id).then((response) => { deleteTasks(jobInfo.id).then((response) => {
if (response.code === 200) { if (response.code === 200) {
this.getList() this.getList()
this.$message({ this.msgSuccess('删除成功')
message: '删除成功',
type: 'success'
})
} }
}) })
}) })
@ -466,10 +494,7 @@ export default {
}).then((res) => { }).then((res) => {
runTasks(jobInfo.id).then((res) => { runTasks(jobInfo.id).then((res) => {
if (res.code === 200) { if (res.code === 200) {
this.$message({ this.msgSuccess('执行成功')
message: '执行成功',
type: 'success'
})
this.getList() this.getList()
} }
}) })
@ -482,10 +507,7 @@ export default {
if (this.form.id !== undefined) { if (this.form.id !== undefined) {
updateTasks(this.form).then((response) => { updateTasks(this.form).then((response) => {
if (response.code === 200) { if (response.code === 200) {
this.$message({ this.msgSuccess('修改成功')
message: '修改成功',
type: 'success'
})
this.open = false this.open = false
this.getList() this.getList()
} }
@ -493,10 +515,7 @@ export default {
} else { } else {
createTasks(this.form).then((response) => { createTasks(this.form).then((response) => {
if (response.code === 200) { if (response.code === 200) {
this.$message({ this.msgSuccess('新增成功')
message: '新增成功',
type: 'success'
})
this.open = false this.open = false
this.getList() this.getList()
} }
@ -524,7 +543,8 @@ export default {
beginTime: undefined, beginTime: undefined,
endTime: undefined, endTime: undefined,
intervalSecond: 1, intervalSecond: 1,
cron: undefined cron: undefined,
taskType: 1
} }
this.resetForm('form') this.resetForm('form')
}, },

View File

@ -41,14 +41,10 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">新增</el-button> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['system:user:edit']">修改</el-button> v-hasPermi="['system:user:edit']">修改</el-button>
</el-col> </el-col> -->
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['system:user:remove']">删除</el-button>
</el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button> <el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button>
</el-col> </el-col>
@ -59,7 +55,6 @@
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="编号" align="center" prop="userId" width="60" /> <el-table-column label="编号" align="center" prop="userId" width="60" />
<el-table-column label="登录名" align="center" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="登录名" align="center" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="昵称" align="center" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column label="昵称" align="center" prop="nickName" :show-overflow-tooltip="true" />

View File

@ -26,6 +26,8 @@ CREATE TABLE `Sys_TasksQz` (
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人编码', `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人编码',
`update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人编码', `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人编码',
`lastRunTime` datetime(0) NULL DEFAULT NULL COMMENT '最后执行时间', `lastRunTime` datetime(0) NULL DEFAULT NULL COMMENT '最后执行时间',
`apiUrl` varchar(200) NULL DEFAULT NULL COMMENT '网络请求地址',
`taskType` int(11) NULL DEFAULT NULL COMMENT '任务类型1程序集 2网络请求'
PRIMARY KEY (`ID`) USING BTREE PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '计划任务' ROW_FORMAT = Dynamic; ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '计划任务' ROW_FORMAT = Dynamic;

View File

@ -25,6 +25,8 @@ CREATE TABLE sys_tasksQz
create_by varchar(50) NULL DEFAULT NULL , --'创建人编码', create_by varchar(50) NULL DEFAULT NULL , --'创建人编码',
update_by varchar(50) NULL DEFAULT NULL , --'更新人编码', update_by varchar(50) NULL DEFAULT NULL , --'更新人编码',
lastRunTime datetime , -- lastRunTime datetime , --
taskType int null , -- 1 2
apiUrl varchar(200) --
) )
GO GO
INSERT INTO sys_tasksQz VALUES ('1410905433996136448', '测试任务', 'SYSTEM', '0 0/10 * * * ? ', 'ZR.Tasks', 'TaskScheduler.Job_SyncTest', NULL, 0, '2021-07-02 18:17:31', '9999-12-31 00:00:00', 1, 1, 1, NULL, '2021-07-02 18:17:23', '2021-07-02 18:17:31', 'admin', NULL, NULL); INSERT INTO sys_tasksQz VALUES ('1410905433996136448', '测试任务', 'SYSTEM', '0 0/10 * * * ? ', 'ZR.Tasks', 'TaskScheduler.Job_SyncTest', NULL, 0, '2021-07-02 18:17:31', '9999-12-31 00:00:00', 1, 1, 1, NULL, '2021-07-02 18:17:23', '2021-07-02 18:17:31', 'admin', NULL, NULL);