Files
iotlcm/server/resource/generate/default/curd/web.edit.vue.template
T
MiFaZhan 2ed5dfa6a1 chore: 初始开源发布
iotlcm-app:小程序端 + 用户端服务。

- app/:uni-app 小程序前端(基于 unibest,MIT)
  - 微信 AppID → YOUR_WX_APPID,uni-app AppID → __UNI__YOURAPPID
  - 内网后端地址 → admin.iotlcm.example.com
  - 应用标题与 unibest 模板 README 重写(保留上游致谢与 MIT 声明)
- server/:GoFrame 用户端服务(基于 XiuAdmin,Apache-2.0)
  - module xiuadmin → git.5iot.com/iotlcm-public/iotlcm-app(360 文件)
  - 支付回调地址 → app.iotlcm.example.com,商户名与应用名泛化
  - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位)
  - 依赖号码尾部的断言同步更新
  - 补 server/LICENSE(Apache-2.0)
- 移除内部资产:CI 触发器
- 补根 README,LF 行尾 + .gitattributes

已知:TestSysDept_RefreshDeptAncestors 在源仓同一提交上同样失败,属既有缺陷。
2026-10-26 14:01:25 +08:00

136 lines
3.5 KiB
Plaintext

<template>
<BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
<BasicForm>
</BasicForm>
</BasicDrawer>
</template>
<script setup lang="ts">
import { computed, nextTick, ref } from 'vue';
import { useVbenDrawer, useVbenModal, VbenButton } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, cloneDeep } from '@vben/utils';
import { useVbenForm } from '#/adapter/form';
import { Alert } from 'ant-design-vue';
import { Edit, View } from '@{.importWebApi}';
import { editSchema@{ if eq .options.Step.IsTreeTable true }, treeOption, loadTreeOption@{end} } from './model';
const emit = defineEmits<{ reload: [] }>();
interface ModalProps {
id?: number | string;
update: boolean;
view: boolean;
}
const isUpdate = ref(false);
const isView = ref(false);
const title = computed(() => {
if (isView.value) {
return $t('pages.common.view');
}
return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
});
const [BasicForm, formApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
formItemClass: 'col-span-@{.script.formGridSpan}',
},
layout: 'vertical',
schema: editSchema,
showDefaultActions: false,
wrapperClass: 'grid-cols-@{.script.formGridSpan} gap-x-4',
});
@{ if eq .isEditModal true }
const [BasicDrawer, drawerApi] = useVbenModal
@{else}
const [BasicDrawer, drawerApi] = useVbenDrawer
@{end}
({
onCancel: handleCancel,
onConfirm: handleConfirm,
async onOpenChange(isOpen) {
if (!isOpen) {
return null;
}
drawerApi.setState({ confirmLoading: true, loading: true })
const { id, update, view, } = drawerApi.getData() as ModalProps;
isUpdate.value = update;
isView.value = view;
@{ if eq .options.Step.IsTreeTable true }
await loadTreeOption();
formApi.updateSchema([
{
componentProps: {
fieldNames: { label: '@{.options.Tree.TitleField.TsName}', value: '@{.pk.TsName}' },
showSearch: true,
treeData: treeOption.value,
treeDefaultExpandAll: true,
treeLine: { showLeafIcon: false },
treeNodeFilterProp: '@{.options.Tree.TitleField.TsName}',
},
fieldName: '@{.options.Tree.PidField.TsName}',
},
]);
@{end}
if (isUpdate.value || isView.value) {
const record = await View({ @{.pk.TsName}: id });
await formApi.setValues(record);
}
drawerApi.setState({ confirmLoading: false, loading: false })
if (view) {
drawerApi.setState({ showConfirmButton: false });
formApi.setState({
commonConfig: {
componentProps: {
readonly: true,
"only-read": true,
}
}
});
} else {
drawerApi.setState({ showConfirmButton: true });
formApi.setState({
commonConfig: {
componentProps: {
readonly: false,
"only-read": false,
}
}
});
}
},
});
async function handleConfirm() {
try {
drawerApi.setState({ confirmLoading: true, loading: true })
const { valid } = await formApi.validate();
if (!valid) {
return;
}
const data = cloneDeep(await formApi.getValues());
await (Edit(data));
emit('reload');
await handleCancel();
} catch (error) {
console.error(error);
} finally {
drawerApi.setState({ confirmLoading: false, loading: false })
}
}
async function handleCancel() {
drawerApi.close();
await formApi.resetForm();
}
</script>