diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml
index 8de49a7b..16896249 100644
--- a/Blog.Core.Api/Blog.Core.Model.xml
+++ b/Blog.Core.Api/Blog.Core.Model.xml
@@ -386,6 +386,86 @@
             Nullable:True
             </summary>
         </member>
+        <member name="T:Blog.Core.Model.Models.DicData">
+            <summary>
+            字典数据表(多数据)
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.pCode">
+            <summary>
+            父级字典code
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.code">
+            <summary>
+            字典code
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.name">
+            <summary>
+            字典名称
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.content">
+            <summary>
+            字典内容
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.content2">
+            <summary>
+            字典内容2
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.content3">
+            <summary>
+            字典内容3
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.description">
+            <summary>
+            字典描述
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicData.codeOrder">
+            <summary>
+            排序
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.Models.DicType">
+            <summary>
+            字典类型表(单数据)
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.code">
+            <summary>
+            字典code
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.name">
+            <summary>
+            字典名称
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.content">
+            <summary>
+            字典内容
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.content2">
+            <summary>
+            字典内容2
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.content3">
+            <summary>
+            字典内容3
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.DicType.description">
+            <summary>
+            字典描述
+            </summary>
+        </member>
         <member name="T:Blog.Core.Model.Models.GblLogAudit">
             <summary>
             用户团队表
@@ -1922,22 +2002,27 @@
             时间:2020-4-3 20:31:26
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PaginationModel.PageIndex">
+        <member name="P:Blog.Core.Model.PaginationModel.page">
             <summary>
             当前页
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PaginationModel.PageSize">
+        <member name="P:Blog.Core.Model.PaginationModel.size">
             <summary>
             每页大小
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PaginationModel.OrderByFileds">
+        <member name="P:Blog.Core.Model.PaginationModel.key">
+            <summary>
+            搜索关键词
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.PaginationModel.orderByFileds">
             <summary>
             排序字段(例如:id desc,time asc)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PaginationModel.Conditions">
+        <member name="P:Blog.Core.Model.PaginationModel.conditions">
             <summary>
             查询条件( 例如:id = 1 and name = 小明)
             </summary>
diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml
index dfe9950a..1e379c49 100644
--- a/Blog.Core.Api/Blog.Core.xml
+++ b/Blog.Core.Api/Blog.Core.xml
@@ -385,7 +385,7 @@
             <param name="pageSize"></param>
             <returns></returns>
         </member>
-        <member name="M:Blog.Core.Controllers.PermissionController.GetTreeTable(System.Int64,System.String)">
+        <member name="M:Blog.Core.Controllers.PermissionController.GetTreeTable">
             <summary>
             查询树形 Table
             </summary>
@@ -468,11 +468,12 @@
             角色管理
             </summary>
         </member>
-        <member name="M:Blog.Core.Controllers.RoleController.Get(System.Int32,System.String)">
+        <member name="M:Blog.Core.Controllers.RoleController.Get(System.Int32,System.Int32,System.String)">
             <summary>
             获取全部角色
             </summary>
             <param name="page"></param>
+            <param name="size"></param>
             <param name="key"></param>
             <returns></returns>
         </member>
@@ -666,18 +667,14 @@
             用户管理
             </summary>
         </member>
-        <member name="M:Blog.Core.Controllers.UserController.#ctor(Blog.Core.Repository.UnitOfWorks.IUnitOfWorkManage,Blog.Core.IServices.ISysUserInfoServices,Blog.Core.IServices.IUserRoleServices,Blog.Core.IServices.IRoleServices,Blog.Core.IServices.IDepartmentServices,Blog.Core.Common.HttpContextUser.IUser,AutoMapper.IMapper,Microsoft.Extensions.Logging.ILogger{Blog.Core.Controllers.UserController})">
+        <!-- Badly formed XML comment ignored for member "M:Blog.Core.Controllers.UserController.#ctor(Blog.Core.Repository.UnitOfWorks.IUnitOfWorkManage,Blog.Core.IServices.ISysUserInfoServices,Blog.Core.IServices.IUserRoleServices,Blog.Core.IServices.IRoleServices,Blog.Core.IServices.IDepartmentServices,Blog.Core.Common.HttpContextUser.IUser,AutoMapper.IMapper,Microsoft.Extensions.Logging.ILogger{Blog.Core.Controllers.UserController},Microsoft.AspNetCore.Http.IHttpContextAccessor)" -->
+        <member name="M:Blog.Core.Controllers.UserController.Get_V3(System.Int32,System.String)">
             <summary>
-            构造函数
+            获取全部用户
             </summary>
-            <param name="unitOfWorkManage"></param>
-            <param name="sysUserInfoServices"></param>
-            <param name="userRoleServices"></param>
-            <param name="roleServices"></param>
-            <param name="departmentServices"></param>
-            <param name="user"></param>
-            <param name="mapper"></param>
-            <param name="logger"></param>
+            <param name="page"></param>
+            <param name="key"></param>
+            <returns></returns>
         </member>
         <member name="M:Blog.Core.Controllers.UserController.Get(System.Int32,System.String)">
             <summary>
@@ -687,6 +684,14 @@
             <param name="key"></param>
             <returns></returns>
         </member>
+        <member name="M:Blog.Core.Controllers.UserController.GetInfoByToken_V3(System.String)">
+            <summary>
+            获取用户详情根据token
+            【无权限】
+            </summary>
+            <param name="token">令牌</param>
+            <returns></returns>
+        </member>
         <member name="M:Blog.Core.Controllers.UserController.GetInfoByToken(System.String)">
             <summary>
             获取用户详情根据token
@@ -695,6 +700,13 @@
             <param name="token">令牌</param>
             <returns></returns>
         </member>
