添加 共赴宁波之春 报名网页

This commit is contained in:
范露尧
2023-03-09 22:16:03 +08:00
parent 21dd025ab8
commit 5755e9d9b0
44 changed files with 1386 additions and 534 deletions

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net5.0</TargetFramework>
<NoWarn>1701;1702;1591</NoWarn>
<DocumentationFile>Ewide.Core.xml</DocumentationFile>
</PropertyGroup>
@@ -13,12 +13,17 @@
</ItemGroup>
<ItemGroup>
<Compile Remove="Entity\SysTimer.cs" />
<Compile Remove="OAuth\AuthorizeResult.cs" />
<Compile Remove="OAuth\IUserInfoModel.cs" />
<Compile Remove="OAuth\OAuthLoginBase.cs" />
<Compile Remove="Service\Timer\Dto\JobInput.cs" />
<Compile Remove="Service\Timer\Dto\JobOutput.cs" />
<Compile Remove="Service\Timer\HttpJob.cs" />
<Compile Remove="Service\Timer\ISysTimerService.cs" />
<Compile Remove="Service\Timer\SchedulerCenter.cs" />
<Compile Remove="Service\Timer\SchedulerDef.cs" />
<Compile Remove="Service\Timer\SysTimerService.cs" />
</ItemGroup>
<ItemGroup>
@@ -32,7 +37,7 @@
<ItemGroup>
<PackageReference Include="aliyun-net-sdk-core" Version="1.5.10" />
<PackageReference Include="CSRedisCore" Version="3.6.6" />
<PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="4.5.0" />
<PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="4.8.7.6" />
<PackageReference Include="MySql.Data" Version="8.0.29" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.10" />
<PackageReference Include="Quartz" Version="3.3.2" />
@@ -40,11 +45,11 @@
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
<PackageReference Include="UAParser" Version="3.1.46" />
<PackageReference Include="Furion" Version="4.5.0" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.5.0" />
<PackageReference Include="Furion.Extras.DatabaseAccessor.Dapper" Version="4.5.0" />
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="4.5.0" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.5.0" />
<PackageReference Include="Furion" Version="4.8.7.6" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.7.6" />
<PackageReference Include="Furion.Extras.DatabaseAccessor.Dapper" Version="4.8.7.6" />
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="4.8.7.6" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.7.6" />
</ItemGroup>
<ItemGroup>
@@ -62,6 +67,7 @@
<ItemGroup>
<Folder Include="Properties\PublishProfiles\" />
<Folder Include="DataBaseXML\" />
<Folder Include="Service\Timer\Dto\" />
</ItemGroup>
<ItemGroup>

View File

@@ -1616,89 +1616,6 @@
备注
</summary>
</member>
<member name="T:Ewide.Core.SysTimer">
<summary>
定时任务
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.JobName">
<summary>
任务名称
</summary>
<example>ewide</example>
</member>
<member name="P:Ewide.Core.SysTimer.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<!-- Badly formed XML comment ignored for member "P:Ewide.Core.SysTimer.ExecuteType" -->
<member name="P:Ewide.Core.SysTimer.BeginTime">
<summary>
开始时间
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.EndTime">
<summary>
结束时间
</summary>
<example>null</example>
</member>
<member name="P:Ewide.Core.SysTimer.Cron">
<summary>
Cron表达式
</summary>
<example></example>
</member>
<member name="P:Ewide.Core.SysTimer.RunNumber">
<summary>
执行次数(默认无限循环)
</summary>
<example>10</example>
</member>
<member name="P:Ewide.Core.SysTimer.Interval">
<summary>
执行间隔时间单位秒如果有Cron则IntervalSecond失效
</summary>
<example>5</example>
</member>
<member name="P:Ewide.Core.SysTimer.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.RequestParameters">
<summary>
请求参数PostPut请求用
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.Headers">
<summary>
Headers(可以包含如Authorization授权认证)
格式:{"Authorization":"userpassword.."}
</summary>
</member>
<member name="P:Ewide.Core.SysTimer.RequestType">
<summary>
请求类型
</summary>
<example>2</example>
</member>
<member name="P:Ewide.Core.SysTimer.Remark">
<summary>
备注
</summary>
</member>
<member name="T:Ewide.Core.SysUser">
<summary>
用户表
@@ -6461,419 +6378,6 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="T:Ewide.Core.Service.JobPageInput">
<summary>
任务调度参数
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.JobName">
<summary>
任务名称
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.ExecuteType">
<summary>
执行类型(并行、列队)
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.Interval">
<summary>
执行间隔时间(单位秒)
</summary>
<example>5</example>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.Cron">
<summary>
Cron表达式
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.RequestParameters">
<summary>
请求参数PostPut请求用
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.Headers">
<summary>
Headers(可以包含如Authorization授权认证)
格式:{"Authorization":"userpassword.."}
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.RequestType">
<summary>
请求类型
</summary>
</member>
<member name="P:Ewide.Core.Service.JobPageInput.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.JobName">
<summary>
任务名称
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.ExecuteType">
<summary>
执行类型(并行、列队)
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.Interval">
<summary>
执行间隔时间(单位秒)
</summary>
<example>5</example>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.Cron">
<summary>
Cron表达式
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.RequestParameters">
<summary>
请求参数PostPut请求用
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.Headers">
<summary>
Headers(可以包含如Authorization授权认证)
格式:{"Authorization":"userpassword.."}
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.RequestType">
<summary>
请求类型
</summary>
</member>
<member name="P:Ewide.Core.Service.AddJobInput.Remark">
<summary>
备注
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.JobName">
<summary>
任务名称
</summary>
<example>dilon</example>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.ExecuteType">
<summary>
执行类型(并行、列队)
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.Interval">
<summary>
执行间隔时间(单位秒)
</summary>
<example>5</example>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.Cron">
<summary>
Cron表达式
</summary>
<example></example>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.RequestParameters">
<summary>
请求参数PostPut请求用
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.Headers">
<summary>
Headers(可以包含如Authorization授权认证)
格式:{"Authorization":"userpassword.."}
</summary>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.RequestType">
<summary>
请求类型
</summary>
<example>2</example>
</member>
<member name="P:Ewide.Core.Service.UpdateJobInput.Remark">
<summary>
备注
</summary>
</member>
<member name="T:Ewide.Core.Service.JobOutput">
<summary>
任务信息---任务详情
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.Id">
<summary>
Id
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.RunNumber">
<summary>
已执行次数
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.TimerStatus">
<summary>
定时器状态
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.Exception">
<summary>
异常信息
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.JobName">
<summary>
任务名称
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.ExecuteType">
<summary>
执行类型(并行、列队)
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.Interval">
<summary>
执行间隔时间(单位秒)
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.Cron">
<summary>
Cron表达式
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.Service.JobOutput.RequestType">
<summary>
请求类型
</summary>
<example>2</example>
</member>
<member name="P:Ewide.Core.Service.JobOutput.Remark">
<summary>
备注
</summary>
</member>
<member name="T:Ewide.Core.Service.TaskMethodInfo">
<summary>
任务方法信息
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.MethodName">
<summary>
方法名
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.DeclaringType">
<summary>
方法所属类的Type对象
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.JobName">
<summary>
任务名称
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.DoOnce">
<summary>
只执行一次
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.StartNow">
<summary>
立即执行(默认等待启动)
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.ExecuteType">
<summary>
执行类型(并行、列队)
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.Interval">
<summary>
执行间隔时间(单位秒)
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.Cron">
<summary>
Cron表达式
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.TimerType">
<summary>
定时器类型
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.RequestUrl">
<summary>
请求url
</summary>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.RequestType">
<summary>
请求类型
</summary>
<example>2</example>
</member>
<member name="P:Ewide.Core.Service.TaskMethodInfo.Remark">
<summary>
备注
</summary>
</member>
<member name="T:Ewide.Core.Service.SysTimerService">
<summary>
任务调度服务
</summary>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.GetTimerPageList(Ewide.Core.Service.JobPageInput)">
<summary>
分页获取任务列表
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.GetLocalJobList">
<summary>
获取所有本地任务
</summary>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.AddTimer(Ewide.Core.Service.AddJobInput)">
<summary>
增加任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.DeleteTimer(Ewide.Core.Service.DeleteJobInput)">
<summary>
删除任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.UpdateTimber(Ewide.Core.Service.UpdateJobInput)">
<summary>
修改任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.GetTimer(Ewide.Core.Service.QueryJobInput)">
<summary>
查看任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.StopTimerJob(Ewide.Core.Service.StopJobInput)">
<summary>
停止任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.StartTimerJob(Ewide.Core.Service.AddJobInput)">
<summary>
启动任务
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.AddTimerJob(Ewide.Core.Service.AddJobInput)">
<summary>
新增定时任务
</summary>
<param name="input"></param>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.StartTimerJob">
<summary>
启动自启动任务
</summary>
</member>
<member name="M:Ewide.Core.Service.SysTimerService.GetTaskMethods">
<summary>
获取所有本地任务
</summary>
<returns></returns>
</member>
<member name="T:Ewide.Core.Service.AuthToken">
<summary>
AuthToken参数

