修改发现

This commit is contained in:
zpc 2024-08-03 07:11:30 +08:00
parent f441e1ad4b
commit d72120f788
18 changed files with 1388 additions and 3 deletions

View File

@ -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']

View File

@ -0,0 +1,41 @@
<template>
<a-select :options="options" :value="modelValue" @change="updateValue" />
</template>
<script lang="ts" setup>
import { ref } from "vue";
import type { SelectProps } from "ant-design-vue";
import AppDictionaryCache from "@/core/utils/AppDictionaryCache";
import type { SelectValue } from "ant-design-vue/lib/select";
// options
const options = ref<SelectProps["options"]>([]);
// 使 withDefaults
const props = withDefaults(
defineProps<{
modelValue: SelectValue;
}>(),
{}
);
// emits
const emits = defineEmits(["update:modelValue"]);
// options
AppDictionaryCache.appDictionaryActionTypeCache
.getDataListSelect()
.then((data) => {
// console.log(data);
options.value?.push(...data);
});
// update:modelValue
function updateValue(value: SelectValue) {
emits("update:modelValue", value);
}
</script>
<style lang="less">
/* 你的样式代码 */
</style>

View File

@ -0,0 +1,76 @@
<template>
<a-select :options="options" :value="modelValue" @change="updateValue" />
</template>
<script lang="ts" setup>
import { ref } from "vue";
import type { SelectProps } from "ant-design-vue";
import AppDictionaryCache from "@/core/utils/AppDictionaryCache";
import type { SelectValue } from "ant-design-vue/lib/select";
import SysDictionaryService from "@/services/system/SysDictionaryService";
// options
const options = ref<SelectProps["options"]>([]);
// 使 withDefaults
const props = withDefaults(
defineProps<{
modelValue: SelectValue;
tenantId: string;
ShowAll: boolean; //
}>(),
{
ShowAll: false, // true
}
);
console.log(props.tenantId);
var tenantId = props.tenantId;
if (tenantId == null) {
tenantId = "00000000-0000-0000-0000-000000000000";
}
// emits
const emits = defineEmits(["update:modelValue"]);
async function LoadData(_tenantId: string) {
const response = await SysDictionaryService.getDictionaryByProjectCode(
tenantId
);
var data = [];
if (response.data != null) {
data = response.data;
}
data.map((item) => {
let _options: any[] = [];
if (item.children.length > 0) {
item.children.map((c) => {
_options.push({
value: c.code,
label: c.name,
});
});
}
options.value?.push({
label: item.name,
options: _options,
});
});
}
LoadData(tenantId);
// options
// AppDictionaryCache.appDictionaryTenantCache.getDataListSelect().then(data => {
// // console.log(data);
// options.value?.push(...data);
// if (props.ShowAll) {
// options.value?.unshift({ value: '', label: '' });
// }
// });
// update:modelValue
function updateValue(value: SelectValue) {
emits("update:modelValue", value);
}
</script>
<style lang="less">
/* 你的样式代码 */
</style>

View File

@ -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);

View File

@ -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;

View File

@ -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<void> | null = null;
constructor() {
super(AppDictionaryActionTypeCache._lock);
}
public async getDataListSelect(): Promise<DefaultOptionType[]> {
const _data = await this.getDataList();
return _data.map((item) => {
return { label: item.name, value: item.value, name: item.code, } as DefaultOptionType;
});
}
}
export default AppDictionaryActionTypeCache;

View File

@ -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")}`)
}
}

View File

