添加项目文件。

This commit is contained in:
JianWeie
2021-12-20 21:27:32 +08:00
parent 747486f5cb
commit 82d825b7a5
3514 changed files with 887941 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "3.1.2",
"commands": [
"dotnet-ef"
]
}
}
}

View File

@@ -0,0 +1,112 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 广告api控制器
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AdvertController : ControllerBase
{
private IHttpContextUser _user;
private readonly ICoreCmsArticleServices _articleServices;
private readonly ICoreCmsAdvertPositionServices _advertPositionServices;
private readonly ICoreCmsAdvertisementServices _advertisementServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="articleServices"></param>
/// <param name="advertPositionServices"></param>
/// <param name="advertisementServices"></param>
public AdvertController(IHttpContextUser user
, ICoreCmsArticleServices articleServices
, ICoreCmsAdvertPositionServices advertPositionServices
, ICoreCmsAdvertisementServices advertisementServices
)
{
_user = user;
_articleServices = articleServices;
_advertPositionServices = advertPositionServices;
_advertisementServices = advertisementServices;
}
#region 广=============================================================================
/// <summary>
/// 获取广告列表
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetAdvertList([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _advertisementServices.QueryPageAsync(p => p.code == entity.where, p => p.createTime, OrderByType.Desc,
entity.page, entity.limit);
jm.status = true;
jm.data = list;
return jm;
}
#endregion
#region 广=============================================================================
/// <summary>
/// 获取广告位置信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetPositionList([FromBody] WxAdvert entity)
{
var jm = new WebApiCallBack();
var position = await _advertPositionServices.QueryListByClauseAsync(p => p.isEnable && p.code == entity.codes);
if (!position.Any())
{
return jm;
}
var ids = position.Select(p => p.id).ToList();
var isement = await _advertisementServices.QueryListByClauseAsync(p => ids.Contains(p.positionId));
Dictionary<string, List<CoreCmsAdvertisement>> list = new Dictionary<string, List<CoreCmsAdvertisement>>();
list.Add(entity.codes, isement);
jm.status = true;
jm.data = list;
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,441 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 代理请求接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AgentController : ControllerBase
{
private IHttpContextUser _user;
private readonly ICoreCmsAgentServices _agentServices;
private readonly ICoreCmsAgentOrderServices _agentOrderServices;
private readonly ICoreCmsAgentGoodsServices _agentGoodsServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsGoodsServices _goodsServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="agentServices"></param>
/// <param name="settingServices"></param>
/// <param name="agentOrderServices"></param>
/// <param name="userServices"></param>
/// <param name="goodsServices"></param>
/// <param name="agentGoodsServices"></param>
public AgentController(IHttpContextUser user, ICoreCmsAgentServices agentServices, ICoreCmsSettingServices settingServices, ICoreCmsAgentOrderServices agentOrderServices, ICoreCmsUserServices userServices, ICoreCmsGoodsServices goodsServices, ICoreCmsAgentGoodsServices agentGoodsServices)
{
_user = user;
_agentServices = agentServices;
_settingServices = settingServices;
_agentOrderServices = agentOrderServices;
_userServices = userServices;
_goodsServices = goodsServices;
_agentGoodsServices = agentGoodsServices;
}
//公共接口====================================================================================================
#region
/// <summary>
/// 获取店铺信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetStoreInfo([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
if (entity.id == 0)
{
jm.msg = "店铺信息丢失";
return jm;
}
var store = UserHelper.GetUserIdByShareCode(entity.id);
if (store <= 0)
{
jm.msg = "店铺信息丢失";
return jm;
}
jm = await _agentServices.GetStore(store);
return jm;
}
#endregion
#region ============================================================
/// <summary>
/// 根据查询条件获取分页数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsPageList([FromBody] FMPageByWhereOrder entity)
{
var jm = new WebApiCallBack();
var where = PredicateBuilder.True<CoreCmsGoods>();
where = where.And(p => p.isDel == false);
where = where.And(p => p.isMarketable == true);
var className = string.Empty;
if (!string.IsNullOrEmpty(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
priceFrom = "",
priceTo = "",
catId = "",
brandId = "",
labelId = "",
searchName = "",
});
if (!string.IsNullOrEmpty(obj.priceFrom))
{
var priceF = obj.priceFrom.ObjectToDouble(0);
if (priceF >= 0)
{
var f = Convert.ToDecimal(priceF);
where = where.And(p => p.price >= f);
}
}
if (!string.IsNullOrEmpty(obj.priceTo))
{
var priceT = obj.priceTo.ObjectToDouble(0);
if (priceT >= 0)
{
var f = Convert.ToDecimal(priceT);
where = where.And(p => p.price <= f);
}
}
if (!string.IsNullOrEmpty(obj.brandId))
{
var brandId = obj.brandId.ObjectToInt(0);
if (brandId >= 0)
{
where = where.And(p => p.brandId == brandId);
}
}
if (!string.IsNullOrEmpty(obj.labelId))
{
var brandId = obj.brandId.ObjectToInt(0);
if (brandId >= 0)
{
where = where.And(p => p.brandId == brandId);
}
}
if (!string.IsNullOrEmpty(obj.searchName))
{
where = where.And(p => p.name.Contains(obj.searchName));
}
}
var orderBy = " isRecommend desc,isHot desc";
if (!string.IsNullOrEmpty(entity.order))
{
orderBy += "," + entity.order;
}
var list = await _goodsServices.QueryAgentGoodsPageAsync(where, orderBy, entity.page, entity.limit, false);
if (list.Any())
{
foreach (var goods in list)
{
goods.images = !string.IsNullOrEmpty(goods.images) ? goods.images.Split(",")[0] : "/static/images/common/empty.png";
}
}
//返回数据
jm.status = true;
jm.data = new
{
list,
className,
entity.page,
list.TotalCount,
list.TotalPages,
entity.limit,
entity.where,
entity.order,
};
jm.msg = "数据调用成功!";
return jm;
}
#endregion
//验证接口====================================================================================================
#region
/// <summary>
/// 查询用户是否可以成为代理商
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> Info()
{
var jm = await _agentServices.GetInfo(_user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 申请成为代理商接口
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> ApplyAgent([FromBody] FMAgentApply entity)
{
var jm = new WebApiCallBack();
if (entity.agreement != "on")
{
jm.msg = "请勾选代理商协议";
return jm;
}
var iData = new CoreCmsAgent();
iData.mobile = entity.mobile;
iData.name = entity.name;
iData.weixin = entity.weixin;
iData.qq = entity.qq;
jm = await _agentServices.AddData(iData, _user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 获取我的下级用户数量
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetTeamSum()
{
var jm = new WebApiCallBack();
//发展人数
var first = await _userServices.QueryChildCountAsync(_user.ID, 1);
//订单数
var second = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID);
//当月发展人数
var monthFirst = await _userServices.QueryChildCountAsync(_user.ID, 1, true);
DateTime dt = DateTime.Now;
//本月第一天时间
DateTime dtFirst = dt.AddDays(1 - (dt.Day));
dtFirst = new DateTime(dtFirst.Year, dtFirst.Month, dtFirst.Day, 0, 0, 0);
//获得某年某月的天数
int year = dt.Date.Year;
int month = dt.Date.Month;
int dayCount = DateTime.DaysInMonth(year, month);
//本月最后一天时间
DateTime dtLast = dtFirst.AddDays(dayCount - 1);
var monthSecond = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID && p.createTime > dtFirst && p.createTime < dtLast, true);
jm.status = true;
jm.data = new
{
count = first + second,
first,
second,
monthCount = monthFirst + monthSecond,
monthFirst,
monthSecond
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取我的订单统计
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderSum()
{
var jm = new WebApiCallBack();
DateTime dt = DateTime.Now;
//本月第一天时间
DateTime dtFirst = dt.AddDays(1 - (dt.Day));
dtFirst = new DateTime(dtFirst.Year, dtFirst.Month, dtFirst.Day, 0, 0, 0);
//获得某年某月的天数
int dayCount = DateTime.DaysInMonth(dt.Date.Year, dt.Date.Month);
//本月最后一天时间
DateTime dtLast = dtFirst.AddDays(dayCount - 1);
//全部订单
var allOrder = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID, true);
//代购订单
var procurementServiceOrder = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID && p.buyUserId == _user.ID, true);
//推广订单
var customerOrder = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID && p.buyUserId != _user.ID, true);
//本月订单
var monthOrder = await _agentOrderServices.GetCountAsync(p => p.userId == _user.ID && p.createTime > dtFirst && p.createTime < dtLast, true);
//全部订单金额
var allOrderMoney = await _agentOrderServices.GetSumAsync(p => p.userId == _user.ID, p => p.amount, true);
//代购订单金额
var procurementServiceOrderMoney = await _agentOrderServices.GetSumAsync(p => p.userId == _user.ID && p.buyUserId == _user.ID, p => p.amount, true);
//推广订单金额
var customerOrderMoney = await _agentOrderServices.GetSumAsync(p => p.userId == _user.ID && p.buyUserId != _user.ID, p => p.amount, true);
//本月订单金额
var monthOrderMoney = await _agentOrderServices.GetSumAsync(p => p.userId == _user.ID && p.createTime > dtFirst && p.createTime < dtLast, p => p.amount, true);
jm.status = true;
jm.data = new
{
allOrder,
procurementServiceOrder,
customerOrder,
monthOrder,
allOrderMoney,
procurementServiceOrderMoney,
customerOrderMoney,
monthOrderMoney
};
return jm;
}
#endregion
#region 广
/// <summary>
/// 我推广的订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> MyOrder([FromBody] FMPageByIntId entity)
{
var jm = await _agentServices.GetMyOrderList(_user.ID, entity.page, entity.limit, entity.id);
return jm;
}
#endregion
#region
/// <summary>
/// 店铺设置
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> SetStore([FromBody] FMSetAgentStorePost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.storeName))
{
jm.msg = "请填写店铺名称";
return jm;
}
if (string.IsNullOrEmpty(entity.storeLogo))
{
jm.msg = "请上传店铺logo";
return jm;
}
if (string.IsNullOrEmpty(entity.storeBanner))
{
jm.msg = "请上传店铺banner";
return jm;
}
var info = await _agentServices.QueryByClauseAsync(p => p.userId == _user.ID);
if (info != null)
{
info.storeLogo = entity.storeLogo;
info.storeBanner = entity.storeBanner;
info.storeDesc = entity.storeDesc;
info.storeName = entity.storeName;
await _agentServices.UpdateAsync(info);
}
jm.status = true;
jm.msg = "保存成功";
return jm;
}
#endregion
#region
/// <summary>
/// 获取代理商排行
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetAgentRanking([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _agentServices.QueryRankingPageAsync(entity.page, entity.limit);
jm.status = true;
jm.data = new
{
data = list,
list.HasNextPage,
list.HasPreviousPage,
list.PageIndex,
list.PageSize,
list.TotalPages,
list.TotalCount,
};
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,127 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 文章api控制器
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class ArticleController : ControllerBase
{
private IHttpContextUser _user;
private readonly ICoreCmsArticleServices _articleServices;
private readonly ICoreCmsArticleTypeServices _articleTypeServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="articleServices"></param>
/// <param name="articleTypeServices"></param>
public ArticleController(IHttpContextUser user, ICoreCmsArticleServices articleServices, ICoreCmsArticleTypeServices articleTypeServices)
{
_user = user;
_articleServices = articleServices;
_articleTypeServices = articleTypeServices;
}
#region
/// <summary>
/// 获取通知列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> NoticeList([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _articleServices.QueryPageAsync(p => p.isDel == false, p => p.createTime, OrderByType.Desc,
entity.page, entity.limit);
jm.status = true;
jm.data = list;
return jm;
}
#endregion
#region
/// <summary>
/// 获取文章列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetArticleList([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _articleServices.QueryPageAsync(p => p.isDel == false && p.typeId == entity.id, p => p.createTime, OrderByType.Desc,
entity.page, entity.limit);
var articleType = await _articleTypeServices.QueryAsync();
var typeName = string.Empty;
if (articleType.Any())
{
var type = articleType.Find(p => p.id == entity.id);
typeName = type != null ? type.name : "";
}
jm.status = true;
jm.data = new
{
list,
articleType,
type_name = typeName,
count = list.TotalCount
};
return jm;
}
#endregion
/// <summary>
/// 获取单个文章内容
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetArticleDetail([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var model = await _articleServices.ArticleDetail(entity.id);
if (model == null)
{
jm.msg = "数据获取失败";
return jm;
}
jm.status = true;
jm.data = model;
return jm;
}
}
}

View File

@@ -0,0 +1,142 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 购物车操作
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class CartController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsCartServices _cartServices;
/// <summary>
/// 构造函数
/// </summary>
public CartController(IHttpContextUser user, ICoreCmsCartServices cartServices)
{
_user = user;
_cartServices = cartServices;
}
//公共接口====================================================================================================
//验证接口====================================================================================================
#region
/// <summary>
/// 添加单个货品到购物车
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> AddCart([FromBody] FMCartAdd entity)
{
var jm = await _cartServices.Add(_user.ID, entity.ProductId, entity.Nums, entity.type, entity.cartType, entity.objectId);
return jm;
}
#endregion
#region ======================================================================
/// <summary>
/// 获取购物车列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetList([FromBody] FMCartGetList entity)
{
var ids = CommonHelper.StringToIntArray(entity.ids);
//判断免费运费
var freeFreight = entity.receiptType != 1;
//获取数据
var jm = await _cartServices.GetCartInfos(_user.ID, ids, entity.type, entity.areaId, entity.point, entity.couponCode, freeFreight, entity.receiptType, entity.objectId);
return jm;
}
#endregion ======================================================================
#region
/// <summary>
/// 获取购物车列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> DoDelete([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
if (entity.id <= 0)
{
jm.msg = "请提交要删除的货品";
return jm;
}
jm = await _cartServices.DeleteByIdsAsync(entity.id, _user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 设置购物车商品数量
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> SetCartNum([FromBody] FMSetCartNum entity)
{
var jm = await _cartServices.SetCartNum(entity.id, entity.nums, _user.ID, 2, 1);
return jm;
}
#endregion
#region 使==================================================
/// <summary>
/// 根据提交的数据判断哪些购物券可以使用
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetCartAvailableCoupon([FromBody] FMCouponForUserCouponPost entity)
{
var ids = CommonHelper.StringToIntArray(entity.ids);
var jm = await _cartServices.GetCartAvailableCoupon(_user.ID, ids);
return jm;
}
#endregion 使==================================================
}
}

View File