View File

@@ -39,6 +39,8 @@ namespace Ewide.Core.Util
//除去.xml 后缀
string className = file.Name.Remove(file.Name.Length - 4, 4);
object obj = AppInfo(className);
if (obj == null)
continue;
string XmlContext = StreamRead(file.FullName);
//实例创建 出 类型集合
var modelList = Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { obj.GetType() }));

View File

@@ -27,7 +27,7 @@ namespace Ewide.EntityFramework.Core
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql(GetDatabaseConnectionString(), ServerVersion.FromString("5.5.53"));
optionsBuilder.UseMySql(GetDatabaseConnectionString(), ServerVersion.Parse("5.5.53"));
base.OnConfiguring(optionsBuilder);
}

View File

@@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.Data.SqlClient" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.5" />
<PackageReference Include="MySql.Data" Version="8.0.29" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0-alpha.2" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.4" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,5 +1,5 @@
{
//DefaultConnection这个节点不能删
//DefaultConnection这个节点不能删
"DefaultConnection": "Data Source=118.178.224.202;Port=3310;Database=yongjiangbei_vote;User ID=root;Password=root.Ewide;pooling=true;sslmode=none;CharSet=utf8;",
"ConnectionStrings": [
/*
@@ -12,20 +12,20 @@
Kdbndp = 6
*/
{
"Id": 1, // 连接id可以配置到数据库
"DBType": 2, // db类型枚举具体的看上边
"Enabled": false, // 是否开启当前数据库db
"Connection": "WMBlog.db" // 连接字符串
"Id": 1, // 连接id可以配置到数据库
"DBType": 2, // db类型枚举具体的看上边
"Enabled": false, // 是否开启当前数据库db
"Connection": "WMBlog.db" // 连接字符串
},
{
//目前使用的数据库 Ewide.
//目前使用的数据库 Ewide.
"Id": "118_3310_ewide",
"DBType": 0,
"Enabled": true,
"ConnectionString": ";"
},
{
//不知道干什么用的
//不知道干什么用的
"Id": "PgSqlConnection",
"DBType": 4,
"Enabled": true,

View File

@@ -1,5 +1,5 @@
{
//DefaultConnection这个节点不能删
//DefaultConnection这个节点不能删
"DefaultConnection": "Data Source=localhost;Port=3310;Database=yongjiangbei_vote;User ID=root;Password=Ewide.;pooling=true;sslmode=none;CharSet=utf8;",
"ConnectionStrings": [
/*
@@ -12,20 +12,20 @@
Kdbndp = 6
*/
{
"Id": 1, // 连接id可以配置到数据库
"DBType": 2, // db类型枚举具体的看上边
"Enabled": false, // 是否开启当前数据库db
"Connection": "WMBlog.db" // 连接字符串
"Id": 1, // 连接id可以配置到数据库
"DBType": 2, // db类型枚举具体的看上边
"Enabled": false, // 是否开启当前数据库db
"Connection": "WMBlog.db" // 连接字符串
},
{
//目前使用的数据库 Ewide.
//目前使用的数据库 Ewide.
"Id": "118_3310_ewide",
"DBType": 0,
"Enabled": true,
"ConnectionString": ""
},
{
//不知道干什么用的
//不知道干什么用的
"Id": "PgSqlConnection",
"DBType": 4,
"Enabled": true,

View File

@@ -9,7 +9,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.6" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@@ -11,7 +11,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.17" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.1.21102.12" />
<PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />

View File

@@ -11,6 +11,7 @@ using Microsoft.Extensions.Hosting;
using OnceMi.AspNetCore.OSS;
using Serilog;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace Ewide.Web.Core
@@ -53,8 +54,8 @@ namespace Ewide.Web.Core
.AddJsonOptions(options =>
{
//options.JsonSerializerOptions.DefaultBufferSize = 10_0000;//返回较大数据数据序列化时会截断原因默认缓冲区大小以字节为单位为16384。
options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss");
//options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用 仅.NET 6支持
//options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss");
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用 仅.NET 6支持
});
services.AddViewEngine();

View File

@@ -1,7 +1,7 @@
//using Ewide.Application;
using Furion;
using Furion.DataEncryption;
using Furion.TaskScheduler;
//using Furion.TaskScheduler;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
@@ -24,13 +24,13 @@ namespace Ewide.Web.Entry.Controllers
}
public IActionResult Index2()
{
//SpareTime.Do
var workers = SpareTime.GetWorkers().ToList();
SpareTime.DoOnce(3000, (timer, count) =>
{
// 这里发送短信,发送邮件或记录访问记录
Console.WriteLine("现在时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
});
////SpareTime.Do
//var workers = SpareTime.GetWorkers().ToList();
//SpareTime.DoOnce(3000, (timer, count) =>
// {
// // 这里发送短信,发送邮件或记录访问记录
// Console.WriteLine("现在时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
// });
return View();
}
}

View File

@@ -10,7 +10,7 @@ namespace Ewide.Web.Entry.Controllers
[AllowAnonymous]
public class ManageController : Controller
{
public IActionResult Index()
public IActionResult VoteResult()
{
ViewBag.Title = "宁波市“甬江建设杯”选票";
return View();
@@ -25,5 +25,10 @@ namespace Ewide.Web.Entry.Controllers
ViewBag.Title = "宁波市“甬江建设杯”选票";
return View();
}
public IActionResult nbczResult()
{
ViewBag.Title = "共赴宁波之春 报名结果";
return View();
}
}
}

View File

@@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Ewide.Web.Entry.Controllers
{
public class NingboZhiChunController : Controller
{
[AllowAnonymous]
public IActionResult Index()
{
return View();
}
}
}

View File

@@ -101,7 +101,8 @@
_this.$alert(response.data.data.descriptions);
else {
window.sessionStorage.setItem('__TOKEN', response.data.data.token);
location = '/gb/yjb/manage/index'
//location = '/gb/yjb/manage/VoteResult'
location = '/gb/yjb/manage/GfnbczResult'
}
}
_this.loading = false;

View File

@@ -0,0 +1,239 @@
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="http://lib.baomitu.com/qs/6.10.3/qs.min.js"></script>
</head>
<body>
<div id="app" v-loading="loading">
<h3 style="text-align:center;">共赴宁波之春 报名结果</h3>
<el-table :data="tableData" style="width: 100%">
<el-table-column type="expand">
<template slot-scope="props">
<el-descriptions class="margin-top" title="" :column="2" border>
<el-descriptions-item :span="2">
<template slot="label">
@* <i class="el-icon-user"></i>*@
报名日期
</template>
{{ props.row.createdTime }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@* <i class="el-icon-user"></i>*@
姓名
</template>
{{ props.row.name }}
</el-descriptions-item>
<el-descriptions-item labelStyle="width:90px;">
<template slot="label">
@* <i class="el-icon-user"></i>*@
手机号码
</template>
{{ props.row.phone }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@* <i class="el-icon-mobile-phone"></i>*@
微信号码
</template>
{{ props.row.weixin_number }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@* <i class="el-icon-location-outline"></i>*@
身份证号码
</template>
{{ props.row.cardno }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@* <i class="el-icon-tickets"></i>*@
行业
</template>
@* <el-tag size="small">学校</el-tag>*@
{{ props.row.hangye }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@*<i class="el-icon-office-building"></i>*@
所在地
</template>
{{ props.row.address }}
</el-descriptions-item>
</el-descriptions>
</template>
</el-table-column>
<el-table-column label="报名日期"><template slot-scope="props">{{ dateFormat("mm-dd", props.row.createdTime )}}</template></el-table-column>
<el-table-column label="姓名/手机号码"><template slot-scope="props">{{ props.row.name}}<br />{{ props.row.phone}}</template></el-table-column>
<el-table-column label="日期/线路"><template slot-scope="props">{{ props.row.date}} 线路{{ props.row.line}}</template></el-table-column>
</el-table>
<h3 style="text-align:center;">
<el-button @@click="load_projects">刷新数据</el-button>
<el-button type="primary" @@click="export_excel" :loading="loading">导出Excel</el-button>
</h3>
</div>
</body>
<style scoped>
.buhuanhang {
white-space: nowrap;
width: 21%;
}
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
width: 90px;
color: #99a9bf;
}
.demo-table-expand .el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 50%;
}
</style>
<script>
new Vue({
el: '#app',
data: function () {
return {
tableData: [],
loading: false,
token: ''
}
},
created: function () {
this.check_login()
this.loading = true;
this.load_projects();
},
methods: {
export_excel() {
this.loading = true;
this.download('/gb/yjb/api/ningbozhichun/export_excel', this.dateFormat("YYYYmmddHHMMSS", new Date()) + "-共赴宁波之春.xlsx", this.loading_false);
},
check_login() {
this.token = window.sessionStorage.getItem('__TOKEN');
if (!this.token)
location = '/gb/yjb/manage/login'
},
load_projects() {
this.loading = true;
let _this = this;
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: '/gb/yjb/api/ningbozhichun/GetPersonList',
data: {},
responseType: "json",
headers: {
Authorization: 'Bearer ' + _this.token
}
}).then(function (response) {
console.log(response)
_this.tableData = response.data.data
_this.loading = false;
}).catch(function (error) {
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
_this.loading = false;
})
},
loading_false() { this.loading = false },
download(url, filename, callback) {
let _this = this;
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: url,
data: {},
responseType: "blob",
headers: {
Authorization: 'Bearer ' + _this.token
}
}).then(function (response) {
console.log(response);
//解析文件充blod中解析
const url = window.URL.createObjectURL(
new Blob([response.data], { type: "application/vnd.ms-excel" })
);
const link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
callback();
}).catch(function (error) {
callback();
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
})
},
getMonthWeek(now) {
var a = now.getYear();
var b = now.getMonth() + 1;
var c = now.getDate();
/*
a = d = 当前日期
b = 6 - w = 当前周的还有几天过完(不算今天)
a + b 的和在除以7 就是当天是当前月份的第几周
*/
var date = new Date(a, parseInt(b) - 1, c), w = date.getDay(), d = date.getDate();
return Math.ceil(
(d + 6 - w) / 7
);
},
dateFormat(fmt, d) {
const date = new Date(d);
let ret;
const opt = {
"Y+": date.getFullYear().toString(), // 年
"m+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"M+": date.getMinutes().toString(), // 分
"S+": date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
}
})
</script>
</html>

View File

@@ -0,0 +1,334 @@
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="http://lib.baomitu.com/qs/6.10.3/qs.min.js"></script>
</head>
<body>
<div id="app" v-loading="loading">
<h3 style="text-align:center;">共赴宁波之春 参与报名</h3>
<el-card class="box-card">
<p>本地活动共三条线路,分别为:</p>
<p>A.“历史之路 文化之路 创新之路 共富之路”的慈溪南部沿山风情共富线。</p>
<p>B.“应梦明山入城,剡水桃源归野”的奉化明山剡水共富线。</p>
<p>C.“万象山海,逐梦亚运”象山扬帆亚运风情共富线三条体验游览线。</p>
<p>每天三条线齐发(奉,宁,慈)</p>
</el-card>
<el-form label-position="left" ref="form" :model="form" :rules="rules" label-width="120px" style="margin-top:15px;">
<el-form-item label="姓名:" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="手机号码:" prop="phone">
<el-input v-model="form.phone"></el-input>
</el-form-item>
<el-form-item label="验证码" prop="code">
<el-input type="text" maxlength="4" placeholder="验证码" v-model="form.code">
<template slot="append">
<el-button :disabled="disabled" @@click="getCode">{{ valiBtn }}</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label="微信号码:" prop="weixin_number">
<el-input v-model="form.weixin_number"></el-input>
</el-form-item>
<el-form-item label="身份证号码:" prop="cardno">
<el-input v-model="form.cardno"></el-input>
</el-form-item>
<el-form-item label="行业:" prop="hangye">
<el-input v-model="form.hangye"></el-input>
</el-form-item>
<el-form-item label="所在地:" prop="address">
<el-input v-model="form.address"></el-input>
</el-form-item>
<el-form-item label="参加时间:" prop="date">
<el-popover placement="top"
title=""
width="200"
trigger="focus"
:content="datePersonNumber">
<el-radio-group v-model="form.date" @@input="getNumber()" slot="reference" size="small">
<el-radio-button label="3.18/19" border></el-radio-button>
<el-radio-button label="3.25/26" border></el-radio-button>
<el-radio-button label="4.8/9" border></el-radio-button>
<el-radio-button label="4.15/16" border></el-radio-button>
</el-radio-group>
</el-popover>
</el-form-item>
<el-form-item label="选择线路:" prop="line">
<el-card class="box-card">
<p>A.慈溪南部沿山风情共富线。</p>
<p>B.奉化明山剡水共富线。</p>
<p>C.象山扬帆亚运风情共富线。</p>
</el-card>
<el-radio-group v-model="form.line" size="small">
<el-radio-button label="A" border></el-radio-button>
<el-radio-button label="B" border></el-radio-button>
<el-radio-button label="C" border></el-radio-button>
</el-radio-group>
</el-form-item>
@*<el-form-item label="备注:">
<el-input type="textarea" v-model="form.remark"></el-input>
</el-form-item>*@
<el-form-item>
<el-button type="primary" @@click.prevent="onSubmit('form')">提交</el-button>
<el-button @@click.prevent="showinfo()">我的报名</el-button>
</el-form-item>
</el-form>
</div>
</body>
<script>
new Vue({
el: '#app',
data: function () {
var checkPhone = (rule, value, callback) => {
const regMobile = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
if (regMobile.test(value)) {
callback()
}
callback(new Error("请输入正确的手机号码"))
};
var checkCode = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入验证码"))
} else if (!/^[0-9]+$/.test(value) || !/^\d{4}$/.test(value)) {
callback(new Error("请输入4位数字的验证码"))
} else {
callback()
}
};
var checkCardNo = (rule, value, callback) => {
const regMobile = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if (regMobile.test(value)) {
callback()
}
callback(new Error("请输入正确的身份证号码"))
};
return {
form: {
name: '',
phone: '',
weixin_number: '',
cardno: '',
hangye: '',
address: '',
date: '',
line: '',
code: '',
token: ''
//,remark: ''
}, rules: {
name: [{ required: true, trigger: 'blur', message: '请输入姓名' }],
phone: [{ validator: checkPhone, required: true, trigger: 'blur' }],
code: [{ validator: checkCode, required: true, trigger: 'blur' }],
weixin_number: [{ required: true, trigger: 'blur', message: '请输入微信号码' }],
cardno: [{ validator: checkCardNo, required: true, trigger: 'blur' }],
hangye: [{ required: true, trigger: 'blur', message: '请输入行业' }],
address: [{ required: true, trigger: 'blur', message: '请输入所在地' }],
date: [{ required: true, trigger: 'blur', message: '请选择参加时间' }],
line: [{ required: true, trigger: 'blur', message: '请选择线路' }],
},
valiBtn: '获取验证码',
disabled: false,
datePersonNumber: ''
}
},
created: function () {
this.loading = true;
this.loading_false();
},
methods: {
getCode() {
this.$refs['form'].validateField('phone', (err) => {
if (err) {
console.log('未通过')
return;
} else {
console.log('已通过')
console.log(this.form.phone)
let _this = this;
//this.$alert("成功", "提示")
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: '/gb/yjb/api/ningbozhichun/sendcode',
data: _this.form,
responseType: "json",
}).then(async response => {
if (response.data.data != true) {
_this.$alert(`<div>` + response.data.message + `</div>`, '错误', {
confirmButtonText: '确定', dangerouslyUseHTMLString: true, center: true, closeOnClickModal: true
}).then(a => { }).catch(err => { console.log(err) });
} else {
_this.tackBtn(); //验证码倒数60秒
}
_this.loading = false;
}).catch(async error => {
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
_this.loading = false;
})
}
})
},
tackBtn() { //验证码倒数60秒
let time = 60;
let timer = setInterval(() => {
if (time == 0) {
clearInterval(timer);
this.valiBtn = '获取验证码';
this.disabled = false;
} else {
this.disabled = true;
this.valiBtn = time + '秒后重试';
time--;
}
}, 1000);
},
onSubmit(formName) {
console.log('submit!');
let _this = this;
this.$refs[formName].validate((valid) => { // 为表单绑定验证功能
if (valid) {
//this.$alert("成功", "提示")
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: '/gb/yjb/api/ningbozhichun/submit',
data: _this.form,
responseType: "json",
}).then(async response => {
if (response.data?.data?.success == true) {
let token = response.data.data.token;
localStorage.setItem(_this.form.phone + "_token", token)
_this.$alert(`<div>提交成功</div>`, '成功', {
confirmButtonText: '确定', dangerouslyUseHTMLString: true, center: true, closeOnClickModal: true
}).then(a => { }).catch(err => { console.log(err) });
} else {
_this.$alert(`<div>` + response.data.message + `</div>`, '错误', {
confirmButtonText: '确定', dangerouslyUseHTMLString: true, center: true, closeOnClickModal: true
}).then(a => { }).catch(err => { console.log(err) });
}
_this.loading = false;
}).catch(async error => {
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
_this.loading = false;
})
}
});
},
loading_false() { this.loading = false },
showinfo() {
let _this = this;
_this.form.token = localStorage.getItem(_this.form.phone + "_token");
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: '/gb/yjb/api/ningbozhichun/getmyinfo',
data: _this.form,
responseType: "json",
}).then(async response => {
if (response.data?.data?.success == true) {
_this.form = response.data?.data.entity;
let token = response.data.data.token;
localStorage.setItem(_this.form.phone + "_token", token)
} else {
_this.$alert(`<div>` + response.data.message + `,请再次验证手机号码后继续</div>`, '错误', {
confirmButtonText: '确定', dangerouslyUseHTMLString: true, center: true, closeOnClickModal: true
}).then(a => { }).catch(err => { console.log(err) });
}
_this.loading = false;
}).catch(async error => {
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
_this.loading = false;
})
},
getNumber() {
let _this = this;
axios({
headers: { 'Content-Type': 'application/json;charset=UTF-8' },
method: 'post',
url: '/gb/yjb/api/ningbozhichun/getnumber',
data: _this.form,
responseType: "json",
}).then(async response => {
if (response.data?.data?.success == true) {
_this.datePersonNumber = _this.form.date + ` 还剩余 ` + response.data?.data?.n + ` 个名额`
} else {
_this.$alert(`<div>` + response.data.message + `</div>`, '错误', {
confirmButtonText: '确定', dangerouslyUseHTMLString: true, center: true, closeOnClickModal: true
}).then(a => { }).catch(err => { console.log(err) });
}
_this.loading = false;
}).catch(async error => {
console.log(error)
_this.$message({
type: 'error',
message: error.message
})
_this.loading = false;
})
}
}
})
</script>
<style scoped>
.buhuanhang {
white-space: nowrap;
width: 21%;
}
.text {
font-size: 14px;
}
.item {
padding: 18px 0;
}
.box-card {
width: 98%;
margin: 0 auto;
}
.el-card__body {
padding: 12px;
}
.el-card__body p {
margin: 0px;
margin-bottom: 5px;
line-height: 1.2;
}
.el-radio.is-bordered {
margin-bottom: 10px;
}
</style>
</html>