@ -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}`);
}
}

View File

@ -0,0 +1,371 @@
<script lang="ts" setup>
import { reactive, ref, onMounted } from "vue";
import { FormInstance } from "ant-design-vue";
import { useAuthority } from "@/utils/Authority";
import AppIcon from "@/core/components/AppIcon.vue";
import Info from "./Info.vue";
import Tools from "@/core/utils/Tools";
import PageContainer from "@/core/components/PageContainer.vue";
import TableCurd from "@/core/components/curd/TableCurd.vue";
import T_Category_Child_MenuService from "@/services/apps/T_Category_Child_Menus/T_Category_Child_MenuService";
import AppDictionaryCache from "@/core/utils/AppDictionaryCache";
defineOptions({ name: "T_Category_Child_MenuIndex" });
const state = reactive({
search: {
state: false,
vm: {
name: undefined,
},
sort: [] as any[],
},
loading: false,
page: 1,
size: 50,
total: 100,
columns: [] as any,
data: [] as any,
});
//
const power = useAuthority();
//
const refTableCurd = ref<InstanceType<typeof TableCurd>>();
//
const refInfo = ref<InstanceType<typeof Info>>();
//
const refSearchForm = ref<FormInstance>();
/**
* 初始化
*/
onMounted(() => {
findList();
});
/**
*获取数据
*/
async function findList() {
try {
state.loading = true;
let keys = Object.keys(state.search.vm);
keys.map((k) => {
if (state.search.vm[k] == null || state.search.vm[k] == "") {
delete state.search.vm[k];
}
});
const result = await T_Category_Child_MenuService.findList(
state.page,
state.size,
state.search.vm,
state.search.sort
);
state.loading = false;
if (result.code != 200) return;
state.page = result.data.page;
state.size = result.data.size;
state.total = result.data.total;
state.columns = result.data.columns;
state.data = result.data.dataSource;
// state.visible = false;
} catch (error) {
state.loading = false;
}
}
/**
* 删除数据
* @param id
*/
async function deleteList(id?: string) {
let ids: string[] = [];
if (id) {
ids.push(id);
} else {
ids = refTableCurd.value?.getSelectedRowKeys() ?? [];
}
if (ids.length == 0) return Tools.message.error("请选择要删除的行!");
try {
state.loading = true;
const result = await T_Category_Child_MenuService.deleteList(ids);
state.loading = false;
if (result.code != 200) return;
Tools.message.success("删除成功!");
findList();
} catch (error) {
state.loading = false;
}
}
/**
* 导出excel
*/
function exportExcel() {
T_Category_Child_MenuService.exportExcel(state.search.vm, state.search.sort);
}
let tempData = [];
AppDictionaryCache.appDictionaryActionTypeCache.getDataList().then((data) => {
tempData = data;
});
function Ta(r) {
let cc = tempData.find((it) => it.value == r);
if (cc != null) {
return cc.name;
}
return "";
}
async function visibilityChange(id: number, visibility: boolean, record: any) {
var response = await T_Category_Child_MenuService.setVisibility(
id,
visibility
);
console.log(visibility, response);
// record.visibility=visibility;
}
</script>
<template>
<PageContainer>
<TableCurd
ref="refTableCurd"
:config="state"
@change="
(changeTable) => {
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();
}
"
>
<!-- search -->
<template #search>
<a-form
ref="refSearchForm"
:model="state.search.vm"
v-if="power.search"
>
<a-row :gutter="[16, 0]">
<!--
<a-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<a-form-item class="mb-0" name="name" label="名称">
<a-input v-model:value="state.search.vm.name" placeholder="名称" />
</a-form-item>
</a-col>
-->
<a-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<a-form-item class="mb-0" name="tenantId" label="项目">
<hm-tenant-select
v-model:value="state.search.vm.tenantId"
:ShowAll="false"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<a-form-item class="mb-0" name="tenantId" label="所属分类">
<hm-tenant-group-select
:tenant-id="state.search.vm.tenantId"
v-model:value="state.search.vm.type"
/>
</a-form-item>
</a-col>
<!--button-->
<a-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="text-right">
<a-space :size="8">
<a-button
@click="
state.page = 1;
refSearchForm?.resetFields();
findList();
"
>
重置
</a-button>
<a-button
type="primary"
@click="
state.page = 1;
findList();
"
>
查询
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
<!-- toolbar-left -->
<template #toolbar-left>
<a-button
@click="state.search.state = !state.search.state"
v-if="power.search"
>
<div v-if="state.search.state">
<AppIcon name="UpOutlined" />&nbsp;&nbsp;收起
</div>
<div v-else><AppIcon name="DownOutlined" />&nbsp;&nbsp;展开</div>
</a-button>
<a-button
type="primary"
@click="() => refInfo?.open()"
v-if="power.insert"
>
<template #icon>
<AppIcon name="PlusOutlined" />
</template>
新建
</a-button>
<a-popconfirm
title="您确定要删除?"
@confirm="deleteList()"
okText="确定"
cancelText="取消"
v-if="power.delete"
>
<a-button type="primary" danger>
<template #icon>
<AppIcon name="DeleteOutlined" />
</template>
批量删除
</a-button>
</a-popconfirm>
</template>
<!-- toolbar-right -->
<template #toolbar-right>
<a-dropdown>
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="exportExcel()"
>导出 Excel</a-menu-item
>
</a-menu>
</template>
<a-button> 更多 <AppIcon name="ellipsis-outlined" /> </a-button>
</a-dropdown>
<!-- 列设置 -->
<a-popover>
<template #content>
<div
v-for="item in state.columns.filter((w:any) => w.fieldName.substr(0, 1) != '_')"
>
<a-checkbox v-model:checked="item.show">{{
item.title
}}</a-checkbox>
</div>
</template>
<a-button type="text">
<template #icon><AppIcon name="setting-outlined" /> </template>
</a-button>
</a-popover>
</template>
<!-- table-col -->
<template #table-col>
<template
v-for="item,index in state.columns.filter((w:any) => w.fieldName !== 'id' && w.fieldName !== 'typeName' && w.show)"
:key="item.fieldName"
>
<a-table-column
v-if="item.fieldName == 'type'"
:title="item.title"
:data-index="item.fieldName"
:sorter="item.sort ? { multiple: index + 1 } : false"
>
<template #default="{ record }">
{{ record.typeName }}
</template>
</a-table-column>
<a-table-column
v-else-if="item.fieldName == 'actionType'"
:title="item.title"
:data-index="item.fieldName"
:sorter="item.sort ? { multiple: index + 1 } : false"
>
<template #default="{ record }">
{{ Ta(record.actionType) }}
</template>
</a-table-column>
<a-table-column
v-else-if="item.fieldName == 'isEnabled'"
:title="item.title"
:data-index="item.fieldName"
:sorter="item.sort ? { multiple: index + 1 } : false"
>
<template #default="{ record }">
<a-switch
v-model:checked="record.isEnabled"
checked-children="上线"
un-checked-children="下线"
@change="visibilityChange(record.id, record.isEnabled, record)"
/>
</template>
</a-table-column>
<a-table-column
v-else-if="item.fieldName == 'imageUrl'"
:title="item.title"
:data-index="item.fieldName"
:sorter="item.sort ? { multiple: index + 1 } : false"
width="150px"
>
<template #default="{ record }">
<a-image
:width="100"
:src="record.imageUrl + '/htslt'"
:preview="{ src: record.imageUrl }"
/>
</template>
</a-table-column>
<a-table-column
v-else
:title="item.title"
:data-index="item.fieldName"
:sorter="item.sort ? { multiple: index + 1 } : false"
/>
</template>
<!-- 操作 -->
<a-table-column
title="操作"
data-index="id"
v-if="power.update || power.delete"
width="200px"
fixed="right"
>
<template #default="{ record }">
<a
href="javascript:;"
@click="() => refInfo?.open(record.id)"
v-if="power.update"
>编辑</a
>
<a-divider type="vertical" />
<a-popconfirm
title="您确定要删除?"
@confirm="deleteList(record.id)"
okText="确定"
cancelText="取消"
v-if="power.delete"
>
<a class="text-danger">删除</a>
</a-popconfirm>
</template>
</a-table-column>
</template>
</TableCurd>
<!-- Info -->
<Info ref="refInfo" :onSuccess="() => findList()" />
</PageContainer>
</template>

View File

@ -0,0 +1,197 @@
<script lang="ts" setup>
import { reactive, ref } from "vue";
import { FormInstance } from "ant-design-vue";
import Tools from "@/core/utils/Tools";
import T_Category_Child_MenuService from "@/services/apps/T_Category_Child_Menus/T_Category_Child_MenuService";
//
const props = defineProps<{ onSuccess: () => void }>();
const state = reactive({
vm: {
id: "",
form: {} as any,
},
visible: false,
loading: false,
});
//
const refForm = ref<FormInstance>();
//
defineExpose({
/**
* 打开表单初始化
* @param key
*/
open: (key: string = "") => {
state.visible = true;
if (state.visible) {
state.vm.id = key;
}
refForm.value?.resetFields();
//
state.loading = true;
T_Category_Child_MenuService.findForm(key).then((res) => {
state.loading = false;
if (res.code != 200) return;
state.vm = res.data;
});
},
});
/**
*保存数据
*/
function save() {
refForm.value?.validate().then(async () => {
try {
state.loading = true;
const result = await T_Category_Child_MenuService.saveForm(
state.vm.id,
state.vm.form
);
state.loading = false;
if (result.code != 200) return;
Tools.message.success("操作成功!");
props.onSuccess();
state.visible = false;
} catch (error) {
state.loading = false;
}
});
}
</script>
<template>
<a-modal
v-model:open="state.visible"
:title="state.vm.id ? '编辑' : '新建'"
centered
@ok="state.visible = false"
:width="800"
>
<template #footer>
<a-button type="primary" :loading="state.loading" @click="save()">
提交</a-button
>
<a-button @click="state.visible = false">关闭</a-button>
</template>
<a-spin :spinning="state.loading">
<a-form ref="refForm" layout="vertical" :model="state.vm.form">
<a-row :gutter="[16, 0]">
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="项目" name="tenantId">
<hm-tenant-select v-model:value="state.vm.form.tenantId" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="所属分类"
name="type"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<hm-tenant-group-select
:tenant-id="state.vm.form.tenantId"
v-model:value="state.vm.form.type"
/>
<!-- <a-input
v-model:value="state.vm.form.type"
placeholder="请输入"
/> -->
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="名称"
name="name"
>
<a-input
v-model:value="state.vm.form.name"
placeholder="请输入"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="副标题" name="subTitle">
<a-input
v-model:value="state.vm.form.subTitle"
placeholder="请输入"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="动作类型"
name="actionType"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<hm-action-type-select
v-model:value="state.vm.form.actionType"
></hm-action-type-select>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="动作内容动作类型为聊天动作内容为聊天角色Id页面->跳转页面地址,)"
name="actionId"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<a-input
v-model:value="state.vm.form.actionId"
placeholder="请输入"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="图片Id(动作类型为聊天图片id为0会使用角色背景图片)"
name="imageId"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<hm-image v-model="state.vm.form.imageId" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="排序"
name="orderById"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<a-input
v-model:value="state.vm.form.orderById"
placeholder="请输入"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="图片地址如果填入上面的图片id将不起作用"
name="imageUrl"
>
<a-input
v-model:value="state.vm.form.imageUrl"
placeholder="请输入"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item
label="是否启用"
name="isEnabled"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
>
<a-select v-model:value="state.vm.form.isEnabled">
<a-select-option :value="true">启用</a-select-option>
<a-select-option :value="false">禁用</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</a-modal>
</template>

View File

@ -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;
}

View File

@ -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;
/// <summary>
/// 发现页类别菜单 服务 T_Category_Child_MenuService
/// </summary>
public class T_Category_Child_MenuService(
IRepository<T_Category_Child_Menu> defaultRepository,
IRepository<T_Image_Config> imageRepository,
IRepository<T_Character> character,
IRepository<SysDictionary> sysDictionary)
: ApplicationService<IRepository<T_Category_Child_Menu>>(defaultRepository)
{
/// <summary>
/// 获取列表数据
/// </summary>
/// <param name="pagingSearchInput"></param>
/// <returns></returns>
public async Task<PagingView> FindListAsync(PagingSearchInput<T_Category_Child_Menu> 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<int>();
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<string, object?> it, List<T_Image_Config> 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 ?? "";
}
}
}
}
/// <summary>
/// 根据id数组删除
/// </summary>
/// <param name="ids">ids</param>
/// <returns></returns>
public async Task DeleteListAsync(List<int> ids)
{
await this._defaultRepository.DeleteByIdsAsync(ids);
}
/// <summary>
/// 查询表单数据
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
public async Task<Dictionary<string, object>> FindFormAsync(int id)
{
var res = new Dictionary<string, object>();
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;
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="form">form</param>
/// <returns></returns>
public Task SaveFormAsync(T_Category_Child_Menu form)
{
return this._defaultRepository.InsertOrUpdateAsync(form);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="pagingSearchInput"></param>
/// <returns></returns>
public async Task<byte[]> ExportExcelAsync(PagingSearchInput<T_Category_Child_Menu> pagingSearchInput)
{
pagingSearchInput.Page = -1;
var tableViewModel = await this.FindListAsync(pagingSearchInput);
return ExcelUtil.ExportExcelByPagingView(tableViewModel, null, "Id");
}
/// <summary>
/// 修改状态
/// </summary>
/// <param name="state"></param>
/// <param name="id"></param>
/// <returns></returns>
public async Task<bool> 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;
}
}

View File

@ -162,10 +162,38 @@ public class SysDictionaryService : ApplicationService<IRepository<SysDictionary
var dictionary = await _defaultRepository.FindAsync(w => 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<SysDictionaryDto>();
return CreateDictionaryTree(dictionary.Id, dictionarys);
}
/// <summary>
///
/// </summary>
/// <param name="tenant"></param>
/// <param name="code"></param>
/// <returns></returns>
public async Task<List<SysDictionaryDto>> 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<SysDictionaryDto>();
return CreateDictionaryTree(dictionary.Id, list);
}
}

View File

@ -0,0 +1,111 @@
using MiaoYu.Api.Admin.ApplicationServices.Apps;
using MiaoYu.Repository.ChatAI.Admin.Entities.Apps;
namespace MiaoYu.Api.Admin.Controllers.Apps;
/// <summary>
/// 发现页类别菜单 控制器
/// </summary>
[ControllerDescriptor(MenuId = "请设置菜单Id 系统菜单表中查找,如果不设置不受权限保护!", DisplayName = "发现页类别菜单")]
public class T_Category_Child_MenuController : AdminControllerBase<T_Category_Child_MenuService>
{
public T_Category_Child_MenuController(T_Category_Child_MenuService defaultService)
: base(defaultService)
{
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="pagingSearchInput"></param>
/// <returns></returns>
[ActionDescriptor(PermissionFunctionConsts.Function_Display, DisplayName = "查看数据")]
[HttpPost]
public Task<PagingView> FindListAsync([FromBody] PagingSearchInput<T_Category_Child_Menu> pagingSearchInput)
{
return this._defaultService.FindListAsync(pagingSearchInput);
}
/// <summary>
/// 根据id数组删除
/// </summary>
/// <param name="ids">ids</param>
/// <returns></returns>
[ActionDescriptor(PermissionFunctionConsts.Function_Delete, DisplayName = "删除数据")]
[HttpPost]
public async Task<bool> DeleteListAsync([FromBody] List<int> ids)
{
await this._defaultService.DeleteListAsync(ids);
return true;
}
/// <summary>
/// 查询表单数据
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[ActionDescriptor(DisplayName = "查看表单")]
[HttpGet("{id?}")]
public Task<Dictionary<string, object>> FindFormAsync([FromRoute] int id)
{
return this._defaultService.FindFormAsync(id);
}
/// <summary>
/// 添加
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 编辑
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="pagingSearchInput"></param>
/// <returns></returns>
[ActionDescriptor(PermissionFunctionConsts.Function_Export, DisplayName = "导出数据")]
[ApiResourceCacheFilter(10)]
[HttpPost]
public async Task ExportExcelAsync([FromBody] PagingSearchInput<T_Category_Child_Menu> 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);
}
/// <summary>
/// 修改角色状态
/// </summary>
/// <param name="id"></param>
/// <param name="v"></param>
/// <returns></returns>
[ActionDescriptor(PermissionFunctionConsts.Function_Update, DisplayName = "修改角色状态")]
[HttpPost("{id?}/{v?}")]
public async Task<bool> UpdateState([FromRoute] int id, [FromRoute] int v)
{
return await this._defaultService.UpdateState(v == 0 ? false : true, id);
}
}

View File

@ -112,4 +112,16 @@ public class SysDictionaryController : AdminControllerBase<SysDictionaryService>
return _defaultService.GetDictionaryByCodeAsync(code);
}
/// <summary>
/// 根据编码获取 字典集合
/// </summary>
/// <param name="tenant"></param>
/// <returns></returns>
[HttpGet("{tenant}")]
[AllowAnonymous]
public Task<List<SysDictionaryDto>> GetDictionaryByProjectCodeAsync([FromRoute] string tenant)
{
return _defaultService.GetDictionaryByProjectCodeAsync(tenant,"");
}
}

View File

@ -195,6 +195,59 @@
<param name="name"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService">
<summary>
发现页类别菜单 服务 T_Category_Child_MenuService
</summary>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.#ctor(HZY.Framework.Repository.EntityFramework.IRepository{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu},HZY.Framework.Repository.EntityFramework.IRepository{MiaoYu.Repository.ChatAI.Admin.Entities.T_Image_Config},HZY.Framework.Repository.EntityFramework.IRepository{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Character},HZY.Framework.Repository.EntityFramework.IRepository{MiaoYu.Repository.Admin.Entities.Systems.SysDictionary})">
<summary>
发现页类别菜单 服务 T_Category_Child_MenuService
</summary>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.FindListAsync(MiaoYu.Shared.Admin.Models.PagingViews.PagingSearchInput{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu})">
<summary>
获取列表数据
</summary>
<param name="pagingSearchInput"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.DeleteListAsync(System.Collections.Generic.List{System.Int32})">
<summary>
根据id数组删除
</summary>
<param name="ids">ids</param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.FindFormAsync(System.Int32)">
<summary>
查询表单数据
</summary>
<param name="id">id</param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.SaveFormAsync(MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu)">
<summary>
保存数据
</summary>
<param name="form">form</param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.ExportExcelAsync(MiaoYu.Shared.Admin.Models.PagingViews.PagingSearchInput{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu})">
<summary>
导出Excel
</summary>
<param name="pagingSearchInput"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Apps.T_Category_Child_MenuService.UpdateState(System.Boolean,System.Int32)">
<summary>
修改状态
</summary>
<param name="state"></param>
<param name="id"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.ApplicationServices.Apps.T_CharacterService">
<summary>
人物表 服务 T_CharacterService
@ -1648,6 +1701,14 @@
<param name="code"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.ApplicationServices.Systems.SysDictionaryService.GetDictionaryByProjectCodeAsync(System.String,System.String)">
<summary>
</summary>
<param name="tenant"></param>
<param name="code"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.ApplicationServices.Systems.SysFunctionService">
<summary>
功能服务
@ -2064,6 +2125,61 @@
<param name="name"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController">
<summary>
发现页类别菜单 控制器
</summary>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.FindListAsync(MiaoYu.Shared.Admin.Models.PagingViews.PagingSearchInput{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu})">
<summary>
获取列表
</summary>
<param name="pagingSearchInput"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.DeleteListAsync(System.Collections.Generic.List{System.Int32})">
<summary>
根据id数组删除
</summary>
<param name="ids">ids</param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.FindFormAsync(System.Int32)">
<summary>
查询表单数据
</summary>
<param name="id">id</param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.CreateAsync(MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu)">
<summary>
添加
</summary>
<param name="form"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.UpdateAsync(MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu)">
<summary>
编辑
</summary>
<param name="form"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.ExportExcelAsync(MiaoYu.Shared.Admin.Models.PagingViews.PagingSearchInput{MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu})">
<summary>
导出Excel
</summary>
<param name="pagingSearchInput"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Apps.T_Category_Child_MenuController.UpdateState(System.Int32,System.Int32)">
<summary>
修改角色状态
</summary>
<param name="id"></param>
<param name="v"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.Controllers.Apps.T_CharacterController">
<summary>
人物表 控制器
@ -3246,6 +3362,13 @@
<param name="code"></param>
<returns></returns>
</member>
<member name="M:MiaoYu.Api.Admin.Controllers.Systems.SysDictionaryController.GetDictionaryByProjectCodeAsync(System.String)">
<summary>
根据编码获取 字典集合
</summary>
<param name="tenant"></param>
<returns></returns>
</member>
<member name="T:MiaoYu.Api.Admin.Controllers.Systems.SysFunctionController">
<summary>
功能控制器

View File

@ -0,0 +1,65 @@
namespace MiaoYu.Repository.ChatAI.Admin.Entities.Apps;
/// <summary>
/// 发现页类别菜单
/// </summary>
[EntityDescription(FieldIgnored = true)]
public class T_Category_Child_Menu : DefaultEntityV4
{
/// <summary>
/// 菜单类型 => 备注: 菜单类型banner,热门推荐,热门小说)
/// </summary>
public string? Type { get; set; }
/// <summary>
/// 名称 => 备注: 名称
/// </summary>
public string? Name { get; set; }
/// <summary>
/// 动作I => 备注: 动作Id
/// </summary>
public string? ActionId { get; set; }
/// <summary>
/// 动作类型 => 备注: 动作类型
/// </summary>
public string? ActionType { get; set; }
/// <summary>
/// 图片Id => 备注: 图片Id
/// </summary>
public Int32 ImageId { get; set; }
/// <summary>
/// 排序 => 备注: 排序
/// </summary>
public Int32 OrderById { get; set; }
/// <summary>
/// 图片补位 => 备注: 图片补位
/// </summary>
public string? ImageUrl { get; set; }
/// <summary>
/// 是否启用 => 备注: IsEnabled
/// </summary>
public Boolean IsEnabled { get; set; }
/// <summary>
/// 副标题 => 备注: SubTitle
/// </summary>
public string? SubTitle { get; set; }
}

View File

@ -37,6 +37,56 @@
</summary>
<param name="webApplication"></param>
</member>
<member name="T:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu">
<summary>
发现页类别菜单
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.Type">
<summary>
菜单类型 => 备注: 菜单类型banner,热门推荐,热门小说)
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.Name">
<summary>
名称 => 备注: 名称
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.ActionId">
<summary>
动作I => 备注: 动作Id
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.ActionType">
<summary>
动作类型 => 备注: 动作类型
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.ImageId">
<summary>
图片Id => 备注: 图片Id
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.OrderById">
<summary>
排序 => 备注: 排序
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.ImageUrl">
<summary>
图片补位 => 备注: 图片补位
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.IsEnabled">
<summary>
是否启用 => 备注: IsEnabled
</summary>
</member>
<member name="P:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Category_Child_Menu.SubTitle">
<summary>
副标题 => 备注: SubTitle
</summary>
</member>
<member name="T:MiaoYu.Repository.ChatAI.Admin.Entities.Apps.T_Character">
<summary>
人物表