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
{
url = file.AccessUrl,
fileName,
fileName = file.FileName,
fileId = file.Id.ToString()
});
}

View File

@ -9,6 +9,7 @@ using Infrastructure.Attribute;
using Infrastructure.Enums;
using Infrastructure;
using ZR.Service.System.IService;
using ZR.Common;
namespace ZR.Admin.WebApi.Controllers.System
{
@ -106,9 +107,10 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpDelete("{id}")]
[ActionPermissionFilter(Permission = "system:post:remove")]
[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>

View File

@ -15,6 +15,8 @@ using ZR.Common;
using ZR.Model.System.Dto;
using ZR.Model.System;
using ZR.Service.System.IService;
using Infrastructure.Extensions;
using System.Threading.Tasks;
namespace ZR.Admin.WebApi.Controllers.System
{
@ -27,6 +29,7 @@ namespace ZR.Admin.WebApi.Controllers.System
private readonly ISysRoleService RoleService;
private readonly ISysUserPostService UserPostService;
private readonly ISysDeptService DeptService;
private readonly ISysFileService FileService;
private OptionsSetting OptionsSetting;
private IWebHostEnvironment hostEnvironment;
@ -35,6 +38,7 @@ namespace ZR.Admin.WebApi.Controllers.System
ISysRoleService roleService,
ISysUserPostService postService,
ISysDeptService deptService,
ISysFileService sysFileService,
IOptions<OptionsSetting> options,
IWebHostEnvironment hostEnvironment)
{
@ -42,6 +46,7 @@ namespace ZR.Admin.WebApi.Controllers.System
RoleService = roleService;
UserPostService = postService;
DeptService = deptService;
FileService = sysFileService;
OptionsSetting = options.Value;
this.hostEnvironment = hostEnvironment;
}
@ -124,28 +129,17 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpPost("Avatar")]
[ActionPermissionFilter(Permission = "common")]
[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);
if (formFile == null) throw new CustomException("请选择文件");
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); }
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 });
UserService.UpdatePhoto(new SysUser() { Avatar = file.AccessUrl, UserId = loginUser.UserId });
return SUCCESS(new { imgUrl = file.AccessUrl });
}
}
}

View File

@ -15,6 +15,7 @@ using ZR.Model.System;
using ZR.Service.System.IService;
using ZR.Tasks;
using Snowflake.Core;
using Infrastructure.Extensions;
namespace ZR.Admin.WebApi.Controllers
{
@ -62,14 +63,14 @@ namespace ZR.Admin.WebApi.Controllers
/// </summary>
/// <param name="id">编码</param>
/// <returns></returns>
[HttpGet("{id}")]
[HttpGet("get")]
public IActionResult Get(string id)
{
if (!string.IsNullOrEmpty(id))
{
return SUCCESS(_tasksQzService.GetId(id));
}
return SUCCESS(_tasksQzService.GetAll());
return SUCCESS(null);
}
/// <summary>
@ -90,7 +91,10 @@ namespace ZR.Admin.WebApi.Controllers
{
throw new CustomException($"cron表达式不正确");
}
if (string.IsNullOrEmpty(parm.ApiUrl) && parm.TaskType == 2)
{
throw new CustomException($"地址不能为空");
}
//从 Dto 映射到 实体
var tasksQz = parm.Adapt<SysTasksQz>().ToCreate();
var worker = new IdWorker(1, 1);
@ -98,7 +102,13 @@ namespace ZR.Admin.WebApi.Controllers
tasksQz.ID = worker.NextId().ToString();
tasksQz.IsStart = false;
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));
}
@ -125,7 +135,15 @@ namespace ZR.Admin.WebApi.Controllers
throw new CustomException($"cron表达式不正确");
}
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)
{
throw new CustomException($"该任务正在运行中,请先停止在更新");
@ -142,10 +160,12 @@ namespace ZR.Admin.WebApi.Controllers
TriggerType = parm.TriggerType,
IntervalSecond = parm.IntervalSecond,
JobParams = parm.JobParams,
Update_by = User.Identity.Name,
Update_by = HttpContextExtension.GetName(HttpContext),
Update_time = DateTime.Now,
BeginTime = parm.BeginTime,
EndTime = parm.EndTime
EndTime = parm.EndTime,
TaskType = parm.TaskType,
ApiUrl = parm.ApiUrl,
});
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-form-item label=\"{labelName}\">{{{{form.{columnName}}}}}</el-form-item>");
sb.AppendLine(" </el-col>");
return sb.ToString();
}
//树
if (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable.TreeParentCode != null && dbFieldInfo.CsharpField.Equals(genTable.TreeParentCode))
else if (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable.TreeParentCode != null && dbFieldInfo.CsharpField.Equals(genTable.TreeParentCode))
{
//树
sb.AppendLine(@" <el-col :lg=""24"">");
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(@" </el-form-item>");
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-form-item label=\"{labelName}\" prop=\"{columnName}\">");
//主键非自增 显示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=='修改数据'\"/>");
}
@ -64,8 +61,9 @@ namespace ZR.CodeGenerator
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
return sb.ToString();
}
else
{
if (dbFieldInfo.HtmlType == GenConstants.HTML_INPUT_NUMBER)
{
//数字框
@ -89,7 +87,7 @@ namespace ZR.CodeGenerator
//图片
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($@" <UploadImage v-model=""form.{columnName}"" column=""{columnName}"" @input=""handleUploadSuccess"" />");
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
@ -162,7 +160,7 @@ namespace ZR.CodeGenerator
sb.AppendLine(" </el-form-item>");
sb.AppendLine(" </el-col>");
}
}
return sb.ToString();
}

