diff --git a/apps/server/src/models/post/post.service.ts b/apps/server/src/models/post/post.service.ts index 089f686..5333d27 100755 --- a/apps/server/src/models/post/post.service.ts +++ b/apps/server/src/models/post/post.service.ts @@ -26,7 +26,6 @@ export class PostService extends BaseService { } onModuleInit() { EventBus.on('updatePostState', ({ id }) => { - console.log('updatePostState'); updatePostState(id); }); } @@ -34,7 +33,6 @@ export class PostService extends BaseService { args: Prisma.PostCreateArgs, params: { staff?: UserProfile; tx?: Prisma.PostDelegate }, ) { - console.log('params?.staff?.id', params?.staff?.id); args.data.authorId = params?.staff?.id; args.data.updatedAt = new Date(); // args.data.resources diff --git a/apps/server/src/models/visit/visit.service.ts b/apps/server/src/models/visit/visit.service.ts index 6e0fb44..886b3f5 100644 --- a/apps/server/src/models/visit/visit.service.ts +++ b/apps/server/src/models/visit/visit.service.ts @@ -10,7 +10,6 @@ export class VisitService extends BaseService { async create(args: Prisma.VisitCreateArgs, staff?: UserProfile) { const { postId, messageId } = args.data; const clientIp = (args.data.meta as any)?.ip; - console.log('visit create'); const visitorId = args.data.visitorId || staff?.id; let result; const existingVisit = await db.visit.findFirst({ diff --git a/apps/server/src/queue/models/post/post.queue.service.ts b/apps/server/src/queue/models/post/post.queue.service.ts index 5f38856..f7370df 100644 --- a/apps/server/src/queue/models/post/post.queue.service.ts +++ b/apps/server/src/queue/models/post/post.queue.service.ts @@ -15,13 +15,11 @@ export class PostQueueService implements OnModuleInit { constructor(@InjectQueue('general') private generalQueue: Queue) {} onModuleInit() { EventBus.on('updateVisitCount', ({ id, objectType, visitType }) => { - console.log('updateVisitCount'); if (objectType === ObjectType.POST) { this.addUpdateVisitCountJob({ id, type: visitType }); } }); EventBus.on('updatePostState', ({ id }) => { - console.log('updatePostState'); this.addUpdatePostState({ id }); }); } diff --git a/apps/server/src/upload/tus.service.ts b/apps/server/src/upload/tus.service.ts index ba80b1c..c9c26b7 100644 --- a/apps/server/src/upload/tus.service.ts +++ b/apps/server/src/upload/tus.service.ts @@ -88,7 +88,6 @@ export class TusService implements OnModuleInit { upload: Upload, ) { try { - console.log('upload.id', upload.id); const resource = await this.resourceService.update({ where: { fileId: this.getFileId(upload.id) }, data: { status: ResourceStatus.UPLOADED }, diff --git a/apps/web/src/app/auth/register.tsx b/apps/web/src/app/auth/register.tsx index bfbfeca..184109c 100644 --- a/apps/web/src/app/auth/register.tsx +++ b/apps/web/src/app/auth/register.tsx @@ -43,6 +43,11 @@ export const RegisterForm = ({ onSubmit, isLoading }: RegisterFormProps) => { { + if (url) { + console.log(url); + } + }} style={{ width: `100%`, height: 210, @@ -123,7 +128,7 @@ export const RegisterForm = ({ onSubmit, isLoading }: RegisterFormProps) => { { noStyle rules={[ { message: "请输入证件号" }, - { - pattern: /^\d{5,12}$/, - message: "请输入有效的证件号(5-12位数字)", - }, + // { + // pattern: /^\d{5,12}$/, + // message: "请输入有效的证件号(5-12位数字)", + // }, ]}> diff --git a/apps/web/src/app/main/letter/detail/page.tsx b/apps/web/src/app/main/letter/detail/page.tsx index 0184d03..269bf35 100644 --- a/apps/web/src/app/main/letter/detail/page.tsx +++ b/apps/web/src/app/main/letter/detail/page.tsx @@ -1,11 +1,16 @@ import PostDetail from "@web/src/components/models/post/detail/PostDetail"; +import { useEffect } from "react"; import { useParams } from "react-router-dom"; export default function LetterDetailPage() { const { id } = useParams(); + useEffect(() => { + window.scrollTo(0, 0); + }, []); - return
- - -
; + return ( +
+ +
+ ); } diff --git a/apps/web/src/components/common/editor/quill/constants.ts b/apps/web/src/components/common/editor/quill/constants.ts index af68aca..d6d8283 100644 --- a/apps/web/src/components/common/editor/quill/constants.ts +++ b/apps/web/src/components/common/editor/quill/constants.ts @@ -10,3 +10,16 @@ export const defaultModules = { ["clean"], ], }; + +// 如果需要自定义 tooltip +const customTooltip = { + header: { + 1: "标题 1", + 2: "标题 2", + 3: "标题 3", + 4: "标题 4", + 5: "标题 5", + 6: "标题 6", + false: "正文", + }, +}; diff --git a/apps/web/src/components/common/uploader/AvatarUploader.tsx b/apps/web/src/components/common/uploader/AvatarUploader.tsx index 182314f..67e8bb1 100644 --- a/apps/web/src/components/common/uploader/AvatarUploader.tsx +++ b/apps/web/src/components/common/uploader/AvatarUploader.tsx @@ -36,6 +36,8 @@ const AvatarUploader: React.FC = ({ const [file, setFile] = useState(null); const avatarRef = useRef(null); const [previewUrl, setPreviewUrl] = useState(value || ""); + + const [compressedUrl, setCompressedUrl] = useState(value || ""); const [url, setUrl] = useState(value || ""); const [uploading, setUploading] = useState(false); const inputRef = useRef(null); @@ -46,7 +48,9 @@ const AvatarUploader: React.FC = ({ const handleChange = async (event: React.ChangeEvent) => { const selectedFile = event.target.files?.[0]; if (!selectedFile) return; - + // Create an object URL for the selected file + const objectUrl = URL.createObjectURL(selectedFile); + setPreviewUrl(objectUrl); setFile({ name: selectedFile.name, progress: 0, @@ -70,7 +74,7 @@ const AvatarUploader: React.FC = ({ })); setUrl(result.url); - setPreviewUrl(result.compressedUrl); + setCompressedUrl(result.compressedUrl); // 直接使用 result 中的最新值 resolve(compressed ? result.compressedUrl : result.url); }, @@ -80,6 +84,9 @@ const AvatarUploader: React.FC = ({ file?.fileKey ); }); + // await new Promise((resolve) => setTimeout(resolve,4999)); // 方法1:使用 await 暂停执行 + // 使用 resolved 的最新值调用 onChange + // 强制刷新 Avatar 组件 setAvatarKey((prev) => prev + 1); // 修改 key 强制重新挂载 onChange?.(uploadedUrl); console.log(uploadedUrl) diff --git a/apps/web/src/components/layout/element/usermenu/user-form.tsx b/apps/web/src/components/layout/element/usermenu/user-form.tsx index 6f8ade0..cbd86c8 100644 --- a/apps/web/src/components/layout/element/usermenu/user-form.tsx +++ b/apps/web/src/components/layout/element/usermenu/user-form.tsx @@ -47,7 +47,6 @@ export default function StaffForm() { rank, office, } = values; - console.log("photoUrl", photoUrl); setFormLoading(true); try { if (data && user?.id) { @@ -185,13 +184,13 @@ export default function StaffForm() { /> { - console.log("ids", value); setFileIds(value); }} /> diff --git a/apps/web/src/components/models/post/editor/context/LetterEditorContext.tsx b/apps/web/src/components/models/post/editor/context/LetterEditorContext.tsx index e0ae398..0e97dfc 100644 --- a/apps/web/src/components/models/post/editor/context/LetterEditorContext.tsx +++ b/apps/web/src/components/models/post/editor/context/LetterEditorContext.tsx @@ -45,6 +45,7 @@ export function LetterFormProvider({ const onSubmit = async (data: LetterFormData) => { try { + console.log(data); const receivers = data?.receivers; const terms = data?.terms; delete data.receivers; @@ -78,14 +79,14 @@ export function LetterFormProvider({ : undefined, }, }); - const formattedDateTime = dayjs().format('YYYY-MM-DD HH:mm:ss') + const formattedDateTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); // 创建包含信件编号和提交时间的文本 const fileContent = `信件编号: ${result.id}\n投递时间: ${formattedDateTime}`; // 创建包含信件编号和提交时间的Blob对象 - const blob = new Blob([fileContent], { type: 'text/plain' }); + const blob = new Blob([fileContent], { type: "text/plain" }); // 创建下载链接 const downloadUrl = window.URL.createObjectURL(blob); - const link = document.createElement('a'); + const link = document.createElement("a"); link.href = downloadUrl; link.download = `信件编号-${result.id}.txt`; // 设置下载文件名 document.body.appendChild(link); @@ -93,10 +94,16 @@ export function LetterFormProvider({ document.body.removeChild(link); window.URL.revokeObjectURL(downloadUrl); - toast.success(`信件投递成功!信件编号已保存到本地,请妥善保管用于进度查询`, { - duration: 5000 // 10秒 - }); - navigate(`/${result.id}/detail`, { replace: true }); + toast.success( + `信件投递成功!信件编号已保存到本地,请妥善保管用于进度查询`, + { + duration: 5000, // 10秒 + } + ); + // navigate(`/${result.id}/detail`, { + // replace: true, + // state: { scrollToTop: true }, + // }); form.resetFields(); } catch (error) { console.error("Error submitting form:", error); diff --git a/apps/web/src/components/models/post/editor/form/LetterBasicForm.tsx b/apps/web/src/components/models/post/editor/form/LetterBasicForm.tsx index 9dd655f..f9623ba 100644 --- a/apps/web/src/components/models/post/editor/form/LetterBasicForm.tsx +++ b/apps/web/src/components/models/post/editor/form/LetterBasicForm.tsx @@ -6,12 +6,39 @@ import { TusUploader } from "@web/src/components/common/uploader/TusUploader"; import StaffSelect from "../../../staff/staff-select"; import TermSelect from "../../../term/term-select"; import TabPane from "antd/es/tabs/TabPane"; +import toast from "react-hot-toast"; export function LetterBasicForm() { const { onSubmit, receiverId, termId, form } = useLetterEditor(); const handleFinish = async (values: any) => { await onSubmit(values); }; + const handleSubmit = async () => { + try { + await form.validateFields(); + form.submit(); + // toast.success("提交成功!"); + } catch (error) { + // 提取所有错误信息 + const errorMessages = (error as any).errorFields + .map((field) => field.errors[0]) + .filter(Boolean); + + // 显示 toast 错误提示 + toast.error( +
+ 表单校验失败: + {errorMessages.map((msg, i) => ( + · {msg} + ))} +
, + { + duration: 5000, // 显示 5 秒 + position: "top-center", + } + ); + } + }; return (
form.setFieldValue("content", content) } @@ -78,22 +107,30 @@ export function LetterBasicForm() { - -
+
+ { + // console.log(resources); form.setFieldValue( "resources", resources ); + // console.log( + // form.getFieldValue("resources") + // ); }} /> -
- + +
+ {/* */} {/* Footer Actions */} -
+
是否公开 @@ -112,7 +149,7 @@ export function LetterBasicForm() {