+        <member name="M:Blog.Core.Controllers.UserController.Post_V3(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            添加一个用户
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
         <member name="M:Blog.Core.Controllers.UserController.Post(Blog.Core.Model.ViewModels.SysUserInfoDto)">
             <summary>
             添加一个用户
@@ -702,6 +714,13 @@
             <param name="sysUserInfo"></param>
             <returns></returns>
         </member>
+        <member name="M:Blog.Core.Controllers.UserController.Put_V3(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            更新用户与角色
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
         <member name="M:Blog.Core.Controllers.UserController.Put(Blog.Core.Model.ViewModels.SysUserInfoDto)">
             <summary>
             更新用户与角色
@@ -716,6 +735,34 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="M:Blog.Core.Controllers.UserController.ResetPass(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            重置密码
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Controllers.UserController.RefreshMyLogo(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            更新头像
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Controllers.UserController.ResetMyPass(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            重置我的密码
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Controllers.UserController.PutMyInfo(Blog.Core.Model.Models.SysUserInfo)">
+            <summary>
+            更新我的资料
+            </summary>
+            <param name="sysUserInfo"></param>
+            <returns></returns>
+        </member>
         <member name="T:Blog.Core.Controllers.UserRoleController">
             <summary>
             用户角色关系
@@ -1520,6 +1567,47 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="T:Blog.Core.Filter.GlobalRouteAuthorizeConvention">
+            <summary>
+            Summary:全局路由权限公约
+            Remarks:目的是针对不同的路由,采用不同的授权过滤器
+            如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
+            否则,如果想特例其他授权机制的话,需要在 controller 上带上  [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")]
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Filter.GlobalAuthorizeFilter">
+            <summary>
+            全局权限过滤器【无效】
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Filter.GlobalExceptionsFilter">
+            <summary>
+            全局异常错误日志
+            </summary>
+        </member>
+        <member name="M:Blog.Core.Filter.GlobalExceptionsFilter.WriteLog(System.String,System.Exception)">
+            <summary>
+            自定义返回格式
+            </summary>
+            <param name="throwMsg"></param>
+            <param name="ex"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Blog.Core.Filter.JsonErrorResponse.Message">
+            <summary>
+            生产环境的消息
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Filter.JsonErrorResponse.DevelopmentMessage">
+            <summary>
+            开发环境的消息
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Filter.GlobalRoutePrefixFilter">
+            <summary>
+            全局路由前缀公约
+            </summary>
+        </member>
         <member name="T:Blog.Core.SwaggerHelper.CustomRouteAttribute">
             <summary>
             自定义路由 /api/{version}/[controler]/[action]
@@ -1543,46 +1631,99 @@
             <param name="actionName"></param>
             <param name="version"></param>
         </member>
-        <member name="T:Blog.Core.Filter.GlobalRouteAuthorizeConvention">
+        <member name="T:MyDotnet.Controllers.System.DicController">
             <summary>
-            Summary:全局路由权限公约
-            Remarks:目的是针对不同的路由,采用不同的授权过滤器
-            如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
-            否则,如果想特例其他授权机制的话,需要在 controller 上带上  [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")]
+            字典管理
             </summary>
         </member>
-        <member name="T:Blog.Core.Filter.GlobalAuthorizeFilter">
+        <member name="M:MyDotnet.Controllers.System.DicController.GetDic(System.String)">
             <summary>
-            全局权限过滤器【无效】
+            获取字典类型
             </summary>
+            <param name="code"></param>
+            <returns></returns>
         </member>
-        <member name="T:Blog.Core.Filter.GlobalExceptionsFilter">
+        <member name="M:MyDotnet.Controllers.System.DicController.GetDicData(System.String)">
             <summary>
-            全局异常错误日志
+            获取字典类型列表
             </summary>
+            <param name="code"></param>
+            <returns></returns>
         </member>
-        <member name="M:Blog.Core.Filter.GlobalExceptionsFilter.WriteLog(System.String,System.Exception)">
+        <member name="M:MyDotnet.Controllers.System.DicController.Get(System.Int32,System.Int32,System.String)">
             <summary>
-            自定义返回格式
+            获取列表
             </summary>
-            <param name="throwMsg"></param>
-            <param name="ex"></param>
+            <param name="page"></param>
+            <param name="size"></param>
+            <param name="key"></param>
             <returns></returns>
         </member>
-        <member name="P:Blog.Core.Filter.JsonErrorResponse.Message">
+        <member name="M:MyDotnet.Controllers.System.DicController.Post(Blog.Core.Model.Models.DicType)">
             <summary>
-            生产环境的消息
+            添加
             </summary>
+            <param name="data"></param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Filter.JsonErrorResponse.DevelopmentMessage">
+        <member name="M:MyDotnet.Controllers.System.DicController.Put(Blog.Core.Model.Models.DicType)">
             <summary>
-            开发环境的消息
+            更新
             </summary>
+            <param name="data"></param>
+            <returns></returns>
         </member>
-        <member name="T:Blog.Core.Filter.GlobalRoutePrefixFilter">
+        <member name="M:MyDotnet.Controllers.System.DicController.Delete(System.Int64)">
             <summary>
-            全局路由前缀公约
+            删除
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.Deletes(System.Object[])">
+            <summary>
+            批量删除
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.DicDataGet(System.String,System.Int32,System.Int32,System.String)">
+            <summary>
+            获取列表
+            </summary>
+            <param name="page"></param>
+            <param name="size"></param>
+            <param name="key"></param>
+            <param name="code"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.DicDataPost(Blog.Core.Model.Models.DicData)">
+            <summary>
+            添加
+            </summary>
+            <param name="data"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.DicDataPut(Blog.Core.Model.Models.DicData)">
+            <summary>
+            更新
             </summary>
+            <param name="data"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.DicDataDelete(System.Int64)">
+            <summary>
+            删除
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:MyDotnet.Controllers.System.DicController.DicDataDeletes(System.Object[])">
+            <summary>
+            批量删除
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
         </member>
     </members>
 </doc>
diff --git a/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs b/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs
index 7865cc69..71d6671a 100644
--- a/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs
+++ b/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs
@@ -276,9 +276,9 @@ private void InitPermissionTree(List<Permission> permissionsTree, List<Permissio
         {
             foreach (var item in permissionsTree)
             {
-                item.Children = all.Where(d => d.Pid == item.Id).ToList();
+                item.children = all.Where(d => d.Pid == item.Id).ToList();
                 item.Module = apis.FirstOrDefault(d => d.Id == item.Mid);
-                InitPermissionTree(item.Children, all, apis);
+                InitPermissionTree(item.children, all, apis);
             }
         }
 
@@ -342,7 +342,7 @@ private async Task SavePermissionTreeAsync(List<Permission> permissionsTree, Lis
                 }
                 pms.Add(pm);
 
-                await SavePermissionTreeAsync(item.Children, pms, permissionId);
+                await SavePermissionTreeAsync(item.children, pms, permissionId);
             }
         }
 
diff --git a/Blog.Core.Api/Controllers/DicController.cs b/Blog.Core.Api/Controllers/DicController.cs
new file mode 100644
index 00000000..89235dac
--- /dev/null
+++ b/Blog.Core.Api/Controllers/DicController.cs
@@ -0,0 +1,274 @@
+using Blog.Core;
+using Blog.Core.Common.Caches;
+using Blog.Core.Common.Extensions;
+using Blog.Core.Common.Helper;
+using Blog.Core.Controllers;
+using Blog.Core.IServices;
+using Blog.Core.IServices.BASE;
+using Blog.Core.Model;
+using Blog.Core.Model.Models;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace MyDotnet.Controllers.System
+{
+    /// <summary>
+    /// 字典管理
+    /// </summary>
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    [Authorize]
+    public class DicController : BaseApiController
+    {
+        IDicService _dicService;
+        IBaseServices<DicType> _dicType;
+        IBaseServices<DicData> _dicData;
+        ICaching _caching;
+
+        public DicController(IDicService dicService, IBaseServices<DicType> dicType, IBaseServices<DicData> dicData, ICaching caching)
+        {
+            _dicService = dicService;
+            _dicType = dicType;
+            _dicData = dicData;
+            _caching = caching;
+        }
+        /// <summary>
+        /// 获取字典类型
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<MessageModel<DicType>> GetDic(string code)
+        {
+            var data = await _dicService.GetDic(code);
+            return Success(data);
+        }
+        /// <summary>
+        /// 获取字典类型列表
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<MessageModel<List<DicData>>> GetDicData(string code)
+        {
+            var data = await _dicService.GetDicData(code);
+            return Success(data);
+        }
+
+
+
+
+
+
+
+
+
+
+
+        /// <summary>
+        /// 获取列表
+        /// </summary>
+        /// <param name="page"></param>
+        /// <param name="size"></param>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        [HttpGet]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<PageModel<DicType>>> Get(int page = 1, int size = 10, string key = "")
+        {
+            var whereFind = LinqHelper.True<DicType>();
+
+            if (!string.IsNullOrEmpty(key))
+            {
+                whereFind = whereFind.And(t => t.code.Contains(key) 
+                || t.name.Contains(key) 
+                || t.content.Contains(key)
+                || t.content2.Contains(key)
+                || t.content3.Contains(key)
+                || t.description.Contains(key));
+            }
+            var data = await _dicType.QueryPage(whereFind, page, size, " Id desc ");
+            return Success(data, "获取成功");
+        }
+
+        /// <summary>
+        /// 添加
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> Post([FromBody] DicType data)
+        {
+            var id = await _dicType.Add(data);
+            await _caching.RemoveAsync(data.code);
+            return id > 0 ? Success(id.ObjToString(), "添加成功") : Failed();
+
+        }
+
+        /// <summary>
+        /// 更新
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> Put([FromBody] DicType data)
+        {
+            if (data == null || data.Id <= 0)
+                return Failed("缺少参数");
+            await _caching.RemoveAsync(data.code);
+            return await _dicType.Update(data) ? Success(data.Id.ObjToString(), "更新成功") : Failed();
+        }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> Delete(long id)
+        {
+            if (id <= 0)
+                return Failed("缺少参数");
+            var data = await _dicType.QueryById(id);
+            if(data == null)
+                return Failed("数据不存在");
+            var isOk = await _dicType.DeleteById(id);
+            await _caching.RemoveAsync(data.code);
+            if (isOk)
+                return Success("","删除成功");
+            return Failed();
+        }
+
+        /// <summary>
+        /// 批量删除
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> Deletes([FromBody] object[] ids)
+        {
+
+            var ls = await _dicType.QueryByIDs(ids);
+            var isOk = await _dicType.DeleteByIds(ids);
+            if (isOk)
+                return Success("", "删除成功");
+            foreach (var data in ls)
+            {
+                await _caching.RemoveAsync(data.code);
+            }
+            return Failed();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// 获取列表
+        /// </summary>
+        /// <param name="page"></param>
+        /// <param name="size"></param>
+        /// <param name="key"></param>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        [HttpGet]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<PageModel<DicData>>> DicDataGet(string code,int page = 1, int size = 10, string key = "")
+        {
+            var whereFind = LinqHelper.True<DicData>();
+            if (string.IsNullOrEmpty(code))
+            {
+                return MessageModel<PageModel<DicData>>.Fail("请选择一个要查询的字典");
+            }
+            else
+            {
+                whereFind = whereFind.And(t => t.pCode.Equals(code));
+            }
+
+            if (!string.IsNullOrEmpty(key))
+            {
+                whereFind = whereFind.And(t => t.name.Contains(key)
+                || t.content.Contains(key)
+                || t.content2.Contains(key)
+                || t.content3.Contains(key)
+                || t.description.Contains(key));
+            }
+            var data = await _dicData.QueryPage(whereFind, page, size, "codeOrder asc");
+            return Success(data, "获取成功");
+        }
+
+        /// <summary>
+        /// 添加
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> DicDataPost([FromBody] DicData data)
+        {
+            var id = await _dicData.Add(data);
+            await _caching.RemoveAsync($"{data.pCode}_list");
+            return id > 0 ? Success(id.ObjToString(), "添加成功") : Failed();
+
+        }
+
+        /// <summary>
+        /// 更新
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> DicDataPut([FromBody] DicData data)
+        {
+            if (data == null || data.Id <= 0)
+                return Failed("缺少参数");
+            await _caching.RemoveAsync($"{data.pCode}_list");
+            return await _dicData.Update(data) ? Success(data.Id.ObjToString(), "更新成功") : Failed();
+        }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> DicDataDelete(long id)
+        {
+            if (id <= 0)
+                return Failed("缺少参数");
+            var data = await _dicData.QueryById(id);
+            await _caching.RemoveAsync($"{data.pCode}_list");
+            var isOk = await _dicData.DeleteById(id);
+            if (isOk)
+                return Success("", "删除成功");
+            return Failed();
+        }
+
+        /// <summary>
+        /// 批量删除
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> DicDataDeletes([FromBody] object[] ids)
+        {
+            var isOk = await _dicData.DeleteByIds(ids);
+            var data = await _dicData.QueryById(ids[0]);
+            await _caching.RemoveAsync($"{data.pCode}_list");
+            if (isOk)
+                return Success("", "删除成功");
+            return Failed();
+        }
+
+
+
+    }
+}
diff --git a/Blog.Core.Api/Controllers/PermissionController.cs b/Blog.Core.Api/Controllers/PermissionController.cs
index 13f8125a..540640a7 100644
--- a/Blog.Core.Api/Controllers/PermissionController.cs
+++ b/Blog.Core.Api/Controllers/PermissionController.cs
@@ -147,54 +147,30 @@ public async Task<MessageModel<PageModel<Permission>>> Get(int page = 1, string
         /// <returns></returns>
         [HttpGet]
         [AllowAnonymous]
-        public async Task<MessageModel<List<Permission>>> GetTreeTable(long f = 0, string key = "")
+        public async Task<MessageModel<List<Permission>>> GetTreeTable()
         {
             List<Permission> permissions = new List<Permission>();
             var apiList = await _moduleServices.Query(d => d.IsDeleted == false);
+
+
             var permissionsList = await _permissionServices.Query(d => d.IsDeleted == false);
-            if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
-            {
-                key = "";
-            }
 
-            if (key != "")
-            {
-                permissions = permissionsList.Where(a => a.Name.Contains(key)).OrderBy(a => a.OrderSort).ToList();
-            }
-            else
-            {
-                permissions = permissionsList.Where(a => a.Pid == f).OrderBy(a => a.OrderSort).ToList();
-            }
 
-            foreach (var item in permissions)
-            {
-                List<long> pidarr = new() { };
-                var parent = permissionsList.FirstOrDefault(d => d.Id == item.Pid);
 
-                while (parent != null)
-                {
-                    pidarr.Add(parent.Id);
-                    parent = permissionsList.FirstOrDefault(d => d.Id == parent.Pid);
-                }
+            Permission rootRoot = new Permission
+            {
+                Id = 0,
+                Pid = 0,
+                Name = "根节点"
+            };
 
-                //item.PidArr = pidarr.OrderBy(d => d).Distinct().ToList();
+            permissionsList = permissionsList.OrderBy(d => d.OrderSort).ToList();
 
-                pidarr.Reverse();
-                pidarr.Insert(0, 0);
-                item.PidArr = pidarr;
 
-                item.MName = apiList.FirstOrDefault(d => d.Id == item.Mid)?.LinkUrl;
-                item.hasChildren = permissionsList.Where(d => d.Pid == item.Id).Any();
-            }
+            RecursionHelper.LoopToAppendChildren(permissionsList, rootRoot, 0, apiList);
 
 
-            //return new MessageModel<List<Permission>>()
-            //{
-            //    msg = "获取成功",
-            //    success = true,
-            //    response = permissions
-            //};
-            return Success(permissions, "获取成功");
+            return Success(rootRoot.children, "获取成功");
         }
 
         /// <summary>
diff --git a/Blog.Core.Api/Controllers/RoleController.cs b/Blog.Core.Api/Controllers/RoleController.cs
index 0b93e943..2e614ef0 100644
--- a/Blog.Core.Api/Controllers/RoleController.cs
+++ b/Blog.Core.Api/Controllers/RoleController.cs
@@ -29,20 +29,19 @@ public RoleController(IRoleServices roleServices, IUser user)
         /// 获取全部角色
         /// </summary>
         /// <param name="page"></param>
+        /// <param name="size"></param>
         /// <param name="key"></param>
         /// <returns></returns>
         // GET: api/User
         [HttpGet]
-        public async Task<MessageModel<PageModel<Role>>> Get(int page = 1, string key = "")
+        public async Task<MessageModel<PageModel<Role>>> Get(int page = 1, int size = 10, string key = "")
         {
             if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
             {
                 key = "";
             }
-
-            int intPageSize = 50;
-
-            var data = await _roleServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, intPageSize, " Id desc ");
+             
+            var data = await _roleServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, size, " Id desc ");
 
             //return new MessageModel<PageModel<Role>>()
             //{
diff --git a/Blog.Core.Api/Controllers/UserController.cs b/Blog.Core.Api/Controllers/UserController.cs
index 95137c8e..4df5ce2a 100644
--- a/Blog.Core.Api/Controllers/UserController.cs
+++ b/Blog.Core.Api/Controllers/UserController.cs
@@ -9,6 +9,7 @@
 using Blog.Core.Repository.UnitOfWorks;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using System.IdentityModel.Tokens.Jwt;
 
 namespace Blog.Core.Controllers
 {
@@ -28,6 +29,7 @@ public class UserController : BaseApiController
         private readonly IUser _user;
         private readonly IMapper _mapper;
         private readonly ILogger<UserController> _logger;
+        public IHttpContextAccessor _httpContext;
 
         /// <summary>
         /// 构造函数
@@ -39,12 +41,14 @@ public class UserController : BaseApiController
         /// <param name="departmentServices"></param>
         /// <param name="user"></param>
         /// <param name="mapper"></param>
-        /// <param name="logger"></param>
+        /// <param name="logger"></param
+        /// <param name="httpContext"></param>
         public UserController(IUnitOfWorkManage unitOfWorkManage, ISysUserInfoServices sysUserInfoServices,
             IUserRoleServices userRoleServices,
             IRoleServices roleServices,
             IDepartmentServices departmentServices,
-            IUser user, IMapper mapper, ILogger<UserController> logger)
+            IUser user, IMapper mapper, ILogger<UserController> logger
+            ,IHttpContextAccessor httpContext)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _sysUserInfoServices = sysUserInfoServices;
@@ -54,8 +58,56 @@ public UserController(IUnitOfWorkManage unitOfWorkManage, ISysUserInfoServices s
             _user = user;
             _mapper = mapper;
             _logger = logger;
+            _httpContext = httpContext;
+
         }
 
+        /// <summary>
+        /// 获取全部用户
+        /// </summary>
+        /// <param name="page"></param>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        // GET: api/User
+        [HttpGet]
+        public async Task<MessageModel<PageModel<SysUserInfo>>> Get_V3(int page = 1, string key = "")
+        {
+            if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
+            {
+                key = "";
+            }
+
+            int intPageSize = 50;
+
+
+            var data = await _sysUserInfoServices.QueryPage(a => a.IsDeleted != true && a.Status >= 0 && ((a.LoginName != null && a.LoginName.Contains(key)) || (a.RealName != null && a.RealName.Contains(key))), page, intPageSize, " Id desc ");
+
+
+            #region MyRegion
+
+            // 这里可以封装到多表查询,此处简单处理
+            var allUserRoles = await _userRoleServices.Query(d => d.IsDeleted == false);
+            var allRoles = await _roleServices.Query(d => d.IsDeleted == false);
+            var allDepartments = await _departmentServices.Query(d => d.IsDeleted == false);
+
+            var sysUserInfos = data.data;
+            foreach (var item in sysUserInfos)
+            {
+                var currentUserRoles = allUserRoles.Where(d => d.UserId == item.Id).Select(d => d.RoleId).ToList();
+                item.RIDs = currentUserRoles;
+                item.RoleNames = allRoles.Where(d => currentUserRoles.Contains(d.Id)).Select(d => d.Name).ToList();
+                var departmentNameAndIds = GetFullDepartmentName(allDepartments, item.DepartmentId);
+                item.DepartmentName = departmentNameAndIds.Item1;
+                item.Dids = departmentNameAndIds.Item2;
+            }
+
+            data.data = sysUserInfos;
+
+            #endregion
+
+
+            return Success(data.ConvertTo<SysUserInfo>(_mapper));
+        }
         /// <summary>
         /// 获取全部用户
         /// </summary>
@@ -103,6 +155,7 @@ public async Task<MessageModel<PageModel<SysUserInfoDto>>> Get(int page = 1, str
             return Success(data.ConvertTo<SysUserInfoDto>(_mapper));
         }
 
+
         private (string, List<long>) GetFullDepartmentName(List<Department> departments, long departmentId)
         {
             var departmentModel = departments.FirstOrDefault(d => d.Id == departmentId);
@@ -128,6 +181,35 @@ public string Get(string id)
             return "value";
         }
 
+        // GET: api/User/5
+        /// <summary>
+        /// 获取用户详情根据token
+        /// 【无权限】
+        /// </summary>
+        /// <param name="token">令牌</param>
+        /// <returns></returns>
+        [HttpGet]
+        [AllowAnonymous]
+        public async Task<MessageModel<SysUserInfo>> GetInfoByToken_V3(string token)
+        {
+            var data = new MessageModel<SysUserInfo>();
+            if (!string.IsNullOrEmpty(token))
+            {
+                var tokenModel = JwtHelper.SerializeJwt(token);
+                if (tokenModel != null && tokenModel.Uid > 0)
+                {
+                    var userinfo = await _sysUserInfoServices.QueryById(tokenModel.Uid);
+                    if (userinfo != null)
+                    {
+                        data.response = userinfo;
+                        data.success = true;
+                        data.msg = "获取成功";
+                    }
+                }
+            }
+
+            return data;
+        }
         // GET: api/User/5
         /// <summary>
         /// 获取用户详情根据token
@@ -158,6 +240,30 @@ public async Task<MessageModel<SysUserInfoDto>> GetInfoByToken(string token)
             return data;
         }
 
+        /// <summary>
+        /// 添加一个用户
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        // POST: api/User
+        [HttpPost]
+        public async Task<MessageModel<string>> Post_V3([FromBody] SysUserInfo sysUserInfo)
+        {
+            var data = new MessageModel<string>();
+
+            sysUserInfo.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD);
+            sysUserInfo.Remark = _user.Name;
+
+            var id = await _sysUserInfoServices.Add(sysUserInfo);
+            data.success = id > 0;
+            if (data.success)
+            {
+                data.response = id.ObjToString();
+                data.msg = "添加成功";
+            }
+
+            return data;
+        }
         /// <summary>
         /// 添加一个用户
         /// </summary>
@@ -183,6 +289,80 @@ public async Task<MessageModel<string>> Post([FromBody] SysUserInfoDto sysUserIn
             return data;
         }
 
+        /// <summary>
+        /// 更新用户与角色
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        // PUT: api/User/5
+        [HttpPut]
+        public async Task<MessageModel<string>> Put_V3([FromBody] SysUserInfo sysUserInfo)
+        {
+            // 这里使用事务处理
+            var data = new MessageModel<string>();
+
+            var oldUser = await _sysUserInfoServices.QueryById(sysUserInfo.Id);
+            if (oldUser is not { Id: > 0 })
+            {
+                return Failed<string>("用户不存在或已被删除");
+            }
+
+            try
+            {
+                if (sysUserInfo.LoginPWD != oldUser.LoginPWD)
+                {
+                    oldUser.CriticalModifyTime = DateTime.Now;
+                }
+
+                _mapper.Map(sysUserInfo, oldUser);
+
+                _unitOfWorkManage.BeginTran();
+                // 无论 Update Or Add , 先删除当前用户的全部 U_R 关系
+                var usreroles = (await _userRoleServices.Query(d => d.UserId == oldUser.Id));
+                if (usreroles.Any())
+                {
+                    var ids = usreroles.Select(d => d.Id.ToString()).ToArray();
+                    var isAllDeleted = await _userRoleServices.DeleteByIds(ids);
+                    if (!isAllDeleted)
+                    {
+                        return Failed("服务器更新异常");
+                    }
+                }
+
+                // 然后再执行添加操作
+                if (sysUserInfo.RIDs.Count > 0)
+                {
+                    var userRolsAdd = new List<UserRole>();
+                    sysUserInfo.RIDs.ForEach(rid => { userRolsAdd.Add(new UserRole(oldUser.Id, rid)); });
+
+                    var oldRole = usreroles.Select(s => s.RoleId).OrderBy(i => i).ToArray();
+                    var newRole = userRolsAdd.Select(s => s.RoleId).OrderBy(i => i).ToArray();
+                    if (!oldRole.SequenceEqual(newRole))
+                    {
+                        oldUser.CriticalModifyTime = DateTime.Now;
+                    }
+
+                    await _userRoleServices.Add(userRolsAdd);
+                }
+
+                data.success = await _sysUserInfoServices.Update(oldUser);
+
+                _unitOfWorkManage.CommitTran();
+
+                if (data.success)
+                {
+                    data.msg = "更新成功";
+                    data.response = oldUser.Id.ObjToString();
+                }
+            }
+            catch (Exception e)
+            {
+                _unitOfWorkManage.RollbackTran();
+                _logger.LogError(e, e.Message);
+            }
+
+            return data;
+        }
         /// <summary>
         /// 更新用户与角色
         /// </summary>
@@ -282,5 +462,108 @@ public async Task<MessageModel<string>> Delete(long id)
 
             return data;
         }
+
+
+        /// <summary>
+        /// 重置密码
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize(Permissions.Name)]
+        public async Task<MessageModel<string>> ResetPass([FromBody] SysUserInfo sysUserInfo)
+        {
+            //重置密码
+
+            var oldUser = await _sysUserInfoServices.QueryById(sysUserInfo.Id);
+            if (oldUser == null || oldUser.IsDeleted)
+            {
+                return Failed<string>("用户不存在或已被删除");
+            }
+            oldUser.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD);
+            await _sysUserInfoServices.Update(oldUser);
+            return Success<string>("重置成功");
+        }
+
+        /// <summary>
+        /// 更新头像
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize]
+        public async Task<MessageModel<string>> RefreshMyLogo([FromBody] SysUserInfo sysUserInfo)
+        {
+            //重置密码 登录既可修改
+            var uid = _user.ID;
+            var oldUser = await _sysUserInfoServices.QueryById(uid);
+            if (oldUser == null || oldUser.IsDeleted)
+            {
+                return Failed<string>("用户不存在或已被删除");
+            }
+            oldUser.logo = sysUserInfo.logo;
+            await _sysUserInfoServices.Update(oldUser);
+            return Success<string>("更新成功");
+        }
+
+        /// <summary>
+        /// 重置我的密码
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize]
+        public async Task<MessageModel<string>> ResetMyPass([FromBody] SysUserInfo sysUserInfo)
+        {
+            //重置密码 登录既可修改
+
+            var uid = _user.ID;
+            var oldUser = await _sysUserInfoServices.QueryById(uid);
+            if (oldUser == null || oldUser.IsDeleted)
+            {
+                return Failed<string>("用户不存在或已被删除");
+            }
+            oldUser.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD);
+            await _sysUserInfoServices.Update(oldUser);
+            return Success<string>("重置成功");
+        }
+        /// <summary>
+        /// 更新我的资料
+        /// </summary>
+        /// <param name="sysUserInfo"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [Authorize]
+        public async Task<MessageModel<string>> PutMyInfo([FromBody] SysUserInfo sysUserInfo)
+        {
+
+            var uid = _user.ID;
+
+            var data = new MessageModel<string>();
+
+            //登录账号判断
+            var hasUser = await _sysUserInfoServices.Query(t => t.LoginName == sysUserInfo.LoginName && t.IsDeleted == false && t.Id != uid);
+            if (hasUser.Count > 0)
+            {
+                return Failed<string>($"登录名:{sysUserInfo.LoginName}已存在,请重新填写!");
+            }
+
+            var oldUser = await _sysUserInfoServices.QueryById(uid);
+            if (oldUser == null || oldUser.IsDeleted)
+            {
+                return Failed<string>("用户不存在或已被删除");
+            }
+
+            oldUser.RealName = sysUserInfo.RealName;
+            oldUser.LoginName = sysUserInfo.LoginName;
+            oldUser.Sex = sysUserInfo.Sex;
+            oldUser.Age = sysUserInfo.Age;
+            oldUser.Birth = sysUserInfo.Birth;
+            oldUser.Address = sysUserInfo.Address;
+            oldUser.Remark = sysUserInfo.Remark;
+            await _sysUserInfoServices.Update(oldUser);
+
+            return Success<string>("更新成功");
+        }
     }
 }
\ No newline at end of file
diff --git a/Blog.Core.Common/Helper/RecursionHelper.cs b/Blog.Core.Common/Helper/RecursionHelper.cs
index f223cd71..d46623fe 100644
--- a/Blog.Core.Common/Helper/RecursionHelper.cs
+++ b/Blog.Core.Common/Helper/RecursionHelper.cs
@@ -1,4 +1,5 @@
-using System;
+using Blog.Core.Model.Models;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
@@ -78,6 +79,42 @@ public static void LoopToAppendChildren(List<DepartmentTree> all, DepartmentTree
                 LoopToAppendChildren(all, subItem, pid);
             }
         }
+        /// <summary>
+        /// 菜单列表
+        /// </summary>
+        /// <param name="all"></param>
+        /// <param name="curItem"></param>
+        /// <param name="pid"></param>
+        /// <param name="allApi"></param>
+        public static void LoopToAppendChildren(List<Permission> all, Permission curItem, long pid, List<Modules> allApi)
+        {
+            var subItems = all.Where(ee => ee.Pid == curItem.Id).ToList();
+            curItem.MName = allApi.FirstOrDefault(d => d.Id == curItem.Mid)?.LinkUrl;
+            if (subItems.Count > 0)
+            {
+
+                foreach (var subItem in subItems)
+                {
+                    subItem.MName = allApi.FirstOrDefault(d => d.Id == subItem.Mid)?.LinkUrl;
+                }
+
+                curItem.children = subItems;
+            }
+            else
+            {
+                curItem.children = new List<Permission>();
+            }
+
+            foreach (var subItem in subItems)
+            {
+                if (subItem.Id == pid && pid > 0)
+                {
+                    //subItem.disabled = true;//禁用当前节点
+                }
+
+                LoopToAppendChildren(all, subItem, pid, allApi);
+            }
+        }
 
 
         public static void LoopNaviBarAppendChildren(List<NavigationBar> all, NavigationBar curItem)
diff --git a/Blog.Core.IServices/IDicService.cs b/Blog.Core.IServices/IDicService.cs
new file mode 100644
index 00000000..ce341ccd
--- /dev/null
+++ b/Blog.Core.IServices/IDicService.cs
@@ -0,0 +1,12 @@
+using Blog.Core.IServices.BASE;
+using Blog.Core.Model.Models;
+
+
+namespace Blog.Core.IServices
+{
+    public interface IDicService : IBaseServices<DicType>
+    {
+        public Task<DicType> GetDic(string code);
+        public Task<List<DicData>> GetDicData(string code);
+    }
+}
diff --git a/Blog.Core.Model/Models/DicData.cs b/Blog.Core.Model/Models/DicData.cs
new file mode 100644
index 00000000..eb046d35
--- /dev/null
+++ b/Blog.Core.Model/Models/DicData.cs
@@ -0,0 +1,44 @@
+
+
+namespace Blog.Core.Model.Models
+{
+    /// <summary>
+    /// 字典数据表(多数据)
+    /// </summary>
+    public class DicData: RootEntityTkey<long>
+    {
+        /// <summary>
+        /// 父级字典code
+        /// </summary>
+        public string pCode { set; get; }
+        /// <summary>
+        /// 字典code
+        /// </summary>
+        public string code { set; get; }
+        /// <summary>
+        /// 字典名称
+        /// </summary>
+        public string name { set; get; }
+        /// <summary>
+        /// 字典内容
+        /// </summary>
+        public string content { set; get; }
+        /// <summary>
+        /// 字典内容2
+        /// </summary>
+        public string content2 { set; get; }
+        /// <summary>
+        /// 字典内容3
+        /// </summary>
+        public string content3 { set; get; }
+        /// <summary>
+        /// 字典描述
+        /// </summary>
+        public string description { set; get; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int codeOrder { get; set; }
+    }
+}
diff --git a/Blog.Core.Model/Models/DicType.cs b/Blog.Core.Model/Models/DicType.cs
new file mode 100644
index 00000000..1f3a82cb
--- /dev/null
+++ b/Blog.Core.Model/Models/DicType.cs
@@ -0,0 +1,34 @@
+
+namespace Blog.Core.Model.Models
+{
+    /// <summary>
+    /// 字典类型表(单数据)
+    /// </summary>
+    public class DicType: RootEntityTkey<long>
+    {
+        /// <summary>
+        /// 字典code
+        /// </summary>
+        public string code { set; get; }
+        /// <summary>
+        /// 字典名称
+        /// </summary>
+        public string name { set; get; }
+        /// <summary>
+        /// 字典内容
+        /// </summary>
+        public string content { set; get; }
+        /// <summary>
+        /// 字典内容2
+        /// </summary>
+        public string content2 { set; get; }
+        /// <summary>
+        /// 字典内容3
+        /// </summary>
+        public string content3 { set; get; }
+        /// <summary>
+        /// 字典描述
+        /// </summary>
+        public string description { set; get; }
+    }
+}
diff --git a/Blog.Core.Model/Models/Permission.cs b/Blog.Core.Model/Models/Permission.cs
index 9dd6238d..41ba9b28 100644
--- a/Blog.Core.Model/Models/Permission.cs
+++ b/Blog.Core.Model/Models/Permission.cs
@@ -114,7 +114,7 @@ public Permission()
         public bool hasChildren { get; set; } = true;
 
         [SugarColumn(IsIgnore = true)]
-        public List<Permission> Children { get; set; } = new List<Permission>();
+        public List<Permission> children { get; set; } = new List<Permission>();
 
         [SugarColumn(IsIgnore = true)]
         public Modules Module { get; set; }
diff --git a/Blog.Core.Model/Models/sysUserInfo.cs b/Blog.Core.Model/Models/sysUserInfo.cs
index 1137d91c..5031d738 100644
--- a/Blog.Core.Model/Models/sysUserInfo.cs
+++ b/Blog.Core.Model/Models/sysUserInfo.cs
@@ -116,8 +116,11 @@ public SysUserInfo(string loginName, string loginPWD)
 		// 地址
 		[SugarColumn(Length = 200, IsNullable = true)]
 		public string Address { get; set; }
+        // 头像
+        [SugarColumn(IsNullable = true)]
+        public string logo { get; set; }
 
-		[SugarColumn(DefaultValue = "1")]
+        [SugarColumn(DefaultValue = "1")]
 		public bool Enable { get; set; } = true;
 
 		[SugarColumn(IsNullable = true)]
diff --git a/Blog.Core.Model/PaginationModel.cs b/Blog.Core.Model/PaginationModel.cs
index f79b3316..692cf8c0 100644
--- a/Blog.Core.Model/PaginationModel.cs
+++ b/Blog.Core.Model/PaginationModel.cs
@@ -10,18 +10,22 @@ public class PaginationModel
         /// <summary>
         /// 当前页
         /// </summary>
-        public int PageIndex { get; set; } = 1;
+        public int page { get; set; } = 1;
         /// <summary>
         /// 每页大小
         /// </summary>
-        public int PageSize { get; set; } = 10;
+        public int size { get; set; } = 10;
+        /// <summary>
+        /// 搜索关键词
+        /// </summary>
+        public string key { get; set; }
         /// <summary>
         /// 排序字段(例如:id desc,time asc)
         /// </summary>
-        public string OrderByFileds { get; set; }
+        public string orderByFileds { get; set; }
         /// <summary>
         /// 查询条件( 例如:id = 1 and name = 小明)
         /// </summary>
-        public string Conditions { get; set; }
+        public string conditions { get; set; }
     }
 }
