页面.常量
12003在本节中,我们将介绍如何在项目中使用常量,通过 pageHook
实现 UI 国际化。常量可以用于存储在多个页面中重复使用的文本或数据。通过使用 _constant_ui
配置常量,我们可以在页面中方便地引用这些常量。同时,我们将展示如何通过配置 language
实现国际化支持。
使用常量
首先,我们需要在
_constant_ui
中配置常量。以下表格展示了一个名为constantDemo
的常量,它包含一个版权声明文本。constantKey constantType pageId en zh constantDemo object all { "copyright": "Copyright © 2022 jianghujs.org" } { "copyright": "版权声明 © 2022 jianghujs.org" } 添加
/app/service/constantUi.js
'use strict';
const Service = require('egg').Service;
class ConstantUiService extends Service {
async getConstantUiMap() {
const { jianghuKnex } = this.app;
const { pageId } = this.ctx.packagePage;
const { language } = this.app.config;
const constantUiList = await jianghuKnex(`_constant_ui`).whereIn('pageId', ['all', pageId]).select();
const constantUiMap = Object.fromEntries(
constantUiList.map(obj => {
const { constantKey } = obj;
try {
return [constantKey, JSON.parse(obj[language] || '{}')];
} catch (error) {
this.app.logger.error('getConstantUiMap', ` constantKey:${constantKey} `, error);
return [constantKey, {}];
}
})
);
return constantUiMap;
}
}
module.exports = ConstantUiService;
接下来,我们需要确保
demoPage
页面的pageHook
已经配置好了。pageId pageType pageHook demoPage showInMenu {"beforeHook":[{"field": "constantUiMap", "service": "constantUi", "serviceFunc": "getConstantUiMap"}]} 在页面中使用常量,我们可以通过
<$ constantUiMap.constantDemo.copyright $>
引用常量中的版权声明文本。<div>
<h2>
<$ constantUiMap.constantDemo.copyright $>
</h3>
</div>
<script type="module">
new Vue({
el: '#app',
template: '#app-template',
vuetify: new Vuetify(),
data: {
},
})
</script>
常量国际化
为了实现国际化支持,我们需要在 /config/config.local.js
中配置 language
。例如,如果我们希望使用英文,我们可以将 language
设置为 'en'
。
language: 'en',
_constant_ui表结构
CREATE TABLE `_constant_ui` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`constantKey` varchar(255) DEFAULT NULL,
`constantType` varchar(255) DEFAULT NULL COMMENT '常量类型; object, array',
`pageId` varchar(255) DEFAULT 'all' COMMENT '页面id',
`desc` varchar(255) DEFAULT NULL COMMENT '描述',
`en` text COMMENT '常量内容; object, array',
`zh` text COMMENT '常量内容; object, array',
`operation` varchar(255) DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
`operationByUserId` varchar(255) DEFAULT NULL COMMENT '操作者userId',
`operationByUser` varchar(255) DEFAULT NULL COMMENT '操作者用户名',
`operationAt` varchar(255) DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `pageId_constantKey_unique` (`constantKey`, `pageId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMMENT = '常量表;'