using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using New_College.IServices;
using New_College.Model;
using New_College.Model.Models;
using New_College.Model.Request;
using New_College.Model.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace New_College.Api.Controllers.Front
{
[Route("api/front/[controller]/[action]")]
[ApiController]
public class NewsInfoController : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly ID_NewsCategoryServices iD_NewsCategory;
private readonly ID_NewsInfoServices d_NewsInfo;
public NewsInfoController(ID_NewsCategoryServices d_NewsCategoryServices, ID_NewsInfoServices d_NewsInfoServices, IConfiguration configuration)
{
this.iD_NewsCategory = d_NewsCategoryServices;
this.d_NewsInfo = d_NewsInfoServices;
this._configuration = configuration;
}
///
/// 校验新闻导入Key
///
///
private bool CheckNewsImportKey()
{
var configKey = _configuration["newskey"];
if (string.IsNullOrWhiteSpace(configKey))
{
return false;
}
if (!Request.Headers.TryGetValue("X-Import-Key", out var requestKey))
{
return false;
}
return string.Equals(requestKey.ToString(), configKey, StringComparison.Ordinal);
}
///
/// 获取新闻分类
///
///
[HttpGet]
public async Task>> GetNewsCategory()
{
return new MessageModel>()
{
msg = "ok",
success = true,
response = (await iD_NewsCategory.Query(c => c.IsDelete == false)).Select(c => new NewsClassCategoryResponse()
{
Sort = c.OrderSort,
CategoryName = c.CategoryName,
Id = c.Id
}).OrderBy(c => c.Sort).ToList(),
};
}
///
/// 获取top多少的新闻
///
///
///
[HttpGet]
public async Task>> GetTopNews([FromQuery] NewsRequest request)
{
try
{
var list = new List();
var query = (await d_NewsInfo.Query(e => e.IsDelete == false && e.CategoryId == request.CategoryId && e.ProvinceCode == request.provinceCode, " CreateTime desc")).Take(request.Top).OrderByDescending(s => s.Id);
list = query.Select(s => new NewsInfoResponse
{
CoverImg = s.CoverImg,
CreateTime = s.CreateTime.Value,
Source = s.Author,
Id = s.Id,
Title = s.Title,
Summary = s.Summary,
}).ToList();
return new MessageModel>()
{
msg = "success",
success = true,
response = list
};
}
catch (Exception ex)
{
return new MessageModel>()
{
msg = ex.Message
};
}
}
///
/// 所有新闻列表带分页
///
///
///
[HttpGet]
public async Task>> GetPageNews([FromQuery] NewsPageRequest request)
{
var pageresponse = new PageModel();
try
{
///
var pageinfo = await d_NewsInfo.QueryPage(w => w.CategoryId == request.CategoryId && w.ProvinceCode == request.provinceCode, request.PageIndex, request.PageSize, "CreateTime desc");
if (pageinfo.data.Any())
{
pageresponse.data = pageinfo.data.Select(s => new NewsInfoResponse()
{
CoverImg = s.CoverImg,
CreateTime = s.CreateTime.Value,
Id = s.Id,
Summary = !string.IsNullOrWhiteSpace(s.Summary) ? s.Summary : s.Detail.Substring(0, 200) + "...",
Title = s.Title,
Source = s.Author
}).ToList();
pageresponse.pageCount = pageinfo.pageCount;
pageresponse.page = pageinfo.page;
pageresponse.dataCount = pageinfo.dataCount;
pageresponse.PageSize = pageinfo.PageSize;
pageresponse.pageCount = pageinfo.pageCount;
}
return new MessageModel>()
{
msg = "success",
response = pageresponse,
success = true
};
}
catch (Exception ex)
{
return new MessageModel>()
{
msg = "fail",
success = false
};
}
}
///
/// 根据Id 获取新闻详情
///
///
///
[HttpGet]
public async Task> GetDetail([FromQuery] NewsDetailRequest request)
{
try
{
var result = new NewsDetailInfoResponse();
var single = await d_NewsInfo.QueryById(request.Id);
result.Author = single.Author;
result.Click = single.Click;
result.CoverImg = single.CoverImg;
result.CreateTime = single.CreateTime.Value;
result.Id = single.Id;
result.Summary = single.Summary;
result.Title = single.Title;
result.Detail = single.Detail;
return new MessageModel()
{
msg = "success",
response = result,
success = true
};
}
catch (Exception ex)
{
return new MessageModel()
{
msg = ex.Message
};
}
}
///
/// 单独写入新闻资讯
///
///
///
[HttpPost]
[AllowAnonymous]
public async Task> AddNewsInfo([FromBody] NewsInfoAddRequest request)
{
try
{
if (!CheckNewsImportKey())
{
return new MessageModel()
{
msg = "无权限访问,Key校验失败",
success = false
};
}
if (request == null)
{
return new MessageModel()
{
msg = "参数不能为空",
success = false
};
}
if (request.CategoryId <= 0)
{
return new MessageModel()
{
msg = "新闻分类不能为空",
success = false
};
}
if (string.IsNullOrWhiteSpace(request.Title))
{
return new MessageModel()
{
msg = "新闻标题不能为空",
success = false
};
}
if (string.IsNullOrWhiteSpace(request.ProvinceCode))
{
return new MessageModel()
{
msg = "省份编号不能为空",
success = false
};
}
request.Title = request.Title.Trim();
// 标题判重:标题已存在则不重复添加
var existNews = await d_NewsInfo.Query(s =>
s.IsDelete == false &&
s.Title == request.Title
);
if (existNews != null && existNews.Any())
{
return new MessageModel()
{
msg = "新闻标题已存在,未重复添加",
success = true,
response = 0
};
}
var entity = new D_NewsInfo()
{
CategoryId = request.CategoryId,
Author = request.Author,
ProvinceCode = request.ProvinceCode,
Title = request.Title,
CoverImg = request.CoverImg,
Summary = request.Summary,
Detail = request.Detail,
Click = request.Click,
IsDelete = false,
CreateTime = DateTime.Now
};
var id = await d_NewsInfo.Add(entity);
return new MessageModel()
{
msg = "success",
success = true,
response = id
};
}
catch (Exception ex)
{
return new MessageModel()
{
msg = ex.Message,
success = false
};
}
}
///
/// 批量写入新闻资讯
///
///
///
[HttpPost]
[AllowAnonymous]
public async Task> AddNewsInfoBatch([FromBody] NewsInfoBatchAddRequest request)
{
try
{
if (!CheckNewsImportKey())
{
return new MessageModel()
{
msg = "无权限访问,Key校验失败",
success = false
};
}
if (request == null || request.NewsList == null || !request.NewsList.Any())
{
return new MessageModel()
{
msg = "新闻列表不能为空",
success = false
};
}
var errorList = new List();
for (int i = 0; i < request.NewsList.Count; i++)
{
var item = request.NewsList[i];
if (item.CategoryId <= 0)
{
errorList.Add($"第{i + 1}条新闻分类不能为空");
}
if (string.IsNullOrWhiteSpace(item.Title))
{
errorList.Add($"第{i + 1}条新闻标题不能为空");
}
if (string.IsNullOrWhiteSpace(item.ProvinceCode))
{
errorList.Add($"第{i + 1}条省份编号不能为空");
}
}
if (errorList.Any())
{
return new MessageModel()
{
msg = string.Join(";", errorList),
success = false
};
}
// 处理标题空格
foreach (var item in request.NewsList)
{
item.Title = item.Title.Trim();
}
// 获取本次提交的标题
var requestTitles = request.NewsList
.Select(s => s.Title)
.Distinct()
.ToList();
// 查询数据库中已存在的标题
var existNewsList = await d_NewsInfo.Query(s =>
s.IsDelete == false &&
requestTitles.Contains(s.Title)
);
var existTitleList = existNewsList
.Select(s => s.Title)
.ToList();
var newsList = new List();
// 用于处理本次批量数据内部标题重复
var currentAddTitleList = new List();
foreach (var item in request.NewsList)
{
// 数据库已存在的标题,跳过
if (existTitleList.Contains(item.Title))
{
continue;
}
// 本次批量中已经添加过的标题,跳过
if (currentAddTitleList.Contains(item.Title))
{
continue;
}
currentAddTitleList.Add(item.Title);
newsList.Add(new D_NewsInfo()
{
CategoryId = item.CategoryId,
Author = item.Author,
ProvinceCode = item.ProvinceCode,
Title = item.Title,
CoverImg = item.CoverImg,
Summary = item.Summary,
Detail = item.Detail,
Click = item.Click,
IsDelete = false,
CreateTime = DateTime.Now
});
}
if (!newsList.Any())
{
return new MessageModel()
{
msg = "新闻标题均已存在,未新增数据",
success = true,
response = 0
};
}
var successCount = 0;
foreach (var news in newsList)
{
var id = await d_NewsInfo.Add(news);
if (id > 0)
{
successCount++;
}
}
return new MessageModel()
{
msg = $"success,本次成功新增{successCount}条,跳过重复标题{request.NewsList.Count - successCount}条",
success = true,
response = successCount
};
}
catch (Exception ex)
{
return new MessageModel()
{
msg = ex.Message,
success = false
};
}
}
}
}