diff --git a/Infrastructure/Enums/StoreType.cs b/Infrastructure/Enums/StoreType.cs new file mode 100644 index 0000000..4dea7eb --- /dev/null +++ b/Infrastructure/Enums/StoreType.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Infrastructure.Enums +{ + /// + /// 文件存储位置 + /// + public enum StoreType + { + /// + /// 本地 + /// + [Description("本地")] + LOCAL = 1, + + /// + /// 阿里云 + /// + [Description("阿里云")] + ALIYUN = 2, + + /// + /// 腾讯云 + /// + [Description("腾讯云")] + TENCENT = 3, + + } +} diff --git a/Infrastructure/Helper/FileUtil.cs b/Infrastructure/Helper/FileUtil.cs index 44e4e77..0d85003 100644 --- a/Infrastructure/Helper/FileUtil.cs +++ b/Infrastructure/Helper/FileUtil.cs @@ -16,16 +16,11 @@ namespace Infrastructure public static string GetdirPath(string path = "") { DateTime date = DateTime.Now; - int year = date.Year; - int month = date.Month; - int day = date.Day; - int hour = date.Hour; - - string timeDir = $"{year}{month}{day}/";// date.ToString("yyyyMM/dd/HH/"); + string timeDir = date.ToString("yyyyMMdd");// date.ToString("yyyyMM/dd/HH/"); if (!string.IsNullOrEmpty(path)) { - timeDir = $"{path}/{timeDir}/"; + timeDir = Path.Combine(path, timeDir); } return timeDir; } @@ -33,7 +28,7 @@ namespace Infrastructure /// /// 取文件名的MD5值(16位) /// - /// 文件名,不包括扩展名 + /// 文件名,不包括扩展名 /// public static string HashFileName(string str = null) { diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 7295ea0..d36dff1 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Options; using Newtonsoft.Json; using Snowflake.Core; using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -38,16 +39,6 @@ namespace ZR.Admin.WebApi.Controllers OptionsSetting = options.Value; } - /// - /// 心跳 - /// - /// - [HttpGet] - public IActionResult Health() - { - return SUCCESS(true); - } - /// /// hello /// @@ -105,48 +96,16 @@ namespace ZR.Admin.WebApi.Controllers [HttpPost()] [Verify] [ActionPermissionFilter(Permission = "common")] - public IActionResult UploadFile([FromForm(Name = "file")] IFormFile formFile, string fileName = "", string fileDir = "uploads", int uploadType = 0) + public async Task UploadFile([FromForm(Name = "file")] IFormFile formFile, string fileName = "", string fileDir = "uploads", int uploadType = 0) { if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); - string fileExt = Path.GetExtension(formFile.FileName); - string hashFileName = FileUtil.HashFileName(Guid.NewGuid().ToString()).ToLower(); - fileName = (fileName.IsEmpty() ? hashFileName : fileName) + fileExt; - fileDir = fileDir.IsEmpty() ? "uploads" : fileDir; - string filePath = FileUtil.GetdirPath(fileDir); - string finalFilePath = Path.Combine(WebHostEnvironment.WebRootPath, filePath, fileName); - finalFilePath = finalFilePath.Replace("\\", "/").Replace("//", "/"); - double fileSize = formFile.Length / 1024; - if (!Directory.Exists(Path.GetDirectoryName(finalFilePath))) - { - Directory.CreateDirectory(Path.GetDirectoryName(finalFilePath)); - } - - using (var stream = new FileStream(finalFilePath, FileMode.Create)) - { - formFile.CopyTo(stream); - } - - string accessPath = $"{OptionsSetting.Upload.UploadUrl}/{filePath.Replace("\\", " /")}{fileName}"; - SysFile file = new() - { - AccessUrl = accessPath, - Create_by = HttpContext.GetName(), - FileExt = fileExt, - FileName = fileName, - FileSize = fileSize + "kb", - StoreType = 1, - FileUrl = finalFilePath, - RealName = formFile.FileName, - Create_time = DateTime.Now, - FileType = formFile.ContentType - }; - long fileId = SysFileService.InsertFile(file); + SysFile file = await SysFileService.SaveFileToLocal(WebHostEnvironment.WebRootPath, fileName, fileDir, HttpContext.GetName(), formFile); return SUCCESS(new { - url = uploadType == 1 ? finalFilePath : accessPath, + url = uploadType == 1 ? file.FileUrl : file.AccessUrl, fileName, - fileId + fileId = file.Id.ToString() }); } @@ -162,10 +121,9 @@ namespace ZR.Admin.WebApi.Controllers [ActionPermissionFilter(Permission = "common")] public async Task UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile, string fileName = "", string fileDir = "") { - if (fileDir.IsEmpty()) fileDir = "uploads"; if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); string fileExt = Path.GetExtension(formFile.FileName);//文件后缀 - double fileSize = formFile.Length / 1024.0;//文件大小KB + double fileSize = Math.Round(formFile.Length / 1024.0, 2);//文件大小KB string[] NotAllowedFileExtensions = new string[] { ".bat", ".exe", ".jar", ".js" }; int MaxContentLength = 15; if (NotAllowedFileExtensions.Contains(fileExt)) @@ -176,30 +134,20 @@ namespace ZR.Admin.WebApi.Controllers { return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + MaxContentLength + " MB"); } - - (bool, string, string) result = new(); - await Task.Run(() => + SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", fileDir, "", HttpContext.GetName()) { - result = SysFileService.SaveFile(fileDir, formFile, fileName, ""); - }); - long id = SysFileService.InsertFile(new SysFile() - { - AccessUrl = result.Item2, - Create_by = HttpContext.GetName(), - FileExt = fileExt, - FileName = result.Item3, - FileSize = fileSize + "kb", - StoreType = 2, - StorePath = fileDir, - RealName = formFile.FileName, - Create_time = DateTime.Now, + StoreType = (int)Infrastructure.Enums.StoreType.ALIYUN, FileType = formFile.ContentType - }); + }; + file = await SysFileService.SaveFileToAliyun(file, formFile); + + if (file.Id <= 0) { return ToResponse(ApiResult.Error("阿里云连接失败")); } + return SUCCESS(new { - url = result.Item2, - fileName = result.Item3, - fileId = id + url = file.AccessUrl, + fileName = file.FileName, + fileId = file.Id.ToString() }); } #endregion diff --git a/ZR.Admin.WebApi/Controllers/System/monitor/SysLogininforController.cs b/ZR.Admin.WebApi/Controllers/System/monitor/SysLogininforController.cs index 1c12531..b56b80e 100644 --- a/ZR.Admin.WebApi/Controllers/System/monitor/SysLogininforController.cs +++ b/ZR.Admin.WebApi/Controllers/System/monitor/SysLogininforController.cs @@ -1,9 +1,10 @@ using Infrastructure; using Infrastructure.Attribute; using Infrastructure.Enums; +using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using SqlSugar; -using System.Linq.Expressions; +using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; using ZR.Common; using ZR.Model; @@ -51,6 +52,10 @@ namespace ZR.Admin.WebApi.Controllers.monitor [HttpDelete("clean")] public IActionResult CleanLoginInfo() { + if (!HttpContextExtension.IsAdmin(HttpContext)) + { + return ToResponse(ApiResult.Error("操作失败")); + } sysLoginService.TruncateLogininfo(); return SUCCESS(1); } @@ -65,6 +70,10 @@ namespace ZR.Admin.WebApi.Controllers.monitor [ActionPermissionFilter(Permission = "monitor:logininfor:remove")] public IActionResult Remove(string infoIds) { + if (!HttpContextExtension.IsAdmin(HttpContext)) + { + return ToResponse(ApiResult.Error("操作失败")); + } long[] infoIdss = Tools.SpitLongArrary(infoIds); return SUCCESS(sysLoginService.DeleteLogininforByIds(infoIdss)); } diff --git a/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs b/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs index 4904744..3bf7224 100644 --- a/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs +++ b/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs @@ -1,7 +1,9 @@ using Infrastructure.Attribute; using Infrastructure.Enums; using Infrastructure.Model; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; +using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; using ZR.Common; using ZR.Model; @@ -33,6 +35,7 @@ namespace ZR.Admin.WebApi.Controllers.monitor { PagerInfo pagerInfo = new(sysOperLog.pageNum, sysOperLog.PageSize); + sysOperLog.operName = !HttpContextExtension.IsAdmin(HttpContext) ? HttpContextExtension.GetName(HttpContext) : sysOperLog.operName; var list = sysOperLogService.SelectOperLogList(sysOperLog, pagerInfo); return SUCCESS(list, "MM/dd HH:mm"); @@ -48,6 +51,10 @@ namespace ZR.Admin.WebApi.Controllers.monitor [HttpDelete("{operIds}")] public IActionResult Remove(string operIds) { + if (!HttpContextExtension.IsAdmin(HttpContext)) + { + return ToResponse(ApiResult.Error("操作失败")); + } long[] operIdss = Tools.SpitLongArrary(operIds); return SUCCESS(sysOperLogService.DeleteOperLogByIds(operIdss)); } @@ -61,6 +68,10 @@ namespace ZR.Admin.WebApi.Controllers.monitor [HttpDelete("clean")] public ApiResult ClearOperLog() { + if (!HttpContextExtension.IsAdmin(HttpContext)) + { + return ApiResult.Error("操作失败"); + } sysOperLogService.CleanOperLog(); return ToJson(1); diff --git a/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs b/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs index 1417c34..988a148 100644 --- a/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs +++ b/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs @@ -79,6 +79,12 @@ namespace ZR.Admin.WebApi.Extensions return uid; } + public static bool IsAdmin(this HttpContext context) + { + long id = GetUId(context); + return id == 1; + } + /// /// ClaimsIdentity /// diff --git a/ZR.Model/JsonDateConverter.cs b/ZR.Model/JsonDateConverter.cs deleted file mode 100644 index 70ca6c8..0000000 --- a/ZR.Model/JsonDateConverter.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Newtonsoft.Json.Converters; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ZR.Model -{ - public class JsonDateConverter: IsoDateTimeConverter - { - public JsonDateConverter() - { - DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; - } - } -} diff --git a/ZR.Model/System/Dto/SysFileQueryDto.cs b/ZR.Model/System/Dto/SysFileQueryDto.cs index fc860f8..b251f1e 100644 --- a/ZR.Model/System/Dto/SysFileQueryDto.cs +++ b/ZR.Model/System/Dto/SysFileQueryDto.cs @@ -10,15 +10,72 @@ namespace ZR.Model.System.Dto public class SysFileDto { public long Id { get; set; } + /// + /// 文件原名 + /// + public string RealName { get; set; } + /// + /// 文件类型 + /// + public string FileType { get; set; } + /// + /// 描述 : 存储文件名 + /// 空值 : true + /// public string FileName { get; set; } + /// + /// 描述 : 文件存储地址 eg:/uploads/20220202 + /// 空值 : true + /// public string FileUrl { get; set; } + /// + /// 描述 : 仓库位置 eg:/uploads + /// 空值 : true + /// public string StorePath { get; set; } + /// + /// 描述 : 文件大小 + /// 空值 : true + /// public string FileSize { get; set; } + /// + /// 描述 : 文件扩展名 + /// 空值 : true + /// public string FileExt { get; set; } + /// + /// 描述 : 创建人 + /// 空值 : true + /// public string Create_by { get; set; } + /// + /// 描述 : 上传时间 + /// 空值 : true + /// public DateTime? Create_time { get; set; } + /// + /// 描述 : 存储类型 + /// 空值 : true + /// public int? StoreType { get; set; } + /// + /// 描述 : 访问路径 + /// 空值 : true + /// public string AccessUrl { get; set; } + + public SysFileDto() { } + public SysFileDto(string originFileName, string fileName, string ext, string fileSize, string storePath, string accessUrl, string create_by) + { + StorePath = storePath; + RealName = originFileName; + FileName = fileName; + FileExt = ext; + FileSize = fileSize; + AccessUrl = accessUrl; + Create_by = create_by; + Create_time = DateTime.Now; + } } public class SysFileQueryDto : PagerInfo { diff --git a/ZR.Model/System/SysFile.cs b/ZR.Model/System/SysFile.cs index f229cab..501b9c0 100644 --- a/ZR.Model/System/SysFile.cs +++ b/ZR.Model/System/SysFile.cs @@ -18,7 +18,7 @@ namespace ZR.Model.System [SugarColumn(IsPrimaryKey = true)] public long Id { get; set; } /// - /// 文件真实名 + /// 文件原名 /// public string RealName { get; set; } /// @@ -26,17 +26,17 @@ namespace ZR.Model.System /// public string FileType { get; set; } /// - /// 描述 : 文件名 + /// 描述 : 存储文件名 /// 空值 : true /// public string FileName { get; set; } /// - /// 描述 : 文件存储地址 + /// 描述 : 文件存储地址 eg:/uploads/20220202 /// 空值 : true /// public string FileUrl { get; set; } /// - /// 描述 : 仓库位置 + /// 描述 : 仓库位置 eg:/uploads /// 空值 : true /// public string StorePath { get; set; } @@ -70,5 +70,18 @@ namespace ZR.Model.System /// 空值 : true /// public string AccessUrl { get; set; } + + public SysFile() { } + public SysFile(string originFileName, string fileName, string ext, string fileSize, string storePath, string accessUrl,string create_by) + { + StorePath = storePath; + RealName = originFileName; + FileName = fileName; + FileExt = ext; + FileSize = fileSize; + AccessUrl = accessUrl; + Create_by = create_by; + Create_time = DateTime.Now; + } } } \ No newline at end of file diff --git a/ZR.Service/System/IService/ISysFileService.cs b/ZR.Service/System/IService/ISysFileService.cs index 62b4f6e..2482bc7 100644 --- a/ZR.Service/System/IService/ISysFileService.cs +++ b/ZR.Service/System/IService/ISysFileService.cs @@ -1,5 +1,6 @@ using Infrastructure.Attribute; using Microsoft.AspNetCore.Http; +using System.Threading.Tasks; using ZR.Model.Models; using ZR.Model.System; @@ -7,27 +8,32 @@ namespace ZR.Service.System.IService { public interface ISysFileService : IBaseService { - long InsertFile(SysFile file); + Task InsertFile(SysFile file); /// /// 上传文件 /// - /// + /// + /// /// - /// 结果、地址、文件名 - (bool, string, string) SaveFile(string picdir, IFormFile formFile); - (bool, string, string) SaveFile(string picdir, IFormFile formFile, string customFileName, string bucketName); + /// + /// + /// 文件对象 + Task SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile); + + Task SaveFileToAliyun(SysFile file, IFormFile formFile); /// /// 按时间来创建文件夹 /// /// + /// /// eg: 2020/11/3 - string GetdirPath(string path = ""); + string GetdirPath(string path = "", bool byTimeStore = true); /// /// 取文件名的MD5值(16位) /// - /// 文件名,不包括扩展名 + /// 文件名,不包括扩展名 /// string HashFileName(string str = null); } diff --git a/ZR.Service/System/SysFileService.cs b/ZR.Service/System/SysFileService.cs index bfe104e..bfc8ca3 100644 --- a/ZR.Service/System/SysFileService.cs +++ b/ZR.Service/System/SysFileService.cs @@ -11,6 +11,8 @@ using System.Net; using ZR.Model.System; using ZR.Repository.System; using Infrastructure.Extensions; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; namespace ZR.Service.System { @@ -22,57 +24,82 @@ namespace ZR.Service.System { private string domainUrl = AppSettings.GetConfig("ALIYUN_OSS:domainUrl"); private readonly SysFileRepository SysFileRepository; - - public SysFileService(SysFileRepository repository) + private OptionsSetting OptionsSetting; + public SysFileService(SysFileRepository repository, IOptions options) { SysFileRepository = repository; + OptionsSetting = options.Value; + } + + /// + /// 存储本地 + /// + /// + public async Task SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile) + { + string fileExt = Path.GetExtension(formFile.FileName); + fileName = (fileName.IsEmpty() ? HashFileName() : fileName) + fileExt; + fileDir = fileDir.IsEmpty() ? "uploads" : fileDir; + string filePath = GetdirPath(fileDir); + string finalFilePath = Path.Combine(rootPath, filePath, fileName); + double fileSize = Math.Round(formFile.Length / 1024.0, 2); + + if (!Directory.Exists(Path.GetDirectoryName(finalFilePath))) + { + Directory.CreateDirectory(Path.GetDirectoryName(finalFilePath)); + } + + using (var stream = new FileStream(finalFilePath, FileMode.Create)) + { + await formFile.CopyToAsync(stream); + } + string accessPath = string.Concat(OptionsSetting.Upload.UploadUrl, "/", filePath.Replace("\\", "/"), "/", fileName); + SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", filePath, accessPath, userName) + { + StoreType = (int)Infrastructure.Enums.StoreType.LOCAL, + FileType = formFile.ContentType, + FileUrl = finalFilePath + }; + file.Id = await InsertFile(file); + return file; } /// /// 上传文件到阿里云 /// - /// + /// /// /// - public (bool, string, string) SaveFile(string picdir, IFormFile formFile) + public async Task SaveFileToAliyun(SysFile file, IFormFile formFile) { - return SaveFile(picdir, formFile, "", ""); + file.FileName = (file.FileName.IsEmpty() ? HashFileName() : file.FileName) + file.FileExt; + file.StorePath = GetdirPath(file.StorePath); + string finalPath = Path.Combine(file.StorePath, file.FileName); + HttpStatusCode statusCode = AliyunOssHelper.PutObjectFromFile(formFile.OpenReadStream(), finalPath, ""); + if (statusCode != HttpStatusCode.OK) return file; + + file.StorePath = file.StorePath; + file.FileUrl = finalPath; + file.AccessUrl = string.Concat(domainUrl, "/", file.StorePath.Replace("\\", "/"), "/", file.FileName); + file.Id = await InsertFile(file); + + return file; } /// - /// 存储文件 + /// 获取文件存储目录 /// - /// 文件夹 - /// - /// 自定义文件名 - /// 存储桶 + /// + /// 是否按年月日存储 /// - public (bool, string, string) SaveFile(string picdir, IFormFile formFile, string customFileName, string bucketName) - { - // eg: uploads/2020/08/18 - //string dir = GetdirPath(picdir.ToString()); - - string tempName = customFileName.IsEmpty() ? HashFileName() : customFileName; - string fileExt = Path.GetExtension(formFile.FileName); - string fileName = tempName + fileExt; - string webUrl = string.Concat(domainUrl, "/", picdir, "/", fileName); - - HttpStatusCode statusCode = AliyunOssHelper.PutObjectFromFile(formFile.OpenReadStream(), Path.Combine(picdir, fileName), bucketName); - - return (statusCode == HttpStatusCode.OK, webUrl, fileName); - } - public string GetdirPath(string path = "") + public string GetdirPath(string storePath = "", bool byTimeStore = true) { DateTime date = DateTime.Now; - int year = date.Year; - int month = date.Month; - int day = date.Day; - //int hour = date.Hour; + string timeDir = date.ToString("yyyyMMdd"); - string timeDir = $"{year}/{month}/{day}";// date.ToString("yyyyMM/dd/HH/"); - if (!string.IsNullOrEmpty(path)) + if (!string.IsNullOrEmpty(storePath)) { - timeDir = path + "/" + timeDir; + timeDir = Path.Combine(storePath, timeDir); } return timeDir; } @@ -87,11 +114,11 @@ namespace ZR.Service.System return BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(str)), 4, 8).Replace("-", ""); } - public long InsertFile(SysFile file) + public Task InsertFile(SysFile file) { try { - return Insertable(file).ExecuteReturnSnowflakeId();//单条插入返回雪花ID; + return Insertable(file).ExecuteReturnSnowflakeIdAsync();//单条插入返回雪花ID; } catch (Exception ex) { diff --git a/ZR.Tasks/TaskSchedulerServer.cs b/ZR.Tasks/TaskSchedulerServer.cs index 8570680..681c405 100644 --- a/ZR.Tasks/TaskSchedulerServer.cs +++ b/ZR.Tasks/TaskSchedulerServer.cs @@ -262,7 +262,7 @@ namespace ZR.Tasks List jobKeys = _scheduler.Result.GetJobKeys(GroupMatcher.GroupEquals(tasksQz.JobGroup)).Result.ToList(); if (jobKeys == null || jobKeys.Count == 0) { - return new ApiResult(110, $"未找到分组[{ tasksQz.JobGroup }]"); + await AddTaskScheduleAsync(tasksQz); } var triggers = await _scheduler.Result.GetTriggersOfJob(jobKey); diff --git a/ZR.Vue/src/components/Crontab/day.vue b/ZR.Vue/src/components/Crontab/day.vue new file mode 100644 index 0000000..fe3eaf0 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/day.vue @@ -0,0 +1,161 @@ + + + diff --git a/ZR.Vue/src/components/Crontab/hour.vue b/ZR.Vue/src/components/Crontab/hour.vue new file mode 100644 index 0000000..4b1f1fc --- /dev/null +++ b/ZR.Vue/src/components/Crontab/hour.vue @@ -0,0 +1,114 @@ + + + diff --git a/ZR.Vue/src/components/Crontab/index.vue b/ZR.Vue/src/components/Crontab/index.vue new file mode 100644 index 0000000..8e39046 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/index.vue @@ -0,0 +1,389 @@ + + + + diff --git a/ZR.Vue/src/components/Crontab/min.vue b/ZR.Vue/src/components/Crontab/min.vue new file mode 100644 index 0000000..43cab90 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/min.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/ZR.Vue/src/components/Crontab/month.vue b/ZR.Vue/src/components/Crontab/month.vue new file mode 100644 index 0000000..fd0ac38 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/month.vue @@ -0,0 +1,114 @@ + + + diff --git a/ZR.Vue/src/components/Crontab/result.vue b/ZR.Vue/src/components/Crontab/result.vue new file mode 100644 index 0000000..2ce2041 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/result.vue @@ -0,0 +1,569 @@ + + + + \ No newline at end of file diff --git a/ZR.Vue/src/components/Crontab/second.vue b/ZR.Vue/src/components/Crontab/second.vue new file mode 100644 index 0000000..e7b7761 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/second.vue @@ -0,0 +1,117 @@ + + + diff --git a/ZR.Vue/src/components/Crontab/week.vue b/ZR.Vue/src/components/Crontab/week.vue new file mode 100644 index 0000000..1cec700 --- /dev/null +++ b/ZR.Vue/src/components/Crontab/week.vue @@ -0,0 +1,202 @@ + + + diff --git a/ZR.Vue/src/components/Crontab/year.vue b/ZR.Vue/src/components/Crontab/year.vue new file mode 100644 index 0000000..5487a6c --- /dev/null +++ b/ZR.Vue/src/components/Crontab/year.vue @@ -0,0 +1,131 @@ + + + diff --git a/ZR.Vue/src/components/FileUpload/index.vue b/ZR.Vue/src/components/FileUpload/index.vue index 6523b74..14d85de 100644 --- a/ZR.Vue/src/components/FileUpload/index.vue +++ b/ZR.Vue/src/components/FileUpload/index.vue @@ -1,11 +1,12 @@