修改模态框对象类型.

This commit is contained in:
lijiahang
2023-09-25 14:36:13 +08:00
parent e1fafbe135
commit 09610b3c82
29 changed files with 1450 additions and 2658 deletions

View File

@@ -26,7 +26,7 @@ export interface ${vue.featureEntity}CreateRequest {
* ${table.comment}更新请求 * ${table.comment}更新请求
*/ */
export interface ${vue.featureEntity}UpdateRequest extends ${vue.featureEntity}CreateRequest { export interface ${vue.featureEntity}UpdateRequest extends ${vue.featureEntity}CreateRequest {
id: number | undefined; id?: number;
} }
/** /**

View File

@@ -21,7 +21,9 @@
<!-- $field.comment --> <!-- $field.comment -->
<a-form-item field="${field.propertyName}" label="${field.comment}"> <a-form-item field="${field.propertyName}" label="${field.comment}">
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long") #if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}" placeholder="请输入${field.comment}" /> <a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
hide-button />
#elseif("$field.propertyType" == "Date") #elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}" <a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%" style="width: 100%"
@@ -45,7 +47,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -61,7 +63,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): ${vue.featureEntity}UpdateRequest & Record<string, any> => { const defaultForm = (): ${vue.featureEntity}UpdateRequest => {
return { return {
#foreach($field in ${table.fields}) #foreach($field in ${table.fields})
${field.propertyName}: undefined, ${field.propertyName}: undefined,
@@ -70,7 +72,7 @@
}; };
const formRef = ref<any>(); const formRef = ref<any>();
const formModel = reactive<${vue.featureEntity}UpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<${vue.featureEntity}UpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -92,11 +94,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -112,12 +110,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await create${vue.featureEntity}(formModel); await create${vue.featureEntity}(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await update${vue.featureEntity}(formModel); await update${vue.featureEntity}(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -25,7 +25,9 @@
<!-- $field.comment --> <!-- $field.comment -->
<a-form-item field="${field.propertyName}" label="${field.comment}"> <a-form-item field="${field.propertyName}" label="${field.comment}">
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long") #if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}" placeholder="请输入${field.comment}" /> <a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
hide-button />
#elseif("$field.propertyType" == "Date") #elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}" <a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%" style="width: 100%"
@@ -49,7 +51,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -65,7 +67,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): ${vue.featureEntity}UpdateRequest & Record<string, any> => { const defaultForm = (): ${vue.featureEntity}UpdateRequest => {
return { return {
#foreach($field in ${table.fields}) #foreach($field in ${table.fields})
${field.propertyName}: undefined, ${field.propertyName}: undefined,
@@ -74,7 +76,7 @@
}; };
const formRef = ref<any>(); const formRef = ref<any>();
const formModel = reactive<${vue.featureEntity}UpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<${vue.featureEntity}UpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -96,11 +98,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -116,12 +114,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await create${vue.featureEntity}(formModel); await create${vue.featureEntity}(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await update${vue.featureEntity}(formModel); await update${vue.featureEntity}(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -9,13 +9,16 @@
<!-- $field.comment --> <!-- $field.comment -->
<a-form-item field="${field.propertyName}" label="${field.comment}" label-col-flex="50px"> <a-form-item field="${field.propertyName}" label="${field.comment}" label-col-flex="50px">
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long") #if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}" placeholder="请输入${field.comment}" allow-clear/> <a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
allow-clear
hide-button />
#elseif("$field.propertyType" == "Date") #elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}" <a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%" style="width: 100%"
placeholder="请选择${field.comment}" placeholder="请选择${field.comment}"
show-time show-time
allow-clear/> allow-clear />
#else #else
<a-input v-model="formModel.${field.propertyName}" placeholder="请输入${field.comment}" allow-clear/> <a-input v-model="formModel.${field.propertyName}" placeholder="请输入${field.comment}" allow-clear/>
#end #end
@@ -67,10 +70,10 @@
label-align="left" label-align="left"
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
v-model:selectedKeys="selectedKeys" :selected-keys="selectedKeys"
:row-selection="rowSelection" :row-selection="rowSelection"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
@@ -123,11 +126,11 @@
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const emits = defineEmits(['openAdd', 'openUpdate']); const emits = defineEmits(['openAdd', 'openUpdate']);
const pagination = reactive(defaultPagination()); const pagination = reactive(defaultPagination()) as PaginationProps;
const selectedKeys = ref<number[]>([]); const selectedKeys = ref<number[]>([]);
const rowSelection = reactive(defaultRowSelection()); const rowSelection = reactive(defaultRowSelection());
const formModel = reactive<${vue.featureEntity}QueryRequest>({ const formModel = ref<${vue.featureEntity}QueryRequest>({
#foreach($field in ${table.fields}) #foreach($field in ${table.fields})
${field.propertyName}: undefined, ${field.propertyName}: undefined,
#end #end
@@ -150,7 +153,9 @@
}; };
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@ export interface HostIdentityCreateRequest {
* 主机身份更新请求 * 主机身份更新请求
*/ */
export interface HostIdentityUpdateRequest extends HostIdentityCreateRequest { export interface HostIdentityUpdateRequest extends HostIdentityCreateRequest {
id: number | undefined; id?: number;
useNewPassword?: boolean; useNewPassword?: boolean;
} }

View File

@@ -16,7 +16,7 @@ export interface HostKeyCreateRequest {
* 主机秘钥更新请求 * 主机秘钥更新请求
*/ */
export interface HostKeyUpdateRequest extends HostKeyCreateRequest { export interface HostKeyUpdateRequest extends HostKeyCreateRequest {
id: number | undefined; id?: number;
useNewPassword?: boolean; useNewPassword?: boolean;
} }

View File

@@ -16,7 +16,7 @@ export interface HostCreateRequest {
* 主机更新请求 * 主机更新请求
*/ */
export interface HostUpdateRequest extends HostCreateRequest { export interface HostUpdateRequest extends HostCreateRequest {
id: number | undefined; id?: number;
} }
/** /**

View File

@@ -21,7 +21,7 @@ export interface MenuCreateRequest {
* 菜单更新请求 * 菜单更新请求
*/ */
export interface MenuUpdateRequest extends MenuCreateRequest { export interface MenuUpdateRequest extends MenuCreateRequest {
id: number | undefined; id?: number;
status?: number; status?: number;
} }

View File

@@ -15,7 +15,7 @@ export interface RoleCreateRequest {
* 角色更新请求 * 角色更新请求
*/ */
export interface RoleUpdateRequest extends RoleCreateRequest { export interface RoleUpdateRequest extends RoleCreateRequest {
id: number | undefined; id?: number;
} }
/** /**
@@ -44,10 +44,11 @@ export interface RoleQueryResponse extends TableData {
name?: string; name?: string;
code?: string; code?: string;
status?: number; status?: number;
createTime: number; // FIXME 恢复
updateTime: number; createTime?: number;
creator: string; updateTime?: number;
updater: string; creator?: string;
updater?: string;
} }
/** /**

View File

@@ -20,7 +20,7 @@ export interface UserCreateRequest {
* 用户更新请求 * 用户更新请求
*/ */
export interface UserUpdateRequest extends UserCreateRequest { export interface UserUpdateRequest extends UserCreateRequest {
id: number | undefined; id?: number;
roleIdList?: Array<number>; roleIdList?: Array<number>;
password?: string; password?: string;
} }

View File

@@ -5,6 +5,7 @@
size="small" size="small"
:default-value="defaultValue as number" :default-value="defaultValue as number"
@change="handleChange" @change="handleChange"
hide-button
/> />
<a-switch <a-switch
v-else v-else

View File

@@ -10,12 +10,12 @@ export function getBase64Data(e: string) {
/** /**
* 读取文件内容 返回 promise * 读取文件内容 返回 promise
*/ */
export function readFileText(e: File, encoding = 'UTF-8') { export function readFileText(e: File, encoding = 'UTF-8'): Promise<string> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const reader = new FileReader(); const reader = new FileReader();
reader.readAsText(e, encoding); reader.readAsText(e, encoding);
reader.onload = res => { reader.onload = res => {
resolve(res.target?.result); resolve(res.target?.result as string);
}; };
reader.onerror = err => { reader.onerror = err => {
reject(err); reject(err);

View File

@@ -60,7 +60,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -74,7 +74,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): HostIdentityUpdateRequest & Record<string, any> => { const defaultForm = (): HostIdentityUpdateRequest => {
return { return {
id: undefined, id: undefined,
name: undefined, name: undefined,
@@ -86,7 +86,7 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<HostIdentityUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<HostIdentityUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -108,11 +108,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -127,17 +123,17 @@
return false; return false;
} }
if (isAddHandle.value) { if (isAddHandle.value) {
if (!formModel.password && !formModel.keyId) { if (!formModel.value.password && !formModel.value.keyId) {
Message.error('创建时密码和秘钥不能同时为空'); Message.error('创建时密码和秘钥不能同时为空');
return false; return false;
} }
// 新增 // 新增
await createHostIdentity(formModel); await createHostIdentity(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateHostIdentity(formModel); await updateHostIdentity(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -7,7 +7,10 @@
@reset="fetchTableData"> @reset="fetchTableData">
<!-- id --> <!-- id -->
<a-form-item field="id" label="id" label-col-flex="50px"> <a-form-item field="id" label="id" label-col-flex="50px">
<a-input-number v-model="formModel.id" placeholder="请输入id" allow-clear /> <a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item> </a-form-item>
<!-- 名称 --> <!-- 名称 -->
<a-form-item field="name" label="名称" label-col-flex="50px"> <a-form-item field="name" label="名称" label-col-flex="50px">
@@ -53,7 +56,7 @@
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
@@ -138,7 +141,7 @@
const emits = defineEmits(['openAdd', 'openUpdate', 'openKeyView']); const emits = defineEmits(['openAdd', 'openUpdate', 'openKeyView']);
const cacheStore = useCacheStore(); const cacheStore = useCacheStore();
const pagination = reactive(defaultPagination()); const pagination = reactive(defaultPagination()) as PaginationProps;
const formModel = reactive<HostIdentityQueryRequest>({ const formModel = reactive<HostIdentityQueryRequest>({
id: undefined, id: undefined,
@@ -148,7 +151,9 @@
}); });
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口

View File

@@ -88,14 +88,12 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
import { createHostKey, updateHostKey, getHostKey, HostKeyUpdateRequest } from '@/api/asset/host-key'; import { createHostKey, updateHostKey, getHostKey, HostKeyUpdateRequest } from '@/api/asset/host-key';
import { FileItem, Message } from '@arco-design/web-vue'; import { FileItem, Message } from '@arco-design/web-vue';
import {} from '../types/enum.types';
import {} from '../types/const';
import { readFileText } from '@/utils/file'; import { readFileText } from '@/utils/file';
const { visible, setVisible } = useVisible(); const { visible, setVisible } = useVisible();
@@ -105,7 +103,7 @@
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const isViewHandler = ref<boolean>(false); const isViewHandler = ref<boolean>(false);
const defaultForm = (): HostKeyUpdateRequest & Record<string, any> => { const defaultForm = (): HostKeyUpdateRequest => {
return { return {
id: undefined, id: undefined,
name: undefined, name: undefined,
@@ -117,7 +115,7 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<HostKeyUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<HostKeyUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -162,26 +160,20 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate, openView }); defineExpose({ openAdd, openUpdate, openView });
// 选择公钥文件 // 选择公钥文件
const selectPublicFile = async (fileList: FileItem[]) => { const selectPublicFile = async (fileList: FileItem[]) => {
// FIXME formModel.value.publicKey = await readFileText(fileList[0].file as File);
formModel.publicKey = await readFileText(fileList[0].file as File);
formRef.value.clearValidate('publicKey'); formRef.value.clearValidate('publicKey');
}; };
// 选择私钥文件 // 选择私钥文件
const selectPrivateFile = async (fileList: FileItem[]) => { const selectPrivateFile = async (fileList: FileItem[]) => {
// FIXME formModel.value.privateKey = await readFileText(fileList[0].file as File);
formModel.privateKey = await readFileText(fileList[0].file as File);
formRef.value.clearValidate('privateKey'); formRef.value.clearValidate('privateKey');
}; };
@@ -196,12 +188,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createHostKey(formModel); await createHostKey(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateHostKey(formModel); await updateHostKey(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -7,7 +7,10 @@
@reset="fetchTableData"> @reset="fetchTableData">
<!-- id --> <!-- id -->
<a-form-item field="id" label="id" label-col-flex="30px"> <a-form-item field="id" label="id" label-col-flex="30px">
<a-input-number v-model="formModel.id" placeholder="请输入id" allow-clear /> <a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item> </a-form-item>
<!-- 名称 --> <!-- 名称 -->
<a-form-item field="name" label="名称" label-col-flex="30px"> <a-form-item field="name" label="名称" label-col-flex="30px">
@@ -45,7 +48,7 @@
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
@@ -102,7 +105,7 @@
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const emits = defineEmits(['openAdd', 'openUpdate', 'openView']); const emits = defineEmits(['openAdd', 'openUpdate', 'openView']);
const pagination = reactive(defaultPagination()); const pagination = reactive(defaultPagination()) as PaginationProps;
const formModel = reactive<HostKeyQueryRequest>({ const formModel = reactive<HostKeyQueryRequest>({
id: undefined, id: undefined,
@@ -112,7 +115,9 @@
}); });
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口

View File

@@ -36,7 +36,9 @@
label="SSH端口" label="SSH端口"
:hide-asterisk="true" :hide-asterisk="true"
label-col-flex="60px"> label-col-flex="60px">
<a-input-number v-model="formModel.port" placeholder="请输入SSH端口" /> <a-input-number v-model="formModel.port"
placeholder="请输入SSH端口"
hide-button />
</a-form-item> </a-form-item>
<!-- 验证方式 --> <!-- 验证方式 -->
<a-form-item field="authType" <a-form-item field="authType"
@@ -54,7 +56,6 @@
label="主机密码" label="主机密码"
:rules="passwordRules" :rules="passwordRules"
label-col-flex="60px"> label-col-flex="60px">
<!-- FIXME -->
<a-input-password v-model="formModel.password" <a-input-password v-model="formModel.password"
:disabled="!formModel.useNewPassword && formModel.hasPassword" :disabled="!formModel.useNewPassword && formModel.hasPassword"
placeholder="主机密码" /> placeholder="主机密码" />
@@ -87,7 +88,9 @@
label="连接超时时间" label="连接超时时间"
:hide-asterisk="true" :hide-asterisk="true"
label-col-flex="86px"> label-col-flex="86px">
<a-input-number v-model="formModel.connectTimeout" placeholder="请输入连接超时时间"> <a-input-number v-model="formModel.connectTimeout"
placeholder="请输入连接超时时间"
hide-button>
<template #suffix> <template #suffix>
ms ms
</template> </template>
@@ -125,6 +128,10 @@
</a-space> </a-space>
</div> </div>
</a-spin> </a-spin>
<!-- FIXME -->
{{ formModel }}
<br><br>
{{ content }}
</a-card> </a-card>
</template> </template>
@@ -159,7 +166,7 @@
}); });
const formRef = ref(); const formRef = ref();
const formModel = reactive<HostSshConfig & Record<string, any>>({ const formModel = reactive<HostSshConfig>({
username: undefined, username: undefined,
port: undefined, port: undefined,
password: undefined, password: undefined,
@@ -178,7 +185,8 @@
watch(() => props.content, (v: any) => { watch(() => props.content, (v: any) => {
config.value.status = v?.status; config.value.status = v?.status;
config.value.version = v?.version; config.value.version = v?.version;
resetConfig(); // FIXME
resetConfig(v.config);
}); });
// 用户名验证 // 用户名验证
@@ -228,7 +236,9 @@
// 重置配置 // 重置配置
const resetConfig = () => { const resetConfig = () => {
// FIXME
Object.keys(formModel).forEach(k => { Object.keys(formModel).forEach(k => {
console.log(k, props.content?.config?.hasOwnProperty(k));
if (props.content?.config?.hasOwnProperty(k)) { if (props.content?.config?.hasOwnProperty(k)) {
formModel[k] = props.content?.config[k]; formModel[k] = props.content?.config[k];
} }

View File

@@ -52,7 +52,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -66,7 +66,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): HostUpdateRequest & Record<string, any> => { const defaultForm = (): HostUpdateRequest => {
return { return {
id: undefined, id: undefined,
name: undefined, name: undefined,
@@ -77,7 +77,7 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<HostUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<HostUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -100,11 +100,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -120,12 +116,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createHost(formModel); await createHost(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateHost(formModel); await updateHost(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -7,7 +7,10 @@
@reset="fetchTableData"> @reset="fetchTableData">
<!-- id --> <!-- id -->
<a-form-item field="id" label="主机id" label-col-flex="50px"> <a-form-item field="id" label="主机id" label-col-flex="50px">
<a-input-number v-model="formModel.id" placeholder="请输入主机id" allow-clear /> <a-input-number v-model="formModel.id"
placeholder="请输入主机id"
allow-clear
hide-button />
</a-form-item> </a-form-item>
<!-- 主机名称 --> <!-- 主机名称 -->
<a-form-item field="name" label="主机名称" label-col-flex="50px"> <a-form-item field="name" label="主机名称" label-col-flex="50px">
@@ -74,7 +77,7 @@
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
@@ -174,10 +177,11 @@
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const emits = defineEmits(['openAdd', 'openUpdate', 'openUpdateConfig']); const emits = defineEmits(['openAdd', 'openUpdate', 'openUpdateConfig']);
const pagination = reactive<PaginationProps>(defaultPagination());
const { copy } = useCopy(); const { copy } = useCopy();
const { toggle: toggleFavorite } = useFavorite('HOST'); const { toggle: toggleFavorite } = useFavorite('HOST');
const pagination = reactive(defaultPagination()) as PaginationProps;
const formModel = reactive<HostQueryRequest>({ const formModel = reactive<HostQueryRequest>({
id: undefined, id: undefined,
name: undefined, name: undefined,
@@ -189,7 +193,9 @@
}); });
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口

View File

@@ -16,6 +16,14 @@ export const AuthTypeEnum = {
}, },
}; };
/**
* 主机所有配置
*/
// fixme
export interface HostConfigWrapper {
SSH: HostSshConfig | unknown;
}
/** /**
* 主机 SSH 配置 * 主机 SSH 配置
*/ */

View File

@@ -80,7 +80,7 @@
const type = ref('text'); const type = ref('text');
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const renderList = ref<TableData[]>(); const renderList = ref<TableData[]>([]);
const fetchData = async (contentType: string) => { const fetchData = async (contentType: string) => {
try { try {
setLoading(true); setLoading(true);

View File

@@ -77,7 +77,8 @@
<a-input-number v-model="formModel.sort" <a-input-number v-model="formModel.sort"
placeholder="排序" placeholder="排序"
:style="{ width: '120px' }" :style="{ width: '120px' }"
allow-clear /> allow-clear
hide-button />
</a-form-item> </a-form-item>
<!-- 是否可见 --> <!-- 是否可见 -->
<a-form-item v-if="formModel.type !== MenuTypeEnum.FUNCTION.value" <a-form-item v-if="formModel.type !== MenuTypeEnum.FUNCTION.value"
@@ -135,7 +136,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): MenuUpdateRequest & Record<string, any> => { const defaultForm = (): MenuUpdateRequest => {
return { return {
id: undefined, id: undefined,
parentId: 0, parentId: 0,
@@ -152,14 +153,14 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<MenuUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<MenuUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
// 选择根目录 parentId就是 0 // 选择根目录 parentId就是 0
watch(() => formModel.type, () => { watch(() => formModel.value.type, () => {
if (formModel.type === MenuTypeEnum.PARENT_MENU.value) { if (formModel.value.type === MenuTypeEnum.PARENT_MENU.value) {
formModel.parentId = 0; formModel.value.parentId = 0;
} }
}); });
@@ -170,7 +171,7 @@
renderForm({ ...defaultForm(), parentId: record.parentId, sort: (record.sort || 0) + sortStep }); renderForm({ ...defaultForm(), parentId: record.parentId, sort: (record.sort || 0) + sortStep });
// 如果是父菜单默认选中子菜单 如果是子菜单默认选中功能 // 如果是父菜单默认选中子菜单 如果是子菜单默认选中功能
if (record.type === 1 || record.type === 2) { if (record.type === 1 || record.type === 2) {
formModel.type = record.type + 1; formModel.value.type = record.type + 1;
} }
setVisible(true); setVisible(true);
}; };
@@ -185,11 +186,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -203,19 +200,19 @@
if (error) { if (error) {
return false; return false;
} }
if (formModel.parentId === 0 if (formModel.value.parentId === 0
&& (formModel.type === MenuTypeEnum.SUB_MENU.value || formModel.type === MenuTypeEnum.FUNCTION.value)) { && (formModel.value.type === MenuTypeEnum.SUB_MENU.value || formModel.value.type === MenuTypeEnum.FUNCTION.value)) {
Message.error('创建子目录或功能时 父菜单不能为根目录'); Message.error('创建子目录或功能时 父菜单不能为根目录');
return false; return false;
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createMenu(formModel); await createMenu(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateMenu(formModel); await updateMenu(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -40,7 +40,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -53,7 +53,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): RoleUpdateRequest & Record<string, any> => { const defaultForm = (): RoleUpdateRequest => {
return { return {
id: undefined, id: undefined,
name: undefined, name: undefined,
@@ -62,7 +62,7 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<RoleUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<RoleUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -84,11 +84,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -104,12 +100,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createRole(formModel); await createRole(formModel.value);
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateRole(formModel); await updateRole(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -43,28 +43,25 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import MenuSelectorTree from '@/components/menu/selector/menu-selector-tree.vue'; import { ref } from 'vue';
import { reactive, ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import { getRoleMenuId, grantRoleMenu, RoleGrantMenuRequest } from '@/api/user/role'; import { getRoleMenuId, grantRoleMenu, RoleGrantMenuRequest, RoleQueryResponse } from '@/api/user/role';
import { Message } from '@arco-design/web-vue'; import { Message } from '@arco-design/web-vue';
import { useCacheStore } from '@/store'; import { useCacheStore } from '@/store';
import { getMenuList } from '@/api/system/menu'; import { getMenuList } from '@/api/system/menu';
import MenuSelectorTree from '@/components/menu/selector/menu-selector-tree.vue';
const { visible, setVisible } = useVisible(); const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const tree = ref(); const tree = ref();
const roleRecord = reactive<Record<string, any>>({ const roleRecord = ref<RoleQueryResponse>({});
id: undefined,
name: undefined,
code: undefined,
});
// 打开新增 // 打开新增
const open = async (record: any) => { const open = async (record: any) => {
// fixme 改成 props
renderRecord(record); renderRecord(record);
setVisible(true); setVisible(true);
try { try {
@@ -87,11 +84,7 @@
// 渲染对象 // 渲染对象
const renderRecord = (record: any) => { const renderRecord = (record: any) => {
Object.keys(roleRecord).forEach(k => { roleRecord.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
roleRecord[k] = record[k];
}
});
}; };
defineExpose({ open }); defineExpose({ open });
@@ -102,7 +95,7 @@
try { try {
// 修改 // 修改
await grantRoleMenu({ await grantRoleMenu({
roleId: roleRecord.id, roleId: roleRecord.value.id,
menuIdList: [...tree.value.getValue()] menuIdList: [...tree.value.getValue()]
} as RoleGrantMenuRequest); } as RoleGrantMenuRequest);
Message.success('分配成功'); Message.success('分配成功');

View File

@@ -52,7 +52,7 @@
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
@@ -62,11 +62,10 @@
</template> </template>
<!-- 状态 --> <!-- 状态 -->
<template #status="{ record }"> <template #status="{ record }">
<!-- FIXME --> <span class="circle" :style="{
<span class="circle"></span> background: getEnumValue(record.status, RoleStatusEnum,'color')
<a-tag :color="getEnumValue(record.status, RoleStatusEnum,'color')"> }" />
{{ getEnumValue(record.status, RoleStatusEnum) }} {{ getEnumValue(record.status, RoleStatusEnum) }}
</a-tag>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #handle="{ record }"> <template #handle="{ record }">
@@ -138,9 +137,9 @@
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const emits = defineEmits(['openAdd', 'openUpdate', 'openGrant']); const emits = defineEmits(['openAdd', 'openUpdate', 'openGrant']);
const pagination = reactive(defaultPagination()); const pagination = reactive(defaultPagination()) as PaginationProps;
const formModel = reactive<RoleQueryRequest>({ const formModel = ref<RoleQueryRequest>({
id: undefined, id: undefined,
name: undefined, name: undefined,
code: undefined, code: undefined,
@@ -164,7 +163,9 @@
}; };
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口

View File

@@ -54,7 +54,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue'; import { ref } from 'vue';
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/form.rules'; import formRules from '../types/form.rules';
@@ -68,7 +68,7 @@
const title = ref<string>(); const title = ref<string>();
const isAddHandle = ref<boolean>(true); const isAddHandle = ref<boolean>(true);
const defaultForm = (): UserUpdateRequest & Record<string, any> => { const defaultForm = (): UserUpdateRequest => {
return { return {
id: undefined, id: undefined,
username: undefined, username: undefined,
@@ -80,7 +80,7 @@
}; };
const formRef = ref(); const formRef = ref();
const formModel = reactive<UserUpdateRequest & Record<string, any>>(defaultForm()); const formModel = ref<UserUpdateRequest>({});
const emits = defineEmits(['added', 'updated']); const emits = defineEmits(['added', 'updated']);
@@ -102,11 +102,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => { formModel.value = Object.assign({}, record);
if (record.hasOwnProperty(k)) {
formModel[k] = record[k];
}
});
}; };
defineExpose({ openAdd, openUpdate }); defineExpose({ openAdd, openUpdate });
@@ -122,12 +118,12 @@
} }
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createUser({ ...formModel, password: md5(formModel.password) }); await createUser({ ...formModel, password: md5(formModel.value.password as string) });
Message.success('创建成功'); Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateUser(formModel); await updateUser(formModel.value);
Message.success('修改成功'); Message.success('修改成功');
emits('updated'); emits('updated');
} }

View File

@@ -68,6 +68,7 @@
}; };
const formRef = ref(); const formRef = ref();
// fixme
const formModel = reactive<Record<string, any>>(defaultForm()); const formModel = reactive<Record<string, any>>(defaultForm());
const cacheStore = useCacheStore(); const cacheStore = useCacheStore();
@@ -80,6 +81,7 @@
// 渲染表单 // 渲染表单
const renderForm = (record: any) => { const renderForm = (record: any) => {
// fixme
Object.keys(formModel).forEach(k => { Object.keys(formModel).forEach(k => {
if (record.hasOwnProperty(k)) { if (record.hasOwnProperty(k)) {
formModel[k] = record[k]; formModel[k] = record[k];

View File

@@ -7,7 +7,10 @@
@reset="fetchTableData"> @reset="fetchTableData">
<!-- id --> <!-- id -->
<a-form-item field="id" label="id" label-col-flex="50px"> <a-form-item field="id" label="id" label-col-flex="50px">
<a-input-number v-model="formModel.id" placeholder="请输入id" allow-clear /> <a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item> </a-form-item>
<!-- 用户名 --> <!-- 用户名 -->
<a-form-item field="username" label="用户名" label-col-flex="50px"> <a-form-item field="username" label="用户名" label-col-flex="50px">
@@ -66,16 +69,16 @@
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="tableRenderData" :data="tableRenderData"
:pagination="pagination as PaginationProps" :pagination="pagination"
@page-change="(page) => fetchTableData(page, pagination.pageSize)" @page-change="(page) => fetchTableData(page, pagination.pageSize)"
@page-size-change="(size) => fetchTableData(pagination.current, size)" @page-size-change="(size) => fetchTableData(pagination.current, size)"
:bordered="false"> :bordered="false">
<!-- 状态 --> <!-- 状态 -->
<template #status="{ record }"> <template #status="{ record }">
<!-- FIXME --> <span class="circle" :style="{
<a-tag :color="getEnumValue(record.status, UserStatusEnum,'color')"> background: getEnumValue(record.status, UserStatusEnum,'color')
{{ getEnumValue(record.status, UserStatusEnum) }} }" />
</a-tag> {{ getEnumValue(record.status, UserStatusEnum) }}
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #handle="{ record }"> <template #handle="{ record }">
@@ -159,9 +162,9 @@
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
const emits = defineEmits(['openAdd', 'openUpdate', 'openResetPassword', 'openGrantRole']); const emits = defineEmits(['openAdd', 'openUpdate', 'openResetPassword', 'openGrantRole']);
const pagination = reactive(defaultPagination()); const pagination = reactive(defaultPagination()) as PaginationProps;
const formModel = reactive<UserQueryRequest>({ const formModel = ref<UserQueryRequest>({
id: undefined, id: undefined,
username: undefined, username: undefined,
password: undefined, password: undefined,
@@ -176,7 +179,9 @@
const userStore = useUserStore(); const userStore = useUserStore();
// 删除当前行 // 删除当前行
const deleteRow = async ({ id }: { id: number }) => { const deleteRow = async ({ id }: {
id: number
}) => {
try { try {
setLoading(true); setLoading(true);
// 调用删除接口 // 调用删除接口