@_tc/template-core 0.2.0-bate.0 → 0.2.0-bate.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.skills/tc-component-usage-skills/reference/template-core-frontend.md +8 -1
- package/.skills/tc-generator/SKILL.md +3 -2
- package/.skills/tc-generator/reference/example.md +1 -1
- package/.skills/tc-generator/reference/model-schema.md +18 -0
- package/.skills/tc-generator/reference/project-template/index.js +1 -1
- package/.skills/tc-generator/reference/runtime-extensions.md +22 -2
- package/AGENT_README.md +35 -14
- package/README.md +238 -33
- package/cjs/app/controller/view.js +1 -1
- package/cjs/app/{extend → extends}/db.js +1 -1
- package/cjs/app/extends/localCacheHtmlEtag.js +1 -0
- package/cjs/app/extends/render-view.js +1 -0
- package/cjs/app/middleware.js +1 -1
- package/cjs/app/view/entry.tpl +0 -16
- package/cjs/bundler/buildFE.js +1 -0
- package/cjs/bundler/index.js +1 -1
- package/cjs/bundler/state.js +1 -1
- package/cjs/bundler/utils.js +3 -3
- package/cjs/packages/common/index.js +1 -1
- package/cjs/packages/common/rafTimer.js +1 -0
- package/cjs/packages/common/string/index.js +1 -1
- package/cjs/packages/core/index.js +1 -1
- package/cjs/packages/core/loader/controller.js +1 -1
- package/cjs/packages/core/loader/extend.js +1 -1
- package/cjs/packages/core/loader/middleware.js +1 -1
- package/cjs/packages/core/loader/router-schema.js +1 -1
- package/cjs/packages/core/loader/router.js +1 -1
- package/cjs/packages/core/loader/service.js +1 -1
- package/cjs/packages/utils/runFileFn.js +1 -1
- package/esm/app/controller/view.js +28 -15
- package/esm/app/{extend → extends}/$fetch.js +1 -1
- package/esm/app/{extend → extends}/crypto.js +1 -1
- package/esm/app/{extend → extends}/db.js +2 -2
- package/esm/app/{extend → extends}/generateErrorMessage.js +1 -1
- package/esm/app/extends/localCacheHtmlEtag.js +41 -0
- package/esm/app/{extend → extends}/logger.js +1 -1
- package/esm/app/{extend → extends}/parsingParamsOnUrl.js +1 -1
- package/esm/app/extends/render-view.js +18 -0
- package/esm/app/middleware.js +8 -12
- package/esm/app/view/entry.tpl +0 -16
- package/esm/bundler/buildFE.js +14 -0
- package/esm/bundler/index.js +2 -14
- package/esm/bundler/state.js +5 -1
- package/esm/bundler/utils.js +130 -104
- package/esm/packages/common/index.js +7 -6
- package/esm/packages/common/rafTimer.js +47 -0
- package/esm/packages/common/string/index.js +11 -2
- package/esm/packages/core/index.js +34 -28
- package/esm/packages/core/loader/controller.js +6 -6
- package/esm/packages/core/loader/extend.js +6 -6
- package/esm/packages/core/loader/middleware.js +6 -6
- package/esm/packages/core/loader/router-schema.js +7 -7
- package/esm/packages/core/loader/router.js +13 -13
- package/esm/packages/core/loader/service.js +6 -6
- package/esm/packages/utils/runFileFn.js +10 -10
- package/fe/frontend/apps/dash/Dashboard.js +6 -4
- package/fe/frontend/apps/dash/dash.entry.js +4 -0
- package/fe/frontend/src/common/generateMenuData.d.ts +4 -1
- package/fe/frontend/src/common/generateMenuData.js +3 -3
- package/fe/frontend/src/common/language.d.ts +12 -1
- package/fe/frontend/src/common/language.js +25 -4
- package/fe/frontend/src/common/rafTimer.d.ts +1 -0
- package/fe/frontend/src/common/rafTimer.js +2 -0
- package/fe/frontend/src/common/request.js +1 -0
- package/fe/frontend/src/common/theme.d.ts +7 -0
- package/fe/frontend/src/common/theme.js +33 -0
- package/fe/frontend/src/components/BasePage/HeaderView.js +2 -2
- package/fe/frontend/src/components/LanguageSwitch/LanguageSwitch.js +22 -6
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.d.ts +3 -2
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.js +6 -29
- package/fe/frontend/src/components/ThemeSwitch/index.d.ts +1 -0
- package/fe/frontend/src/components/ThemeSwitch/index.js +3 -2
- package/fe/frontend/src/components/index.js +2 -2
- package/fe/frontend/src/defaultPages/NotFoundPage/index.js +4 -3
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +14 -9
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +8 -7
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +20 -24
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.d.ts +10 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.js +17 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +5 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.js +8 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +50 -32
- package/fe/frontend/src/defaultPages/SchemaPage/index.css +0 -4
- package/fe/frontend/src/defaultPages/SchemaPage/index.js +5 -3
- package/fe/frontend/src/defaultPages/SlotPage/index.js +6 -3
- package/fe/frontend/src/hooks/useText.d.ts +3 -0
- package/fe/frontend/src/hooks/useText.js +14 -0
- package/fe/frontend/src/index.d.ts +11 -3
- package/fe/frontend/src/index.js +8 -3
- package/fe/frontend/src/language/index.d.ts +0 -2
- package/fe/frontend/src/language/index.js +1 -7
- package/fe/frontend/src/language/resources.d.ts +2 -0
- package/fe/frontend/src/language/resources.js +9 -0
- package/fe/model/types/data/schema.d.ts +24 -2
- package/fe/model/types/index.d.ts +1 -0
- package/fe/packages/common/i18n/default.js +3 -0
- package/fe/packages/common/i18n/en-US.js +5 -2
- package/fe/packages/common/i18n/index.js +13 -0
- package/fe/packages/common/i18n/locales.js +7 -0
- package/fe/packages/common/index.d.ts +1 -0
- package/fe/packages/common/rafTimer.d.ts +7 -0
- package/fe/packages/common/rafTimer.js +168 -0
- package/fe/packages/common/string/index.d.ts +9 -0
- package/fe/packages/react/hooks/index.d.ts +9 -0
- package/fe/packages/react/hooks/index.js +8 -0
- package/fe/packages/react/hooks/useRefState.d.ts +4 -12
- package/fe/packages/react/hooks/useRefState.js +18 -8
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.js +33 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +39 -0
- package/fe/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/fe/packages/react/ui/components/DataTable/index.js +12 -32
- package/fe/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/fe/packages/react/ui/components/Textarea/Textarea.js +1 -1
- package/fe/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/fe/packages/react/ui/components/types/baseType.js +0 -0
- package/model/frontend/src/common/language.d.ts +12 -1
- package/model/frontend/src/hooks/useText.d.ts +3 -0
- package/model/frontend/src/language/index.d.ts +0 -2
- package/model/frontend/src/language/resources.d.ts +2 -0
- package/model/model/types/data/schema.d.ts +24 -2
- package/model/model/types/index.d.ts +1 -0
- package/model/packages/common/index.d.ts +1 -0
- package/model/packages/common/rafTimer.d.ts +7 -0
- package/model/packages/common/string/index.d.ts +9 -0
- package/model/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/model/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/model/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/model/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/package.json +5 -5
- package/types/app/extends/localCacheHtmlEtag.d.ts +10 -0
- package/types/app/{extend → extends}/render-view.d.ts +1 -1
- package/types/app/service/base.d.ts +1 -1
- package/types/app/service/project.d.ts +1 -1
- package/types/app/type.d.ts +2 -1
- package/types/app/typings.d.ts +10 -8
- package/types/bundler/buildFE.d.ts +2 -0
- package/types/bundler/index.d.ts +1 -2
- package/types/bundler/state.d.ts +4 -0
- package/types/bundler/utils.d.ts +5 -0
- package/types/index.d.ts +3 -3
- package/types/packages/common/i18n/default.d.ts +4 -0
- package/types/packages/common/i18n/en-US.d.ts +6 -2
- package/types/packages/common/i18n/index.d.ts +21 -0
- package/types/packages/common/i18n/locales.d.ts +10 -0
- package/types/packages/common/i18n/types.d.ts +40 -0
- package/types/packages/common/index.d.ts +1 -0
- package/types/packages/common/rafTimer.d.ts +44 -0
- package/types/packages/common/string/index.d.ts +16 -0
- package/types/packages/core/loader/extend.d.ts +1 -1
- package/types/packages/core/types.d.ts +4 -0
- package/cjs/app/extend/render-view.js +0 -1
- package/esm/app/extend/render-view.js +0 -25
- /package/cjs/app/{extend → extends}/$fetch.js +0 -0
- /package/cjs/app/{extend → extends}/crypto.js +0 -0
- /package/cjs/app/{extend → extends}/generateErrorMessage.js +0 -0
- /package/cjs/app/{extend → extends}/logger.js +0 -0
- /package/cjs/app/{extend → extends}/parsingParamsOnUrl.js +0 -0
- /package/types/app/{extend → extends}/$fetch.d.ts +0 -0
- /package/types/app/{extend → extends}/crypto.d.ts +0 -0
- /package/types/app/{extend → extends}/db.d.ts +0 -0
- /package/types/app/{extend → extends}/generateErrorMessage.d.ts +0 -0
- /package/types/app/{extend → extends}/logger.d.ts +0 -0
- /package/types/app/{extend → extends}/parsingParamsOnUrl.d.ts +0 -0
|
@@ -19,7 +19,7 @@ Inside this repository, use `@tc/ui-react` for the raw UI workspace package. In
|
|
|
19
19
|
<LanguageSwitch />
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
Default languages are `zh-CN` and `en-US`. Pass `options` to replace the list. `onChange(language)` receives the selected language string. The component calls `i18nStore.getState().setLanguage()`, so it uses the same `tc_language` persistence as the UI i18n runtime.
|
|
22
|
+
Default languages are `zh-CN` and `en-US`. Pass `options` to replace the list. The current UI is a button-triggered dropdown; `option.label` can be a ReactNode and `buttonClassName` customizes the trigger. `onChange(language)` receives the selected language string. The component calls `i18nStore.getState().setLanguage()`, so it uses the same `tc_language` persistence as the UI i18n runtime.
|
|
23
23
|
|
|
24
24
|
Useful props:
|
|
25
25
|
|
|
@@ -31,6 +31,13 @@ interface LanguageSwitchProps {
|
|
|
31
31
|
defaultValue?: LanguageSwitchValue
|
|
32
32
|
options?: Array<{ label: ReactNode; value: LanguageSwitchValue; searchText?: string }>
|
|
33
33
|
onChange?: (language: LanguageSwitchValue) => void
|
|
34
|
+
disabled?: boolean
|
|
35
|
+
loading?: boolean
|
|
36
|
+
placeholder?: string
|
|
37
|
+
clearable?: boolean
|
|
38
|
+
searchable?: boolean
|
|
39
|
+
buttonClassName?: string
|
|
40
|
+
getPopupContainer?: (() => HTMLElement) | 'parent'
|
|
34
41
|
}
|
|
35
42
|
```
|
|
36
43
|
|
|
@@ -28,10 +28,11 @@ Use this skill to generate or update TemplateCore business code.
|
|
|
28
28
|
## TemplateCore Conventions
|
|
29
29
|
|
|
30
30
|
- Start the app with `serverStart({ name, baseDir })` from `@_tc/template-core`.
|
|
31
|
-
- Start the built-in frontend with `await buildFE("dev")` from `@_tc/template-core/bundler` when the user needs the admin UI. The current API returns `Promise<void>`; in dev mode it performs the initial build, then watches the business `frontend/` directory.
|
|
31
|
+
- Start the built-in frontend with `await buildFE("dev")` from `@_tc/template-core/bundler` when the user needs the admin UI. The current API returns `Promise<void>`; in dev mode it performs the initial build, then watches the business `frontend/` directory. Use `buildFE("prod", { output: "run", minifyHtml: true })` when the generated project should emit its own `app/public/dist` templates and compact final `.tpl` output.
|
|
32
|
+
- `buildFE()` writes `FEBuildKey` into the output directory; the server uses it to invalidate local HTML ETag cache after frontend rebuilds.
|
|
32
33
|
- If `buildFE("dev")` is used in a standalone project, include the TemplateCore peer dependencies or use the package manager's peer dependency auto-install behavior.
|
|
33
34
|
- Business code lives under the user's `baseDir`, not inside TemplateCore framework folders.
|
|
34
|
-
- The framework provides `app.extends.db` as a default SQLite-backed KV/SQL helper. Use it for small framework/business settings; override `app/
|
|
35
|
+
- The framework provides `app.extends.db` as a default SQLite-backed KV/SQL helper. Use it for small framework/business settings; override `app/extends/db.js` only when the project needs a custom storage implementation.
|
|
35
36
|
- Backend loaders map filenames to camelCase fields:
|
|
36
37
|
- `app/controller/product.js` -> `app.controller.product`
|
|
37
38
|
- `app/service/user-profile.js` -> `app.service.userProfile`
|
|
@@ -210,6 +210,24 @@ Option meaning:
|
|
|
210
210
|
| `editFormOption` | Edit modal form field. Omit to hide from edit. |
|
|
211
211
|
| `detailPanelOption` | Detail drawer field. Omit to hide from detail. |
|
|
212
212
|
|
|
213
|
+
Table cell render components:
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
cover: {
|
|
217
|
+
type: "string",
|
|
218
|
+
label: "Cover",
|
|
219
|
+
tableOption: {
|
|
220
|
+
renderComponent: "PreviewImage",
|
|
221
|
+
renderComponentProps: {
|
|
222
|
+
width: 48,
|
|
223
|
+
height: 48,
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Built-in `PreviewImage` accepts the current field value as a string or string array. Project-specific table render components are registered in `frontend/extended/SchemaPage/SchemaTable/data.ts` and referenced by `tableOption.renderComponent`.
|
|
230
|
+
|
|
213
231
|
Common form `comType` values:
|
|
214
232
|
|
|
215
233
|
```text
|
|
@@ -74,7 +74,7 @@ module.exports = (app) => {
|
|
|
74
74
|
};
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
If the runtime does not support the built-in SQLite module or the project needs another store, generate `app/
|
|
77
|
+
If the runtime does not support the built-in SQLite module or the project needs another store, generate `app/extends/db.js` or `app/extends/db.ts` and preserve the same method names so existing controllers keep working.
|
|
78
78
|
|
|
79
79
|
## Default Crypto
|
|
80
80
|
|
|
@@ -257,7 +257,7 @@ import { Button, DataTable, TableSearch } from '@_tc/template-core/fe/rc'
|
|
|
257
257
|
|
|
258
258
|
Inside this source repository, use `@tc/ui-react` for the raw UI workspace package. The `@_tc/template-core/fe/rc` path is for published TemplateCore consumers.
|
|
259
259
|
|
|
260
|
-
`LanguageSwitch` updates the shared i18n language and persists through `tc_language
|
|
260
|
+
`LanguageSwitch` is a button-triggered dropdown that updates the shared i18n language and persists through `tc_language`; use `buttonClassName` when the trigger needs custom sizing or styling. `ThemeSwitch` toggles the root `dark` class and persists through `tc_theme`. `AsyncSelect` loads options from a `fetchConfig` endpoint returning `{ label, value, searchText? }[]`.
|
|
261
261
|
|
|
262
262
|
## SchemaForm Extensions
|
|
263
263
|
|
|
@@ -295,6 +295,26 @@ this.success(ctx, [
|
|
|
295
295
|
|
|
296
296
|
For project-specific field types, create `frontend/extended/SchemaForm/data.ts` and default-export a component map keyed by field type.
|
|
297
297
|
|
|
298
|
+
## SchemaTable Render Components
|
|
299
|
+
|
|
300
|
+
Use `tableOption.renderComponent` when a Schema CRUD table column needs a reusable renderer. TemplateCore includes `PreviewImage` for image preview columns:
|
|
301
|
+
|
|
302
|
+
```js
|
|
303
|
+
cover: {
|
|
304
|
+
type: "string",
|
|
305
|
+
label: "Cover",
|
|
306
|
+
tableOption: {
|
|
307
|
+
renderComponent: "PreviewImage",
|
|
308
|
+
renderComponentProps: {
|
|
309
|
+
width: 48,
|
|
310
|
+
height: 48,
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
For project-specific renderers, create `frontend/extended/SchemaPage/SchemaTable/data.ts` and default-export a component map typed as `SchemaTableRenderComponentsMap` from `@_tc/template-core/fe`. Extend `SchemaTableNamespace.RenderComponentPropsMap` from `@_tc/template-core/model` when TypeScript model config should know the renderer props.
|
|
317
|
+
|
|
298
318
|
## SchemaPage CallCom Extensions
|
|
299
319
|
|
|
300
320
|
Use `frontend/extended/SchemaPage/CallCom/data.ts` when model `componentConfig` should open a custom runtime component instead of built-in create/edit/detail components. Custom components can import `schemaEventBus`, `eventsInfo`, and `merge` from `@_tc/template-core/fe` to close panels or refresh Schema tables.
|
package/AGENT_README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TemplateCore AI 助手速读
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这份文档由 TemplateCore 框架提供方维护,面向下游消费方项目中的 AI 助手/代码代理。消费方项目通过 `@_tc/template-core` 使用框架能力;AI 可以通过这份速读文档快速理解包的公开入口、约定用法和边界。它是 `README.md` 的面向 Agent 的精简版,按渐进式披露组织:先用下面的最小信息完成常见任务,只有需要深入时再读末尾的参考文档。
|
|
4
4
|
|
|
5
5
|
## 1. 先看结论
|
|
6
6
|
|
|
@@ -9,8 +9,9 @@ TemplateCore 是一个 TypeScript + Koa + React 的后台框架包。它提供
|
|
|
9
9
|
- Koa 服务启动和约定式后端加载。
|
|
10
10
|
- 内置 Dashboard、Schema CRUD 页面和 React UI 组件库。
|
|
11
11
|
- `model/` 配置驱动的菜单、项目和 CRUD 页面。
|
|
12
|
-
- 前端构建 `buildFE()`
|
|
13
|
-
-
|
|
12
|
+
- 前端构建 `buildFE()` 输出服务端可渲染的 `.entry.tpl`,并写入 `FEBuildKey` 供 HTML ETag 缓存失效使用。
|
|
13
|
+
- 消费方 Node/backend 构建 `buildBE()`。
|
|
14
|
+
- 类型扩展机制,用于扩展 SchemaForm 字段、SchemaTable 单元格渲染组件、CallCom 组件和 Koa app 类型。
|
|
14
15
|
|
|
15
16
|
优先使用公开入口,不要从包内部源码路径导入。下面这些入口以 npm 发布产物为准;源码仓库根 `package.json` 的 `exports` 会在构建发布包时生成到 `dist/package.json`。
|
|
16
17
|
|
|
@@ -18,9 +19,11 @@ TemplateCore 是一个 TypeScript + Koa + React 的后台框架包。它提供
|
|
|
18
19
|
| --- | --- |
|
|
19
20
|
| `@_tc/template-core` | `serverStart`、`baseFn`、Koa/Controller/Service 类型。 |
|
|
20
21
|
| `@_tc/template-core/bundler` | `buildFE()`、`buildBE()`。 |
|
|
21
|
-
| `@_tc/template-core/fe` |
|
|
22
|
+
| `@_tc/template-core/fe` | 前端初始化、动态组件渲染辅助、请求方法、Dashboard/Schema 类型、token 工具、RAF 计时器、共享状态、业务前端组件。 |
|
|
23
|
+
| `@_tc/template-core/fe/main` | 前端初始化入口。 |
|
|
22
24
|
| `@_tc/template-core/fe/common/request` | 请求实例、请求方法和请求类型的显式子路径。 |
|
|
23
25
|
| `@_tc/template-core/fe/rc` | React UI 组件和 SchemaForm 组件。 |
|
|
26
|
+
| `@_tc/template-core/fe/rc/hooks` | React hooks 汇总入口。 |
|
|
24
27
|
| `@_tc/template-core/fe/tailwind_ui.css` | 内置前端/UI 全局样式。 |
|
|
25
28
|
| `@_tc/template-core/model` | `ModelDataType` 等 model 配置类型。 |
|
|
26
29
|
|
|
@@ -104,7 +107,7 @@ app/middleware.(js|ts) -> 全局中间件编排,按 frame -> busines
|
|
|
104
107
|
app/router/**/*.(js|ts) -> Koa router
|
|
105
108
|
app/router-guard.(js|ts) -> 兜底路由守卫
|
|
106
109
|
app/router-schema/**/*.(js|ts) -> app.routerSchema
|
|
107
|
-
app/
|
|
110
|
+
app/extends/*.(js|ts) -> app.extends
|
|
108
111
|
config/config.default.(js|ts) -> app.config
|
|
109
112
|
config/config.{env}.(js|ts) -> app.config
|
|
110
113
|
model/**/*.(js|ts) -> 内置 project service 读取的项目模型配置
|
|
@@ -211,7 +214,7 @@ export default (_app: KoaApp) => {
|
|
|
211
214
|
|
|
212
215
|
- `app.extends.$fetch`:Node 侧 axios 风格 fetch 实例。
|
|
213
216
|
- `app.extends.crypto`:Node 侧加密辅助方法,支持 base64url 编解码、HMAC 签名、签名 payload 和常量时间比较。
|
|
214
|
-
- `app.extends.db`:默认 SQLite 数据存储,可用业务 `app/
|
|
217
|
+
- `app.extends.db`:默认 SQLite 数据存储,可用业务 `app/extends/db.ts` 覆盖。
|
|
215
218
|
|
|
216
219
|
## 4. model 配置
|
|
217
220
|
|
|
@@ -366,13 +369,24 @@ import '@_tc/template-core/fe/tailwind_ui.css'
|
|
|
366
369
|
|
|
367
370
|
```ts
|
|
368
371
|
import {
|
|
372
|
+
addLanguageResources,
|
|
373
|
+
clearRafTimer,
|
|
369
374
|
api,
|
|
375
|
+
clearAuthToken,
|
|
370
376
|
get,
|
|
377
|
+
getAuthToken,
|
|
378
|
+
localKeyMap,
|
|
371
379
|
post,
|
|
380
|
+
renderImportComponent,
|
|
372
381
|
request,
|
|
382
|
+
rafSetInterval,
|
|
383
|
+
rafSetTimeout,
|
|
373
384
|
schemaEventBus,
|
|
374
385
|
schemaStore,
|
|
386
|
+
setAuthToken,
|
|
387
|
+
setLanguage,
|
|
375
388
|
useSchemaStore,
|
|
389
|
+
useText,
|
|
376
390
|
LanguageSwitch,
|
|
377
391
|
ThemeSwitch,
|
|
378
392
|
} from '@_tc/template-core/fe'
|
|
@@ -400,15 +414,19 @@ import { Button, DataTable, Form, Input, Modal, Select } from '@_tc/template-cor
|
|
|
400
414
|
常用前端能力:
|
|
401
415
|
|
|
402
416
|
- 请求方法:`api`、`request`、`get`、`post`、`put`、`patch`、`del`。
|
|
417
|
+
- RAF 风格计时器:`rafSetTimeout`、`rafSetInterval`、`rafClearTimeout`、`rafClearInterval`、`clearRafTimer`,缺少 RAF 时自动降级到 `setTimeout`。
|
|
403
418
|
- 请求类型:`BaseResponse`、`PageParams`、`PageResponse`、`RequestConfig`、`ResponseConfig`、`AxiosError`。
|
|
404
419
|
- 请求 header:自动添加 `s_t`、`s_sign`、`projk`;存在短 token 时添加 `Authorization: Bearer ${token}`。
|
|
420
|
+
- 默认会先设置 `Content-Type: application/json`;如果是上传文件、`FormData` 或其他内容类型,请在请求配置里显式覆盖。
|
|
421
|
+
- Token 工具:`getAuthToken()`、`setAuthToken()`、`clearAuthToken()`、`localKeyMap`;`getAuthToken()` 是同步函数,读取前无需 `await`。
|
|
405
422
|
- 本地 key:短 token 是 `localStorage.auth_token`,项目 key 是 `localStorage.p_J_k`;刷新 token header 默认名是 `RT`。
|
|
406
|
-
-
|
|
423
|
+
- 组件加载辅助:`renderImportComponent(import('./Page'))` 会用 `React.lazy` + `Suspense` 渲染动态组件。
|
|
407
424
|
- Schema 通信:`schemaEventBus`、`eventsInfo`、`merge`。
|
|
408
425
|
- 共享状态:`modeStore`、`schemaStore`、`apiFreezerStore` 及对应 hooks。
|
|
409
|
-
- 多语言:`
|
|
426
|
+
- 多语言:`addLanguageResources()` 追加或新增某语种文案,`setLanguage()` 切换语言,React render 中用 `useText()`,非 React 工具代码用 `getText()`,配置文案可写 `$i18n::...`。
|
|
410
427
|
- 主题:`ThemeSwitch` 会同步根节点 `dark` class 和 `localStorage`。
|
|
411
428
|
- `Input type="password"` 会自动显示密码显隐按钮;`allowClear` 不作用于密码输入。
|
|
429
|
+
- RAF 风格计时器由 `@tc/common/rafTimer` 提供,浏览器优先使用 RAF,Node/SSR 自动降级到 `setTimeout`。
|
|
412
430
|
|
|
413
431
|
不要直接依赖 `frontend/src/...`、`packages/react/ui/...` 这类包内部路径。
|
|
414
432
|
|
|
@@ -480,9 +498,11 @@ import { buildFE } from '@_tc/template-core/bundler'
|
|
|
480
498
|
|
|
481
499
|
await buildFE('dev')
|
|
482
500
|
await buildFE('prod', { output: 'run' })
|
|
501
|
+
await buildFE('prod', { output: 'run', minifyHtml: true })
|
|
483
502
|
```
|
|
484
503
|
|
|
485
504
|
`buildFE('dev')` 是构建一次并监听业务 `frontend/` 变化后重建,不是 Vite dev server/HMR。
|
|
505
|
+
`minifyHtml: true` 会压缩最终 `.tpl` 模板输出;构建完成后会写入 `FEBuildKey`,服务端渲染 HTML 时用它判断本地 HTML ETag 缓存是否需要清空。
|
|
486
506
|
|
|
487
507
|
Node/backend 构建:
|
|
488
508
|
|
|
@@ -606,13 +626,14 @@ chokidar
|
|
|
606
626
|
|
|
607
627
|
扩展前端类型或组件:
|
|
608
628
|
|
|
609
|
-
1. SchemaForm 字段类型、CallCom 组件、Koa app 类型都支持 TypeScript 声明合并。
|
|
629
|
+
1. SchemaForm 字段类型、SchemaTable 单元格渲染组件、CallCom 组件、Koa app 类型都支持 TypeScript 声明合并。
|
|
610
630
|
2. 运行时组件通常放在业务 `frontend/extended/`。
|
|
611
|
-
3.
|
|
612
|
-
4. `dash/init
|
|
613
|
-
5. `dash/
|
|
614
|
-
6.
|
|
615
|
-
7.
|
|
631
|
+
3. 表格单元格渲染组件注册到 `frontend/extended/SchemaPage/SchemaTable/data.ts`,字段上用 `tableOption.renderComponent` 和 `renderComponentProps`。
|
|
632
|
+
4. Dashboard 扩展点包括 `frontend/extended/dash/init.ts`、`frontend/extended/dash/customRoutes.tsx`、`frontend/extended/dash/components.tsx`、`frontend/extended/dash/routeGuard.ts`。
|
|
633
|
+
5. `dash/init` 在 React 渲染前执行,适合注册 axios 拦截器等全局初始化逻辑;类型是 `DashInit`。
|
|
634
|
+
6. `dash/routeGuard` 用来判断登录。返回登录页 URL 字符串时,Dashboard 用 `window.location.href` 跳转;`DashRouteGuardResult` 是 `string | undefined`,`undefined`(包括已登录分支的隐式返回)会打断 Dashboard 内置重定向,业务方可自行跳转。
|
|
635
|
+
7. 自定义入口的 `initApp` 支持 `beforeRender` / `afterRender`,分别在 React 渲染前和首次渲染提交后触发。
|
|
636
|
+
8. 优先查看公开入口 `.d.ts` 和 npm 包根目录 `README.md`;如果当前环境是源码仓库,再继续读 `docs/type-extension.md` 和 `docs/schema-form.md`。
|
|
616
637
|
|
|
617
638
|
## 8. 继续深入
|
|
618
639
|
|