Nice
3 years ago
16 changed files with 570 additions and 0 deletions
@ -0,0 +1,25 @@ |
|||||
|
|
||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
|
# Visual Studio Version 17 |
||||
|
VisualStudioVersion = 17.0.31903.59 |
||||
|
MinimumVisualStudioVersion = 10.0.40219.1 |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReptileCaptures", "ReptileCaptures\ReptileCaptures.csproj", "{6C8B6841-164D-4E1C-96E2-112A8EB3209A}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{6C8B6841-164D-4E1C-96E2-112A8EB3209A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{6C8B6841-164D-4E1C-96E2-112A8EB3209A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{6C8B6841-164D-4E1C-96E2-112A8EB3209A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{6C8B6841-164D-4E1C-96E2-112A8EB3209A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {3C52CE1A-23FF-4447-B7B0-26C6704DC9F9} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
@ -0,0 +1,11 @@ |
|||||
|
namespace PC |
||||
|
{ |
||||
|
internal class ImagesInfo |
||||
|
{ |
||||
|
public string CaptureUrl { get; set; } |
||||
|
public string CamName { get; set; } |
||||
|
public string CamIndexCode { get; set; } |
||||
|
public string CaptureId { get; set; } |
||||
|
public DateTime CaptureTime { get; set; } |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC |
||||
|
{ |
||||
|
internal class Page<PageSource> |
||||
|
{ |
||||
|
public string Code { get; set; } |
||||
|
public PageSource Data { get; set; } |
||||
|
public string Msg { get; set; } |
||||
|
} |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC |
||||
|
{ |
||||
|
public class SearchRegionTree |
||||
|
{ |
||||
|
public List<SearchRegion> Rows { get; set; } |
||||
|
} |
||||
|
public class SearchRegion |
||||
|
{ |
||||
|
public string Id { get; set; } |
||||
|
public string PId { get; set; } |
||||
|
public string Name { get; set; } |
||||
|
} |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Security.Cryptography; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC.Entites |
||||
|
{ |
||||
|
internal class Entity |
||||
|
{ |
||||
|
private static readonly RandomNumberGenerator RandomNumberGenerator = RandomNumberGenerator.Create(); |
||||
|
/// <summary>
|
||||
|
/// 主键Id
|
||||
|
/// </summary>
|
||||
|
public Guid Id { get; private set; } |
||||
|
protected Guid NewId() |
||||
|
{ |
||||
|
var randomBytes = new byte[10]; |
||||
|
RandomNumberGenerator.GetBytes(randomBytes); |
||||
|
|
||||
|
long timestamp = DateTime.UtcNow.Ticks / 10000L; |
||||
|
|
||||
|
byte[] timestampBytes = BitConverter.GetBytes(timestamp); |
||||
|
if (BitConverter.IsLittleEndian) |
||||
|
{ |
||||
|
Array.Reverse(timestampBytes); |
||||
|
} |
||||
|
|
||||
|
byte[] guidBytes = new byte[16]; |
||||
|
Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 10); |
||||
|
Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6); |
||||
|
|
||||
|
Id = new Guid(guidBytes); |
||||
|
return Id; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,48 @@ |
|||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC.Entites |
||||
|
{ |
||||
|
internal class ODbContext : DbContext |
||||
|
{ |
||||
|
private readonly IConfiguration Configuration; |
||||
|
public ODbContext(IConfiguration configuration) |
||||
|
{ |
||||
|
Configuration = configuration; |
||||
|
} |
||||
|
public DbSet<ReptileCapture> ReptileCaptures { get; set; } |
||||
|
public DbSet<ReptileRegion> ReptileRegions { get; set; } |
||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) |
||||
|
{ |
||||
|
optionsBuilder.UseSqlServer(Configuration["SqlConnection"]); |
||||
|
base.OnConfiguring(optionsBuilder); |
||||
|
} |
||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
modelBuilder.Entity<ReptileCapture>(o => |
||||
|
{ |
||||
|
o.ToTable(nameof(ReptileCapture)); |
||||
|
o.HasKey(o => o.Id); |
||||
|
o.Property(o => o.RegionId).HasColumnType("nvarchar(50)").HasColumnName("RegionId"); |
||||
|
o.Property(o => o.CaptureTime).HasColumnType("datetime").HasColumnName("CaptureTime"); |
||||
|
o.Property(o => o.CaptureUrl).HasColumnType("nvarchar(100)").HasColumnName("CaptureUrl"); |
||||
|
o.Property(o => o.CaptureId).HasColumnType("nvarchar(50)").HasColumnName("CaptureId"); |
||||
|
}); |
||||
|
|
||||
|
modelBuilder.Entity<ReptileRegion>(o => |
||||
|
{ |
||||
|
o.ToTable(nameof(ReptileRegion)); |
||||
|
o.HasKey(o => o.Id); |
||||
|
o.Property(o => o.RegionId).HasColumnType("nvarchar(50)").HasColumnName("RegionId"); |
||||
|
o.Property(o => o.RegionPId).HasColumnType("nvarchar(50)").HasColumnName("RegionPId"); |
||||
|
o.Property(o => o.RegionName).HasColumnType("nvarchar(50)").HasColumnName("RegionName"); |
||||
|
}); |
||||
|
base.OnModelCreating(modelBuilder); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC.Entites |
||||
|
{ |
||||
|
internal class ReptileCapture : Entity |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 图片地址
|
||||
|
/// </summary>
|
||||
|
public string CaptureUrl { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 区域Id
|
||||
|
/// </summary>
|
||||
|
public string RegionId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 图片时间
|
||||
|
/// </summary>
|
||||
|
public DateTime CaptureTime { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 图片Id
|
||||
|
/// </summary>
|
||||
|
public string CaptureId { get; set; } |
||||
|
public ReptileCapture Create() |
||||
|
{ |
||||
|
NewId(); |
||||
|
return this; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC.Entites |
||||
|
{ |
||||
|
internal class ReptileRegion : Entity |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 区域父Id
|
||||
|
/// </summary>
|
||||
|
public string RegionPId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 区域名称
|
||||
|
/// </summary>
|
||||
|
public string RegionName { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 区域Id
|
||||
|
/// </summary>
|
||||
|
public string RegionId { get; set; } |
||||
|
|
||||
|
|
||||
|
public ReptileRegion Create() |
||||
|
{ |
||||
|
NewId(); |
||||
|
return this; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,52 @@ |
|||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using OpenQA.Selenium; |
||||
|
|
||||
|
namespace PC |
||||
|
{ |
||||
|
public class Manage |
||||
|
{ |
||||
|
/// 登录
|
||||
|
public static void Login(IWebDriver driver) |
||||
|
{ |
||||
|
Thread.Sleep(3000); |
||||
|
driver.FindElement(By.CssSelector("#app > div > div > div.container.login-page > div.container.fullscreen-layout > div.m-main-content > div > div > form > div:nth-child(1) > div > div.login-input.has-prepend.el-input.el-input--prefix > input")). |
||||
|
SendKeys("admin"); |
||||
|
driver.FindElement(By.CssSelector("#app > div > div > div.container.login-page > div.container.fullscreen-layout > div.m-main-content > div > div > form > div:nth-child(2) > div > div.login-input.has-prepend.el-input.el-input--prefix > input")). |
||||
|
SendKeys("hik12345+"); |
||||
|
driver.FindElement(By.CssSelector("#app > div > div > div.container.login-page > div.container.fullscreen-layout > div.m-main-content > div > div > form > div:nth-child(5) > div > button")). |
||||
|
Click(); |
||||
|
Thread.Sleep(5000); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//查询
|
||||
|
public static void Query(IWebDriver driver) |
||||
|
{ |
||||
|
Thread.Sleep(3000); |
||||
|
driver.FindElement(By.XPath(@"//*[@id=""app""]/div/section/aside/div/div/div/div/div[2]/button")).Click(); |
||||
|
Thread.Sleep(3000); |
||||
|
} |
||||
|
|
||||
|
//点击城市复选框
|
||||
|
public static void ClickCity(IWebDriver driver) |
||||
|
{ |
||||
|
Thread.Sleep(3000); |
||||
|
////*[@id="app"]/div/section/aside/div/div/div/div/div[1]/div[3]/div[1]/div[1]/div/div/div/div[1]/label
|
||||
|
driver.FindElement(By.XPath(@"//*[@id=""app""]/div/section/aside/div/div/div/div/div[1]/div[3]/div[1]/div[1]/div/div/div/div[1]/label")).Click(); |
||||
|
Thread.Sleep(3000); |
||||
|
} |
||||
|
|
||||
|
public static async Task<string> DownImageNameAsync(IConfiguration configuration, string url) |
||||
|
{ |
||||
|
using HttpClient httpClient = new(); |
||||
|
var imageResponse = await httpClient.GetAsync(url); |
||||
|
imageResponse.EnsureSuccessStatusCode(); |
||||
|
using Stream stream = imageResponse.Content.ReadAsStream(); |
||||
|
string imageName = @$"{Guid.NewGuid()}.jpg"; |
||||
|
string path = configuration["Path"]; |
||||
|
using Stream saveStream = File.Create($"{path}\\{imageName}"); |
||||
|
stream.CopyTo(saveStream); |
||||
|
return imageName; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,142 @@ |
|||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Newtonsoft.Json; |
||||
|
using OpenQA.Selenium; |
||||
|
using OpenQA.Selenium.Chrome; |
||||
|
using OpenQA.Selenium.DevTools.V95; |
||||
|
using OpenQA.Selenium.DevTools.V95.Network; |
||||
|
using PC; |
||||
|
using PC.Entites; |
||||
|
using PC.Repositories; |
||||
|
using System.Collections.ObjectModel; |
||||
|
|
||||
|
IServiceCollection serviceCollection = new ServiceCollection(); |
||||
|
serviceCollection.AddTransient<IConfiguration>(o => new ConfigurationBuilder() |
||||
|
.SetBasePath(Directory.GetCurrentDirectory()) |
||||
|
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) |
||||
|
.Build() |
||||
|
); |
||||
|
serviceCollection.AddDbContext<ODbContext>(); |
||||
|
serviceCollection.AddTransient<IReptileCaptureRespository, ReptileCaptureRespository>(); |
||||
|
serviceCollection.AddTransient<IReptileRegionRespository, ReptileRegionRespository>(); |
||||
|
IServiceProvider service = serviceCollection.BuildServiceProvider(); |
||||
|
|
||||
|
IReptileCaptureRespository reptileCaptureRespository = service.GetService<IReptileCaptureRespository>(); |
||||
|
IReptileRegionRespository reptileRegionRespository = service.GetService<IReptileRegionRespository>(); |
||||
|
ChromeOptions options = new(); |
||||
|
options.AddArgument("--auto-open-devtools-for-tabs"); |
||||
|
options.AddArgument("log-level=3"); |
||||
|
int successCount = 1; |
||||
|
int errorCount = 1; |
||||
|
Console.WriteLine($"项目运行"); |
||||
|
while (true) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
Console.WriteLine($"爬虫启动运行{successCount}次"); |
||||
|
using (ChromeDriver driver = new(options)) |
||||
|
{ |
||||
|
driver.Manage().Window.Maximize(); |
||||
|
driver.Navigate().GoToUrl("http://39.98.181.39/portal/ui/login?service=http%3A%2F%2F39.98.181.39%3A80%2Fportal%2F"); |
||||
|
var domain = driver.GetDevToolsSession().GetVersionSpecificDomains<DevToolsSessionDomains>(); |
||||
|
await domain.Network.Enable(new EnableCommandSettings()); |
||||
|
await domain.Network.EnableReportingApi(new EnableReportingApiCommandSettings()); |
||||
|
//登录
|
||||
|
Manage.Login(driver); |
||||
|
List<RequestWillBeSentEventArgs> requestWillBeSentEventArgs = new(); |
||||
|
domain.Network.RequestWillBeSent += (se, e) => |
||||
|
{ |
||||
|
if (e.Type == OpenQA.Selenium.DevTools.V95.Network.ResourceType.XHR) |
||||
|
{ |
||||
|
if (e.Request.Method == "GET") |
||||
|
{ |
||||
|
if (e.Request.Url.Contains("vms/ui/unit/fetchUnitNodesByParent") || |
||||
|
e.Request.Url.Contains("vms/ui/camera/fetchCaptureCamsPageQuery")) |
||||
|
{ |
||||
|
requestWillBeSentEventArgs.Add(e); |
||||
|
} |
||||
|
} |
||||
|
else if (e.Request.Method == "POST") |
||||
|
{ |
||||
|
if (e.Request.Url.Contains("vms/ui/captureInfo/fetchCaptureInfoByCam")) |
||||
|
{ |
||||
|
requestWillBeSentEventArgs.Add(e); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
//图片查询
|
||||
|
driver.FindElement(By.CssSelector("#bottomWrapper > div.page.sub-page-container.page-show > div.container.home-page.is-overdue > div > div > div > div.list-content > div.list-nav.el-scrollbar.has-gutter > div.el-nav-scrollbar__wrap.el-scrollbar__wrap > div > div > div.m-list-ctn > div:nth-child(3) > div.content.cf > div:nth-child(3) > img")). |
||||
|
Click(); |
||||
|
//进入
|
||||
|
IWebElement iframe = driver.FindElement(By.CssSelector("#iframe000026")); |
||||
|
driver.SwitchTo().Frame(iframe); |
||||
|
|
||||
|
//点击城市复选框
|
||||
|
Manage.ClickCity(driver); |
||||
|
//查询
|
||||
|
Manage.Query(driver); |
||||
|
|
||||
|
ReadOnlyCollection<IWebElement> selectRegionTrees = driver.FindElements( |
||||
|
By.XPath(@"//*[@id=""app""]/div/section/aside/div/div/div/div/div[1]/div[3]/div[1]/div[1]/div/div/div/div[2]/div")); |
||||
|
foreach (IWebElement selectRegionTree in selectRegionTrees) |
||||
|
{ |
||||
|
//点击下拉框 展示节点
|
||||
|
selectRegionTree.FindElement(By.XPath("div/span[1]")).Click(); |
||||
|
Thread.Sleep(1000); |
||||
|
selectRegionTree.FindElement(By.XPath("div/span[1]")).Click(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
foreach (var e in requestWillBeSentEventArgs) |
||||
|
{ |
||||
|
if (e.Request.Method == "GET") |
||||
|
{ |
||||
|
if (e.Request.Url.Contains("vms/ui/unit/fetchUnitNodesByParent") || |
||||
|
e.Request.Url.Contains("vms/ui/camera/fetchCaptureCamsPageQuery")) |
||||
|
{ |
||||
|
var responseBody = await domain.Network.GetResponseBody(new GetResponseBodyCommandSettings() |
||||
|
{ |
||||
|
RequestId = e.RequestId |
||||
|
}); |
||||
|
Page<SearchRegionTree> page = JsonConvert.DeserializeObject<Page<SearchRegionTree>>(responseBody.Body); |
||||
|
|
||||
|
foreach (var Row in page.Data.Rows) |
||||
|
{ |
||||
|
await reptileRegionRespository.AddOrUpdateRegionAsync(new IReptileRegionRespository |
||||
|
.RegionDTO(Row.PId, Row.Name, Row.Id)); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
else if (e.Request.Method == "POST") |
||||
|
{ |
||||
|
if (e.Request.Url.Contains("vms/ui/captureInfo/fetchCaptureInfoByCam")) |
||||
|
{ |
||||
|
var responseBody = await domain.Network.GetResponseBody(new GetResponseBodyCommandSettings() |
||||
|
{ |
||||
|
RequestId = e.RequestId |
||||
|
}); |
||||
|
Page<List<ImagesInfo>> page = JsonConvert.DeserializeObject<Page<List<ImagesInfo>>>(responseBody.Body); |
||||
|
foreach (var data in page.Data) |
||||
|
{ |
||||
|
await reptileCaptureRespository.NotNullAddCaptureAsync(new IReptileCaptureRespository |
||||
|
.CaptureDTO(data.CaptureUrl, data.CamIndexCode, data.CaptureTime, data.CaptureId)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
Console.WriteLine(@$"任务完成{successCount}次,延迟1800000毫秒,约半小时"); |
||||
|
successCount++; |
||||
|
Thread.Sleep(1800000); |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
Console.WriteLine($"进入异常{errorCount}次"); |
||||
|
errorCount++; |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,23 @@ |
|||||
|
namespace PC.Repositories |
||||
|
{ |
||||
|
internal interface IReptileCaptureRespository |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 添加请求参数
|
||||
|
/// </summary>
|
||||
|
/// <param name="CaptureUrl">图片地址</param>
|
||||
|
/// <param name="RegionId">区域Id</param>
|
||||
|
/// <param name="CaptureTime">图片日期</param>
|
||||
|
/// <param name="CaptureId">图片Id</param>
|
||||
|
record CaptureDTO( |
||||
|
string CaptureUrl, |
||||
|
string RegionId, |
||||
|
DateTime CaptureTime, |
||||
|
string CaptureId); |
||||
|
/// <summary>
|
||||
|
/// 添加图片
|
||||
|
/// </summary>
|
||||
|
Task NotNullAddCaptureAsync(CaptureDTO captureDTO); |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
namespace PC.Repositories |
||||
|
{ |
||||
|
internal interface IReptileRegionRespository |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 区域
|
||||
|
/// </summary>
|
||||
|
/// <param name="RegionPId">区域父Id</param>
|
||||
|
/// <param name="RegionName">区域名称</param>
|
||||
|
/// <param name="RegionId">区域Id</param>
|
||||
|
record RegionDTO( |
||||
|
string RegionPId, |
||||
|
string RegionName, |
||||
|
string RegionId); |
||||
|
/// <summary>
|
||||
|
/// 添加或者修改 区域
|
||||
|
/// </summary>
|
||||
|
Task AddOrUpdateRegionAsync(RegionDTO regionDTO); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using PC.Entites; |
||||
|
|
||||
|
namespace PC.Repositories |
||||
|
{ |
||||
|
internal class ReptileCaptureRespository : IReptileCaptureRespository |
||||
|
{ |
||||
|
private readonly ODbContext _oDbContext; |
||||
|
public ReptileCaptureRespository(ODbContext oDbContext, IConfiguration configuration) |
||||
|
{ |
||||
|
_oDbContext = oDbContext; |
||||
|
Configuration = configuration; |
||||
|
} |
||||
|
private readonly IConfiguration Configuration; |
||||
|
|
||||
|
public async Task AddCaptureAsync(IReptileCaptureRespository.CaptureDTO captureDTO) |
||||
|
{ |
||||
|
string imageURL = await Manage.DownImageNameAsync(Configuration, captureDTO.CaptureUrl); |
||||
|
await _oDbContext.ReptileCaptures.AddAsync(new ReptileCapture() |
||||
|
{ |
||||
|
CaptureTime = captureDTO.CaptureTime, |
||||
|
RegionId = captureDTO.RegionId, |
||||
|
CaptureUrl = imageURL, |
||||
|
CaptureId = captureDTO.CaptureId, |
||||
|
}.Create()); |
||||
|
_oDbContext.SaveChanges(); |
||||
|
} |
||||
|
public async Task NotNullAddCaptureAsync(IReptileCaptureRespository.CaptureDTO captureDTO) |
||||
|
{ |
||||
|
var region = _oDbContext.ReptileCaptures.FirstOrDefault(o => o.CaptureId == captureDTO.CaptureId); |
||||
|
if (region is null) |
||||
|
await AddCaptureAsync(captureDTO); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
using PC.Entites; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace PC.Repositories |
||||
|
{ |
||||
|
internal class ReptileRegionRespository : IReptileRegionRespository |
||||
|
{ |
||||
|
private readonly ODbContext _oDbContext; |
||||
|
public ReptileRegionRespository(ODbContext oDbContext) |
||||
|
{ |
||||
|
_oDbContext = oDbContext; |
||||
|
} |
||||
|
|
||||
|
public async Task AddRegionAsync(IReptileRegionRespository.RegionDTO regionDTO) |
||||
|
{ |
||||
|
await _oDbContext.ReptileRegions.AddAsync(new ReptileRegion() |
||||
|
{ |
||||
|
RegionId = regionDTO.RegionId, |
||||
|
RegionName = regionDTO.RegionName, |
||||
|
RegionPId = regionDTO.RegionPId, |
||||
|
}.Create()); |
||||
|
_oDbContext.SaveChanges(); |
||||
|
} |
||||
|
|
||||
|
public async Task AddOrUpdateRegionAsync(IReptileRegionRespository.RegionDTO regionDTO) |
||||
|
{ |
||||
|
var region = _oDbContext.ReptileRegions.FirstOrDefault(o => o.RegionId == regionDTO.RegionId); |
||||
|
if (region != null) |
||||
|
{ |
||||
|
if (region.RegionName != regionDTO.RegionName) |
||||
|
{ |
||||
|
region.RegionName = regionDTO.RegionName; |
||||
|
_oDbContext.ReptileRegions.Update(region); |
||||
|
await _oDbContext.SaveChangesAsync(); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
await AddRegionAsync(regionDTO); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<OutputType>Exe</OutputType> |
||||
|
<TargetFramework>net6.0</TargetFramework> |
||||
|
<ImplicitUsings>enable</ImplicitUsings> |
||||
|
|
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" /> |
||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0" /> |
||||
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" /> |
||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" /> |
||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> |
||||
|
<PackageReference Include="Selenium.Support" Version="4.0.1" /> |
||||
|
<PackageReference Include="Selenium.WebDriver" Version="4.0.1" /> |
||||
|
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="96.0.4664.4500" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<None Update="appsettings.json"> |
||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
||||
|
</None> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"SqlConnection": "Data Source=192.168.2.166;Initial Catalog=InsectTrappingDb_Business;User ID=sa;Password=Athlon123;", |
||||
|
"Path": "D:\\IotSystem\\InsectTrapping.Business.Web\\wwwroot\\Upload\\ReptileCaptures" |
||||
|
} |
Loading…
Reference in new issue