修复提交

This commit is contained in:
tianmo committed 2026-09-30 17:24:50 +08:00
1 parent d8786eb28a
commit 5fe7f5d476
4 files changed
+68 -13

No files matched your search

-1
View File
@@ -4,7 +4,6 @@
<!-- 信息广播:文案取自站点配置 home.broadcast,空则整条不显示。
文字放得下就静态居中,放不下就横向滚动(避免长通知被截断看不到)。 -->
<view class="broadcast" wx:if="{{broadcast}}">
<text class="broadcast-icon">📢</text>
<view class="broadcast-body">
<view class="broadcast-track {{broadcastScroll ? 'broadcast-scroll' : ''}}" style="color: {{broadcastColor}}">
<text class="broadcast-text">{{broadcast}}</text>
+4 -10
View File
@@ -163,13 +163,6 @@ page {
border-radius: 12rpx;
}
.broadcast-icon {
flex: none;
margin-right: 12rpx;
font-size: 28rpx;
line-height: 1;
}
.broadcast-body {
flex: 1;
min-width: 0;
@@ -194,9 +187,10 @@ page {
animation: broadcast-marquee 18s linear infinite;
}
/* 两段文字各带一个等宽右边距,整条宽度 = 2 ×(文字+间距),
所以左移 50% 正好是一段,循环无缝 */
.broadcast-text {
/* 滚动时两段文字各带一个等宽右边距,整条宽度 = 2 ×(文字+间距),
左移 50% 正好是一段,循环无缝。
这个边距**只能在滚动时加**:静态居中时它会算进居中范围,把文字整体推偏。 */
.broadcast-scroll .broadcast-text {
margin-right: 80rpx;
}
@@ -0,0 +1,41 @@
import { describe, expect, it } from 'vitest';
import { RESOURCES } from './resource-registry';
/**
* 日期字段的转换护栏。
*
* 起因:后台加「首页新课」填发布日期,报 PrismaClientValidationError——
* 表单传的是 'YYYY-MM-DD',而 Prisma 的 DateTime 要完整时间,原样透传就被拒。
*/
describe('资源注册表的日期字段', () => {
const schema = RESOURCES['home-courses']!.create;
it('纯日期串会转成 Date(UTC 零点),不再原样透传给 Prisma', () => {
const parsed = schema.parse({ course_name: 'x', published_at: '2026-09-30' });
expect(parsed.published_at).toBeInstanceOf(Date);
expect((parsed.published_at as Date).toISOString()).toBe('2026-09-30T00:00:00.000Z');
});
it('转出来的日期能原样回填,不会串一天', () => {
const parsed = schema.parse({ course_name: 'x', published_at: '2026-09-30' });
// 后台显示/回填用的是 ISO 串前 10 位
expect((parsed.published_at as Date).toISOString().slice(0, 10)).toBe('2026-09-30');
});
it('完整时间串照样接受', () => {
const parsed = schema.parse({ course_name: 'x', published_at: '2026-09-30T12:34:56.000Z' });
expect((parsed.published_at as Date).toISOString()).toBe('2026-09-30T12:34:56.000Z');
});
it('空值按「不填」处理,不报错', () => {
expect(schema.parse({ course_name: 'x', published_at: '' }).published_at).toBeNull();
expect(schema.parse({ course_name: 'x', published_at: null }).published_at).toBeNull();
expect(schema.parse({ course_name: 'x' }).published_at).toBeUndefined();
});
it('乱填会被挡下,并给出可读的原因', () => {
const result = schema.safeParse({ course_name: 'x', published_at: '九月三十号' });
expect(result.success).toBe(false);
expect(JSON.stringify(result.error?.issues)).toContain('日期格式不正确');
});
});
@@ -9,7 +9,29 @@ import { z } from 'zod';
* 一个通用控制器 + 这张表覆盖了管理后台的绝大部分内容管理功能。
*/
const dateish = z.union([z.string(), z.date(), z.null()]);
/**
* 日期字段。后台表单传的是 'YYYY-MM-DD' 纯日期串,而 Prisma 的 DateTime 需要完整时间,
* 原样透传会抛 PrismaClientValidationError(首页新课加日期就报过这个)。
*
* 补成 **UTC 零点**,是为了跟后台的显示/回填对齐:那边是拿 ISO 串切前 10 位,
* 若按北京时间补,就会出现「显示 09-30 → 保存 → 回填成 09-29」串一天。
*/
const dateish = z
.union([z.string(), z.date(), z.null()])
.transform((value, ctx) => {
if (value === null) return null;
if (value instanceof Date) return value;
const text = value.trim();
if (!text) return null;
const parsed = new Date(/^\d{4}-\d{2}-\d{2}$/.test(text) ? `${text}T00:00:00.000Z` : text);
if (Number.isNaN(parsed.getTime())) {
ctx.addIssue({ code: z.ZodIssueCode.custom, message: `日期格式不正确:${value}` });
return z.NEVER;
}
return parsed;
});
const optionalDate = dateish.optional();
export interface ResourceDef {
@@ -136,4 +158,3 @@ export const RESOURCES: Record<string, ResourceDef> = {
export const READONLY_RESOURCES: Record<string, { delegate: string; orderBy: Record<string, 'asc' | 'desc'>[] }> = {
'free-lessons': { delegate: 'freeLesson', orderBy: [{ series_no: 'asc' }, { sort_order: 'asc' }] },
};