View File

@@ -42,6 +42,14 @@
"AccessKey": "C4D30C2801D928AAF687",
"SecretKey": "ooZVXaB1tqIz7DHTv53RILD7o5cAAAGAAdkoqlR2",
"IsEnableCache": true //是否启用缓存,推荐开启
},
"NingboZhiChun": {
"OpenSms": 0,
"SmsTokenUrl": "http://10.19.94.16/api/user/login",
"SmsSendUrl": "http://10.19.94.16/api/sms/send",
"SmsAccount": "tempaccount0309",
"SmsPwd": "Aabc!@#20KHL+@+124bjaT(6q",
"TotalCount": 40
}
}

View File

@@ -0,0 +1,209 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Ewide.Core;
using Ewide.Core.Util;
using Furion;
using Furion.ClayObject.Extensions;
using Furion.DatabaseAccessor;
using Furion.DataEncryption;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Furion.RemoteRequest.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json.Linq;
using Vote.Services.Dto;
using Vote.Services.Entities;
namespace Vote.Services.ApiController
{
/// <summary>
/// 共赴宁波之春
/// </summary>
[ApiDescriptionSettings("ningbozhichun", Order = 0)]
[Route("/gb/yjb/api/ningbozhichun")]
public class NbZhiChunService : IDynamicApiController
{
private readonly IRepository<Entities.nbzc_person> repPerson;
private readonly IRepository<Entities.nbzc_sms_code> repSmsCode;
private readonly IMemoryCache _memoryCache;
/// <summary>
///
/// </summary>
/// <param name="_repNingbo"></param>
public NbZhiChunService(IRepository<Entities.nbzc_person> _repNingbo, IRepository<Entities.nbzc_sms_code> _repSmsCode, IMemoryCache memoryCache)
{
repPerson = _repNingbo;
this.repSmsCode = _repSmsCode;
_memoryCache = memoryCache;
}
/// <summary>
/// 提交
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
[Route("sendcode")]
public async Task<dynamic> SendCode(NbzcSendCodeInput args)
{
//var data = await repSmsCode.DetachedEntities.Where(p => p.phone == args.phone && !p.IsDeleted && p.expire_time > DateTime.Now)
// .FirstOrDefaultAsync();
//_ = (data != null) ? throw Oops.Oh("已存在此号码的有效发送记录,不可重复发送") : 1;
var lastSend = await repSmsCode.DetachedEntities.Where(p => p.phone == args.phone && !p.IsDeleted).OrderByDescending(a => a.CreatedTime).FirstOrDefaultAsync();
_ = lastSend != null && DateTime.Now <= lastSend.CreatedTime.Value.AddMinutes(1) ? throw Oops.Oh("发送过于频繁,请1分钟后再试") : 1;
//_ = (await repPerson.DetachedEntities.Where(a => !a.IsDeleted && (a.phone == args.phone || a.cardno == args.cardno)).CountAsync() > 0) ? throw Oops.Oh("您已提交,无需再次获取验证码") : 1;
string _timeCacheKey = "sms_token_" + args.phone;
var code = new Random().Next(1001, 9999);
if (App.GetConfig<int>("NingboZhiChun:OpenSms") == 1)
{
var cacheTokenValue = _memoryCache.Get<string>(_timeCacheKey);
if (string.IsNullOrEmpty(cacheTokenValue))
{
var rslt = await App.GetConfig<string>("NingboZhiChun:SmsTokenUrl").SetBody(new { username = App.GetConfig<string>("NingboZhiChun:SmsAccount"), password = App.GetConfig<string>("NingboZhiChun:SmsPwd") }, "application/json").SetHttpMethod(HttpMethod.Post).SendAsStringAsync();
cacheTokenValue = Newtonsoft.Json.Linq.JObject.Parse(rslt)["data"]["token"].ToString();
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(100));
_memoryCache.Set(_timeCacheKey, cacheTokenValue, cacheEntryOptions);
}
var sendrslt = await App.GetConfig<string>("NingboZhiChun:SmsSendUrl")
.SetHttpMethod(HttpMethod.Post)
.SetHeaders(new Dictionary<string, object> { { "Authorization", "Bearer " + cacheTokenValue } })
.SetBody(new { phone_number = args.phone, sms_content = $"您的验证码是:{code}10分钟内有效。" })
.SendAsStringAsync();
if (!Newtonsoft.Json.Linq.JObject.Parse(sendrslt)["issuccess"].Value<bool>())
throw Oops.Oh("验证码短信发送失败.");
}
await new Entities.nbzc_sms_code
{
code = code.ToString(),
CreatedTime = DateTime.Now,
expire_time = DateTime.Now.AddMinutes(10),
IsDeleted = false,
phone = args.phone
}.InsertOrUpdate();
return true;
}
/// <summary>
/// 提交
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public async Task<dynamic> SubmitSubmit(NbzcSubmitInput args)
{
var lastSend = await repSmsCode.DetachedEntities.Where(p => p.phone == args.phone && !p.IsDeleted).OrderByDescending(a => a.CreatedTime).FirstOrDefaultAsync();
_ = (lastSend == null || lastSend.code != args.code || lastSend.expire_time < DateTime.Now) ? throw Oops.Oh("验证码错误或已失效") : 1;
//var list = args.projects.Adapt<List<Entities.VoteRecords>>();
//删除这个专家上次提交的结果
//或者提示不能再次提交
_ = (await repPerson.DetachedEntities.Where(a => !a.IsDeleted && (a.phone == args.phone || a.cardno == args.cardno)).CountAsync() > 0) ? throw Oops.Oh("您已提交,无需再次提交") : 1;
var now = DateTime.Now;
var model = new Entities.nbzc_person
{
address = args.address,
phone = args.phone,
cardno = args.cardno,
CreatedTime = DateTime.Now,
date = args.date,
hangye = args.hangye,
IsDeleted = false,
line = args.line,
name = args.name,
weixin_number = args.weixin_number
};
model = await model.InsertOrUpdate();
lastSend.IsDeleted = true;
await repSmsCode.UpdateIncludeAsync(lastSend, new string[] { nameof(lastSend.IsDeleted) });
var token = JWTEncryption.Encrypt(new Dictionary<string, object>() // 加密
{
{ "UserId", model.Id },
{ "Account",model.phone }
});
return new { success = true, token };
}
/// <summary>
/// 提交
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
[Route("getmyinfo")]
public async Task<dynamic> GetMyInfo(NbzcGetMyInfoInput args)
{
var newToken = args.token;
nbzc_person entity = null;
if (!string.IsNullOrEmpty(args.token))
{
var tokenData = JWTEncryption.ReadJwtToken(args.token);
_ = (tokenData == null) ? throw Oops.Oh("您还没有提交过或者手机号码填写错误") : 1;
var userId = tokenData.Claims.Where(a => a.Type == "UserId").FirstOrDefault().Value;
entity = await repPerson.DetachedEntities.Where(a => a.Id == userId).FirstOrDefaultAsync();
}
else
{
_ = (string.IsNullOrEmpty(args.code)) ? throw Oops.Oh("验证码错误或已失效") : 1;
var lastSend = await repSmsCode.DetachedEntities.Where(p => p.phone == args.phone && !p.IsDeleted).OrderByDescending(a => a.CreatedTime).FirstOrDefaultAsync();
_ = (lastSend == null || lastSend.code != args.code || lastSend.expire_time < DateTime.Now) ? throw Oops.Oh("验证码错误或已失效") : 1;
entity = await repPerson.DetachedEntities.Where(a => a.phone == args.phone && !a.IsDeleted).FirstOrDefaultAsync();
newToken = JWTEncryption.Encrypt(new Dictionary<string, object>()
{
{ "UserId", entity.Id },
{ "Account",entity.phone }
});
}
return new { success = true, entity, token = newToken };
}
/// <summary>
/// 获取时间线路人数
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
[Route("getnumber")]
public async Task<dynamic> GetNumber(NbzcGetNumberInput args)
{
var n = await repPerson.DetachedEntities.Where(a => !a.IsDeleted && a.date == args.date).CountAsync();
return new { success = true, n = App.GetConfig<int>("NingboZhiChun:TotalCount") - n };
}
/// <summary>
/// 获取清单
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Route("GetPersonList")]
public async Task<dynamic> GetPersonList(NbzcGetListInput args)
{
var list = await repPerson.DetachedEntities.Where(a => !a.IsDeleted).OrderByDescending(a => a.CreatedTime).ToListAsync();
return list;
}
/// <summary>
/// 导出Excel
/// </summary>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[Route("export_excel")]
public async Task<dynamic> ExportExcel(NbzcGetListInput args)
{
var list = await repPerson.DetachedEntities.Where(a => !a.IsDeleted).OrderByDescending(a => a.CreatedTime).ToListAsync();
var filepath = Tools.ExcelHelper.WriteExcelNingBoZhiChun(list);
return new FileStreamResult(new FileStream(filepath, FileMode.Open), "application/octet-stream") { FileDownloadName = filepath };
}
}
}

