From c5168afe1f7d62d0368e86f8038425aa50d5aa13 Mon Sep 17 00:00:00 2001 From: wanggang <76527413@qq.com> Date: Wed, 23 Oct 2019 13:33:10 +0800 Subject: [PATCH] update Former-commit-id: dc0fe9bf426d72a1c36f981c7a507011b647f487 --- docs/研发/v1.0任务分解.xlsx | Bin 25607 -> 27527 bytes .../Application/Domain/Entities/LiveRecord.cs | 1 + .../Application/Models/EditLiveRecordModel.cs | 25 ++++++++++++++ .../{ApiSearchModel.cs => SearchApiModel.cs} | 2 +- ...{DataSearchModel.cs => SearchDataModel.cs} | 2 +- ...eviceSearchMode.cs => SearchDeviceMode.cs} | 2 +- .../Models/SearchLiveRecordModel.cs | 15 ++++++++ .../Areas/Admin/Controlls/AjaxController.cs | 10 ++++++ .../Areas/Admin/Controlls/ApiController.cs | 4 +-- .../Areas/Admin/Controlls/DataController.cs | 4 +-- .../Areas/Admin/Controlls/DeviceController.cs | 4 +-- .../Admin/Controlls/LiveRecordController.cs | 32 ++++++++++++++++++ .../Admin/Views/LiveRecord/Details.cshtml | 20 +++++++++++ .../Areas/Admin/Views/Shared/_Menu.cshtml | 1 + .../IoTCenter/Controllers/AppController.cs | 5 +-- .../linux-x64/publish/apps/srs/conf/srs.conf | 4 +-- 16 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 projects/IoT.Shared/Application/Models/EditLiveRecordModel.cs rename projects/IoT.Shared/Application/Models/{ApiSearchModel.cs => SearchApiModel.cs} (83%) rename projects/IoT.Shared/Application/Models/{DataSearchModel.cs => SearchDataModel.cs} (87%) rename projects/IoT.Shared/Application/Models/{DeviceSearchMode.cs => SearchDeviceMode.cs} (89%) create mode 100644 projects/IoT.Shared/Application/Models/SearchLiveRecordModel.cs create mode 100644 projects/IoT.Shared/Areas/Admin/Controlls/LiveRecordController.cs create mode 100644 projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml diff --git a/docs/研发/v1.0任务分解.xlsx b/docs/研发/v1.0任务分解.xlsx index 8700cac195401ecc1cfb3fd772bf076777796990..205a0d81db16b44c66aa54e19ec9112b6e1cfead 100644 GIT binary patch delta 17304 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 G)BpevrU{b( delta 15345 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 MEgjNVlRs_#50e679RL6T diff --git a/projects/IoT.Shared/Application/Domain/Entities/LiveRecord.cs b/projects/IoT.Shared/Application/Domain/Entities/LiveRecord.cs index d857fca5..6cb21815 100644 --- a/projects/IoT.Shared/Application/Domain/Entities/LiveRecord.cs +++ b/projects/IoT.Shared/Application/Domain/Entities/LiveRecord.cs @@ -7,6 +7,7 @@ namespace Application.Domain.Entities public class LiveRecord : BaseEntity { public string DeviceNumber { get; set; } + public string DeviceName { get; set; } public string Name { get; set; } public string Value { get; set; } } diff --git a/projects/IoT.Shared/Application/Models/EditLiveRecordModel.cs b/projects/IoT.Shared/Application/Models/EditLiveRecordModel.cs new file mode 100644 index 00000000..5e9f415f --- /dev/null +++ b/projects/IoT.Shared/Application/Models/EditLiveRecordModel.cs @@ -0,0 +1,25 @@ +using Infrastructure.Application; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Application.Models +{ + [Display(Name = "回放")] + public class EditLiveRecordModel : EditModel + { + [Display(Name = "设备编号")] + [ReadOnly(true)] + public string DeviceNumber { get; set; } + + [Display(Name = "设备名称")] + [ReadOnly(true)] + public string DeviceName { get; set; } + + [Display(Name = "名称")] + public string Name { get; set; } + + [Display(Name = "文件")] + [ReadOnly(true)] + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/projects/IoT.Shared/Application/Models/ApiSearchModel.cs b/projects/IoT.Shared/Application/Models/SearchApiModel.cs similarity index 83% rename from projects/IoT.Shared/Application/Models/ApiSearchModel.cs rename to projects/IoT.Shared/Application/Models/SearchApiModel.cs index 8aa0ecd8..b9db5161 100644 --- a/projects/IoT.Shared/Application/Models/ApiSearchModel.cs +++ b/projects/IoT.Shared/Application/Models/SearchApiModel.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; namespace Application.Models { - public class ApiSearchModel : PagedListModel + public class SearchApiModel : PagedListModel { [DataType("SelectList")] [Display(Name = "产品")] diff --git a/projects/IoT.Shared/Application/Models/DataSearchModel.cs b/projects/IoT.Shared/Application/Models/SearchDataModel.cs similarity index 87% rename from projects/IoT.Shared/Application/Models/DataSearchModel.cs rename to projects/IoT.Shared/Application/Models/SearchDataModel.cs index 39958006..31368c34 100644 --- a/projects/IoT.Shared/Application/Models/DataSearchModel.cs +++ b/projects/IoT.Shared/Application/Models/SearchDataModel.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; namespace Application.Models { - public class DataSearchModel : PagedListModel + public class SearchDataModel : PagedListModel { [DataType("SelectList")] [Display(Name = "节点")] diff --git a/projects/IoT.Shared/Application/Models/DeviceSearchMode.cs b/projects/IoT.Shared/Application/Models/SearchDeviceMode.cs similarity index 89% rename from projects/IoT.Shared/Application/Models/DeviceSearchMode.cs rename to projects/IoT.Shared/Application/Models/SearchDeviceMode.cs index 762dca90..7d043ddb 100644 --- a/projects/IoT.Shared/Application/Models/DeviceSearchMode.cs +++ b/projects/IoT.Shared/Application/Models/SearchDeviceMode.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; namespace Application.Models { - public class DeviceSearchMode : PagedListModel + public class SearchDeviceMode : PagedListModel { [DataType("SelectList")] [Display(Name = "节点")] diff --git a/projects/IoT.Shared/Application/Models/SearchLiveRecordModel.cs b/projects/IoT.Shared/Application/Models/SearchLiveRecordModel.cs new file mode 100644 index 00000000..c7a7f616 --- /dev/null +++ b/projects/IoT.Shared/Application/Models/SearchLiveRecordModel.cs @@ -0,0 +1,15 @@ +using Infrastructure.Application; +using System.ComponentModel.DataAnnotations; + +namespace Application.Models +{ + public class SearchLiveRecordModel : PagedListModel + { + [DataType("SelectList")] + [Display(Name = "摄像头")] + public string DeviceNumber { get; set; } + + [Display(Name = "关键词")] + public string Keyword { get; set; } + } +} \ No newline at end of file diff --git a/projects/IoT.Shared/Areas/Admin/Controlls/AjaxController.cs b/projects/IoT.Shared/Areas/Admin/Controlls/AjaxController.cs index ddacc137..2276a0e1 100644 --- a/projects/IoT.Shared/Areas/Admin/Controlls/AjaxController.cs +++ b/projects/IoT.Shared/Areas/Admin/Controlls/AjaxController.cs @@ -252,6 +252,16 @@ namespace IoT.Shared.Areas.Admin.Controlls #endregion Api + public SelectList GetCameraSelectList(string deviceNumber) + { + var list = this._deviceRepo.ReadOnlyTable() + .Where(o => o.Product.Number == "onvifcamera") + .WhereIf(!string.IsNullOrEmpty(deviceNumber), o => o.Number == deviceNumber) + .Select(o => new { Id = o.Number, Name = o.DisplayName }) + .ToList(); + return new SelectList(list, "Id", "Name", deviceNumber); + } + public JsonResult CronValid(string cron) { try diff --git a/projects/IoT.Shared/Areas/Admin/Controlls/ApiController.cs b/projects/IoT.Shared/Areas/Admin/Controlls/ApiController.cs index 5fd36598..c6cb438d 100644 --- a/projects/IoT.Shared/Areas/Admin/Controlls/ApiController.cs +++ b/projects/IoT.Shared/Areas/Admin/Controlls/ApiController.cs @@ -12,7 +12,7 @@ namespace IoT.Shared.Areas.Admin.Controlls { [Authorize] [Area(nameof(Admin))] - public class ApiController : CrudController + public class ApiController : CrudController { private readonly AjaxController _ajax; @@ -26,7 +26,7 @@ namespace IoT.Shared.Areas.Admin.Controlls return query.Include(o => o.Product); } - public override IQueryable Query(ApiSearchModel model, IQueryable query) + public override IQueryable Query(SearchApiModel model, IQueryable query) { ViewData.SelectList(o => model.ProductId, () => this._ajax.GetProductSelectList(model.ProductId)); return query.WhereIf(model.ProductId.HasValue, o => o.ProductId == model.ProductId.Value) diff --git a/projects/IoT.Shared/Areas/Admin/Controlls/DataController.cs b/projects/IoT.Shared/Areas/Admin/Controlls/DataController.cs index a9d29b44..57f6b934 100644 --- a/projects/IoT.Shared/Areas/Admin/Controlls/DataController.cs +++ b/projects/IoT.Shared/Areas/Admin/Controlls/DataController.cs @@ -12,7 +12,7 @@ namespace IoT.Shared.Areas.Admin.Controlls { [Authorize] [Area(nameof(Admin))] - public class DataController : SharedController + public class DataController : SharedController { private readonly IRepository _nodeRepo; private readonly AjaxController _ajax; @@ -28,7 +28,7 @@ namespace IoT.Shared.Areas.Admin.Controlls return query.Include(o => o.Device).ThenInclude(o => o.Node); } - public override IQueryable Query(DataSearchModel model, IQueryable query) + public override IQueryable Query(SearchDataModel model, IQueryable query) { ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue); diff --git a/projects/IoT.Shared/Areas/Admin/Controlls/DeviceController.cs b/projects/IoT.Shared/Areas/Admin/Controlls/DeviceController.cs index d74695d1..80af9261 100644 --- a/projects/IoT.Shared/Areas/Admin/Controlls/DeviceController.cs +++ b/projects/IoT.Shared/Areas/Admin/Controlls/DeviceController.cs @@ -12,7 +12,7 @@ namespace IoT.Shared.Areas.Admin.Controlls { [Authorize] [Area(nameof(Admin))] - public class DeviceController : SharedController + public class DeviceController : SharedController { private readonly AjaxController _ajax; @@ -26,7 +26,7 @@ namespace IoT.Shared.Areas.Admin.Controlls return query.Include(o => o.Product).Include(o => o.Node); } - public override IQueryable Query(DeviceSearchMode model, IQueryable query) + public override IQueryable Query(SearchDeviceMode model, IQueryable query) { if (model == null) { diff --git a/projects/IoT.Shared/Areas/Admin/Controlls/LiveRecordController.cs b/projects/IoT.Shared/Areas/Admin/Controlls/LiveRecordController.cs new file mode 100644 index 00000000..8e4b6cd2 --- /dev/null +++ b/projects/IoT.Shared/Areas/Admin/Controlls/LiveRecordController.cs @@ -0,0 +1,32 @@ +using System.Linq; +using Application.Domain.Entities; +using Application.Models; +using Infrastructure.Application; +using Infrastructure.Data; +using Infrastructure.Extensions; +using Infrastructure.Web.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace IoT.Shared.Areas.Admin.Controlls +{ + [Authorize] + [Area(nameof(Admin))] + public class LiveRecordController : CrudController + { + private readonly AjaxController _ajax; + + public LiveRecordController(IRepository repo, AjaxController ajax) : base(repo) + { + this._ajax = ajax; + } + + public override IQueryable Query(SearchLiveRecordModel model, IQueryable query) + { + ViewData.SelectList(o => model.DeviceNumber, () => this._ajax.GetCameraSelectList(model.DeviceNumber)); + return query + .WhereIf(!string.IsNullOrEmpty(model.DeviceNumber), o => o.DeviceNumber == model.DeviceNumber) + .WhereIf(!string.IsNullOrEmpty(model.Keyword), o => o.DeviceName.Contains(model.Keyword) || o.Name.Contains(model.Keyword)); + } + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml b/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml new file mode 100644 index 00000000..28231515 --- /dev/null +++ b/projects/IoTCenter/Areas/Admin/Views/LiveRecord/Details.cshtml @@ -0,0 +1,20 @@ +@model EditLiveRecordModel +@{ + HtmlTitle = Model.Name; +} + +@section scripts{ + + +} \ No newline at end of file diff --git a/projects/IoTCenter/Areas/Admin/Views/Shared/_Menu.cshtml b/projects/IoTCenter/Areas/Admin/Views/Shared/_Menu.cshtml index 14a70153..de097001 100644 --- a/projects/IoTCenter/Areas/Admin/Views/Shared/_Menu.cshtml +++ b/projects/IoTCenter/Areas/Admin/Views/Shared/_Menu.cshtml @@ -24,6 +24,7 @@
  • 接口管理
  • 参数管理
  • 命令管理
  • +
  • 回放管理
  • 场景管理
  • 场景命令管理
  • 定时器管理
  • diff --git a/projects/IoTCenter/Controllers/AppController.cs b/projects/IoTCenter/Controllers/AppController.cs index 37ae3d67..94cc0a58 100644 --- a/projects/IoTCenter/Controllers/AppController.cs +++ b/projects/IoTCenter/Controllers/AppController.cs @@ -268,8 +268,9 @@ namespace IoTCenter.Controllers this._liveRecordRepo.Add(new LiveRecord { DeviceNumber = deviceNumber, - Name = $"{device?.DisplayName}回放{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}", - Value = $"video{result["file"].Substring(result["file"].LastIndexOf('/'))}" + DeviceName = device?.DisplayName, + Name = $"回放{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}", + Value = $"/video{result["file"].Substring(result["file"].LastIndexOf('/'))}" }); this._liveRecordRepo.SaveChanges(); } diff --git a/publish/src/linux-x64/publish/apps/srs/conf/srs.conf b/publish/src/linux-x64/publish/apps/srs/conf/srs.conf index c4af8cfb..e8e597f8 100644 --- a/publish/src/linux-x64/publish/apps/srs/conf/srs.conf +++ b/publish/src/linux-x64/publish/apps/srs/conf/srs.conf @@ -36,8 +36,8 @@ vhost __defaultVhost__ { dvr { enabled off; dvr_path ./objs/nginx/html/[app].[stream].[timestamp].flv; - dvr_plan session; - dvr_duration 30; + dvr_plan segment; + dvr_duration 600; dvr_wait_keyframe on; time_jitter full; }