@@ -0,0 +1,327 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Aliyun.OSS;
using Aliyun.OSS.Util;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.Options;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using COSXML;
using COSXML.Auth;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 通用调用接口数据
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class CommonController : ControllerBase
{
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsAreaServices _areaServices;
private readonly ICoreCmsServiceDescriptionServices _serviceDescriptionServices;
private readonly ICoreCmsSettingServices _coreCmsSettingServices;
private readonly IToolsServices _toolsServices;
/// <summary>
/// 构造函数
/// </summary>
public CommonController(ICoreCmsSettingServices settingServices
, ICoreCmsAreaServices areaServices
, IWebHostEnvironment webHostEnvironment, ICoreCmsServiceDescriptionServices serviceDescriptionServices, ICoreCmsSettingServices coreCmsSettingServices, IToolsServices toolsServices)
{
_webHostEnvironment = webHostEnvironment;
_serviceDescriptionServices = serviceDescriptionServices;
_coreCmsSettingServices = coreCmsSettingServices;
_toolsServices = toolsServices;
_settingServices = settingServices;
_areaServices = areaServices;
}
//公共接口====================================================================================================
#region =============================================================
/// <summary>
/// 接口测试反馈
/// </summary>
/// <returns></returns>
[HttpPost]
public WebApiCallBack InterFaceTest()
{
var jm = new WebApiCallBack { status = true, msg = "接口访问正常", data = DateTime.Now };
return jm;
}
#endregion
#region V2.0===============================================================
/// <summary>
/// 返回配置数据文件V2.0
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetConfigV2()
{
var jm = new WebApiCallBack { status = true, msg = "接口访问正常", data = DateTime.Now };
var allConfigs = await _settingServices.GetConfigDictionaries();
var shopLogo = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopLogo); //店铺logo
var shopName = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopName); //店铺名称
var shopBeiAn = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopBeiAn); //店铺备案
var shopDesc = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopDesc); //店铺描述
var showStoresSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowStoresSwitch).ObjectToInt(2); //显示门店列表
var showStoreBalanceRechargeSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowStoreBalanceRechargeSwitch).ObjectToInt(2); //显示充值功能
var imageMax = 5; //前端上传图片最多几张
var storeSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreSwitch).ObjectToInt(); //开启门店自提状态
var cateStyle = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CateStyle).ObjectToInt(); //分类样式
var cateType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CateType).ObjectToInt(); //H5分类类型
var toCashMoneyLow = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.TocashMoneyLow); //最低提现
var toCashMoneyRate = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.TocashMoneyRate); //服务费
var pointSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointSwitch).ObjectToInt(); //是否开启积分功能
var statistics = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StatisticsCode); //获取统计代码
var recommendKeysStr = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.RecommendKeys);
var recommendKeys = !string.IsNullOrEmpty(recommendKeysStr) ? recommendKeysStr.Split("|") : new string[] { }; //搜索推荐关键字
var invoiceSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.InvoiceSwitch).ObjectToInt(); //发票功能开关
var goodsStocksWarn = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.GoodsStocksWarn).ObjectToInt(); //库存报警数量
var shopDefaultImage = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopDefaultImage); //获取默认图片
var shopMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopMobile); //店铺联系电话
var openDistribution = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OpenDistribution).ObjectToInt(); //是否开启分销
var distributionNotes = string.Empty;
var distributionAgreement = string.Empty;
var distributionStore = 2;
if (openDistribution == 1)
{
distributionNotes = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionNotes); //用户须知
distributionAgreement = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionAgreement); //分销协议
distributionStore = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionStore).ObjectToInt(2); //是否开启店铺
}
var showInviter = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowInviterInfo).ObjectToInt(); //是否显示邀请人信息
var shareTitle = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShareTitle); //分享标题
var shareDesc = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShareDesc); //分享描述
var shareImage = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShareImage); //分享图片
var aboutArticleId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.AboutArticleId).ObjectToInt(2); //关于我们文章
var entId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.EntId); //客服ID
var userAgreementId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.UserAgreementId).ObjectToInt(3); //用户协议
var privacyPolicyId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PrivacyPolicyId).ObjectToInt(4); //隐私政策
var reshipName = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipName); //退货联系人
var reshipMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipMobile); //退货联系方式
var reshipAreaId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAreaId); //退货区域
var reshipAddress = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAddress); //退货联系方式
var reshipCoordinate = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipCoordinate); //退货坐标
var orderCancelTime = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrderCancelTime).ObjectToInt(60); //订单取消时间
//代理
var isOpenAgent = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.IsOpenAgent).ObjectToInt(); //是否开启代理模块
var isShowAgentPortal = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.IsShowAgentPortal).ObjectToInt(); //是否显示代理模块入口
var agentNotes = string.Empty;
var agentAgreement = string.Empty;
if (isOpenAgent == 1 && isShowAgentPortal == 1)
{
agentNotes = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.AgentNotes); //用户须知
agentAgreement = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.AgentAgreement); //分销协议
}
var model = new
{
shopLogo,
shopName,
shopBeiAn = shopBeiAn,
shopDesc,
imageMax,
storeSwitch,
showStoresSwitch,
showStoreBalanceRechargeSwitch,
cateStyle,
cateType,
toCashMoneyLow,
toCashMoneyRate,
pointSwitch,
statistics,
recommendKeys,
invoiceSwitch,
goodsStocksWarn,
shopDefaultImage,
shopMobile,
openDistribution,
distributionNotes,
distributionAgreement,
distributionStore,
showInviter,
shareTitle,
shareDesc,
shareImage,
aboutArticleId,
entId,
userAgreementId,
privacyPolicyId,
reshipName,
reshipMobile,
reshipAreaId,
reshipAddress,
reshipCoordinate,
orderCancelTime,
isOpenAgent,
isShowAgentPortal,
agentNotes,
agentAgreement
};
jm.data = model;
return jm;
}
#endregion
#region =============================================================================
/// <summary>
/// 获取层级分配后的区域信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetAreas()
{
var jm = new WebApiCallBack();
var areas = await _areaServices.GetCaChe();
jm.status = true;
jm.data = AreaHelper.GetList(areas);
return jm;
}
#endregion
#region
/// <summary>
/// 获取商城关键词说明列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetServiceDescription()
{
var jm = new WebApiCallBack();
var caCheList = await _serviceDescriptionServices.GetCaChe();
jm.status = true;
jm.data = new
{
commonQuestion = caCheList.Where(p => p.type == (int)GlobalEnumVars.ShopServiceNoteType.CommonQuestion && p.isShow == true).OrderBy(p => p.sortId).ToList(),
service = caCheList.Where(p => p.type == (int)GlobalEnumVars.ShopServiceNoteType.Service && p.isShow == true).OrderBy(p => p.sortId).ToList(),
delivery = caCheList.Where(p => p.type == (int)GlobalEnumVars.ShopServiceNoteType.Delivery && p.isShow == true).OrderBy(p => p.sortId).ToList()
};
return jm;
}
#endregion
//验证接口====================================================================================================
#region ====================================================
/// <summary>
/// 上传附件通用接口
/// </summary>
/// <returns></returns>
[Authorize]
[HttpPost]
public async Task<WebApiCallBack> UploadImages()
{
var jm = new WebApiCallBack();
var filesStorageOptions = await _coreCmsSettingServices.GetFilesStorageOptions();
//初始化上传参数
var maxSize = 1024 * 1024 * filesStorageOptions.MaxSize; //上传大小5M
var file = Request.Form.Files["file"];
if (file == null)
{
jm.msg = "请选择文件";
return jm;
}
string fileName = file.FileName;
string fileExt = Path.GetExtension(fileName).ToLowerInvariant();
//检查大小
if (file.Length > maxSize)
{
jm.msg = "上传文件大小超过限制,最大允许上传" + filesStorageOptions.MaxSize + "M";
return jm;
}
//检查文件扩展名
if (string.IsNullOrEmpty(fileExt) ||
Array.IndexOf(filesStorageOptions.FileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
{
jm.msg = "上传文件扩展名是不允许的扩展名,请上传后缀名为:" + filesStorageOptions.FileTypes;
return jm;
}
string url = string.Empty;
if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.LocalStorage.ToString())
{
url = await _toolsServices.UpLoadFileForLocalStorage(filesStorageOptions, fileExt, file, (int)GlobalEnumVars.FilesStorageLocation.API);
}
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.AliYunOSS.ToString())
{
url = await _toolsServices.UpLoadFileForAliYunOSS(filesStorageOptions, fileExt, file);
}
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QCloudOSS.ToString())
{
url = await _toolsServices.UpLoadFileForQCloudOSS(filesStorageOptions, fileExt, file);
}
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QiNiuKoDo.ToString())
{
url = await _toolsServices.UpLoadFileForQiNiuKoDo(filesStorageOptions, fileExt, file);
}
var bl = !string.IsNullOrEmpty(url);
jm.status = bl;
jm.code = bl ? 0 : 1;
jm.msg = bl ? "上传成功!" : "上传失败";
jm.data = new
{
fileUrl = url,
src = url,
imageId = url
};
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,226 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 优惠券接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class CouponController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsCouponServices _couponServices;
private readonly ICoreCmsPromotionServices _promotionServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="couponServices"></param>
/// <param name="promotionServices"></param>
public CouponController(IHttpContextUser user
, ICoreCmsCouponServices couponServices, ICoreCmsPromotionServices promotionServices)
{
_user = user;
_couponServices = couponServices;
_promotionServices = promotionServices;
}
//公共接口====================================================================================================
#region ==================================================
/// <summary>
/// 获取 可领取的优惠券
/// </summary>
/// <returns></returns>
[HttpPost]
//[Authorize]
public async Task<WebApiCallBack> CouponList([FromBody] FMCouponForUserCouponPost entity)
{
var jm = new WebApiCallBack() { msg = "获取失败" };
var list = await _promotionServices.GetReceiveCouponList(entity.page, entity.limit);
jm.status = true;
jm.data = list;
jm.msg = "获取成功";
jm.otherData = new
{
totalCount = 0,
totalPages = 0,
};
if (list != null && list.Any())
{
jm.data = list;
jm.otherData = new
{
list.TotalCount,
list.TotalPages
};
}
return jm;
}
#endregion
//验证接口====================================================================================================
#region ==================================================
/// <summary>
/// 获取优惠券 详情
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> CouponDetail([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack() { msg = "获取失败" };
if (entity.id == 0)
{
jm.status = false;
jm.msg = GlobalErrorCodeVars.Code15006;
return jm;
}
var promotionModel = await _promotionServices.QueryByClauseAsync(p => p.id == entity.id);
if (promotionModel != null)
{
jm.status = true;
jm.data = promotionModel;
jm.msg = "获取成功";
}
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 获取用户已领取的优惠券
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> UserCoupon([FromBody] FMCouponForUserCouponPost entity)
{
var jm = await _couponServices.GetMyCoupon(_user.ID, 0, entity.display, entity.page, entity.limit);
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 用户领取优惠券
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetCoupon([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
if (entity.id == 0)
{
jm.msg = GlobalErrorCodeVars.Code15006;
return jm;
}
//判断优惠券是否可以领取?
var promotionModel = await _promotionServices.ReceiveCoupon(entity.id);
if (promotionModel.status == false)
{
return promotionModel;
}
var promotion = (CoreCmsPromotion)promotionModel.data;
if (promotion == null)
{
jm.msg = GlobalErrorCodeVars.Code15019;
return jm;
}
if (promotion.maxNums > 0)
{
//判断用户是否已领取?领取次数
var couponResult = await _couponServices.GetMyCoupon(_user.ID, entity.id, "all", 1, 9999);
if (couponResult.status && couponResult.code >= promotion.maxNums)
{
jm.msg = GlobalErrorCodeVars.Code15018;
return jm;
}
}
jm = await _couponServices.AddData(_user.ID, entity.id, promotion);
jm.otherData = promotionModel;
return jm;
}
#endregion
#region code领取优惠券==================================================
/// <summary>
/// 用户输入code领取优惠券
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetCouponKey([FromBody] FMCouponForGetCouponKeyPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.key))
{
jm.msg = GlobalErrorCodeVars.Code15006;
return jm;
}
var coupon = await _couponServices.QueryByClauseAsync(p => p.couponCode == entity.key);
if (coupon == null || coupon.promotionId <= 0)
{
jm.msg = GlobalErrorCodeVars.Code15009;
return jm;
}
//判断优惠券是否可以领取?
var promotionModel = await _promotionServices.ReceiveCoupon(coupon.promotionId);
if (promotionModel.status == false)
{
return promotionModel;
}
//判断用户是否已领取?
if (promotionModel.data is CoreCmsPromotion { maxNums: > 0 } info)
{
//判断用户是否已领取?领取次数
var couponResult = await _couponServices.GetMyCoupon(_user.ID, coupon.promotionId, "all", 1, 9999);
if (couponResult.status && couponResult.code > info.maxNums)
{
jm.msg = GlobalErrorCodeVars.Code15018;
return jm;
}
}
//
jm = await _couponServices.ReceiveCoupon(_user.ID, entity.key);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,29 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using Microsoft.AspNetCore.Mvc;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 默认接口示例
/// </summary>
public class DemoController : ControllerBase
{
/// <summary>
/// 默认首页
/// </summary>
/// <returns></returns>
public IActionResult Index()
{
return Content("已结束");
}
}
}

View File

@@ -0,0 +1,313 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 分销请求接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class DistributionController : ControllerBase
{
private readonly ICoreCmsDistributionOrderServices _distributionOrderServices;
private readonly ICoreCmsDistributionServices _distributionServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsUserServices _userServices;
private readonly IHttpContextUser _user;
/// <summary>
/// 构造函数
/// </summary>
public DistributionController(IHttpContextUser user, ICoreCmsDistributionServices distributionServices,
ICoreCmsSettingServices settingServices, ICoreCmsUserServices userServices,
ICoreCmsDistributionOrderServices distributionOrderServices)
{
_user = user;
_distributionServices = distributionServices;
_settingServices = settingServices;
_userServices = userServices;
_distributionOrderServices = distributionOrderServices;
}
//公共接口====================================================================================================
#region
/// <summary>
/// 获取店铺信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetStoreInfo([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
if (entity.id == 0)
{
jm.msg = "店铺信息丢失";
return jm;
}
var store = UserHelper.GetUserIdByShareCode(entity.id);
if (store <= 0)
{
jm.msg = "店铺信息丢失";
return jm;
}
jm = await _distributionServices.GetStore(store);
return jm;
}
#endregion
//验证接口====================================================================================================
#region
/// <summary>
/// 查询用户是否可以成为分销商
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> Info()
{
var jm = await _distributionServices.GetInfo(_user.ID, true);
return jm;
}
#endregion
#region
/// <summary>
/// 申请成为分销商接口
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> ApplyDistribution([FromBody] FMDistributionApply entity)
{
var jm = new WebApiCallBack();
if (entity.agreement != "on")
{
jm.msg = "请勾选分销协议";
return jm;
}
var iData = new CoreCmsDistribution();
iData.mobile = entity.mobile;
iData.name = entity.name;
iData.weixin = entity.weixin;
iData.qq = entity.qq;
jm = await _distributionServices.AddData(iData, _user.ID);
return jm;
}
#endregion
#region 广
/// <summary>
/// 我推广的订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> MyOrder([FromBody] FMPageByIntId entity)
{
var jm = await _distributionServices.GetMyOrderList(_user.ID, entity.page, entity.limit, entity.id);
return jm;
}
#endregion
#region
/// <summary>
/// 店铺设置
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> SetStore([FromBody] FMSetDistributionStorePost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.storeName))
{
jm.msg = "请填写店铺名称";
return jm;
}
if (string.IsNullOrEmpty(entity.storeLogo))
{
jm.msg = "请上传店铺logo";
return jm;
}
if (string.IsNullOrEmpty(entity.storeBanner))
{
jm.msg = "请上传店铺banner";
return jm;
}
var info = await _distributionServices.QueryByClauseAsync(p => p.userId == _user.ID);
if (info != null)
{
info.storeLogo = entity.storeLogo;
info.storeBanner = entity.storeBanner;
info.storeDesc = entity.storeDesc;
info.storeName = entity.storeName;
await _distributionServices.UpdateAsync(info);
}
jm.status = true;
jm.msg = "保存成功";
return jm;
}
#endregion
#region
/// <summary>
/// 获取我的订单统计
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderSum()
{
var jm = new WebApiCallBack();
//全部订单
var allOrder = await _distributionOrderServices.QueryChildOrderCountAsync(_user.ID, 0);
//一级订单
var firstOrder = await _distributionOrderServices.QueryChildOrderCountAsync(_user.ID);
//二级订单
var secondOrder = await _distributionOrderServices.QueryChildOrderCountAsync(_user.ID, 2);
//本月订单
var monthOrder = await _distributionOrderServices.QueryChildOrderCountAsync(_user.ID, 0, true);
//全部订单金额
var allOrderMoney = await _distributionOrderServices.QueryChildOrderMoneySumAsync(_user.ID, 0);
//代购订单金额
var firstOrderMoney = await _distributionOrderServices.QueryChildOrderMoneySumAsync(_user.ID);
//推广订单金额
var secondOrderMoney = await _distributionOrderServices.QueryChildOrderMoneySumAsync(_user.ID, 2);
//本月订单金额
var monthOrderMoney = await _distributionOrderServices.QueryChildOrderMoneySumAsync(_user.ID, 0, true);
jm.status = true;
jm.data = new
{
allOrder,
firstOrder,
secondOrder,
monthOrder,
allOrderMoney,
firstOrderMoney,
secondOrderMoney,
monthOrderMoney
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取我的下级用户数量
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetTeamSum()
{
var jm = new WebApiCallBack();
//一级统计人数
var first = await _userServices.QueryChildCountAsync(_user.ID);
//二级发展人数
var second = await _userServices.QueryChildCountAsync(_user.ID, 2);
//当月发展一级人数
var monthFirst = await _userServices.QueryChildCountAsync(_user.ID, 1, true);
//当月发展二级分数
var monthSecond = await _userServices.QueryChildCountAsync(_user.ID, 2, true);
jm.status = true;
jm.data = new
{
count = first + second,
first,
second,
monthCount = monthFirst + monthSecond,
monthFirst,
monthSecond
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取分销商排行
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetDistributionRanking([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _distributionServices.QueryRankingPageAsync(entity.page, entity.limit);
jm.status = true;
jm.data = new
{
data = list,
list.HasNextPage,
list.HasPreviousPage,
list.PageIndex,
list.PageSize,
list.TotalPages,
list.TotalCount
};
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,79 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 表单接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class FormController : ControllerBase
{
private readonly ICoreCmsFormServices _formServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="formServices"></param>
public FormController(ICoreCmsFormServices formServices)
{
_formServices = formServices;
}
#region /=============================================================================
/// <summary>
/// 万能表单/获取活动商品详情
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetFormDetial([FromBody] FmGetForm entity)
{
var jm = await _formServices.GetFormInfo(entity.id, entity.token);
return jm;
}
#endregion
#region /=============================================================================
/// <summary>
/// 万能表单/提交表单
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> AddSubmit([FromBody] FmAddSubmit entity)
{
var jm = await _formServices.AddSubmit(entity);
jm.otherData = entity;
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,495 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using AutoMapper;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 商品相关接口处理
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class GoodController : ControllerBase
{
private IMapper _mapper;
private readonly IHttpContextUser _user;
private ICoreCmsSettingServices _settingServices;
private ICoreCmsGoodsCategoryServices _goodsCategoryServices;
private ICoreCmsGoodsServices _goodsServices;
private ICoreCmsProductsServices _productsServices;
private ICoreCmsBrandServices _brandServices;
private ICoreCmsOrderItemServices _orderItemServices;
private ICoreCmsGoodsCommentServices _goodsCommentServices;
private ICoreCmsGoodsParamsServices _goodsParamsServices;
private ICoreCmsGoodsCollectionServices _goodsCollectionServices;
private ICoreCmsUserServices _userServices;
/// <summary>
/// 构造函数
/// </summary>
public GoodController(IMapper mapper
, IHttpContextUser user
, ICoreCmsSettingServices settingServices
, ICoreCmsGoodsCategoryServices goodsCategoryServices
, ICoreCmsGoodsServices goodsServices
, ICoreCmsProductsServices productsServices
, ICoreCmsBrandServices brandServices
, ICoreCmsOrderItemServices orderItemServices
, ICoreCmsGoodsCommentServices goodsCommentServices
, ICoreCmsGoodsParamsServices goodsParamsServices
, ICoreCmsGoodsCollectionServices goodsCollectionServices
, ICoreCmsUserServices userServices
)
{
_mapper = mapper;
_user = user;
_settingServices = settingServices;
_goodsCategoryServices = goodsCategoryServices;
_goodsServices = goodsServices;
_productsServices = productsServices;
_brandServices = brandServices;
_orderItemServices = orderItemServices;
_goodsCommentServices = goodsCommentServices;
_goodsParamsServices = goodsParamsServices;
_goodsCollectionServices = goodsCollectionServices;
_userServices = userServices;
}
//公共接口====================================================================================================
#region
/// <summary>
/// 获取所有商品分类栏目数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetAllCategories()
{
var jm = new WebApiCallBack() { status = true };
var data = await _goodsCategoryServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort,
OrderByType.Asc);
var wxGoodCategoryDto = new List<WxGoodCategoryDto>();
var parents = data.Where(p => p.parentId == 0).ToList();
if (parents.Any())
{
parents.ForEach(p =>
{
var model = new WxGoodCategoryDto();
model.id = p.id;
model.name = p.name;
model.imageUrl = !string.IsNullOrEmpty(p.imageUrl) ? p.imageUrl : "/static/images/common/empty.png";
model.sort = p.sort;
var childs = data.Where(p => p.parentId == model.id).ToList();
if (childs.Any())
{
var childsList = new List<WxGoodCategoryChild>();
childs.ForEach(o =>
{
childsList.Add(new WxGoodCategoryChild()
{
id = o.id,
imageUrl = !string.IsNullOrEmpty(o.imageUrl) ? o.imageUrl : "/static/images/common/empty.png",
name = o.name,
sort = o.sort
});
});
model.child = childsList;
}
wxGoodCategoryDto.Add(model);
});
}
jm.status = true;
jm.data = wxGoodCategoryDto;
return jm;
}
#endregion
#region ============================================================
/// <summary>
/// 根据查询条件获取分页数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsPageList([FromBody] FMPageByWhereOrder entity)
{
var jm = new WebApiCallBack();
var where = PredicateBuilder.True<CoreCmsGoods>();
where = where.And(p => p.isDel == false);
where = where.And(p => p.isMarketable == true);
var className = string.Empty;
if (!string.IsNullOrWhiteSpace(entity.where))
{
var obj = JsonConvert.DeserializeAnonymousType(entity.where, new
{
priceFrom = "",
priceTo = "",
catId = "",
brandId = "",
labelId = "",
searchName = "",
});
if (!string.IsNullOrWhiteSpace(obj.priceFrom))
{
var priceF = obj.priceFrom.ObjectToDouble(0);
if (priceF >= 0)
{
var f = Convert.ToDecimal(priceF);
where = where.And(p => p.price >= f);
}
}
if (!string.IsNullOrWhiteSpace(obj.priceTo))
{
var priceT = obj.priceTo.ObjectToDouble(0);
if (priceT > 0)
{
var f = Convert.ToDecimal(priceT);
where = where.And(p => p.price <= f);
}
}
if (!string.IsNullOrWhiteSpace(obj.catId))
{
var catId = obj.catId.ObjectToInt(0);
if (catId > 0)
{
var category = await _goodsCategoryServices.QueryByIdAsync(catId);
if (category != null)
{
className = category.name;
}
var childs = await _goodsCategoryServices.QueryListByClauseAsync(p => p.parentId == catId);
if (childs.Any())
{
var ids = childs.Select(p => p.id).ToList();
where = where.And(p => ids.Contains(p.goodsCategoryId) || p.goodsCategoryId == catId);
}
else
{
where = where.And(p => p.goodsCategoryId == catId);
}
}
}
if (!string.IsNullOrWhiteSpace(obj.brandId))
{
var brandId = obj.brandId.ObjectToInt(0);
if (brandId > 0)
{
where = where.And(p => p.brandId == brandId);
}
}
if (!string.IsNullOrWhiteSpace(obj.labelId))
{
where = where.And(p => (',' + p.labelIds.Trim(',') + ',').Contains(',' + obj.labelId.Trim(',') + ','));
}
if (!string.IsNullOrWhiteSpace(obj.searchName))
{
where = where.And(p => p.name.Contains(obj.searchName));
}
}
var orderBy = " isRecommend desc,isHot desc";
if (!string.IsNullOrWhiteSpace(entity.order))
{
orderBy += "," + entity.order;
}
//获取数据
var list = await _goodsServices.QueryPageAsync(where, orderBy, entity.page, entity.limit, false);
if (list.Any())
{
foreach (var goods in list)
{
goods.images = !string.IsNullOrEmpty(goods.images) ? goods.images.Split(",")[0] : "/static/images/common/empty.png";
}
}
//获取品牌
var brands = await _brandServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Desc);
//返回数据
jm.status = true;
jm.data = new
{
list,
className,
entity.page,
list.TotalCount,
list.TotalPages,
entity.limit,
entity.where,
entity.order,
brands
};
jm.msg = "数据调用成功!";
return jm;
}
#endregion
#region ======================================================================
/// <summary>
/// 获取商品详情
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetDetial([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var userId = 0;
if (_user != null)
{
userId = _user.ID;
}
var model = await _goodsServices.GetGoodsDetial(entity.id, userId, false);
if (model == null)
{
jm.msg = "商品获取失败";
return jm;
}
jm.status = true;
jm.msg = "获取商品详情成功";
jm.data = model;
jm.methodDescription = JsonConvert.SerializeObject(_user);
return jm;
}
#endregion
#region ======================================================================
/// <summary>
/// 获取单个货品信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetProductInfo([FromBody] FMGetProductInfo entity)
{
var jm = new WebApiCallBack();
var userId = 0;
if (_user != null)
{
userId = _user.ID;
}
bool bl = entity.type == "pinTuan" || entity.type == "group";
var getProductInfo = await _productsServices.GetProductInfo(entity.id, bl, userId, entity.type, entity.groupId);
if (getProductInfo == null)
{
jm.msg = "获取单个货品失败";
return jm;
}
jm.status = true;
jm.msg = "获取单个货品成功";
jm.data = getProductInfo;
return jm;
}
#endregion
#region ======================================================================
/// <summary>
/// 获取商品评价列表分页数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsComment([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
//获取数据
var list = await _goodsCommentServices.QueryPageAsync(p => p.goodsId == entity.id && p.isDisplay == true, p => p.createTime, OrderByType.Desc, entity.page, entity.limit);
if (list.Any())
{
foreach (var item in list)
{
item.imagesArr = !string.IsNullOrEmpty(item.images) ? item.images.Split(",") : null;
}
}
jm.status = true;
jm.msg = "获取评论成功";
jm.data = new
{
list,
commentsCount = list.TotalCount,
totalPages = list.TotalPages
};
return jm;
}
#endregion
#region ======================================================================
/// <summary>
/// 获取单个商品参数
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsParams([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
//获取数据
var goods = await _goodsServices.QueryByIdAsync(entity.id);
if (goods == null)
{
jm.msg = GlobalConstVars.DataisNo;
return jm;
}
var list = new List<WxNameValueDto>();
var goodsParams = await _goodsParamsServices.QueryAsync();
if (!string.IsNullOrEmpty(goods.parameters))
{
var arrItem = goods.parameters.Split("|");
foreach (var item in arrItem)
{
if (!item.Contains(":")) continue;
var childArr = item.Split(":");
if (childArr.Length == 2)
{
var paramsId = Convert.ToInt32(childArr[0]);
var paramsModel = goodsParams.First(p => p.id == paramsId);
if (paramsModel != null)
{
list.Add(new WxNameValueDto()
{
name = paramsModel.name,
value = childArr[1]
});
}
}
}
}
jm.status = true;
jm.msg = "获取商品参数成功";
jm.data = list;
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 获取随机推荐商品
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsRecommendList([FromBody] FMIntId entity)
{
if (entity.id <= 0)
{
entity.id = 10;
}
var bl = entity.data.ObjectToBool();
var jm = new WebApiCallBack()
{
status = true,
code = 0,
msg = "获取成功",
data = await _goodsServices.GetGoodsRecommendList(entity.id, bl)
};
return jm;
}
#endregion
//验证接口====================================================================================================
#region Token获取商品详情======================================================================
/// <summary>
/// 根据Token获取商品详情
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetDetialByToken([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var userId = 0;
if (_user != null)
{
userId = _user.ID;
}
var model = await _goodsServices.GetGoodsDetial(entity.id, userId, false);
if (model == null)
{
jm.msg = "商品获取失败";
return jm;
}
await _goodsServices.UpdateAsync(p => new CoreCmsGoods() { viewCount = p.viewCount + 1 },
p => p.id == entity.id);
jm.status = true;
jm.msg = "获取商品详情成功";
jm.data = model;
jm.methodDescription = JsonConvert.SerializeObject(_user);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,84 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 团购调用接口数据
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class GroupController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsPromotionServices _coreCmsPromotionServices;
private ICoreCmsGoodsServices _goodsServices;
/// <summary>
/// 构造函数
/// </summary>
public GroupController(IHttpContextUser user, ICoreCmsPromotionServices coreCmsPromotionServices, ICoreCmsGoodsServices goodsServices)
{
_user = user;
_coreCmsPromotionServices = coreCmsPromotionServices;
_goodsServices = goodsServices;
}
//公共接口====================================================================================================
#region ===========================================================
/// <summary>
/// 获取秒杀团购列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetList([FromBody] FMGroupGetListPost entity)
{
var jm = await _coreCmsPromotionServices.GetGroupList(entity.type, _user.ID, entity.status, entity.page, entity.limit);
return jm;
}
#endregion
#region ===========================================================
/// <summary>
/// 获取秒杀团购详情
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsDetial([FromBody] FMGetGoodsDetial entity)
{
var jm = await _coreCmsPromotionServices.GetGroupDetail(entity.id, 0, "group", entity.groupId);
return jm;
}
#endregion
//验证接口====================================================================================================
}
}

View File

@@ -0,0 +1,95 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 公告控制器
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class NoticeController : ControllerBase
{
private IHttpContextUser _user;
private ICoreCmsNoticeServices _noticeServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="noticeServices"></param>
public NoticeController(IHttpContextUser user, ICoreCmsNoticeServices noticeServices)
{
_user = user;
_noticeServices = noticeServices;
}
#region
/// <summary>
/// 列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> NoticeList([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var list = await _noticeServices.QueryPageAsync(p => p.isDel == false, p => p.createTime, OrderByType.Desc,
entity.page, entity.limit);
jm.status = true;
jm.data = list;
return jm;
}
#endregion
/// <summary>
/// 获取单个公告内容
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> NoticeInfo([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var model = await _noticeServices.QueryByIdAsync(entity.id);
if (model == null)
{
jm.msg = "数据获取失败";
return jm;
}
jm.status = true;
jm.data = model;
return jm;
}
}
}

View File

@@ -0,0 +1,528 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 订单调用接口数据
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class OrderController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsOrderServices _orderServices;
private readonly ICoreCmsBillAftersalesServices _aftersalesServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsAreaServices _areaServices;
private readonly ICoreCmsBillReshipServices _reshipServices;
private readonly ICoreCmsShipServices _shipServices;
private readonly ICoreCmsBillDeliveryServices _billDeliveryServices;
private readonly ICoreCmsLogisticsServices _logisticsServices;
private readonly ICoreCmsGoodsServices _goodsServices;
private readonly ICoreCmsStoreServices _storeServices;
/// <summary>
/// 构造函数
/// </summary>
public OrderController(IHttpContextUser user
, ICoreCmsOrderServices orderServices
, ICoreCmsBillAftersalesServices aftersalesServices
, ICoreCmsSettingServices settingServices
, ICoreCmsAreaServices areaServices
, ICoreCmsBillReshipServices reshipServices, ICoreCmsShipServices shipServices
, ICoreCmsBillDeliveryServices billDeliveryServices, ICoreCmsLogisticsServices logisticsServices, ICoreCmsGoodsServices goodsServices, ICoreCmsStoreServices storeServices)
{
_user = user;
_orderServices = orderServices;
_aftersalesServices = aftersalesServices;
_settingServices = settingServices;
_areaServices = areaServices;
_reshipServices = reshipServices;
_shipServices = shipServices;
_billDeliveryServices = billDeliveryServices;
_logisticsServices = logisticsServices;
_goodsServices = goodsServices;
_storeServices = storeServices;
}
//公共接口====================================================================================================
//验证接口====================================================================================================
#region ==================================================
/// <summary>
/// 发票模糊查询
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetTaxCode([FromBody] GetTaxCodePost entity)
{
var jm = await _orderServices.GetTaxCode(entity.name);
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 创建订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> CreateOrder([FromBody] CreateOrder entity)
{
var jm = new WebApiCallBack();
var type = entity.receiptType;
if (type == (int)GlobalEnumVars.OrderReceiptType.Logistics || type == (int)GlobalEnumVars.OrderReceiptType.IntraCityService)
{
//收货地址id
if (entity.ushipId == 0)
{
jm.data = 13001;
jm.msg = GlobalErrorCodeVars.Code13001;
}
}
else if (type == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
{
//提货门店
if (entity.storeId == 0)
{
jm.data = 13001;
jm.msg = GlobalErrorCodeVars.Code13001;
}
//提货人姓名 提货人电话
if (string.IsNullOrEmpty(entity.ladingName))
{
jm.data = 13001;
jm.msg = "请输入姓名";
}
if (string.IsNullOrEmpty(entity.ladingMobile))
{
jm.data = 13001;
jm.msg = "请输入电话";
}
}
else
{
jm.data = 13001;
jm.msg = "未查询到配送方式";
}
if (string.IsNullOrEmpty(entity.cartIds))
{
jm.data = 10000;
jm.msg = GlobalErrorCodeVars.Code10000;
}
jm = await _orderServices.ToAdd(_user.ID, entity.orderType, entity.cartIds, entity.receiptType,
entity.ushipId, entity.storeId, entity.ladingName, entity.ladingMobile, entity.memo,
entity.point, entity.couponCode, entity.source, entity.scene, entity.taxType, entity.taxName,
entity.taxCode, entity.objectId, entity.teamId);
jm.otherData = entity;
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 订单预览
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> OrderDetails([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
var userId = _user.ID;
if ((string)entity.data == "merchant")
{
var store = await _storeServices.GetStoreByUserId(_user.ID);
if (store == null)
{
jm.status = false;
jm.msg = "你不是店员";
return jm;
}
else
{
userId = 0;
}
}
jm = await _orderServices.GetOrderInfoByOrderId(entity.id, userId);
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 获取订单不同状态的数量
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderStatusNum([FromBody] GetOrderStatusNumPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.ids))
{
jm.msg = "请提交要查询的订单统计类型";
}
var ids = CommonHelper.StringToIntArray(entity.ids);
jm = await _orderServices.GetOrderStatusNum(_user.ID, ids, entity.isAfterSale);
return jm;
}
#endregion
#region =======================================================
/// <summary>
/// 获取个人订单列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderList([FromBody] GetOrderListPost entity)
{
var jm = await _orderServices.GetOrderList(entity.status, _user.ID, entity.page, entity.limit);
return jm;
}
#endregion
#region ====================================================
/// <summary>
/// 取消订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> CancelOrder([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交要取消的订单号";
return jm;
}
var ids = entity.id.Split(",");
jm = await _orderServices.CancelOrder(ids, _user.ID);
return jm;
}
#endregion
#region ====================================================
/// <summary>
/// 删除订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> DeleteOrder([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交要取消的订单号";
return jm;
}
var ids = entity.id.Split(",");
jm.status = await _orderServices.DeleteAsync(p => ids.Contains(p.orderId) && p.userId == _user.ID);
jm.msg = jm.status ? "删除成功" : "删除失败";
return jm;
}
#endregion
#region ====================================================
/// <summary>
/// 确认签收订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> OrderConfirm([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交要确认签收的订单号";
return jm;
}
jm = await _orderServices.ConfirmOrder(entity.id, Convert.ToInt32(entity.data));
return jm;
}
#endregion
#region =======================================================
/// <summary>
/// 添加售后单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> AddAftersales([FromBody] ToAddBillAfterSalesPost entity)
{
var jm = new WebApiCallBack();
jm.otherData = entity;
if (string.IsNullOrEmpty(entity.orderId))
{
jm.msg = GlobalErrorCodeVars.Code13100;
jm.code = 13100;
return jm;
}
if (entity.type == 0)
{
jm.msg = GlobalErrorCodeVars.Code10051;
jm.code = 10051;
return jm;
}
jm = await _aftersalesServices.ToAdd(_user.ID, entity.orderId, entity.type, entity.items, entity.images,
entity.reason, entity.refund);
return jm;
}
#endregion
#region =======================================================
/// <summary>
/// 获取售后单列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> AftersalesList([FromBody] FMPageByStringId entity)
{
var jm = new WebApiCallBack();
jm.status = true;
jm.msg = "数据获取成功";
var where = PredicateBuilder.True<CoreCmsBillAftersales>();
where = where.And(p => p.userId == _user.ID);
if (!string.IsNullOrEmpty(entity.order))
{
where = where.And(p => p.orderId == entity.id);
}
var data = await _aftersalesServices.QueryPageAsync(where, p => p.createTime, OrderByType.Desc, entity.page, entity.limit);
jm.data = new
{
list = data,
page = data.PageIndex,
totalPage = data.TotalPages,
hasNextPage = data.HasNextPage
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取售后单列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> Aftersalesinfo([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack { status = true, msg = "数据获取成功" };
var info = await _aftersalesServices.GetInfo(entity.id, _user.ID);
var allConfigs = await _settingServices.GetConfigDictionaries();
var reshipAddress = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAddress);
var reshipArea = string.Empty;
var reshipId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAreaId).ObjectToInt(0);
if (reshipId > 0)
{
var result = await _areaServices.GetAreaFullName(reshipId);
if (result.status)
{
reshipArea = result.data.ToString();
}
}
var reshipMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipMobile);
var reshipName = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipName);
var reship = new
{
reshipAddress,
reshipArea,
reshipMobile,
reshipName
};
jm.data = new
{
info,
reship
};
return jm;
}
#endregion
#region
/// <summary>
/// 提交售后发货快递信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> SendReship([FromBody] FMBillReshipForSendReshipPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.reshipId))
{
jm.data = jm.msg = GlobalErrorCodeVars.Code13212;
return jm;
}
else if (string.IsNullOrEmpty(entity.logiCode))
{
jm.data = jm.msg = GlobalErrorCodeVars.Code13213;
return jm;
}
else if (string.IsNullOrEmpty(entity.logiNo))
{
jm.data = jm.msg = GlobalErrorCodeVars.Code13214;
return jm;
}
var model = await _reshipServices.QueryByIdAsync(entity.reshipId);
if (model == null)
{
jm.data = jm.msg = GlobalErrorCodeVars.Code13211;
return jm;
}
var up = await _reshipServices.UpdateAsync(
p => new CoreCmsBillReship()
{
logiCode = entity.logiCode,
logiNo = entity.logiNo,
status = (int)GlobalEnumVars.BillReshipStatus.
}, p => p.reshipId == entity.reshipId);
jm.status = true;
jm.msg = "数据保存成功";
return jm;
}
#endregion
#region =======================================================
/// <summary>
/// 获取配送方式列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public WebApiCallBack GetShip([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
jm.msg = "暂未设置配送方式";
var ship = _shipServices.GetShip(entity.id);
if (ship != null)
{
jm.status = true;
jm.data = ship;
jm.msg = "获取成功";
}
return jm;
}
#endregion
#region =======================================================
/// <summary>
/// 前台物流查询接口
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> LogisticsByApi([FromBody] FMApiLogisticsByApiPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.code) || string.IsNullOrEmpty(entity.no))
{
jm.msg = GlobalErrorCodeVars.Code13225;
return jm;
}
var systemLogistics = SystemSettingDictionary.GetSystemLogistics();
foreach (var p in systemLogistics)
{
if (entity.code == p.sKey)
{
jm.msg = p.sDescription + "不支持轨迹查询";
return jm;
}
}
jm = await _logisticsServices.ExpressPoll(entity.code, entity.no, entity.mobile);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,162 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 页面接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class PageController : ControllerBase
{
private IMapper _mapper;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsPagesServices _pagesServices;
private readonly ICoreCmsOrderServices _orderServices;
private readonly ICoreCmsUserServices _userServices;
/// <summary>
/// 构造函数
/// </summary>
public PageController(IMapper mapper
, ICoreCmsSettingServices settingServices
, ICoreCmsPagesServices pagesServices
, ICoreCmsOrderServices orderServices
, ICoreCmsUserServices userServices)
{
_mapper = mapper;
_settingServices = settingServices;
_pagesServices = pagesServices;
_orderServices = orderServices;
_userServices = userServices;
}
//公共接口====================================================================================================
#region =============================================================
/// <summary>
/// 获取页面布局数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
[Description("获取页面布局数据")]
public async Task<WebApiCallBack> GetPageConfig([FromBody] FMWxPost entity)
{
var jm = await _pagesServices.GetPageConfig(entity.code);
return jm;
}
#endregion
#region =============================================================
/// <summary>
/// 获取用户购买记录
/// </summary>
[HttpPost]
[Description("获取用户购买记录")]
public async Task<WebApiCallBack> GetRecod([FromBody] FMGetRecodPost entity)
{
var jm = new WebApiCallBack() { status = true, msg = "获取成功", otherData = entity };
/***
* 随机数
* 其它随机数据,需要自己补充
*/
//logo作为头像
Random rand = new Random();
var allConfigs = await _settingServices.GetConfigDictionaries();
var avatar = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopLogo);
var names = new string[] { "无人像你", "啭裑①羣豞", "朕射妳无罪", "骑着蜗牛狂奔", "残孤星", "上网可以别开QVOD", "请把QQ留下", "蹭网可以,一小时两块钱", "I在。哭泣", "不倾国倾城只倾他一人", "你再发光我就拔你插头", "家,世间最温暖的地方", "挥着鸡翅膀的女孩", "难不难过都是一个人过", "原谅我盛装出席只为错过你", "残孤星", "只适合被遗忘", "爱情,算个屁丶", "执子辶掱", "朕今晚翻你牌子", "①苆兜媞命", "中华一样的高傲", "始于心动止于枯骨", "我们幸福呢", "表白失败,勿扰", "髮型吥能亂", "陽咣丅啲憂喐", "你棺材是翻盖的还是滑盖的", "孤枕", "泪颜葬相思", "喵星人", "超拽霸气的微博名字", "晚安晚安晚晚难安", "却输给了秒", "为什么我吃德芙没有黑丝飘", "请输入我大" };
var listUsers = new List<RandUser>();
foreach (var itemName in names)
{
var min = rand.Next(100, 1000);
var createTime = DateTime.Now.AddMinutes(-min);
listUsers.Add(new RandUser()
{
avatar = avatar,
createTime = CommonHelper.TimeAgo(createTime),
nickname = itemName,
desc = "下单成功",
dt = createTime
});
}
if (entity.type == "home")
{
//数据库里面随机取出来几条数据
var orders = await _orderServices.QueryListByClauseAsync(p => p.isdel == false, 20, p => p.createTime,
OrderByType.Desc);
if (orders != null && orders.Any())
{
Random rd = new Random();
var index = rd.Next(orders.Count);
var orderItem = orders[index];
if (orderItem != null)
{
var user = await _userServices.QueryByIdAsync(orderItem.userId);
if (user != null && !string.IsNullOrEmpty(user.nickName))
{
jm.data = new RandUser()
{
avatar = !string.IsNullOrEmpty(user.avatarImage) ? user.avatarImage : avatar,
createTime = CommonHelper.TimeAgo(orderItem.createTime),
nickname = user.nickName,
desc = "下单成功",
dt = orderItem.createTime
};
}
}
}
else
{
Random rd = new Random();
var listI = rd.Next(listUsers.Count);
jm.data = listUsers[listI];
}
}
return jm;
}
#endregion
//验证接口====================================================================================================
}
}