View File

@ -85,6 +85,7 @@ namespace ZR.CodeGenerator
GenerateService(replaceDto, dto);
GenerateControllers(replaceDto, dto);
GenerateVueViews(replaceDto, dto);
GenerateVue3Views(replaceDto, dto);
GenerateVueJs(replaceDto, dto);
GenerateSql(replaceDto, dto);
@ -201,7 +202,41 @@ namespace ZR.CodeGenerator
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>
/// 生成vue页面api
/// </summary>
@ -478,6 +513,7 @@ namespace ZR.CodeGenerator
options.OutMode = OutMode.Auto;
//options.DisableeLogogram = true;//禁用简写
options.Data.Set("refs", "$");//特殊标签替换
options.Data.Set("modal", "$");//特殊标签替换
options.Data.Set("index", "$");//特殊标签替换
options.Data.Set("confirm", "$");//特殊标签替换
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>
[Display(Name = "传入参数")]
public string JobParams { get; set; }
public string ApiUrl { get; set; }
/// <summary>
/// 1、程序集任务 2、apiUrl任务
/// </summary>
public int TaskType { get; set; }
}
/// <summary>
@ -219,6 +224,10 @@ namespace ZR.Model.System.Dto
/// </summary>
[Display(Name = "传入参数")]
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>
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
{
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
/// <summary>
/// 注入反射获取依赖对象
@ -42,12 +42,10 @@ namespace ZR.Tasks
public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
if (disposable != null)
if (job is IDisposable disposable)
{
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

@ -1,11 +1,12 @@
<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" />
<el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
<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"
<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"
: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" />
</el-menu>
</el-scrollbar>
@ -13,34 +14,34 @@
</template>
<script>
import { mapGetters, mapState } from "vuex";
import Logo from "./Logo";
import SidebarItem from "./SidebarItem";
import variables from "@/assets/styles/variables.scss";
import { mapGetters, mapState } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/assets/styles/variables.scss'
export default {
components: { SidebarItem, Logo },
computed: {
...mapState(["settings"]),
...mapGetters(["sidebarRouters", "sidebar"]),
...mapState(['settings']),
...mapGetters(['sidebarRouters', 'sidebar']),
activeMenu() {
const route = this.$route;
const { meta, path } = route;
const route = this.$route
const { meta, path } = route
// if set path, the sidebar will highlight the path you set
if (meta.activeMenu) {
return meta.activeMenu;
return meta.activeMenu
}
return path;
return path
},
showLogo() {
return this.$store.state.settings.sidebarLogo;
return this.$store.state.settings.sidebarLogo
},
variables() {
return variables;
return variables
},
isCollapse() {
return !this.sidebar.opened;
},
},
};
return !this.sidebar.opened
}
}
}
</script>

View File

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

View File