View File

@@ -0,0 +1,133 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Vote.Services.Dto
{
/// <summary>
///
/// </summary>
public class NbzcInput
{
}
/// <summary>
///
/// </summary>
public class NbzcGetMyInfoInput
{
/// <summary>
///
/// </summary>
//[Required]
public string token { get; set; }
/// <summary>
///
/// </summary>
public string phone { get; set; }
/// <summary>
///
/// </summary>
//[Required]
public string code { get; set; }
}
/// <summary>
///
/// </summary>
public class NbzcGetListInput
{
/// <summary>
///
/// </summary>
//[Required]
public string phone { get; set; }
}
/// <summary>
///
/// </summary>
public class NbzcSendCodeInput
{
/// <summary>
///
/// </summary>
[Required]
public string phone { get; set; }
/// <summary>
///
/// </summary>
public string cardno { get; set; }
}
/// <summary>
///
/// </summary>
public class NbzcGetNumberInput
{
/// <summary>
///
/// </summary>
[Required]
public string date { get; set; }
/// <summary>
///
/// </summary>
//[Required]
public string line { get; set; }
}
/// <summary>
///
/// </summary>
public class NbzcSubmitInput
{
/// <summary>
///
/// </summary>
[Required]
public string code { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string phone { get; set; }
/// <summary>
///
/// </summary>
public string address { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string cardno { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string date { get; set; }
/// <summary>
///
/// </summary>
public string hangye { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string line { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string weixin_number { get; set; }
/// <summary>
///
/// </summary>
[Required]
public string name { get; set; }
}
}

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ewide.Core;
namespace Vote.Services.Entities
{
/// <summary>
/// 共赴宁波之春-登记人员表
/// </summary>
[Serializable]
public class nbzc_person : DEntityBase
{
/// <summary>
/// 姓名
/// </summary>
[DisplayName("姓名")]
public string name { get; set; }
/// <summary>
/// 手机号码
/// </summary>
[DisplayName("手机号码")]
public string phone { get; set; }
/// <summary>
/// 微信号码
/// </summary>
[DisplayName("微信号码")]
public string weixin_number { get; set; }
/// <summary>
/// 身份证号码
/// </summary>
[DisplayName("身份证号码")]
public string cardno { get; set; }
/// <summary>
/// 行业
/// </summary>
[DisplayName("行业")]
public string hangye { get; set; }
/// <summary>
/// 所在地,地址
/// </summary>
[DisplayName("所在地,地址")]
public string address { get; set; }
/// <summary>
/// 日期,不固定格式
/// </summary>
[DisplayName("日期,不固定格式")]
public string date { get; set; }
/// <summary>
/// x线路
/// </summary>
[DisplayName("x线路")]
public string line { get; set; }
}
}

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ewide.Core;
namespace Vote.Services.Entities
{
/// <summary>
///
/// </summary>
[Serializable]
public class nbzc_sms_code : DEntityBase
{
/// <summary>
/// 手机号码
/// </summary>
[DisplayName("手机号码")]
public string phone { get; set; }
/// <summary>
/// 验证码
/// </summary>
[DisplayName("验证码")]
public string code { get; set; }
/// <summary>
/// 过期时间
/// </summary>
[DisplayName("过期时间")]
public DateTime expire_time { get; set; }
}
}

View File

@@ -11,6 +11,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Vote.Services.Dto;
using Vote.Services.Entities;
namespace Vote.Services.Tools
{
@@ -208,5 +209,63 @@ namespace Vote.Services.Tools
throw Oops.Oh("文件被占用,请检查文件模板");
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public static string WriteExcelNingBoZhiChun(List<nbzc_person> data)
{
try
{
string template_name = "共赴宁波之春模板.xlsx";
string excelFilePath = $"{App.WebHostEnvironment.WebRootPath}\\ExcelTemplate\\{template_name}";
string outputPath = string.Empty;
if (!string.IsNullOrEmpty(excelFilePath))
{
using (FileStream excelFileStream = System.IO.File.OpenRead(excelFilePath))
{
bool isCompatible = ExcelHelper.GetIsCompatible(excelFilePath);
IWorkbook workbook = ExcelHelper.CreateWorkbook(isCompatible, excelFileStream);
ISheet sheet = null;
sheet = workbook.GetSheetAt(0);
//从第几行开始 , 比如 行号是4 , 就写3
var startRowIndex = 1;
for (int i = 0; i < data.Count; i++)
{
var c_rowindex = startRowIndex + i;
var row = sheet.CreateRow(c_rowindex);
int cell_start_index = 0;
row.CreateCell(cell_start_index).SetCellValue(data[i].CreatedTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
row.CreateCell(cell_start_index + 1).SetCellValue(data[i].name);
row.CreateCell(cell_start_index + 2).SetCellValue(data[i].phone);
row.CreateCell(cell_start_index + 3).SetCellValue(data[i].weixin_number);
row.CreateCell(cell_start_index + 4).SetCellValue(data[i].cardno);
row.CreateCell(cell_start_index + 5).SetCellValue(data[i].hangye);
row.CreateCell(cell_start_index + 6).SetCellValue(data[i].date);
row.CreateCell(cell_start_index + 7).SetCellValue(data[i].line);
row.CreateCell(cell_start_index + 8).SetCellValue(data[i].address);
}
var file = new FileInfo(excelFilePath);
var savePath = file.DirectoryName + "\\OutPut\\";
if (!Directory.Exists(savePath))
Directory.CreateDirectory(savePath);
outputPath = savePath + DateTime.Now.ToString("yyyyMMddHHmmsss") + "-" + template_name;
using (var filess = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Read))
{
workbook.Write(filess);
}
}
}
return outputPath;
}
catch (System.IO.IOException ioex)
{
throw Oops.Oh("文件被占用,请检查文件模板");
}
}
}
}

View File

@@ -10,7 +10,7 @@
<ItemGroup>
<PackageReference Include="Aspose.Words" Version="23.1.0" />
<PackageReference Include="Furion" Version="4.5.0" />
<PackageReference Include="Furion" Version="4.8.7.6" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.46" />
<PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
</ItemGroup>

View File

@@ -45,6 +45,53 @@
</summary>
<returns></returns>
</member>
<member name="T:Vote.Services.ApiController.NbZhiChunService">
<summary>
共赴宁波之春
</summary>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.#ctor(Furion.DatabaseAccessor.IRepository{Vote.Services.Entities.nbzc_person},Furion.DatabaseAccessor.IRepository{Vote.Services.Entities.nbzc_sms_code},Microsoft.Extensions.Caching.Memory.IMemoryCache)">
<summary>
</summary>
<param name="_repNingbo"></param>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.SendCode(Vote.Services.Dto.NbzcSendCodeInput)">
<summary>
提交
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.SubmitSubmit(Vote.Services.Dto.NbzcSubmitInput)">
<summary>
提交
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.GetMyInfo(Vote.Services.Dto.NbzcGetMyInfoInput)">
<summary>
提交
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.GetNumber(Vote.Services.Dto.NbzcGetNumberInput)">
<summary>
获取时间线路人数
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.GetPersonList(Vote.Services.Dto.NbzcGetListInput)">
<summary>
获取清单
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.ApiController.NbZhiChunService.ExportExcel(Vote.Services.Dto.NbzcGetListInput)">
<summary>
导出Excel
</summary>
<returns></returns>
</member>
<member name="T:Vote.Services.ApiController.ProjectsService">
<summary>
项目
@@ -97,6 +144,121 @@
</summary>
<returns></returns>
</member>
<member name="T:Vote.Services.Dto.NbzcInput">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.NbzcGetMyInfoInput">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetMyInfoInput.token">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetMyInfoInput.phone">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetMyInfoInput.code">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.NbzcGetListInput">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetListInput.phone">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.NbzcSendCodeInput">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSendCodeInput.phone">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSendCodeInput.cardno">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.NbzcGetNumberInput">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetNumberInput.date">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcGetNumberInput.line">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.NbzcSubmitInput">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.code">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.phone">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.address">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.cardno">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.date">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.hangye">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.line">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.weixin_number">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Dto.NbzcSubmitInput.name">
<summary>
</summary>
</member>
<member name="T:Vote.Services.Dto.GetObjectInput">
<summary>
@@ -262,6 +424,71 @@
登录码
</summary>
</member>
<member name="T:Vote.Services.Entities.nbzc_person">
<summary>
共赴宁波之春-登记人员表
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.name">
<summary>
姓名
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.phone">
<summary>
手机号码
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.weixin_number">
<summary>
微信号码
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.cardno">
<summary>
身份证号码
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.hangye">
<summary>
行业
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.address">
<summary>
所在地,地址
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.date">
<summary>
日期,不固定格式
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_person.line">
<summary>
x线路
</summary>
</member>
<member name="T:Vote.Services.Entities.nbzc_sms_code">
<summary>
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_sms_code.phone">
<summary>
手机号码
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_sms_code.code">
<summary>
验证码
</summary>
</member>
<member name="P:Vote.Services.Entities.nbzc_sms_code.expire_time">
<summary>
过期时间
</summary>
</member>
<member name="T:Vote.Services.Entities.Projects">
<summary>
项目表
@@ -394,6 +621,12 @@
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.Tools.ExcelHelper.WriteExcelNingBoZhiChun(System.Collections.Generic.List{Vote.Services.Entities.nbzc_person})">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:Vote.Services.Tools.HtmlHelper.GetHtmlSource2(System.String)">
<summary>方法一:比较推荐
用HttpWebRequest取得网页源码