View File

@@ -0,0 +1,283 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Threading.Tasks;
using System.Xml;
using Essensoft.Paylink.Alipay;
using Essensoft.Paylink.Alipay.Notify;
using Essensoft.Paylink.Alipay.Utility;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify
{
/// <summary>
/// 支付宝异步通知
/// </summary>
[Route("Notify/[controller]/[action]")]
public class AliPayController : ControllerBase
{
private readonly IAlipayNotifyClient _client;
private readonly IOptions<AlipayOptions> _optionsAccessor;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="client"></param>
/// <param name="optionsAccessor"></param>
public AliPayController(IAlipayNotifyClient client, IOptions<AlipayOptions> optionsAccessor)
{
_client = client;
_optionsAccessor = optionsAccessor;
}
/// <summary>
/// 应用网关
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Gateway()
{
try
{
var service = Request.Form["service"].ToString();
switch (service)
{
// 激活开发者模式
case "alipay.service.check":
{
var options = _optionsAccessor.Value;
// 获取参数
var parameters =await _client.GetParametersAsync(Request);
var sign = parameters["sign"];
parameters.Remove("sign");
var signContent = AlipaySignature.GetSignContent(parameters);
// 验签
//var isSuccess = AlipaySignature.RSACheckContent(signContent, sign, options.AlipayPublicKey, options.SignType);
// 验签
var isSuccess = AlipaySignature.RSACheckContent(signContent, sign, options.AlipayPublicKey, options.SignType);
// 组XML响应内容
//var response = MakeVerifyGWResponse(isSuccess, options.AlipayPublicKey, options.AppPrivateKey, options.SignType);
var response = MakeVerifyGwResponse(isSuccess, options.AlipayPublicKey, options.AppPrivateKey, options.SignType);
return Content(response, "text/xml");
}
}
var msg_method = Request.Form["msg_method"].ToString();
switch (msg_method)
{
// 资金单据状态变更通知
case "alipay.fund.trans.order.changed":
{
var notify = await _client.CertificateExecuteAsync<AlipayFundTransOrderChangedNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 第三方应用授权取消消息
case "alipay.open.auth.appauth.cancelled":
{
var notify = await _client.CertificateExecuteAsync<AlipayOpenAuthAppauthCancelledNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 用户授权取消消息
case "alipay.open.auth.userauth.cancelled":
{
var notify = await _client.CertificateExecuteAsync<AlipayOpenAuthUserauthCancelledNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 小程序审核通过通知
case "alipay.open.mini.version.audit.passed":
{
var notify = await _client.CertificateExecuteAsync<AlipayOpenMiniVersionAuditPassedNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 用户授权取消消息
case "alipay.open.mini.version.audit.rejected":
{
var notify = await _client.CertificateExecuteAsync<AlipayOpenMiniVersionAuditRejectedNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 收单资金结算到银行账户,结算退票的异步通知
case "alipay.trade.settle.dishonoured":
{
var notify = await _client.CertificateExecuteAsync<AlipayTradeSettleDishonouredNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 收单资金结算到银行账户,结算失败的异步通知
case "alipay.trade.settle.fail":
{
var notify = await _client.CertificateExecuteAsync<AlipayTradeSettleFailNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
// 收单资金结算到银行账户,结算成功的异步通知
case "alipay.trade.settle.success":
{
var notify = await _client.CertificateExecuteAsync<AlipayTradeSettleSuccessNotify>(Request, _optionsAccessor.Value);
return AlipayNotifyResult.Success;
}
}
return NoContent();
}
catch
{
return NoContent();
}
}
/// <summary>
/// 扫码支付异步通知
/// </summary>
[HttpPost]
public async Task<IActionResult> Precreate()
{
try
{
var notify = await _client.CertificateExecuteAsync<AlipayTradePrecreateNotify>(Request, _optionsAccessor.Value);
if (notify.TradeStatus == AlipayTradeStatus.Success)
{
Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
return AlipayNotifyResult.Success;
}
return NoContent();
}
catch
{
return NoContent();
}
}
/// <summary>
/// APP支付异步通知
/// </summary>
[HttpPost]
public async Task<IActionResult> AppPay()
{
try
{
var notify = await _client.CertificateExecuteAsync<AlipayTradeAppPayNotify>(Request, _optionsAccessor.Value);
if (notify.TradeStatus == AlipayTradeStatus.Success)
{
Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
return AlipayNotifyResult.Success;
}
return NoContent();
}
catch
{
return NoContent();
}
}
/// <summary>
/// 电脑网站支付异步通知
/// </summary>
[HttpPost]
public async Task<IActionResult> PagePay()
{
try
{
var notify = await _client.CertificateExecuteAsync<AlipayTradePagePayNotify>(Request, _optionsAccessor.Value);
if (notify.TradeStatus == AlipayTradeStatus.Success)
{
Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
return AlipayNotifyResult.Success;
}
return NoContent();
}
catch
{
return NoContent();
}
}
/// <summary>
/// 手机网站支付异步通知
/// </summary>
[HttpPost]
public async Task<IActionResult> WapPay()
{
try
{
var notify = await _client.CertificateExecuteAsync<AlipayTradeWapPayNotify>(Request, _optionsAccessor.Value);
if (notify.TradeStatus == AlipayTradeStatus.Success)
{
Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
return AlipayNotifyResult.Success;
}
return NoContent();
}
catch
{
return NoContent();
}
}
private static string MakeVerifyGwResponse(bool isSuccess, string certPublicKey, string appPrivateKey, string signType)
{
var xmlDoc = new XmlDocument(); //创建实例
var xmldecl = xmlDoc.CreateXmlDeclaration("1.0", "GBK", null);
xmlDoc.AppendChild(xmldecl);
var xmlElem = xmlDoc.CreateElement("alipay"); //新建元素
xmlDoc.AppendChild(xmlElem); //添加元素
var alipay = xmlDoc.SelectSingleNode("alipay");
var response = xmlDoc.CreateElement("response");
var success = xmlDoc.CreateElement("success");
if (isSuccess)
{
success.InnerText = "true";//设置文本节点
response.AppendChild(success);//添加到<Node>节点中
}
else
{
success.InnerText = "false";//设置文本节点
response.AppendChild(success);//添加到<Node>节点中
var err = xmlDoc.CreateElement("error_code");
err.InnerText = "VERIFY_FAILED";
response.AppendChild(err);
}
var bizContent = xmlDoc.CreateElement("biz_content");
bizContent.InnerText = certPublicKey;
response.AppendChild(bizContent);
alipay.AppendChild(response);
var sign = xmlDoc.CreateElement("sign");
//sign.InnerText = AlipaySignature.RSASignContent(response.InnerXml, appPrivateKey, signType);
sign.InnerText = AlipaySignature.RSASignContent(response.InnerXml, appPrivateKey, signType);
alipay.AppendChild(sign);
var sign_type = xmlDoc.CreateElement("sign_type");
sign_type.InnerText = signType;
alipay.AppendChild(sign_type);
return xmlDoc.InnerXml;
}
}
}

View File

@@ -0,0 +1,106 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using NLog;
using System;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AutoMate.RedisCache;
using Essensoft.Paylink.WeChatPay;
using Essensoft.Paylink.WeChatPay.V2;
using Essensoft.Paylink.WeChatPay.V2.Notify;
namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify
{
/// <summary>
/// 微信支付异步通知
/// </summary>
[Route("Notify/[controller]/[action]")]
public class WeChatPayController : ControllerBase
{
private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
private readonly ICoreCmsBillRefundServices _billRefundServices;
private readonly IWeChatPayNotifyClient _client;
private readonly IOptions<WeChatPayOptions> _optionsAccessor;
private readonly IRedisOperationRepository _redisOperationRepository;
/// <summary>
/// 构造函数
/// </summary>
public WeChatPayController(
IWeChatPayNotifyClient client
, IOptions<WeChatPayOptions> optionsAccessor
, ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsBillRefundServices billRefundServices, IRedisOperationRepository redisOperationRepository)
{
_client = client;
_optionsAccessor = optionsAccessor;
_billPaymentsServices = billPaymentsServices;
_billRefundServices = billRefundServices;
_redisOperationRepository = redisOperationRepository;
}
/// <summary>
/// 统一下单支付结果通知
/// </summary>
[HttpPost]
public async Task<IActionResult> Unifiedorder()
{
try
{
var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotify>(Request, _optionsAccessor.Value);
if (notify.ReturnCode == WeChatPayCode.Success)
{
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayNotice, JsonConvert.SerializeObject(notify));
return WeChatPayNotifyResult.Success;
}
return NoContent();
}
catch (Exception ex)
{
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信支付成功回调", "统一下单支付结果通知", ex);
return NoContent();
}
}
/// <summary>
/// 退款结果通知
/// </summary>
[HttpPost]
public async Task<IActionResult> Refund()
{
try
{
var notify = await _client.ExecuteAsync<WeChatPayRefundNotify>(Request, _optionsAccessor.Value);
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信退款结果通知", JsonConvert.SerializeObject(notify));
if (notify.ReturnCode == WeChatPayCode.Success)
if (notify.RefundStatus == WeChatPayCode.Success)
{
//Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
var memo = JsonConvert.SerializeObject(notify);
await _billRefundServices.UpdateAsync(p => new CoreCmsBillRefund { memo = memo }, p => p.refundId == notify.OutTradeNo);
return WeChatPayNotifyResult.Success;
}
return NoContent();
}
catch (Exception ex)
{
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信退款结果通知", "退款结果通知", ex);
return NoContent();
}
}
}
}

View File

@@ -0,0 +1,128 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 支付调用接口数据
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class PaymentsController : ControllerBase
{
private IHttpContextUser _user;
private ICoreCmsBillPaymentsServices _billPaymentsServices;
private ICoreCmsPaymentsServices _paymentsServices;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="user"></param>
/// <param name="billPaymentsServices"></param>
/// <param name="paymentsServices"></param>
public PaymentsController(IHttpContextUser user
, ICoreCmsBillPaymentsServices billPaymentsServices
, ICoreCmsPaymentsServices paymentsServices
)
{
_user = user;
_billPaymentsServices = billPaymentsServices;
_paymentsServices = paymentsServices;
}
//公共接口====================================================================================================
#region ==================================================
/// <summary>
/// 获取支付方式列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetList()
{
var jm = new WebApiCallBack();
var list = await _paymentsServices.QueryListByClauseAsync(p => p.isEnable == true, p => p.sort, OrderByType.Asc);
jm.status = true;
jm.data = list;
return jm;
}
#endregion
//验证接口====================================================================================================
#region ==================================================
/// <summary>
/// 支付确认页面取信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> CheckPay([FromBody] CheckPayPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.ids))
{
jm.msg = GlobalErrorCodeVars.Code13100;
return jm;
}
jm = await _billPaymentsServices.FormatPaymentRel(entity.ids, entity.paymentType, entity.@params);
return jm;
}
#endregion
#region ==================================================
/// <summary>
/// 获取支付单详情
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetInfo([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = GlobalErrorCodeVars.Code13100;
return jm;
}
var userId = entity.data.ObjectToInt(0);
jm = await _billPaymentsServices.GetInfo(entity.id, userId);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,175 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 拼团接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class PinTuanController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsPinTuanGoodsServices _pinTuanGoodsServices;
private readonly ICoreCmsPinTuanRuleServices _pinTuanRuleServices;
private readonly ICoreCmsProductsServices _productsServices;
private readonly ICoreCmsPinTuanRecordServices _pinTuanRecordServices;
private readonly ICoreCmsGoodsServices _goodsServices;
/// <summary>
/// 构造函数
/// </summary>
public PinTuanController(IHttpContextUser user
, ICoreCmsPinTuanGoodsServices pinTuanGoodsServices
, ICoreCmsPinTuanRuleServices pinTuanRuleServices
, ICoreCmsProductsServices productsServices
, ICoreCmsPinTuanRecordServices pinTuanRecordServices, ICoreCmsGoodsServices goodsServices)
{
_user = user;
_pinTuanGoodsServices = pinTuanGoodsServices;
_pinTuanRuleServices = pinTuanRuleServices;
_productsServices = productsServices;
_pinTuanRecordServices = pinTuanRecordServices;
_goodsServices = goodsServices;
}
#region
/// <summary>
/// 拼团列表
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetList([FromBody] FMIntId entity)
{
WebApiCallBack jm;
var userId = 0;
if (_user != null)
{
userId = _user.ID;
}
var id = 0;
if (entity.id > 0)
{
id = entity.id;
}
jm = await _pinTuanRuleServices.GetPinTuanList(id, userId);
return jm;
}
#endregion
#region
/// <summary>
/// 获取拼团商品信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsInfo([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var userId = 0;
if (_user != null)
{
userId = _user.ID;
}
var pinTuanStatus = entity.data.ObjectToInt(1);
jm.status = true;
jm.msg = "获取详情成功";
jm.data = await _pinTuanGoodsServices.GetGoodsInfo(entity.id, userId, pinTuanStatus);
return jm;
}
#endregion
#region
/// <summary>
/// 获取货品信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetProductInfo([FromBody] FMGetProductInfo entity)
{
var jm = new WebApiCallBack();
var products = await _productsServices.GetProductInfo(entity.id, false, 0, entity.type);
if (products == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
//把拼团的一些属性等加上
var info = await _pinTuanRuleServices.QueryMuchFirstAsync<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
(join1, join2) => new object[] { JoinType.Left, join1.id == join2.ruleId },
(join1, join2) => join1, (join1, join2) => join2.goodsId == products.goodsId);
if (info == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
products.pinTuanRule = info;
jm.status = true;
jm.data = products;
return jm;
}
#endregion
#region id取拼团信息
/// <summary>
/// 根据订单id取拼团信息用在订单详情页
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetPinTuanTeam([FromBody] FMGetPinTuanTeamPost entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.orderId) && entity.teamId == 0)
{
jm.msg = GlobalErrorCodeVars.Code15606;
return jm;
}
jm = await _pinTuanRecordServices.GetTeamList(entity.teamId, entity.orderId);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,404 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 服务卡控制器
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class ServiceController : ControllerBase
{
private readonly ICoreCmsServicesServices _servicesServices;
private readonly ICoreCmsUserServicesOrderServices _userServicesOrderServices;
private readonly ICoreCmsUserServicesTicketServices _userServicesTicketServices;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsUserServicesTicketVerificationLogServices _ticketVerificationLogServices;
private readonly ICoreCmsClerkServices _clerkServices;
private readonly ICoreCmsStoreServices _storeServices;
private readonly ICoreCmsUserGradeServices _userGradeServices;
private readonly IHttpContextUser _user;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="servicesServices"></param>
/// <param name="user"></param>
/// <param name="userServicesOrderServices"></param>
/// <param name="userServicesTicketServices"></param>
/// <param name="userServices"></param>
/// <param name="clerkServices"></param>
/// <param name="ticketVerificationLogServices"></param>
/// <param name="storeServices"></param>
/// <param name="userGradeServices"></param>
public ServiceController(ICoreCmsServicesServices servicesServices, IHttpContextUser user, ICoreCmsUserServicesOrderServices userServicesOrderServices, ICoreCmsUserServicesTicketServices userServicesTicketServices, ICoreCmsUserServices userServices, ICoreCmsClerkServices clerkServices, ICoreCmsUserServicesTicketVerificationLogServices ticketVerificationLogServices, ICoreCmsStoreServices storeServices, ICoreCmsUserGradeServices userGradeServices)
{
_servicesServices = servicesServices;
_user = user;
_userServicesOrderServices = userServicesOrderServices;
_userServicesTicketServices = userServicesTicketServices;
_userServices = userServices;
_clerkServices = clerkServices;
_ticketVerificationLogServices = ticketVerificationLogServices;
_storeServices = storeServices;
_userGradeServices = userGradeServices;
}
#region
/// <summary>
/// 取得服务卡列表信息
/// </summary>
/// <returns></returns>
[HttpPost]
//[Authorize]
public async Task<WebApiCallBack> GetPageList([FromBody] FMPageByIntId entity)
{
var jm = new WebApiCallBack();
var dt = DateTime.Now;
var where = PredicateBuilder.True<CoreCmsServices>();
where = where.And(p => p.status == (int)GlobalEnumVars.ServicesStatus.Shelve);
where = where.And(p => p.amount > 0);
where = where.And(p => p.startTime < dt && p.endTime > dt);
var list = await _servicesServices.QueryPageAsync(where, p => p.createTime, OrderByType.Desc, entity.page, entity.limit);
if (list.Any())
{
var storesAll = await _storeServices.QueryAsync();
var userGradesAll = await _userGradeServices.QueryAsync();
foreach (var data in list)
{
TimeSpan ts = data.endTime.Subtract(dt);
data.timestamp = (int)ts.TotalSeconds;
if (!string.IsNullOrEmpty(data.consumableStore))
{
var consumableStoreStr = CommonHelper.GetCaptureInterceptedText(data.consumableStore, ",");
var consumableStoreIds = CommonHelper.StringToIntArray(consumableStoreStr);
if (consumableStoreIds.Any())
{
var stores = storesAll.Where(p => consumableStoreIds.Contains(p.id)).ToList();
data.consumableStores = stores.Select(p => p.storeName).ToList();
}
}
if (!string.IsNullOrEmpty(data.allowedMembership))
{
var allowedMembershipStr = CommonHelper.GetCaptureInterceptedText(data.allowedMembership, ",");
var allowedMembershipIds = CommonHelper.StringToIntArray(allowedMembershipStr);
if (allowedMembershipIds.Any())
{
var userGrades = userGradesAll.Where(p => allowedMembershipIds.Contains(p.id)).ToList();
data.allowedMemberships = userGrades.Select(p => p.title).ToList();
}
}
}
}
jm.status = true;
jm.data = new
{
list = list,
count = list.TotalCount,
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取服务卡详情
/// </summary>
/// <returns></returns>
[HttpPost]
//[Authorize]
public async Task<WebApiCallBack> GetDetails([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var data = await _servicesServices.QueryByClauseAsync(p => p.id == entity.id);
if (data != null)
{
var dt = DateTime.Now;
TimeSpan ts = data.endTime.Subtract(dt);
data.timestamp = (int)ts.TotalSeconds;
if (!string.IsNullOrEmpty(data.consumableStore))
{
var consumableStoreStr = CommonHelper.GetCaptureInterceptedText(data.consumableStore, ",");
var consumableStoreIds = CommonHelper.StringToIntArray(consumableStoreStr);
if (consumableStoreIds.Any())
{
var stores = await _storeServices.QueryListByClauseAsync(p => consumableStoreIds.Contains(p.id));
data.consumableStores = stores.Select(p => p.storeName).ToList();
}
}
if (!string.IsNullOrEmpty(data.allowedMembership))
{
var allowedMembershipStr = CommonHelper.GetCaptureInterceptedText(data.allowedMembership, ",");
var allowedMembershipIds = CommonHelper.StringToIntArray(allowedMembershipStr);
if (allowedMembershipIds.Any())
{
var userGrades = await _userGradeServices.QueryListByClauseAsync(p => allowedMembershipIds.Contains(p.id));
data.allowedMemberships = userGrades.Select(p => p.title).ToList();
}
}
}
jm.status = true;
jm.data = data;
return jm;
}
#endregion
//验证接口====================================================================================================
#region
/// <summary>
/// 取得服务卡列表信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> AddServiceOrder([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack();
var data = await _servicesServices.QueryByClauseAsync(p => p.id == entity.id);
if (data == null)
{
jm.msg = "服务数据获取失败";
return jm;
}
var user = await _userServices.QueryByIdAsync(_user.ID);
if (user == null)
{
jm.msg = "用户数据获取失败";
return jm;
}
if (!data.allowedMembership.Contains("," + user.grade + ","))
{
jm.msg = "您所在的用户级别不支持购买";
return jm;
}
var order = new CoreCmsUserServicesOrder();
order.serviceOrderId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.);
order.userId = _user.ID;
order.servicesId = entity.id;
order.isPay = false;
order.status = (int)GlobalEnumVars.ServicesOrderStatus.;
order.createTime = DateTime.Now;
var bl = await _userServicesOrderServices.InsertAsync(order) > 0;
jm.status = bl;
jm.data = order.serviceOrderId;
return jm;
}
#endregion
#region
/// <summary>
/// 店铺核销的服务券列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> VerificationPageList([FromBody] FMPageByIntId entity)
{
var jm = await _ticketVerificationLogServices.GetVerificationLogs(_user.ID, entity.page, entity.limit);
return jm;
}
#endregion
#region
/// <summary>
/// 软删除服务券核销单数据
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> LogDelete([FromBody] FMIntId entity)
{
var jm = await _ticketVerificationLogServices.LogDelete(entity.id, _user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 获取单个提货单详情
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetTicketInfo([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交查询数据关键词";
return jm;
}
var ticket = await _userServicesTicketServices.QueryByClauseAsync(p => p.redeemCode == entity.id);
if (ticket == null)
{
jm.msg = "未查询到服务券";
return jm;
}
ticket.statusStr = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.ServicesTicketStatus>(ticket.status);
var service = await _servicesServices.QueryByClauseAsync(p => p.id == ticket.serviceId);
var serviceOrder =
await _userServicesOrderServices.QueryByClauseAsync(p => p.serviceOrderId == ticket.serviceOrderId);
jm.status = true;
jm.data = new
{
ticket,
service,
serviceOrder
};
return jm;
}
#endregion
#region
/// <summary>
/// 核销服务券
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> VerificationTicket([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交查询数据关键词";
return jm;
}
var ticket = await _userServicesTicketServices.QueryByClauseAsync(p => p.redeemCode == entity.id);
if (ticket == null)
{
jm.msg = "未查询到服务券";
return jm;
}
if (ticket.status != (int)GlobalEnumVars.ServicesTicketStatus.Normal)
{
jm.msg = "服务券状态不支持核销";
return jm;
}
var service = await _servicesServices.QueryByIdAsync(ticket.serviceId);
if (service == null)
{
jm.msg = "服务项目获取失败";
return jm;
}
var user = await _userServices.QueryByIdAsync(_user.ID);
if (user == null)
{
jm.msg = "未获取到审核权限";
return jm;
}
var clerk = await _clerkServices.QueryByClauseAsync(p => p.userId == user.id);
if (clerk == null)
{
jm.msg = "非门店店员无权限核验";
return jm;
}
if (!service.consumableStore.Contains("," + clerk.storeId + ","))
{
jm.msg = "您所在的门店无权核销此券";
return jm;
}
//开始更新数据
var log = new CoreCmsUserServicesTicketVerificationLog
{
storeId = clerk.storeId,
verificationUserId = _user.ID,
ticketId = ticket.id,
ticketRedeemCode = ticket.redeemCode,
verificationTime = DateTime.Now,
serviceId = ticket.serviceId,
isDel = false
};
ticket.status = (int)GlobalEnumVars.ServicesTicketStatus.Verification;
ticket.verificationTime = DateTime.Now;
ticket.isVerification = true;
var up = await _userServicesTicketServices.UpdateAsync(ticket);
var bl = false;
if (up)
{
bl = await _ticketVerificationLogServices.InsertAsync(log) > 0;
}
jm.status = up && bl;
jm.msg = jm.status ? "核销成功" : "核销失败";
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,365 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 门店调用接口数据
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class StoreController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsStoreServices _storeServices;
private readonly ICoreCmsClerkServices _clerkServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsBillLadingServices _billLadingServices;
private readonly ICoreCmsOrderServices _orderServices;
/// <summary>
/// 构造函数
/// </summary>
public StoreController(IHttpContextUser user
, ICoreCmsStoreServices storeServices
, ICoreCmsClerkServices clerkServices
, ICoreCmsSettingServices settingServices
, ICoreCmsBillLadingServices billLadingServices, ICoreCmsOrderServices orderServices)
{
_user = user;
_storeServices = storeServices;
_clerkServices = clerkServices;
_settingServices = settingServices;
_billLadingServices = billLadingServices;
_orderServices = orderServices;
}
//公共接口======================================================================================================
#region
/// <summary>
/// 获取默认的门店
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetDefaultStore()
{
var jm = new WebApiCallBack();
var ship = await _storeServices.QueryByClauseAsync(p => p.isDefault == true);
jm.status = true;
jm.data = ship;
return jm;
}
#endregion
#region
/// <summary>
/// 获取门店列表数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetStoreList([FromBody] FMGetStoreQueryPageByCoordinate entity)
{
var jm = new WebApiCallBack();
try
{
var where = PredicateBuilder.True<CoreCmsStore>();
if (!string.IsNullOrEmpty(entity.key))
{
where = where.And(p => p.storeName.Contains(entity.key));
}
jm.status = true;
var data = await _storeServices.QueryPageAsyncByCoordinate(where, p => p.distance, OrderByType.Asc, entity.page, entity.limit, entity.latitude, entity.longitude);
foreach (var item in data)
{
if (item.distance > 0)
{
if (item.distance > 1000)
{
item.distanceStr = Math.Round(item.distance / 1000, 2) + "km";
}
else
{
item.distanceStr = Math.Round(item.distance, 2) + "m";
}
}
else
{
item.distanceStr = "未知";
}
}
jm.data = data;
jm.otherData = new
{
totalCount = data.TotalCount,
totalPages = data.TotalPages,
};
}
catch (Exception e)
{
jm.msg = GlobalConstVars.DataHandleEx;
jm.data = e.ToString();
}
return jm;
}
#endregion
#region
/// <summary>
/// 获取推荐关键词
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetRecommendKeys()
{
var jm = new WebApiCallBack();
var allConfigs = await _settingServices.GetConfigDictionaries();
var recommendKeysStr = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.RecommendKeys);
jm.status = true;
jm.msg = "获取成功";
jm.data = !string.IsNullOrEmpty(recommendKeysStr) ? recommendKeysStr.Split("|") : new string[] { };
return jm;
}
#endregion
#region
/// <summary>
/// 判断是否开启门店自提
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetStoreSwitch()
{
var jm = new WebApiCallBack { status = true, msg = "获取成功" };
var allConfigs = await _settingServices.GetConfigDictionaries();
jm.data = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreSwitch).ObjectToInt(2); ;
return jm;
}
#endregion
#region
/// <summary>
/// 根据序列获取门店数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetStoreById([FromBody] FMIntId entity)
{
var jm = new WebApiCallBack
{
status = true,
msg = "获取成功",
data = await _storeServices.QueryByClauseAsync(p => p.id == entity.id)
};
return jm;
}
#endregion
//验证接口======================================================================================================
#region 访
/// <summary>
/// 判断访问用户是否是店员
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> IsClerk()
{
var jm = await _clerkServices.IsClerk(_user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 根据用户序列获取门店数据
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetStoreByUserId()
{
var jm = new WebApiCallBack
{
status = true,
msg = "获取成功",
data = await _storeServices.GetStoreByUserId(_user.ID)
};
return jm;
}
#endregion
#region
/// <summary>
/// 获取个人订单列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderPageByMerchant([FromBody] GetOrderPageByMerchantPost entity)
{
var jm = new WebApiCallBack();
var store = await _storeServices.GetStoreByUserId(_user.ID);
if (store != null)
{
jm = await _orderServices.GetOrderPageByMerchant(entity.dateType, entity.date, entity.status, entity.storeId, entity.page, entity.limit);
}
else
{
jm.status = false;
jm.msg = "你不是店员";
}
return jm;
}
#endregion
#region
/// <summary>
/// 搜索订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> GetOrderPageByMerchantSearch([FromBody] GetOrderPageByMerchantSearcgPost entity)
{
var jm = new WebApiCallBack();
var store = await _storeServices.GetStoreByUserId(_user.ID);
if (store != null)
{
jm = await _orderServices.GetOrderPageByMerchantSearch(entity.keyword, entity.status, entity.receiptType, entity.storeId, entity.page, entity.limit);
}
else
{
jm.status = false;
jm.msg = "你不是店员";
}
return jm;
}
#endregion
#region
/// <summary>
/// 店铺提货单列表
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> StoreLadingList([FromBody] FMPageByIntId entity)
{
var jm = await _billLadingServices.GetStoreLadingList(_user.ID, entity.page, entity.limit);
return jm;
}
#endregion
#region
/// <summary>
/// 删除提货单数据
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> LadingDelete([FromBody] FMStringId entity)
{
var jm = await _billLadingServices.LadingDelete(entity.id, _user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 获取单个提货单详情
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> LadingInfo([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交查询数据关键词";
return jm;
}
jm = await _billLadingServices.GetInfo(entity.id, _user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 核销订单
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> Lading([FromBody] FMStringId entity)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.id))
{
jm.msg = "请提交查询数据关键词";
return jm;
}
var array = entity.id.Split(",");
var result = await _billLadingServices.LadingOperating(array, _user.ID);
jm.status = result.code == 0;
jm.msg = result.msg;
return jm;
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,110 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Auth.HttpContextUser;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace CoreCms.Net.Web.WebApi.Controllers
{
/// <summary>
/// 微信小程序消息订阅接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class WeChatAppletsMessageController : ControllerBase
{
private readonly IHttpContextUser _user;
private readonly ICoreCmsUserWeChatMsgTemplateServices _userWeChatMsgTemplateServices;
private readonly ICoreCmsUserWeChatMsgSubscriptionSwitchServices _userWeChatMsgSubscriptionSwitchServices;
private readonly ICoreCmsUserWeChatMsgSubscriptionServices _userWeChatMsgSubscriptionServices;
/// <summary>
/// 构造函数
/// </summary>
public WeChatAppletsMessageController(IHttpContextUser user, ICoreCmsUserWeChatMsgTemplateServices userWeChatMsgTemplateServices, ICoreCmsUserWeChatMsgSubscriptionSwitchServices userWeChatMsgSubscriptionSwitchServices, ICoreCmsUserWeChatMsgSubscriptionServices userWeChatMsgSubscriptionServices)
{
_user = user;
_userWeChatMsgTemplateServices = userWeChatMsgTemplateServices;
_userWeChatMsgSubscriptionSwitchServices = userWeChatMsgSubscriptionSwitchServices;
_userWeChatMsgSubscriptionServices = userWeChatMsgSubscriptionServices;
}
#region
/// <summary>
/// 获取用户是否订阅
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> IsTip()
{
var jm = await _userWeChatMsgSubscriptionSwitchServices.IsTip(_user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 用户取消订阅
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> CloseTip()
{
var jm = await _userWeChatMsgSubscriptionSwitchServices.CloseTip(_user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 获取订阅模板
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> Tmpl()
{
var jm = await _userWeChatMsgSubscriptionServices.tmpl(_user.ID);
return jm;
}
#endregion
#region
/// <summary>
/// 设置订阅信息
/// </summary>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<WebApiCallBack> SetTip([FromBody] SetWeChatAppletsMessageTip entity)
{
var jm = await _userWeChatMsgSubscriptionServices.SetTip(_user.ID, entity.templateId, entity.status);
return jm;
}
#endregion
}
}

View File

@@ -0,0 +1,275 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
#nullable enable
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.WeChat.Service.Configuration;
using CoreCms.Net.WeChat.Service.Enums;
using CoreCms.Net.WeChat.Service.HttpClients;
using CoreCms.Net.WeChat.Service.Mediator;
using CoreCms.Net.WeChat.Service.Models;
using CoreCms.Net.WeChat.Service.Options;
using CoreCms.Net.WeChat.Service.Utilities;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NetTaste;
using Newtonsoft.Json;
using NLog;
using SKIT.FlurlHttpClient.Wechat.Api;
namespace CoreCms.Net.Web.WebApi.Controllers.WeChatOAuth
{
/// <summary>
/// 微信小程序Controller
/// </summary>
public class WxOpenController : ControllerBase
{
private readonly WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
private readonly WeChatOptions _weChatOptions;
private readonly IMediator _mediator;
/// <summary>
/// 原始的加密请求如果不加密则为null
/// </summary>
public XDocument? EcryptRequestDocument { get; set; } = null;
/// <summary>
/// 是否使用加密
/// </summary>
public bool UsingEncryptMessage = false;
/// <summary>
/// 是否取消执行
/// </summary>
public bool CancelExecute = false;
/// <summary>
/// 是否使用兼容模式
/// </summary>
public bool UsingCompatibilityModelEncryptMessage = false;
/// <summary>
/// 微信小程序服务器交互
/// </summary>
/// <param name="weChatApiHttpClientFactory"></param>
/// <param name="weChatOptions"></param>
/// <param name="mediator"></param>
public WxOpenController(IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IOptions<WeChatOptions> weChatOptions, IMediator mediator)
{
_weChatApiHttpClientFactory = weChatApiHttpClientFactory;
_mediator = mediator;
_weChatOptions = weChatOptions.Value;
}
#region GET请求用于处理微信小程序后台的URL验证
/// <summary>
/// GET请求用于处理微信小程序后台的URL验证
/// </summary>
/// <returns></returns>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, _weChatOptions.WxOpenToken))
{
return Content(echostr); //返回随机字符串则表示验证通过
}
else
{
return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, _weChatOptions.WxOpenToken) + "。" + "如果你在浏览器中看到这句话说明此地址可以被作为微信小程序后台的Url请注意保持Token一致。");
}
}
#endregion
#region
/// <summary>
/// 接收服务器推送 文档https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push.html
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionName("Index")]
public async Task<IActionResult> Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, _weChatOptions.WxOpenToken))
{
NLogUtil.WriteFileLog(LogLevel.Error, LogType.WxPost, "接收服务器推送(签名错误)", JsonConvert.SerializeObject(postModel));
return Content("fail");
}
else
{
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送(签名成功)", JsonConvert.SerializeObject(postModel));
}
postModel.Token = _weChatOptions.WxOpenToken;//根据自己后台的设置保持一致
postModel.EncodingAESKey = _weChatOptions.WxOpenEncodingAESKey;//根据自己后台的设置保持一致
postModel.AppId = _weChatOptions.WxOpenAppId;//根据自己后台的设置保持一致(必须提供)
var body = Request.Body;
//获取流数据转xml流
XDocument postDataDocument = XmlUtility.Convert(Request.GetRequestStream());
var msgXml = string.Empty;
var callbackXml = Init(postDataDocument, postModel, ref msgXml);
//怕出现误判,所以将最优结果判断
if (callbackXml != null && CancelExecute == false && !string.IsNullOrEmpty(msgXml))
{
/* 如果是 XML 格式的通知内容 */
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送XML格式的通知内容", JsonConvert.SerializeObject(callbackXml));
var callBack = await ExecuteProcess(callbackXml, msgXml);
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送XML通知微信服务器", callBack.Data);
return Content(callBack.Data);
}
else
{
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送(解密失败)", JsonConvert.SerializeObject(callbackXml));
return Content("fail");
}
}
#endregion
#region xml内容
/// <summary>
/// 对解密后的xml数据进行筛选并分发处理结果
/// </summary>
public async Task<WeChatApiCallBack> ExecuteProcess(XDocument sourceXml, string msgXml)
{
var requestType = sourceXml.Root?.Element("MsgType")?.Value;
WeChatApiCallBack callBack = new WeChatApiCallBack();
if (!string.IsNullOrEmpty(requestType))
{
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
switch (requestType)
{
case RequestMsgType.Text:
var textMessageEvent = client.DeserializeEventFromXml<SKIT.FlurlHttpClient.Wechat.Api.Events.TextMessageEvent>(msgXml);
callBack = await _mediator.Send(new TextMessageEventCommand() { EventObj = textMessageEvent });
break;
case RequestMsgType.Location:
break;
case RequestMsgType.Image:
var imageMessageEvent = client.DeserializeEventFromXml<SKIT.FlurlHttpClient.Wechat.Api.Events.ImageMessageEvent>(msgXml);
callBack = await _mediator.Send(new ImageMessageEventCommand() { EventObj = imageMessageEvent });
break;
case RequestMsgType.Voice:
var voiceMessageEvent = client.DeserializeEventFromXml<SKIT.FlurlHttpClient.Wechat.Api.Events.VoiceMessageEvent>(msgXml);
callBack = await _mediator.Send(new VoiceMessageEventCommand() { EventObj = voiceMessageEvent });
break;
case RequestMsgType.Video:
break;
case RequestMsgType.ShortVideo:
break;
case RequestMsgType.Link:
break;
case RequestMsgType.MessageEvent:
var eventType = sourceXml.Root?.Element("Event")?.Value;
if (!string.IsNullOrEmpty(eventType))
{
switch (eventType)
{
case EventType.Subscribe:
break;
case EventType.Unsubscribe:
break;
case EventType.Localtion:
break;
default:
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送处理xml内容/Event无匹配", JsonConvert.SerializeObject(sourceXml));
break;
}
}
break;
default:
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送处理xml内容/MsgType无匹配", JsonConvert.SerializeObject(sourceXml));
break;
}
}
else
{
NLogUtil.WriteFileLog(LogLevel.Info, LogType.WxPost, "接收服务器推送处理xml内容/获取MsgType失败", JsonConvert.SerializeObject(sourceXml));
}
return callBack;
}
#endregion
#region xml文本数据
/// <summary>
/// 初始化获取xml文本数据
/// </summary>
/// <param name="postDataDocument"></param>
/// <param name="postModel"></param>
/// <param name="msgXml"></param>
/// <returns></returns>
private XDocument? Init(XDocument postDataDocument, PostModel postModel, ref string msgXml)
{
//进行加密判断并处理
var postDataStr = postDataDocument.ToString();
XDocument decryptDoc = postDataDocument;
if (postDataDocument.Root?.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt")?.Value))
{
//使用了加密
UsingEncryptMessage = true;
EcryptRequestDocument = postDataDocument;
WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(postModel.Token, postModel.EncodingAESKey, postModel.AppId);
var result = msgCrype.DecryptMsg(postModel.Msg_Signature, postModel.Timestamp, postModel.Nonce, postDataStr, ref msgXml);
//判断result类型
if (result != 0)
{
//验证没有通过,取消执行
CancelExecute = true;
return null;
}
if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName")?.Value))
{
//TODO使用了兼容模式进行验证即可
UsingCompatibilityModelEncryptMessage = true;
}
decryptDoc = XDocument.Parse(msgXml);//完成解密
}
return decryptDoc;
}
#endregion
}
}

View File

@@ -0,0 +1,110 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
<UserSecretsId>077906fd-e490-4431-9bae-c3a48ae21992</UserSecretsId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>portable</DebugType>
<DebugSymbols>true</DebugSymbols>
<DocumentationFile>doc.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<Compile Remove="App_Data\**" />
<Compile Remove="logs\**" />
<Compile Remove="wwwroot\scripts\**" />
<Content Remove="App_Data\**" />
<Content Remove="logs\**" />
<Content Remove="wwwroot\scripts\**" />
<EmbeddedResource Remove="App_Data\**" />
<EmbeddedResource Remove="logs\**" />
<EmbeddedResource Remove="wwwroot\scripts\**" />
<None Remove="App_Data\**" />
<None Remove="logs\**" />
<None Remove="wwwroot\scripts\**" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot\static\poster\此处会存放临时带背景海报.txt" />
<Content Remove="wwwroot\static\qrCode\weChat\此处会存放用户唯一二维码用于生成带背景海报.txt" />
</ItemGroup>
<ItemGroup>
<None Remove="illegalWord\IllegalKeywords.txt" />
</ItemGroup>
<ItemGroup>
<Content Include="illegalWord\IllegalKeywords.txt" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
<PackageReference Include="Essensoft.Paylink.Alipay" Version="4.0.6" />
<PackageReference Include="Essensoft.Paylink.WeChatPay" Version="4.0.6" />
<PackageReference Include="Hangfire" Version="1.7.25" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.25" />
<PackageReference Include="Hangfire.Core" Version="1.7.25" />
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.8.4" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.11" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="3.0.1" />
<PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="3.1.6" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
<PackageReference Include="Nito.AsyncEx" Version="5.1.2" />
<PackageReference Include="NLog" Version="4.7.11" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageReference Include="Qc.YilianyunSdk" Version="1.0.7" />
<PackageReference Include="Snowflake.Core" Version="2.0.0" />
<PackageReference Include="StackExchange.Redis" Version="2.2.50" />
<PackageReference Include="Tencent.QCloud.Cos.Sdk" Version="5.4.24" />
<PackageReference Include="ToolGood.Words" Version="3.0.2.8" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CoreCms.Net.Auth\CoreCms.Net.Auth.csproj" />
<ProjectReference Include="..\CoreCms.Net.CodeGenerator\CoreCms.Net.CodeGenerator.csproj" />
<ProjectReference Include="..\CoreCms.Net.Configuration\CoreCms.Net.Configuration.csproj" />
<ProjectReference Include="..\CoreCms.Net.Core\CoreCms.Net.Core.csproj" />
<ProjectReference Include="..\CoreCms.Net.Filter\CoreCms.Net.Filter.csproj" />
<ProjectReference Include="..\CoreCms.Net.IRepository\CoreCms.Net.IRepository.csproj" />
<ProjectReference Include="..\CoreCms.Net.IServices\CoreCms.Net.IServices.csproj" />
<ProjectReference Include="..\CoreCms.Net.Loging\CoreCms.Net.Loging.csproj" />
<ProjectReference Include="..\CoreCms.Net.Mapping\CoreCms.Net.Mapping.csproj" />
<ProjectReference Include="..\CoreCms.Net.Middlewares\CoreCms.Net.Middlewares.csproj" />
<ProjectReference Include="..\CoreCms.Net.Model\CoreCms.Net.Model.csproj" />
<ProjectReference Include="..\CoreCms.Net.RedisMQ\CoreCms.Net.RedisMQ.csproj" />
<ProjectReference Include="..\CoreCms.Net.Repository\CoreCms.Net.Repository.csproj" />
<ProjectReference Include="..\CoreCms.Net.Services\CoreCms.Net.Services.csproj" />
<ProjectReference Include="..\CoreCms.Net.Task\CoreCms.Net.Task.csproj" />
<ProjectReference Include="..\CoreCms.Net.WeChat.Service\CoreCms.Net.WeChat.Service.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="wwwroot\static\poster\此处会存放临时带背景海报.txt" />
<None Include="wwwroot\static\qrCode\weChat\此处会存放用户唯一二维码用于生成带背景海报.txt" />
</ItemGroup>
<ItemGroup>
<None Update="doc.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Dockerfile">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
EXPOSE 80
COPY ./ /app
ENV TZ=Asia/Shanghai
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf
ENTRYPOINT ["dotnet", "CoreCms.Net.Web.WebApi.dll"]

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="NlogRecords.log">
<!--Nlog内部日志记录为Off关闭。除非纠错不可以设为Trace否则速度很慢起码Debug以上-->
<extensions>
<add assembly="NLog.Web.AspNetCore" />
</extensions>
<targets>
<!--通过数据库记录日志 配置
dbProvider请选择mysql或是sqlserver同时注意连接字符串,需要安装对应的sql数据提供程序
MYSQL:
dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
connectionString="server=localhost;database=BaseMIS;user=root;password=123456"
MSSQL:
dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456"
-->
<target name="log_database" xsi:type="Database" dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient" connectionString="Server=127.0.0.1;uid=CoreShop;pwd=CoreShop;Database=CoreShop;MultipleActiveResultSets=true;">
<commandText>
INSERT INTO SysNLogRecords
(LogDate,LogLevel,LogType,LogTitle,Logger,Message,MachineName,MachineIp,NetRequestMethod
,NetRequestUrl,NetUserIsauthenticated,NetUserAuthtype,NetUserIdentity,Exception)
VALUES
(@LogDate,@LogLevel,@LogType,@LogTitle,@Logger,@Message,@MachineName,@MachineIp,@NetRequestMethod
,@NetRequestUrl,@NetUserIsauthenticated,@NetUserAuthtype,@NetUserIdentity,@Exception);
</commandText>
<parameter name="@LogDate" layout="${date}" />
<parameter name="@LogLevel" layout="${level}" />
<parameter name="@LogType" layout="${event-properties:item=LogType}" />
<parameter name="@LogTitle" layout="${event-properties:item=LogTitle}" />
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@MachineName" layout="${machinename}" />
<parameter name="@MachineIp" layout="${aspnet-request-ip}" />
<parameter name="@NetRequestMethod" layout="${aspnet-request-method}" />
<parameter name="@NetRequestUrl" layout="${aspnet-request-url}" />
<parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" />
<parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" />
<parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" />
<parameter name="@Exception" layout="${exception:tostring}" />
</target>
<target xsi:type="File" name="log_file" fileName="${basedir}/App_Data/nlog/${date:format=yyyy-MM}/${level}-${shortdate}.csv" encoding="utf-8">
<layout xsi:type="CSVLayout">
<column name="date" layout="${date}" />
<column name="LogTitle" layout="${event-properties:item=LogTitle}" />
<column name="message" layout="${message}" />
<column name="exception" layout="${exception:format=tostring}" />
<column name="machinename" layout="${machinename}" />
<column name="appdomain" layout="${appdomain}" />
<column name="assembly-version" layout=" ${assembly-version}" />
<column name="basedir" layout="${basedir}" />
<column name="callsite" layout="${callsite}" />
<column name="counter" layout="${counter}" />
<column name="nlogdir" layout="${nlogdir}" />
<column name="processid" layout="${processid}" />
<column name="processname" layout="${processname}" />
<column name="specialfolder" layout="${specialfolder}" />
<column name="stacktrace" layout="${stacktrace}" />
<column name="longdate" layout="${longdate}" />
<column name="event-properties" layout="${event-properties:item=EventId_Id}" />
<column name="uppercase" layout="${uppercase:${level}}" />
<column name="logger" layout="${logger}" />
<column name="url" layout="${aspnet-request-url}" />
<column name="action" layout="${aspnet-mvc-action}" />
</layout>
</target>
</targets>
<rules>
<!--跳过所有级别的Microsoft组件的日志记录-->
<logger name="Microsoft.*" final="true" />
<!-- BlackHole without writeTo -->
<!--只通过数据库记录日志如果给了name名字cs里用日志记录的时候取logger需要把name当做参数-->
<logger name="logdb" writeTo="log_database" />
<logger name="logfile" writeTo="log_file" />
</rules>
</nlog>

View File

@@ -0,0 +1,69 @@
using System;
using Autofac.Extensions.DependencyInjection;
using CoreCms.Net.Loging;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;
using LogLevel = NLog.LogLevel;
namespace CoreCms.Net.Web.WebApi
{
/// <summary>
/// 启动类
/// </summary>
public class Program
{
/// <summary>
/// 启动配置
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
try
{
//确保NLog.config中连接字符串与appsettings.json中同步
NLogUtil.EnsureNlogConfig("NLog.config");
//其他项目启动时需要做的事情
NLogUtil.WriteAll(LogLevel.Trace, LogType.Web, "接口启动", "接口启动成功");
host.Run();
}
catch (Exception ex)
{
//使用nlog写到本地日志文件万一数据库没创建/连接成功)
NLogUtil.WriteFileLog(LogLevel.Error, LogType.ApiRequest, "接口启动", "初始化数据异常", ex);
throw;
}
}
/// <summary>
/// 创建启动支撑
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS
.ConfigureLogging(logging =>
{
logging.ClearProviders(); //移除已经注册的其他日志处理程序
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //设置最小的日志级别
})
.UseNLog() //NLog: Setup NLog for Dependency injection
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true; //启用同步 IO
})
.UseStartup<Startup>();
});
}
}
}

View File

@@ -0,0 +1,28 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:2015",
"sslPort": 0
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"CoreCms.Net.Web.WebApi": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5000"
}
}
}

View File

@@ -0,0 +1,304 @@
using Autofac;
using AutoMapper;
using CoreCms.Net.Auth;
using CoreCms.Net.Configuration;
using CoreCms.Net.Core.AutoFac;
using CoreCms.Net.Core.Config;
using CoreCms.Net.Filter;
using CoreCms.Net.Loging;
using CoreCms.Net.Mapping;
using CoreCms.Net.Middlewares;
using CoreCms.Net.Swagger;
using CoreCms.Net.Task;
using Hangfire;
using Hangfire.Dashboard.BasicAuthorization;
using InitQ;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Qc.YilianyunSdk;
using System;
using System.Collections.Generic;
using System.Linq;
using CoreCms.Net.RedisMQ.Subscribe;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.WeChat.Service.Mediator;
using Essensoft.Paylink.Alipay;
using Essensoft.Paylink.WeChatPay;
using MediatR;
namespace CoreCms.Net.Web.WebApi
{
/// <summary>
/// 启动配置
/// </summary>
public class Startup
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="configuration"></param>
/// <param name="env"></param>
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Configuration = configuration;
Env = env;
}
/// <summary>
/// 配置属性
/// </summary>
public IConfiguration Configuration { get; }
/// <summary>
/// web环境
/// </summary>
public IWebHostEnvironment Env { get; }
/// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//添加本地路径获取支持
services.AddSingleton(new AppSettingsHelper(Env.ContentRootPath));
services.AddSingleton(new LogLockHelper(Env.ContentRootPath));
//Memory缓存
services.AddMemoryCacheSetup();
//Redis缓存
services.AddRedisCacheSetup();
//添加数据库连接SqlSugar注入支持
services.AddSqlSugarSetup();
//配置跨域CORS
services.AddCorsSetup();
//添加session支持(session依赖于cache进行存储)
services.AddSession();
// AutoMapper支持
services.AddAutoMapper(typeof(AutoMapperConfiguration));
//MediatR只需要注册一个,同项目或类库下就不需要注册多个)
services.AddMediatR(typeof(TextMessageEventCommand).Assembly);
//使用 SignalR
services.AddSignalR();
//Redis消息队列
services.AddRedisMessageQueueSetup();
// 引入Payment 依赖注入(支付宝支付/微信支付)
services.AddAlipay();
services.AddWeChatPay();
// 在 appsettings.json 中 配置选项
services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay"));
services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
//注册自定义微信接口配置文件
services.Configure<WeChat.Service.Options.WeChatOptions>(Configuration.GetSection(nameof(WeChat.Service.Options.WeChatOptions)));
// 注入工厂 HTTP 客户端
services.AddHttpClient();
services.AddSingleton<WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, WeChat.Service.HttpClients.WeChatApiHttpClientFactory>();
//Swagger接口文档注入
services.AddClientSwaggerSetup();
//配置易联云打印机
services.AddYiLianYunSetup();
//注册Hangfire定时任务
services.AddHangFireSetup();
//授权支持注入
services.AddAuthorizationSetupForClient();
//上下文注入
services.AddHttpContextSetup();
//服务配置中加入AutoFac控制器替换规则。
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
//注册mvc注册razor引擎视图
services.AddMvc(options =>
{
//实体验证
options.Filters.Add<RequiredErrorForClent>();
//异常处理
options.Filters.Add<GlobalExceptionsFilterForClent>();
//Swagger剔除不需要加入api展示的列表
options.Conventions.Add(new ApiExplorerIgnores());
})
.AddNewtonsoftJson(p =>
{
//数据格式首字母小写 不使用驼峰
p.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//不使用驼峰样式的key
//p.SerializerSettings.ContractResolver = new DefaultContractResolver();
//忽略循环引用
p.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//设置时间格式必须使用yyyy/MM/dd格式因为ios系统不支持2018-03-29格式的时间只识别2018/03/09这种格式。
p.SerializerSettings.DateFormatString = "yyyy/MM/dd HH:mm:ss";
});
}
/// <summary>
/// Autofac规则配置
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
//获取所有控制器类型并使用属性注入
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired();
builder.RegisterModule(new AutofacModuleRegister());
}
// public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
/// <summary>
/// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 记录请求与返回数据 (注意开启权限,不然本地无法写入)
app.UseRequestResponseLog();
// 用户访问记录(必须放到外层,不然如果遇到异常,会报错,因为不能返回流)(注意开启权限,不然本地无法写入)
app.UseRecordAccessLogsMildd();
// 记录ip请求 (注意开启权限,不然本地无法写入)
app.UseIpLogMildd();
//强制显示中文
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
app.UseSwagger().UseSwaggerUI(c =>
{
//根据版本名称倒序 遍历展示
typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderByDescending(e => e).ToList().ForEach(
version =>
{
c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"Doc {version}");
});
//设置默认跳转到swagger-ui
c.RoutePrefix = "doc";
//c.RoutePrefix = string.Empty;
});
#region Hangfire定时任务
//授权
var filter = new BasicAuthAuthorizationFilter(
new BasicAuthAuthorizationFilterOptions
{
SslRedirect = false,
// Require secure connection for dashboard
RequireSsl = false,
// Case sensitive login checking
LoginCaseSensitive = false,
// Users
Users = new[]
{
new BasicAuthAuthorizationUser
{
Login = AppSettingsConstVars.HangFireLogin,
PasswordClear = AppSettingsConstVars.HangFirePassWord
}
}
});
var options = new DashboardOptions
{
AppPath = "/",//返回时跳转的地址
DisplayStorageConnectionString = false,//是否显示数据库连接信息
Authorization = new[]
{
filter
},
IsReadOnlyFunc = Context =>
{
return false;//是否只读面板
}
};
app.UseHangfireDashboard("/job", options); //可以改变Dashboard的url
HangfireDispose.HangfireService();
#endregion
//使用 Session
app.UseSession();
if (env.IsDevelopment())
{
// 在开发环境中,使用异常页面,这样可以暴露错误堆栈信息,所以不要放在生产环境。
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
// CORS跨域
app.UseCors(AppSettingsConstVars.CorsPolicyName);
// Routing
app.UseRouting();
// 使用静态文件
app.UseStaticFiles();
// 先开启认证
app.UseAuthentication();
// 然后是授权中间件
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
"areas",
"{area:exists}/{controller=Default}/{action=Index}/{id?}"
);
//endpoints.MapControllers();
endpoints.MapControllerRoute(
"default",
"{controller=Default}/{action=Index}/{id?}");
});
//设置默认起始页如default.html
//此处的路径是相对于wwwroot文件夹的相对路径
var defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defaultFilesOptions);
app.UseStaticFiles();
}
}
}