@ -77,46 +77,71 @@
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<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">
<div>{{form.id}}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :lg="12">
<el-form-item label="任务名称" maxlength="200" prop="name">
<el-input v-model="form.name" placeholder="请输入任务名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :lg="12">
<el-form-item label="触发器类型" prop="triggerType">
<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-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :lg="12">
<el-form-item label="任务分组" maxlength="200" 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-col :lg="24">
<el-form-item label="任务类型" prop="taskType">
<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-col>
<el-col :lg="24" v-if="form.taskType == 2">
<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-col>
<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 :span="24">
<el-col :lg="24">
<el-form-item label="任务类名" maxlength="200" prop="className">
<el-input v-model="form.className" placeholder="请输入任务类名" />
</el-form-item>
</el-col>
<el-col :span="24">
</template>
<el-col :lg="24">
<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-form-item>
</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-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>
@ -131,22 +156,28 @@
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :lg="12">
<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-form-item>
</el-col>
<el-col :span="12">
<el-col :lg="12">
<el-form-item label="结束日期" prop="endTime">
<el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-col :lg="24">
<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-form-item>
</el-col>
<el-col :span="24">
<el-col :lg="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="form.remark" />
</el-form-item>
@ -178,6 +209,7 @@
<script>
import {
queryTasks,
getTasks,
createTasks,
updateTasks,
deleteTasks,
@ -311,6 +343,9 @@ export default {
triggerType: [
{ required: true, message: '请选择触发器类型', trigger: 'blur' }
],
apiUrl: [
{ required: true, message: '请输入apiUrl地址', trigger: 'blur' }
],
cron: [{ validator: cronValidate, trigger: 'blur' }],
beginTime: [{ validator: beginTimeValidate, trigger: 'blur' }],
endTime: [{ validator: endTimeValidate, trigger: 'blur' }],
@ -376,9 +411,11 @@ export default {
handleUpdate(row) {
this.reset()
this.form = row
getTasks(row.id).then((res) => {
this.form = res.data
this.open = true
this.title = '修改计划任务'
})
},
/** 任务日志列表查询 */
handleJobLog(id, title) {
@ -407,10 +444,7 @@ export default {
handleStart(row) {
startTasks(row.id).then((response) => {
if (response.code === 200) {
this.$message({
message: response.msg,
type: 'success'
})
this.msgSuccess(response.msg)
this.open = false
this.getList()
}
@ -420,10 +454,7 @@ export default {
handleStop(row) {
stopTasks(row.id).then((response) => {
if (response.code === 200) {
this.$message({
message: response.msg,
type: 'success'
})
this.msgSuccess(response.msg)
this.open = false
this.getList()
}
@ -446,10 +477,7 @@ export default {
deleteTasks(jobInfo.id).then((response) => {
if (response.code === 200) {
this.getList()
this.$message({
message: '删除成功',
type: 'success'
})
this.msgSuccess('删除成功')
}
})
})
@ -466,10 +494,7 @@ export default {
}).then((res) => {
runTasks(jobInfo.id).then((res) => {
if (res.code === 200) {
this.$message({
message: '执行成功',
type: 'success'
})
this.msgSuccess('执行成功')
this.getList()
}
})
@ -482,10 +507,7 @@ export default {
if (this.form.id !== undefined) {
updateTasks(this.form).then((response) => {
if (response.code === 200) {
this.$message({
message: '修改成功',
type: 'success'
})
this.msgSuccess('修改成功')
this.open = false
this.getList()
}
@ -493,10 +515,7 @@ export default {
} else {
createTasks(this.form).then((response) => {
if (response.code === 200) {
this.$message({
message: '新增成功',
type: 'success'
})
this.msgSuccess('新增成功')
this.open = false
this.getList()
}
@ -524,7 +543,8 @@ export default {
beginTime: undefined,
endTime: undefined,
intervalSecond: 1,
cron: undefined
cron: undefined,
taskType: 1
}
this.resetForm('form')
},

View File

@ -41,14 +41,10 @@
<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-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"
v-hasPermi="['system:user:edit']">修改</el-button>
</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> -->
<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-col>
@ -59,7 +55,6 @@
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<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="userName" :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 '创建人编码',
`update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci 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
) 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 , --'创建人编码',
update_by varchar(50) NULL DEFAULT NULL , --'更新人编码',
lastRunTime datetime , --
taskType int null , -- 1 2
apiUrl varchar(200) --
)
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);