diff --git a/Blog.Core.Services/BASE/BaseServices.cs b/Blog.Core.Services/BASE/BaseServices.cs
index 44042382..daacd654 100644
--- a/Blog.Core.Services/BASE/BaseServices.cs
+++ b/Blog.Core.Services/BASE/BaseServices.cs
@@ -338,8 +338,8 @@ public async Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>>
 
         public async Task<PageModel<TEntity>> QueryPage(PaginationModel pagination)
         {
-            var express = DynamicLinqFactory.CreateLambda<TEntity>(pagination.Conditions);
-            return await QueryPage(express, pagination.PageIndex, pagination.PageSize, pagination.OrderByFileds);
+            var express = DynamicLinqFactory.CreateLambda<TEntity>(pagination.conditions);
+            return await QueryPage(express, pagination.page, pagination.size, pagination.orderByFileds);
         }
 
         #region 分表
diff --git a/Blog.Core.Services/DicService.cs b/Blog.Core.Services/DicService.cs
new file mode 100644
index 00000000..8c496dc8
--- /dev/null
+++ b/Blog.Core.Services/DicService.cs
@@ -0,0 +1,80 @@
+
+
+using Blog.Core.Common.Caches;
+using Blog.Core.IServices;
+using Blog.Core.Model.Models;
+using Blog.Core.Repository.Base;
+using Blog.Core.Services.BASE;
+
+namespace MyDotnet.Services.System
+{
+    /// <summary>
+    /// 字典服务类
+    /// </summary>
+    public class DicService: BaseServices<DicType>, IDicService
+    {
+        private BaseRepository<DicType> _dicType;
+        private BaseRepository<DicData> _dicData;
+        private ICaching _caching;
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="baseRepository"></param>
+        /// <param name="dicBaseRepository"></param>
+        /// <param name="caching"></param>
+        public DicService(BaseRepository<DicType>  baseRepository
+            , BaseRepository<DicData> dicBaseRepository
+            , ICaching caching) : base(baseRepository)
+        {
+            _dicType = baseRepository;
+            _dicData = dicBaseRepository;
+            _caching = caching;
+        }
+        /// <summary>
+        /// 获取一个字典类型值
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public async Task<DicType> GetDic(string code)
+        {
+            var data = await _caching.GetAsync<DicType>(code);
+            if(data == null)
+            {
+                //缓存穿透
+                var ls = await _dicType.Query(t => t.code == code);
+                if (ls == null || ls.Count == 0)
+                {
+                    throw new Exception($"字典[{code}]不存在");
+                }
+                data = ls.FirstOrDefault();
+                //设置缓存
+                _caching.Set(code, data);
+            }
+            return data;
+        }
+
+        /// <summary>
+        /// 获取一个字典类型列表值
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public async Task<List<DicData>> GetDicData(string code)
+        {
+
+            var data = await _caching.GetAsync<List<DicData>>(code);
+            if(data == null)
+            {
+                data = await _dicData.Query(t => t.pCode == code, "codeOrder asc");
+                if (data == null || data.Count == 0)
+                {
+                    throw new Exception($"字典[{code}]不存在");
+                }
+                //设置缓存
+                _caching.Set($"{code}_list", data);
+            }
+            return data;
+        }
+
+
+    }
+}