View File

@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

View File

@@ -0,0 +1,171 @@
{
"ConnectionStrings": {
"DbType": "SqlServer", //数据库将支持两种模式【SqlServer,MySql】
"SqlConnection": "Server=127.0.0.1;uid=CoreShop;pwd=CoreShop;Database=CoreShop;MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;"
//SqlServer数据库连接字符串需要开启数据库连接复用【MultipleActiveResultSets=true】
// 如果采用容器化部署Service 要写成mysql的服务名否则写地址
//"SqlConnection": "Server=127.0.0.1;Port=3306;Database=CoreShop;Uid=CoreShop;Pwd=CoreShop;CharSet=utf8;pooling=true;SslMode=None;Allow User Variables=true;Convert Zero Datetime=True;Allow Zero Datetime=True;"
// Mysql数据库链接字符串请保持后面的属性别少。经过测试mysql版本需要5.7或以上
},
//定时任务管理面板的账户密码
"HangFire": {
"Login": "CoreShop",
"PassWord": "CoreShop"
},
"AppConfig": {
"AppUrl": "https://admin.demo.coreshop.cn/", //后端管理地址
"AppInterFaceUrl": "https://api.demo.coreshop.cn/" //接口请求地址
},
//redis为必须启动项请保持redis为正常可用
"RedisConfig": {
"UseCache": true, //启用redis作为内存选择
"UseTimedTask": true, //启用redis作为定时任务
// 如果采用容器化部署Service 要写成redis的服务名否则写地址
"ConnectionString": "127.0.0.1:6379,password=CoreShop,connectTimeout=3000,connectRetry=1,syncTimeout=10000,DefaultDatabase=10" //redis数据库连接字符串
},
//jwt授权认证的一些设置
"JwtConfig": {
"SecretKey": "8kh2luzmp0oq9wfbdeasygj647vr531n",
"Issuer": "CoreShop",
"Audience": "CoreCms"
},
//跨域设置
"Cors": {
"PolicyName": "CorsIpAccess", //策略名称
"EnableAllIPs": false, //是否应用所有的IP如设置为true则取消跨域限制
// 支持多个域名端口,注意端口号后不要带/斜杆比如localhost:8000/,是错的
// 注意http://127.0.0.1:1818 和 http://localhost:1818 是不一样的
"IPs": "http://127.0.0.1:2364,http://localhost:2364"
},
//中间件
"Middleware": {
//记录请求和响应数据
"RequestResponseLog": {
"Enabled": false
},
//记录用户方访问数据
"RecordAccessLogs": {
"Enabled": false,
"IgnoreApis": "/api/Home/GetNav,/api/Home/GetIds4Users"
},
//记录IP请求数据
"IPLog": {
"Enabled": false
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
//易联云打印机设置【很不错的一个网络打印机价格也很便宜https://www.yilianyun.net/】
"YiLianYunConfig": {
//是否开启
"Enabled": false,
//应用id
"ClientId": "",
//应用密钥 string
"ClientSecret": "",
//打印机设备号
"MachineCode": "",
//打印机终端密钥
"Msign": "",
//打印机名称
"PrinterName": "",
//打印机设置联系电话
"Phone": ""
},
// 微信支付
// 更多配置请查看WeChatPayOptions类
"WeChatPay": {
// 应用号
// 如微信公众平台AppId、微信开放平台AppId、微信小程序AppId、企业微信CorpId等
"AppId": "",
// 商户号
// 为微信支付商户平台的商户号
"MchId": "",
// API密钥
// 为微信支付商户平台的API密钥请注意不是APIv3密钥
"APIKey": "",
// APIv3密钥
// 为微信支付商户平台的APIv3密钥请注意不是API密钥v3接口必填
"APIv3Key": "",
// API证书(.p12)
// 为微信支付商户平台的API证书(.p12)v3接口必填
// 可为证书文件(.p12)路径 / 证书文件(.p12)的base64字符串
//以下格式为windows服务器下路径格式linux下格式为 WxPayCert/apiclient_cert.p12
"Certificate": "WxPayCert\\apiclient_cert.p12",
// RSA公钥
// 目前仅调用"企业付款到银行卡API"时使用,执行本示例中的"获取RSA加密公钥API"即可获取。
"RsaPublicKey": ""
},
// 支付宝(暂未开通)
// 更多配置请查看AlipayOptions类
"Alipay": {
// 注意:
// 若涉及资金类支出接口(如转账、红包等)接入,必须使用“公钥证书”方式。不涉及到资金类接口,也可以使用“普通公钥”方式进行加签。
// 本示例默认的加签方式为“公钥证书”方式,并调用 CertificateExecuteAsync 方法 执行API。
// 若使用“普通公钥”方式,除了遵守下方注释的规则外,调用 CertificateExecuteAsync 也需改成 ExecuteAsync。
// 支付宝后台密钥/证书官方配置教程https://opendocs.alipay.com/open/291/105971
// 密钥格式:请选择 PKCS1(非JAVA适用),切记 切记 切记
// 应用Id
// 为支付宝开放平台-APPID
"AppId": "",
// 支付宝公钥 RSA公钥
// 为支付宝开放平台-支付宝公钥
// “公钥证书”方式时,留空
// “普通公钥”方式时,必填
"AlipayPublicKey": "",
// 应用私钥 RSA私钥
// 为“支付宝开放平台开发助手”所生成的应用私钥
"AppPrivateKey": "",
// 服务网关地址
// 默认为正式环境地址
"ServerUrl": "https://openapi.alipay.com/gateway.do",
// 签名类型
// 支持RSA2(SHA256WithRSA)、RSA1(SHA1WithRSA)
// 默认为RSA2
"SignType": "RSA2",
// 应用公钥证书
// 可为证书文件路径 / 证书文件的base64字符串
// “公钥证书”方式时,必填
// “普通公钥”方式时,留空
"AppPublicCert": "",
// 支付宝公钥证书
// 可为证书文件路径 / 证书文件的base64字符串
// “公钥证书”方式时,必填
// “普通公钥”方式时,留空
"AlipayPublicCert": "",
// 支付宝根证书
// 可为证书文件路径 / 证书文件的base64字符串
// “公钥证书”方式时,必填
// “普通公钥”方式时,留空
"AlipayRootCert": ""
},
"PayCallBack": {
//微信支付回调
"WeChatPayUrl": "https://api.demo.coreshop.cn/Notify/WeChatPay/Unifiedorder",
//微信退款回调
"WeChatRefundUrl": "https://api.demo.coreshop.cn/Notify/WeChatPay/Refund",
//支付宝支付回调
"AlipayUrl": "",
//支付宝退款回调
"AlipayRefundUrl": ""
},
"WeChatOptions": {
//公众号
"WeiXinAppId": "",
"WeiXinAppSecret": "",
"EncodingAESKey": "",
"Token": "",
//小程序
"WxOpenAppId": "",
"WxOpenAppSecret": "",
"WxOpenToken": "",
"WxOpenEncodingAESKey": ""
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
此文件夹为过滤敏感词存放词库所用。词库内容请保持“|”分隔

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,44 @@
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>核心商城CoreShop接口管理</title>
<meta name="robots" content="noarchive">
<meta name="keywords" content="corecms,CoreShop,核心商城,核心小程序商城系统" />
<meta name="description" content="核心小程序商城系统CoreShop基于Asp.net 5.0 开发的支持可视化布局的商城系统、前后端分离支持分布式部署拥有分销、团购、直播、秒杀、优惠券、自定义页面等众多营销功能拥有完整sku和下单流程的完全开源商城致力于为中小企业打造一个完整、易于维护的开源的电商系统采用现阶段流行技术实现。后台管理系统包含会员管理、商品管理、订单管理、财务管理、运营管理、多规格管理、内容管理、报表统计、促销设置、分销管理、多门店管理、权限管理、设置等模块。" />
<style type="text/css">
body { background-color: #009688; font-family: ; }
a { text-decoration: none; color: #0000FF; }
a:hover { color: #FF0000; }
.top { height: 120px; line-height: 120px; background-color: #009688; color: #fff; letter-spacing: 3px; font-size: 28px; font-weight: bold; padding: 0 245px; }
.middle { background-color: #FFFFFF; padding: 50px 250px; line-height: 40px; overflow: hidden; }
.middle .zhuyi { font-weight: bold; color: #FF6600; }
.middle p { line-height: 28px; text-indent: 1em; }
.hide { display: none; }
.blue { color: blue }
.copyright { width: 100%; text-align: center; color: #fff; font-size: 14px; padding: 30px 0px; }
.copyright a { color: #fff; }
.copyright a:hover { color: #FF0000; }
</style>
</head>
<body>
<div class="top">恭喜您核心商城CoreShop接口端部署成功</div>
<div class="middle">
请访问组件地址测试是否正常:<br />
<p>|- HangFire&nbsp;&nbsp;&nbsp;&nbsp;定制任务 【<a href="/job" target="_blank" class="blue">点击前往</a></p>
<p>|- Swagger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口文档 【<a href="/doc" target="_blank" class="blue">点击前往</a></p>
<br />
<span class="zhuyi">注意事项:</span><br />
<p>1、以上组件地址支持自定义调整投产环境下请及时修改或屏蔽投产环境下可删除此展示页面。</p>
<p>2、『Swagger接口文档』访问路径修改位置为【Startup.cs】文件第206行左右【代码c.RoutePrefix = "doc"】请将doc修改为其他虚拟路径。</p>
<p>3、『HangFire定时任务』面板路径修改位置为【Startup.cs】文件第256行左右【代码app.UseHangfireDashboard("/job", options);】请将job修改为其他虚拟路径。</p>
<p>4、『HangFire定时任务』初始登录账号密码均为【CoreShop】修改位置为【appsettings.json】文件代码中【HangFire】节点。</p>
<p>5、如果无法访问接口请检查【1、数据库配置是否正常】【2、Redis是否配置正常并可正常链接使用】【3、Mysql数据库请保持5.7+版本】【4、站点日志文件夹写入权限】。</p>
<p>6、如果第三方请求接口服务获取不到数据Debug提示【Access-Control-Allow-Origin】的错误表示为跨域问题请打开【appsettings.json】文件在【Cors】节点设置请求白名单。</p>
</div>
<div class="copyright">
<p>&copy;2020 <a href="http://www.coreshop.com.cn/" target="_blank">核心商城系统CoreShop</a>. All Rights Reserved</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,2 @@
User-agent:*
Disallow:/

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB