diff --git a/admin-client/src/components.d.ts b/admin-client/src/components.d.ts
index b801000..25ada05 100644
--- a/admin-client/src/components.d.ts
+++ b/admin-client/src/components.d.ts
@@ -84,8 +84,10 @@ declare module 'vue' {
ExternalJump: typeof import('./core/components/ExternalJump.vue')['default']
FindBack: typeof import('./core/components/FindBack.vue')['default']
GenerateCron: typeof import('./core/components/GenerateCron.vue')['default']
+ HmActionTypeSelect: typeof import('./core/components/curd/select-components/hm-action-type-select.vue')['default']
HmImage: typeof import('./core/components/huanmeng/hm-image.vue')['default']
HmImageTypeSelect: typeof import('./core/components/curd/select-components/hm-image-type-select.vue')['default']
+ HmTenantGroupSelect: typeof import('./core/components/curd/select-components/hm-tenant-group-select.vue')['default']
HmTenantSelect: typeof import('./core/components/curd/select-components/hm-tenant-select.vue')['default']
Index: typeof import('./core/components/vue3-cron-core/Index.vue')['default']
LablesCharacters: typeof import('./core/components/characters/lables-characters.vue')['default']
diff --git a/admin-client/src/core/components/curd/select-components/hm-action-type-select.vue b/admin-client/src/core/components/curd/select-components/hm-action-type-select.vue
new file mode 100644
index 0000000..d2e43e3
--- /dev/null
+++ b/admin-client/src/core/components/curd/select-components/hm-action-type-select.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/admin-client/src/core/components/curd/select-components/hm-tenant-group-select.vue b/admin-client/src/core/components/curd/select-components/hm-tenant-group-select.vue
new file mode 100644
index 0000000..5c80d29
--- /dev/null
+++ b/admin-client/src/core/components/curd/select-components/hm-tenant-group-select.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
diff --git a/admin-client/src/core/components/curd/select-components/hm-tenant-select.vue b/admin-client/src/core/components/curd/select-components/hm-tenant-select.vue
index 60c050d..e51754e 100644
--- a/admin-client/src/core/components/curd/select-components/hm-tenant-select.vue
+++ b/admin-client/src/core/components/curd/select-components/hm-tenant-select.vue
@@ -22,7 +22,7 @@ const props = withDefaults(defineProps<{
// 定义 emits
const emits = defineEmits(['update:modelValue']);
-// 异步获取数据并更新 options
+// 异步获取数据并更新 options
AppDictionaryCache.appDictionaryTenantCache.getDataListSelect().then(data => {
// console.log(data);
options.value?.push(...data);
diff --git a/admin-client/src/core/utils/AppDictionaryCache.ts b/admin-client/src/core/utils/AppDictionaryCache.ts
index 49148aa..7d72c4b 100644
--- a/admin-client/src/core/utils/AppDictionaryCache.ts
+++ b/admin-client/src/core/utils/AppDictionaryCache.ts
@@ -5,6 +5,7 @@ import AppDictionaryTenantCache from "./cache/AppDictionaryTenantCache";
import AppDictionaryTypesCache from "./cache/AppDictionaryTypesCache";
import AppDictionaryPersonalitysCache from "./cache/AppDictionaryPersonalitysCache";
import AppDictionaryLablesCache from "./cache/AppDictionaryLablesCache";
+import AppDictionaryActionTypeCache from "./cache/AppDictionaryActionTypeCache";
/**
* 基础数据缓存类
*/
@@ -33,6 +34,11 @@ class AppDictionaryCache {
* 标签配置
*/
static appDictionaryLablesCache: AbstractDictionaryCache = new AppDictionaryLablesCache();
+
+ /**
+ * 动作类型
+ */
+ static appDictionaryActionTypeCache: AbstractDictionaryCache = new AppDictionaryActionTypeCache();
}
export default AppDictionaryCache;
diff --git a/admin-client/src/core/utils/cache/AppDictionaryActionTypeCache.ts b/admin-client/src/core/utils/cache/AppDictionaryActionTypeCache.ts
new file mode 100644
index 0000000..1888444
--- /dev/null
+++ b/admin-client/src/core/utils/cache/AppDictionaryActionTypeCache.ts
@@ -0,0 +1,22 @@
+import { AbstractDictionaryCache, AppDictionaryModel, _AbstractDictionaryCache } from './AbstractDictionaryCache'
+import { DefaultOptionType } from "ant-design-vue/es/select";
+
+/**
+ * 图片类型配置
+ */
+class AppDictionaryActionTypeCache extends AbstractDictionaryCache {
+ protected code: string = "categorymenu_actiontype";
+ public static _lock: Promise | null = null;
+ constructor() {
+ super(AppDictionaryActionTypeCache._lock);
+ }
+ public async getDataListSelect(): Promise {
+ const _data = await this.getDataList();
+ return _data.map((item) => {
+ return { label: item.name, value: item.value, name: item.code, } as DefaultOptionType;
+ });
+ }
+
+}
+
+export default AppDictionaryActionTypeCache;
\ No newline at end of file
diff --git a/admin-client/src/services/apps/T_Category_Child_Menus/T_Category_Child_MenuService.ts b/admin-client/src/services/apps/T_Category_Child_Menus/T_Category_Child_MenuService.ts
new file mode 100644
index 0000000..96ca48e
--- /dev/null
+++ b/admin-client/src/services/apps/T_Category_Child_Menus/T_Category_Child_MenuService.ts
@@ -0,0 +1,84 @@
+import Http from "@/core/utils/Http";
+
+/**
+ * T_Category_Child_Menu服务
+ */
+export default class T_Category_Child_MenuService {
+
+ static urlPrefix = "/api/v1/admin/T_Category_Child_Menu";
+
+ /**
+ * 获取数据列表
+ * @param current
+ * @param pageSize
+ * @param search
+ * @param searchSort
+ * @returns
+ */
+ static findList(current: number, pageSize: number, search: any = {}, searchSort: any[] = []) {
+ return Http.post(`${this.urlPrefix}/findList`, {
+ page: current,
+ size: pageSize,
+ search,
+ searchSort
+ })
+ }
+
+ /**
+ * 删除集合数据
+ *
+ * @param ids
+ * @returns
+ */
+ static deleteList(ids: string[]) {
+ return Http.post(`${this.urlPrefix}/deleteList`, ids)
+ }
+
+ /**
+ * 查询表单
+ *
+ * @param id
+ * @returns
+ */
+ static findForm(id?: string | undefined) {
+ return Http.get(`${this.urlPrefix}/findForm${(id ? '/' + id : '')}`)
+ }
+
+ /**
+ * 保存表单数据
+ *
+ * @param id
+ * @param formData
+ * @returns
+ */
+ static saveForm(id: string | undefined, formData: any) {
+ return Http.post(`${this.urlPrefix}/${id ? 'update' : 'create'}`, formData)
+ }
+
+ /**
+ * 导出 excel
+ *
+ * @param search
+ * @param searchSort
+ * @returns
+ */
+ static exportExcel(search: any = {}, searchSort: any[] = []) {
+ return Http.download(`${this.urlPrefix}/exportExcel`, {
+ page: -1,
+ size: -1,
+ search,
+ searchSort
+ });
+ }
+
+/**
+ * 修改状态
+ * @param id
+ * @param v
+ * @returns
+ */
+static async setVisibility(id: number | undefined, v: boolean | undefined) {
+ return await Http.post(`${this.urlPrefix}/updateState/${id}/${(v == true ? "1" : "0")}`)
+}
+
+}
\ No newline at end of file
diff --git a/admin-client/src/services/system/SysDictionaryService.ts b/admin-client/src/services/system/SysDictionaryService.ts
index 31e921a..687986e 100644
--- a/admin-client/src/services/system/SysDictionaryService.ts
+++ b/admin-client/src/services/system/SysDictionaryService.ts
@@ -61,4 +61,14 @@ export default class SysDictionaryService {
static getDictionaryByCode(code: string) {
return Http.get(`${this.urlPrefix}/GetDictionaryByCode/${code}`);
}
+
+
+ /**
+ * 获取字典集合,包含子数据
+ * @param code 字典编码
+ * @returns
+ */
+ static getDictionaryByProjectCode(code: string) {
+ return Http.get(`${this.urlPrefix}/GetDictionaryByProjectCode/${code}`);
+ }
}
diff --git a/admin-client/src/views/apps/T_Category_Child_Menus/Index.vue b/admin-client/src/views/apps/T_Category_Child_Menus/Index.vue
new file mode 100644
index 0000000..51d4afe
--- /dev/null
+++ b/admin-client/src/views/apps/T_Category_Child_Menus/Index.vue
@@ -0,0 +1,371 @@
+
+
+
+
+ {
+ state.page = changeTable.pagination.current ?? 1;
+ state.size = changeTable.pagination.pageSize ?? state.size;
+ state.search.sort =
+ changeTable.sorter instanceof Array
+ ? [...changeTable.sorter]
+ : [changeTable.sorter];
+ findList();
+ }
+ "
+ @show-size-change="
+ ({ current, size }) => {
+ state.page = current == 0 ? 1 : current;
+ state.size = size;
+ findList();
+ }
+ "
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+ 查询
+
+
+
+
+
+
+
+
+
+
+
+
+ refInfo?.open()"
+ v-if="power.insert"
+ >
+
+
+
+ 新建
+
+
+
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+ 导出 Excel
+
+
+ 更多
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ record.typeName }}
+
+
+
+
+ {{ Ta(record.actionType) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ refInfo?.open(record.id)"
+ v-if="power.update"
+ >编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/admin-client/src/views/apps/T_Category_Child_Menus/Info.vue b/admin-client/src/views/apps/T_Category_Child_Menus/Info.vue
new file mode 100644
index 0000000..fd4e33b
--- /dev/null
+++ b/admin-client/src/views/apps/T_Category_Child_Menus/Info.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+ 提交
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
diff --git a/admin-client/src/views/system/sys_dictionary/Index.vue b/admin-client/src/views/system/sys_dictionary/Index.vue
index e8b1eb6..eb73d52 100644
--- a/admin-client/src/views/system/sys_dictionary/Index.vue
+++ b/admin-client/src/views/system/sys_dictionary/Index.vue
@@ -58,7 +58,7 @@ async function findList() {
// state.total = result.data.total;
// state.columns = result.data.columns;
state.data = Tools.genTreeData(result.data, null);
- state.expandedRowKeys =[];// result.data.map((item: any) => item.id);
+ state.expandedRowKeys =result.data.map((item: any) => item.id);//[];//
} catch (error) {
state.loading = false;
}
diff --git a/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/T_Category_Child_MenuService.cs b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/T_Category_Child_MenuService.cs
new file mode 100644
index 0000000..9d4b368
--- /dev/null
+++ b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/T_Category_Child_MenuService.cs
@@ -0,0 +1,187 @@
+using MiaoYu.Repository.ChatAI.Admin.Entities;
+using MiaoYu.Repository.ChatAI.Admin.Entities.Apps;
+
+using TencentCloud.Tsf.V20180326.Models;
+namespace MiaoYu.Api.Admin.ApplicationServices.Apps;
+
+///
+/// 发现页类别菜单 服务 T_Category_Child_MenuService
+///
+public class T_Category_Child_MenuService(
+ IRepository defaultRepository,
+ IRepository imageRepository,
+ IRepository character,
+ IRepository sysDictionary)
+ : ApplicationService>(defaultRepository)
+{
+
+
+ ///
+ /// 获取列表数据
+ ///
+ ///
+ ///
+ public async Task FindListAsync(PagingSearchInput pagingSearchInput)
+ {
+ var query = this._defaultRepository.Select
+
+ //项目
+ .WhereIf(pagingSearchInput.Search?.TenantId != null,
+ w => w.TenantId == pagingSearchInput.Search.TenantId)
+ .WhereIf(!string.IsNullOrEmpty(pagingSearchInput.Search?.Type),
+ w => w.Type == pagingSearchInput.Search.Type)
+
+
+
+ .OrderByDescending(w => w.Id)
+ .Select(w => new
+ {
+ TypeName = "",
+ w.TenantId,
+ w.Id,
+ w.Type,
+ Name = w.Name == null && w.ActionType == "Chat" ? character.Select.FirstOrDefault(it => it.Id.ToString() == w.ActionId).Name : w.Name,
+ w.ActionId,
+ w.ActionType,
+ ImageId = w.ImageId == 0 && w.ActionType == "Chat" ? character.Select.FirstOrDefault(it => it.Id.ToString() == w.ActionId).BgImg : w.ImageId,
+ w.OrderById,
+ w.ImageUrl,
+ w.IsEnabled,
+ w.SubTitle,
+ // w.LastModificationTime,
+ // w.CreationTime
+ })
+ ;
+
+ var result = await _defaultRepository.AsPagingViewAsync(query, pagingSearchInput);
+
+ var imageIds = new List();
+ result.DataSource.ForEach(it =>
+ {
+
+ if (it.TryGetValue("ImageId", out var bgImg))
+ {
+ if (int.TryParse(bgImg.ToString(), out var t))
+ {
+ imageIds.Add(t);
+ }
+ }
+
+
+ });
+ var imageList = imageRepository.GetAllList(it => imageIds.Contains(it.ImageId));
+
+
+ result.DataSource.ForEach(it =>
+ {
+ if (it.TryGetValue("Type", out var type))
+ {
+ it["TypeName"] = sysDictionary.Select.FirstOrDefault(item => item.Code == type.ToString())?.Name ?? "";
+ }
+ if (string.IsNullOrEmpty(it["ImageUrl"]?.ToString()))
+ {
+ setImageId(it, imageList, "ImageId", "ImageUrl");
+ }
+
+ });
+ return result;
+ }
+
+ private void setImageId(Dictionary it, List imageList, string key, string keyurl)
+ {
+ it.TryAdd(keyurl, "");
+ if (it.TryGetValue(key, out var bgImg))
+ {
+ if (int.TryParse(bgImg.ToString(), out var t))
+ {
+ var img = imageList.FirstOrDefault(it => it.ImageId == t);
+ if (img != null)
+ {
+ it[keyurl] = img.Url ?? "";
+ }
+ }
+ }
+ }
+
+ ///
+ /// 根据id数组删除
+ ///
+ /// ids
+ ///
+ public async Task DeleteListAsync(List ids)
+ {
+ await this._defaultRepository.DeleteByIdsAsync(ids);
+ }
+
+ ///
+ /// 查询表单数据
+ ///
+ /// id
+ ///
+ public async Task> FindFormAsync(int id)
+ {
+ var res = new Dictionary();
+ var form = await this._defaultRepository.FindByIdAsync(id);
+ //form = form.NullSafe();
+ if (form == null)
+ {
+ form = new T_Category_Child_Menu()
+ {
+ IsEnabled = true
+ };
+ }
+ //if (form.CreateTime == null || form.CreateTime == DateTime.MinValue)
+ //{
+ // form.CreateTime = DateTime.Now;
+ //}
+ //if (form.UpdateTime == null || form.UpdateTime == DateTime.MinValue)
+ //{
+ // form.UpdateTime = DateTime.Now;
+ //}
+ res[nameof(id)] = id;
+ res[nameof(form)] = form;
+ return res;
+ }
+
+ ///
+ /// 保存数据
+ ///
+ /// form
+ ///
+ public Task SaveFormAsync(T_Category_Child_Menu form)
+ {
+ return this._defaultRepository.InsertOrUpdateAsync(form);
+ }
+
+ ///
+ /// 导出Excel
+ ///
+ ///
+ ///
+ public async Task ExportExcelAsync(PagingSearchInput pagingSearchInput)
+ {
+ pagingSearchInput.Page = -1;
+ var tableViewModel = await this.FindListAsync(pagingSearchInput);
+ return ExcelUtil.ExportExcelByPagingView(tableViewModel, null, "Id");
+ }
+
+
+ ///
+ /// 修改状态
+ ///
+ ///
+ ///
+ ///
+
+ public async Task UpdateState(bool state, int id)
+ {
+ var form = await this._defaultRepository.FindByIdAsync(id);
+ if (form == null)
+ {
+ return false;
+ }
+ form.IsEnabled = state;
+ await SaveFormAsync(form);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/ApplicationServices/Systems/SysDictionaryService.cs b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Systems/SysDictionaryService.cs
index b10be51..7f6cbc2 100644
--- a/admin-server/MiaoYu.Api.Admin/ApplicationServices/Systems/SysDictionaryService.cs
+++ b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Systems/SysDictionaryService.cs
@@ -162,10 +162,38 @@ public class SysDictionaryService : ApplicationService w.Code == code);
if (dictionary == null) return default;
- var dictionarys = await _defaultRepository.Select.Where(w => w.ParentId == dictionary.Id).ToListAsync();
+ var dictionarys = await _defaultRepository.Select.Where(w => w.ParentId == dictionary.Id).OrderBy(it => it.Sort).ToListAsync();
if (!dictionarys.Any()) return default;
var result = new List();
return CreateDictionaryTree(dictionary.Id, dictionarys);
}
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task> GetDictionaryByProjectCodeAsync(string tenant, string code)
+ {
+ if (string.IsNullOrWhiteSpace(tenant))
+ {
+ MessageBox.Show("参数Code是空!");
+ }
+ //拿到租户
+ var dictionary = await _defaultRepository.FindAsync(w => w.Code == tenant);
+ if (dictionary == null) return default;
+ //拿到租户的子标签
+ //var dictionarys = await _defaultRepository.Select.Where(w => w.ParentId == dictionary.Id).OrderBy(it => it.Sort).ToListAsync();
+ //if (dictionarys.Count == 0) return default;
+ var list = await _defaultRepository.SelectNoTracking.ToListAsync();
+
+ //dictionarys.ForEach(_dictionary =>
+ //{
+
+ //});
+ //var result = new List();
+ return CreateDictionaryTree(dictionary.Id, list);
+ }
}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/T_Category_Child_MenuController.cs b/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/T_Category_Child_MenuController.cs
new file mode 100644
index 0000000..7ef0bd7
--- /dev/null
+++ b/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/T_Category_Child_MenuController.cs
@@ -0,0 +1,111 @@
+using MiaoYu.Api.Admin.ApplicationServices.Apps;
+using MiaoYu.Repository.ChatAI.Admin.Entities.Apps;
+namespace MiaoYu.Api.Admin.Controllers.Apps;
+
+///
+/// 发现页类别菜单 控制器
+///
+[ControllerDescriptor(MenuId = "请设置菜单Id 系统菜单表中查找,如果不设置不受权限保护!", DisplayName = "发现页类别菜单")]
+public class T_Category_Child_MenuController : AdminControllerBase
+{
+ public T_Category_Child_MenuController(T_Category_Child_MenuService defaultService)
+ : base(defaultService)
+ {
+
+ }
+
+ ///
+ /// 获取列表
+ ///
+ ///
+ ///
+ [ActionDescriptor(PermissionFunctionConsts.Function_Display, DisplayName = "查看数据")]
+ [HttpPost]
+ public Task FindListAsync([FromBody] PagingSearchInput pagingSearchInput)
+ {
+ return this._defaultService.FindListAsync(pagingSearchInput);
+ }
+
+ ///
+ /// 根据id数组删除
+ ///
+ /// ids
+ ///
+ [ActionDescriptor(PermissionFunctionConsts.Function_Delete, DisplayName = "删除数据")]
+ [HttpPost]
+ public async Task DeleteListAsync([FromBody] List ids)
+ {
+ await this._defaultService.DeleteListAsync(ids);
+ return true;
+ }
+
+ ///
+ /// 查询表单数据
+ ///
+ /// id
+ ///
+ [ActionDescriptor(DisplayName = "查看表单")]
+ [HttpGet("{id?}")]
+ public Task> FindFormAsync([FromRoute] int id)
+ {
+ return this._defaultService.FindFormAsync(id);
+ }
+
+ ///
+ /// 添加
+ ///
+ ///
+ ///
+ [RequestLimitFilter(Duration = 1, LimitCount = 1)]
+ [ActionDescriptor(PermissionFunctionConsts.Function_Insert, DisplayName = "创建表单")]
+ [HttpPost]
+ [ApiCheckModel]
+ public Task CreateAsync([FromBody] T_Category_Child_Menu form)
+ {
+ return this._defaultService.SaveFormAsync(form);
+ }
+
+ ///
+ /// 编辑
+ ///
+ ///
+ ///
+ [RequestLimitFilter(Duration = 1, LimitCount = 1)]
+ [ActionDescriptor(PermissionFunctionConsts.Function_Update, DisplayName = "编辑表单")]
+ [HttpPost]
+ [ApiCheckModel]
+ public Task UpdateAsync([FromBody] T_Category_Child_Menu form)
+ {
+ return this._defaultService.SaveFormAsync(form);
+ }
+
+ ///
+ /// 导出Excel
+ ///
+ ///
+ ///
+ [ActionDescriptor(PermissionFunctionConsts.Function_Export, DisplayName = "导出数据")]
+ [ApiResourceCacheFilter(10)]
+ [HttpPost]
+ public async Task ExportExcelAsync([FromBody] PagingSearchInput pagingSearchInput)
+ {
+ var data = await this._defaultService.ExportExcelAsync(pagingSearchInput);
+ var name = $"{PermissionUtil.GetControllerDisplayName(this.GetType())}列表数据 {DateTime.Now.ToString("yyyy-MM-dd")}.xls";
+ base.HttpContext.DownLoadFile(data, Tools.GetFileContentType[".xls"].ToStr(), name);
+ }
+
+
+ ///
+ /// 修改角色状态
+ ///
+ ///
+ ///
+ ///
+ [ActionDescriptor(PermissionFunctionConsts.Function_Update, DisplayName = "修改角色状态")]
+ [HttpPost("{id?}/{v?}")]
+ public async Task UpdateState([FromRoute] int id, [FromRoute] int v)
+ {
+ return await this._defaultService.UpdateState(v == 0 ? false : true, id);
+ }
+
+}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/Controllers/Systems/SysDictionaryController.cs b/admin-server/MiaoYu.Api.Admin/Controllers/Systems/SysDictionaryController.cs
index 71fb48e..d3909d4 100644
--- a/admin-server/MiaoYu.Api.Admin/Controllers/Systems/SysDictionaryController.cs
+++ b/admin-server/MiaoYu.Api.Admin/Controllers/Systems/SysDictionaryController.cs
@@ -112,4 +112,16 @@ public class SysDictionaryController : AdminControllerBase
return _defaultService.GetDictionaryByCodeAsync(code);
}
+ ///
+ /// 根据编码获取 字典集合
+ ///
+ ///
+ ///
+ [HttpGet("{tenant}")]
+ [AllowAnonymous]
+ public Task> GetDictionaryByProjectCodeAsync([FromRoute] string tenant)
+ {
+ return _defaultService.GetDictionaryByProjectCodeAsync(tenant,"");
+ }
+
}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml b/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
index 876e528..766459d 100644
--- a/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
+++ b/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
@@ -195,6 +195,59 @@
+
+
+ 发现页类别菜单 服务 T_Category_Child_MenuService
+
+
+
+
+ 发现页类别菜单 服务 T_Category_Child_MenuService
+
+
+
+
+ 获取列表数据
+
+
+
+
+
+
+ 根据id数组删除
+
+ ids
+
+
+
+
+ 查询表单数据
+
+ id
+
+
+
+
+ 保存数据
+
+ form
+
+
+
+
+ 导出Excel
+
+
+
+
+
+
+ 修改状态
+
+
+
+
+
人物表 服务 T_CharacterService
@@ -1648,6 +1701,14 @@
+
+
+
+
+
+
+
+
功能服务
@@ -2064,6 +2125,61 @@
+
+
+ 发现页类别菜单 控制器
+
+
+
+
+ 获取列表
+
+
+
+
+
+
+ 根据id数组删除
+
+ ids
+
+
+
+
+ 查询表单数据
+
+ id
+
+
+
+
+ 添加
+
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+ 导出Excel
+
+
+
+
+
+
+ 修改角色状态
+
+
+
+
+
人物表 控制器
@@ -3246,6 +3362,13 @@
+
+
+ 根据编码获取 字典集合
+
+
+
+
功能控制器
diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/Apps/T_Category_Child_Menu.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/Apps/T_Category_Child_Menu.cs
new file mode 100644
index 0000000..ef96ef4
--- /dev/null
+++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/Apps/T_Category_Child_Menu.cs
@@ -0,0 +1,65 @@
+namespace MiaoYu.Repository.ChatAI.Admin.Entities.Apps;
+
+///
+/// 发现页类别菜单
+///
+[EntityDescription(FieldIgnored = true)]
+public class T_Category_Child_Menu : DefaultEntityV4
+{
+
+
+ ///
+ /// 菜单类型 => 备注: 菜单类型(banner,热门推荐,热门小说)
+ ///
+ public string? Type { get; set; }
+
+
+ ///
+ /// 名称 => 备注: 名称
+ ///
+ public string? Name { get; set; }
+
+
+ ///
+ /// 动作I => 备注: 动作Id
+ ///
+ public string? ActionId { get; set; }
+
+
+ ///
+ /// 动作类型 => 备注: 动作类型
+ ///
+ public string? ActionType { get; set; }
+
+
+ ///
+ /// 图片Id => 备注: 图片Id
+ ///
+ public Int32 ImageId { get; set; }
+
+
+ ///
+ /// 排序 => 备注: 排序
+ ///
+ public Int32 OrderById { get; set; }
+
+
+ ///
+ /// 图片补位 => 备注: 图片补位
+ ///
+ public string? ImageUrl { get; set; }
+
+
+ ///
+ /// 是否启用 => 备注: IsEnabled
+ ///
+ public Boolean IsEnabled { get; set; }
+
+
+ ///
+ /// 副标题 => 备注: SubTitle
+ ///
+ public string? SubTitle { get; set; }
+
+
+}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
index 5992d12..e44cf53 100644
--- a/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
+++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
@@ -37,6 +37,56 @@
+
+
+ 发现页类别菜单
+
+
+
+
+ 菜单类型 => 备注: 菜单类型(banner,热门推荐,热门小说)
+
+
+
+
+ 名称 => 备注: 名称
+
+
+
+
+ 动作I => 备注: 动作Id
+
+
+
+
+ 动作类型 => 备注: 动作类型
+
+
+
+
+ 图片Id => 备注: 图片Id
+
+
+
+
+ 排序 => 备注: 排序
+
+
+
+
+ 图片补位 => 备注: 图片补位
+
+
+
+
+ 是否启用 => 备注: IsEnabled
+
+
+
+
+ 副标题 => 备注: SubTitle
+
+
人物表