CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作--读取店铺信息(6)
本节内容,使用登录的token进行店铺信息读取,顺利的话,进行EXCEL上传测试。
1。在后台编写 读取店铺信息代码
1.1 查看原来铺店信息在什么位置,店铺的表格为CoreCmsStore
#region 获取列表============================================================// POST: Api/CoreCmsStore/GetPageList/// <summary>/// 获取列表/// </summary>/// <returns></returns>[HttpPost][Description("获取列表")]public async Task<AdminUiCallBack> GetPageList(){var jm = new AdminUiCallBack();var pageCurrent = Request.Form["page"].FirstOrDefault().ObjectToInt(1);var pageSize = Request.Form["limit"].FirstOrDefault().ObjectToInt(30);var where = PredicateBuilder.True<CoreCmsStore>();//获取排序字段var orderField = Request.Form["orderField"].FirstOrDefault();Expression<Func<CoreCmsStore, object>> orderEx;switch (orderField){case "id":orderEx = p => p.id;break;case "storeName":orderEx = p => p.storeName;break;case "mobile":orderEx = p => p.mobile;break;case "linkMan":orderEx = p => p.linkMan;break;case "logoImage":orderEx = p => p.logoImage;break;case "areaId":orderEx = p => p.areaId;break;case "address":orderEx = p => p.address;break;case "coordinate":orderEx = p => p.coordinate;break;case "latitude":orderEx = p => p.latitude;break;case "longitude":orderEx = p => p.longitude;break;case "createTime":orderEx = p => p.createTime;break;case "updateTime":orderEx = p => p.updateTime;break;default:orderEx = p => p.isDefault;break;}//设置排序方式var orderDirection = Request.Form["orderDirection"].FirstOrDefault();var orderBy = orderDirection switch{"asc" => OrderByType.Asc,"desc" => OrderByType.Desc,_ => OrderByType.Desc};//查询筛选//序列 intvar id = Request.Form["id"].FirstOrDefault().ObjectToInt(0);if (id > 0) @where = @where.And(p => p.id == id);//门店名称 nvarcharvar storeName = Request.Form["storeName"].FirstOrDefault();if (!string.IsNullOrEmpty(storeName)) @where = @where.And(p => p.storeName.Contains(storeName));//门店电话/手机号 nvarcharvar mobile = Request.Form["mobile"].FirstOrDefault();if (!string.IsNullOrEmpty(mobile)) @where = @where.And(p => p.mobile.Contains(mobile));//门店联系人 nvarcharvar linkMan = Request.Form["linkMan"].FirstOrDefault();if (!string.IsNullOrEmpty(linkMan)) @where = @where.And(p => p.linkMan.Contains(linkMan));//门店logo nvarcharvar logoImage = Request.Form["logoImage"].FirstOrDefault();if (!string.IsNullOrEmpty(logoImage)) @where = @where.And(p => p.logoImage.Contains(logoImage));//门店地区id intvar areaId = Request.Form["areaId"].FirstOrDefault().ObjectToInt(0);if (areaId > 0) @where = @where.And(p => p.areaId == areaId);//门店详细地址 nvarcharvar address = Request.Form["address"].FirstOrDefault();if (!string.IsNullOrEmpty(address)) @where = @where.And(p => p.address.Contains(address));//坐标位置 nvarcharvar coordinate = Request.Form["coordinate"].FirstOrDefault();if (!string.IsNullOrEmpty(coordinate)) @where = @where.And(p => p.coordinate.Contains(coordinate));//纬度 nvarcharvar latitude = Request.Form["latitude"].FirstOrDefault();if (!string.IsNullOrEmpty(latitude)) @where = @where.And(p => p.latitude.Contains(latitude));//经度 nvarcharvar longitude = Request.Form["longitude"].FirstOrDefault();if (!string.IsNullOrEmpty(longitude)) @where = @where.And(p => p.longitude.Contains(longitude));//创建时间 datetimevar createTime = Request.Form["createTime"].FirstOrDefault();if (!string.IsNullOrEmpty(createTime)){if (createTime.Contains("到")){var dts = createTime.Split("到");var dtStart = dts[0].Trim().ObjectToDate();where = where.And(p => p.createTime > dtStart);var dtEnd = dts[1].Trim().ObjectToDate();where = where.And(p => p.createTime < dtEnd);}else{var dt = createTime.ObjectToDate();where = where.And(p => p.createTime > dt);}}//更新时间 datetimevar updateTime = Request.Form["updateTime"].FirstOrDefault();if (!string.IsNullOrEmpty(updateTime)){if (updateTime.Contains("到")){var dts = updateTime.Split("到");var dtStart = dts[0].Trim().ObjectToDate();where = where.And(p => p.updateTime > dtStart);var dtEnd = dts[1].Trim().ObjectToDate();where = where.And(p => p.updateTime < dtEnd);}else{var dt = updateTime.ObjectToDate();where = where.And(p => p.updateTime > dt);}}//获取数据var list = await _coreCmsStoreServices.QueryPageAsync(where, orderEx, orderBy, pageCurrent, pageSize);//返回数据jm.data = list;jm.code = 0;jm.count = list.TotalCount;jm.msg = "数据调用成功!";return jm;}#endregion
1.2 测试取得所有店铺信息 -WPF端的代码部分
代码如下:
1.定义所需要分析返回json的类
public class StoreInfo
{public int Id { get; set; }public string StoreName { get; set; }public string Mobile { get; set; }public string LinkMan { get; set; }public string LogoImage { get; set; }public int AreaId { get; set; }public string Address { get; set; }public string Coordinate { get; set; }public string Latitude { get; set; }public string Longitude { get; set; }public bool IsDefault { get; set; }public DateTime CreateTime { get; set; }public DateTime UpdateTime { get; set; }public double Distance { get; set; }public object AllAddress { get; set; }public object DistanceStr { get; set; }// 用于下拉框显示的内容public override string ToString(){return StoreName;}
}
public class ApiResponse2
{public int Code { get; set; }public string Msg { get; set; }public List<StoreInfo> Data { get; set; }public object OtherData { get; set; }public int Count { get; set; }
}
2。将返回数据显示到下拉列表框的代码
/// <summary>/// 登录处理/// </summary>/// <returns></returns>private async Task PerformLogin(){var username = txtUseName.Text.Trim();var password = txtPassword.Password;string url = txtWebhost.Text.Trim();if (string.IsNullOrEmpty(url)){System.Windows.MessageBox.Show("请输入网址", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);return;}Settings.ApiUrl = url; // 设置全局API URL// 创建数据字典Dictionary<string, string> data = new Dictionary<string, string>
{{ "username", username },{ "password", password }
};string loginUrl = "api/login/getJwtToken";var response = await CoreHelper.PostAsync(loginUrl, data,false); if (response.Code == HttpStatusCode.OK){ string Content = response.Content; var result = AnalysisLoginData.Analysis(Content);Properties.Settings.Default[Settings.TokenName] = "Bearer " + result.data.token.token;//过期时间Properties.Settings.Default["TokenExpire"] =DateTime.Now.AddSeconds(result.data.token.expires_in);//截入店铺信息//Api/CoreCmsStore/GetPageListDictionary<string, string> data2 = new Dictionary<string, string>
{{ "page", "1" },{ "limit", "1000" }
};var dianpuInfo = await CoreHelper.PostAsync("Api/CoreCmsStore/GetPageList", data2,true);if (dianpuInfo.Code == HttpStatusCode.OK){//初始化店铺显示InitializeStoreComboBox(dianpuInfo.Content);}}}/// <summary>/// 将返回的json 数据转换为店铺列表/// </summary>/// <param name="json"></param>private void InitializeStoreComboBox(string json){try{var response = JsonConvert.DeserializeObject<ApiResponse2>(json);if (response.Code == 0 && response.Data != null){cmbStore.ItemsSource = response.Data;cmbStore.DisplayMemberPath = "StoreName";cmbStore.SelectedValuePath = "Id";// 设置默认选中项 var defaultStore = response.Data.FirstOrDefault(s => s.IsDefault);if (defaultStore != null){cmbStore.SelectedItem = defaultStore;//将数据绑定到下拉列表框}}}catch (Exception ex){System.Windows.MessageBox.Show("初始化店铺列表失败:" + ex.Message);}}
1.3 改造上面1.1的代码,返回的店铺信息只能是登录者自己有权限操作的店铺
1.3.1 建一个新的函数,将放到菜单,以便授权
在CoreCms.Net.Web.Admin\Controllers\Shop\CoreCmsSettingController.cs中添加一个函数
#region 获取自己的店铺列表============================================================// POST: Api/CoreCmsStore/GetMyPageList/// <summary>/// 获取列表/// </summary>/// <returns></returns>[HttpPost][Description("获取列表")][AllowAnonymous]public async Task<AdminUiCallBack> GetMyPageList(){var jm = new AdminUiCallBack();//取得自己的 用户名}
进入管理后台 http://localhost:1987/#/system/sysmenu/
在“后台管理"->"菜单管理”选中店铺管理的添加按钮
菜单如下
1.3.2 取得当前用户名
获取当前用户名和权限 代码如下:
//1。取得自己的 用户名// 直接获取用户名(ClaimTypes.Name即user.userName)string userName = User.Identity?.Name;//2。根据 用户名查询店铺//2.1 如如用户超级管理 员,则查询所有店铺var whereUser = PredicateBuilder.True<CoreCmsUser>();whereUser = whereUser.And(p => p.userName == userName);var UserObject = await _coreCmsUserServices.QueryPageAsync(whereUser, null, 1, 1);if (UserObject == null || UserObject.TotalCount == 0) {jm.code = 0;jm.msg="用户不存在";return jm;}//2.2 如如用户不是超级管理员,则查询自己店铺int userid = UserObject[0].id;var userRole = await _sysUserRoleServices.QueryPageAsync(p => p.userId == userid && p.roleId ==1);if(userRole == null || userRole.Count ==0 ) //不是管理员{//判断当前用户ID 之下是否有店铺 }
1.3.3 根据用户信息找到自己的店铺
关键代码如下:
//根据用户信息找到自己的店铺string storeIDs = UserObject[0].storeIds;if (string.IsNullOrEmpty(storeIDs)){jm.code = 0;jm.msg = "用户没有店铺";return jm;}//取得店铺ID的列表 string[] storeIds = storeIDs.Split(',');//将上面店铺ID的列表转成整型的System.Collections.Generic.List<int> storeIdList = new System.Collections.Generic.List<int>();// List<int>();foreach (string storeId in storeIds){storeIdList.Add(Convert.ToInt32(storeId));}//查询 店铺主键id在 storeIdList中的值 list = await _coreCmsStoreServices.QueryPageAsync(p => storeIdList.Contains(p.id));
总结上面的全部代码如下:
// POST: Api/CoreCmsStore/GetMyPageList/// <summary>/// 获取自己的店铺列表/// </summary>/// <returns></returns>[HttpPost][Description("获取自己的店铺列表")][AllowAnonymous]public async Task<AdminUiCallBack> GetMyPageList(){var jm = new AdminUiCallBack();//1。取得自己的 用户名// 直接获取用户名(ClaimTypes.Name即user.userName)string userName = User.Identity?.Name;//2。根据 用户名查询店铺//2.1 如如用户超级管理 员,则查询所有店铺var UserObject = await _sysUserServices.QueryPageAsync(p => p.userName == userName);if (UserObject == null || UserObject.TotalCount == 0){jm.code = 0;jm.msg="用户不存在";return jm;}//2.2 如如用户不是超级管理员,则查询自己店铺int userid = UserObject[0].id;var userRole = await _sysUserRoleServices.QueryPageAsync(p => p.userId == userid && p.roleId ==1);IPageList<CoreCmsStore> list;if (userRole == null){jm.code = 0;jm.msg = "读取用权限 role调用失败!";return jm;}else if (userRole.Count == 0) //不是管理员{//根据用户信息找到自己的店铺string storeIDs = UserObject[0].storeIds;if (string.IsNullOrEmpty(storeIDs)){jm.code = 0;jm.msg = "用户没有店铺";return jm;}//取得店铺ID的列表 string[] storeIds = storeIDs.Split(',');//将上面店铺ID的列表转成整型的System.Collections.Generic.List<int> storeIdList = new System.Collections.Generic.List<int>();// List<int>();foreach (string storeId in storeIds){storeIdList.Add(Convert.ToInt32(storeId));}//查询 店铺主键id在 storeIdList中的值 list = await _coreCmsStoreServices.QueryPageAsync(p => storeIdList.Contains(p.id));//返回数据jm.data = list;jm.code = 0;jm.count = list.TotalCount;jm.msg = "数据调用成功!";return jm;}else if (userRole.Count > 0) //不是管理员{list = await _coreCmsStoreServices.QueryPageAsync(p => true);jm.data = list;jm.code = 0;jm.count = list.TotalCount;jm.msg = "数据调用成功!";return jm;}else{jm.code = 0;jm.msg = "函数调用失败!";return jm;} }
2. WPF客户端将收到的店铺信息显示到界面上
代码如下:
/// <summary>/// 登录处理/// </summary>/// <returns></returns>private async Task PerformLogin(){var username = txtUseName.Text.Trim();var password = txtPassword.Password;string url = txtWebhost.Text.Trim();if (string.IsNullOrEmpty(url)){System.Windows.MessageBox.Show("请输入网址", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);return;}Settings.ApiUrl = url; // 设置全局API URL// 创建数据字典Dictionary<string, string> data = new Dictionary<string, string>
{{ "username", username },{ "password", password }
};string loginUrl = "api/login/getJwtToken";var response = await CoreHelper.PostAsync(loginUrl, data,false); if (response.Code == HttpStatusCode.OK){ string Content = response.Content; var result = AnalysisLoginData.Analysis(Content);Properties.Settings.Default[Settings.TokenName] = "Bearer " + result.data.token.token;//过期时间Properties.Settings.Default["TokenExpire"] =DateTime.Now.AddSeconds(result.data.token.expires_in);//截入店铺信息//Api/CoreCmsStore/GetPageListDictionary<string, string> data2 = new Dictionary<string, string>
{{ "page", "1" },{ "limit", "1000" }
};var dianpuInfo = await CoreHelper.PostAsync("Api/CoreCmsStore/GetMyPageList", data2,true);if (dianpuInfo.Code == HttpStatusCode.OK){//初始化店铺显示InitializeStoreComboBox(dianpuInfo.Content);}}}/// <summary>/// 将返回的json 数据转换为店铺列表/// </summary>/// <param name="json"></param>private void InitializeStoreComboBox(string json){try{var response = JsonConvert.DeserializeObject<ApiResponse2>(json);if (response.Code == 0 && response.Data != null){cmbStore.ItemsSource = response.Data;cmbStore.DisplayMemberPath = "StoreName";cmbStore.SelectedValuePath = "Id";// 设置默认选中项 var defaultStore = response.Data.FirstOrDefault(s => s.IsDefault);if (defaultStore != null){cmbStore.SelectedItem = defaultStore;//将数据绑定到下拉列表框}}}catch (Exception ex){System.Windows.MessageBox.Show("初始化店铺列表失败:" + ex.Message);}}