1.修复安全入仓联动控制按钮无权限问题
2.增加安全入仓联动控制配置项,默认不启用
3.修改气体浓度验证选项默认不启用
4.增加门禁web页面源码
Changes to be committed:
new file: "face_webserver/
modified: vf107/src/config.json
modified: vf107/src/service/grainService.js
modified: vf107/src/view/config/menu/doorControlView.js
modified: vf107/src/view/mainView.js
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | .DS_Store |
| | | node_modules |
| | | /dist |
| | | |
| | | |
| | | # local env files |
| | | .env.local |
| | | .env.*.local |
| | | |
| | | # Log files |
| | | npm-debug.log* |
| | | yarn-debug.log* |
| | | yarn-error.log* |
| | | pnpm-debug.log* |
| | | |
| | | # Editor directories and files |
| | | .idea |
| | | .vscode |
| | | *.suo |
| | | *.ntvs* |
| | | *.njsproj |
| | | *.sln |
| | | *.sw? |
| | | /package-lock.json |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å®è£
ä¾èµ |
| | | npm install |
| | | |
| | | # å¯å¨å¼åæå¡å¨ |
| | | npm run serve |
| | | |
| | | # æå»ºçäº§çæ¬ |
| | | npm run build |
| | | |
| | | # 项ç®ç»æ |
| | | main.js # Vue åºç¨çå
¥å£æä»¶ï¼å建Vueå®ä¾æå¨å°DOMä¸ |
| | | vue.config.js # Vue CLI é
ç½®æä»¶ï¼å¯é
置代çï¼ |
| | | public/ |
| | | âââ config.js # åæ¾è¿è¡æ¶é
ç½® |
| | | âââ favicon.ico # ç½ç«å¾æ |
| | | âââ index.html # åºç¨ç主æä»¶ï¼Vueçå
¥å£ |
| | | âââ index.css # å
¨å±CSSæ ·å¼æä»¶ |
| | | |
| | | src/ |
| | | âââ assets/ # éæèµæº |
| | | âââ components/ # å
Œ
±ç»ä»¶ |
| | | âââ language/ # å½é
åæä»¶ |
| | | âââ utils/ # å·¥å
·å½æ° |
| | | â âââ bus.js # ç»ä»¶é´éä¿¡ |
| | | â âââ request.js # http设置 |
| | | âââ views/ # 页é¢ç»ä»¶ |
| | | âââ router.js # è·¯ç±é
ç½® |
| | | |
| | | # UIç»ä»¶ä½¿ç¨åè |
| | | https://element.eleme.cn/#/zh-CN/component/installation |
| | | |
| | | # vue2å¦ä¹ åè |
| | | https://v2.cn.vuejs.org/v2/guide/index.html |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | module.exports = { |
| | | presets: [ |
| | | '@vue/cli-plugin-babel/preset' |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "name": "webserver", |
| | | "version": "0.1.0", |
| | | "private": true, |
| | | "scripts": { |
| | | "serve": "vue-cli-service serve", |
| | | "build": "vue-cli-service build", |
| | | "lint": "vue-cli-service lint" |
| | | }, |
| | | "dependencies": { |
| | | "axios": "^0.21.1", |
| | | "core-js": "^3.6.5", |
| | | "echarts": "^5.2.2", |
| | | "element-ui": "^2.15.1", |
| | | "file-saver": "^2.0.5", |
| | | "install": "^0.13.0", |
| | | "jszip": "^3.7.1", |
| | | "npm": "^7.21.0", |
| | | "or": "^0.2.0", |
| | | "vue": "^2.6.11", |
| | | "vue-i18n": "8.23.0", |
| | | "vue-router": "^3.5.1", |
| | | "xlsx": "^0.17.0" |
| | | }, |
| | | "devDependencies": { |
| | | "@vue/cli-plugin-babel": "~4.5.0", |
| | | "@vue/cli-plugin-eslint": "~4.5.0", |
| | | "@vue/cli-service": "~4.5.0", |
| | | "babel-eslint": "^10.1.0", |
| | | "eslint": "^6.7.2", |
| | | "eslint-plugin-vue": "^6.2.2", |
| | | "less": "^3.13.1", |
| | | "less-loader": "^5.0.0", |
| | | "script-loader": "^0.7.2", |
| | | "vue-template-compiler": "^2.6.11" |
| | | }, |
| | | "eslintConfig": { |
| | | "root": true, |
| | | "env": { |
| | | "node": true |
| | | }, |
| | | "extends": [ |
| | | "plugin:vue/essential", |
| | | "eslint:recommended" |
| | | ], |
| | | "parserOptions": { |
| | | "parser": "babel-eslint" |
| | | }, |
| | | "rules": {} |
| | | }, |
| | | "browserslist": [ |
| | | "> 1%", |
| | | "last 2 versions", |
| | | "not dead" |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | document.title = '人è¸ç³»ç»' |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | html,
|
| | | body,
|
| | | #app {
|
| | | width: 100%;
|
| | | height: 100%;
|
| | | margin: 0;
|
| | | padding: 0;
|
| | | position: absolute;
|
| | | }
|
| | |
|
| | | h1,
|
| | | h2,
|
| | | h3,
|
| | | h4,
|
| | | h5,
|
| | | h6 {
|
| | | margin: 0;
|
| | | }
|
| | |
|
| | | /*
|
| | | *
|
| | | * æ´ç´ æé®åä½é¢è²
|
| | | * é»è®¤ä¸ºé»è²ï¼ä¸ºä¸ä¸»é¢ä¸è´æ¹æä¸»é¢è²
|
| | | * ä¸ä¸»é¢è²ä¸è´
|
| | | * æ´æ¹ä¸»é¢è²æ¶ï¼éè¦æ´æ¹è¯¥è²å¼
|
| | | *
|
| | | */
|
| | | /* .el-button.el-button--default {
|
| | | color: #00bcd4;
|
| | | } */
|
| | |
|
| | | .el-button.el-button--default.el-button--primary {
|
| | | color: #ffffff;
|
| | | }
|
| | |
|
| | | /*
|
| | | * æç´¢æ¡ç»ä¸æ ·å¼
|
| | | */
|
| | | .el-InputForm {
|
| | | background-color: #fff;
|
| | | padding: 10px 20px;
|
| | | box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.16);
|
| | | border-radius: 15px;
|
| | | position: relative;
|
| | | }
|
| | |
|
| | | .el-InputForm .el-form-item {
|
| | | margin-top: 10px;
|
| | | margin-bottom: 10px;
|
| | | padding: 5px 0;
|
| | | }
|
| | |
|
| | | /*
|
| | | * ä¾§è¾¹æ é项è¡é«
|
| | | */
|
| | | .el-submenu__title,
|
| | | .el-menu-item {
|
| | | height: 46px !important;
|
| | | line-height: 46px !important;
|
| | | }
|
| | |
|
| | | /*
|
| | | * é¢å
屿åä¸é¡¹é¢è²
|
| | | */
|
| | | .el-breadcrumb__item:last-child span {
|
| | | color: #999 !important;
|
| | | }
|
| | |
|
| | | /* è¡¨æ ¼é¼ æ æ¬åæ¡å®½åº¦éå¶ */
|
| | | .el-tooltip__popper {
|
| | | max-width: 90%;
|
| | | line-height: 2 !important;
|
| | | }
|
| | |
|
| | | /* ç¦ç¨ç¶æè¾å
¥æ¡æåé¢è² */
|
| | | .the-main .el-textarea.is-disabled .el-textarea__inner,
|
| | | .the-main .el-input.is-disabled .el-input__inner {
|
| | | color: #000;
|
| | | }
|
| | |
|
| | | .el-button {
|
| | | min-width: 120px;
|
| | | }
|
| | |
|
| | | .el-button--text {
|
| | | min-width: auto;
|
| | | }
|
| | |
|
| | | /* ä¿®æ¹å¼å
³æé®æ ·å¼ */
|
| | | .el-switch__core {
|
| | | width: 60px !important;
|
| | | }
|
| | |
|
| | | .el-switch__label {
|
| | | display: none;
|
| | | color: #ffffff00 !important;
|
| | | position: absolute;
|
| | | z-index: 9;
|
| | | margin-left: 0;
|
| | | margin-right: 0;
|
| | | }
|
| | |
|
| | | .el-switch__label--right {
|
| | | right: 22px;
|
| | | }
|
| | |
|
| | | .el-switch__label--left {
|
| | | left: 22px;
|
| | | }
|
| | |
|
| | | .el-switch .is-active {
|
| | | color: #fff !important;
|
| | | }
|
| | |
|
| | | .el-dialog__footer {
|
| | | text-align: center !important;
|
| | | }
|
| | |
|
| | | .el-dialog {
|
| | | border-radius: 10px !important;
|
| | | }
|
| | |
|
| | | .dialog-footer {
|
| | | text-align: center;
|
| | | margin-top: 15px;
|
| | | }
|
| | |
|
| | | .el-message {
|
| | | pointer-events: none;
|
| | | z-index: 999 !important;
|
| | | }
|
| | |
|
| | | .el-message__content,
|
| | | .el-message__closeBtn {
|
| | | pointer-events: auto;
|
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!DOCTYPE html> |
| | | <html lang=""> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width,initial-scale=1.0"> |
| | | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
| | | <title>Sistema facial</title> |
| | | <link href="./index.css" rel="stylesheet"> |
| | | <script src="./config.js"></script> |
| | | </head> |
| | | <body> |
| | | <div id="app"> |
| | | <div class="loading"> |
| | | <svg width="135" height="135" viewBox="0 0 135 135" xmlns="http://www.w3.org/2000/svg" fill="#7493FF"> |
| | | <path d="M67.447 58c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10zm9.448 9.447c0 5.523 4.477 10 10 10 5.522 0 10-4.477 10-10s-4.478-10-10-10c-5.523 0-10 4.477-10 10zm-9.448 9.448c-5.523 0-10 4.477-10 10 0 5.522 4.477 10 10 10s10-4.478 10-10c0-5.523-4.477-10-10-10zM58 67.447c0-5.523-4.477-10-10-10s-10 4.477-10 10 4.477 10 10 10 10-4.477 10-10z"> |
| | | <animateTransform |
| | | attributeName="transform" |
| | | type="rotate" |
| | | from="0 67 67" |
| | | to="-360 67 67" |
| | | dur="2.5s" |
| | | repeatCount="indefinite"/> |
| | | </path> |
| | | <path d="M28.19 40.31c6.627 0 12-5.374 12-12 0-6.628-5.373-12-12-12-6.628 0-12 5.372-12 12 0 6.626 5.372 12 12 12zm30.72-19.825c4.686 4.687 12.284 4.687 16.97 0 4.686-4.686 4.686-12.284 0-16.97-4.686-4.687-12.284-4.687-16.97 0-4.687 4.686-4.687 12.284 0 16.97zm35.74 7.705c0 6.627 5.37 12 12 12 6.626 0 12-5.373 12-12 0-6.628-5.374-12-12-12-6.63 0-12 5.372-12 12zm19.822 30.72c-4.686 4.686-4.686 12.284 0 16.97 4.687 4.686 12.285 4.686 16.97 0 4.687-4.686 4.687-12.284 0-16.97-4.685-4.687-12.283-4.687-16.97 0zm-7.704 35.74c-6.627 0-12 5.37-12 12 0 6.626 5.373 12 12 12s12-5.374 12-12c0-6.63-5.373-12-12-12zm-30.72 19.822c-4.686-4.686-12.284-4.686-16.97 0-4.686 4.687-4.686 12.285 0 16.97 4.686 4.687 12.284 4.687 16.97 0 4.687-4.685 4.687-12.283 0-16.97zm-35.74-7.704c0-6.627-5.372-12-12-12-6.626 0-12 5.373-12 12s5.374 12 12 12c6.628 0 12-5.373 12-12zm-19.823-30.72c4.687-4.686 4.687-12.284 0-16.97-4.686-4.686-12.284-4.686-16.97 0-4.687 4.686-4.687 12.284 0 16.97 4.686 4.687 12.284 4.687 16.97 0z"> |
| | | <animateTransform |
| | | attributeName="transform" |
| | | type="rotate" |
| | | from="0 67 67" |
| | | to="360 67 67" |
| | | dur="8s" |
| | | repeatCount="indefinite"/> |
| | | </path> |
| | | </svg> |
| | | </div> |
| | | </div> |
| | | <!-- built files will be auto injected --> |
| | | </body> |
| | | </html> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div id="app"> |
| | | <router-view></router-view> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | name: "App", |
| | | mounted(){ |
| | | function checkIE(){ |
| | | return '-ms-scroll-limit' in document.documentElement.style && '-ms-ime-align' in document.documentElement.style |
| | | } |
| | | if (checkIE()) { |
| | | window.addEventListener('hashchange', () => { |
| | | var currentPath = window.location.hash.slice(1); |
| | | if (this.$route.path !== currentPath) { |
| | | this.$router.push(currentPath) |
| | | } |
| | | }, false) |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | <style lang="less"> |
| | | @import './assets/styles/theme.css'; |
| | | |
| | | html { |
| | | height: 100%; |
| | | font-size: 14px; |
| | | |
| | | body { |
| | | padding: 0; |
| | | margin: 0; |
| | | height: 100%; |
| | | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif; |
| | | background-color: var(--bg-secondary); |
| | | color: var(--text-primary); |
| | | line-height: 1.5715; |
| | | |
| | | #app { |
| | | height: 100%; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* å
¨å±Element UIæ ·å¼ä¼å */ |
| | | .el-button { |
| | | border-radius: var(--radius-md); |
| | | font-weight: 500; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | |
| | | &:hover { |
| | | transform: translateY(-1px); |
| | | box-shadow: var(--shadow-md); |
| | | } |
| | | } |
| | | |
| | | .el-input__inner { |
| | | border-radius: var(--radius-md); |
| | | border: 1px solid var(--border-color); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | |
| | | &:focus { |
| | | border-color: var(--primary-color); |
| | | box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); |
| | | } |
| | | } |
| | | |
| | | .el-table { |
| | | border-radius: var(--radius-lg); |
| | | overflow: hidden; |
| | | |
| | | .el-table__header th { |
| | | background: var(--bg-tertiary); |
| | | color: var(--text-primary); |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .el-table__row:hover { |
| | | background: rgba(24, 144, 255, 0.04); |
| | | } |
| | | } |
| | | |
| | | .el-card { |
| | | border-radius: var(--radius-lg); |
| | | box-shadow: var(--shadow-md); |
| | | border: 1px solid var(--border-light); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | |
| | | &:hover { |
| | | box-shadow: var(--shadow-lg); |
| | | transform: translateY(-2px); |
| | | } |
| | | } |
| | | |
| | | .el-drawer { |
| | | .el-drawer__header { |
| | | margin-bottom: 0; |
| | | padding: var(--spacing-lg); |
| | | border-bottom: 1px solid var(--border-light); |
| | | background: var(--bg-primary); |
| | | } |
| | | |
| | | .el-drawer__body { |
| | | padding: var(--spacing-lg); |
| | | background: var(--bg-secondary); |
| | | } |
| | | } |
| | | |
| | | .el-dialog { |
| | | border-radius: var(--radius-lg); |
| | | overflow: hidden; |
| | | |
| | | .el-dialog__header { |
| | | background: var(--bg-primary); |
| | | border-bottom: 1px solid var(--border-light); |
| | | padding: var(--spacing-lg); |
| | | } |
| | | |
| | | .el-dialog__body { |
| | | background: var(--bg-secondary); |
| | | padding: var(--spacing-lg); |
| | | } |
| | | |
| | | .el-dialog__footer { |
| | | background: var(--bg-primary); |
| | | border-top: 1px solid var(--border-light); |
| | | padding: var(--spacing-md) var(--spacing-lg); |
| | | } |
| | | } |
| | | |
| | | /* æ»å¨æ¡ç¾å */ |
| | | ::-webkit-scrollbar { |
| | | width: 6px; |
| | | height: 6px; |
| | | } |
| | | |
| | | ::-webkit-scrollbar-track { |
| | | background: var(--bg-tertiary); |
| | | border-radius: var(--radius-sm); |
| | | } |
| | | |
| | | ::-webkit-scrollbar-thumb { |
| | | background: var(--border-color); |
| | | border-radius: var(--radius-sm); |
| | | transition: background 0.3s ease; |
| | | } |
| | | |
| | | ::-webkit-scrollbar-thumb:hover { |
| | | background: var(--text-disabled); |
| | | } |
| | | |
| | | /* å è½½å¨ç» */ |
| | | .el-loading-mask { |
| | | background-color: rgba(255, 255, 255, 0.9); |
| | | backdrop-filter: blur(4px); |
| | | } |
| | | |
| | | /* æ¶æ¯æç¤ºä¼å */ |
| | | .el-message { |
| | | border-radius: var(--radius-md); |
| | | box-shadow: var(--shadow-lg); |
| | | border: none; |
| | | } |
| | | |
| | | .el-notification { |
| | | border-radius: var(--radius-lg); |
| | | box-shadow: var(--shadow-xl); |
| | | border: 1px solid var(--border-light); |
| | | } |
| | | </style> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | *dataurl:base64 |
| | | *filename:设置æä»¶åç§° |
| | | */ |
| | | export const dataURLtoFile=(dataurl,filename) =>{ |
| | | let arr = dataurl.split(',') |
| | | let mime = arr[0].match(/:(.*?);/)[1] |
| | | let suffix = mime.split('/')[1] |
| | | let bstr = atob(arr[1]) |
| | | let n = bstr.length |
| | | let u8arr = new Uint8Array(n) |
| | | while (n--) { |
| | | u8arr[n] = bstr.charCodeAt(n) |
| | | } |
| | | return new File([u8arr], `${filename}.${suffix}`, { |
| | | type: mime |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* Logo åä½ */ |
| | | @font-face { |
| | | font-family: "iconfont logo"; |
| | | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); |
| | | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), |
| | | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), |
| | | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), |
| | | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); |
| | | } |
| | | |
| | | .logo { |
| | | font-family: "iconfont logo"; |
| | | font-size: 160px; |
| | | font-style: normal; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | } |
| | | |
| | | /* tabs */ |
| | | .nav-tabs { |
| | | position: relative; |
| | | } |
| | | |
| | | .nav-tabs .nav-more { |
| | | position: absolute; |
| | | right: 0; |
| | | bottom: 0; |
| | | height: 42px; |
| | | line-height: 42px; |
| | | color: #666; |
| | | } |
| | | |
| | | #tabs { |
| | | border-bottom: 1px solid #eee; |
| | | } |
| | | |
| | | #tabs li { |
| | | cursor: pointer; |
| | | width: 100px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | text-align: center; |
| | | font-size: 16px; |
| | | border-bottom: 2px solid transparent; |
| | | position: relative; |
| | | z-index: 1; |
| | | margin-bottom: -1px; |
| | | color: #666; |
| | | } |
| | | |
| | | |
| | | #tabs .active { |
| | | border-bottom-color: #f00; |
| | | color: #222; |
| | | } |
| | | |
| | | .tab-container .content { |
| | | display: none; |
| | | } |
| | | |
| | | /* 页é¢å¸å± */ |
| | | .main { |
| | | padding: 30px 100px; |
| | | width: 960px; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .main .logo { |
| | | color: #333; |
| | | text-align: left; |
| | | margin-bottom: 30px; |
| | | line-height: 1; |
| | | height: 110px; |
| | | margin-top: -50px; |
| | | overflow: hidden; |
| | | *zoom: 1; |
| | | } |
| | | |
| | | .main .logo a { |
| | | font-size: 160px; |
| | | color: #333; |
| | | } |
| | | |
| | | .helps { |
| | | margin-top: 40px; |
| | | } |
| | | |
| | | .helps pre { |
| | | padding: 20px; |
| | | margin: 10px 0; |
| | | border: solid 1px #e7e1cd; |
| | | background-color: #fffdef; |
| | | overflow: auto; |
| | | } |
| | | |
| | | .icon_lists { |
| | | width: 100% !important; |
| | | overflow: hidden; |
| | | *zoom: 1; |
| | | } |
| | | |
| | | .icon_lists li { |
| | | width: 100px; |
| | | margin-bottom: 10px; |
| | | margin-right: 20px; |
| | | text-align: center; |
| | | list-style: none !important; |
| | | cursor: default; |
| | | } |
| | | |
| | | .icon_lists li .code-name { |
| | | line-height: 1.2; |
| | | } |
| | | |
| | | .icon_lists .icon { |
| | | display: block; |
| | | height: 100px; |
| | | line-height: 100px; |
| | | font-size: 42px; |
| | | margin: 10px auto; |
| | | color: #333; |
| | | -webkit-transition: font-size 0.25s linear, width 0.25s linear; |
| | | -moz-transition: font-size 0.25s linear, width 0.25s linear; |
| | | transition: font-size 0.25s linear, width 0.25s linear; |
| | | } |
| | | |
| | | .icon_lists .icon:hover { |
| | | font-size: 100px; |
| | | } |
| | | |
| | | .icon_lists .svg-icon { |
| | | /* éè¿è®¾ç½® font-size æ¥æ¹å徿 å¤§å° */ |
| | | width: 1em; |
| | | /* 徿 åæåç¸é»æ¶ï¼åç´å¯¹é½ */ |
| | | vertical-align: -0.15em; |
| | | /* éè¿è®¾ç½® color æ¥æ¹å SVG çé¢è²/fill */ |
| | | fill: currentColor; |
| | | /* path å stroke æº¢åº viewBox é¨åå¨ IE ä¸ä¼æ¾ç¤º |
| | | normalize.css ä¸ä¹å
å«è¿è¡ */ |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .icon_lists li .name, |
| | | .icon_lists li .code-name { |
| | | color: #666; |
| | | } |
| | | |
| | | /* markdown æ ·å¼ */ |
| | | .markdown { |
| | | color: #666; |
| | | font-size: 14px; |
| | | line-height: 1.8; |
| | | } |
| | | |
| | | .highlight { |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .markdown img { |
| | | vertical-align: middle; |
| | | max-width: 100%; |
| | | } |
| | | |
| | | .markdown h1 { |
| | | color: #404040; |
| | | font-weight: 500; |
| | | line-height: 40px; |
| | | margin-bottom: 24px; |
| | | } |
| | | |
| | | .markdown h2, |
| | | .markdown h3, |
| | | .markdown h4, |
| | | .markdown h5, |
| | | .markdown h6 { |
| | | color: #404040; |
| | | margin: 1.6em 0 0.6em 0; |
| | | font-weight: 500; |
| | | clear: both; |
| | | } |
| | | |
| | | .markdown h1 { |
| | | font-size: 28px; |
| | | } |
| | | |
| | | .markdown h2 { |
| | | font-size: 22px; |
| | | } |
| | | |
| | | .markdown h3 { |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .markdown h4 { |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .markdown h5 { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .markdown h6 { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .markdown hr { |
| | | height: 1px; |
| | | border: 0; |
| | | background: #e9e9e9; |
| | | margin: 16px 0; |
| | | clear: both; |
| | | } |
| | | |
| | | .markdown p { |
| | | margin: 1em 0; |
| | | } |
| | | |
| | | .markdown>p, |
| | | .markdown>blockquote, |
| | | .markdown>.highlight, |
| | | .markdown>ol, |
| | | .markdown>ul { |
| | | width: 80%; |
| | | } |
| | | |
| | | .markdown ul>li { |
| | | list-style: circle; |
| | | } |
| | | |
| | | .markdown>ul li, |
| | | .markdown blockquote ul>li { |
| | | margin-left: 20px; |
| | | padding-left: 4px; |
| | | } |
| | | |
| | | .markdown>ul li p, |
| | | .markdown>ol li p { |
| | | margin: 0.6em 0; |
| | | } |
| | | |
| | | .markdown ol>li { |
| | | list-style: decimal; |
| | | } |
| | | |
| | | .markdown>ol li, |
| | | .markdown blockquote ol>li { |
| | | margin-left: 20px; |
| | | padding-left: 4px; |
| | | } |
| | | |
| | | .markdown code { |
| | | margin: 0 3px; |
| | | padding: 0 5px; |
| | | background: #eee; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | .markdown strong, |
| | | .markdown b { |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .markdown>table { |
| | | border-collapse: collapse; |
| | | border-spacing: 0px; |
| | | empty-cells: show; |
| | | border: 1px solid #e9e9e9; |
| | | width: 95%; |
| | | margin-bottom: 24px; |
| | | } |
| | | |
| | | .markdown>table th { |
| | | white-space: nowrap; |
| | | color: #333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .markdown>table th, |
| | | .markdown>table td { |
| | | border: 1px solid #e9e9e9; |
| | | padding: 8px 16px; |
| | | text-align: left; |
| | | } |
| | | |
| | | .markdown>table th { |
| | | background: #F7F7F7; |
| | | } |
| | | |
| | | .markdown blockquote { |
| | | font-size: 90%; |
| | | color: #999; |
| | | border-left: 4px solid #e9e9e9; |
| | | padding-left: 0.8em; |
| | | margin: 1em 0; |
| | | } |
| | | |
| | | .markdown blockquote p { |
| | | margin: 0; |
| | | } |
| | | |
| | | .markdown .anchor { |
| | | opacity: 0; |
| | | transition: opacity 0.3s ease; |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | .markdown .waiting { |
| | | color: #ccc; |
| | | } |
| | | |
| | | .markdown h1:hover .anchor, |
| | | .markdown h2:hover .anchor, |
| | | .markdown h3:hover .anchor, |
| | | .markdown h4:hover .anchor, |
| | | .markdown h5:hover .anchor, |
| | | .markdown h6:hover .anchor { |
| | | opacity: 1; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .markdown>br, |
| | | .markdown>p>br { |
| | | clear: both; |
| | | } |
| | | |
| | | |
| | | .hljs { |
| | | display: block; |
| | | background: white; |
| | | padding: 0.5em; |
| | | color: #333333; |
| | | overflow-x: auto; |
| | | } |
| | | |
| | | .hljs-comment, |
| | | .hljs-meta { |
| | | color: #969896; |
| | | } |
| | | |
| | | .hljs-string, |
| | | .hljs-variable, |
| | | .hljs-template-variable, |
| | | .hljs-strong, |
| | | .hljs-emphasis, |
| | | .hljs-quote { |
| | | color: #df5000; |
| | | } |
| | | |
| | | .hljs-keyword, |
| | | .hljs-selector-tag, |
| | | .hljs-type { |
| | | color: #a71d5d; |
| | | } |
| | | |
| | | .hljs-literal, |
| | | .hljs-symbol, |
| | | .hljs-bullet, |
| | | .hljs-attribute { |
| | | color: #0086b3; |
| | | } |
| | | |
| | | .hljs-section, |
| | | .hljs-name { |
| | | color: #63a35c; |
| | | } |
| | | |
| | | .hljs-tag { |
| | | color: #333333; |
| | | } |
| | | |
| | | .hljs-title, |
| | | .hljs-attr, |
| | | .hljs-selector-id, |
| | | .hljs-selector-class, |
| | | .hljs-selector-attr, |
| | | .hljs-selector-pseudo { |
| | | color: #795da3; |
| | | } |
| | | |
| | | .hljs-addition { |
| | | color: #55a532; |
| | | background-color: #eaffea; |
| | | } |
| | | |
| | | .hljs-deletion { |
| | | color: #bd2c00; |
| | | background-color: #ffecec; |
| | | } |
| | | |
| | | .hljs-link { |
| | | text-decoration: underline; |
| | | } |
| | | |
| | | /* 代ç é«äº® */ |
| | | /* PrismJS 1.15.0 |
| | | https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ |
| | | /** |
| | | * prism.js default theme for JavaScript, CSS and HTML |
| | | * Based on dabblet (http://dabblet.com) |
| | | * @author Lea Verou |
| | | */ |
| | | code[class*="language-"], |
| | | pre[class*="language-"] { |
| | | color: black; |
| | | background: none; |
| | | text-shadow: 0 1px white; |
| | | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; |
| | | text-align: left; |
| | | white-space: pre; |
| | | word-spacing: normal; |
| | | word-break: normal; |
| | | word-wrap: normal; |
| | | line-height: 1.5; |
| | | |
| | | -moz-tab-size: 4; |
| | | -o-tab-size: 4; |
| | | tab-size: 4; |
| | | |
| | | -webkit-hyphens: none; |
| | | -moz-hyphens: none; |
| | | -ms-hyphens: none; |
| | | hyphens: none; |
| | | } |
| | | |
| | | pre[class*="language-"]::-moz-selection, |
| | | pre[class*="language-"] ::-moz-selection, |
| | | code[class*="language-"]::-moz-selection, |
| | | code[class*="language-"] ::-moz-selection { |
| | | text-shadow: none; |
| | | background: #b3d4fc; |
| | | } |
| | | |
| | | pre[class*="language-"]::selection, |
| | | pre[class*="language-"] ::selection, |
| | | code[class*="language-"]::selection, |
| | | code[class*="language-"] ::selection { |
| | | text-shadow: none; |
| | | background: #b3d4fc; |
| | | } |
| | | |
| | | @media print { |
| | | |
| | | code[class*="language-"], |
| | | pre[class*="language-"] { |
| | | text-shadow: none; |
| | | } |
| | | } |
| | | |
| | | /* Code blocks */ |
| | | pre[class*="language-"] { |
| | | padding: 1em; |
| | | margin: .5em 0; |
| | | overflow: auto; |
| | | } |
| | | |
| | | :not(pre)>code[class*="language-"], |
| | | pre[class*="language-"] { |
| | | background: #f5f2f0; |
| | | } |
| | | |
| | | /* Inline code */ |
| | | :not(pre)>code[class*="language-"] { |
| | | padding: .1em; |
| | | border-radius: .3em; |
| | | white-space: normal; |
| | | } |
| | | |
| | | .token.comment, |
| | | .token.prolog, |
| | | .token.doctype, |
| | | .token.cdata { |
| | | color: slategray; |
| | | } |
| | | |
| | | .token.punctuation { |
| | | color: #999; |
| | | } |
| | | |
| | | .namespace { |
| | | opacity: .7; |
| | | } |
| | | |
| | | .token.property, |
| | | .token.tag, |
| | | .token.boolean, |
| | | .token.number, |
| | | .token.constant, |
| | | .token.symbol, |
| | | .token.deleted { |
| | | color: #905; |
| | | } |
| | | |
| | | .token.selector, |
| | | .token.attr-name, |
| | | .token.string, |
| | | .token.char, |
| | | .token.builtin, |
| | | .token.inserted { |
| | | color: #690; |
| | | } |
| | | |
| | | .token.operator, |
| | | .token.entity, |
| | | .token.url, |
| | | .language-css .token.string, |
| | | .style .token.string { |
| | | color: #9a6e3a; |
| | | background: hsla(0, 0%, 100%, .5); |
| | | } |
| | | |
| | | .token.atrule, |
| | | .token.attr-value, |
| | | .token.keyword { |
| | | color: #07a; |
| | | } |
| | | |
| | | .token.function, |
| | | .token.class-name { |
| | | color: #DD4A68; |
| | | } |
| | | |
| | | .token.regex, |
| | | .token.important, |
| | | .token.variable { |
| | | color: #e90; |
| | | } |
| | | |
| | | .token.important, |
| | | .token.bold { |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .token.italic { |
| | | font-style: italic; |
| | | } |
| | | |
| | | .token.entity { |
| | | cursor: help; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!DOCTYPE html> |
| | | <html> |
| | | <head> |
| | | <meta charset="utf-8"/> |
| | | <title>IconFont Demo</title> |
| | | <link rel="shortcut icon" href="https://img.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/> |
| | | <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css"> |
| | | <link rel="stylesheet" href="demo.css"> |
| | | <link rel="stylesheet" href="iconfont.css"> |
| | | <script src="iconfont.js"></script> |
| | | <!-- jQuery --> |
| | | <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script> |
| | | <!-- 代ç é«äº® --> |
| | | <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script> |
| | | </head> |
| | | <body> |
| | | <div class="main"> |
| | | <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont é¦é¡µ" target="_blank"></a></h1> |
| | | <div class="nav-tabs"> |
| | | <ul id="tabs" class="dib-box"> |
| | | <li class="dib active"><span>Unicode</span></li> |
| | | <li class="dib"><span>Font class</span></li> |
| | | <li class="dib"><span>Symbol</span></li> |
| | | </ul> |
| | | |
| | | <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2399544" target="_blank" class="nav-more">æ¥ç项ç®</a> |
| | | |
| | | </div> |
| | | <div class="tab-container"> |
| | | <div class="content unicode" style="display: block;"> |
| | | <ul class="icon_lists dib-box"> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">ç¨æ·</div> |
| | | <div class="code-name">&#xe7ff;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">å
³é</div> |
| | | <div class="code-name">&#xe616;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">人è¸è¯å«</div> |
| | | <div class="code-name">&#xe78d;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">éåº</div> |
| | | <div class="code-name">&#xe60d;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">æ¶æ¯</div> |
| | | <div class="code-name">&#xeb15;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">æ¶æ¯</div> |
| | | <div class="code-name">&#xe612;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont"></span> |
| | | <div class="name">å¯ç </div> |
| | | <div class="code-name">&#xe644;</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont">٦</span> |
| | | <div class="name">è´¦å·</div> |
| | | <div class="code-name">&#x666;</div> |
| | | </li> |
| | | |
| | | </ul> |
| | | <div class="article markdown"> |
| | | <h2 id="unicode-">Unicode å¼ç¨</h2> |
| | | <hr> |
| | | |
| | | <p>Unicode æ¯åä½å¨ç½é¡µç«¯æåå§çåºç¨æ¹å¼ï¼ç¹ç¹æ¯ï¼</p> |
| | | <ul> |
| | | <li>å
¼å®¹æ§æå¥½ï¼æ¯æ IE6+ï¼åææç°ä»£æµè§å¨ã</li> |
| | | <li>æ¯ææåä½çæ¹å¼å»å¨æè°æ´å¾æ 大å°ï¼é¢è²ççã</li> |
| | | <li>使¯å 为æ¯åä½ï¼æä»¥ä¸æ¯æå¤è²ãåªè½ä½¿ç¨å¹³å°éåè²ç徿 ï¼å°±ç®é¡¹ç®éæå¤è²å¾æ ä¹ä¼èªå¨å»è²ã</li> |
| | | </ul> |
| | | <blockquote> |
| | | <p>注æï¼æ°ç iconfont æ¯æå¤è²å¾æ ï¼è¿äºå¤è²å¾æ å¨ Unicode 模å¼ä¸å°ä¸è½ä½¿ç¨ï¼å¦ææéæ±å»ºè®®ä½¿ç¨symbol çå¼ç¨æ¹å¼</p> |
| | | </blockquote> |
| | | <p>Unicode ä½¿ç¨æ¥éª¤å¦ä¸ï¼</p> |
| | | <h3 id="-font-face">ç¬¬ä¸æ¥ï¼æ·è´é¡¹ç®ä¸é¢çæç <code>@font-face</code></h3> |
| | | <pre><code class="language-css" |
| | | >@font-face { |
| | | font-family: 'iconfont'; |
| | | src: url('iconfont.eot'); |
| | | src: url('iconfont.eot?#iefix') format('embedded-opentype'), |
| | | url('iconfont.woff2') format('woff2'), |
| | | url('iconfont.woff') format('woff'), |
| | | url('iconfont.ttf') format('truetype'), |
| | | url('iconfont.svg#iconfont') format('svg'); |
| | | } |
| | | </code></pre> |
| | | <h3 id="-iconfont-">ç¬¬äºæ¥ï¼å®ä¹ä½¿ç¨ iconfont çæ ·å¼</h3> |
| | | <pre><code class="language-css" |
| | | >.iconfont { |
| | | font-family: "iconfont" !important; |
| | | font-size: 16px; |
| | | font-style: normal; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | } |
| | | </code></pre> |
| | | <h3 id="-">ç¬¬ä¸æ¥ï¼æéç¸åºå¾æ å¹¶è·ååä½ç¼ç ï¼åºç¨äºé¡µé¢</h3> |
| | | <pre> |
| | | <code class="language-html" |
| | | ><span class="iconfont">&#x33;</span> |
| | | </code></pre> |
| | | <blockquote> |
| | | <p>"iconfont" æ¯ä½ 项ç®ä¸ç font-familyãå¯ä»¥éè¿ç¼è¾é¡¹ç®æ¥çï¼é»è®¤æ¯ "iconfont"ã</p> |
| | | </blockquote> |
| | | </div> |
| | | </div> |
| | | <div class="content font-class"> |
| | | <ul class="icon_lists dib-box"> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-dashujukeshihuaico-"></span> |
| | | <div class="name"> |
| | | ç¨æ· |
| | | </div> |
| | | <div class="code-name">.icon-dashujukeshihuaico- |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-guanxi"></span> |
| | | <div class="name"> |
| | | å
³é |
| | | </div> |
| | | <div class="code-name">.icon-guanxi |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-renlianshibie1"></span> |
| | | <div class="name"> |
| | | 人è¸è¯å« |
| | | </div> |
| | | <div class="code-name">.icon-renlianshibie1 |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-tuichu"></span> |
| | | <div class="name"> |
| | | éåº |
| | | </div> |
| | | <div class="code-name">.icon-tuichu |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-biaoqiankuozhan_xiaoxi-157"></span> |
| | | <div class="name"> |
| | | æ¶æ¯ |
| | | </div> |
| | | <div class="code-name">.icon-biaoqiankuozhan_xiaoxi-157 |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-xiaoxi"></span> |
| | | <div class="name"> |
| | | æ¶æ¯ |
| | | </div> |
| | | <div class="code-name">.icon-xiaoxi |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-mima"></span> |
| | | <div class="name"> |
| | | å¯ç |
| | | </div> |
| | | <div class="code-name">.icon-mima |
| | | </div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <span class="icon iconfont icon-zhanghao"></span> |
| | | <div class="name"> |
| | | è´¦å· |
| | | </div> |
| | | <div class="code-name">.icon-zhanghao |
| | | </div> |
| | | </li> |
| | | |
| | | </ul> |
| | | <div class="article markdown"> |
| | | <h2 id="font-class-">font-class å¼ç¨</h2> |
| | | <hr> |
| | | |
| | | <p>font-class æ¯ Unicode ä½¿ç¨æ¹å¼çä¸ç§åç§ï¼ä¸»è¦æ¯è§£å³ Unicode 书åä¸ç´è§ï¼è¯æä¸æç¡®çé®é¢ã</p> |
| | | <p>ä¸ Unicode ä½¿ç¨æ¹å¼ç¸æ¯ï¼å
·æå¦ä¸ç¹ç¹ï¼</p> |
| | | <ul> |
| | | <li>å
¼å®¹æ§è¯å¥½ï¼æ¯æ IE8+ï¼åææç°ä»£æµè§å¨ã</li> |
| | | <li>ç¸æ¯äº Unicode è¯ææç¡®ï¼ä¹¦åæ´ç´è§ãå¯ä»¥å¾å®¹æå辨è¿ä¸ª icon æ¯ä»ä¹ã</li> |
| | | <li>å ä¸ºä½¿ç¨ class æ¥å®ä¹å¾æ ï¼æä»¥å½è¦æ¿æ¢å¾æ æ¶ï¼åªéè¦ä¿®æ¹ class éé¢ç Unicode å¼ç¨ã</li> |
| | | <li>ä¸è¿å 为æ¬è´¨ä¸è¿æ¯ä½¿ç¨çåä½ï¼æä»¥å¤è²å¾æ è¿æ¯ä¸æ¯æçã</li> |
| | | </ul> |
| | | <p>ä½¿ç¨æ¥éª¤å¦ä¸ï¼</p> |
| | | <h3 id="-fontclass-">ç¬¬ä¸æ¥ï¼å¼å
¥é¡¹ç®ä¸é¢çæç fontclass 代ç ï¼</h3> |
| | | <pre><code class="language-html"><link rel="stylesheet" href="./iconfont.css"> |
| | | </code></pre> |
| | | <h3 id="-">ç¬¬äºæ¥ï¼æéç¸åºå¾æ å¹¶è·åç±»åï¼åºç¨äºé¡µé¢ï¼</h3> |
| | | <pre><code class="language-html"><span class="iconfont icon-xxx"></span> |
| | | </code></pre> |
| | | <blockquote> |
| | | <p>" |
| | | iconfont" æ¯ä½ 项ç®ä¸ç font-familyãå¯ä»¥éè¿ç¼è¾é¡¹ç®æ¥çï¼é»è®¤æ¯ "iconfont"ã</p> |
| | | </blockquote> |
| | | </div> |
| | | </div> |
| | | <div class="content symbol"> |
| | | <ul class="icon_lists dib-box"> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-dashujukeshihuaico-"></use> |
| | | </svg> |
| | | <div class="name">ç¨æ·</div> |
| | | <div class="code-name">#icon-dashujukeshihuaico-</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-guanxi"></use> |
| | | </svg> |
| | | <div class="name">å
³é</div> |
| | | <div class="code-name">#icon-guanxi</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-renlianshibie1"></use> |
| | | </svg> |
| | | <div class="name">人è¸è¯å«</div> |
| | | <div class="code-name">#icon-renlianshibie1</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-tuichu"></use> |
| | | </svg> |
| | | <div class="name">éåº</div> |
| | | <div class="code-name">#icon-tuichu</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-biaoqiankuozhan_xiaoxi-157"></use> |
| | | </svg> |
| | | <div class="name">æ¶æ¯</div> |
| | | <div class="code-name">#icon-biaoqiankuozhan_xiaoxi-157</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-xiaoxi"></use> |
| | | </svg> |
| | | <div class="name">æ¶æ¯</div> |
| | | <div class="code-name">#icon-xiaoxi</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-mima"></use> |
| | | </svg> |
| | | <div class="name">å¯ç </div> |
| | | <div class="code-name">#icon-mima</div> |
| | | </li> |
| | | |
| | | <li class="dib"> |
| | | <svg class="icon svg-icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-zhanghao"></use> |
| | | </svg> |
| | | <div class="name">è´¦å·</div> |
| | | <div class="code-name">#icon-zhanghao</div> |
| | | </li> |
| | | |
| | | </ul> |
| | | <div class="article markdown"> |
| | | <h2 id="symbol-">Symbol å¼ç¨</h2> |
| | | <hr> |
| | | |
| | | <p>è¿æ¯ä¸ç§å
¨æ°çä½¿ç¨æ¹å¼ï¼åºè¯¥è¯´è¿ææ¯æªæ¥ç主æµï¼ä¹æ¯å¹³å°ç®åæ¨èçç¨æ³ãç¸å
³ä»ç»å¯ä»¥åèè¿ç¯<a href="">æç« </a> |
| | | è¿ç§ç¨æ³å
¶å®æ¯åäºä¸ä¸ª SVG çéåï¼ä¸å¦å¤ä¸¤ç§ç¸æ¯å
·æå¦ä¸ç¹ç¹ï¼</p> |
| | | <ul> |
| | | <li>æ¯æå¤è²å¾æ äºï¼ä¸åååè²éå¶ã</li> |
| | | <li>éè¿ä¸äºæå·§ï¼æ¯æååä½é£æ ·ï¼éè¿ <code>font-size</code>, <code>color</code> æ¥è°æ´æ ·å¼ã</li> |
| | | <li>å
¼å®¹æ§è¾å·®ï¼æ¯æ IE9+ï¼åç°ä»£æµè§å¨ã</li> |
| | | <li>æµè§å¨æ¸²æ SVG çæ§è½ä¸è¬ï¼è¿ä¸å¦ pngã</li> |
| | | </ul> |
| | | <p>ä½¿ç¨æ¥éª¤å¦ä¸ï¼</p> |
| | | <h3 id="-symbol-">ç¬¬ä¸æ¥ï¼å¼å
¥é¡¹ç®ä¸é¢çæç symbol 代ç ï¼</h3> |
| | | <pre><code class="language-html"><script src="./iconfont.js"></script> |
| | | </code></pre> |
| | | <h3 id="-css-">ç¬¬äºæ¥ï¼å å
¥éç¨ CSS 代ç ï¼å¼å
¥ä¸æ¬¡å°±è¡ï¼ï¼</h3> |
| | | <pre><code class="language-html"><style> |
| | | .icon { |
| | | width: 1em; |
| | | height: 1em; |
| | | vertical-align: -0.15em; |
| | | fill: currentColor; |
| | | overflow: hidden; |
| | | } |
| | | </style> |
| | | </code></pre> |
| | | <h3 id="-">ç¬¬ä¸æ¥ï¼æéç¸åºå¾æ å¹¶è·åç±»åï¼åºç¨äºé¡µé¢ï¼</h3> |
| | | <pre><code class="language-html"><svg class="icon" aria-hidden="true"> |
| | | <use xlink:href="#icon-xxx"></use> |
| | | </svg> |
| | | </code></pre> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | <script> |
| | | $(document).ready(function () { |
| | | $('.tab-container .content:first').show() |
| | | |
| | | $('#tabs li').click(function (e) { |
| | | var tabContent = $('.tab-container .content') |
| | | var index = $(this).index() |
| | | |
| | | if ($(this).hasClass('active')) { |
| | | return |
| | | } else { |
| | | $('#tabs li').removeClass('active') |
| | | $(this).addClass('active') |
| | | |
| | | tabContent.hide().eq(index).fadeIn() |
| | | } |
| | | }) |
| | | }) |
| | | </script> |
| | | </body> |
| | | </html> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @font-face {font-family: "iconfont"; |
| | | src: url('iconfont.eot?t=1614833736726'); /* IE9 */ |
| | | src: url('iconfont.eot?t=1614833736726#iefix') format('embedded-opentype'), /* IE6-IE8 */ |
| | | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAewAAsAAAAADuQAAAdgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCECgqPRI0IATYCJAMkCxQABCAFhG0HgRgbzAwRFaxTIPvqgDebctK2YsIVXhR2hagG9WP1vtcZPG76914gQNIUVpLKTAyZOFZzOhEJm8PmyGCm0JkIsi+uBAC4MZCJtxogwBL4pk2TlOD2ThqWEK6lHdeaZFt+0NcvlxIggOz/1lq9c+q9DQX7eNsQqWVmd0/mxHwQtUTGQyYkUW+UfITIo3ZTqc1LwWeI629cDQQAh7paI0bzcBvUUEDTE3SYOK6qFOqYA4oSFYHazOYcqQDZCCXUdA19AmCD+/nkG3RMDVAoGWjXGu00VaA/6/xGYuSkrALGBbk/HwBxPYAB0BqgEE2hXKsXMJA3w4DrrsBYAGl09DUp6/xc+Dzt8/TPjV+s+yL5jZRMpkfS5iJI0w3Yh1oWFKrRiPL3z2OhGVJIPrVODbBOkwudnwuwQQFjGmxgYUyHDRRGI6pABXyxzgYGxiSqgADfSL2gBABo7CPSAI2AbgSYfGgW4xwslBMxOj11FdMzRVEQREm3ZggoaifUy9Kci63fNEXfMGVGIuGIxx3RqC0as9ukRmT8SZIrd36cSMSH+tOzdBPMxsGxmJ3Pfix3rnMsNjl0ranflXHoeq2ARwpebeKTxf1XMr3ueSHieZ7HfHVzo1Pc6U5guVmlT/aWuct8VQFP/kUrvALn9hPiirgPAzteduE91a7IlEhU9nKc21wO8/z51/UKTUWxjT0+QA57qgnZ+WquE3AF+BaU4868qJ19vmmBnZfOZPpe2OKvMvznGnu3S76YfeHUU12LhMaozUQwnN3IEIEzXOYIyWip2xHX14snEtmBQweCwa3ipnghx7Q8T8JGXAXUH6o+JCVw5rmiXLE/QphAtScsUflwuTvdH+og5k/n3O/mrmpe6wmDunEpbtHmLXKHe/H8gTAg+3yejOxAM8H+Zhk/l3Pwmuu656p8xeH2yj5PwOW3pdafsv2F+1XdYtc19xXg1LrBF23sPRwMD9it2nUw/WA8gxygb0YKWQc+Ta4ByUis546+iALc/sOgW0mEFYsYmiOLKX4Px3uiZP/hTF9QQuWehAS2ZYQiC07dj+DlBLk8W8mxHl7xQbT9CfD93pF3OfclBt2NNdgdNd6Ll80f2tiwTjc6bdT8MgsssK36UbG1jeuGNA40ufQV2T6Dbnd+xNYmFaxXV3LkYrV9j5jGM0v7Td75849jML9UP1oUrT3XxoYX3ua8v5fBYJr0dFPD82/z3ry6eV8H7m0cxyzrN2nDz7oTuwy1Rk5v1G2rc41FsKypDDYRpLA9GJ4r6DgsCR0+fHIpVF9Vf9tFqqIXt/l5oUvBrvgvB1MTGok0YBtYe1AVIk9V9hHDTdqI1uS0sGsvlfCqwDvClgqR8XATWk1zWePXO5s59X4h8sL3TYyKsSF5qhcRwWVZ8hpWed7OA1rUa7K+34aNjMbwfmFi9LU/U+5SsX91U7LK8iYoGbLZz3bqnUyEcTZt/sUS0Sm2FFtymO6PvSmSS0qyG9sb9R8wZMigmzVeVp6y9VnRqdsJpWv58G6trW0cZaN7bZw2bVOvPRt6OU16bxxd1saRtdbwrheHZ92+b+9Teao6avJOQ4YOHHjEXMzhQ5v2fKqhXqfU81ob1uj5/bEvtb2UnfrvlZ5IZ01TyF1LZBouHffohyqN5qwR29v/iVRhrfrKDq5xb+tEtfosmq9tesLWw9bdzFmtPP596f3076Xvn+anMUYGrvORmLSSLbWUsrv5rA7dO2RxBil/DkZZWU3VnBc6tU5QCPVrtrvh5MayVozMmW3OwB8f7jAQc2Gh2dIRAeFe3BXxiobmzp6dS1sNr3el3rBWhvb9L0sO6Yr098z3cEiPtasU/f/qr3AolX8Zb6UY0D5IU874crnH+sdczoE7Ag2i049tLyp6+Puna9rbOxPLpMkW0hEBoWmXDvbgp7GH+V23Hze3pYsOHVoEHeUQurY1f3cw1Wb96CPTmap174clMgAknzJXmRIAoNfoSCAZcZxxsM1lf8S4AICZRw8yph19zrSif4Zy6JvHz1Y4/n+XN8Xa3r/t/0ta8a5zzWBKJOVEPwE1aBEhH/5hI9ScovhoNKdG8Rq7ybco0mAf1JQC4PRZwCMmkub9fk1SbeGZZpJCoFChDjBQo7FYIW8NSvDoDCzU6AccWhl0PA+96WBAFBoALa1gQKBzHChScR0Y6DxFQJC/B0qk+w5Y6GKAg4Poz8hD2jS6vM+oBR2YPyDLrTfccul1fMFQap2jGjf/A3NPaZhPZsmGZ2wx97FP/x0WIh585gae2PWwrhm6zAmtTKJId5hOfd6+E8vN4JIhoxa7vAPmj02WWz+3XKZy/4Kh1DqXjPhmf2DuafVgbmJWQ/xsaGuNOJfu/XdYEKIeeLE9N+CJfFjrtQy6/M0SWpmILWh3MKWZfF3DZHxTc60Nunyjane8ApMUzbAcT/p1H0sqFTo68og+kH3Hp6Ho9pduM7Y16TZzf0M4P5VCNpY7Q5q/xO5V4f+o28/fODLrxvP19jRocdxQo8/zdYH8PBgAAAAA') format('woff2'), |
| | | url('iconfont.woff?t=1614833736726') format('woff'), |
| | | url('iconfont.ttf?t=1614833736726') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ |
| | | url('iconfont.svg?t=1614833736726#iconfont') format('svg'); /* iOS 4.1- */ |
| | | } |
| | | |
| | | .iconfont { |
| | | font-family: "iconfont" !important; |
| | | font-size: 16px; |
| | | font-style: normal; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | } |
| | | |
| | | .icon-dashujukeshihuaico-:before { |
| | | content: "\e7ff"; |
| | | } |
| | | |
| | | .icon-guanxi:before { |
| | | content: "\e616"; |
| | | } |
| | | |
| | | .icon-renlianshibie1:before { |
| | | content: "\e78d"; |
| | | } |
| | | |
| | | .icon-tuichu:before { |
| | | content: "\e60d"; |
| | | } |
| | | |
| | | .icon-biaoqiankuozhan_xiaoxi-157:before { |
| | | content: "\eb15"; |
| | | } |
| | | |
| | | .icon-xiaoxi:before { |
| | | content: "\e612"; |
| | | } |
| | | |
| | | .icon-mima:before { |
| | | content: "\e644"; |
| | | } |
| | | |
| | | .icon-zhanghao:before { |
| | | content: "\666"; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | !function(c){var t,e,a,i,f,l,o='<svg><symbol id="icon-dashujukeshihuaico-" viewBox="0 0 1024 1024"><path d="M611.413333 516.693333a231.253333 231.253333 0 1 0-199.253333 0 441.173333 441.173333 0 0 0-341.333333 429.653334h882.773333a441.173333 441.173333 0 0 0-342.186667-429.653334z" fill="#ffffff" ></path><path d="M611.413333 516.693333a231.253333 231.253333 0 1 0-199.253333 0 441.173333 441.173333 0 0 0-341.333333 429.653334h882.773333a441.173333 441.173333 0 0 0-342.186667-429.653334z" fill="#ffffff" ></path><path d="M611.413333 516.693333a231.253333 231.253333 0 1 0-199.253333 0 441.173333 441.173333 0 0 0-341.333333 429.653334h882.773333a441.173333 441.173333 0 0 0-342.186667-429.653334z" fill="#ffffff" ></path><path d="M953.6 946.346667a441.173333 441.173333 0 0 0-341.333333-429.653334 229.546667 229.546667 0 0 0 11.093333-409.173333 228.693333 228.693333 0 0 0-32-3.413333 230.4 230.4 0 0 0-99.413333 438.613333 440.32 440.32 0 0 0-341.333334 403.2z" fill="#ffffff" ></path><path d="M653.653333 334.933333a230.4 230.4 0 0 1-131.413333 207.786667 441.173333 441.173333 0 0 1 341.333333 403.2h90.453334a441.173333 441.173333 0 0 0-341.333334-429.653333 229.546667 229.546667 0 0 0 11.093334-409.173334 228.266667 228.266667 0 0 0-32-3.413333 229.973333 229.973333 0 0 0-85.333334 15.786667 230.826667 230.826667 0 0 1 147.2 215.466666z" fill="#ffffff" ></path><path d="M104.96 206.08A135.68 135.68 0 0 0 31.146667 131.84a9.813333 9.813333 0 0 1 0-18.346667A135.68 135.68 0 0 0 104.96 39.253333a9.813333 9.813333 0 0 1 18.346667 0 135.68 135.68 0 0 0 74.24 74.24 9.813333 9.813333 0 0 1 0 18.346667 135.68 135.68 0 0 0-74.24 74.24 9.813333 9.813333 0 0 1-18.346667 0z" fill="#ffffff" ></path><path d="M905.813333 416a69.546667 69.546667 0 0 0-37.973333-37.973333 5.12 5.12 0 0 1 0-9.386667 69.546667 69.546667 0 0 0 37.973333-37.973333 5.12 5.12 0 0 1 9.386667 0 69.546667 69.546667 0 0 0 37.973333 37.973333 5.12 5.12 0 0 1 0 9.386667 69.546667 69.546667 0 0 0-37.973333 37.973333 5.12 5.12 0 0 1-9.386667 0z" fill="#ffffff" ></path><path d="M42.666667 672a69.546667 69.546667 0 0 0-37.973334-37.973333 5.12 5.12 0 0 1 0-9.386667 69.546667 69.546667 0 0 0 37.973334-38.4 5.12 5.12 0 0 1 9.386666 0 69.546667 69.546667 0 0 0 37.973334 37.973333 5.12 5.12 0 0 1 0 9.386667 69.546667 69.546667 0 0 0-37.973334 37.973333 5.12 5.12 0 0 1-9.386666 0.426667z" fill="#ffffff" ></path></symbol><symbol id="icon-guanxi" viewBox="0 0 1024 1024"><path d="M683.008 689.664c-4.608 0-9.216-2.048-13.312-5.632L336.384 350.72c-7.168-7.168-7.168-18.944 0-26.112 7.168-7.168 18.944-7.168 26.112 0l333.824 333.824c7.168 7.168 7.168 18.944 0 26.112-3.584 3.584-8.704 5.12-13.312 5.12z" fill="#686464" ></path><path d="M337.408 677.888c-4.608 0-9.216-2.048-13.312-5.632-7.168-7.168-7.168-18.944 0-26.112L657.92 312.32c7.168-7.168 18.944-7.168 26.112 0 7.168 7.168 7.168 18.944 0 26.112l-333.824 333.824c-3.584 4.096-8.192 5.632-12.8 5.632z" fill="#686464" ></path></symbol><symbol id="icon-renlianshibie1" viewBox="0 0 1024 1024"><path d="M298.666667 896H149.333333c-12.8 0-21.333333-8.533333-21.333333-21.333333V725.333333c0-25.6-17.066667-42.666667-42.666667-42.666666s-42.666667 17.066667-42.666666 42.666666v149.333334C42.666667 934.4 89.6 981.333333 149.333333 981.333333H298.666667c25.6 0 42.666667-17.066667 42.666666-42.666666s-17.066667-42.666667-42.666666-42.666667zM938.666667 682.666667c-25.6 0-42.666667 17.066667-42.666667 42.666666v149.333334c0 12.8-8.533333 21.333333-21.333333 21.333333H725.333333c-25.6 0-42.666667 17.066667-42.666666 42.666667s17.066667 42.666667 42.666666 42.666666h149.333334c59.733333 0 106.666667-46.933333 106.666666-106.666666V725.333333c0-25.6-17.066667-42.666667-42.666666-42.666666zM874.666667 42.666667H725.333333c-25.6 0-42.666667 17.066667-42.666666 42.666666s17.066667 42.666667 42.666666 42.666667h149.333334c12.8 0 21.333333 8.533333 21.333333 21.333333V298.666667c0 25.6 17.066667 42.666667 42.666667 42.666666s42.666667-17.066667 42.666666-42.666666V149.333333C981.333333 89.6 934.4 42.666667 874.666667 42.666667zM85.333333 341.333333c25.6 0 42.666667-17.066667 42.666667-42.666666V149.333333c0-12.8 8.533333-21.333333 21.333333-21.333333H298.666667c25.6 0 42.666667-17.066667 42.666666-42.666667s-17.066667-42.666667-42.666666-42.666666H149.333333C89.6 42.666667 42.666667 89.6 42.666667 149.333333V298.666667c0 25.6 17.066667 42.666667 42.666666 42.666666zM721.066667 661.333333c12.8-21.333333 4.266667-46.933333-17.066667-59.733333-21.333333-12.8-46.933333-4.266667-59.733333 17.066667 0 0-38.4 64-132.266667 64s-132.266667-59.733333-132.266667-64c-12.8-21.333333-38.4-25.6-59.733333-17.066667-21.333333 12.8-25.6 38.4-17.066667 59.733333 4.266667 4.266667 64 106.666667 209.066667 106.666667s204.8-102.4 209.066667-106.666667zM512 512c25.6 0 42.666667-17.066667 42.666667-42.666667V298.666667c0-25.6-17.066667-42.666667-42.666667-42.666667s-42.666667 17.066667-42.666667 42.666667v170.666666c0 25.6 17.066667 42.666667 42.666667 42.666667zM725.333333 384c25.6 0 42.666667-17.066667 42.666667-42.666667V298.666667c0-25.6-17.066667-42.666667-42.666667-42.666667s-42.666667 17.066667-42.666666 42.666667v42.666666c0 25.6 17.066667 42.666667 42.666666 42.666667zM298.666667 256c-25.6 0-42.666667 17.066667-42.666667 42.666667v42.666666c0 25.6 17.066667 42.666667 42.666667 42.666667s42.666667-17.066667 42.666666-42.666667V298.666667c0-25.6-17.066667-42.666667-42.666666-42.666667z" fill="#dfe5f4" ></path></symbol><symbol id="icon-tuichu" viewBox="0 0 1024 1024"><path d="M511.924148 1023.924148a470.660741 470.660741 0 0 1-184.395852-37.167407 471.115852 471.115852 0 0 1-150.679703-101.376A471.87437 471.87437 0 0 1 236.468148 166.381037a37.091556 37.091556 0 1 1 43.159704 59.998815 404.745481 404.745481 0 0 0-121.742222 139.339852 392.305778 392.305778 0 0 0-45.700741 185.078518c0 106.571852 41.604741 206.810074 117.077333 282.206815a397.349926 397.349926 0 0 0 282.661926 117.001482c106.68563 0 207.151407-41.528889 282.737778-117.001482a396.09837 396.09837 0 0 0 117.039407-282.244741c0.227556-64.474074-15.435852-128.037926-45.662814-185.040592a404.366222 404.366222 0 0 0-121.742223-139.188148 36.939852 36.939852 0 1 1 43.159704-60.074667 471.798519 471.798519 0 0 1 59.58163 719.075555A472.936296 472.936296 0 0 1 511.924148 1024v-0.075852z m11.150222-513.403259a37.015704 37.015704 0 0 1-37.091555-36.939852V35.384889a37.129481 37.129481 0 0 1 74.221037 0v438.196148a36.939852 36.939852 0 0 1-37.167408 36.939852z" fill="#ffffff" ></path></symbol><symbol id="icon-biaoqiankuozhan_xiaoxi-157" viewBox="0 0 1024 1024"><path d="M393.7792 876.1344c-7.3728 0-14.848-1.6384-21.8624-5.0176-17.7664-8.4992-28.8256-26.0096-28.7744-45.6704l0.1536-59.4944c0-3.4304-1.7408-5.7344-2.7648-6.7584-1.024-1.024-3.328-2.816-6.7584-2.816H172.1344c-27.8528 0-50.4832-22.6304-50.4832-50.4832v-436.736c0-27.8528 22.6304-50.4832 50.4832-50.4832h665.6c27.8528 0 50.4832 22.6304 50.4832 50.4832v436.736c0 27.8528-22.6304 50.4832-50.4832 50.4832h-275.712c-2.2016 0-4.3008 0.768-6.0416 2.1504L425.472 864.7168a49.9968 49.9968 0 0 1-31.6928 11.4176zM172.1344 259.584c-5.2736 0-9.5232 4.3008-9.5232 9.5232v436.736c0 5.2736 4.2496 9.5232 9.5232 9.5232h161.5872c13.5168 0 26.2144 5.2736 35.7376 14.848a50.176 50.176 0 0 1 14.7456 35.7888l-0.1536 59.4944c0 5.4272 3.7888 7.8336 5.4272 8.6528 1.6384 0.768 5.888 2.2528 10.1376-1.2288l130.5088-106.1888a50.43712 50.43712 0 0 1 31.8464-11.3152h275.712c5.2736 0 9.5232-4.2496 9.5232-9.5232v-436.736c0-5.2736-4.3008-9.5232-9.5232-9.5232H172.1344z m525.056 295.4752c-36.7104 0-66.56-29.8496-66.56-66.56s29.8496-66.56 66.56-66.56 66.56 29.8496 66.56 66.56-29.8496 66.56-66.56 66.56z m0-92.16c-14.1312 0-25.6 11.4688-25.6 25.6s11.4688 25.6 25.6 25.6 25.6-11.4688 25.6-25.6-11.52-25.6-25.6-25.6z m-195.0208 92.16c-36.7104 0-66.56-29.8496-66.56-66.56s29.8496-66.56 66.56-66.56 66.56 29.8496 66.56 66.56-29.8496 66.56-66.56 66.56z m0-92.16c-14.1312 0-25.6 11.4688-25.6 25.6s11.4688 25.6 25.6 25.6 25.6-11.4688 25.6-25.6-11.4688-25.6-25.6-25.6z m-194.9696 92.16c-36.7104 0-66.56-29.8496-66.56-66.56s29.8496-66.56 66.56-66.56 66.56 29.8496 66.56 66.56-29.9008 66.56-66.56 66.56z m0-92.16c-14.1312 0-25.6 11.4688-25.6 25.6s11.4688 25.6 25.6 25.6 25.6-11.4688 25.6-25.6-11.52-25.6-25.6-25.6z" fill="#ffffff" ></path></symbol><symbol id="icon-xiaoxi" viewBox="0 0 1024 1024"><path d="M621.6 761.4c0 50.5-43 89.8-96.6 89.8s-96.6-39.3-96.6-89.8h193.2m-32.2-523.9c0-33.7-27.9-59.9-64.4-59.9s-64.4 26.2-64.4 59.9v9.3c-88 28.1-161 117.8-161 222.7v82.3s0 117.8-32.2 119.7c-19.3 0-32.2 13.1-32.2 29.9 0 16.9 15 29.9 32.2 29.9h515.3c17.2 0 32.2-13.1 32.2-29.9 0-16.9-15-29.9-32.2-29.9-32.2 0-32.2-119.7-32.2-119.7v-82.3c0-104.7-68.7-192.7-161-222.7v-9.3" fill="#ffffff" ></path></symbol><symbol id="icon-mima" viewBox="0 0 1024 1024"><path d="M760.171097 415.494703 346.927843 415.494703l0-67.441135c0-91.90006 74.809514-166.709574 166.811913-166.709574 92.002399 0 166.811913 74.911853 166.811913 166.914251 0 12.485309 10.029182 22.514491 22.514491 22.514491s22.514491-10.029182 22.514491-22.514491c0-116.870678-95.072556-211.943234-211.840895-211.943234-56.593244 0-109.809314 22.002798-149.823706 62.01719-40.014391 40.014391-62.01719 93.128123-62.01719 149.721367L301.898861 415.494703l-47.485109 0c-27.631421 0-49.736558 22.105137-49.736558 49.634219l0 341.913252c0 27.631421 22.207476 50.452928 49.736558 50.452928l505.655007 0c27.631421 0 50.35059-22.821507 50.35059-50.452928L810.419348 465.128923C810.521687 437.59984 787.802518 415.494703 760.171097 415.494703zM765.492704 807.553868c0 2.763142-2.251449 5.014591-5.014591 5.014591L254.720768 812.568459c-2.763142 0-5.014591-2.251449-5.014591-5.014591L249.706176 465.538277c0-2.763142 2.251449-5.014591 5.014591-5.014591l505.655007 0c2.763142 0 5.014591 2.251449 5.014591 5.014591L765.390366 807.553868zM503.505896 532.160704c-25.482311 0-46.052369 20.570058-46.052369 46.052369 0 16.78353 9.005797 31.520288 22.514491 39.605037L479.968019 707.159704c0 12.38297 10.131521 22.514491 22.514491 22.514491s22.514491-10.131521 22.514491-22.514491l0-88.21587c14.634419-7.675395 24.561263-23.026184 24.561263-40.730762C549.558265 552.730762 528.988207 532.160704 503.505896 532.160704z" fill="#666666" ></path></symbol><symbol id="icon-zhanghao" viewBox="0 0 1024 1024"><path d="M828.1 722.4c-17.3-40.9-42-77.5-73.5-109s-68.2-56.2-109.1-73.5c-10.2-4.3-20.6-8.1-31-11.4 54.5-34.7 90.8-95.7 90.8-164.9 0-107.7-87.6-195.4-195.4-195.4-107.7 0-195.4 87.6-195.4 195.4 0 69.9 36.9 131.3 92.2 165.8-9.6 3.1-19 6.6-28.3 10.5-40.9 17.3-77.5 42-109 73.5s-56.2 68.2-73.5 109c-17.9 42.3-27 87.2-27 133.6h46c0-163.8 133.3-297.1 297.1-297.1S809.1 692.2 809.1 856h46c0-46.4-9.1-91.3-27-133.6zM360.6 363.5c0-82.4 67-149.4 149.4-149.4s149.4 67 149.4 149.4-67 149.4-149.4 149.4c-82.4-0.1-149.4-67.1-149.4-149.4z" fill="#666666" ></path></symbol></svg>',n=(n=document.getElementsByTagName("script"))[n.length-1].getAttribute("data-injectcss");if(n&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(c){console&&console.log(c)}}function s(){f||(f=!0,a())}t=function(){var c,t,e,a;(a=document.createElement("div")).innerHTML=o,o=null,(e=a.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",c=e,(t=document.body).firstChild?(a=c,(e=t.firstChild).parentNode.insertBefore(a,e)):t.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(e=function(){document.removeEventListener("DOMContentLoaded",e,!1),t()},document.addEventListener("DOMContentLoaded",e,!1)):document.attachEvent&&(a=t,i=c.document,f=!1,(l=function(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(l,50)}s()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,s())})}(window); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "id": "2399544", |
| | | "name": "vp", |
| | | "font_family": "iconfont", |
| | | "css_prefix_text": "icon-", |
| | | "description": "", |
| | | "glyphs": [ |
| | | { |
| | | "icon_id": "5920503", |
| | | "name": "ç¨æ·", |
| | | "font_class": "dashujukeshihuaico-", |
| | | "unicode": "e7ff", |
| | | "unicode_decimal": 59391 |
| | | }, |
| | | { |
| | | "icon_id": "14720218", |
| | | "name": "å
³é", |
| | | "font_class": "guanxi", |
| | | "unicode": "e616", |
| | | "unicode_decimal": 58902 |
| | | }, |
| | | { |
| | | "icon_id": "19984626", |
| | | "name": "人è¸è¯å«", |
| | | "font_class": "renlianshibie1", |
| | | "unicode": "e78d", |
| | | "unicode_decimal": 59277 |
| | | }, |
| | | { |
| | | "icon_id": "14843450", |
| | | "name": "éåº", |
| | | "font_class": "tuichu", |
| | | "unicode": "e60d", |
| | | "unicode_decimal": 58893 |
| | | }, |
| | | { |
| | | "icon_id": "16386636", |
| | | "name": "æ¶æ¯", |
| | | "font_class": "biaoqiankuozhan_xiaoxi-157", |
| | | "unicode": "eb15", |
| | | "unicode_decimal": 60181 |
| | | }, |
| | | { |
| | | "icon_id": "15954693", |
| | | "name": "æ¶æ¯", |
| | | "font_class": "xiaoxi", |
| | | "unicode": "e612", |
| | | "unicode_decimal": 58898 |
| | | }, |
| | | { |
| | | "icon_id": "1111451", |
| | | "name": "å¯ç ", |
| | | "font_class": "mima", |
| | | "unicode": "e644", |
| | | "unicode_decimal": 58948 |
| | | }, |
| | | { |
| | | "icon_id": "3851393", |
| | | "name": "è´¦å·", |
| | | "font_class": "zhanghao", |
| | | "unicode": "666", |
| | | "unicode_decimal": 1638 |
| | | } |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" standalone="no"?> |
| | | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
| | | <!-- |
| | | 2013-9-30: Created. |
| | | --> |
| | | <svg> |
| | | <metadata> |
| | | Created by iconfont |
| | | </metadata> |
| | | <defs> |
| | | |
| | | <font id="iconfont" horiz-adv-x="1024" > |
| | | <font-face |
| | | font-family="iconfont" |
| | | font-weight="500" |
| | | font-stretch="normal" |
| | | units-per-em="1024" |
| | | ascent="896" |
| | | descent="-128" |
| | | /> |
| | | <missing-glyph /> |
| | | |
| | | <glyph glyph-name="dashujukeshihuaico-" unicode="" d="M611.413333 379.30666699999995a231.253333 231.253333 0 1 1-199.253333 0 441.173333 441.173333 0 0 1-341.333333-429.653334h882.773333a441.173333 441.173333 0 0 1-342.186667 429.653334zM611.413333 379.30666699999995a231.253333 231.253333 0 1 1-199.253333 0 441.173333 441.173333 0 0 1-341.333333-429.653334h882.773333a441.173333 441.173333 0 0 1-342.186667 429.653334zM611.413333 379.30666699999995a231.253333 231.253333 0 1 1-199.253333 0 441.173333 441.173333 0 0 1-341.333333-429.653334h882.773333a441.173333 441.173333 0 0 1-342.186667 429.653334zM953.6-50.346667000000025a441.173333 441.173333 0 0 1-341.333333 429.653334 229.546667 229.546667 0 0 1 11.093333 409.173333 228.693333 228.693333 0 0 1-32 3.413333 230.4 230.4 0 0 1-99.413333-438.613333 440.32 440.32 0 0 1-341.333334-403.2zM653.653333 561.066667a230.4 230.4 0 0 0-131.413333-207.786667 441.173333 441.173333 0 0 0 341.333333-403.2h90.453334a441.173333 441.173333 0 0 1-341.333334 429.653333 229.546667 229.546667 0 0 1 11.093334 409.173334 228.266667 228.266667 0 0 1-32 3.413333 229.973333 229.973333 0 0 1-85.333334-15.786667 230.826667 230.826667 0 0 0 147.2-215.466666zM104.96 689.92A135.68 135.68 0 0 1 31.146667 764.16a9.813333 9.813333 0 0 0 0 18.346667A135.68 135.68 0 0 1 104.96 856.746667a9.813333 9.813333 0 0 0 18.346667 0 135.68 135.68 0 0 1 74.24-74.24 9.813333 9.813333 0 0 0 0-18.346667 135.68 135.68 0 0 1-74.24-74.24 9.813333 9.813333 0 0 0-18.346667 0zM905.813333 480a69.546667 69.546667 0 0 1-37.973333 37.973333 5.12 5.12 0 0 0 0 9.386667 69.546667 69.546667 0 0 1 37.973333 37.973333 5.12 5.12 0 0 0 9.386667 0 69.546667 69.546667 0 0 1 37.973333-37.973333 5.12 5.12 0 0 0 0-9.386667 69.546667 69.546667 0 0 1-37.973333-37.973333 5.12 5.12 0 0 0-9.386667 0zM42.666667 224a69.546667 69.546667 0 0 1-37.973334 37.973333 5.12 5.12 0 0 0 0 9.386667 69.546667 69.546667 0 0 1 37.973334 38.4 5.12 5.12 0 0 0 9.386666 0 69.546667 69.546667 0 0 1 37.973334-37.973333 5.12 5.12 0 0 0 0-9.386667 69.546667 69.546667 0 0 1-37.973334-37.973333 5.12 5.12 0 0 0-9.386666-0.426667z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="guanxi" unicode="" d="M683.008 206.336c-4.608 0-9.216 2.048-13.312 5.632L336.384 545.28c-7.168 7.168-7.168 18.944 0 26.112 7.168 7.168 18.944 7.168 26.112 0l333.824-333.824c7.168-7.168 7.168-18.944 0-26.112-3.584-3.584-8.704-5.12-13.312-5.12zM337.408 218.11199999999997c-4.608 0-9.216 2.048-13.312 5.632-7.168 7.168-7.168 18.944 0 26.112L657.92 583.6800000000001c7.168 7.168 18.944 7.168 26.112 0 7.168-7.168 7.168-18.944 0-26.112l-333.824-333.824c-3.584-4.096-8.192-5.632-12.8-5.632z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="renlianshibie1" unicode="" d="M298.666667 0H149.333333c-12.8 0-21.333333 8.533333-21.333333 21.333333V170.66666699999996c0 25.6-17.066667 42.666667-42.666667 42.666666s-42.666667-17.066667-42.666666-42.666666v-149.333334C42.666667-38.39999999999998 89.6-85.33333300000004 149.333333-85.33333300000004H298.666667c25.6 0 42.666667 17.066667 42.666666 42.666666s-17.066667 42.666667-42.666666 42.666667zM938.666667 213.33333300000004c-25.6 0-42.666667-17.066667-42.666667-42.666666v-149.333334c0-12.8-8.533333-21.333333-21.333333-21.333333H725.333333c-25.6 0-42.666667-17.066667-42.666666-42.666667s17.066667-42.666667 42.666666-42.666666h149.333334c59.733333 0 106.666667 46.933333 106.666666 106.666666V170.66666699999996c0 25.6-17.066667 42.666667-42.666666 42.666666zM874.666667 853.333333H725.333333c-25.6 0-42.666667-17.066667-42.666666-42.666666s17.066667-42.666667 42.666666-42.666667h149.333334c12.8 0 21.333333-8.533333 21.333333-21.333333V597.333333c0-25.6 17.066667-42.666667 42.666667-42.666666s42.666667 17.066667 42.666666 42.666666V746.666667C981.333333 806.4 934.4 853.333333 874.666667 853.333333zM85.333333 554.666667c25.6 0 42.666667 17.066667 42.666667 42.666666V746.666667c0 12.8 8.533333 21.333333 21.333333 21.333333H298.666667c25.6 0 42.666667 17.066667 42.666666 42.666667s-17.066667 42.666667-42.666666 42.666666H149.333333C89.6 853.333333 42.666667 806.4 42.666667 746.666667V597.333333c0-25.6 17.066667-42.666667 42.666666-42.666666zM721.066667 234.66666699999996c12.8 21.333333 4.266667 46.933333-17.066667 59.733333-21.333333 12.8-46.933333 4.266667-59.733333-17.066667 0 0-38.4-64-132.266667-64s-132.266667 59.733333-132.266667 64c-12.8 21.333333-38.4 25.6-59.733333 17.066667-21.333333-12.8-25.6-38.4-17.066667-59.733333 4.266667-4.266667 64-106.666667 209.066667-106.666667s204.8 102.4 209.066667 106.666667zM512 384c25.6 0 42.666667 17.066667 42.666667 42.666667V597.333333c0 25.6-17.066667 42.666667-42.666667 42.666667s-42.666667-17.066667-42.666667-42.666667v-170.666666c0-25.6 17.066667-42.666667 42.666667-42.666667zM725.333333 512c25.6 0 42.666667 17.066667 42.666667 42.666667V597.333333c0 25.6-17.066667 42.666667-42.666667 42.666667s-42.666667-17.066667-42.666666-42.666667v-42.666666c0-25.6 17.066667-42.666667 42.666666-42.666667zM298.666667 640c-25.6 0-42.666667-17.066667-42.666667-42.666667v-42.666666c0-25.6 17.066667-42.666667 42.666667-42.666667s42.666667 17.066667 42.666666 42.666667V597.333333c0 25.6-17.066667 42.666667-42.666666 42.666667z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="tuichu" unicode="" d="M511.924148-127.92414799999995a470.660741 470.660741 0 0 0-184.395852 37.167407 471.115852 471.115852 0 0 0-150.679703 101.376A471.87437 471.87437 0 0 0 236.468148 729.618963a37.091556 37.091556 0 1 0 43.159704-59.998815 404.745481 404.745481 0 0 1-121.742222-139.339852 392.305778 392.305778 0 0 1-45.700741-185.078518c0-106.571852 41.604741-206.810074 117.077333-282.206815a397.349926 397.349926 0 0 1 282.661926-117.001482c106.68563 0 207.151407 41.528889 282.737778 117.001482a396.09837 396.09837 0 0 1 117.039407 282.244741c0.227556 64.474074-15.435852 128.037926-45.662814 185.040592a404.366222 404.366222 0 0 1-121.742223 139.188148 36.939852 36.939852 0 1 0 43.159704 60.074667 471.798519 471.798519 0 0 0 59.58163-719.075555A472.936296 472.936296 0 0 0 511.924148-128v0.075852z m11.150222 513.403259a37.015704 37.015704 0 0 0-37.091555 36.939852V860.615111a37.129481 37.129481 0 0 0 74.221037 0v-438.196148a36.939852 36.939852 0 0 0-37.167408-36.939852z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="biaoqiankuozhan_xiaoxi-157" unicode="" d="M393.7792 19.865599999999972c-7.3728 0-14.848 1.6384-21.8624 5.0176-17.7664 8.4992-28.8256 26.0096-28.7744 45.6704l0.1536 59.4944c0 3.4304-1.7408 5.7344-2.7648 6.7584-1.024 1.024-3.328 2.816-6.7584 2.816H172.1344c-27.8528 0-50.4832 22.6304-50.4832 50.4832v436.736c0 27.8528 22.6304 50.4832 50.4832 50.4832h665.6c27.8528 0 50.4832-22.6304 50.4832-50.4832v-436.736c0-27.8528-22.6304-50.4832-50.4832-50.4832h-275.712c-2.2016 0-4.3008-0.768-6.0416-2.1504L425.472 31.283199999999965a49.9968 49.9968 0 0 0-31.6928-11.4176zM172.1344 636.4159999999999c-5.2736 0-9.5232-4.3008-9.5232-9.5232v-436.736c0-5.2736 4.2496-9.5232 9.5232-9.5232h161.5872c13.5168 0 26.2144-5.2736 35.7376-14.848a50.176 50.176 0 0 0 14.7456-35.7888l-0.1536-59.4944c0-5.4272 3.7888-7.8336 5.4272-8.6528 1.6384-0.768 5.888-2.2528 10.1376 1.2288l130.5088 106.1888a50.43712 50.43712 0 0 0 31.8464 11.3152h275.712c5.2736 0 9.5232 4.2496 9.5232 9.5232v436.736c0 5.2736-4.3008 9.5232-9.5232 9.5232H172.1344z m525.056-295.4752c-36.7104 0-66.56 29.8496-66.56 66.56s29.8496 66.56 66.56 66.56 66.56-29.8496 66.56-66.56-29.8496-66.56-66.56-66.56z m0 92.16c-14.1312 0-25.6-11.4688-25.6-25.6s11.4688-25.6 25.6-25.6 25.6 11.4688 25.6 25.6-11.52 25.6-25.6 25.6z m-195.0208-92.16c-36.7104 0-66.56 29.8496-66.56 66.56s29.8496 66.56 66.56 66.56 66.56-29.8496 66.56-66.56-29.8496-66.56-66.56-66.56z m0 92.16c-14.1312 0-25.6-11.4688-25.6-25.6s11.4688-25.6 25.6-25.6 25.6 11.4688 25.6 25.6-11.4688 25.6-25.6 25.6z m-194.9696-92.16c-36.7104 0-66.56 29.8496-66.56 66.56s29.8496 66.56 66.56 66.56 66.56-29.8496 66.56-66.56-29.9008-66.56-66.56-66.56z m0 92.16c-14.1312 0-25.6-11.4688-25.6-25.6s11.4688-25.6 25.6-25.6 25.6 11.4688 25.6 25.6-11.52 25.6-25.6 25.6z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="xiaoxi" unicode="" d="M621.6 134.60000000000002c0-50.5-43-89.8-96.6-89.8s-96.6 39.3-96.6 89.8h193.2m-32.2 523.9c0 33.7-27.9 59.9-64.4 59.9s-64.4-26.2-64.4-59.9v-9.3c-88-28.1-161-117.8-161-222.7v-82.3s0-117.8-32.2-119.7c-19.3 0-32.2-13.1-32.2-29.9 0-16.9 15-29.9 32.2-29.9h515.3c17.2 0 32.2 13.1 32.2 29.9 0 16.9-15 29.9-32.2 29.9-32.2 0-32.2 119.7-32.2 119.7v82.3c0 104.7-68.7 192.7-161 222.7v9.3" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="mima" unicode="" d="M760.171097 480.505297L346.927843 480.505297l0 67.441135c0 91.90006 74.809514 166.709574 166.811913 166.709574 92.002399 0 166.811913-74.911853 166.811913-166.914251 0-12.485309 10.029182-22.514491 22.514491-22.514491s22.514491 10.029182 22.514491 22.514491c0 116.870678-95.072556 211.943234-211.840895 211.943234-56.593244 0-109.809314-22.002798-149.823706-62.01719-40.014391-40.014391-62.01719-93.128123-62.01719-149.721367L301.898861 480.505297l-47.485109 0c-27.631421 0-49.736558-22.105137-49.736558-49.634219l0-341.913252c0-27.631421 22.207476-50.452928 49.736558-50.452928l505.655007 0c27.631421 0 50.35059 22.821507 50.35059 50.452928L810.419348 430.871077C810.521687 458.40016 787.802518 480.505297 760.171097 480.505297zM765.492704 88.44613200000003c0-2.763142-2.251449-5.014591-5.014591-5.014591L254.720768 83.43154100000004c-2.763142 0-5.014591 2.251449-5.014591 5.014591L249.706176 430.461723c0 2.763142 2.251449 5.014591 5.014591 5.014591l505.655007 0c2.763142 0 5.014591-2.251449 5.014591-5.014591L765.390366 88.44613200000003zM503.505896 363.839296c-25.482311 0-46.052369-20.570058-46.052369-46.052369 0-16.78353 9.005797-31.520288 22.514491-39.605037L479.968019 188.84029599999997c0-12.38297 10.131521-22.514491 22.514491-22.514491s22.514491 10.131521 22.514491 22.514491l0 88.21587c14.634419 7.675395 24.561263 23.026184 24.561263 40.730762C549.558265 343.269238 528.988207 363.839296 503.505896 363.839296z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | <glyph glyph-name="zhanghao" unicode="٦" d="M828.1 173.60000000000002c-17.3 40.9-42 77.5-73.5 109s-68.2 56.2-109.1 73.5c-10.2 4.3-20.6 8.1-31 11.4 54.5 34.7 90.8 95.7 90.8 164.9 0 107.7-87.6 195.4-195.4 195.4-107.7 0-195.4-87.6-195.4-195.4 0-69.9 36.9-131.3 92.2-165.8-9.6-3.1-19-6.6-28.3-10.5-40.9-17.3-77.5-42-109-73.5s-56.2-68.2-73.5-109c-17.9-42.3-27-87.2-27-133.6h46c0 163.8 133.3 297.1 297.1 297.1S809.1 203.79999999999995 809.1 40h46c0 46.4-9.1 91.3-27 133.6zM360.6 532.5c0 82.4 67 149.4 149.4 149.4s149.4-67 149.4-149.4-67-149.4-149.4-149.4c-82.4 0.1-149.4 67.1-149.4 149.4z" horiz-adv-x="1024" /> |
| | | |
| | | |
| | | |
| | | |
| | | </font> |
| | | </defs></svg> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* ç°ä»£ååå°ç®¡çç³»ç»ä¸»é¢æ ·å¼ */ |
| | | |
| | | /* ========== è²å½©è§è ========== */ |
| | | :root { |
| | | /* 主è²è° */ |
| | | --primary-color: #1890ff; |
| | | --primary-light: #40a9ff; |
| | | --primary-dark: #096dd9; |
| | | |
| | | /* è¾
å©è² */ |
| | | --success-color: #52c41a; |
| | | --warning-color: #faad14; |
| | | --error-color: #ff4d4f; |
| | | --info-color: #1890ff; |
| | | |
| | | /* 䏿§è² */ |
| | | --text-primary: #262626; |
| | | --text-secondary: #595959; |
| | | --text-disabled: #bfbfbf; |
| | | --text-white: #ffffff; |
| | | |
| | | /* èæ¯è² */ |
| | | --bg-primary: #ffffff; |
| | | --bg-secondary: #fafafa; |
| | | --bg-tertiary: #f5f5f5; |
| | | --bg-dark: #001529; |
| | | --bg-sidebar: #001529; |
| | | --bg-header: #ffffff; |
| | | |
| | | /* è¾¹æ¡è² */ |
| | | --border-color: #d9d9d9; |
| | | --border-light: #f0f0f0; |
| | | --border-dark: #434343; |
| | | |
| | | /* é´å½± */ |
| | | --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); |
| | | --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 1px 3px rgba(0, 0, 0, 0.06); |
| | | --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05); |
| | | --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04); |
| | | |
| | | /* åè§ */ |
| | | --radius-sm: 4px; |
| | | --radius-md: 6px; |
| | | --radius-lg: 8px; |
| | | --radius-xl: 12px; |
| | | |
| | | /* é´è· */ |
| | | --spacing-xs: 4px; |
| | | --spacing-sm: 8px; |
| | | --spacing-md: 16px; |
| | | --spacing-lg: 24px; |
| | | --spacing-xl: 32px; |
| | | --spacing-xxl: 48px; |
| | | } |
| | | |
| | | /* ========== å
¨å±æ ·å¼éç½® ========== */ |
| | | * { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | body { |
| | | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif; |
| | | line-height: 1.5715; |
| | | color: var(--text-primary); |
| | | background-color: var(--bg-secondary); |
| | | margin: 0; |
| | | padding: 0; |
| | | } |
| | | |
| | | /* ========== å¡çæ ·å¼ ========== */ |
| | | .modern-card { |
| | | background: var(--bg-primary); |
| | | border-radius: var(--radius-lg); |
| | | box-shadow: var(--shadow-md); |
| | | border: 1px solid var(--border-light); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | .modern-card:hover { |
| | | box-shadow: var(--shadow-lg); |
| | | transform: translateY(-2px); |
| | | } |
| | | |
| | | /* ========== æé®æ ·å¼å¢å¼º ========== */ |
| | | .modern-btn { |
| | | border-radius: var(--radius-md); |
| | | font-weight: 500; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | border: none; |
| | | cursor: pointer; |
| | | display: inline-flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | gap: var(--spacing-sm); |
| | | } |
| | | |
| | | .modern-btn:hover { |
| | | transform: translateY(-1px); |
| | | box-shadow: var(--shadow-md); |
| | | } |
| | | |
| | | .modern-btn-primary { |
| | | background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-light) 100%); |
| | | color: var(--text-white); |
| | | } |
| | | |
| | | .modern-btn-primary:hover { |
| | | background: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 100%); |
| | | } |
| | | |
| | | .modern-btn-success { |
| | | background: linear-gradient(135deg, var(--success-color) 0%, #73d13d 100%); |
| | | color: var(--text-white); |
| | | } |
| | | |
| | | .modern-btn-warning { |
| | | background: linear-gradient(135deg, var(--warning-color) 0%, #ffc53d 100%); |
| | | color: var(--text-white); |
| | | } |
| | | |
| | | .modern-btn-danger { |
| | | background: linear-gradient(135deg, var(--error-color) 0%, #ff7875 100%); |
| | | color: var(--text-white); |
| | | } |
| | | |
| | | /* ========== è¡¨åæ ·å¼å¢å¼º ========== */ |
| | | .modern-form-item { |
| | | margin-bottom: var(--spacing-lg); |
| | | } |
| | | |
| | | .modern-input { |
| | | border-radius: var(--radius-md); |
| | | border: 1px solid var(--border-color); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | padding: var(--spacing-sm) var(--spacing-md); |
| | | } |
| | | |
| | | .modern-input:focus { |
| | | border-color: var(--primary-color); |
| | | box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); |
| | | outline: none; |
| | | } |
| | | |
| | | /* ========== è¡¨æ ¼æ ·å¼å¢å¼º ========== */ |
| | | .modern-table { |
| | | background: var(--bg-primary); |
| | | border-radius: var(--radius-lg); |
| | | overflow: hidden; |
| | | box-shadow: var(--shadow-sm); |
| | | } |
| | | |
| | | .modern-table .el-table__header { |
| | | background: var(--bg-tertiary); |
| | | } |
| | | |
| | | .modern-table .el-table__header th { |
| | | background: var(--bg-tertiary); |
| | | color: var(--text-primary); |
| | | font-weight: 600; |
| | | border-bottom: 2px solid var(--border-light); |
| | | } |
| | | |
| | | .modern-table .el-table__row:hover { |
| | | background: rgba(24, 144, 255, 0.04); |
| | | } |
| | | |
| | | /* ========== å¯¼èªæ ·å¼å¢å¼º ========== */ |
| | | .modern-sidebar { |
| | | background: var(--bg-sidebar); |
| | | box-shadow: var(--shadow-lg); |
| | | } |
| | | |
| | | .modern-sidebar .el-menu { |
| | | background: transparent; |
| | | border: none; |
| | | } |
| | | |
| | | .modern-sidebar .el-menu-item { |
| | | color: rgba(255, 255, 255, 0.65); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | border-radius: var(--radius-md); |
| | | margin: var(--spacing-xs) var(--spacing-md); |
| | | width: calc(100% - 32px); |
| | | } |
| | | |
| | | .modern-sidebar .el-menu-item:hover { |
| | | color: var(--text-white); |
| | | background: rgba(255, 255, 255, 0.1); |
| | | transform: translateX(4px); |
| | | } |
| | | |
| | | .modern-sidebar .el-menu-item.is-active { |
| | | color: var(--text-white); |
| | | background: var(--primary-color); |
| | | box-shadow: var(--shadow-md); |
| | | } |
| | | |
| | | .modern-header { |
| | | background: var(--bg-header); |
| | | box-shadow: var(--shadow-sm); |
| | | border-bottom: 1px solid var(--border-light); |
| | | } |
| | | |
| | | /* ========== å¨ç»ææ ========== */ |
| | | @keyframes fadeInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(30px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeInLeft { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateX(-30px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateX(0); |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeInRight { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateX(30px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateX(0); |
| | | } |
| | | } |
| | | |
| | | .fade-in-up { |
| | | animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | .fade-in-left { |
| | | animation: fadeInLeft 0.6s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | .fade-in-right { |
| | | animation: fadeInRight 0.6s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | /* ========== å·¥å
·ç±» ========== */ |
| | | .text-center { text-align: center; } |
| | | .text-left { text-align: left; } |
| | | .text-right { text-align: right; } |
| | | |
| | | .flex { display: flex; } |
| | | .flex-center { display: flex; align-items: center; justify-content: center; } |
| | | .flex-between { display: flex; align-items: center; justify-content: space-between; } |
| | | .flex-column { display: flex; flex-direction: column; } |
| | | |
| | | .mt-sm { margin-top: var(--spacing-sm); } |
| | | .mt-md { margin-top: var(--spacing-md); } |
| | | .mt-lg { margin-top: var(--spacing-lg); } |
| | | .mt-xl { margin-top: var(--spacing-xl); } |
| | | |
| | | .mb-sm { margin-bottom: var(--spacing-sm); } |
| | | .mb-md { margin-bottom: var(--spacing-md); } |
| | | .mb-lg { margin-bottom: var(--spacing-lg); } |
| | | .mb-xl { margin-bottom: var(--spacing-xl); } |
| | | |
| | | .p-sm { padding: var(--spacing-sm); } |
| | | .p-md { padding: var(--spacing-md); } |
| | | .p-lg { padding: var(--spacing-lg); } |
| | | .p-xl { padding: var(--spacing-xl); } |
| | | |
| | | /* ========== ååºå¼è®¾è®¡ ========== */ |
| | | @media (max-width: 768px) { |
| | | :root { |
| | | --spacing-md: 12px; |
| | | --spacing-lg: 16px; |
| | | --spacing-xl: 24px; |
| | | } |
| | | |
| | | .modern-card { |
| | | margin: var(--spacing-md); |
| | | border-radius: var(--radius-md); |
| | | } |
| | | } |
| | | |
| | | /* ========== æ»å¨æ¡æ ·å¼ ========== */ |
| | | ::-webkit-scrollbar { |
| | | width: 6px; |
| | | height: 6px; |
| | | } |
| | | |
| | | ::-webkit-scrollbar-track { |
| | | background: var(--bg-tertiary); |
| | | border-radius: var(--radius-sm); |
| | | } |
| | | |
| | | ::-webkit-scrollbar-thumb { |
| | | background: var(--border-color); |
| | | border-radius: var(--radius-sm); |
| | | } |
| | | |
| | | ::-webkit-scrollbar-thumb:hover { |
| | | background: var(--text-disabled); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="pagination"> |
| | | <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page.page" :page-sizes="pageSizes" :page-size="page.limit" layout="total, sizes, prev, pager, next, jumper" :total="total"> |
| | | </el-pagination> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | props: { |
| | | total: { |
| | | type: Number, |
| | | default: () => { } |
| | | }, |
| | | pageSizes: { |
| | | type: Array, |
| | | default: () => { |
| | | return [5, 10, 20, 100] |
| | | } |
| | | } |
| | | }, |
| | | data () { |
| | | return { |
| | | page: { |
| | | page: 1, |
| | | limit: 20 |
| | | } |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | Page (val) { |
| | | this.page.page = val |
| | | }, |
| | | handleSizeChange (val) { |
| | | this.page.limit = val |
| | | this.$emit('pageChange', this.page) |
| | | }, |
| | | handleCurrentChange (val) { |
| | | this.page.page = val |
| | | this.$emit('pageChange', this.page) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .pagination { |
| | | float: right; |
| | | padding: 1% 4% 2% 0px; |
| | | } |
| | | ::v-deep .el-pagination .el-select .el-input { |
| | | width: 110px; |
| | | } |
| | | </style> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <!-- 主å表 -->
|
| | | <el-table :data='tableData' :height='tableHeight' :show-header='showHeader' stripe @expand-change="expandSelect"
|
| | | :expand-row-keys="expands" @cell-click="handleCellClick" :empty-text="$t('common.noData')" class='el_tab_alage'
|
| | | :header-cell-style="cellHeaderStyle" :row-key='getRowKeys' @selection-change="handleSelectionChange">
|
| | | <!-- åéæ¡ -->
|
| | | <el-table-column align="center" width="50" label=""
|
| | | v-if="tableSelection.key === true && tableSelection.type === 'radio'">
|
| | | <template slot-scope="scope">
|
| | | <el-radio :label="scope.$index" v-model="radio"
|
| | | @change="handleTemplateRow(scope.$index, scope.row)"> </el-radio>
|
| | | </template>
|
| | | </el-table-column>
|
| | | <!-- indexç´¢å¼ -->
|
| | | <el-table-column label="åºå·" type="index" width="50" align="center"
|
| | | v-if="tableSelection.key === true && tableSelection.type === 'index'"></el-table-column>
|
| | | <!-- å¤éæ¡ -->
|
| | | <el-table-column type="selection" width="50" align="center"
|
| | | v-if="tableSelection.key === true && tableSelection.type === 'selection'"></el-table-column>
|
| | | <!-- å表表头-->
|
| | | <el-table-column type="expand" v-if="tableSelection.key === true && tableSelection.type === 'expand'">
|
| | | <template slot-scope="scope">
|
| | | <el-form label-position="left" inline class="demo-table-expand">
|
| | | <el-form-item :label="index.label" v-for="(index, item) in tableLabel" :key='item'
|
| | | v-show="index.type === 'expand'">
|
| | | <span>{{ scope.row[index.list] }}</span>
|
| | | </el-form-item>
|
| | | </el-form>
|
| | | </template>
|
| | | </el-table-column>
|
| | | <template v-for="(index, item) in tableLabel">
|
| | | <el-table-column fit :align='index.tableAlign ? index.tableAlign : "center"' :key='item' :sortable='index.sort'
|
| | | v-if="index.type !== 'expand'" :label="index.label" :width="index.width"
|
| | | :show-overflow-tooltip="index.overflowShow === 'hidden' ? true : false" :prop="index.list">
|
| | | <template slot-scope="scope">
|
| | | <!-- å¾ç -->
|
| | | <template v-if="index.type === 'image'">
|
| | | <el-image v-if="scope.row[index.list] !== ''" style="width: 100px; height: 50px;"
|
| | | :src="scope.row[index.list]">
|
| | | </el-image>
|
| | | <div v-else></div>
|
| | | </template>
|
| | | <!-- 产åå¾ç -->
|
| | | <template v-if="index.type === 'productImage'">
|
| | | <el-image v-if="scope.row[index.list] !== ''" style="width: 100px; height: 50px;"
|
| | | :src="getProductImageUrl(scope.row[index.list])">
|
| | | </el-image>
|
| | | <div v-else></div>
|
| | | </template>
|
| | | <!-- 头å -->
|
| | | <template v-else-if="index.type === 'head'">
|
| | | <el-image v-if="!(scope.row[index.list] === '' || scope.row[index.list] === null)"
|
| | | style="width: 50px; height: 50px;" :src="scope.row[index.list]">
|
| | | </el-image>
|
| | | <div v-else></div>
|
| | | </template>
|
| | | <!-- æé® -->
|
| | | <template v-else-if="index.type === 'btn'">
|
| | | <el-button type="text" @click.native.prevent="index.method(scope.row, scope)">
|
| | | <u>{{ scope.row[index.list] }}</u>
|
| | | </el-button>
|
| | | </template>
|
| | | <!-- 䏿 -->
|
| | | <template v-else-if="index.type === 'select'">
|
| | | <el-select v-model="scope.row[index.list]" @change="changeType($event, scope.row, item)" size="medium">
|
| | | <el-option v-for="item in index.options" :key="item.value" :label="item.label" :value="item.value">
|
| | | </el-option>
|
| | | </el-select>
|
| | | </template>
|
| | | <!-- å¼å
³æé® -->
|
| | | <template v-else-if="index.type === 'switch'">
|
| | | <div v-if="index.noSwitch(scope.row)">
|
| | | <el-switch @change="index.method(scope.row, scope)" v-model="scope.row[index.list]"
|
| | | :inactive-value="index.offValue !== null ? index.offValue : 'off'"
|
| | | :active-value="index.onValue ? index.onValue : 'on'" :inactive-text="index.offText ? index.offText : ''"
|
| | | :active-text="index.onText ? index.onText : ''"
|
| | | :inactive-color="index.offColor ? index.offColor : '#ff4949'"
|
| | | :active-color="index.onColor ? index.onColor : '#13ce66'"></el-switch>
|
| | | </div>
|
| | | </template>
|
| | | <!-- å
容èªå®ä¹ -->
|
| | | <template v-else-if="index.type === 'html'">
|
| | | <div v-html="index.code(scope.row)" class="theHtml"></div>
|
| | | </template>
|
| | | <!-- æ£å¸¸æ¾ç¤º -->
|
| | | <template v-else>
|
| | | <!-- {{scope.row[index.list]}} -->
|
| | | {{ scope.row[index.list] ? scope.row[index.list] : '-' }}
|
| | | </template>
|
| | | </template>
|
| | | </el-table-column>
|
| | | </template>
|
| | | <!-- æ£å¸¸æé®æä½ -->
|
| | | <el-table-column v-if="tableOption.value !== undefined" fit
|
| | | :align='tableOption.align ? tableOption.align : "center"' :label="tableOption.label"
|
| | | :fixed="tableOption.fixed ? tableOption.fixed : false" :width="tableOption.width">
|
| | | <template style="margin-left: 30px;" slot-scope="scope">
|
| | | <el-button v-for="(value, item) in filteredOptions(scope.row)" :key='item'
|
| | | :disabled="value.disabled ? value.disabled(scope.row) : false" :type="value.type ? value.type : 'text'"
|
| | | :style="value.style ? value.style : {}" :plain='value.plain ? value.plain : false'
|
| | | :round='value.round ? value.round : false' :size='value.size ? value.size : "medium"' :icon="value.icon"
|
| | | @click.native.prevent="value.method(scope.row, scope)">{{ value.label }}
|
| | | </el-button>
|
| | | <el-popover placement="top" trigger="hover"
|
| | | v-if="tableOption.isShowMore ? tableOption.isShowMore(scope.row) : false">
|
| | | <div class="popover-content">
|
| | | <el-button class="popover-button" v-for="(value, item) in filteredPopoverOptions(scope.row)" :key='item'
|
| | | :disabled="value.disabled ? value.disabled(scope.row) : false" :type="value.type ? value.type : 'info'"
|
| | | :style="value.style ? value.style : {}" :size='value.size ? value.size : "mini"'
|
| | | @click.native.prevent="value.method(scope.row, scope)">{{ value.label }}
|
| | | </el-button>
|
| | | </div>
|
| | | <el-button slot="reference" type="text"
|
| | | :style="tableOption.buttonStyle ? tableOption.buttonStyle : {}">{{ tableOption.buttonText }}</el-button>
|
| | | </el-popover>
|
| | | </template>
|
| | | </el-table-column>
|
| | | </el-table>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | export default {
|
| | | data () {
|
| | | return {
|
| | | radio: '',
|
| | | cellHeaderStyle: {
|
| | | fontSize: "16px",
|
| | | color: "#606266"
|
| | | },
|
| | | expands: [],
|
| | | getRowKeys (row) {
|
| | | return row.id
|
| | | }
|
| | | }
|
| | | },
|
| | | props: {
|
| | | tableData: {
|
| | | type: Array,
|
| | | default: () => { }
|
| | | },
|
| | | tableHeight: {
|
| | | type: Number,
|
| | | default: () => {
|
| | | return null
|
| | | }
|
| | | },
|
| | | showHeader: {
|
| | | type: Boolean,
|
| | | default: () => {
|
| | | return true
|
| | | }
|
| | | },
|
| | | tableSelection: {
|
| | | type: Object,
|
| | | default: () => {
|
| | | return {
|
| | | key: false,
|
| | | type: '',
|
| | | detaile: false
|
| | | }
|
| | | }
|
| | | },
|
| | | tableLabel: {
|
| | | type: Array,
|
| | | default: () => { }
|
| | | },
|
| | | tableOption: {
|
| | | type: Object,
|
| | | default: () => {
|
| | | return {
|
| | | value: undefined
|
| | | }
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | methods: {
|
| | | handleSelectionChange (val) {
|
| | | this.$emit('onHandleSelectionChange', val)
|
| | | },
|
| | | handleTemplateRow (index, row) {
|
| | | this.$emit('onHandleTemplateRow', row)
|
| | | },
|
| | | changeType (event, row) {
|
| | | this.$emit('onChangeType', event, row)
|
| | | },
|
| | | expandSelect (row, expandedRows) {
|
| | | const that = this
|
| | | if (expandedRows.length) {
|
| | | that.expands = []
|
| | | if (row) {
|
| | | that.expands.push(row.id)
|
| | | }
|
| | | } else {
|
| | | that.expands = []
|
| | | }
|
| | | },
|
| | | handleCellClick (row, column) {
|
| | | this.$emit('onHandleCellClick', row, column)
|
| | | },
|
| | | getProductImageUrl (id) {
|
| | | return process.env.VUE_APP_BASE_API + 'saas/sysadmin/product/download/id?id=' + id
|
| | | },
|
| | | |
| | | // â
æ°å¢ï¼è¿æ»¤éé¡¹çæ¹æ³
|
| | | filteredOptions(row) {
|
| | | if (!this.tableOption.options) return [];
|
| | | return this.tableOption.options.filter(value => {
|
| | | return value.show ? value.show(row) : true;
|
| | | });
|
| | | },
|
| | | |
| | | // â
æ°å¢ï¼è¿æ»¤å¼¹åºæ¡éé¡¹çæ¹æ³
|
| | | filteredPopoverOptions(row) {
|
| | | if (!this.tableOption.popoverOptions) return [];
|
| | | return this.tableOption.popoverOptions.filter(value => {
|
| | | return value.show ? value.show(row) : true;
|
| | | });
|
| | | }
|
| | | }
|
| | | }
|
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // src/directives/model-permission.js |
| | | |
| | | export default { |
| | | inserted(el, binding) { |
| | | // ä»sessionStorageè·å设å¤åå· |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { model } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | const { value } = binding |
| | | |
| | | if (!value) return // 没æé
ç½®æéï¼é»è®¤æ¾ç¤º |
| | | |
| | | if (Array.isArray(value)) { |
| | | // å
许çåå·å表 |
| | | if (!value.includes(model)) { |
| | | el.parentNode?.removeChild(el) |
| | | } |
| | | } else if (typeof value === 'string') { |
| | | // å个å
许çåå· |
| | | if (model !== value) { |
| | | el.parentNode?.removeChild(el) |
| | | } |
| | | } else if (typeof value === 'object') { |
| | | // 夿é
ç½®ï¼{ allow: [], deny: [] } |
| | | const { allow, deny } = value |
| | | |
| | | if (allow && !allow.includes(model)) { |
| | | el.parentNode?.removeChild(el) |
| | | } |
| | | if (deny && deny.includes(model)) { |
| | | el.parentNode?.removeChild(el) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | // update(el, binding) { |
| | | // const { value, oldValue } = binding |
| | | |
| | | // if (value !== oldValue) { |
| | | // const elClone = el.cloneNode(true) |
| | | // el.parentNode?.replaceChild(elClone, el) |
| | | // this.inserted(elClone, binding) |
| | | // } |
| | | // } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* eslint-disable */ |
| | | /* Blob.js |
| | | * A Blob implementation. |
| | | * 2014-05-27 |
| | | * |
| | | * By Eli Grey, http://eligrey.com |
| | | * By Devin Samarin, https://github.com/eboyjr |
| | | * License: X11/MIT |
| | | * See LICENSE.md |
| | | */ |
| | | |
| | | /*global self, unescape */ |
| | | /*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, |
| | | plusplus: true */ |
| | | |
| | | /*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ |
| | | |
| | | (function (view) { |
| | | "use strict"; |
| | | |
| | | view.URL = view.URL || view.webkitURL; |
| | | |
| | | if (view.Blob && view.URL) { |
| | | try { |
| | | new Blob; |
| | | return; |
| | | } catch (e) {} |
| | | } |
| | | |
| | | // Internally we use a BlobBuilder implementation to base Blob off of |
| | | // in order to support older browsers that only have BlobBuilder |
| | | var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) { |
| | | var |
| | | get_class = function(object) { |
| | | return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; |
| | | } |
| | | , FakeBlobBuilder = function BlobBuilder() { |
| | | this.data = []; |
| | | } |
| | | , FakeBlob = function Blob(data, type, encoding) { |
| | | this.data = data; |
| | | this.size = data.length; |
| | | this.type = type; |
| | | this.encoding = encoding; |
| | | } |
| | | , FBB_proto = FakeBlobBuilder.prototype |
| | | , FB_proto = FakeBlob.prototype |
| | | , FileReaderSync = view.FileReaderSync |
| | | , FileException = function(type) { |
| | | this.code = this[this.name = type]; |
| | | } |
| | | , file_ex_codes = ( |
| | | "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " |
| | | + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" |
| | | ).split(" ") |
| | | , file_ex_code = file_ex_codes.length |
| | | , real_URL = view.URL || view.webkitURL || view |
| | | , real_create_object_URL = real_URL.createObjectURL |
| | | , real_revoke_object_URL = real_URL.revokeObjectURL |
| | | , URL = real_URL |
| | | , btoa = view.btoa |
| | | , atob = view.atob |
| | | |
| | | , ArrayBuffer = view.ArrayBuffer |
| | | , Uint8Array = view.Uint8Array |
| | | ; |
| | | FakeBlob.fake = FB_proto.fake = true; |
| | | while (file_ex_code--) { |
| | | FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; |
| | | } |
| | | if (!real_URL.createObjectURL) { |
| | | URL = view.URL = {}; |
| | | } |
| | | URL.createObjectURL = function(blob) { |
| | | var |
| | | type = blob.type |
| | | , data_URI_header |
| | | ; |
| | | if (type === null) { |
| | | type = "application/octet-stream"; |
| | | } |
| | | if (blob instanceof FakeBlob) { |
| | | data_URI_header = "data:" + type; |
| | | if (blob.encoding === "base64") { |
| | | return data_URI_header + ";base64," + blob.data; |
| | | } else if (blob.encoding === "URI") { |
| | | return data_URI_header + "," + decodeURIComponent(blob.data); |
| | | } if (btoa) { |
| | | return data_URI_header + ";base64," + btoa(blob.data); |
| | | } else { |
| | | return data_URI_header + "," + encodeURIComponent(blob.data); |
| | | } |
| | | } else if (real_create_object_URL) { |
| | | return real_create_object_URL.call(real_URL, blob); |
| | | } |
| | | }; |
| | | URL.revokeObjectURL = function(object_URL) { |
| | | if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { |
| | | real_revoke_object_URL.call(real_URL, object_URL); |
| | | } |
| | | }; |
| | | FBB_proto.append = function(data/*, endings*/) { |
| | | var bb = this.data; |
| | | // decode data to a binary string |
| | | if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { |
| | | var |
| | | str = "" |
| | | , buf = new Uint8Array(data) |
| | | , i = 0 |
| | | , buf_len = buf.length |
| | | ; |
| | | for (; i < buf_len; i++) { |
| | | str += String.fromCharCode(buf[i]); |
| | | } |
| | | bb.push(str); |
| | | } else if (get_class(data) === "Blob" || get_class(data) === "File") { |
| | | if (FileReaderSync) { |
| | | var fr = new FileReaderSync; |
| | | bb.push(fr.readAsBinaryString(data)); |
| | | } else { |
| | | // async FileReader won't work as BlobBuilder is sync |
| | | throw new FileException("NOT_READABLE_ERR"); |
| | | } |
| | | } else if (data instanceof FakeBlob) { |
| | | if (data.encoding === "base64" && atob) { |
| | | bb.push(atob(data.data)); |
| | | } else if (data.encoding === "URI") { |
| | | bb.push(decodeURIComponent(data.data)); |
| | | } else if (data.encoding === "raw") { |
| | | bb.push(data.data); |
| | | } |
| | | } else { |
| | | if (typeof data !== "string") { |
| | | data += ""; // convert unsupported types to strings |
| | | } |
| | | // decode UTF-16 to binary string |
| | | bb.push(unescape(encodeURIComponent(data))); |
| | | } |
| | | }; |
| | | FBB_proto.getBlob = function(type) { |
| | | if (!arguments.length) { |
| | | type = null; |
| | | } |
| | | return new FakeBlob(this.data.join(""), type, "raw"); |
| | | }; |
| | | FBB_proto.toString = function() { |
| | | return "[object BlobBuilder]"; |
| | | }; |
| | | FB_proto.slice = function(start, end, type) { |
| | | var args = arguments.length; |
| | | if (args < 3) { |
| | | type = null; |
| | | } |
| | | return new FakeBlob( |
| | | this.data.slice(start, args > 1 ? end : this.data.length) |
| | | , type |
| | | , this.encoding |
| | | ); |
| | | }; |
| | | FB_proto.toString = function() { |
| | | return "[object Blob]"; |
| | | }; |
| | | FB_proto.close = function() { |
| | | this.size = this.data.length = 0; |
| | | }; |
| | | return FakeBlobBuilder; |
| | | }(view)); |
| | | |
| | | view.Blob = function Blob(blobParts, options) { |
| | | var type = options ? (options.type || "") : ""; |
| | | var builder = new BlobBuilder(); |
| | | if (blobParts) { |
| | | for (var i = 0, len = blobParts.length; i < len; i++) { |
| | | builder.append(blobParts[i]); |
| | | } |
| | | } |
| | | return builder.getBlob(type); |
| | | }; |
| | | }(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* eslint-disable */ |
| | | require('script-loader!file-saver'); |
| | | require('./Blob'); |
| | | require('script-loader!xlsx/dist/xlsx.core.min'); |
| | | function generateArray(table) { |
| | | var out = []; |
| | | var rows = table.querySelectorAll('tr'); |
| | | var ranges = []; |
| | | for (var R = 0; R < rows.length; ++R) { |
| | | var outRow = []; |
| | | var row = rows[R]; |
| | | var columns = row.querySelectorAll('td'); |
| | | for (var C = 0; C < columns.length; ++C) { |
| | | var cell = columns[C]; |
| | | var colspan = cell.getAttribute('colspan'); |
| | | var rowspan = cell.getAttribute('rowspan'); |
| | | var cellValue = cell.innerText; |
| | | if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; |
| | | |
| | | //Skip ranges |
| | | ranges.forEach(function (range) { |
| | | if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { |
| | | for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); |
| | | } |
| | | }); |
| | | |
| | | //Handle Row Span |
| | | if (rowspan || colspan) { |
| | | rowspan = rowspan || 1; |
| | | colspan = colspan || 1; |
| | | ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}}); |
| | | } |
| | | ; |
| | | |
| | | //Handle Value |
| | | outRow.push(cellValue !== "" ? cellValue : null); |
| | | |
| | | //Handle Colspan |
| | | if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); |
| | | } |
| | | out.push(outRow); |
| | | } |
| | | return [out, ranges]; |
| | | }; |
| | | |
| | | function datenum(v, date1904) { |
| | | if (date1904) v += 1462; |
| | | var epoch = Date.parse(v); |
| | | return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); |
| | | } |
| | | |
| | | function sheet_from_array_of_arrays(data, opts) { |
| | | var ws = {}; |
| | | var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}; |
| | | for (var R = 0; R != data.length; ++R) { |
| | | for (var C = 0; C != data[R].length; ++C) { |
| | | if (range.s.r > R) range.s.r = R; |
| | | if (range.s.c > C) range.s.c = C; |
| | | if (range.e.r < R) range.e.r = R; |
| | | if (range.e.c < C) range.e.c = C; |
| | | var cell = {v: data[R][C]}; |
| | | if (cell.v == null) continue; |
| | | var cell_ref = XLSX.utils.encode_cell({c: C, r: R}); |
| | | |
| | | if (typeof cell.v === 'number') cell.t = 'n'; |
| | | else if (typeof cell.v === 'boolean') cell.t = 'b'; |
| | | else if (cell.v instanceof Date) { |
| | | cell.t = 'n'; |
| | | cell.z = XLSX.SSF._table[14]; |
| | | cell.v = datenum(cell.v); |
| | | } |
| | | else cell.t = 's'; |
| | | |
| | | ws[cell_ref] = cell; |
| | | } |
| | | } |
| | | if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); |
| | | return ws; |
| | | } |
| | | |
| | | function Workbook() { |
| | | if (!(this instanceof Workbook)) return new Workbook(); |
| | | this.SheetNames = []; |
| | | this.Sheets = {}; |
| | | } |
| | | |
| | | function s2ab(s) { |
| | | var buf = new ArrayBuffer(s.length); |
| | | var view = new Uint8Array(buf); |
| | | for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; |
| | | return buf; |
| | | } |
| | | |
| | | export function export_table_to_excel(id) { |
| | | var theTable = document.getElementById(id); |
| | | console.log('a') |
| | | var oo = generateArray(theTable); |
| | | var ranges = oo[1]; |
| | | |
| | | /* original data */ |
| | | var data = oo[0]; |
| | | var ws_name = "SheetJS"; |
| | | console.log(data); |
| | | |
| | | var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); |
| | | |
| | | /* add ranges to worksheet */ |
| | | // ws['!cols'] = ['apple', 'banan']; |
| | | ws['!merges'] = ranges; |
| | | |
| | | /* add worksheet to workbook */ |
| | | wb.SheetNames.push(ws_name); |
| | | wb.Sheets[ws_name] = ws; |
| | | |
| | | var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); |
| | | |
| | | saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") |
| | | } |
| | | |
| | | function formatJson(jsonData) { |
| | | console.log(jsonData) |
| | | } |
| | | export function export_json_to_excel(th, jsonData, defaultTitle) { |
| | | |
| | | /* original data */ |
| | | |
| | | var data = jsonData; |
| | | data.unshift(th); |
| | | var ws_name = "SheetJS"; |
| | | |
| | | var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); |
| | | |
| | | |
| | | /* add worksheet to workbook */ |
| | | wb.SheetNames.push(ws_name); |
| | | wb.Sheets[ws_name] = ws; |
| | | |
| | | var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); |
| | | var title = defaultTitle || 'å表' |
| | | saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx") |
| | | } |
| | | export default class Export2Excel {} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // تسجÙÙ Ø§ÙØ¯Ø®ÙÙ |
| | | login: { |
| | | lang: 'اÙÙØºØ©', |
| | | systemname: 'دخÙÙ', |
| | | username: 'اÙÙ
ستخدÙ
', |
| | | username_label: 'ÙØ±Ø¬Ù إدخا٠اسÙ
اÙÙ
ستخدÙ
', |
| | | pwd: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | pwd_label: 'ÙØ±Ø¬Ù إدخا٠ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | pwd_info: 'Ø£Ø¯Ø®Ù ØµÙØºØ© ÙÙÙ
Ø© Ù
Ø±ÙØ± صØÙØØ©', |
| | | success_msg: 'تÙ
تسجÙÙ Ø§ÙØ¯Ø®ÙÙ Ø¨ÙØ¬Ø§Ø', |
| | | error_name: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ± ØºÙØ± صØÙØØ©', |
| | | error_res: 'ÙØ§ ÙÙØ¨Ù Ù
ØªØ·ÙØ¨Ø§Øª Ø§ÙØ¯Ø®ÙÙ', |
| | | login: 'تسجÙÙ Ø§ÙØ¯Ø®ÙÙ', |
| | | }, |
| | | // Ø§ÙØ´Ø±ÙØ· Ø§ÙØ¬Ø§Ùب٠|
| | | aside: { |
| | | systemname: 'ÙÙØØ©', |
| | | quit: 'تسجÙÙ Ø§ÙØ®Ø±Ùج', |
| | | deviceControl: 'Ø§ÙØªØÙÙ
', |
| | | basicSetting: 'Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯Ø§Øª', |
| | | workerSetting: 'Ø§ÙØ£Ùراد', |
| | | deviceMonitoring: 'اÙÙ
Ø±Ø§ÙØ¨Ø©', |
| | | recordManagement: 'Ø§ÙØ³Ø¬Ùات', |
| | | securityManagement: "إدارة اÙÙ
ÙØ§ØªÙØ", |
| | | tips: 'ØªÙØ¨ÙÙ', |
| | | tips_msg: 'ÙÙ ØªØ±ÙØ¯ تسجÙÙ Ø§ÙØ®Ø±ÙجØ', |
| | | }, |
| | | control: { |
| | | remoteControl: 'ع٠بعد', |
| | | restart: 'إعادة تشغÙÙ', |
| | | clickToRestart: 'اضغط ÙØ¥Ø¹Ø§Ø¯Ø© Ø§ÙØªØ´ØºÙÙ', |
| | | restartConfirm: 'تأÙÙØ¯ إعادة Ø§ÙØªØ´ØºÙÙØ', |
| | | restartSuccess: 'تÙ
ت إعادة Ø§ÙØªØ´ØºÙÙ', |
| | | restartFailed: 'ÙØ´Ùت إعادة Ø§ÙØªØ´ØºÙÙ', |
| | | remoteOpen: 'ÙØªØ Ø§ÙØ¨Ø§Ø¨ ع٠بعد', |
| | | clickToOpen: 'اضغط ÙÙÙØªØ', |
| | | openConfirm: 'تأÙÙØ¯ اÙÙØªØ ع٠بعدØ', |
| | | remoteOpenSuccess: 'تÙ
اÙÙØªØ Ø¨ÙØ¬Ø§Ø', |
| | | remoteOpenFailed: 'ÙØ´Ù اÙÙØªØ', |
| | | reset: 'إعادة ضبط Ø§ÙØ¬Ùاز', |
| | | clickToReset: 'اضغط ÙØ¥Ø¹Ø§Ø¯Ø© Ø§ÙØ¶Ø¨Ø·', |
| | | resetConfirm: 'تأÙÙØ¯ إعادة Ø§ÙØ¶Ø¨Ø·Ø', |
| | | resetWillOut: "بعد Ø§ÙØ±Ùست Ø®Ø±ÙØ¬", |
| | | resetSuccess: 'تÙ
ت إعادة Ø§ÙØ¶Ø¨Ø·', |
| | | resetFailed: 'ÙØ´Ùت إعادة Ø§ÙØ¶Ø¨Ø·', |
| | | firmwareUpgrade: 'ØªØØ¯ÙØ« Ø§ÙØ¨Ø±ÙاÙ
ج Ø§ÙØ«Ø§Ø¨Øª', |
| | | upgradeConfig: 'إعدادات Ø§ÙØªØØ¯ÙØ«', |
| | | firmwareUrl: 'رابط Ø§ÙØ¨Ø±ÙاÙ
ج', |
| | | md5Checksum: 'ÙÙÙ
Ø© md5', |
| | | startUpgrade: 'بدء Ø§ÙØªØØ¯ÙØ«', |
| | | urlRequired: 'Ø§ÙØ±Ø§Ø¨Ø· Ù
Ø·ÙÙØ¨', |
| | | md5Required: 'ÙÙÙ
Ø© md5 Ù
Ø·ÙÙØ¨Ø©', |
| | | urlInvalid: 'ÙØ±Ø¬Ù إدخا٠رابط صØÙØ', |
| | | md5Invalid: 'ÙØ±Ø¬Ù إدخا٠md5 صØÙØ', |
| | | upgradeConfirm: 'تأÙÙØ¯ Ø§ÙØªØØ¯ÙØ«Ø', |
| | | upgradeSuccess: 'تÙ
Ø§ÙØªØØ¯ÙØ« Ø¨ÙØ¬Ø§Ø', |
| | | clearFile: "Ù
Ø³Ø Ø§ÙÙ
ÙÙ", |
| | | uploading: 'Ø¬Ø§Ø±Ù Ø§ÙØ±Ùع...', |
| | | uploadAndUpgrade: 'Ø±ÙØ¹ ÙØªØØ¯ÙØ«', |
| | | restartTips: 'إعادة تشغÙ٠آÙ
ÙØ© دÙÙ ÙÙØ¯Ø§Ù Ø§ÙØ¨ÙØ§ÙØ§Øª', |
| | | restarting: 'جار٠إعادة Ø§ÙØªØ´ØºÙÙ...', |
| | | remoteTips: 'تØÙÙ
ع٠بعد باÙÙØµÙÙ', |
| | | opening: 'جار٠اÙÙØªØ...', |
| | | resetTips: 'إرجاع إعدادات اÙÙ
ØµÙØ¹Ø Ø³ÙØØ°Ù Ø§ÙØ¨ÙØ§ÙØ§Øª', |
| | | reseting: 'Ø¬Ø§Ø±Ù Ø§ÙØ¥Ø¹Ø§Ø¯Ø©...', |
| | | urlUpgrade: 'ØªØØ¯ÙØ« عبر Ø§ÙØ±Ø§Ø¨Ø·', |
| | | fileUpgrade: 'ØªØØ¯ÙØ« عبر Ù
ÙÙ', |
| | | uploadFile: 'اضغط ÙØ±Ùع Ù
ÙÙ Ø§ÙØ¨Ø±ÙاÙ
ج', |
| | | formatFile: 'ÙØ¯Ø¹Ù
.zip Ø£Ù .dpkØ Ø§ÙØØ¯ 20MB', |
| | | fileName: 'اسÙ
اÙÙ
ÙÙ', |
| | | size: 'Ø§ÙØØ¬Ù
', |
| | | }, |
| | | config: { |
| | | second: 'Ø«', |
| | | millisecond: 'Ù
ÙØ«', |
| | | min: 'Ø¯ÙØ§Ø¦Ù', |
| | | notsave: 'ÙØ§ تØÙظ', |
| | | save: 'ØÙظ', |
| | | noVoice: 'بدÙÙ ØµÙØª', |
| | | no: 'ÙØ§', |
| | | yes: 'ÙØ¹Ù
', |
| | | basicConfiguration: 'Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§ÙØ£Ø³Ø§Ø³ÙØ©', |
| | | displaySettings: 'إعدادات Ø§ÙØ¹Ø±Ø¶', |
| | | informationDisplay: 'عرض اÙÙ
عÙÙÙ
ات', |
| | | audioSettings: 'إعدادات Ø§ÙØµÙت', |
| | | languageAndThemes: 'اÙÙØºØ© ÙØ§ÙسÙ
ات', |
| | | autoAdjustScreenBrightness: 'Ø³Ø·ÙØ¹ تÙÙØ§Ø¦Ù', |
| | | screenBrightness: 'Ø³Ø·ÙØ¹ Ø§ÙØ´Ø§Ø´Ø©', |
| | | autoTurnOffScreen: 'Ø¥ÙÙØ§Ù Ø§ÙØ´Ø§Ø´Ø© تÙÙØ§Ø¦ÙاÙ', |
| | | autoTurnOffScreenTime: 'زÙ
Ù Ø§ÙØ¥ÙÙØ§Ù', |
| | | autoScreenSaver: 'ØØ§Ùظة شاشة تÙÙØ§Ø¦ÙØ©', |
| | | autoScreenSaverTime: 'زÙ
Ù Ø§ÙØØ§ÙØ¸Ø©', |
| | | displayDeviceSn: 'عرض SN', |
| | | displayIp: 'عرض IP', |
| | | displayIdentityCard: 'عرض Ø´ÙØ§Ø¯Ø© Ø§ÙØ³ØØ§Ø¨Ø©', |
| | | volume: 'Ù
ستÙÙ Ø§ÙØµÙت', |
| | | language: 'اÙÙØºØ©', |
| | | displayCode: "عرض رÙ
ز Ø§ÙØªØ·Ø¨Ù٠اÙÙ
صغر", |
| | | themeMode: "ÙÙ
Ø· Ø§ÙØ¹Ù
Ù", |
| | | cn: 'Ø§ÙØµÙÙÙØ©', |
| | | en: 'Ø§ÙØ¥ÙجÙÙØ²ÙØ©', |
| | | es: 'Ø§ÙØ¥Ø³Ø¨Ø§ÙÙØ©', |
| | | fr: 'اÙÙØ±ÙØ³ÙØ©', |
| | | de: 'Ø§ÙØ£ÙÙ
اÙÙØ©', |
| | | ru: 'Ø§ÙØ±ÙØ³ÙØ©', |
| | | ar: 'Ø§ÙØ¹Ø±Ø¨ÙØ©', |
| | | pt: 'Ø§ÙØ¨Ø±ØªØºØ§Ù', |
| | | ko: 'اÙÙÙØ±ÙØ©', |
| | | standardMode: 'اÙÙØ¶Ø¹ اÙÙÙØ§Ø³Ù', |
| | | simpleMode: 'اÙÙØ¶Ø¹ اÙÙ
بسط', |
| | | firstLogin: 'Ø£Ù٠تسجÙ٠دخÙÙ', |
| | | backlight: 'إضاءة Ø®ÙÙÙØ© Ø§ÙØ´Ø§Ø´Ø©', |
| | | brightness: 'Ø§ÙØ¥Ø¶Ø§Ø¡Ø© Ø§ÙØ¨Ùضاء', |
| | | nirBrightness: 'إضاءة Ø§ÙØ£Ø´Ø¹Ø© ØªØØª Ø§ÙØÙ
راء', |
| | | never: 'أبداÙ', |
| | | min1: 'دÙÙÙØ©', |
| | | min2: 'دÙÙÙØªØ§Ù', |
| | | min3: '3 Ø¯ÙØ§Ø¦Ù', |
| | | min4: '4 Ø¯ÙØ§Ø¦Ù', |
| | | min5: '5 Ø¯ÙØ§Ø¦Ù', |
| | | networkConfiguration: 'إعدادات Ø§ÙØ´Ø¨ÙØ©', |
| | | otherConfiguration: 'إعدادات أخرÙ', |
| | | ipConfiguration: 'تÙÙÙÙ IP', |
| | | devicePassword: 'ÙÙÙ
Ø© Ù
Ø±ÙØ± Ø§ÙØ¬Ùاز', |
| | | protocolPassword: 'ÙÙÙ
Ø© Ù
Ø±ÙØ± Ø§ÙØ¨Ø±ÙتÙÙÙÙ', |
| | | networkType: 'ÙÙØ¹ Ø§ÙØ´Ø¨ÙØ©', |
| | | ethernet: 'Ø¥ÙØ«Ø±Ùت', |
| | | wifiName: 'اسÙ
WiâFi', |
| | | wifiPassword: 'ÙÙÙ
Ø© Ù
Ø±ÙØ± WiâFi', |
| | | dhcpModeSelection: 'ÙØ¶Ø¹ DHCP', |
| | | dhcpMode: 'تÙÙØ§Ø¦Ù', |
| | | customNetworkConfiguration: 'ÙØ¯ÙÙ', |
| | | ipAddress: 'عÙÙØ§Ù IP', |
| | | gateway: 'Ø§ÙØ¨Ùابة', |
| | | subnetMask: 'ÙÙØ§Ø¹ Ø§ÙØ´Ø¨ÙØ©', |
| | | dnsServer: 'خادÙ
DNS', |
| | | mac: 'عÙÙØ§Ù MAC', |
| | | mqttRelatedConfiguration: 'إعدادات MQTT', |
| | | mqttConnectionInformation: 'Ù
عÙÙÙ
ات اتصا٠MQTT', |
| | | sessionConfiguration: 'إعدادات Ø§ÙØ¬Ùسة', |
| | | serverAddress: 'عÙÙØ§Ù Ø§ÙØ®Ø§Ø¯Ù
', |
| | | clientID: 'Ù
عرÙÙ Ø§ÙØ¹Ù
ÙÙ', |
| | | userName: 'اسÙ
اÙÙ
ستخدÙ
', |
| | | userPassword: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | topicPrefix: 'بادئة اÙÙ
ÙØ¶Ùع', |
| | | onlineChecking: 'تØÙ٠عبر Ø§ÙØ¥ÙØªØ±ÙØª', |
| | | onlineCheckingTimeout: 'Ù
ÙÙØ© Ø§ÙØªØÙÙ', |
| | | cleanSession: 'ØªÙØ¸ÙÙ Ø§ÙØ¬Ùسة', |
| | | clientIdSuffix: 'ÙØ§ØÙØ© اÙÙ
عرÙÙ', |
| | | willTopic: 'Ù
ÙØ¶Ùع Will', |
| | | enterpriseWechat:'ÙØ¶Ø¹ Enterprise WeChat ØºÙØ± Ù
ÙØ¹Ù', |
| | | faceRelatedConfiguration: 'إعدادات اÙÙØ¬Ù', |
| | | functionalInformation: 'Ù
عÙÙÙ
ات اÙÙØ¸ÙÙØ©', |
| | | prompt: 'ØªÙØ¨ÙÙ', |
| | | faceSimilarityThreshold: 'عتبة Ø§ÙØªØ´Ø§Ø¨Ù', |
| | | livenessDetectionFunction: 'ÙØ´Ù Ø§ÙØÙÙÙØ©', |
| | | livenessDetectionThreshold: 'عتبة Ø§ÙØÙÙÙØ©', |
| | | infraredImageDisplay: "عرض Ø§ÙØ£Ø´Ø¹Ø© ØªØØª Ø§ÙØÙ
راء", |
| | | maskRecognition: "Ø§ÙØªØ¹Ø±Ù عÙ٠اÙÙÙØ§Ø¹", |
| | | strangerVoice: "ØµÙØª Ø§ÙØºØ±Ùب", |
| | | voiceMode: "ÙØ¶Ø¹ Ø§ÙØµÙت", |
| | | voiceModeDate: 'تØÙØ© Ù
خصصة', |
| | | imageSaveType: "ÙÙØ¹ Ø§ÙØÙØ¸", |
| | | saveStrangerImage: "ØÙظ ØµÙØ±Ø© Ø§ÙØºØ±Ùب", |
| | | fullView: "باÙÙØ±Ø§Ù
ا", |
| | | face: "اÙÙØ¬Ù", |
| | | broadcastPleaseRegisterFirst: 'تشغÙÙ "سج٠أÙÙØ§Ù"', |
| | | broadcastHelloStranger: 'تشغÙÙ "ØºØ±ÙØ¨"', |
| | | broadcastName: 'تشغÙÙ Ø§ÙØ§Ø³Ù
', |
| | | broadcastGreeting: 'تشغÙ٠تØÙØ© Ù
خصصة', |
| | | greeting: 'تØÙØ©', |
| | | broadcastWelcome: 'تشغÙÙ "Ù
Ø±ØØ¨Ø§Ù"', |
| | | recognitionSwitch: 'Ù
ÙØªØ§Ø إعادة اÙÙØ´Ù', |
| | | systemRelatedConfiguration: 'إعدادات اÙÙØ¸Ø§Ù
', |
| | | functionSwitch: 'Ù
ÙØ§ØªÙØ Ø§ÙÙØ¸Ø§Ø¦Ù', |
| | | cardSwipingSwitch: 'Ø§ÙØ¨Ø·Ø§ÙØ©', |
| | | passwordSwitch: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | strangerImage: 'ØµÙØ±Ø© Ø§ÙØºØ±Ùب', |
| | | cloudCertificateSwitch: 'Ø´ÙØ§Ø¯Ø© Ø§ÙØ³ØØ§Ø¨Ø©', |
| | | physicalCardNumber: 'رÙÙ
Ø§ÙØ¨Ø·Ø§ÙØ© اÙÙÙØ²ÙØ§Ø¦ÙØ©', |
| | | cloudCertificateAcquisition: 'Ø§ÙØØµÙ٠عÙÙ Ø´ÙØ§Ø¯Ø© Ø§ÙØ³ØØ§Ø¨Ø©', |
| | | heartbeatConfig: 'ÙØ¨Ø¶Ø§Øª اÙÙÙØ¨', |
| | | heartbeatSwitch: 'ØªÙØ¹Ù٠اÙÙØ¨Ø¶Ø§Øª', |
| | | heartRateInterval: 'اÙÙØ§ØµÙ Ø§ÙØ²Ù
ÙÙ', |
| | | heartbeatTopic: 'Ù
ÙØ¶Ùع اÙÙØ¨Ø¶', |
| | | heartbeatContent: 'Ù
ØØªÙ٠اÙÙØ¨Ø¶', |
| | | basicInformation: 'Ù
عÙÙÙ
ات Ø£Ø³Ø§Ø³ÙØ©', |
| | | deviceMac: 'عÙÙØ§Ù MAC', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Ø§ÙØ·Ø±Ø§Ø²', |
| | | version: "Ø§ÙØ¥ØµØ¯Ø§Ø±", |
| | | appVersion: "إصدار Ø§ÙØ¨Ø±ÙاÙ
ج", |
| | | releaseTime: "ÙÙØª Ø§ÙØªØØ¯ÙØ«", |
| | | totaldisk: 'اÙÙ
Ø³Ø§ØØ© Ø§ÙØ¥Ø¬Ù
اÙÙØ©', |
| | | freedisk: 'اÙÙ
Ø³Ø§ØØ© اÙÙ
تبÙÙØ©', |
| | | passageConfiguration: 'إعدادات اÙÙ
Ø±ÙØ±', |
| | | functionConfiguration: 'إعدادات اÙÙØ¸Ø§Ø¦Ù', |
| | | numberOfPassageRecords: 'Ø§ÙØØ¯ Ø§ÙØ£Ùص٠ÙÙØ³Ø¬Ùات', |
| | | durationOfRelayOpening: 'Ù
دة ÙØªØ اÙÙ
رØÙ', |
| | | alarmSwitch: 'Ø¥ÙØ°Ø§Ø±', |
| | | fireAlarmSwitch: 'Ø¥ÙØ°Ø§Ø± ØØ±ÙÙ', |
| | | fireAlarmStatus: 'ØØ§ÙØ© Ø§ÙØØ±ÙÙ', |
| | | normal: 'Ø·Ø¨ÙØ¹Ù', |
| | | warning: 'ØªØØ°Ùر', |
| | | tamperSwitch: 'Ø¥ÙØ°Ø§Ø± Ø§ÙØ¹Ø¨Ø«', |
| | | uploadToCloudSwitch: 'Ù
ÙØªØ§Ø تØÙ
Ù٠اÙÙØ¬Ù', |
| | | clockConfiguration: 'إعدادات اÙÙÙØª', |
| | | timeSynchronizationSwitch: 'Ù
زاÙ
ÙØ© اÙÙÙØª', |
| | | timeSynchronizationServerIP: 'خادÙ
اÙÙÙØª', |
| | | timedSynchronizationTime: 'ÙÙØª اÙÙ
زاÙ
ÙØ©', |
| | | timeZone: 'اÙÙ
ÙØ·ÙØ© Ø§ÙØ²Ù
ÙÙØ©', |
| | | setDeviceTime: 'ضبط ÙÙØª Ø§ÙØ¬Ùاز', |
| | | restartAfterSetting: 'سÙÙØ¹Ø§Ø¯ تشغÙÙ Ø§ÙØ¬Ùاز بعد Ø§ÙØ¶Ø¨Ø·', |
| | | cloudCertificateActivation: 'ØªÙØ¹ÙÙ Ø´ÙØ§Ø¯Ø© Ø§ÙØ³ØØ§Ø¨Ø©', |
| | | activationKey: 'Ù
ÙØªØ§Ø Ø§ÙØªÙعÙÙ', |
| | | cloudTips1: 'أدخ٠اÙÙ
ÙØªØ§Ø بدÙÙ Ù
Ø³Ø§ÙØ§Øª', |
| | | cloudTips2: 'بعد Ø§ÙØªÙعÙÙ Ø³ÙØªØµÙ بخدÙ
Ø© Ø§ÙØ³ØØ§Ø¨Ø©', |
| | | confirmActivation: 'تأÙÙØ¯ Ø§ÙØªÙعÙÙ', |
| | | activationInProgress: 'Ø¬Ø§Ø±Ù Ø§ÙØªÙعÙÙ...', |
| | | activationFailed: 'ÙØ´Ù Ø§ÙØªÙعÙÙ', |
| | | activationSuccessful: 'تÙ
Ø§ÙØªÙعÙÙ Ø¨ÙØ¬Ø§Ø', |
| | | passwordModification: 'تغÙÙØ± ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | password: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | oldPassword: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ± اÙÙØ¯ÙÙ
Ø©', |
| | | newPassword: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ± Ø§ÙØ¬Ø¯Ùدة', |
| | | confirmPassword: 'تأÙÙØ¯ ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | passwordRule: 'ØªÙØµÙات ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | passwordLength: 'Ø§ÙØ·ÙÙ â¥6', |
| | | cannotBeTheSame: 'ÙØ§ ÙÙ
Ù٠أ٠تÙÙÙ ÙÙ Ø§ÙØ£ØØ±Ù Ù
ØªØ·Ø§Ø¨ÙØ©', |
| | | cannotOrder: 'ÙØ§ ÙØ´Ù
Ù 3+ Ø£Ø±ÙØ§Ù
/ØØ±ÙÙ Ù
تتاÙÙØ©', |
| | | cannotWeakPassword: 'ÙØ§ تستخدÙ
ÙÙÙ
ات Ù
Ø±ÙØ± ضعÙÙØ© شائعة', |
| | | submit: 'إرساÙ', |
| | | saveConfig: 'ØÙظ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯Ø§Øª', |
| | | msg_please_enter: 'ÙØ±Ø¬Ù Ø§ÙØ¥Ø¯Ø®Ø§Ù', |
| | | msg_inputPassword: 'ÙØ±Ø¬Ù إدخا٠ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | msg_oldPasswordError: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ± اÙÙØ¯ÙÙ
Ø© ØºÙØ± صØÙØØ©', |
| | | msg_password_mismatch: 'ÙÙÙ
تا اÙÙ
Ø±ÙØ± ØºÙØ± Ù
ØªØ·Ø§Ø¨ÙØªÙÙ', |
| | | msg_password_min_length: 'Ø§ÙØØ¯ Ø§ÙØ£Ø¯ÙÙ 6 Ø£ØØ±Ù', |
| | | msg_is_weak_password: 'ÙÙÙ
Ø© Ù
Ø±ÙØ± ضعÙÙØ©Ø ÙØ±Ø¬Ù Ø§ÙØªØºÙÙØ±', |
| | | msg_pswChangeSuccessAndLogin: 'تÙ
تغÙÙØ± ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±Ø ÙØ±Ø¬Ù تسجÙÙ Ø§ÙØ¯Ø®ÙÙ', |
| | | msg_pswChangeSuccess: 'تÙ
تغÙÙØ± ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | msg_pswChangeFail: 'ÙØ´Ù تغÙÙØ± ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | msg_saveSuccess: 'تÙ
Ø§ÙØÙØ¸ Ø¨ÙØ¬Ø§Ø', |
| | | msg_saveFail: 'ÙØ´Ù Ø§ÙØÙØ¸', |
| | | msg_formFilled: 'تØÙÙ Ù
٠تعبئة اÙÙÙ
ÙØ°Ø¬', |
| | | msg_number_0_23: 'ÙØ¯Ø¹Ù
ÙÙØ· 0 Ø¥ÙÙ 23', |
| | | msg_number_0_24: 'ÙØ¯Ø¹Ù
ÙÙØ· 0 Ø¥ÙÙ 24', |
| | | msg_noChange: 'ÙØ§ ØªÙØ¬Ø¯ تغÙÙØ±Ø§Øª ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯Ø§Øª ÙÙØÙØ¸', |
| | | resourceConfiguration: 'إعدادات اÙÙ
ÙØ§Ø±Ø¯', |
| | | backgroundImage: 'ØµÙØ±Ø© Ø§ÙØ®ÙÙÙØ©', |
| | | selectImage: 'اختر ØµÙØ±Ø©', |
| | | uploadBackground: 'Ø±ÙØ¹ Ø§ÙØ®ÙÙÙØ©', |
| | | uploading: 'Ø¬Ø§Ø±Ù Ø§ÙØ±Ùع...', |
| | | backgroundUploadTip: 'ÙØ±Ø¬Ù تØÙ
ÙÙ ØµÙØ±Ø© Ø¨ØµÙØºØ© PNG Ø¨ØØ¬Ù
Ø§ÙØ¨ÙØ³ÙØ§Øª {n}Ø ÙØ³ÙتÙ
تØÙÙÙ Ø§ÙØµÙرة Ø¥ÙÙ ØµÙØºØ© Base64 Ø«Ù
ÙÙÙÙØ§ Ø¥ÙÙ Ø§ÙØ¬Ùاز', |
| | | backgroundResolutionMismatch: 'ÙØ¬Ø¨ أ٠تÙÙÙ Ø¯ÙØ© Ø§ÙØµÙرة {n}', |
| | | backgroundRequired: 'ÙØ±Ø¬Ù Ø§Ø®ØªÙØ§Ø± ØµÙØ±Ø© Ø®ÙÙÙØ©', |
| | | backgroundImageOnlyPNG: 'PNG ÙÙØ·', |
| | | backgroundSizeLimit: 'Ø§ÙØØ¬Ù
ÙØ§ ÙØªØ¬Ø§Ùز 5MB', |
| | | backgroundParseFailed: 'ÙØ´Ù ÙØ±Ø§Ø¡Ø© Ø§ÙØµÙرة', |
| | | backgroundImageSelected: 'تÙ
Ø§Ø®ØªÙØ§Ø± Ø§ÙØµÙرة', |
| | | backgroundSuccess: 'تÙ
Ø±ÙØ¹ Ø§ÙØ®ÙÙÙØ©', |
| | | backgroundFailed: 'ÙØ´Ù Ø±ÙØ¹ Ø§ÙØ®ÙÙÙØ©', |
| | | scanSettings: 'إعدادات اÙÙ
سØ', |
| | | scanSwitch: 'Ù
ÙØªØ§Ø اÙÙ
سØ', |
| | | scanInterval: 'ÙØ§ØµÙ اÙÙ
سØ' |
| | | }, |
| | | person: { |
| | | idCard: 'رÙÙ
اÙÙÙÙØ©', |
| | | userType: 'ÙÙØ¹ اÙÙ
ستخدÙ
', |
| | | administrator: 'Ù
سؤÙÙ', |
| | | userId: 'ID', |
| | | user: 'Ù
ستخدÙ
', |
| | | voucher: 'Ø¨ÙØ§Ù اعتÙ
اد', |
| | | permission: 'Ø§ÙØµÙاØÙØ©', |
| | | addUser: 'Ø¥Ø¶Ø§ÙØ© Ù
ستخدÙ
', |
| | | name: 'Ø§ÙØ§Ø³Ù
', |
| | | editUser: 'تعدÙ٠اÙÙ
ستخدÙ
', |
| | | placeholderUserId: 'أدخ٠Ù
عر٠اÙÙ
ستخدÙ
', |
| | | placeholderName: 'Ø£Ø¯Ø®Ù Ø§ÙØ§Ø³Ù
', |
| | | userNotExist: 'اÙÙ
ستخدÙ
ØºÙØ± Ù
ÙØ¬Ùد', |
| | | oneClickClear: 'Ù
Ø³Ø Ø§ÙÙÙ', |
| | | clearTips: 'Ø³ÙØªÙ
ØØ°Ù جÙ
ÙØ¹ Ø§ÙØ¨ÙØ§ÙØ§ØªØ اÙÙ
تابعةØ', |
| | | clearSuccess: 'تÙ
اÙÙ
Ø³Ø Ø¨ÙØ¬Ø§Ø', |
| | | clearFailed: 'ÙØ´Ù اÙÙ
سØ', |
| | | }, |
| | | voucher: { |
| | | password: 'ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | card: 'Ø¨Ø·Ø§ÙØ©', |
| | | face: 'ÙØ¬Ù', |
| | | finger: 'بصÙ
Ø©', |
| | | code: "Ø§ÙØ±Ù
ز", |
| | | codeType: "ÙÙØ¹ Ø§ÙØ±Ù
ز", |
| | | passthroughCode: "رÙ
ز Ø§ÙØªÙ
Ø±ÙØ±", |
| | | staticCode: "رÙ
ز ثابت", |
| | | dynamicCode: "رÙ
ز دÙÙØ§Ù
ÙÙÙ", |
| | | credentialId: 'Ù
عرÙÙ Ø¨ÙØ§Ùات Ø§ÙØ§Ø¹ØªÙ
اد', |
| | | credentialValue: 'ÙÙÙ
Ø© Ø¨ÙØ§Ùات Ø§ÙØ§Ø¹ØªÙ
اد', |
| | | placeholderCode: "Ø§ÙØ±Ø¬Ø§Ø¡ إدخا٠رÙ
ز Ø§ÙØ´Ùادة", |
| | | placeholderPwd: 'أدخ٠ÙÙÙ
Ø© اÙÙ
Ø±ÙØ±', |
| | | placeholderCard: 'Ø£Ø¯Ø®Ù Ø§ÙØ¨Ø·Ø§ÙØ©', |
| | | validPassword: 'أدخ٠6 Ø£Ø±ÙØ§Ù
', |
| | | validCard: 'أدخ٠8 Ø£Ø±ÙØ§Ù
Ø£Ù Ø£ØØ±Ù', |
| | | photoRegistration: 'تسجÙÙ ØµÙØ±Ø©', |
| | | featureValueRegistration: 'تسجÙÙ Ø§ÙØ³Ù
ات', |
| | | fingerRegistration: 'تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerFeatureRegistration: 'تسجÙÙ ÙÙÙ
Ø© Ø§ÙØ³Ù
Ø©', |
| | | fingerInput: 'ÙØ±Ø¬Ù ÙØ¶Ø¹ إصبع٠عÙÙ Ù
Ø§Ø³Ø Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerRemainingTime: 'اÙÙÙØª اÙÙ
تبÙÙ', |
| | | fingerInputting: 'Ø¬Ø§Ø±Ù Ø§ÙØªØ³Ø¬ÙÙ...', |
| | | startFingerInput: 'بدء تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerInputTips: 'ÙØ±Ø¬Ù إدخا٠ÙÙÙ
Ø© سÙ
Ø© Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerWaitInput: 'Ø¨Ø§ÙØªØ¸Ø§Ø± Ø§ÙØªØ³Ø¬ÙÙ', |
| | | fingerInputNow: 'جار٠تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©...', |
| | | fingerInputSuccess: 'تÙ
Ø§ÙØªØ³Ø¬ÙÙ Ø¨ÙØ¬Ø§Ø', |
| | | fingerInputFailed: 'ÙØ´Ù بدء تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerReTry: 'ÙØ´Ù تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©Ø ÙØ±Ø¬Ù اÙÙ
ØØ§ÙÙØ© Ù
رة أخرÙ', |
| | | fingerFilled: 'تÙ
تسجÙÙ Ø§ÙØ¨ØµÙ
Ø© Ø¨ÙØ¬Ø§Ø ÙØªÙ
تعبئة ÙÙÙ
Ø© Ø§ÙØ³Ù
Ø© تÙÙØ§Ø¦ÙÙØ§', |
| | | fingerFailed: 'ÙØ´Ù تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerTimeout: 'Ø§ÙØªÙت اÙÙ
ÙÙØ©', |
| | | fingerInputTimeout: 'Ø§ÙØªÙت Ù
ÙÙØ© تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©Ø ÙØ±Ø¬Ù اÙÙ
ØØ§ÙÙØ© Ù
رة أخرÙ', |
| | | fingerError: 'ÙØ´Ù Ø§ÙØªØ³Ø¬ÙÙ', |
| | | fingerInputError: 'ÙØ´Ù تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©Ø ÙØ±Ø¬Ù اÙÙ
ØØ§ÙÙØ© Ù
رة أخرÙ', |
| | | fingerInputed: 'تÙ
تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | fingerReInput: 'إعادة تسجÙÙ Ø§ÙØ¨ØµÙ
Ø©', |
| | | |
| | | }, |
| | | permission: { |
| | | deletePermission: 'ØØ°Ù Ø§ÙØµÙاØÙØ©', |
| | | addPermission: 'Ø¥Ø¶Ø§ÙØ© ØµÙØ§ØÙØ©', |
| | | permissionId: 'Ù
عرÙÙ Ø§ÙØµÙاØÙØ©', |
| | | userId: 'Ù
عرÙ٠اÙÙ
ستخدÙ
', |
| | | timeRange: 'اÙÙØ·Ø§Ù Ø§ÙØ²Ù
ÙÙ', |
| | | extra: 'إضاÙÙ', |
| | | effectiveType: 'ÙÙØ¹ اÙÙØ¹Ø§ÙÙØ©', |
| | | effectiveTime: 'ÙÙØª اÙÙØ¹Ø§ÙÙØ©', |
| | | effectiveWeek: 'Ø§ÙØ£Ø³Ø¨Ùع اÙÙØ¹Ø§Ù', |
| | | timePeriod: 'اÙÙØªØ±Ø© Ø§ÙØ²Ù
ÙÙØ©', |
| | | addTimePeriod: 'Ø¥Ø¶Ø§ÙØ© ÙØªØ±Ø©', |
| | | modify_previous_time: 'عدÙ٠اÙÙØªØ±Ø© Ø§ÙØ³Ø§Ø¨ÙØ© Ø£ÙÙØ§Ù', |
| | | cannot_be_earlier: 'ÙØ§ ÙÙ
Ù٠أ٠تÙÙ٠اÙÙÙØ§ÙØ© ÙØ¨Ù Ø§ÙØ¨Ø¯Ø§ÙØ©', |
| | | times_cannot_overlap: 'ÙØ§ ÙÙ
ÙÙ ØªØ¯Ø§Ø®Ù Ø§ÙØ£ÙÙØ§Øª', |
| | | choose_time_range: 'اختر ÙØ·Ø§Ù Ø§ÙØ²Ù
Ù', |
| | | unlimitedMode: 'ØºÙØ± Ù
ØØ¯Ùد', |
| | | usualMode: 'اÙÙØ¶Ø¹ اÙÙ
عتاد', |
| | | dailyMode: 'ÙØ¶Ø¹ ÙÙÙ
Ù', |
| | | weeklyRepetitionMode: 'ØªÙØ±Ø§Ø± Ø£Ø³Ø¨ÙØ¹Ù', |
| | | time_range: 'اÙÙØ·Ø§Ù Ø§ÙØ²Ù
ÙÙ', |
| | | }, |
| | | common: { |
| | | startDate: 'ØªØ§Ø±ÙØ® Ø§ÙØ¨Ø¯Ø¡', |
| | | endDate: 'ØªØ§Ø±ÙØ® Ø§ÙØ§ÙØªÙØ§Ø¡', |
| | | to: 'Ø¥ÙÙ', |
| | | cancel: 'Ø¥ÙØºØ§Ø¡', |
| | | confirm: 'تأÙÙØ¯', |
| | | close: 'Ø¥ØºÙØ§Ù', |
| | | delete: 'ØØ°Ù', |
| | | edit: 'تعدÙÙ', |
| | | batchDelete: 'ØØ°Ù Ø¯ÙØ¹Ø©', |
| | | startTime: 'ÙÙØª Ø§ÙØ¨Ø¯Ø¡', |
| | | endTime: 'ÙÙØª Ø§ÙØ§ÙØªÙØ§Ø¡', |
| | | monday: 'Ø§ÙØ§Ø«ÙÙÙ', |
| | | tuseday: 'Ø§ÙØ«Ùاثاء', |
| | | wednesday: 'Ø§ÙØ£Ø±Ø¨Ø¹Ø§Ø¡', |
| | | thursday: 'Ø§ÙØ®Ù
ÙØ³', |
| | | friday: 'Ø§ÙØ¬Ù
عة', |
| | | saterday: 'Ø§ÙØ³Ø¨Øª', |
| | | sunday: 'Ø§ÙØ£ØØ¯', |
| | | placeholder: 'ÙØ±Ø¬Ù Ø§ÙØ¥Ø¯Ø®Ø§Ù', |
| | | placeholderSelect: 'ÙØ±Ø¬Ù Ø§ÙØ§Ø®ØªÙار', |
| | | closeTips: 'تأÙÙØ¯ Ø§ÙØ¥ØºÙØ§ÙØ', |
| | | deleteTips: 'تأÙÙØ¯ Ø§ÙØØ°ÙØ', |
| | | deleteSuccess: 'تÙ
Ø§ÙØØ°Ù Ø¨ÙØ¬Ø§Ø', |
| | | addSuccess: 'تÙ
ت Ø§ÙØ¥Ø¶Ø§ÙØ© Ø¨ÙØ¬Ø§Ø', |
| | | editSuccess: 'تÙ
Ø§ÙØªØ¹Ø¯ÙÙ Ø¨ÙØ¬Ø§Ø', |
| | | saveSuccess: 'تÙ
Ø§ÙØÙØ¸', |
| | | tips: 'ØªÙØ¨ÙÙ', |
| | | operation: 'عÙ
ÙÙØ©', |
| | | query: 'Ø§Ø³ØªØ¹ÙØ§Ù
', |
| | | reset: 'إعادة', |
| | | noData: 'ÙØ§ ØªÙØ¬Ø¯ Ø¨ÙØ§Ùات', |
| | | export: 'ØªØµØ¯ÙØ±', |
| | | success: 'ÙØ¬Ø§Ø', |
| | | failure: 'ÙØ´Ù', |
| | | incorrectFormat: 'ØµÙØºØ© ØºÙØ± صØÙØØ©', |
| | | integerFormat: 'ÙØ¬Ø¨ Ø£Ù ÙÙÙ٠عددا٠صØÙØØ§Ù â¥0', |
| | | positiveIntegerFormat: 'ÙØ¬Ø¨ Ø£Ù ÙÙÙ٠عددا٠صØÙØØ§Ù >0', |
| | | noDataSaved: 'ÙØ§ ØªÙØ¬Ø¯ Ø¨ÙØ§Ùات ÙÙØÙØ¸', |
| | | chinese: 'Ø§ÙØµÙÙÙØ©', |
| | | english: 'Ø§ÙØ¥ÙجÙÙØ²ÙØ©', |
| | | spanish: 'Ø§ÙØ¥Ø³Ø¨Ø§ÙÙØ©', |
| | | french: 'اÙÙØ±ÙØ³ÙØ©', |
| | | german: 'Ø§ÙØ£ÙÙ
اÙÙØ©', |
| | | russian: 'Ø§ÙØ±ÙØ³ÙØ©', |
| | | arabic: 'Ø§ÙØ¹Ø±Ø¨ÙØ©', |
| | | portuguese: 'Ø§ÙØ¨Ø±ØªØºØ§ÙÙØ©', |
| | | korean: 'اÙÙÙØ±ÙØ©', |
| | | detail: "Ø§ÙØªÙاصÙÙ", |
| | | clearTips: "ÙÙ Ø£ÙØª Ù
ØªØ£ÙØ¯ Ù
٠اÙÙ
Ø³ØØ", |
| | | clearSuccess: "تÙ
اÙÙ
Ø³Ø Ø¨ÙØ¬Ø§Ø", |
| | | }, |
| | | log: { |
| | | accessMethod: 'طرÙÙØ© Ø§ÙØ¯Ø®ÙÙ', |
| | | passingTime: 'ÙÙØª اÙÙ
Ø±ÙØ±', |
| | | accessPass: 'اعتÙ
اد Ø§ÙØ¯Ø®ÙÙ', |
| | | accessResult: 'اÙÙØªÙجة', |
| | | accessPhoto: 'ØµÙØ±Ø©', |
| | | viewPhotos: 'عرض Ø§ÙØµÙر' |
| | | }, |
| | | error: { |
| | | networkError: 'ÙØ´Ù Ø§ÙØ´Ø¨ÙØ©Ø ØªØÙÙ Ù
Ù Ø§ÙØ§ØªØµØ§Ù', |
| | | timeout: 'Ø§ÙØªÙ٠اÙÙÙØªØ ØØ§ÙÙ ÙØ§ØÙاÙ', |
| | | serverError: 'خطأ داخÙÙ ÙÙ Ø§ÙØ®Ø§Ø¯Ù
', |
| | | notFound: 'اÙÙ
ÙØ±Ø¯ ØºÙØ± Ù
ÙØ¬Ùد', |
| | | unauthorized: 'ØºÙØ± Ù
ØµØ±ØØ ÙØ±Ø¬Ù تسجÙÙ Ø§ÙØ¯Ø®ÙÙ', |
| | | noResponse: 'ÙØ§ ÙÙØ¬Ø¯ استجابة Ù
Ù Ø§ÙØ®Ø§Ø¯Ù
', |
| | | unknownError: 'ÙØ´Ù Ø§ÙØ·ÙØ¨Ø Ø§ÙØ±Ù
ز:', |
| | | requestFailed: 'ÙØ´Ù Ø§ÙØ·Ùب' |
| | | }, |
| | | security: { |
| | | keyId: "Ù
عر٠اÙÙ
ÙØªØ§Ø", |
| | | keyType: "ÙÙØ¹ اÙÙ
ÙØªØ§Ø", |
| | | keyEncoding: "ترÙ
ÙØ² اÙÙ
ÙØªØ§Ø", |
| | | keyValue: "ÙÙÙ
Ø© اÙÙ
ÙØªØ§Ø", |
| | | startTime: "ÙÙØª Ø§ÙØ¨Ø¯Ø¡", |
| | | expirationTime: "ÙÙØª Ø§ÙØ§ÙØªÙØ§Ø¡", |
| | | newKey: "Ø¥Ø¶Ø§ÙØ© Ù
ÙØªØ§Ø Ø¬Ø¯ÙØ¯", |
| | | clearKey: "Ù
Ø³Ø Ø§ÙÙ
ÙØªØ§Ø", |
| | | validTime: "اÙÙÙØª Ø§ÙØµØ§ÙØ", |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // Login |
| | | login: { |
| | | lang: 'Sprache', |
| | | systemname: 'Login', |
| | | username: 'Benutzername', |
| | | username_label: 'Bitte Benutzername eingeben', |
| | | pwd: 'Passwort', |
| | | pwd_label: 'Bitte Passwort eingeben', |
| | | pwd_info: 'Bitte korrektes Passwortformat eingeben', |
| | | success_msg: 'Erfolgreich angemeldet', |
| | | error_name: 'Falsches Passwort', |
| | | error_res: 'Anmeldeanforderungen nicht erfüllt', |
| | | login: 'Anmelden', |
| | | }, |
| | | // Sidebar |
| | | aside: { |
| | | systemname: 'Konsole', |
| | | quit: 'Abmelden', |
| | | deviceControl: 'Steuerung', |
| | | basicSetting: 'Einstellungen', |
| | | workerSetting: 'Personen', |
| | | deviceMonitoring: 'Ãberwachung', |
| | | recordManagement: 'Aufzeichnungen', |
| | | securityManagement: 'Schlüsselverwaltung', |
| | | tips: 'Hinweis', |
| | | tips_msg: 'Möchten Sie sich abmelden?', |
| | | }, |
| | | control: { |
| | | remoteControl: 'Fern', |
| | | restart: 'Neustart', |
| | | clickToRestart: 'Zum Neustart klicken', |
| | | restartConfirm: 'Neustart bestätigen?', |
| | | restartSuccess: 'Neustart erfolgreich', |
| | | restartFailed: 'Neustart fehlgeschlagen', |
| | | remoteOpen: 'Tür fernöffnen', |
| | | clickToOpen: 'Zum Ãffnen klicken', |
| | | openConfirm: 'Fernöffnung bestätigen?', |
| | | remoteOpenSuccess: 'Ãffnen erfolgreich', |
| | | remoteOpenFailed: 'Ãffnen fehlgeschlagen', |
| | | reset: 'Gerät zurücksetzen', |
| | | clickToReset: 'Zum Zurücksetzen klicken', |
| | | resetConfirm: 'Zurücksetzen bestätigen?', |
| | | resetWillOut: "Nach Reset abmelden", |
| | | resetSuccess: 'Zurücksetzen erfolgreich', |
| | | resetFailed: 'Zurücksetzen fehlgeschlagen', |
| | | firmwareUpgrade: 'Firmware-Update', |
| | | upgradeConfig: 'Update-Konfiguration', |
| | | firmwareUrl: 'Firmware-URL', |
| | | md5Checksum: 'md5-Wert', |
| | | startUpgrade: 'Update starten', |
| | | urlRequired: 'URL ist erforderlich', |
| | | md5Required: 'md5 ist erforderlich', |
| | | urlInvalid: 'Bitte gültige URL eingeben', |
| | | md5Invalid: 'Bitte gültiges md5 eingeben', |
| | | upgradeConfirm: 'Update bestätigen?', |
| | | upgradeSuccess: 'Update erfolgreich', |
| | | clearFile: "Datei löschen", |
| | | uploading: 'Hochladen...', |
| | | uploadAndUpgrade: 'Hochladen & Aktualisieren', |
| | | restartTips: 'Sicherer Neustart, keine Daten gehen verloren', |
| | | restarting: 'Neustart...', |
| | | remoteTips: 'Fernsteuerung der Zugangstür', |
| | | opening: 'Ãffnet...', |
| | | resetTips: 'Werksreset, löscht alle Daten', |
| | | reseting: 'Setzt zurück...', |
| | | urlUpgrade: 'Update per URL', |
| | | fileUpgrade: 'Update per Datei', |
| | | uploadFile: 'Firmware-Datei hochladen', |
| | | formatFile: 'Unterstützt .zip oder .dpk, max 20MB', |
| | | fileName: 'Dateiname', |
| | | size: 'GröÃe', |
| | | }, |
| | | config: { |
| | | second: 's', |
| | | millisecond: 'ms', |
| | | min: 'Minuten', |
| | | notsave: 'Nicht speichern', |
| | | save: 'Speichern', |
| | | noVoice: 'Keine Stimme', |
| | | no: 'Nein', |
| | | yes: 'Ja', |
| | | basicConfiguration: 'Grundkonfiguration', |
| | | displaySettings: 'Anzeige', |
| | | informationDisplay: 'Infoanzeige', |
| | | audioSettings: 'Audio', |
| | | languageAndThemes: 'Sprache & Thema', |
| | | autoAdjustScreenBrightness: 'Auto-Helligkeit', |
| | | screenBrightness: 'Bildschirmhelligkeit', |
| | | autoTurnOffScreen: 'Auto-Bildschirm aus', |
| | | autoTurnOffScreenTime: 'Zeit bis Ausschalten', |
| | | autoScreenSaver: 'Auto-Bildschirmschoner', |
| | | autoScreenSaverTime: 'Zeit Bildschirmschoner', |
| | | displayDeviceSn: 'SN anzeigen', |
| | | displayIp: 'IP anzeigen', |
| | | displayIdentityCard: 'Cloud-Zertifikat anzeigen', |
| | | volume: 'Lautstärke', |
| | | language: 'Sprache', |
| | | displayCode: "Mini-App-Code anzeigen", |
| | | themeMode: "Thema", |
| | | cn: 'Chinesisch', |
| | | en: 'Englisch', |
| | | es: 'Spanisch', |
| | | fr: 'Französisch', |
| | | de: 'Deutsch', |
| | | ru: 'Russisch', |
| | | ar: 'Arabisch', |
| | | pt: 'Port.', |
| | | ko: 'Koreanisch', |
| | | standardMode: 'Standardmodus', |
| | | simpleMode: 'Einfacher Modus', |
| | | firstLogin: 'Erste Anmeldung', |
| | | backlight: 'Hintergrundlicht', |
| | | brightness: 'WeiÃlicht', |
| | | nirBrightness: 'IR-Licht', |
| | | never: 'Nie', |
| | | min1: '1 Minute', |
| | | min2: '2 Minuten', |
| | | min3: '3 Minuten', |
| | | min4: '4 Minuten', |
| | | min5: '5 Minuten', |
| | | networkConfiguration: 'Netzwerk', |
| | | otherConfiguration: 'Andere', |
| | | ipConfiguration: 'IP-Konfiguration', |
| | | devicePassword: 'Gerätepasswort', |
| | | protocolPassword: 'Protokollpasswort', |
| | | networkType: 'Netzwerktyp', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'WiâFi', |
| | | wifiPassword: 'WiâFi-Passwort', |
| | | dhcpModeSelection: 'DHCP-Modus', |
| | | dhcpMode: 'Automatisch', |
| | | customNetworkConfiguration: 'Manuell', |
| | | ipAddress: 'IP-Adresse', |
| | | gateway: 'Gateway', |
| | | subnetMask: 'Subnetzmaske', |
| | | dnsServer: 'DNS-Server', |
| | | mac: 'Netzwerk-MAC', |
| | | mqttRelatedConfiguration: 'MQTT', |
| | | mqttConnectionInformation: 'MQTT-Verbindung', |
| | | sessionConfiguration: 'Sitzung', |
| | | serverAddress: 'Serveradresse', |
| | | clientID: 'Client-ID', |
| | | userName: 'Benutzername', |
| | | userPassword: 'Passwort', |
| | | topicPrefix: 'Topic-Präfix', |
| | | onlineChecking: 'Online-Prüfung', |
| | | onlineCheckingTimeout: 'Zeitüberschreitung', |
| | | cleanSession: 'Saubere Sitzung', |
| | | clientIdSuffix: 'Client-ID-Suffix', |
| | | willTopic: 'Will-Topic', |
| | | enterpriseWechat:'Enterprise WeChat Modus ohne Wirkung', |
| | | faceRelatedConfiguration: 'Gesichtskonfiguration', |
| | | functionalInformation: 'Funktion', |
| | | prompt: 'Hinweis', |
| | | faceSimilarityThreshold: 'Ãhnlichkeitsschwelle', |
| | | livenessDetectionFunction: 'Lebenderkennung', |
| | | livenessDetectionThreshold: 'Schwelle Lebendigkeit', |
| | | infraredImageDisplay: "Infrarotbild", |
| | | maskRecognition: "Maskenerkennung", |
| | | strangerVoice: "Stimme Unbekannt", |
| | | voiceMode: "Sprachmodus", |
| | | voiceModeDate: 'Benutzerdefinierter GruÃ', |
| | | imageSaveType: "Speichertyp", |
| | | saveStrangerImage: "Bild von Unbekannt speichern", |
| | | fullView: "Panorama", |
| | | face: "Gesicht", |
| | | broadcastPleaseRegisterFirst: 'Spiele "Bitte zuerst registrieren"', |
| | | broadcastHelloStranger: 'Spiele "Unbekannt"', |
| | | broadcastName: 'Namen abspielen', |
| | | broadcastGreeting: 'Benutzerdefinierten Gruà abspielen', |
| | | greeting: 'GruÃ', |
| | | broadcastWelcome: '"Willkommen" abspielen', |
| | | recognitionSwitch: 'Erneute Erkennung Schalter', |
| | | systemRelatedConfiguration: 'System', |
| | | functionSwitch: 'Funktionsschalter', |
| | | cardSwipingSwitch: 'Karte', |
| | | passwordSwitch: 'Passwort', |
| | | strangerImage: 'Bild Unbekannter', |
| | | cloudCertificateSwitch: 'Cloud-Zertifikat', |
| | | physicalCardNumber: 'Physische Kartennr.', |
| | | cloudCertificateAcquisition: 'Cloud-Zertifikat Bezug', |
| | | heartbeatConfig: 'Heartbeat', |
| | | heartbeatSwitch: 'Heartbeat Schalter', |
| | | heartRateInterval: 'Intervall', |
| | | heartbeatTopic: 'Heartbeat-Topic', |
| | | heartbeatContent: 'Heartbeat-Inhalt', |
| | | basicInformation: 'Basisinfo', |
| | | deviceMac: 'MAC-Adresse', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Modell', |
| | | version: "Version", |
| | | appVersion: "Firmware-Version", |
| | | releaseTime: "Aktualisierungszeit", |
| | | totaldisk: 'Gesamtbereich', |
| | | freedisk: 'Verbleibender Platz', |
| | | passageConfiguration: 'Passage', |
| | | functionConfiguration: 'Funktionen', |
| | | numberOfPassageRecords: 'Max. Durchgangsaufzeichnungen', |
| | | durationOfRelayOpening: 'Relais-Ãffnungsdauer', |
| | | alarmSwitch: 'Alarm', |
| | | fireAlarmSwitch: 'Brandalarm', |
| | | fireAlarmStatus: 'Brandstatus', |
| | | normal: 'Normal', |
| | | warning: 'Warnung', |
| | | tamperSwitch: 'Sabotageschutz', |
| | | uploadToCloudSwitch: 'Gesicht-Upload-Schalter', |
| | | clockConfiguration: 'Uhr', |
| | | timeSynchronizationSwitch: 'Zeitsynchronisation', |
| | | timeSynchronizationServerIP: 'Zeitserver-IP', |
| | | timedSynchronizationTime: 'Synchronisationszeit', |
| | | timeZone: 'Zeitzone', |
| | | setDeviceTime: 'Gerätezeit setzen', |
| | | restartAfterSetting: 'Gerät startet neu', |
| | | cloudCertificateActivation: 'Cloud-Zertifikat Aktivierung', |
| | | activationKey: 'Aktivierungsschlüssel', |
| | | cloudTips1: 'Schlüssel ohne Leerzeichen eingeben', |
| | | cloudTips2: 'Nach Aktivierung verbindet sich das Gerät mit dem Cloud-Service', |
| | | confirmActivation: 'Aktivierung bestätigen', |
| | | activationInProgress: 'Aktivierung läuft...', |
| | | activationFailed: 'Aktivierung fehlgeschlagen', |
| | | activationSuccessful: 'Aktivierung erfolgreich', |
| | | passwordModification: 'Passwort ändern', |
| | | password: 'Passwort', |
| | | oldPassword: 'Altes Passwort', |
| | | newPassword: 'Neues Passwort', |
| | | confirmPassword: 'Passwort bestätigen', |
| | | passwordRule: 'Passwortempfehlung', |
| | | passwordLength: 'Länge â¥6', |
| | | cannotBeTheSame: 'Alle Zeichen dürfen nicht gleich sein', |
| | | cannotOrder: 'Keine 3+ aufeinanderfolgende Zahlen/Buchstaben', |
| | | cannotWeakPassword: 'Kein schwaches Passwort', |
| | | submit: 'Senden', |
| | | saveConfig: 'Einstellungen speichern', |
| | | msg_please_enter: 'Bitte eingeben', |
| | | msg_inputPassword: 'Bitte Passwort eingeben', |
| | | msg_oldPasswordError: 'Altes Passwort falsch', |
| | | msg_password_mismatch: 'Passwörter stimmen nicht überein', |
| | | msg_password_min_length: 'Mindestens 6 Zeichen', |
| | | msg_is_weak_password: 'Schwaches Passwort, bitte ändern', |
| | | msg_pswChangeSuccessAndLogin: 'Passwort geändert, bitte neu anmelden', |
| | | msg_pswChangeSuccess: 'Passwort geändert', |
| | | msg_pswChangeFail: 'Passwortänderung fehlgeschlagen', |
| | | msg_saveSuccess: 'Erfolgreich gespeichert', |
| | | msg_saveFail: 'Speichern fehlgeschlagen', |
| | | msg_formFilled: 'Bitte Formular prüfen', |
| | | msg_number_0_23: 'Nur 0 bis 23', |
| | | msg_number_0_24: 'Nur 0 bis 24', |
| | | msg_noChange: 'Keine Konfigurationsänderungen zu speichern', |
| | | resourceConfiguration: 'Ressourcenkonfiguration', |
| | | backgroundImage: 'Hintergrundbild', |
| | | selectImage: 'Bild auswählen', |
| | | uploadBackground: 'Hintergrund hochladen', |
| | | uploading: 'Lädt hoch...', |
| | | backgroundUploadTip: 'Bitte laden Sie ein PNG-Bild mit einer Auflösung von {n} Pixeln hoch. Das Bild wird in Base64-Format konvertiert und auf das Gerät hochgeladen', |
| | | backgroundResolutionMismatch: 'Die Bildauflösung muss {n} sein', |
| | | backgroundRequired: 'Bitte ein Hintergrundbild wählen', |
| | | backgroundImageOnlyPNG: 'Nur PNG-Bilder', |
| | | backgroundSizeLimit: 'Bild darf 5MB nicht überschreiten', |
| | | backgroundParseFailed: 'Bild konnte nicht gelesen werden', |
| | | backgroundImageSelected: 'Bild ausgewählt', |
| | | backgroundSuccess: 'Hintergrund hochgeladen', |
| | | backgroundFailed: 'Upload fehlgeschlagen', |
| | | scanSettings: 'Scan-Einstellungen', |
| | | scanSwitch: 'Scan-Schalter', |
| | | scanInterval: 'Scan-Intervall', |
| | | }, |
| | | person: { |
| | | idCard: 'Ausweisnummer', |
| | | userType: 'Personentyp', |
| | | administrator: 'Administrator', |
| | | userId: 'ID', |
| | | user: 'Benutzer', |
| | | voucher: 'Nachweis', |
| | | permission: 'Berechtigung', |
| | | addUser: 'Person hinzufügen', |
| | | name: 'Name', |
| | | editUser: 'Person bearbeiten', |
| | | placeholderUserId: 'Benutzer-ID eingeben', |
| | | placeholderName: 'Name eingeben', |
| | | userNotExist: 'Person existiert nicht', |
| | | oneClickClear: 'Alles löschen', |
| | | clearTips: 'Dies löscht alle Daten, fortfahren?', |
| | | clearSuccess: 'Löschen erfolgreich', |
| | | clearFailed: 'Löschen fehlgeschlagen', |
| | | }, |
| | | voucher: { |
| | | password: 'Passwort', |
| | | card: 'Karte', |
| | | face: 'Gesicht', |
| | | finger: 'Fingerabdruck', |
| | | code: 'Code', |
| | | codeType: 'Codetyp', |
| | | passthroughCode: 'Durchgangscode', |
| | | staticCode: 'Statischer Code', |
| | | dynamicCode: 'Dynamischer Code', |
| | | credentialId: 'Anmelde-ID', |
| | | credentialValue: 'Anmeldewert', |
| | | placeholderCode: 'Bitte Codezertifikat eingeben', |
| | | placeholderPwd: 'Passwortnachweis eingeben', |
| | | placeholderCard: 'Kartennachweis eingeben', |
| | | validPassword: 'Bitte 6 Ziffern eingeben', |
| | | validCard: 'Bitte 8 Ziffern oder Buchstaben eingeben', |
| | | photoRegistration: 'Foto-Registrierung', |
| | | featureValueRegistration: 'Merkmals-Registrierung', |
| | | fingerRegistration: 'Fingerabdruck-Registrierung', |
| | | fingerFeatureRegistration: 'Registrierung über Merkmalswert', |
| | | fingerInput: 'Bitte legen Sie den Finger auf den Fingerabdruckscanner', |
| | | fingerRemainingTime: 'Verbleibende Zeit', |
| | | fingerInputting: 'Wird erfasst...', |
| | | startFingerInput: 'Fingerabdruck erfassen', |
| | | fingerInputTips: 'Bitte Fingerabdruck-Merkmalswert eingeben', |
| | | fingerWaitInput: 'Warten auf Erfassung', |
| | | fingerInputNow: 'Fingerabdruck wird erfasst...', |
| | | fingerInputSuccess: 'Erfassung erfolgreich', |
| | | fingerInputFailed: 'Start der Fingerabdruckerfassung fehlgeschlagen', |
| | | fingerReTry: 'Fingerabdruckerfassung fehlgeschlagen, bitte erneut versuchen', |
| | | fingerFilled: 'Erfassung erfolgreich, Merkmalswert wurde automatisch eingetragen', |
| | | fingerFailed: 'Fingerabdruckerfassung fehlgeschlagen', |
| | | fingerTimeout: 'Zeitüberschreitung', |
| | | fingerInputTimeout: 'Zeitüberschreitung bei der Fingerabdruckerfassung, bitte erneut versuchen', |
| | | fingerError: 'Erfassung fehlgeschlagen', |
| | | fingerInputError: 'Fingerabdruckerfassung fehlgeschlagen, bitte erneut versuchen', |
| | | fingerInputed: 'Fingerabdruck bereits erfasst', |
| | | fingerReInput: 'Fingerabdruck erneut erfassen', |
| | | }, |
| | | permission: { |
| | | deletePermission: 'Berechtigung löschen', |
| | | addPermission: 'Berechtigung hinzufügen', |
| | | permissionId: 'Berechtigungs-ID', |
| | | userId: 'Benutzer-ID', |
| | | timeRange: 'Zeitraum', |
| | | extra: 'Extra', |
| | | effectiveType: 'Gültigkeitstyp', |
| | | effectiveTime: 'Gültige Zeit', |
| | | effectiveWeek: 'Gültige Woche', |
| | | timePeriod: 'Zeitabschnitt', |
| | | addTimePeriod: 'Zeitabschnitt hinzufügen', |
| | | modify_previous_time: 'Vorherigen Abschnitt zuerst ändern', |
| | | cannot_be_earlier: 'Endzeit darf nicht vor Startzeit liegen', |
| | | times_cannot_overlap: 'Zeiten dürfen sich nicht überschneiden', |
| | | choose_time_range: 'Zeitraum wählen', |
| | | unlimitedMode: 'Unbegrenzt', |
| | | usualMode: 'Normalmodus', |
| | | dailyMode: 'Täglich', |
| | | weeklyRepetitionMode: 'Wöchentliche Wiederholung', |
| | | time_range: 'Zeitbereich', |
| | | }, |
| | | common: { |
| | | startDate: 'Startdatum', |
| | | endDate: 'Enddatum', |
| | | to: 'bis', |
| | | cancel: 'Abbrechen', |
| | | confirm: 'Bestätigen', |
| | | close: 'SchlieÃen', |
| | | delete: 'Löschen', |
| | | edit: 'Bearbeiten', |
| | | batchDelete: 'Stapel löschen', |
| | | startTime: 'Startzeit', |
| | | endTime: 'Endzeit', |
| | | monday: 'Montag', |
| | | tuseday: 'Dienstag', |
| | | wednesday: 'Mittwoch', |
| | | thursday: 'Donnerstag', |
| | | friday: 'Freitag', |
| | | saterday: 'Samstag', |
| | | sunday: 'Sonntag', |
| | | placeholder: 'Bitte eingeben', |
| | | placeholderSelect: 'Bitte wählen', |
| | | closeTips: 'SchlieÃen bestätigen?', |
| | | deleteTips: 'Löschen bestätigen?', |
| | | deleteSuccess: 'Erfolgreich gelöscht', |
| | | addSuccess: 'Erfolgreich hinzugefügt', |
| | | editSuccess: 'Erfolgreich bearbeitet', |
| | | saveSuccess: 'Erfolgreich gespeichert', |
| | | tips: 'Hinweis', |
| | | operation: 'Operation', |
| | | query: 'Abfrage', |
| | | reset: 'Reset', |
| | | noData: 'Keine Daten', |
| | | export: 'Exportieren', |
| | | success: 'Erfolg', |
| | | failure: 'Fehler', |
| | | incorrectFormat: 'Falsches Format', |
| | | integerFormat: 'Ganzzahl â¥0 erforderlich', |
| | | positiveIntegerFormat: 'Ganzzahl >0 erforderlich', |
| | | noDataSaved: 'Keine Daten zu speichern', |
| | | chinese: 'Chinesisch', |
| | | english: 'Englisch', |
| | | spanish: 'Spanisch', |
| | | french: 'Französisch', |
| | | german: 'Deutsch', |
| | | russian: 'Russisch', |
| | | arabic: 'Arabisch', |
| | | portuguese: 'Portugiesisch', |
| | | korean: 'Koreanisch', |
| | | detail: 'Details', |
| | | clearTips: 'Wirklich leeren?â', |
| | | clearSuccess: 'Erfolgreich gelöscht', |
| | | }, |
| | | log: { |
| | | accessMethod: 'Zugriffsmethode', |
| | | passingTime: 'Durchgangszeit', |
| | | accessPass: 'Zugangsnachweis', |
| | | accessResult: 'Ergebnis', |
| | | accessPhoto: 'Foto', |
| | | viewPhotos: 'Fotos ansehen' |
| | | }, |
| | | error: { |
| | | networkError: 'Netzwerkfehler, Verbindung prüfen', |
| | | timeout: 'Zeitüberschreitung, bitte erneut versuchen', |
| | | serverError: 'Serverfehler, später erneut versuchen', |
| | | notFound: 'Ressource nicht gefunden', |
| | | unauthorized: 'Nicht autorisiert, bitte neu anmelden', |
| | | noResponse: 'Keine Serverantwort, Netzwerk prüfen', |
| | | unknownError: 'Anfrage fehlgeschlagen, Code:', |
| | | requestFailed: 'Anfrage fehlgeschlagen' |
| | | }, |
| | | security: { |
| | | keyId: 'Schlüssel-ID', |
| | | keyType: 'Schlüsseltyp', |
| | | keyEncoding: 'Schlüsselkodierung', |
| | | keyValue: 'Schlüsselwert', |
| | | startTime: 'Startzeit', |
| | | expirationTime: 'Ablaufzeit', |
| | | newKey: 'Neuer Schlüssel', |
| | | clearKey: 'Schlüssel löschen', |
| | | validTime: 'Gültigkeitsdauer', |
| | | } |
| | | } |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // ç»å½é¡µ |
| | | login: { |
| | | lang: 'language', |
| | | systemname: 'Face Login', |
| | | username: 'username', |
| | | username_label: 'Please input one user name', |
| | | pwd: 'password', |
| | | pwd_label: 'Please input a password', |
| | | pwd_info: 'Please enter the correct password format', |
| | | success_msg: 'Login successfully', |
| | | error_name: 'Wrong password', |
| | | error_res: 'Does not meet the login requirements', |
| | | login: 'Login', |
| | | }, |
| | | // ä¾§è¾¹æ é¨å |
| | | aside: { |
| | | systemname: 'Face System', |
| | | help: 'Help', |
| | | administrator: 'Administrator', |
| | | quit: 'Quit', |
| | | deviceControl: 'Control', |
| | | basicSetting: 'Settings', |
| | | workerSetting: 'Personnel', |
| | | deviceMonitoring: 'Monitoring', |
| | | recordManagement: 'Records', |
| | | securityManagement: 'Key', |
| | | tips: 'Tips', |
| | | tips_msg: 'Do you want to log out', |
| | | }, |
| | | // è®¾å¤æ§å¶é¡µé¢ |
| | | control: { |
| | | remoteControl: 'Remote', |
| | | restart: 'Restart', |
| | | clickToRestart: 'Click to restart the device', |
| | | restartConfirm: 'Are you sure you want to restart the device?', |
| | | restartSuccess: 'Successful restart', |
| | | restartFailed: 'Failed to restart', |
| | | remoteOpen: 'Remote door opening', |
| | | clickToOpen: 'Click remote door opening', |
| | | openConfirm: 'Are you sure you want to open the door remotely?', |
| | | remoteOpenSuccess: 'Remote door opening successful', |
| | | remoteOpenFailed: 'Remote door opening failed', |
| | | reset: 'Device reset', |
| | | clickToReset: 'Click reset device', |
| | | resetConfirm: 'Are you sure you want to reset the device?', |
| | | resetWillOut: "Log out after reset.", |
| | | resetSuccess: 'The device reset was successful', |
| | | resetFailed: 'Device reset failed', |
| | | firmwareUpgrade: 'Equipment upgrade', |
| | | upgradeConfig: 'Upgrade configuration', |
| | | firmwareUrl: 'Firmware address', |
| | | md5Checksum: 'md5 value', |
| | | startUpgrade: 'Start upgrading', |
| | | urlRequired: 'The file address is mandatory', |
| | | md5Required: 'The md5 value is required', |
| | | urlInvalid: 'Please enter the correct address', |
| | | md5Invalid: 'Please enter the correct md5', |
| | | upgradeConfirm: 'Are you sure you want to upgrade the equipment?', |
| | | upgradeSuccess: 'The equipment upgrade was successful.', |
| | | clearFile: "Clear the file", |
| | | uploading: 'Uploading', |
| | | uploadAndUpgrade: 'Upload and upgrade', |
| | | restartTips: 'Safely restart the device system without losing data', |
| | | restarting: 'Restarting...', |
| | | remoteTips: 'Remotely control the access control device to open', |
| | | opening: 'Opening...', |
| | | resetTips: 'Restore factory Settings and clear all data', |
| | | reseting: 'Reseting...', |
| | | urlUpgrade: 'URL upgrade method', |
| | | fileUpgrade: 'File upload upgrade', |
| | | uploadFile: 'Click to upload the firmware file', |
| | | formatFile: 'Supports.zip or.dpk format files, with a maximum size of 20MB', |
| | | fileName: 'File name', |
| | | size: 'Size', |
| | | }, |
| | | config: { |
| | | second: 's', |
| | | millisecond: 'Milliseconds', |
| | | min: 'Minutes', |
| | | notsave: 'Not saved', |
| | | save: 'Save', |
| | | noVoice: 'No voice', |
| | | no: 'NO', |
| | | yes: 'YES', |
| | | // åºç¡é
ç½® |
| | | basicConfiguration: 'Basic configuration', |
| | | informationDisplay: 'Information display', |
| | | audioSettings: 'Audio Settings', |
| | | displaySettings: 'Display Settings', |
| | | languageAndThemes: 'Language and Themes', |
| | | autoAdjustScreenBrightness: 'Automatically adjust the screen brightness', |
| | | screenBrightness: 'Screen brightness', |
| | | autoTurnOffScreen: 'Automatic screen-off', |
| | | autoTurnOffScreenTime: 'Automatic screen-off time', |
| | | autoScreenSaver: 'Automatic screen saver', |
| | | autoScreenSaverTime: 'Automatic screen saver time', |
| | | displayDeviceSn: 'Display SN', |
| | | displayIp: 'Display IP', |
| | | displayIdentityCard: 'Display Cloud Certificate', |
| | | volume: 'Volume', |
| | | language: 'Language', |
| | | displayCode: "Display the mini-program code", |
| | | themeMode: "Work theme", |
| | | cn: 'Chinese', |
| | | en: 'English', |
| | | es: 'Spanish', |
| | | fr: 'French', |
| | | de: 'German', |
| | | ru: 'Russian', |
| | | ar: 'Arabic', |
| | | pt: 'Port.', |
| | | ko: 'Korean', |
| | | standardMode: 'Standard Mode', |
| | | simpleMode: 'Simple Mode', |
| | | firstLogin: 'This is my first time logging into the backend', |
| | | backlight: 'Screen backlight', |
| | | brightness: 'White fill light', |
| | | nirBrightness: 'Infrared supplementary light', |
| | | never: 'Never', |
| | | min1: '1 Min', |
| | | min2: '2 Min', |
| | | min3: '3 Min', |
| | | min4: '4 Min', |
| | | min5: '5 Min', |
| | | // ç½ç»é
ç½® |
| | | networkConfiguration: 'Network configuration', |
| | | otherConfiguration: 'Other configurations', |
| | | ipConfiguration: 'IP configuration', |
| | | devicePassword: 'Device password ', |
| | | protocolPassword: 'Communication protocol password', |
| | | networkType: 'Network type ', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'Wi-Fi name', |
| | | wifiPassword: 'Wi-Fi password', |
| | | dhcpModeSelection: 'DHCP mode', |
| | | dhcpMode: 'Automatic acquisition', |
| | | customNetworkConfiguration: 'Manual configuration', |
| | | ipAddress: 'IP address', |
| | | gateway: 'Gateway', |
| | | subnetMask: 'Subnet mask', |
| | | dnsServer: 'DNS server', |
| | | mac: 'Mac address', |
| | | // MQTTé
ç½® |
| | | mqttRelatedConfiguration: 'MQTT configuration', |
| | | mqttConnectionInformation: 'MQTT connection information', |
| | | sessionConfiguration: 'Session configuration', |
| | | serverAddress: 'Server address', |
| | | clientID: 'Client ID', |
| | | userName: 'User name', |
| | | userPassword: 'User password', |
| | | topicPrefix: 'Theme prefix', |
| | | onlineChecking: 'Online verification', |
| | | onlineCheckingTimeout: "Online verification timeout", |
| | | cleanSession: 'Clear the session', |
| | | clientIdSuffix: 'ClientId suffix', |
| | | willTopic: 'WillTopic', |
| | | enterpriseWechat:'The Enterprise wechat mode is ineffective', |
| | | // 人è¸é
ç½® |
| | | faceRelatedConfiguration: 'Face configuration', |
| | | functionalInformation: 'Functional information', |
| | | prompt: 'Prompt', |
| | | faceSimilarityThreshold: 'Face similarity threshold', |
| | | livenessDetectionFunction: 'Live detection function', |
| | | livenessDetectionThreshold: 'Live detection threshold', |
| | | infraredImageDisplay: "Infrared image display", |
| | | maskRecognition: "Mask recognition", |
| | | strangerVoice: "Stranger's voice", |
| | | voiceMode: "Voice mode", |
| | | voiceModeDate: 'Customized greeting', |
| | | imageSaveType: "Image saving type", |
| | | saveStrangerImage: "Save images of strangers", |
| | | fullView: "Panoramic view", |
| | | face: "Face", |
| | | broadcastPleaseRegisterFirst: 'Play please register for a facial recognition voucher', |
| | | broadcastHelloStranger: 'Play unregistered personnel', |
| | | broadcastName: 'Play the name', |
| | | broadcastGreeting: 'Play a custom greeting', |
| | | greeting: 'Greeting', |
| | | broadcastWelcome: 'Play welcome', |
| | | recognitionSwitch: 'Re-detection switch', |
| | | // ç³»ç»é
ç½® |
| | | systemRelatedConfiguration: 'System configuration', |
| | | functionSwitch: 'Function switch', |
| | | cardSwipingSwitch: 'Card swiping switch', |
| | | passwordSwitch: 'Password switch', |
| | | cloudCertificateSwitch: 'Cloud Certificate switch', |
| | | strangerImage: 'Stranger save picture switch', |
| | | physicalCardNumber: 'Physical card number', |
| | | cloudCertificateAcquisition: 'Cloud Certificate Acquisition', |
| | | heartbeatConfig: 'Heartbeat config', |
| | | heartbeatSwitch: 'Heartbeat switch', |
| | | heartRateInterval: 'Heart rate interval', |
| | | heartbeatTopic: 'Heartbeat Topic', |
| | | heartbeatContent: 'Heartbeat content', |
| | | basicInformation: 'Basic information', |
| | | deviceMac: 'Device Mac', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Model', |
| | | version: "Version", |
| | | appVersion: "Firmware version", |
| | | releaseTime: "Update time", |
| | | totaldisk: 'Total storage space', |
| | | freedisk: 'Remaining space', |
| | | // éè¡é
ç½® |
| | | passageConfiguration: 'Passage configuration', |
| | | functionConfiguration: 'Function Configuration', |
| | | numberOfPassageRecords: 'The maximum number of passage records', |
| | | durationOfRelayOpening: 'Duration of relay opening', |
| | | alarmSwitch: 'Alarm switch', |
| | | fireAlarmSwitch: 'Fire alarm switch', |
| | | fireAlarmStatus: 'Fire alarm status', |
| | | normal: 'Normal', |
| | | warning: 'Warning', |
| | | tamperSwitch: 'Tamper switch', |
| | | uploadToCloudSwitch: 'Face upload switch', |
| | | // æ¶éé
ç½® |
| | | clockConfiguration: 'Clock configuration', |
| | | timeSynchronizationSwitch: 'Time synchronization switch', |
| | | timeSynchronizationServerIP: 'Time synchronization server IP', |
| | | timedSynchronizationTime: 'Timed synchronization time', |
| | | timeZone: 'Time zone', |
| | | setDeviceTime: 'Set device time', |
| | | restartAfterSetting: 'After setting, the device will automatically restart', |
| | | // äºè¯æ¿æ´» |
| | | cloudCertificateActivation: 'Cloud Certificate Activation', |
| | | activationKey: 'Activation key', |
| | | cloudTips1: 'Please enter the activation key and make sure there are no Spaces', |
| | | cloudTips2: 'After successful activation, the device will connect to the cloud authentication service', |
| | | confirmActivation: 'Confirm activation', |
| | | activationInProgress: 'Activation in progress...', |
| | | activationFailed: 'Activation failed', |
| | | activationSuccessful: 'Activation successful', |
| | | // å¯ç ä¿®æ¹ |
| | | passwordModification: 'Password modification', |
| | | password: 'Password', |
| | | oldPassword: 'Old password', |
| | | newPassword: 'New password', |
| | | confirmPassword: 'Confirm password', |
| | | passwordRule: 'Password rule recommendation', |
| | | passwordLength: 'Length â¥6', |
| | | cannotBeTheSame: 'All characters cannot be the same', |
| | | cannotOrder: 'It cannot contain at least three consecutive numbers or sequences of lowercase letters (in ascending or descending order).', |
| | | cannotWeakPassword: 'It cannot be common weak passwords, including', |
| | | submit: 'Submit', |
| | | saveConfig: 'Save config', |
| | | msg_please_enter: 'Please enter the content', |
| | | msg_inputPassword: 'Please enter the password.', |
| | | msg_oldPasswordError: 'The old password is incorrect', |
| | | msg_password_mismatch: 'The passwords entered twice are inconsistent', |
| | | msg_password_min_length: 'The password length should be at least 6 characters', |
| | | msg_is_weak_password: 'This is a weak password. Please reset it', |
| | | msg_pswChangeSuccessAndLogin: 'Your password has been modified successfully. Please log in again', |
| | | msg_pswChangeSuccess: 'The password has been modified successfully.', |
| | | msg_pswChangeFail: 'Password modification failed.', |
| | | msg_saveSuccess: 'Saved successfully', |
| | | msg_saveFail: 'Save failed', |
| | | msg_formFilled: 'Please check whether the form is filled out correctly', |
| | | msg_number_0_23: 'Only supports 0 to 23', |
| | | msg_number_0_24: 'Only supports 0 to 24', |
| | | msg_noChange: 'No configuration changes need to be saved', |
| | | // Resource configuration |
| | | resourceConfiguration: 'Resource configuration', |
| | | backgroundImage: 'Background image', |
| | | selectImage: 'Select image', |
| | | uploadBackground: 'Upload background', |
| | | uploading: 'Uploading...', |
| | | backgroundUploadTip: 'Please upload a PNG image with pixel size of {n}. The image will be converted to Base64 format and then uploaded to the device', |
| | | backgroundResolutionMismatch: 'Image resolution must be {n}', |
| | | backgroundRequired: 'Please select a background image first', |
| | | backgroundImageOnlyPNG: 'Please upload a PNG image', |
| | | backgroundSizeLimit: 'Image size cannot exceed 5MB', |
| | | backgroundParseFailed: 'Failed to read image, please retry', |
| | | backgroundImageSelected: 'Image selected successfully', |
| | | backgroundSuccess: 'Background uploaded successfully', |
| | | backgroundFailed: 'Background upload failed', |
| | | scanSettings: 'Scan Settings', |
| | | scanSwitch: 'Scan Switch', |
| | | scanInterval: 'Scan Interval', |
| | | }, |
| | | // 人å设置 |
| | | person: { |
| | | idCard: 'Id number', |
| | | userType: 'Type', |
| | | userId: 'ID', |
| | | name: 'name', |
| | | user: 'User', |
| | | administrator: 'Administrator', |
| | | voucher: 'Voucher', |
| | | permission: 'Permission', |
| | | placeholderUserId: 'Please enter the userId', |
| | | placeholderName: 'Please enter the name', |
| | | addUser: 'Add user', |
| | | editUser: 'Edit user', |
| | | userNotExist: 'The personnel do not exist', |
| | | oneClickClear: 'One-click clear', |
| | | clearTips: 'This operation will permanently delete all personnel, credentials and permission data. Do you want to continue?', |
| | | clearSuccess: 'Cleared successfully', |
| | | clearFailed: 'Failed to clear', |
| | | }, |
| | | voucher: { |
| | | password: 'Password', |
| | | card: 'Card', |
| | | face: 'Face', |
| | | finger: 'Finger', |
| | | code: 'Code', |
| | | codeType: 'Code Type', |
| | | passthroughCode: 'Passthrough Code', |
| | | staticCode: 'Static Code', |
| | | dynamicCode: 'Dynamic Code', |
| | | credentialId: 'Credential ID', |
| | | credentialValue: 'Credential Value', |
| | | placeholderCode: 'Please enter code certificate', |
| | | placeholderPwd: 'Please enter the password credential', |
| | | placeholderCard: 'Please enter the card voucher', |
| | | validPassword: 'Please enter six digits', |
| | | validCard: 'Please enter 8 digits or letters', |
| | | photoRegistration: 'Photo registration', |
| | | featureValueRegistration: 'Feature value registration', |
| | | fingerRegistration: 'Finger registration', |
| | | fingerFeatureRegistration: 'Feature value registration', |
| | | fingerInput: 'Please put your finger on the fingerprint scanner', |
| | | fingerRemainingTime: 'Remaining time', |
| | | fingerInputting: 'Inputting...', |
| | | startFingerInput: 'Start inputting fingerprint', |
| | | fingerInputTips: 'Please enter the fingerprint feature value', |
| | | fingerWaitInput: 'Waiting for input', |
| | | fingerInputNow: 'Inputting fingerprint...', |
| | | fingerInputSuccess: 'Input success', |
| | | fingerInputFailed: 'Finger input failed', |
| | | fingerReTry: 'Finger input failed, please try again', |
| | | fingerFilled: 'Finger input success, feature value has been automatically filled', |
| | | fingerFailed: 'Finger input failed', |
| | | fingerTimeout: 'Input timeout', |
| | | fingerInputTimeout: 'Finger input timeout, please try again', |
| | | fingerError: 'Input failed', |
| | | fingerInputError: 'Finger input failed, please try again', |
| | | fingerInputed: 'Fingerprint has been entered', |
| | | fingerReInput: 'Re enter fingerprint', |
| | | }, |
| | | |
| | | permission: { |
| | | deletePermission: 'Delete permission', |
| | | addPermission: 'Add permissions', |
| | | permissionId: 'Permission ID', |
| | | userId: 'User ID', |
| | | timeRange: 'Time interval', |
| | | extra: 'Extra', |
| | | effectiveType: 'Effective Type', |
| | | effectiveTime: 'Effective Time', |
| | | effectiveWeek: 'Effective Week', |
| | | timePeriod: 'Time period', |
| | | addTimePeriod: 'Add a time period', |
| | | modify_previous_time: 'Please modify the previously added time period first', |
| | | cannot_be_earlier: 'The end time must not be less than the start time', |
| | | times_cannot_overlap: 'The selected times cannot overlap', |
| | | choose_time_range: 'Please select the effective time range', |
| | | unlimitedMode: 'Unlimited mode', |
| | | usualMode: 'Usual mode', |
| | | dailyMode: 'Daily mode', |
| | | weeklyRepetitionMode: 'Weekly repetition mode', |
| | | time_range: 'Time range', |
| | | }, |
| | | |
| | | common: { |
| | | startDate: 'Start date', |
| | | endDate: 'End date', |
| | | to: 'to', |
| | | cancel: 'Cancel', |
| | | confirm: 'Confirm', |
| | | close: 'Close', |
| | | delete: 'Delete', |
| | | edit: 'Edit', |
| | | batchDelete: 'Batch Delete', |
| | | startTime: 'Start time', |
| | | endTime: 'End time', |
| | | monday: 'Monday', |
| | | tuseday: 'Tuseday', |
| | | wednesday: 'Wednesday', |
| | | thursday: 'Thursday', |
| | | friday: 'Friday', |
| | | saterday: 'Saterday', |
| | | sunday: 'Sunday', |
| | | placeholder: 'Please enter', |
| | | placeholderSelect: 'Please select', |
| | | closeTips: 'Is it confirmed to be closed?', |
| | | deleteTips: 'Are you sure to delete it?', |
| | | deleteSuccess: 'Deleted successfully', |
| | | addSuccess: 'Added successfully', |
| | | editSuccess: 'Edited successfully', |
| | | saveSuccess: 'Saved successfully', |
| | | tips: 'Tips', |
| | | operation: 'Operation', |
| | | query: 'Query', |
| | | reset: 'Reset', |
| | | noData: 'No data available for the time being.', |
| | | export: 'Export', |
| | | success: 'success', |
| | | failure: 'failure', |
| | | incorrectFormat: 'Incorrect format', |
| | | integerFormat: 'Should be an integer greater than or equal to 0', |
| | | positiveIntegerFormat: 'Should be an integer greater than 0', |
| | | noDataSaved: 'No data needs to be saved', |
| | | chinese: 'Chinese', |
| | | english: 'English', |
| | | spanish: 'Spanish', |
| | | french: 'French', |
| | | german: 'German', |
| | | russian: 'Russian', |
| | | arabic: 'Arabic', |
| | | portuguese: 'Portuguese', |
| | | korean: 'Korean', |
| | | detail: 'Detail', |
| | | clearTips: 'Confirm clear?', |
| | | clearSuccess: 'Cleared successfully', |
| | | }, |
| | | |
| | | log: { |
| | | accessMethod: 'Access method', |
| | | passingTime: 'Passing time', |
| | | accessPass: 'Access pass', |
| | | accessResult: 'Access result', |
| | | accessPhoto: 'Access photo', |
| | | viewPhotos: 'View photos' |
| | | }, |
| | | |
| | | error: { |
| | | networkError: 'Network request failed, please check your connection', |
| | | timeout: 'Request timeout, please check your network or try again later', |
| | | serverError: 'Server internal error, please try again later', |
| | | notFound: 'Requested resource does not exist', |
| | | unauthorized: 'Unauthorized, please login again', |
| | | noResponse: 'Unable to connect to server, please check network or server status', |
| | | unknownError: 'Request failed, error code:', |
| | | requestFailed: 'Request failed' |
| | | }, |
| | | |
| | | security: { |
| | | keyId: 'Key ID', |
| | | keyType: 'Key Type', |
| | | keyEncoding: 'Key Encoding', |
| | | keyValue: 'Key Value', |
| | | startTime: 'Start Time', |
| | | expirationTime: 'Expiration Time', |
| | | newKey: 'Add Key', |
| | | clearKey: 'Clear Key', |
| | | validTime: 'Valid Time', |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | export default { |
| | | // Inicio de sesión |
| | | login: { |
| | | lang: 'Idioma', |
| | | systemname: 'Login Facial', |
| | | username: 'Usuario', |
| | | username_label: 'Por favor ingrese el usuario', |
| | | pwd: 'Contraseña', |
| | | pwd_label: 'Por favor ingrese la contraseña', |
| | | pwd_info: 'Ingrese el formato correcto de contraseña', |
| | | success_msg: 'Inicio de sesión exitoso', |
| | | error_name: 'Contraseña incorrecta', |
| | | error_res: 'No cumple con los requisitos de inicio de sesión', |
| | | login: 'Iniciar sesión', |
| | | }, |
| | | // Barra lateral |
| | | aside: { |
| | | systemname: 'Panel Facial', |
| | | quit: 'Salir', |
| | | deviceControl: 'Control', |
| | | basicSetting: 'Config.', |
| | | workerSetting: 'Personal', |
| | | deviceMonitoring: 'Monitor', |
| | | recordManagement: 'Registros', |
| | | securityManagement: 'La clave', |
| | | tips: 'Aviso', |
| | | tips_msg: '¿Desea cerrar sesión?', |
| | | }, |
| | | // Control de dispositivo |
| | | control: { |
| | | remoteControl: 'Remoto', |
| | | restart: 'Reiniciar', |
| | | clickToRestart: 'Clic para reiniciar', |
| | | restartConfirm: '¿Seguro que desea reiniciar?', |
| | | restartSuccess: 'Reinicio exitoso', |
| | | restartFailed: 'Reinicio fallido', |
| | | remoteOpen: 'Abrir puerta de forma remota', |
| | | clickToOpen: 'Clic para abrir', |
| | | openConfirm: '¿Seguro que desea abrir remotamente?', |
| | | remoteOpenSuccess: 'Apertura exitosa', |
| | | remoteOpenFailed: 'Apertura fallida', |
| | | reset: 'Restablecer dispositivo', |
| | | clickToReset: 'Clic para restablecer', |
| | | resetConfirm: '¿Seguro que desea restablecer?', |
| | | resetWillOut: "Reinicio = cierre sesión", |
| | | resetSuccess: 'Restablecimiento exitoso', |
| | | resetFailed: 'Restablecimiento fallido', |
| | | firmwareUpgrade: 'Actualización de firmware', |
| | | upgradeConfig: 'Config. de actualización', |
| | | firmwareUrl: 'URL del firmware', |
| | | md5Checksum: 'Valor md5', |
| | | startUpgrade: 'Iniciar actualización', |
| | | urlRequired: 'La URL es obligatoria', |
| | | md5Required: 'El md5 es obligatorio', |
| | | urlInvalid: 'Ingrese una URL válida', |
| | | md5Invalid: 'Ingrese un md5 válido', |
| | | upgradeConfirm: '¿Confirmar actualización?', |
| | | upgradeSuccess: 'Actualización exitosa', |
| | | clearFile: "Borrar archivo", |
| | | uploading: 'Subiendo...', |
| | | uploadAndUpgrade: 'Subir y actualizar', |
| | | restartTips: 'Reinicio seguro, no se perderán datos', |
| | | restarting: 'Reiniciando...', |
| | | remoteTips: 'Control remoto de acceso', |
| | | opening: 'Abriendo...', |
| | | resetTips: 'Restaurar de fábrica, borrará datos', |
| | | reseting: 'Restableciendo...', |
| | | urlUpgrade: 'Actualización por URL', |
| | | fileUpgrade: 'Subida de archivo', |
| | | uploadFile: 'Clic para subir firmware', |
| | | formatFile: 'Soporta .zip o .dpk, máx 20MB', |
| | | fileName: 'Nombre', |
| | | size: 'Tamaño', |
| | | }, |
| | | // Configuración |
| | | config: { |
| | | second: 's', |
| | | millisecond: 'ms', |
| | | min: 'minutos', |
| | | notsave: 'No guardar', |
| | | save: 'Guardar', |
| | | noVoice: 'Sin voz', |
| | | no: 'No', |
| | | yes: 'SÃ', |
| | | // Básico |
| | | basicConfiguration: 'Configuración básica', |
| | | displaySettings: 'Pantalla', |
| | | informationDisplay: 'Mostrar información', |
| | | audioSettings: 'Audio', |
| | | languageAndThemes: 'Idioma y tema', |
| | | autoAdjustScreenBrightness: 'Brillo automático', |
| | | screenBrightness: 'Brillo de pantalla', |
| | | autoTurnOffScreen: 'Apagado automático', |
| | | autoTurnOffScreenTime: 'Tiempo de apagado', |
| | | autoScreenSaver: 'Salvapantallas automático', |
| | | autoScreenSaverTime: 'Tiempo de salvapantallas', |
| | | displayDeviceSn: 'Mostrar SN', |
| | | displayIp: 'Mostrar IP', |
| | | displayIdentityCard: 'Mostrar credencial en la nube', |
| | | volume: 'Volumen', |
| | | language: 'Idioma', |
| | | displayCode: "Mostrar código de miniapp", |
| | | themeMode: "Tema", |
| | | cn: 'Chino', |
| | | en: 'Inglés', |
| | | es: 'Español', |
| | | fr: 'Francés', |
| | | de: 'Alemán', |
| | | ru: 'Ruso', |
| | | ar: 'Ãrabe', |
| | | pt: 'Port.', |
| | | ko: 'Coreano', |
| | | standardMode: 'Modo estándar', |
| | | simpleMode: 'Modo simple', |
| | | firstLogin: 'Primer inicio de sesión', |
| | | backlight: 'Luz de fondo', |
| | | brightness: 'Luz blanca', |
| | | nirBrightness: 'Luz IR', |
| | | never: 'Nunca', |
| | | min1: '1 minuto', |
| | | min2: '2 minutos', |
| | | min3: '3 minutos', |
| | | min4: '4 minutos', |
| | | min5: '5 minutos', |
| | | // Red |
| | | networkConfiguration: 'Red', |
| | | otherConfiguration: 'Otros', |
| | | ipConfiguration: 'IP', |
| | | devicePassword: 'Contraseña del dispositivo', |
| | | protocolPassword: 'Contraseña de protocolo', |
| | | networkType: 'Tipo de red', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'WiâFi', |
| | | wifiPassword: 'Contraseña WiâFi', |
| | | dhcpModeSelection: 'Modo DHCP', |
| | | dhcpMode: 'Automático', |
| | | customNetworkConfiguration: 'Manual', |
| | | ipAddress: 'IP', |
| | | gateway: 'Puerta de enlace', |
| | | subnetMask: 'Máscara de subred', |
| | | dnsServer: 'DNS', |
| | | mac: 'MAC de red', |
| | | // MQTT |
| | | mqttRelatedConfiguration: 'MQTT', |
| | | mqttConnectionInformation: 'Conexión MQTT', |
| | | sessionConfiguration: 'Sesión', |
| | | serverAddress: 'Servidor', |
| | | clientID: 'ID de cliente', |
| | | userName: 'Usuario', |
| | | userPassword: 'Contraseña', |
| | | topicPrefix: 'Prefijo de tema', |
| | | onlineChecking: 'Verificación en lÃnea', |
| | | onlineCheckingTimeout: "Tiempo de espera", |
| | | cleanSession: 'Limpiar sesión', |
| | | clientIdSuffix: 'Sufijo de ID', |
| | | willTopic: 'Tema de voluntad', |
| | | enterpriseWechat:'Modo WeChat Enterprise sin efecto', |
| | | // Rostro |
| | | faceRelatedConfiguration: 'Configuración facial', |
| | | functionalInformation: 'Función', |
| | | prompt: 'Mensaje', |
| | | faceSimilarityThreshold: 'Umbral de similitud', |
| | | livenessDetectionFunction: 'Detección de vivacidad', |
| | | livenessDetectionThreshold: 'Umbral de vivacidad', |
| | | infraredImageDisplay: "Mostrar infrarrojo", |
| | | maskRecognition: "Reconocer mascarilla", |
| | | strangerVoice: "Voz de desconocido", |
| | | voiceMode: "Modo de voz", |
| | | voiceModeDate: 'Saludo personalizado', |
| | | imageSaveType: "Tipo de guardado", |
| | | saveStrangerImage: "Guardar imagen de desconocido", |
| | | fullView: "Panorámica", |
| | | face: "Rostro", |
| | | broadcastPleaseRegisterFirst: 'Reproducir âRegistre primeroâ', |
| | | broadcastHelloStranger: 'Reproducir âDesconocidoâ', |
| | | broadcastName: 'Reproducir nombre', |
| | | broadcastGreeting: 'Reproducir saludo personalizado', |
| | | greeting: 'Saludo', |
| | | broadcastWelcome: 'Reproducir "Bienvenido"', |
| | | recognitionSwitch: 'Interruptor de re-detección', |
| | | // Sistema |
| | | systemRelatedConfiguration: 'Sistema', |
| | | functionSwitch: 'Interruptores', |
| | | cardSwipingSwitch: 'Tarjeta', |
| | | passwordSwitch: 'Contraseña', |
| | | strangerImage: 'Imagen de desconocido', |
| | | cloudCertificateSwitch: 'Certificado en la nube', |
| | | physicalCardNumber: 'Número de tarjeta fÃsica', |
| | | cloudCertificateAcquisition: 'Obtención de certificado en la nube', |
| | | heartbeatConfig: 'Heartbeat', |
| | | heartbeatSwitch: 'Heartbeat on/off', |
| | | heartRateInterval: 'Intervalo', |
| | | heartbeatTopic: 'Tema heartbeat', |
| | | heartbeatContent: 'Contenido', |
| | | basicInformation: 'Información básica', |
| | | deviceMac: 'MAC', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Modelo', |
| | | version: "Versión", |
| | | appVersion: "Versión de firmware", |
| | | releaseTime: "Hora de actualización", |
| | | totaldisk: 'Espacio total', |
| | | freedisk: 'Espacio restante', |
| | | // Paso |
| | | passageConfiguration: 'Paso', |
| | | functionConfiguration: 'Funciones', |
| | | numberOfPassageRecords: 'Máx. registros', |
| | | durationOfRelayOpening: 'Duración del relé', |
| | | alarmSwitch: 'Alarma', |
| | | fireAlarmSwitch: 'Alarma de incendios', |
| | | fireAlarmStatus: 'Estado de incendios', |
| | | normal: 'Normal', |
| | | warning: 'Aviso', |
| | | tamperSwitch: 'Antimanipulación', |
| | | uploadToCloudSwitch: 'Interruptor de carga facial', |
| | | // Reloj |
| | | clockConfiguration: 'Reloj', |
| | | timeSynchronizationSwitch: 'Sincronización horaria', |
| | | timeSynchronizationServerIP: 'Servidor de tiempo', |
| | | timedSynchronizationTime: 'Hora de sincronización', |
| | | timeZone: 'Zona horaria', |
| | | setDeviceTime: 'Configurar hora', |
| | | restartAfterSetting: 'El dispositivo se reiniciará', |
| | | // Activación de certificado en la nube |
| | | cloudCertificateActivation: 'Activación de certificado', |
| | | activationKey: 'Clave de activación', |
| | | cloudTips1: 'Ingrese la clave sin espacios', |
| | | cloudTips2: 'Tras activar, conectará al servicio de autenticación', |
| | | confirmActivation: 'Confirmar activación', |
| | | activationInProgress: 'Activando...', |
| | | activationFailed: 'Activación fallida', |
| | | activationSuccessful: 'Activación exitosa', |
| | | // Cambio de contraseña |
| | | passwordModification: 'Cambiar contraseña', |
| | | password: 'Contraseña', |
| | | oldPassword: 'Contraseña anterior', |
| | | newPassword: 'Nueva contraseña', |
| | | confirmPassword: 'Confirmar contraseña', |
| | | passwordRule: 'Recomendación de contraseña', |
| | | passwordLength: 'Longitud â¥6', |
| | | cannotBeTheSame: 'No puede ser todos los caracteres iguales', |
| | | cannotOrder: 'No incluir 3+ números/letras consecutivos', |
| | | cannotWeakPassword: 'No usar contraseñas débiles comunes', |
| | | submit: 'Enviar', |
| | | saveConfig: 'Guardar', |
| | | // Mensajes |
| | | msg_please_enter: 'Ingrese contenido', |
| | | msg_inputPassword: 'Ingrese contraseña', |
| | | msg_oldPasswordError: 'Contraseña anterior incorrecta', |
| | | msg_password_mismatch: 'Las contraseñas no coinciden', |
| | | msg_password_min_length: 'MÃnimo 6 caracteres', |
| | | msg_is_weak_password: 'Contraseña débil, cambie', |
| | | msg_pswChangeSuccessAndLogin: 'Cambio exitoso, inicie sesión', |
| | | msg_pswChangeSuccess: 'Cambio de contraseña exitoso', |
| | | msg_pswChangeFail: 'Cambio de contraseña fallido', |
| | | msg_saveSuccess: 'Guardado exitoso', |
| | | msg_saveFail: 'Guardado fallido', |
| | | msg_formFilled: 'Revise el formulario', |
| | | msg_number_0_23: 'Solo 0-23', |
| | | msg_number_0_24: 'Solo 0-24', |
| | | msg_noChange: 'No hay cambios de configuración para guardar', |
| | | // Configuración de recursos |
| | | resourceConfiguration: 'Configuración de recursos', |
| | | backgroundImage: 'Imagen de fondo', |
| | | selectImage: 'Seleccionar imagen', |
| | | uploadBackground: 'Subir fondo', |
| | | uploading: 'Subiendo...', |
| | | backgroundUploadTip: 'Suba una imagen PNG; se convertirá a Base64 y se enviará al dispositivo', |
| | | backgroundResolutionMismatch: 'La resolución de la imagen debe ser {n}', |
| | | backgroundRequired: 'Seleccione una imagen de fondo', |
| | | backgroundImageOnlyPNG: 'Solo imágenes PNG', |
| | | backgroundSizeLimit: 'La imagen no debe exceder 5MB', |
| | | backgroundParseFailed: 'Error al leer imagen, reintente', |
| | | backgroundImageSelected: 'Imagen seleccionada', |
| | | backgroundSuccess: 'Fondo subido', |
| | | backgroundFailed: 'Error al subir fondo', |
| | | scanSettings: 'Configuración de escaneo', |
| | | scanSwitch: 'Interruptor de Escaneo', |
| | | scanInterval: 'Intervalo de escaneo', |
| | | }, |
| | | // Gestión de personal |
| | | person: { |
| | | idCard: 'Número de ID', |
| | | userType: 'Tipo de persona', |
| | | administrator: 'Administrador', |
| | | userId: 'ID', |
| | | user: 'Usuario', |
| | | voucher: 'Credencial', |
| | | permission: 'Permiso', |
| | | addUser: 'Añadir persona', |
| | | name: 'Nombre', |
| | | editUser: 'Editar persona', |
| | | placeholderUserId: 'Ingrese ID de usuario', |
| | | placeholderName: 'Ingrese nombre', |
| | | userNotExist: 'La persona no existe', |
| | | oneClickClear: 'Borrar todo', |
| | | clearTips: 'Se borrarán todos los datos, ¿continuar?', |
| | | clearSuccess: 'Borrado exitoso', |
| | | clearFailed: 'Borrado fallido', |
| | | }, |
| | | voucher: { |
| | | password: 'Contraseña', |
| | | card: 'Tarjeta', |
| | | face: 'Rostro', |
| | | finger: 'Huella', |
| | | code: 'Código', |
| | | codeType: 'Tipo de código', |
| | | passthroughCode: 'Código de paso', |
| | | staticCode: 'Código estático', |
| | | dynamicCode: 'Código dinámico', |
| | | credentialId: 'ID de credencial', |
| | | credentialValue: 'Valor de credencial', |
| | | placeholderCode: 'Por favor ingrese certificado de código', |
| | | placeholderPwd: 'Ingrese la credencial de contraseña', |
| | | placeholderCard: 'Ingrese la credencial de tarjeta', |
| | | validPassword: 'Ingrese 6 dÃgitos', |
| | | validCard: 'Ingrese 8 dÃgitos o letras', |
| | | photoRegistration: 'Registro de foto', |
| | | featureValueRegistration: 'Registro de rasgos', |
| | | fingerRegistration: 'Registro de huella', |
| | | fingerFeatureRegistration: 'Registro por valor de caracterÃstica', |
| | | fingerInput: 'Coloque el dedo en el lector de huellas', |
| | | fingerRemainingTime: 'Tiempo restante', |
| | | fingerInputting: 'Registrando...', |
| | | startFingerInput: 'Iniciar registro de huella', |
| | | fingerInputTips: 'Ingrese el valor de caracterÃstica de la huella', |
| | | fingerWaitInput: 'En espera de registro', |
| | | fingerInputNow: 'Registrando huella...', |
| | | fingerInputSuccess: 'Registro exitoso', |
| | | fingerInputFailed: 'No se pudo iniciar el registro de huella', |
| | | fingerReTry: 'Fallo en el registro de huella, inténtelo de nuevo', |
| | | fingerFilled: 'Registro de huella exitoso, el valor de caracterÃstica se ha rellenado automáticamente', |
| | | fingerFailed: 'Fallo en el registro de huella', |
| | | fingerTimeout: 'Tiempo de espera agotado', |
| | | fingerInputTimeout: 'Tiempo de espera del registro de huella, inténtelo de nuevo', |
| | | fingerError: 'Registro fallido', |
| | | fingerInputError: 'Fallo en el registro de huella, inténtelo de nuevo', |
| | | fingerInputed: 'Huella registrada', |
| | | fingerReInput: 'Volver a registrar la huella', |
| | | }, |
| | | |
| | | permission: { |
| | | deletePermission: 'Eliminar permiso', |
| | | addPermission: 'Añadir permiso', |
| | | permissionId: 'ID de permiso', |
| | | userId: 'ID de usuario', |
| | | timeRange: 'Intervalo de tiempo', |
| | | extra: 'Extra', |
| | | effectiveType: 'Tipo de vigencia', |
| | | effectiveTime: 'Tiempo efectivo', |
| | | effectiveWeek: 'Semana efectiva', |
| | | timePeriod: 'Periodo', |
| | | addTimePeriod: 'Añadir periodo', |
| | | modify_previous_time: 'Primero modifique el periodo previo', |
| | | cannot_be_earlier: 'La hora final no puede ser menor que la inicial', |
| | | times_cannot_overlap: 'Los tiempos no pueden superponerse', |
| | | choose_time_range: 'Seleccione rango de tiempo', |
| | | unlimitedMode: 'Sin lÃmite', |
| | | usualMode: 'Modo habitual', |
| | | dailyMode: 'Modo diario', |
| | | weeklyRepetitionMode: 'Repetición semanal', |
| | | time_range: 'Rango', |
| | | }, |
| | | |
| | | common: { |
| | | startDate: 'Fecha inicio', |
| | | endDate: 'Fecha fin', |
| | | to: 'a', |
| | | cancel: 'Cancelar', |
| | | confirm: 'Confirmar', |
| | | close: 'Cerrar', |
| | | delete: 'Eliminar', |
| | | edit: 'Editar', |
| | | batchDelete: 'Eliminación masiva', |
| | | startTime: 'Hora inicio', |
| | | endTime: 'Hora fin', |
| | | monday: 'Lunes', |
| | | tuseday: 'Martes', |
| | | wednesday: 'Miércoles', |
| | | thursday: 'Jueves', |
| | | friday: 'Viernes', |
| | | saterday: 'Sábado', |
| | | sunday: 'Domingo', |
| | | placeholder: 'Por favor ingrese', |
| | | placeholderSelect: 'Por favor seleccione', |
| | | closeTips: '¿Confirmar cierre?', |
| | | deleteTips: '¿Confirmar eliminación?', |
| | | deleteSuccess: 'Eliminado con éxito', |
| | | addSuccess: 'Añadido con éxito', |
| | | editSuccess: 'Editado con éxito', |
| | | saveSuccess: 'Guardado con éxito', |
| | | tips: 'Aviso', |
| | | operation: 'Operación', |
| | | query: 'Consulta', |
| | | reset: 'Reset', |
| | | noData: 'Sin datos por ahora', |
| | | export: 'Exportar', |
| | | success: 'Ãxito', |
| | | failure: 'Fallo', |
| | | incorrectFormat: 'Formato incorrecto', |
| | | integerFormat: 'Debe ser entero â¥0', |
| | | positiveIntegerFormat: 'Debe ser entero >0', |
| | | noDataSaved: 'No hay datos para guardar', |
| | | chinese: 'Chino', |
| | | english: 'Inglés', |
| | | spanish: 'Español', |
| | | french: 'Francés', |
| | | german: 'Alemán', |
| | | russian: 'Ruso', |
| | | arabic: 'Ãrabe', |
| | | portuguese: 'Portugués', |
| | | korean: 'Coreano', |
| | | detail: 'Detalle', |
| | | clearTips: '¿Confirmar borrado?', |
| | | clearSuccess: 'Borrado exitosamente', |
| | | }, |
| | | |
| | | log: { |
| | | accessMethod: 'Método de acceso', |
| | | passingTime: 'Hora de paso', |
| | | accessPass: 'Credencial de paso', |
| | | accessResult: 'Resultado', |
| | | accessPhoto: 'Foto', |
| | | viewPhotos: 'Ver fotos' |
| | | }, |
| | | |
| | | error: { |
| | | networkError: 'Error de red, verifique su conexión', |
| | | timeout: 'Tiempo de espera agotado, reintente', |
| | | serverError: 'Error interno del servidor, reintente', |
| | | notFound: 'El recurso no existe', |
| | | unauthorized: 'No autorizado, inicie sesión', |
| | | noResponse: 'No hay respuesta del servidor', |
| | | unknownError: 'Error de solicitud, código:', |
| | | requestFailed: 'Solicitud fallida' |
| | | }, |
| | | |
| | | security: { |
| | | keyId: 'ID de clave', |
| | | keyType: 'Tipo de clave', |
| | | keyEncoding: 'Codificación de clave', |
| | | keyValue: 'Valor de clave', |
| | | startTime: 'Hora de inicio', |
| | | expirationTime: 'Hora de expiración', |
| | | newKey: 'Agregar clave', |
| | | clearKey: 'Borrar clave', |
| | | validTime: 'Tiempo válido', |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // Connexion |
| | | login: { |
| | | lang: 'Langue', |
| | | systemname: 'Login Facial', |
| | | username: 'Utilisateur', |
| | | username_label: "Veuillez saisir l'utilisateur", |
| | | pwd: 'Mot de passe', |
| | | pwd_label: 'Veuillez saisir le mot de passe', |
| | | pwd_info: 'Entrez un mot de passe valide', |
| | | success_msg: 'Connexion réussie', |
| | | error_name: 'Mot de passe incorrect', |
| | | error_res: "Ne répond pas aux exigences de connexion", |
| | | login: 'Se connecter', |
| | | }, |
| | | // Barre latérale |
| | | aside: { |
| | | systemname: 'Console', |
| | | quit: 'Quitter', |
| | | deviceControl: 'Contrôle', |
| | | basicSetting: 'Réglages', |
| | | workerSetting: 'Personnel', |
| | | deviceMonitoring: 'Surveillance', |
| | | recordManagement: 'Journal', |
| | | securityManagement: 'Des clés', |
| | | tips: 'Conseil', |
| | | tips_msg: 'Voulez-vous vous déconnecter ?', |
| | | }, |
| | | // Contrôle |
| | | control: { |
| | | remoteControl: 'Distance', |
| | | restart: 'Redémarrer', |
| | | clickToRestart: 'Cliquer pour redémarrer', |
| | | restartConfirm: 'Confirmer le redémarrage ?', |
| | | restartSuccess: 'Redémarrage réussi', |
| | | restartFailed: 'Redémarrage échoué', |
| | | remoteOpen: 'Ouverture à distance', |
| | | clickToOpen: 'Cliquer pour ouvrir', |
| | | openConfirm: "Confirmer l'ouverture à distance ?", |
| | | remoteOpenSuccess: 'Ouverture réussie', |
| | | remoteOpenFailed: "Ouverture échouée", |
| | | reset: 'Réinitialiser', |
| | | clickToReset: 'Cliquer pour réinitialiser', |
| | | resetConfirm: 'Confirmer la réinitialisation ?', |
| | | resetWillOut: "Déco après réinit.", |
| | | resetSuccess: 'Réinitialisation réussie', |
| | | resetFailed: 'Réinitialisation échouée', |
| | | firmwareUpgrade: 'Mise à jour du firmware', |
| | | upgradeConfig: 'Config. mise à jour', |
| | | firmwareUrl: 'URL du firmware', |
| | | md5Checksum: 'Valeur md5', |
| | | startUpgrade: 'Démarrer la mise à jour', |
| | | urlRequired: "L'URL est requise", |
| | | md5Required: 'Le md5 est requis', |
| | | urlInvalid: 'Entrez une URL valide', |
| | | md5Invalid: 'Entrez un md5 valide', |
| | | upgradeConfirm: 'Confirmer la mise à jour ?', |
| | | upgradeSuccess: 'Mise à jour réussie', |
| | | clearFile: "Effacer le fichier", |
| | | uploading: 'Téléversement...', |
| | | uploadAndUpgrade: 'Téléverser et mettre à jour', |
| | | restartTips: 'Redémarrage sécurisé, sans perte de données', |
| | | restarting: 'Redémarrage...', |
| | | remoteTips: 'Contrôle distant de la porte', |
| | | opening: 'Ouverture...', |
| | | resetTips: 'Restauration usine, effacera les données', |
| | | reseting: 'Réinitialisation...', |
| | | urlUpgrade: 'Mise à jour par URL', |
| | | fileUpgrade: 'Mise à jour par fichier', |
| | | uploadFile: 'Cliquez pour téléverser le firmware', |
| | | formatFile: 'Supporte .zip ou .dpk, max 20MB', |
| | | fileName: 'Nom du fichier', |
| | | size: 'Taille', |
| | | }, |
| | | // Configuration |
| | | config: { |
| | | second: 's', |
| | | millisecond: 'ms', |
| | | min: 'minutes', |
| | | notsave: 'Ne pas enregistrer', |
| | | save: 'Enregistrer', |
| | | noVoice: 'Sans voix', |
| | | no: 'Non', |
| | | yes: 'Oui', |
| | | basicConfiguration: 'Configuration de base', |
| | | displaySettings: 'Affichage', |
| | | informationDisplay: "Affichage d'information", |
| | | audioSettings: 'Audio', |
| | | languageAndThemes: 'Langue et thème', |
| | | autoAdjustScreenBrightness: 'Luminosité auto', |
| | | screenBrightness: 'Luminosité écran', |
| | | autoTurnOffScreen: 'Extinction auto', |
| | | autoTurnOffScreenTime: "Temps d'extinction", |
| | | autoScreenSaver: 'Ãconomiseur auto', |
| | | autoScreenSaverTime: 'Délai économiseur', |
| | | displayDeviceSn: 'Afficher SN', |
| | | displayIp: 'Afficher IP', |
| | | displayIdentityCard: 'Afficher certificat cloud', |
| | | volume: 'Volume', |
| | | language: 'Langue', |
| | | displayCode: "Afficher code miniapp", |
| | | themeMode: "Thème", |
| | | cn: 'Chinois', |
| | | en: 'Anglais', |
| | | es: 'Espagnol', |
| | | fr: 'Français', |
| | | de: 'Allemand', |
| | | ru: 'Russe', |
| | | ar: 'Arabe', |
| | | pt: 'Port.', |
| | | ko: 'Coréen', |
| | | standardMode: 'Mode standard', |
| | | simpleMode: 'Mode simple', |
| | | firstLogin: 'Première connexion', |
| | | backlight: 'Rétroéclairage', |
| | | brightness: 'Lumière blanche', |
| | | nirBrightness: 'Lumière IR', |
| | | never: 'Jamais', |
| | | min1: '1 minute', |
| | | min2: '2 minutes', |
| | | min3: '3 minutes', |
| | | min4: '4 minutes', |
| | | min5: '5 minutes', |
| | | networkConfiguration: 'Réseau', |
| | | otherConfiguration: 'Autres', |
| | | ipConfiguration: 'Adresse IP', |
| | | devicePassword: 'Mot de passe appareil', |
| | | protocolPassword: 'Mot de passe protocole', |
| | | networkType: 'Type de réseau', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'WiâFi', |
| | | wifiPassword: 'Mot de passe WiâFi', |
| | | dhcpModeSelection: 'Mode DHCP', |
| | | dhcpMode: 'Automatique', |
| | | customNetworkConfiguration: 'Manuel', |
| | | ipAddress: 'IP', |
| | | gateway: 'Passerelle', |
| | | subnetMask: 'Masque', |
| | | dnsServer: 'DNS', |
| | | mac: 'MAC', |
| | | mqttRelatedConfiguration: 'MQTT', |
| | | mqttConnectionInformation: 'Connexion MQTT', |
| | | sessionConfiguration: 'Session', |
| | | serverAddress: 'Serveur', |
| | | clientID: 'ID client', |
| | | userName: "Nom d'utilisateur", |
| | | userPassword: 'Mot de passe', |
| | | topicPrefix: 'Préfixe de topic', |
| | | onlineChecking: 'Vérification en ligne', |
| | | onlineCheckingTimeout: "Délai d'attente", |
| | | cleanSession: 'Session propre', |
| | | clientIdSuffix: "Suffixe d'ID client", |
| | | willTopic: 'Topic Will', |
| | | enterpriseWechat:'Mode WeChat Entreprise sans effet', |
| | | faceRelatedConfiguration: 'Configuration faciale', |
| | | functionalInformation: 'Fonction', |
| | | prompt: 'Invite', |
| | | faceSimilarityThreshold: 'Seuil de similarité', |
| | | livenessDetectionFunction: 'Détection de vivacité', |
| | | livenessDetectionThreshold: 'Seuil de vivacité', |
| | | infraredImageDisplay: "Affichage infrarouge", |
| | | maskRecognition: "Reconnaissance de masque", |
| | | strangerVoice: "Voix d'inconnu", |
| | | voiceMode: "Mode voix", |
| | | voiceModeDate: 'Salutation personnalisée', |
| | | imageSaveType: "Type de sauvegarde", |
| | | saveStrangerImage: "Sauver image d'inconnu", |
| | | fullView: "Panorama", |
| | | face: "Visage", |
| | | broadcastPleaseRegisterFirst: 'Diffuser "Veuillez vous enregistrer"', |
| | | broadcastHelloStranger: 'Diffuser "Inconnu"', |
| | | broadcastName: 'Diffuser le nom', |
| | | broadcastGreeting: 'Diffuser salutation personnalisée', |
| | | greeting: 'Salutation', |
| | | broadcastWelcome: 'Diffuser "Bienvenue"', |
| | | recognitionSwitch: 'Interrupteur de re-détection', |
| | | systemRelatedConfiguration: 'Système', |
| | | functionSwitch: 'Commutateurs', |
| | | cardSwipingSwitch: 'Carte', |
| | | passwordSwitch: 'Mot de passe', |
| | | strangerImage: 'Image inconnue', |
| | | cloudCertificateSwitch: 'Certificat cloud', |
| | | physicalCardNumber: 'Numéro de carte physique', |
| | | cloudCertificateAcquisition: 'Obtention certificat cloud', |
| | | heartbeatConfig: 'Heartbeat', |
| | | heartbeatSwitch: 'Activer heartbeat', |
| | | heartRateInterval: 'Intervalle', |
| | | heartbeatTopic: 'Topic heartbeat', |
| | | heartbeatContent: 'Contenu', |
| | | basicInformation: 'Infos de base', |
| | | deviceMac: 'MAC', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Modèle', |
| | | version: "Version", |
| | | appVersion: "Version firmware", |
| | | releaseTime: "Date de mise à jour", |
| | | totaldisk: 'Volume total', |
| | | freedisk: 'Espace restant', |
| | | passageConfiguration: 'Passage', |
| | | functionConfiguration: 'Fonctions', |
| | | numberOfPassageRecords: 'Nb. max de passages', |
| | | durationOfRelayOpening: "Durée d'ouverture du relais", |
| | | alarmSwitch: 'Alarme', |
| | | fireAlarmSwitch: "Alarme incendie", |
| | | fireAlarmStatus: 'Ãtat incendie', |
| | | normal: 'Normal', |
| | | warning: 'Alerte', |
| | | tamperSwitch: 'Anti-sabotage', |
| | | uploadToCloudSwitch: 'Interrupteur de téléversement facial', |
| | | clockConfiguration: 'Horloge', |
| | | timeSynchronizationSwitch: 'Synchronisation horaire', |
| | | timeSynchronizationServerIP: 'Serveur de temps', |
| | | timedSynchronizationTime: 'Heure de synchro', |
| | | timeZone: 'Fuseau horaire', |
| | | setDeviceTime: "Régler l'heure", |
| | | restartAfterSetting: "L'appareil redémarrera", |
| | | cloudCertificateActivation: 'Activation du certificat', |
| | | activationKey: "Clé d'activation", |
| | | cloudTips1: 'Entrez la clé sans espaces', |
| | | cloudTips2: "Après activation, connexion au service cloud", |
| | | confirmActivation: "Confirmer l'activation", |
| | | activationInProgress: 'Activation...', |
| | | activationFailed: 'Ãchec activation', |
| | | activationSuccessful: 'Activation réussie', |
| | | passwordModification: 'Modifier le mot de passe', |
| | | password: 'Mot de passe', |
| | | oldPassword: 'Ancien mot de passe', |
| | | newPassword: 'Nouveau mot de passe', |
| | | confirmPassword: 'Confirmer mot de passe', |
| | | passwordRule: 'Recommandations', |
| | | passwordLength: 'Longueur â¥6', |
| | | cannotBeTheSame: 'Tous les caractères ne peuvent être identiques', |
| | | cannotOrder: 'Pas de 3+ nombres/lettres consécutifs', |
| | | cannotWeakPassword: 'Pas de mot de passe faible', |
| | | submit: 'Soumettre', |
| | | saveConfig: 'Enregistrer', |
| | | msg_please_enter: 'Veuillez saisir', |
| | | msg_inputPassword: 'Veuillez saisir le mot de passe', |
| | | msg_oldPasswordError: 'Ancien mot de passe incorrect', |
| | | msg_password_mismatch: 'Les mots de passe ne correspondent pas', |
| | | msg_password_min_length: 'Au moins 6 caractères', |
| | | msg_is_weak_password: 'Mot de passe faible, changez-le', |
| | | msg_pswChangeSuccessAndLogin: 'Mot de passe changé, reconnectez-vous', |
| | | msg_pswChangeSuccess: 'Mot de passe modifié', |
| | | msg_pswChangeFail: 'Ãchec de modification', |
| | | msg_saveSuccess: 'Enregistré', |
| | | msg_saveFail: "Ãchec de l'enregistrement", |
| | | msg_formFilled: 'Vérifiez le formulaire', |
| | | msg_number_0_23: 'Supporte seulement 0-23', |
| | | msg_number_0_24: 'Supporte seulement 0-24', |
| | | msg_noChange: 'Aucun changement de configuration à enregistrer', |
| | | resourceConfiguration: 'Configuration des ressources', |
| | | backgroundImage: 'Image de fond', |
| | | selectImage: 'Choisir une image', |
| | | uploadBackground: 'Téléverser le fond', |
| | | uploading: 'Téléversement...', |
| | | backgroundUploadTip: 'Téléversez une image PNG avec un nombre de pixels égal à {n}; convertie en Base64 puis envoyée', |
| | | backgroundResolutionMismatch: "La résolution de l'image doit être {n}", |
| | | backgroundRequired: "Veuillez choisir l'image de fond", |
| | | backgroundImageOnlyPNG: 'Seulement PNG', |
| | | backgroundSizeLimit: "La taille ne doit pas dépasser 5MB", |
| | | backgroundParseFailed: "Ãchec de lecture de l'image", |
| | | backgroundImageSelected: 'Image sélectionnée', |
| | | backgroundSuccess: 'Fond téléversé', |
| | | backgroundFailed: 'Ãchec du téléversement', |
| | | scanSettings: 'Paramètres de scan', |
| | | scanSwitch: 'Interrupteur de Scan', |
| | | scanInterval: 'Intervalle de scan', |
| | | }, |
| | | person: { |
| | | idCard: "Numéro d'identité", |
| | | userType: 'Type de personne', |
| | | administrator: 'Administrateur', |
| | | userId: 'ID', |
| | | user: 'Utilisateur', |
| | | voucher: 'Credential', |
| | | permission: 'Permission', |
| | | addUser: 'Ajouter une personne', |
| | | name: 'Nom', |
| | | editUser: 'Modifier personne', |
| | | placeholderUserId: "Entrez l'ID utilisateur", |
| | | placeholderName: 'Entrez le nom', |
| | | userNotExist: "La personne n'existe pas", |
| | | oneClickClear: 'Tout effacer', |
| | | clearTips: 'Cette action effacera toutes les données, continuer ?', |
| | | clearSuccess: 'Effacé avec succès', |
| | | clearFailed: 'Ãchec de suppression', |
| | | }, |
| | | voucher: { |
| | | password: 'Mot de passe', |
| | | card: 'Carte', |
| | | face: 'Visage', |
| | | finger: 'Empreinte', |
| | | code: 'Code', |
| | | codeType: 'Type de code', |
| | | passthroughCode: 'Code de transit', |
| | | staticCode: 'Code statique', |
| | | dynamicCode: 'Code dynamique', |
| | | credentialId: 'ID dâidentifiant', |
| | | credentialValue: 'Valeur dâidentifiant', |
| | | placeholderCode: 'Veuillez saisir le certificat de code', |
| | | placeholderPwd: 'Entrez le mot de passe', |
| | | placeholderCard: 'Entrez la carte', |
| | | validPassword: 'Entrez 6 chiffres', |
| | | validCard: 'Entrez 8 chiffres ou lettres', |
| | | photoRegistration: "Enregistrement d'image", |
| | | featureValueRegistration: 'Enregistrement de caractéristiques', |
| | | fingerRegistration: "Enregistrement d'empreinte", |
| | | fingerFeatureRegistration: 'Enregistrement par valeur de caractéristique', |
| | | fingerInput: "Veuillez poser votre doigt sur le lecteur d'empreintes", |
| | | fingerRemainingTime: 'Temps restant', |
| | | fingerInputting: 'En cours...', |
| | | startFingerInput: "Démarrer l'enregistrement d'empreinte", |
| | | fingerInputTips: "Veuillez saisir la valeur de caractéristique de l'empreinte", |
| | | fingerWaitInput: 'En attente', |
| | | fingerInputNow: "Enregistrement de l'empreinte...", |
| | | fingerInputSuccess: 'Enregistrement réussi', |
| | | fingerInputFailed: "Ãchec du démarrage de l'enregistrement d'empreinte", |
| | | fingerReTry: "Ãchec de l'enregistrement d'empreinte, veuillez réessayer", |
| | | fingerFilled: "Enregistrement réussi, la valeur de caractéristique a été remplie automatiquement", |
| | | fingerFailed: "Ãchec de l'enregistrement d'empreinte", |
| | | fingerTimeout: 'Délai dépassé', |
| | | fingerInputTimeout: "Délai dépassé pour l'enregistrement d'empreinte, veuillez réessayer", |
| | | fingerError: 'Ãchec de la saisie', |
| | | fingerInputError: "Ãchec de l'enregistrement d'empreinte, veuillez réessayer", |
| | | fingerInputed: 'Empreinte déjà enregistrée', |
| | | fingerReInput: "Réenregistrer l'empreinte", |
| | | }, |
| | | permission: { |
| | | deletePermission: 'Supprimer permission', |
| | | addPermission: 'Ajouter permission', |
| | | permissionId: 'ID permission', |
| | | userId: 'ID utilisateur', |
| | | timeRange: 'Plage horaire', |
| | | extra: 'Extra', |
| | | effectiveType: 'Type de validité', |
| | | effectiveTime: 'Temps effectif', |
| | | effectiveWeek: 'Semaine effective', |
| | | timePeriod: 'Période', |
| | | addTimePeriod: 'Ajouter une période', |
| | | modify_previous_time: 'Modifiez la période précédente', |
| | | cannot_be_earlier: "L'heure de fin ne peut être avant le début", |
| | | times_cannot_overlap: 'Les horaires ne peuvent se chevaucher', |
| | | choose_time_range: 'Choisissez une plage horaire', |
| | | unlimitedMode: 'Illimité', |
| | | usualMode: 'Mode habituel', |
| | | dailyMode: 'Mode quotidien', |
| | | weeklyRepetitionMode: 'Répétition hebdo', |
| | | time_range: 'Plage horaire', |
| | | }, |
| | | common: { |
| | | startDate: 'Date début', |
| | | endDate: 'Date fin', |
| | | to: 'Ã ', |
| | | cancel: 'Annuler', |
| | | confirm: 'Confirmer', |
| | | close: 'Fermer', |
| | | delete: 'Supprimer', |
| | | edit: 'Modifier', |
| | | batchDelete: 'Suppression multiple', |
| | | startTime: 'Heure début', |
| | | endTime: 'Heure fin', |
| | | monday: 'Lundi', |
| | | tuseday: 'Mardi', |
| | | wednesday: 'Mercredi', |
| | | thursday: 'Jeudi', |
| | | friday: 'Vendredi', |
| | | saterday: 'Samedi', |
| | | sunday: 'Dimanche', |
| | | placeholder: 'Veuillez saisir', |
| | | placeholderSelect: 'Veuillez sélectionner', |
| | | closeTips: 'Confirmer la fermeture ?', |
| | | deleteTips: 'Confirmer la suppression ?', |
| | | deleteSuccess: 'Suppression réussie', |
| | | addSuccess: 'Ajout réussi', |
| | | editSuccess: 'Modification réussie', |
| | | saveSuccess: 'Enregistré avec succès', |
| | | tips: 'Conseil', |
| | | operation: 'Opération', |
| | | query: 'Rechercher', |
| | | reset: 'Reset', |
| | | noData: 'Pas de données', |
| | | export: 'Exporter', |
| | | success: 'Succès', |
| | | failure: 'Ãchec', |
| | | incorrectFormat: 'Format incorrect', |
| | | integerFormat: 'Doit être un entier â¥0', |
| | | positiveIntegerFormat: 'Doit être un entier >0', |
| | | noDataSaved: 'Aucune donnée à enregistrer', |
| | | chinese: 'Chinois', |
| | | english: 'Anglais', |
| | | spanish: 'Espagnol', |
| | | french: 'Français', |
| | | german: 'Allemand', |
| | | russian: 'Russe', |
| | | arabic: 'Arabe', |
| | | portuguese: 'Portugais', |
| | | korean: 'Coréen', |
| | | detail: 'Détail', |
| | | clearTips: 'Confirmer l\'effacement?', |
| | | clearSuccess: 'Effacé avec succès', |
| | | }, |
| | | log: { |
| | | accessMethod: "Méthode d'accès", |
| | | passingTime: 'Heure de passage', |
| | | accessPass: 'Credential', |
| | | accessResult: 'Résultat', |
| | | accessPhoto: 'Photo', |
| | | viewPhotos: 'Voir photos' |
| | | }, |
| | | error: { |
| | | networkError: 'Ãchec réseau, vérifiez la connexion', |
| | | timeout: 'Délai dépassé, réessayez', |
| | | serverError: 'Erreur interne serveur, réessayez', |
| | | notFound: "La ressource n'existe pas", |
| | | unauthorized: 'Non autorisé, reconnectez-vous', |
| | | noResponse: 'Impossible de contacter le serveur', |
| | | unknownError: 'Ãchec de la requête, code :', |
| | | requestFailed: 'Requête échouée' |
| | | }, |
| | | security: { |
| | | keyId: 'ID de clé', |
| | | keyType: 'Type de clé', |
| | | keyEncoding: 'Encodage de clé', |
| | | keyValue: 'Valeur de clé', |
| | | startTime: 'Heure de début', |
| | | expirationTime: 'Heure d\'expiration', |
| | | newKey: 'Ajouter une clé', |
| | | clearKey: 'Effacer la clé', |
| | | validTime: 'Durée de validité', |
| | | } |
| | | } |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import Vue from 'vue' // å¼å
¥vue |
| | | import VueI18n from 'vue-i18n' // å¼å
¥i18n模å |
| | | import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-uiè±æå
|
| | | import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // element-ui䏿å
|
| | | import locale from 'element-ui/lib/locale' // å¼å
¥elementuiuiè¯è¨å
模å |
| | | import enLocale from './en' // æ¬å°è±æå
|
| | | import zhLocale from './zh' // æ¬å°ä¸æå
|
| | | import esLocale from './es' |
| | | import frLocale from './fr' |
| | | import deLocale from './de' |
| | | import ruLocale from './ru' |
| | | import arLocale from './ar' |
| | | import ptLocale from './pt' |
| | | import koLocale from './ko' |
| | | |
| | | Vue.use(VueI18n) // vue使ç¨i18n模å |
| | | // å¼å
¥æ¬å° |
| | | const messages = { |
| | | EN: { |
| | | ...enLocale, // es6çæå±è¿ç®ç¬¦ï¼ç¸å½äºè§£æåºæ¯ä¸ªå¯¹è±¡ |
| | | ...elementEnLocale |
| | | }, |
| | | CN: { |
| | | ...zhLocale, |
| | | ...elementZhLocale |
| | | }, |
| | | ES: { |
| | | ...esLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | FR: { |
| | | ...frLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | DE: { |
| | | ...deLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | RU: { |
| | | ...ruLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | AR: { |
| | | ...arLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | PT: { |
| | | ...ptLocale, |
| | | ...elementEnLocale |
| | | }, |
| | | KO: { |
| | | ...koLocale, |
| | | ...elementEnLocale |
| | | } |
| | | } |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { language } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | // å建å½é
åå®ä¾ |
| | | const i18n = new VueI18n({ |
| | | locale: language, // set localeï¼é»è®¤ä¸æ |
| | | messages // set locale messagesãè¯è¨å
|
| | | }) |
| | | locale.i18n((key, value) => i18n.t(key, value)) |
| | | export default i18n |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // ë¡ê·¸ì¸ |
| | | login: { |
| | | lang: 'ì¸ì´', |
| | | systemname: 'ë¡ê·¸ì¸', |
| | | username: 'ì¬ì©ì', |
| | | username_label: 'ì¬ì©ìëª
ì ì
ë ¥íì¸ì', |
| | | pwd: 'ë¹ë°ë²í¸', |
| | | pwd_label: 'ë¹ë°ë²í¸ë¥¼ ì
ë ¥íì¸ì', |
| | | pwd_info: 'ì¬ë°ë¥¸ ë¹ë°ë²í¸ íìì ì
ë ¥íì¸ì', |
| | | success_msg: 'ë¡ê·¸ì¸ ì±ê³µ', |
| | | error_name: 'ë¹ë°ë²í¸ê° ì¬ë°ë¥´ì§ ììµëë¤', |
| | | error_res: 'ë¡ê·¸ì¸ ì구ì¬íì 충족íì§ ììµëë¤', |
| | | login: 'ë¡ê·¸ì¸', |
| | | }, |
| | | // ì¬ì´ëë° |
| | | aside: { |
| | | systemname: 'ê´ë¦¬', |
| | | quit: 'ë¡ê·¸ìì', |
| | | deviceControl: 'ì ì´', |
| | | basicSetting: 'ì¤ì ', |
| | | workerSetting: 'ì¸ì', |
| | | deviceMonitoring: '모ëí°ë§', |
| | | recordManagement: '기ë¡', |
| | | securityManagement: 'í¤ ê´ë¦¬', |
| | | tips: 'ì림', |
| | | tips_msg: 'ë¡ê·¸ììíìê² ìµëê¹?', |
| | | }, |
| | | control: { |
| | | remoteControl: 'ì격', |
| | | restart: 'ì¬ë¶í
', |
| | | clickToRestart: 'í´ë¦íì¬ ì¬ë¶í
', |
| | | restartConfirm: 'ì¬ë¶í
ì íì¸íìê² ìµëê¹?', |
| | | restartSuccess: 'ì¬ë¶í
ì±ê³µ', |
| | | restartFailed: 'ì¬ë¶í
ì¤í¨', |
| | | remoteOpen: 'ì격 ê°ë°©', |
| | | clickToOpen: 'í´ë¦íì¬ ê°ë°©', |
| | | openConfirm: 'ì격 ê°ë°©ì íì¸íìê² ìµëê¹?', |
| | | remoteOpenSuccess: 'ê°ë°© ì±ê³µ', |
| | | remoteOpenFailed: 'ê°ë°© ì¤í¨', |
| | | reset: 'ì¥ì¹ ì´ê¸°í', |
| | | clickToReset: 'í´ë¦íì¬ ì´ê¸°í', |
| | | resetConfirm: 'ì´ê¸°í를 íì¸íìê² ìµëê¹?', |
| | | resetWillOut: "리ì
í ë¡ê·¸ìì", |
| | | resetSuccess: 'ì´ê¸°í ì±ê³µ', |
| | | resetFailed: 'ì´ê¸°í ì¤í¨', |
| | | firmwareUpgrade: 'íì¨ì´ ì
ê·¸ë ì´ë', |
| | | upgradeConfig: 'ì
ê·¸ë ì´ë ì¤ì ', |
| | | firmwareUrl: 'íì¨ì´ URL', |
| | | md5Checksum: 'md5 ê°', |
| | | startUpgrade: 'ì
ê·¸ë ì´ë ìì', |
| | | urlRequired: 'URLì íìì
ëë¤', |
| | | md5Required: 'md5ë íìì
ëë¤', |
| | | urlInvalid: 'ì¬ë°ë¥¸ URLì ì
ë ¥íì¸ì', |
| | | md5Invalid: 'ì¬ë°ë¥¸ md5를 ì
ë ¥íì¸ì', |
| | | upgradeConfirm: 'ì
ê·¸ë ì´ë를 ì§íí ê¹ì?', |
| | | upgradeSuccess: 'ì
ê·¸ë ì´ë ì±ê³µ', |
| | | clearFile: "íì¼ ì§ì°ê¸°", |
| | | uploading: 'ì
ë¡ë ì¤...', |
| | | uploadAndUpgrade: 'ì
ë¡ë í ì
ê·¸ë ì´ë', |
| | | restartTips: 'ìì í ì¬ë¶í
, ë°ì´í° ìì¤ ìì', |
| | | restarting: 'ì¬ë¶í
ì¤...', |
| | | remoteTips: 'ì¶ì
ì격 ì ì´', |
| | | opening: 'ê°ë°© ì¤...', |
| | | resetTips: 'ê³µì¥ ì´ê¸°í, 모ë ë°ì´í° ìì ', |
| | | reseting: 'ì´ê¸°í ì¤...', |
| | | urlUpgrade: 'URL ì
ê·¸ë ì´ë', |
| | | fileUpgrade: 'íì¼ ì
ê·¸ë ì´ë', |
| | | uploadFile: 'íì¨ì´ íì¼ ì
ë¡ë', |
| | | formatFile: '.zip ëë .dpk ì§ì, ìµë 20MB', |
| | | fileName: 'íì¼ëª
', |
| | | size: 'í¬ê¸°', |
| | | }, |
| | | config: { |
| | | second: 'ì´', |
| | | millisecond: 'ë°ë¦¬ì´', |
| | | min: 'ë¶', |
| | | notsave: 'ì ì¥ ì í¨', |
| | | save: 'ì ì¥', |
| | | noVoice: 'ìì± ìì', |
| | | no: 'ìëì¤', |
| | | yes: 'ì', |
| | | basicConfiguration: '기본 ì¤ì ', |
| | | displaySettings: 'ëì¤íë ì´ ì¤ì ', |
| | | informationDisplay: 'ì ë³´ íì', |
| | | audioSettings: 'ì¤ëì¤ ì¤ì ', |
| | | languageAndThemes: 'ì¸ì´ ë° í
ë§', |
| | | autoAdjustScreenBrightness: 'ìë ë°ê¸° ì¡°ì ', |
| | | screenBrightness: 'íë©´ ë°ê¸°', |
| | | autoTurnOffScreen: 'ìë íë©´ ë기', |
| | | autoTurnOffScreenTime: 'íë©´ ë기 ìê°', |
| | | autoScreenSaver: 'ìë íë©´ë³´í¸ê¸°', |
| | | autoScreenSaverTime: 'íë©´ë³´í¸ê¸° ìê°', |
| | | displayDeviceSn: 'SN íì', |
| | | displayIp: 'IP íì', |
| | | displayIdentityCard: 'í´ë¼ì°ë ì¸ì¦ íì', |
| | | volume: '볼륨', |
| | | language: 'ì¸ì´', |
| | | displayCode: "미ëì± ì½ë íì", |
| | | themeMode: "í
ë§", |
| | | cn: 'ì¤êµì´', |
| | | en: 'ìì´', |
| | | es: 'ì¤íì¸ì´', |
| | | fr: 'íëì¤ì´', |
| | | de: 'ë
ì¼ì´', |
| | | ru: 'ë¬ììì´', |
| | | ar: 'ìëì´', |
| | | pt: 'í¬ë¥´í¬ê°', |
| | | ko: 'íêµì´', |
| | | standardMode: 'íì¤ ëª¨ë', |
| | | simpleMode: 'ì¬í 모ë', |
| | | firstLogin: '첫 ë¡ê·¸ì¸', |
| | | backlight: 'ë°°ê²½ ì¡°ëª
', |
| | | brightness: 'íì´í¸ ë¼ì´í¸', |
| | | nirBrightness: 'ì ì¸ì ë¼ì´í¸', |
| | | never: 'ì í¨', |
| | | min1: '1ë¶', |
| | | min2: '2ë¶', |
| | | min3: '3ë¶', |
| | | min4: '4ë¶', |
| | | min5: '5ë¶', |
| | | networkConfiguration: 'ë¤í¸ìí¬ ì¤ì ', |
| | | otherConfiguration: '기í ì¤ì ', |
| | | ipConfiguration: 'IP ì¤ì ', |
| | | devicePassword: 'ì¥ì¹ ë¹ë°ë²í¸', |
| | | protocolPassword: 'íë¡í ì½ ë¹ë°ë²í¸', |
| | | networkType: 'ë¤í¸ìí¬ ì í', |
| | | ethernet: 'ì´ëë·', |
| | | wifiName: 'WiâFi ì´ë¦', |
| | | wifiPassword: 'WiâFi ë¹ë°ë²í¸', |
| | | dhcpModeSelection: 'DHCP 모ë', |
| | | dhcpMode: 'ìë', |
| | | customNetworkConfiguration: 'ìë ì¤ì ', |
| | | ipAddress: 'IP 주ì', |
| | | gateway: 'ê²ì´í¸ì¨ì´', |
| | | subnetMask: 'ìë¸ë· ë§ì¤í¬', |
| | | dnsServer: 'DNS ìë²', |
| | | mac: 'ë¤í¸ìí¬ MAC', |
| | | mqttRelatedConfiguration: 'MQTT ì¤ì ', |
| | | mqttConnectionInformation: 'MQTT ì°ê²° ì ë³´', |
| | | sessionConfiguration: 'ì¸ì
ì¤ì ', |
| | | serverAddress: 'ìë² ì£¼ì', |
| | | clientID: 'í´ë¼ì´ì¸í¸ ID', |
| | | userName: 'ì¬ì©ìëª
', |
| | | userPassword: 'ë¹ë°ë²í¸', |
| | | topicPrefix: 'í í½ ì ëì¬', |
| | | onlineChecking: 'ì¨ë¼ì¸ íì¸', |
| | | onlineCheckingTimeout: 'íììì', |
| | | cleanSession: 'í´ë¦° ì¸ì
', |
| | | clientIdSuffix: 'í´ë¼ì´ì¸í¸ ID ì 미ì¬', |
| | | willTopic: 'Will í í½', |
| | | enterpriseWechat:'Enterprise WeChat 모ë ì ì© ì ë¨', |
| | | faceRelatedConfiguration: 'ì¼êµ´ ì¤ì ', |
| | | functionalInformation: 'ê¸°ë¥ ì ë³´', |
| | | prompt: 'í롬íí¸', |
| | | faceSimilarityThreshold: 'ì ì¬ë ìê³ê°', |
| | | livenessDetectionFunction: 'ë¼ì´ë¸ëì¤ ê°ì§', |
| | | livenessDetectionThreshold: 'ë¼ì´ë¸ëì¤ ìê³ê°', |
| | | infraredImageDisplay: "ì ì¸ì ì´ë¯¸ì§ íì", |
| | | maskRecognition: "ë§ì¤í¬ ì¸ì", |
| | | strangerVoice: "ë¯ì ì´ ìì±", |
| | | voiceMode: "ìì± ëª¨ë", |
| | | voiceModeDate: 'ë§ì¶¤ ì¸ì¬', |
| | | imageSaveType: "ì´ë¯¸ì§ ì ì¥ ì í", |
| | | saveStrangerImage: "ë¯ì ì´ ì´ë¯¸ì§ ì ì¥", |
| | | fullView: "ì ê²½", |
| | | face: "ì¼êµ´", |
| | | broadcastPleaseRegisterFirst: '"ë±ë¡ í ì´ì©" ì¬ì', |
| | | broadcastHelloStranger: '"ë¯ì ì´" ì¬ì', |
| | | broadcastName: 'ì´ë¦ ì¬ì', |
| | | broadcastGreeting: 'ë§ì¶¤ ì¸ì¬ ì¬ì', |
| | | greeting: 'ì¸ì¬ë§', |
| | | broadcastWelcome: '"íìí©ëë¤" ì¬ì', |
| | | recognitionSwitch: 'ì¬ê²ì¬ ì¤ìì¹', |
| | | systemRelatedConfiguration: 'ìì¤í
ì¤ì ', |
| | | functionSwitch: 'ê¸°ë¥ ì¤ìì¹', |
| | | cardSwipingSwitch: 'ì¹´ë', |
| | | passwordSwitch: 'ë¹ë°ë²í¸', |
| | | strangerImage: 'ë¯ì ì´ ì´ë¯¸ì§', |
| | | cloudCertificateSwitch: 'í´ë¼ì°ë ì¸ì¦', |
| | | physicalCardNumber: '물리 ì¹´ë ë²í¸', |
| | | cloudCertificateAcquisition: 'í´ë¼ì°ë ì¸ì¦ íë', |
| | | heartbeatConfig: 'íí¸ë¹í¸', |
| | | heartbeatSwitch: 'íí¸ë¹í¸ ì¤ìì¹', |
| | | heartRateInterval: 'ì¸í°ë²', |
| | | heartbeatTopic: 'íí¸ë¹í¸ í í½', |
| | | heartbeatContent: 'íí¸ë¹í¸ ë´ì©', |
| | | basicInformation: '기본 ì ë³´', |
| | | deviceMac: 'MAC 주ì', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: '모ë¸', |
| | | version: "ë²ì ", |
| | | appVersion: "íì¨ì´ ë²ì ", |
| | | releaseTime: "ì
ë°ì´í¸ ìê°", |
| | | totaldisk: 'ì´ ê³µê°', |
| | | freedisk: 'ìì¬ ê³µê°', |
| | | passageConfiguration: 'ì¶ì
ì¤ì ', |
| | | functionConfiguration: 'ê¸°ë¥ ì¤ì ', |
| | | numberOfPassageRecords: 'ìµë ì¶ì
ê¸°ë¡ ì', |
| | | durationOfRelayOpening: '릴ë ì´ ê°ë°© ìê°', |
| | | alarmSwitch: '경보', |
| | | fireAlarmSwitch: 'íì¬ ê²½ë³´', |
| | | fireAlarmStatus: 'íì¬ ìí', |
| | | normal: 'ì ì', |
| | | warning: 'ê²½ê³ ', |
| | | tamperSwitch: 'ë°©ë² ìë', |
| | | uploadToCloudSwitch: 'ì¼êµ´ ì
ë¡ë ì¤ìì¹', |
| | | clockConfiguration: 'ìê³ ì¤ì ', |
| | | timeSynchronizationSwitch: 'ìê° ë기í', |
| | | timeSynchronizationServerIP: 'ìê° ìë² IP', |
| | | timedSynchronizationTime: 'ë기í ìê°', |
| | | timeZone: 'ìê°ë', |
| | | setDeviceTime: 'ì¥ì¹ ìê° ì¤ì ', |
| | | restartAfterSetting: 'ì¤ì í ì¥ì¹ ì¬ë¶í
', |
| | | cloudCertificateActivation: 'í´ë¼ì°ë ì¸ì¦ íì±í', |
| | | activationKey: 'íì±í í¤', |
| | | cloudTips1: '공백 ìì´ í¤ë¥¼ ì
ë ¥íì¸ì', |
| | | cloudTips2: 'íì±í í í´ë¼ì°ë ìë¹ì¤ì ì°ê²°ë©ëë¤', |
| | | confirmActivation: 'íì±í íì¸', |
| | | activationInProgress: 'íì±í ì¤...', |
| | | activationFailed: 'íì±í ì¤í¨', |
| | | activationSuccessful: 'íì±í ì±ê³µ', |
| | | passwordModification: 'ë¹ë°ë²í¸ ë³ê²½', |
| | | password: 'ë¹ë°ë²í¸', |
| | | oldPassword: 'íì¬ ë¹ë°ë²í¸', |
| | | newPassword: 'ì ë¹ë°ë²í¸', |
| | | confirmPassword: 'ë¹ë°ë²í¸ íì¸', |
| | | passwordRule: 'ë¹ë°ë²í¸ ê¶ì¥ ì¬í', |
| | | passwordLength: 'ê¸¸ì´ â¥6', |
| | | cannotBeTheSame: '모ë ê°ì 문ì ë¶ê°', |
| | | cannotOrder: 'ì°ì 3ê° ì´ì ì«ì/ì문ì ë¶ê°', |
| | | cannotWeakPassword: 'ì¼ë°ì ì¸ ì½í ë¹ë°ë²í¸ ê¸ì§', |
| | | submit: 'ì ì¶', |
| | | saveConfig: 'ì¤ì ì ì¥', |
| | | msg_please_enter: 'ë´ì©ì ì
ë ¥íì¸ì', |
| | | msg_inputPassword: 'ë¹ë°ë²í¸ë¥¼ ì
ë ¥íì¸ì', |
| | | msg_oldPasswordError: 'íì¬ ë¹ë°ë²í¸ê° íë ¸ìµëë¤', |
| | | msg_password_mismatch: 'ë¹ë°ë²í¸ê° ì¼ì¹íì§ ììµëë¤', |
| | | msg_password_min_length: 'ë¹ë°ë²í¸ë ìµì 6ì', |
| | | msg_is_weak_password: 'ì½í ë¹ë°ë²í¸ì
ëë¤. ë³ê²½íì¸ì', |
| | | msg_pswChangeSuccessAndLogin: 'ë¹ë°ë²í¸ ë³ê²½ ìë£, ë¤ì ë¡ê·¸ì¸íì¸ì', |
| | | msg_pswChangeSuccess: 'ë¹ë°ë²í¸ ë³ê²½ ì±ê³µ', |
| | | msg_pswChangeFail: 'ë¹ë°ë²í¸ ë³ê²½ ì¤í¨', |
| | | msg_saveSuccess: 'ì ì¥ ì±ê³µ', |
| | | msg_saveFail: 'ì ì¥ ì¤í¨', |
| | | msg_formFilled: 'ìì ì
ë ¥ì íì¸íì¸ì', |
| | | msg_number_0_23: '0~23ë§ ì§ì', |
| | | msg_number_0_24: '0~24ë§ ì§ì', |
| | | msg_noChange: 'ì ì¥í êµ¬ì± ë³ê²½ ì¬íì´ ììµëë¤', |
| | | resourceConfiguration: '리ìì¤ ì¤ì ', |
| | | backgroundImage: 'ë°°ê²½ ì´ë¯¸ì§', |
| | | selectImage: 'ì´ë¯¸ì§ ì í', |
| | | uploadBackground: 'ë°°ê²½ ì
ë¡ë', |
| | | uploading: 'ì
ë¡ë ì¤...', |
| | | backgroundUploadTip: 'í½ì
ìê° {n}ì¸ PNG íìì ì´ë¯¸ì§ë¥¼ ì
ë¡ëíì¸ì. ì´ë¯¸ì§ë Base64 íìì¼ë¡ ë³íë í ê¸°ê¸°ë¡ ì
ë¡ëë©ëë¤.', |
| | | backgroundResolutionMismatch: 'ì´ë¯¸ì§ í´ìëë {n} ì´ì´ì¼ í©ëë¤', |
| | | backgroundRequired: 'ë°°ê²½ ì´ë¯¸ì§ë¥¼ ì ííì¸ì', |
| | | backgroundImageOnlyPNG: 'PNG ì´ë¯¸ì§ë§ íì©', |
| | | backgroundSizeLimit: 'ì´ë¯¸ì§ í¬ê¸°ë 5MB ì´í', |
| | | backgroundParseFailed: 'ì´ë¯¸ì§ ì½ê¸° ì¤í¨, ë¤ì ìë', |
| | | backgroundImageSelected: 'ì´ë¯¸ì§ê° ì íëììµëë¤', |
| | | backgroundSuccess: 'ë°°ê²½ ì
ë¡ë ì±ê³µ', |
| | | backgroundFailed: 'ë°°ê²½ ì
ë¡ë ì¤í¨', |
| | | scanSettings: 'ì¤ìº ì¤ì ', |
| | | scanSwitch: 'ì¤ìº ì¤ìì¹', |
| | | scanInterval: 'ì¤ìº ê°ê²©', |
| | | }, |
| | | person: { |
| | | idCard: 'ì ë¶ì¦ ë²í¸', |
| | | userType: 'ì¬ì©ì ì í', |
| | | administrator: 'ê´ë¦¬ì', |
| | | userId: 'ID', |
| | | user: 'ì¬ì©ì', |
| | | voucher: 'ì격 ì¦ëª
', |
| | | permission: 'ê¶í', |
| | | addUser: 'ì¬ì©ì ì¶ê°', |
| | | name: 'ì´ë¦', |
| | | editUser: 'ì¬ì©ì ìì ', |
| | | placeholderUserId: 'ì¬ì©ì ID를 ì
ë ¥íì¸ì', |
| | | placeholderName: 'ì´ë¦ì ì
ë ¥íì¸ì', |
| | | userNotExist: 'ì¬ì©ìê° ì¡´ì¬íì§ ììµëë¤', |
| | | oneClickClear: '모ë ìì ', |
| | | clearTips: '모ë ë°ì´í°ê° ìì ë©ëë¤. ê³ìíìê² ìµëê¹?', |
| | | clearSuccess: 'ìì ìë£', |
| | | clearFailed: 'ìì ì¤í¨', |
| | | }, |
| | | voucher: { |
| | | password: 'ë¹ë°ë²í¸', |
| | | card: 'ì¹´ë', |
| | | face: 'ì¼êµ´', |
| | | finger: 'ì§ë¬¸', |
| | | code: 'ì½ë', |
| | | codeType: 'ì½ë ì í', |
| | | passthroughCode: 'íµê³¼ ì½ë', |
| | | staticCode: 'ì ì ì½ë', |
| | | dynamicCode: 'ëì ì½ë', |
| | | credentialId: 'ì격 ì¦ëª
ID', |
| | | credentialValue: 'ì격 ì¦ëª
ê°', |
| | | placeholderCode: 'ì½ë ì¸ì¦ì를 ì
ë ¥íì¸ì', |
| | | placeholderPwd: 'ë¹ë°ë²í¸ ì격ì ì
ë ¥', |
| | | placeholderCard: 'ì¹´ë ì격ì ì
ë ¥', |
| | | validPassword: '6ì리 ì«ì를 ì
ë ¥', |
| | | validCard: '8ì리 ì«ì ëë 문ì ì
ë ¥', |
| | | photoRegistration: 'ì¬ì§ ë±ë¡', |
| | | featureValueRegistration: 'í¹ì§ê° ë±ë¡', |
| | | fingerRegistration: 'ì§ë¬¸ ë±ë¡', |
| | | fingerFeatureRegistration: 'í¹ì§ê° ë±ë¡', |
| | | fingerInput: 'ìê°ë½ì ì§ë¬¸ ì¼ìì ì¬ë ¤ì£¼ì¸ì', |
| | | fingerRemainingTime: 'ë¨ì ìê°', |
| | | fingerInputting: 'ë±ë¡ ì¤...', |
| | | startFingerInput: 'ì§ë¬¸ ë±ë¡ ìì', |
| | | fingerInputTips: 'ì§ë¬¸ í¹ì§ê°ì ì
ë ¥íì¸ì', |
| | | fingerWaitInput: 'ë±ë¡ ë기', |
| | | fingerInputNow: 'ì§ë¬¸ì ë±ë¡íë ì¤...', |
| | | fingerInputSuccess: 'ë±ë¡ ì±ê³µ', |
| | | fingerInputFailed: 'ì§ë¬¸ ë±ë¡ ìì ì¤í¨', |
| | | fingerReTry: 'ì§ë¬¸ ë±ë¡ ì¤í¨, ë¤ì ìëí´ ì£¼ì¸ì', |
| | | fingerFilled: 'ì§ë¬¸ ë±ë¡ ì±ê³µ, í¹ì§ê°ì´ ìëì¼ë¡ ì
ë ¥ëììµëë¤', |
| | | fingerFailed: 'ì§ë¬¸ ë±ë¡ ì¤í¨', |
| | | fingerTimeout: 'ìê° ì´ê³¼', |
| | | fingerInputTimeout: 'ì§ë¬¸ ë±ë¡ ìê° ì´ê³¼, ë¤ì ìëí´ ì£¼ì¸ì', |
| | | fingerError: 'ë±ë¡ ì¤í¨', |
| | | fingerInputError: 'ì§ë¬¸ ë±ë¡ ì¤í¨, ë¤ì ìëí´ ì£¼ì¸ì', |
| | | fingerInputed: 'ì§ë¬¸ì´ ì´ë¯¸ ë±ë¡ëììµëë¤', |
| | | fingerReInput: 'ì§ë¬¸ ì¬ë±ë¡', |
| | | }, |
| | | permission: { |
| | | deletePermission: 'ê¶í ìì ', |
| | | addPermission: 'ê¶í ì¶ê°', |
| | | permissionId: 'ê¶í ID', |
| | | userId: 'ì¬ì©ì ID', |
| | | timeRange: 'ìê° ë²ì', |
| | | extra: 'ì¶ê°', |
| | | effectiveType: 'ì í¨ ì í', |
| | | effectiveTime: 'ì í¨ ìê°', |
| | | effectiveWeek: 'ì í¨ ì£¼', |
| | | timePeriod: 'ìê°ë', |
| | | addTimePeriod: 'ìê°ë ì¶ê°', |
| | | modify_previous_time: '먼ì ì´ì ìê°ë를 ìì íì¸ì', |
| | | cannot_be_earlier: 'ì¢
ë£ ìê°ì´ ìì ìê°ë³´ë¤ ë¹ ë¥¼ ì ììµëë¤', |
| | | times_cannot_overlap: 'ìê°ëê° ê²¹ì¹ ì ììµëë¤', |
| | | choose_time_range: 'ìê° ë²ì를 ì ííì¸ì', |
| | | unlimitedMode: '무ì í 모ë', |
| | | usualMode: 'ì¼ë° 모ë', |
| | | dailyMode: 'ì¼ì¼ 모ë', |
| | | weeklyRepetitionMode: 'ì£¼ê° ë°ë³µ 모ë', |
| | | time_range: 'ìê° ë²ì', |
| | | }, |
| | | common: { |
| | | startDate: 'ìì ë ì§', |
| | | endDate: 'ì¢
ë£ ë ì§', |
| | | to: 'ë¶í°', |
| | | cancel: 'ì·¨ì', |
| | | confirm: 'íì¸', |
| | | close: 'ë«ê¸°', |
| | | delete: 'ìì ', |
| | | edit: 'ìì ', |
| | | batchDelete: 'ì¼ê´ ìì ', |
| | | startTime: 'ìì ìê°', |
| | | endTime: 'ì¢
ë£ ìê°', |
| | | monday: 'ììì¼', |
| | | tuseday: 'íìì¼', |
| | | wednesday: 'ììì¼', |
| | | thursday: '목ìì¼', |
| | | friday: 'ê¸ìì¼', |
| | | saterday: 'í ìì¼', |
| | | sunday: 'ì¼ìì¼', |
| | | placeholder: 'ì
ë ¥íì¸ì', |
| | | placeholderSelect: 'ì ííì¸ì', |
| | | closeTips: 'ë«ê¸°ë¥¼ íì¸íìê² ìµëê¹?', |
| | | deleteTips: 'ìì 를 íì¸íìê² ìµëê¹?', |
| | | deleteSuccess: 'ìì ì±ê³µ', |
| | | addSuccess: 'ì¶ê° ì±ê³µ', |
| | | editSuccess: 'ìì ì±ê³µ', |
| | | saveSuccess: 'ì ì¥ ì±ê³µ', |
| | | tips: 'ì림', |
| | | operation: 'ìì
', |
| | | query: 'ì¡°í', |
| | | reset: 'ì´ê¸°í', |
| | | noData: 'ë°ì´í° ìì', |
| | | export: 'ë´ë³´ë´ê¸°', |
| | | success: 'ì±ê³µ', |
| | | failure: 'ì¤í¨', |
| | | incorrectFormat: 'íìì´ ì¬ë°ë¥´ì§ ììµëë¤', |
| | | integerFormat: '0 ì´ìì ì ìì¬ì¼ í©ëë¤', |
| | | positiveIntegerFormat: '0ë³´ë¤ í° ì ìì¬ì¼ í©ëë¤', |
| | | noDataSaved: 'ì ì¥í ë°ì´í°ê° ììµëë¤', |
| | | chinese: 'ì¤êµì´', |
| | | english: 'ìì´', |
| | | spanish: 'ì¤íì¸ì´', |
| | | french: 'íëì¤ì´', |
| | | german: 'ë
ì¼ì´', |
| | | russian: 'ë¬ììì´', |
| | | arabic: 'ìëì´', |
| | | portuguese: 'í¬ë¥´í¬ê°ì´', |
| | | korean: 'íêµì´', |
| | | detail: 'ì¸ë¶ ì ë³´', |
| | | clearTips: 'ì§ì°ìê² ìµëê¹?', |
| | | clearSuccess: 'ì±ê³µì ì¼ë¡ ì§ìì§', |
| | | }, |
| | | log: { |
| | | accessMethod: 'ì¶ì
ë°©ì', |
| | | passingTime: 'ì¶ì
ìê°', |
| | | accessPass: 'ì¶ì
ì¦ëª
', |
| | | accessResult: 'ê²°ê³¼', |
| | | accessPhoto: 'ì¬ì§', |
| | | viewPhotos: 'ì¬ì§ 보기' |
| | | }, |
| | | error: { |
| | | networkError: 'ë¤í¸ìí¬ ì¤ë¥, ì°ê²°ì íì¸íì¸ì', |
| | | timeout: 'ìì² ìê° ì´ê³¼, ë¤ì ìëíì¸ì', |
| | | serverError: 'ìë² ë´ë¶ ì¤ë¥, ëì¤ì ë¤ì ìë', |
| | | notFound: 'ìì²í ììì´ ììµëë¤', |
| | | unauthorized: 'ì¸ì¦ëì§ ìììµëë¤. ë¤ì ë¡ê·¸ì¸íì¸ì', |
| | | noResponse: 'ìë² ìëµì´ ììµëë¤', |
| | | unknownError: 'ìì² ì¤í¨, ì¤ë¥ ì½ë:', |
| | | requestFailed: 'ìì²ì ì¤í¨íìµëë¤' |
| | | }, |
| | | security: { |
| | | keyId: 'í¤ ID', |
| | | keyType: 'í¤ ì í', |
| | | keyEncoding: 'í¤ ì¸ì½ë©', |
| | | keyValue: 'í¤ ê°', |
| | | startTime: 'ìì ìê°', |
| | | expirationTime: 'ë§ë£ ìê°', |
| | | newKey: 'í¤ ì¶ê°', |
| | | clearKey: 'í¤ ì§ì°ê¸°', |
| | | validTime: 'ì í¨ ìê°', |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // Login |
| | | login: { |
| | | lang: 'Idioma', |
| | | systemname: 'Login', |
| | | username: 'Usuário', |
| | | username_label: 'Digite o usuário', |
| | | pwd: 'Senha', |
| | | pwd_label: 'Digite a senha', |
| | | pwd_info: 'Insira uma senha válida', |
| | | success_msg: 'Login bem-sucedido', |
| | | error_name: 'Senha incorreta', |
| | | error_res: 'Não atende aos requisitos de login', |
| | | login: 'Entrar', |
| | | }, |
| | | aside: { |
| | | systemname: 'Painel', |
| | | quit: 'Sair', |
| | | deviceControl: 'Controle', |
| | | basicSetting: 'Config.', |
| | | workerSetting: 'Pessoas', |
| | | deviceMonitoring: 'Monitor', |
| | | recordManagement: 'Registros', |
| | | securityManagement: 'Chaves', |
| | | tips: 'Aviso', |
| | | tips_msg: 'Deseja sair?', |
| | | }, |
| | | control: { |
| | | remoteControl: 'Remoto', |
| | | restart: 'Reiniciar', |
| | | clickToRestart: 'Clique para reiniciar', |
| | | restartConfirm: 'Confirmar reinÃcio?', |
| | | restartSuccess: 'ReinÃcio bem-sucedido', |
| | | restartFailed: 'ReinÃcio falhou', |
| | | remoteOpen: 'Abrir porta remotamente', |
| | | clickToOpen: 'Clique para abrir', |
| | | openConfirm: 'Confirmar abertura remota?', |
| | | remoteOpenSuccess: 'Abertura bem-sucedida', |
| | | remoteOpenFailed: 'Abertura falhou', |
| | | reset: 'Redefinir dispositivo', |
| | | clickToReset: 'Clique para redefinir', |
| | | resetConfirm: 'Confirmar redefinição?', |
| | | resetWillOut: "Após reset, sair", |
| | | resetSuccess: 'Redefinição concluÃda', |
| | | resetFailed: 'Redefinição falhou', |
| | | firmwareUpgrade: 'Atualizar firmware', |
| | | upgradeConfig: 'Config. de atualização', |
| | | firmwareUrl: 'URL do firmware', |
| | | md5Checksum: 'Valor md5', |
| | | startUpgrade: 'Iniciar atualização', |
| | | urlRequired: 'URL é obrigatória', |
| | | md5Required: 'md5 é obrigatório', |
| | | urlInvalid: 'Informe uma URL válida', |
| | | md5Invalid: 'Informe um md5 válido', |
| | | upgradeConfirm: 'Confirmar atualização?', |
| | | upgradeSuccess: 'Atualização bem-sucedida', |
| | | clearFile: "Limpar arquivo", |
| | | uploading: 'Enviando...', |
| | | uploadAndUpgrade: 'Enviar e atualizar', |
| | | restartTips: 'ReinÃcio seguro, sem perder dados', |
| | | restarting: 'Reiniciando...', |
| | | remoteTips: 'Controle remoto de acesso', |
| | | opening: 'Abrindo...', |
| | | resetTips: 'Restaurar padrão, apagará dados', |
| | | reseting: 'Redefinindo...', |
| | | urlUpgrade: 'Atualização por URL', |
| | | fileUpgrade: 'Atualização por arquivo', |
| | | uploadFile: 'Clique para enviar firmware', |
| | | formatFile: 'Suporta .zip ou .dpk, até 20MB', |
| | | fileName: 'Nome do arquivo', |
| | | size: 'Tamanho', |
| | | }, |
| | | config: { |
| | | second: 's', |
| | | millisecond: 'ms', |
| | | min: 'minutos', |
| | | notsave: 'Não salvar', |
| | | save: 'Salvar', |
| | | noVoice: 'Sem voz', |
| | | no: 'Não', |
| | | yes: 'Sim', |
| | | basicConfiguration: 'Configuração básica', |
| | | displaySettings: 'Exibição', |
| | | informationDisplay: 'Mostrar informações', |
| | | audioSettings: 'Ãudio', |
| | | languageAndThemes: 'Idioma e tema', |
| | | autoAdjustScreenBrightness: 'Brilho automático', |
| | | screenBrightness: 'Brilho da tela', |
| | | autoTurnOffScreen: 'Desligar tela automaticamente', |
| | | autoTurnOffScreenTime: 'Tempo para desligar', |
| | | autoScreenSaver: 'Protetor de tela automático', |
| | | autoScreenSaverTime: 'Tempo do protetor', |
| | | displayDeviceSn: 'Mostrar SN', |
| | | displayIp: 'Mostrar IP', |
| | | displayIdentityCard: 'Mostrar certificado em nuvem', |
| | | volume: 'Volume', |
| | | language: 'Idioma', |
| | | displayCode: "Mostrar código da miniapp", |
| | | themeMode: "Tema", |
| | | cn: 'Chinês', |
| | | en: 'Inglês', |
| | | es: 'Espanhol', |
| | | fr: 'Francês', |
| | | de: 'Alemão', |
| | | ru: 'Russo', |
| | | ar: 'Ãrabe', |
| | | pt: 'Português', |
| | | ko: 'Coreano', |
| | | standardMode: 'Modo padrão', |
| | | simpleMode: 'Modo simples', |
| | | firstLogin: 'Primeiro login', |
| | | backlight: 'Luz de fundo', |
| | | brightness: 'Luz branca', |
| | | nirBrightness: 'Luz IR', |
| | | never: 'Nunca', |
| | | min1: '1 minuto', |
| | | min2: '2 minutos', |
| | | min3: '3 minutos', |
| | | min4: '4 minutos', |
| | | min5: '5 minutos', |
| | | networkConfiguration: 'Rede', |
| | | otherConfiguration: 'Outros', |
| | | ipConfiguration: 'IP', |
| | | devicePassword: 'Senha do dispositivo', |
| | | protocolPassword: 'Senha do protocolo', |
| | | networkType: 'Tipo de rede', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'WiâFi', |
| | | wifiPassword: 'Senha WiâFi', |
| | | dhcpModeSelection: 'Modo DHCP', |
| | | dhcpMode: 'Automático', |
| | | customNetworkConfiguration: 'Manual', |
| | | ipAddress: 'Endereço IP', |
| | | gateway: 'Gateway', |
| | | subnetMask: 'Máscara de sub-rede', |
| | | dnsServer: 'Servidor DNS', |
| | | mac: 'MAC de rede', |
| | | mqttRelatedConfiguration: 'MQTT', |
| | | mqttConnectionInformation: 'Conexão MQTT', |
| | | sessionConfiguration: 'Sessão', |
| | | serverAddress: 'Servidor', |
| | | clientID: 'ID do cliente', |
| | | userName: 'Usuário', |
| | | userPassword: 'Senha', |
| | | topicPrefix: 'Prefixo do tópico', |
| | | onlineChecking: 'Verificação online', |
| | | onlineCheckingTimeout: 'Tempo limite', |
| | | cleanSession: 'Sessão limpa', |
| | | clientIdSuffix: 'Sufixo do ID', |
| | | willTopic: 'Tópico Will', |
| | | enterpriseWechat:'Modo WeChat Enterprise sem efeito', |
| | | faceRelatedConfiguration: 'Config. de rosto', |
| | | functionalInformation: 'Função', |
| | | prompt: 'Aviso', |
| | | faceSimilarityThreshold: 'Limite de similaridade', |
| | | livenessDetectionFunction: 'Detecção de vivacidade', |
| | | livenessDetectionThreshold: 'Limite de vivacidade', |
| | | infraredImageDisplay: "Exibir infravermelho", |
| | | maskRecognition: "Reconhecimento de máscara", |
| | | strangerVoice: "Voz de desconhecido", |
| | | voiceMode: "Modo de voz", |
| | | voiceModeDate: 'Saudação personalizada', |
| | | imageSaveType: "Tipo de salvamento", |
| | | saveStrangerImage: "Salvar imagem de desconhecido", |
| | | fullView: "Panorâmico", |
| | | face: "Rosto", |
| | | broadcastPleaseRegisterFirst: 'Reproduzir "Registre-se primeiro"', |
| | | broadcastHelloStranger: 'Reproduzir "Desconhecido"', |
| | | broadcastName: 'Reproduzir nome', |
| | | broadcastGreeting: 'Reproduzir saudação personalizada', |
| | | greeting: 'Saudação', |
| | | broadcastWelcome: 'Reproduzir "Bem-vindo"', |
| | | recognitionSwitch: 'Interruptor de re-detecção', |
| | | systemRelatedConfiguration: 'Sistema', |
| | | functionSwitch: 'Interruptores', |
| | | cardSwipingSwitch: 'Cartão', |
| | | passwordSwitch: 'Senha', |
| | | strangerImage: 'Imagem de desconhecido', |
| | | cloudCertificateSwitch: 'Certificado em nuvem', |
| | | physicalCardNumber: 'Número do cartão fÃsico', |
| | | cloudCertificateAcquisition: 'Obter certificado em nuvem', |
| | | heartbeatConfig: 'Heartbeat', |
| | | heartbeatSwitch: 'Ativar heartbeat', |
| | | heartRateInterval: 'Intervalo', |
| | | heartbeatTopic: 'Tópico heartbeat', |
| | | heartbeatContent: 'Conteúdo', |
| | | basicInformation: 'Informações básicas', |
| | | deviceMac: 'MAC', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'Modelo', |
| | | version: "Versão", |
| | | appVersion: "Versão do firmware", |
| | | releaseTime: "Hora da atualização", |
| | | totaldisk: 'Espaço total', |
| | | freedisk: 'Espaço restante', |
| | | passageConfiguration: 'Passagem', |
| | | functionConfiguration: 'Funções', |
| | | numberOfPassageRecords: 'Máx. registros', |
| | | durationOfRelayOpening: 'Duração do relé', |
| | | alarmSwitch: 'Alarme', |
| | | fireAlarmSwitch: 'Alarme de incêndio', |
| | | fireAlarmStatus: 'Status de incêndio', |
| | | normal: 'Normal', |
| | | warning: 'Alerta', |
| | | tamperSwitch: 'Anti-violação', |
| | | uploadToCloudSwitch: 'Interruptor de upload facial', |
| | | clockConfiguration: 'Relógio', |
| | | timeSynchronizationSwitch: 'Sincronizar hora', |
| | | timeSynchronizationServerIP: 'Servidor de tempo', |
| | | timedSynchronizationTime: 'Hora de sincronização', |
| | | timeZone: 'Fuso horário', |
| | | setDeviceTime: 'Ajustar hora', |
| | | restartAfterSetting: 'O dispositivo reiniciará', |
| | | cloudCertificateActivation: 'Ativar certificado', |
| | | activationKey: 'Chave de ativação', |
| | | cloudTips1: 'Digite a chave sem espaços', |
| | | cloudTips2: 'Após ativar, conectará ao serviço em nuvem', |
| | | confirmActivation: 'Confirmar ativação', |
| | | activationInProgress: 'Ativando...', |
| | | activationFailed: 'Falha na ativação', |
| | | activationSuccessful: 'Ativação bem-sucedida', |
| | | passwordModification: 'Alterar senha', |
| | | password: 'Senha', |
| | | oldPassword: 'Senha antiga', |
| | | newPassword: 'Nova senha', |
| | | confirmPassword: 'Confirmar senha', |
| | | passwordRule: 'Recomendação de senha', |
| | | passwordLength: 'Comprimento â¥6', |
| | | cannotBeTheSame: 'Todos caracteres não podem ser iguais', |
| | | cannotOrder: 'Sem 3+ números/letras consecutivos', |
| | | cannotWeakPassword: 'Não usar senhas fracas comuns', |
| | | submit: 'Enviar', |
| | | saveConfig: 'Salvar', |
| | | msg_please_enter: 'Por favor, insira', |
| | | msg_inputPassword: 'Digite a senha', |
| | | msg_oldPasswordError: 'Senha antiga incorreta', |
| | | msg_password_mismatch: 'Senhas não coincidem', |
| | | msg_password_min_length: 'MÃnimo 6 caracteres', |
| | | msg_is_weak_password: 'Senha fraca, altere', |
| | | msg_pswChangeSuccessAndLogin: 'Senha alterada, faça login', |
| | | msg_pswChangeSuccess: 'Senha alterada', |
| | | msg_pswChangeFail: 'Falha ao alterar senha', |
| | | msg_saveSuccess: 'Salvo com sucesso', |
| | | msg_saveFail: 'Falha ao salvar', |
| | | msg_formFilled: 'Verifique o formulário', |
| | | msg_number_0_23: 'Apenas 0-23', |
| | | msg_number_0_24: 'Apenas 0-24', |
| | | msg_noChange: 'Nenhuma alteração de configuração para salvar', |
| | | resourceConfiguration: 'Configuração de recursos', |
| | | backgroundImage: 'Imagem de fundo', |
| | | selectImage: 'Selecionar imagem', |
| | | uploadBackground: 'Enviar fundo', |
| | | uploading: 'Enviando...', |
| | | backgroundUploadTip: 'Por favor, envie uma imagem em formato PNG com pixels de {n}, que será convertida para o formato Base64 e enviada ao dispositivo', |
| | | backgroundResolutionMismatch: 'A resolução da imagem deve ser {n}', |
| | | backgroundRequired: 'Selecione uma imagem de fundo', |
| | | backgroundImageOnlyPNG: 'Apenas PNG', |
| | | backgroundSizeLimit: 'Imagem não pode exceder 5MB', |
| | | backgroundParseFailed: 'Falha ao ler imagem', |
| | | backgroundImageSelected: 'Imagem selecionada', |
| | | backgroundSuccess: 'Fundo enviado', |
| | | backgroundFailed: 'Falha ao enviar fundo', |
| | | scanSettings: 'Configurações de digitalização', |
| | | scanSwitch: 'Interruptor de Digitalização', |
| | | scanInterval: 'Intervalo de digitalização', |
| | | }, |
| | | person: { |
| | | idCard: 'Número de identificação', |
| | | userType: 'Tipo de pessoa', |
| | | administrator: 'Administrador', |
| | | userId: 'ID', |
| | | user: 'Usuário', |
| | | voucher: 'Credencial', |
| | | permission: 'Permissão', |
| | | addUser: 'Adicionar pessoa', |
| | | name: 'Nome', |
| | | editUser: 'Editar pessoa', |
| | | placeholderUserId: 'Informe o ID do usuário', |
| | | placeholderName: 'Informe o nome', |
| | | userNotExist: 'Pessoa não existe', |
| | | oneClickClear: 'Limpar tudo', |
| | | clearTips: 'Isto apagará todos os dados, continuar?', |
| | | clearSuccess: 'Limpo com sucesso', |
| | | clearFailed: 'Falha ao limpar', |
| | | }, |
| | | voucher: { |
| | | password: 'Senha', |
| | | card: 'Cartão', |
| | | face: 'Rosto', |
| | | finger: 'Impressão digital', |
| | | code: 'Código', |
| | | codeType: 'Tipo de código', |
| | | passthroughCode: 'Código de passagem', |
| | | staticCode: 'Código estático', |
| | | dynamicCode: 'Código dinâmico', |
| | | credentialId: 'ID da credencial', |
| | | credentialValue: 'Valor da credencial', |
| | | placeholderCode: 'Por favor insira o certificado de código', |
| | | placeholderPwd: 'Informe a senha', |
| | | placeholderCard: 'Informe o cartão', |
| | | validPassword: 'Insira 6 dÃgitos', |
| | | validCard: 'Insira 8 dÃgitos ou letras', |
| | | photoRegistration: 'Registro de foto', |
| | | featureValueRegistration: 'Registro de caracterÃsticas', |
| | | fingerRegistration: 'Cadastro de digital', |
| | | fingerFeatureRegistration: 'Cadastro por valor de caracterÃstica', |
| | | fingerInput: 'Coloque o dedo no leitor de digitais', |
| | | fingerRemainingTime: 'Tempo restante', |
| | | fingerInputting: 'Cadastrando...', |
| | | startFingerInput: 'Iniciar cadastro de digital', |
| | | fingerInputTips: 'Informe o valor de caracterÃstica da digital', |
| | | fingerWaitInput: 'Aguardando cadastro', |
| | | fingerInputNow: 'Cadastrando digital...', |
| | | fingerInputSuccess: 'Cadastro bem-sucedido', |
| | | fingerInputFailed: 'Falha ao iniciar o cadastro de digital', |
| | | fingerReTry: 'Falha no cadastro de digital, tente novamente', |
| | | fingerFilled: 'Cadastro de digital bem-sucedido, o valor de caracterÃstica foi preenchido automaticamente', |
| | | fingerFailed: 'Falha no cadastro de digital', |
| | | fingerTimeout: 'Tempo esgotado', |
| | | fingerInputTimeout: 'Tempo esgotado no cadastro de digital, tente novamente', |
| | | fingerError: 'Cadastro falhou', |
| | | fingerInputError: 'Falha no cadastro de digital, tente novamente', |
| | | fingerInputed: 'Digital já cadastrada', |
| | | fingerReInput: 'Cadastrar digital novamente', |
| | | }, |
| | | permission: { |
| | | deletePermission: 'Excluir permissão', |
| | | addPermission: 'Adicionar permissão', |
| | | permissionId: 'ID da permissão', |
| | | userId: 'ID do usuário', |
| | | timeRange: 'Intervalo de tempo', |
| | | extra: 'Extra', |
| | | effectiveType: 'Tipo de vigência', |
| | | effectiveTime: 'Tempo efetivo', |
| | | effectiveWeek: 'Semana efetiva', |
| | | timePeriod: 'PerÃodo', |
| | | addTimePeriod: 'Adicionar perÃodo', |
| | | modify_previous_time: 'Altere primeiro o perÃodo anterior', |
| | | cannot_be_earlier: 'Hora final não pode ser menor que inicial', |
| | | times_cannot_overlap: 'Horários não podem se sobrepor', |
| | | choose_time_range: 'Selecione o intervalo', |
| | | unlimitedMode: 'Ilimitado', |
| | | usualMode: 'Modo usual', |
| | | dailyMode: 'Modo diário', |
| | | weeklyRepetitionMode: 'Repetição semanal', |
| | | time_range: 'Faixa de tempo', |
| | | }, |
| | | common: { |
| | | startDate: 'Data inicial', |
| | | endDate: 'Data final', |
| | | to: 'a', |
| | | cancel: 'Cancelar', |
| | | confirm: 'Confirmar', |
| | | close: 'Fechar', |
| | | delete: 'Excluir', |
| | | edit: 'Editar', |
| | | batchDelete: 'Excluir em lote', |
| | | startTime: 'Hora inicial', |
| | | endTime: 'Hora final', |
| | | monday: 'Segunda', |
| | | tuseday: 'Terça', |
| | | wednesday: 'Quarta', |
| | | thursday: 'Quinta', |
| | | friday: 'Sexta', |
| | | saterday: 'Sábado', |
| | | sunday: 'Domingo', |
| | | placeholder: 'Por favor insira', |
| | | placeholderSelect: 'Por favor selecione', |
| | | closeTips: 'Confirmar fechamento?', |
| | | deleteTips: 'Confirmar exclusão?', |
| | | deleteSuccess: 'ExcluÃdo com sucesso', |
| | | addSuccess: 'Adicionado com sucesso', |
| | | editSuccess: 'Editado com sucesso', |
| | | saveSuccess: 'Salvo com sucesso', |
| | | tips: 'Dica', |
| | | operation: 'Operação', |
| | | query: 'Consulta', |
| | | reset: 'Reset', |
| | | noData: 'Sem dados', |
| | | export: 'Exportar', |
| | | success: 'Sucesso', |
| | | failure: 'Falha', |
| | | incorrectFormat: 'Formato incorreto', |
| | | integerFormat: 'Deve ser inteiro â¥0', |
| | | positiveIntegerFormat: 'Deve ser inteiro >0', |
| | | noDataSaved: 'Sem dados para salvar', |
| | | chinese: 'Chinês', |
| | | english: 'Inglês', |
| | | spanish: 'Espanhol', |
| | | french: 'Francês', |
| | | german: 'Alemão', |
| | | russian: 'Russo', |
| | | arabic: 'Ãrabe', |
| | | portuguese: 'Português', |
| | | korean: 'Coreano', |
| | | detail: 'Detalhe', |
| | | clearTips: 'Confirmar limpeza?', |
| | | clearSuccess: 'Limpo com sucesso', |
| | | }, |
| | | log: { |
| | | accessMethod: 'Método de acesso', |
| | | passingTime: 'Hora de passagem', |
| | | accessPass: 'Credencial de acesso', |
| | | accessResult: 'Resultado', |
| | | accessPhoto: 'Foto', |
| | | viewPhotos: 'Ver fotos' |
| | | }, |
| | | error: { |
| | | networkError: 'Falha de rede, verifique a conexão', |
| | | timeout: 'Tempo esgotado, tente novamente', |
| | | serverError: 'Erro interno, tente mais tarde', |
| | | notFound: 'Recurso não existe', |
| | | unauthorized: 'Não autorizado, faça login', |
| | | noResponse: 'Sem resposta do servidor', |
| | | unknownError: 'Falha na solicitação, código:', |
| | | requestFailed: 'Solicitação falhou' |
| | | }, |
| | | security: { |
| | | keyId: 'ID da chave', |
| | | keyType: 'Tipo de chave', |
| | | keyEncoding: 'Codificação da chave', |
| | | keyValue: 'Valor da chave', |
| | | startTime: 'Hora de inÃcio', |
| | | expirationTime: 'Hora de expiração', |
| | | newKey: 'Adicionar chave', |
| | | clearKey: 'Limpar chave', |
| | | validTime: 'Tempo válido', |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // ÐÑ
од |
| | | login: { |
| | | lang: 'ЯзÑк', |
| | | systemname: 'ÐÑ
од', |
| | | username: 'ÐолÑзоваÑелÑ', |
| | | username_label: 'ÐведиÑе Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ', |
| | | pwd: 'ÐаÑолÑ', |
| | | pwd_label: 'ÐведиÑе паÑолÑ', |
| | | pwd_info: 'ÐведиÑе коÑÑекÑнÑй паÑолÑ', |
| | | success_msg: 'ÐÑ
од вÑполнен', |
| | | error_name: 'ÐевеÑнÑй паÑолÑ', |
| | | error_res: 'Ðе ÑооÑвеÑÑÑвÑÐµÑ ÑÑебованиÑм вÑ
ода', |
| | | login: 'ÐойÑи', |
| | | }, |
| | | aside: { |
| | | systemname: 'ÐанелÑ', |
| | | quit: 'ÐÑйÑи', |
| | | deviceControl: 'УпÑавление', |
| | | basicSetting: 'ÐаÑÑÑойки', |
| | | workerSetting: 'ÐеÑÑонал', |
| | | deviceMonitoring: 'ÐониÑоÑинг', |
| | | recordManagement: 'ÐÑÑналÑ', |
| | | securityManagement: 'клÑÑами', |
| | | tips: 'ÐодÑказка', |
| | | tips_msg: 'ÐÑйÑи из ÑиÑÑемÑ?', |
| | | }, |
| | | control: { |
| | | remoteControl: 'УдалÑнное', |
| | | restart: 'ÐеÑезапÑÑк', |
| | | clickToRestart: 'ÐажмиÑе Ð´Ð»Ñ Ð¿ÐµÑезапÑÑка', |
| | | restartConfirm: 'ÐодÑвеÑдиÑÑ Ð¿ÐµÑезапÑÑк?', |
| | | restartSuccess: 'ÐеÑезапÑÑк ÑÑпеÑен', |
| | | restartFailed: 'ÐеÑезапÑÑк неÑдаÑен', |
| | | remoteOpen: 'УдалÑнное оÑкÑÑÑие', |
| | | clickToOpen: 'ÐажмиÑе Ð´Ð»Ñ Ð¾ÑкÑÑÑиÑ', |
| | | openConfirm: 'ÐодÑвеÑдиÑÑ ÑдалÑнное оÑкÑÑÑие?', |
| | | remoteOpenSuccess: 'ÐÑкÑÑÑо ÑÑпеÑно', |
| | | remoteOpenFailed: 'ÐÑкÑÑÑÑ Ð½Ðµ ÑдалоÑÑ', |
| | | reset: 'СбÑÐ¾Ñ ÑÑÑÑойÑÑва', |
| | | clickToReset: 'ÐажмиÑе Ð´Ð»Ñ ÑбÑоÑа', |
| | | resetConfirm: 'ÐодÑвеÑдиÑÑ ÑбÑоÑ?', |
| | | resetWillOut: "ÐÑÑ
од поÑле ÑбÑоÑа", |
| | | resetSuccess: 'СбÑÐ¾Ñ ÑÑпеÑен', |
| | | resetFailed: 'СбÑÐ¾Ñ Ð½ÐµÑдаÑен', |
| | | firmwareUpgrade: 'Ðбновление пÑоÑивки', |
| | | upgradeConfig: 'ÐаÑÑÑойки обновлениÑ', |
| | | firmwareUrl: 'URL пÑоÑивки', |
| | | md5Checksum: 'md5', |
| | | startUpgrade: 'ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ', |
| | | urlRequired: 'URL обÑзаÑелен', |
| | | md5Required: 'md5 обÑзаÑелен', |
| | | urlInvalid: 'ÐведиÑе коÑÑекÑнÑй URL', |
| | | md5Invalid: 'ÐведиÑе коÑÑекÑнÑй md5', |
| | | upgradeConfirm: 'ÐодÑвеÑдиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ?', |
| | | upgradeSuccess: 'Ðбновление ÑÑпеÑно', |
| | | clearFile: "ÐÑиÑÑиÑÑ Ñайл", |
| | | uploading: 'ÐагÑÑзка...', |
| | | uploadAndUpgrade: 'ÐагÑÑзиÑÑ Ð¸ обновиÑÑ', |
| | | restartTips: 'ÐезопаÑнÑй пеÑезапÑÑк, даннÑе не поÑеÑÑÑÑÑÑ', |
| | | restarting: 'ÐеÑезапÑÑк...', |
| | | remoteTips: 'УдалÑннÑй конÑÑÐ¾Ð»Ñ Ð´Ð¾ÑÑÑпа', |
| | | opening: 'ÐÑкÑÑваеÑÑÑ...', |
| | | resetTips: 'СбÑÐ¾Ñ Ðº заводÑким, даннÑе ÑдалÑÑÑÑ', |
| | | reseting: 'СбÑаÑÑваеÑÑÑ...', |
| | | urlUpgrade: 'Ðбновление по URL', |
| | | fileUpgrade: 'Ðбновление Ñайлом', |
| | | uploadFile: 'ÐликниÑе Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки пÑоÑивки', |
| | | formatFile: 'ÐоддеÑжка .zip или .dpk, до 20MB', |
| | | fileName: 'ÐÐ¼Ñ Ñайла', |
| | | size: 'РазмеÑ', |
| | | }, |
| | | config: { |
| | | second: 'Ñ', |
| | | millisecond: 'мÑ', |
| | | min: 'минÑÑ', |
| | | notsave: 'Ðе ÑоÑ
ÑанÑÑÑ', |
| | | save: 'СоÑ
ÑаниÑÑ', |
| | | noVoice: 'Ðез голоÑа', |
| | | no: 'ÐеÑ', |
| | | yes: 'Ðа', |
| | | basicConfiguration: 'ÐÐ°Ð·Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑигÑÑаÑиÑ', |
| | | displaySettings: 'ÐаÑÑÑойки ÑкÑана', |
| | | informationDisplay: 'ÐÑобÑажение инÑо', |
| | | audioSettings: 'ÐÑдио', |
| | | languageAndThemes: 'ЯзÑк и Ñема', |
| | | autoAdjustScreenBrightness: 'ÐвÑоÑÑкоÑÑÑ', |
| | | screenBrightness: 'ЯÑкоÑÑÑ ÑкÑана', |
| | | autoTurnOffScreen: 'ÐвÑовÑклÑÑение ÑкÑана', |
| | | autoTurnOffScreenTime: 'ÐÑÐµÐ¼Ñ Ð¾ÑклÑÑениÑ', |
| | | autoScreenSaver: 'ÐвÑо заÑÑавка', |
| | | autoScreenSaverTime: 'ÐÑÐµÐ¼Ñ Ð·Ð°ÑÑавки', |
| | | displayDeviceSn: 'ÐоказаÑÑ SN', |
| | | displayIp: 'ÐоказаÑÑ IP', |
| | | displayIdentityCard: 'ÐоказаÑÑ Ð¾Ð±Ð»Ð°ÑнÑй ÑеÑÑиÑикаÑ', |
| | | volume: 'ÐÑомкоÑÑÑ', |
| | | language: 'ЯзÑк', |
| | | displayCode: "ÐоказаÑÑ ÐºÐ¾Ð´ мини-пÑиложениÑ", |
| | | themeMode: "Тема", |
| | | cn: 'ÐиÑайÑкий', |
| | | en: 'ÐнглийÑкий', |
| | | es: 'ÐÑпанÑкий', |
| | | fr: 'ФÑанÑÑзÑкий', |
| | | de: 'ÐемеÑкий', |
| | | ru: 'Ð ÑÑÑкий', |
| | | ar: 'ÐÑабÑкий', |
| | | pt: 'ÐоÑÑ.', |
| | | ko: 'ÐоÑейÑкий', |
| | | standardMode: 'СÑандаÑÑнÑй Ñежим', |
| | | simpleMode: 'ÐÑоÑÑой Ñежим', |
| | | firstLogin: 'ÐеÑвÑй вÑ
од', |
| | | backlight: 'ÐодÑвеÑка', |
| | | brightness: 'ÐÐµÐ»Ð°Ñ Ð¿Ð¾Ð´ÑвеÑка', |
| | | nirBrightness: 'ÐÐ-подÑвеÑка', |
| | | never: 'Ðикогда', |
| | | min1: '1 минÑÑа', |
| | | min2: '2 минÑÑÑ', |
| | | min3: '3 минÑÑÑ', |
| | | min4: '4 минÑÑÑ', |
| | | min5: '5 минÑÑ', |
| | | networkConfiguration: 'СеÑÑ', |
| | | otherConfiguration: 'ÐÑоÑее', |
| | | ipConfiguration: 'IP наÑÑÑойки', |
| | | devicePassword: 'ÐаÑÐ¾Ð»Ñ ÑÑÑÑойÑÑва', |
| | | protocolPassword: 'ÐаÑÐ¾Ð»Ñ Ð¿ÑоÑокола', |
| | | networkType: 'Тип ÑеÑи', |
| | | ethernet: 'Ethernet', |
| | | wifiName: 'WiâFi', |
| | | wifiPassword: 'ÐаÑÐ¾Ð»Ñ WiâFi', |
| | | dhcpModeSelection: 'Режим DHCP', |
| | | dhcpMode: 'ÐвÑо', |
| | | customNetworkConfiguration: 'Ð ÑÑной', |
| | | ipAddress: 'IP-адÑеÑ', |
| | | gateway: 'ШлÑз', |
| | | subnetMask: 'ÐаÑка подÑеÑи', |
| | | dnsServer: 'DNS ÑеÑвеÑ', |
| | | mac: 'MAC', |
| | | mqttRelatedConfiguration: 'MQTT', |
| | | mqttConnectionInformation: 'ÐодклÑÑение MQTT', |
| | | sessionConfiguration: 'СеÑÑиÑ', |
| | | serverAddress: 'ÐдÑÐµÑ ÑеÑвеÑа', |
| | | clientID: 'ID клиенÑа', |
| | | userName: 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ', |
| | | userPassword: 'ÐаÑолÑ', |
| | | topicPrefix: 'ÐÑеÑÐ¸ÐºÑ Ñопика', |
| | | onlineChecking: 'Ðнлайн-пÑовеÑка', |
| | | onlineCheckingTimeout: 'Тайм-аÑÑ', |
| | | cleanSession: 'ÐÑиÑÑиÑÑ ÑеÑÑиÑ', |
| | | clientIdSuffix: 'СÑÑÑÐ¸ÐºÑ ID', |
| | | willTopic: 'Will-Ñопик', |
| | | enterpriseWechat:'Режим Enterprise WeChat не дейÑÑвÑеÑ', |
| | | faceRelatedConfiguration: 'ÐаÑÑÑойки лиÑа', |
| | | functionalInformation: 'ФÑнкÑиÑ', |
| | | prompt: 'ÐодÑказка', |
| | | faceSimilarityThreshold: 'ÐоÑог ÑÑ
ожеÑÑи', |
| | | livenessDetectionFunction: 'ÐÑовеÑка живоÑÑи', |
| | | livenessDetectionThreshold: 'ÐоÑог живоÑÑи', |
| | | infraredImageDisplay: "Ðоказ ÐÐ-изобÑажениÑ", |
| | | maskRecognition: "РаÑпознавание маÑки", |
| | | strangerVoice: "ÐÐ¾Ð»Ð¾Ñ Ð½ÐµÐ·Ð½Ð°ÐºÐ¾Ð¼Ñа", |
| | | voiceMode: "Режим голоÑа", |
| | | voiceModeDate: 'ÐолÑзоваÑелÑÑкое пÑивеÑÑÑвие', |
| | | imageSaveType: "Тип ÑоÑ
ÑанениÑ", |
| | | saveStrangerImage: "СоÑ
ÑанÑÑÑ Ð»Ð¸Ñо незнакомÑа", |
| | | fullView: "ÐаноÑама", |
| | | face: "ÐиÑо", |
| | | broadcastPleaseRegisterFirst: 'ÐÑоигÑÑваÑÑ "СнаÑала заÑегиÑÑÑиÑÑйÑеÑÑ"', |
| | | broadcastHelloStranger: 'ÐÑоигÑÑваÑÑ "ÐезнакомеÑ"', |
| | | broadcastName: 'ÐÑоигÑÑваÑÑ Ð¸Ð¼Ñ', |
| | | broadcastGreeting: 'ÐÑоигÑÑваÑÑ ÑÐ²Ð¾Ñ Ð¿ÑивеÑÑÑвие', |
| | | greeting: 'ÐÑивеÑÑÑвие', |
| | | broadcastWelcome: 'ÐÑоигÑÑваÑÑ "ÐобÑо пожаловаÑÑ"', |
| | | recognitionSwitch: 'ÐеÑеклÑÑаÑÐµÐ»Ñ Ð¿Ð¾Ð²ÑоÑной пÑовеÑки', |
| | | systemRelatedConfiguration: 'СиÑÑема', |
| | | functionSwitch: 'ÐеÑеклÑÑаÑели', |
| | | cardSwipingSwitch: 'ÐаÑÑа', |
| | | passwordSwitch: 'ÐаÑолÑ', |
| | | strangerImage: 'ФоÑо незнакомÑа', |
| | | cloudCertificateSwitch: 'ÐблаÑнÑй ÑеÑÑиÑикаÑ', |
| | | physicalCardNumber: 'ÐÐ¾Ð¼ÐµÑ ÐºÐ°ÑÑÑ', |
| | | cloudCertificateAcquisition: 'ÐолÑÑение облаÑного ÑеÑÑиÑикаÑа', |
| | | heartbeatConfig: 'Heartbeat', |
| | | heartbeatSwitch: 'Ðкл./вÑкл. heartbeat', |
| | | heartRateInterval: 'ÐнÑеÑвал', |
| | | heartbeatTopic: 'Топик heartbeat', |
| | | heartbeatContent: 'СодеÑжимое', |
| | | basicInformation: 'ÐÐ°Ð·Ð¾Ð²Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ', |
| | | deviceMac: 'MAC', |
| | | uuid: 'UUID', |
| | | sn: 'SN', |
| | | model: 'ÐоделÑ', |
| | | version: "ÐеÑÑиÑ", |
| | | appVersion: "ÐеÑÑÐ¸Ñ Ð¿ÑоÑивки", |
| | | releaseTime: "ÐÑÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ", |
| | | totaldisk: 'ÐбÑÐ°Ñ Ð¿Ð»Ð¾ÑадÑ', |
| | | freedisk: 'ÐÑÑавÑееÑÑ Ð¿ÑоÑÑÑанÑÑво', |
| | | passageConfiguration: 'ÐÑоÑ
од', |
| | | functionConfiguration: 'ФÑнкÑии', |
| | | numberOfPassageRecords: 'ÐакÑ. запиÑей пÑоÑ
ода', |
| | | durationOfRelayOpening: 'ÐÑÐµÐ¼Ñ Ñеле', |
| | | alarmSwitch: 'СигнализаÑиÑ', |
| | | fireAlarmSwitch: 'ÐожаÑÐ½Ð°Ñ ÑигнализаÑиÑ', |
| | | fireAlarmStatus: 'СÑаÑÑÑ Ð¿Ð¾Ð¶Ð°Ñа', |
| | | normal: 'ÐоÑма', |
| | | warning: 'ÐÑедÑпÑеждение', |
| | | tamperSwitch: 'ТампеÑовка', |
| | | uploadToCloudSwitch: 'ÐеÑеклÑÑаÑÐµÐ»Ñ Ð·Ð°Ð³ÑÑзки лиÑа', |
| | | clockConfiguration: 'ЧаÑÑ', |
| | | timeSynchronizationSwitch: 'СинÑ
ÑонизаÑÐ¸Ñ Ð²Ñемени', |
| | | timeSynchronizationServerIP: 'СеÑÐ²ÐµÑ Ð²Ñемени', |
| | | timedSynchronizationTime: 'ÐÑÐµÐ¼Ñ ÑинÑ
ÑонизаÑии', |
| | | timeZone: 'ЧаÑовой поÑÑ', |
| | | setDeviceTime: 'УÑÑановиÑÑ Ð²ÑемÑ', |
| | | restartAfterSetting: 'ÐоÑле ÑÑÑановки ÑÑÑÑойÑÑво пеÑезапÑÑÑиÑÑÑ', |
| | | cloudCertificateActivation: 'ÐкÑиваÑÐ¸Ñ ÑеÑÑиÑикаÑа', |
| | | activationKey: 'ÐлÑÑ Ð°ÐºÑиваÑии', |
| | | cloudTips1: 'ÐведиÑе клÑÑ Ð±ÐµÐ· пÑобелов', |
| | | cloudTips2: 'ÐоÑле акÑиваÑии подклÑÑиÑÑÑ Ðº облаÑÐ½Ð¾Ð¼Ñ ÑеÑвиÑÑ', |
| | | confirmActivation: 'ÐодÑвеÑдиÑÑ Ð°ÐºÑиваÑиÑ', |
| | | activationInProgress: 'ÐкÑиваÑиÑ...', |
| | | activationFailed: 'Сбой акÑиваÑии', |
| | | activationSuccessful: 'ÐкÑиваÑÐ¸Ñ ÑÑпеÑна', |
| | | passwordModification: 'Ðзменение паÑолÑ', |
| | | password: 'ÐаÑолÑ', |
| | | oldPassword: 'СÑаÑÑй паÑолÑ', |
| | | newPassword: 'ÐовÑй паÑолÑ', |
| | | confirmPassword: 'ÐодÑвеÑдиÑе паÑолÑ', |
| | | passwordRule: 'РекомендаÑии по паÑолÑ', |
| | | passwordLength: 'Ðлина â¥6', |
| | | cannotBeTheSame: 'ÐÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми', |
| | | cannotOrder: 'Ðе менее 3 подÑÑд ÑиÑÑ/бÑкв', |
| | | cannotWeakPassword: 'Ðе иÑполÑзоваÑÑ ÑлабÑе паÑоли', |
| | | submit: 'ÐÑпÑавиÑÑ', |
| | | saveConfig: 'СоÑ
ÑаниÑÑ', |
| | | msg_please_enter: 'ÐведиÑе ÑодеÑжание', |
| | | msg_inputPassword: 'ÐведиÑе паÑолÑ', |
| | | msg_oldPasswordError: 'СÑаÑÑй паÑÐ¾Ð»Ñ Ð½ÐµÐ²ÐµÑен', |
| | | msg_password_mismatch: 'ÐаÑоли не ÑовпадаÑÑ', |
| | | msg_password_min_length: 'ÐинимÑм 6 Ñимволов', |
| | | msg_is_weak_password: 'СлабÑй паÑолÑ, ÑмениÑе', |
| | | msg_pswChangeSuccessAndLogin: 'ÐаÑÐ¾Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½Ñн, войдиÑе Ñнова', |
| | | msg_pswChangeSuccess: 'ÐаÑÐ¾Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½Ñн', |
| | | msg_pswChangeFail: 'Ðе ÑдалоÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð°ÑолÑ', |
| | | msg_saveSuccess: 'УÑпеÑно ÑоÑ
Ñанено', |
| | | msg_saveFail: 'СоÑ
Ñанение не ÑдалоÑÑ', |
| | | msg_formFilled: 'ÐÑовеÑÑÑе ÑоÑмÑ', |
| | | msg_number_0_23: 'ТолÑко 0-23', |
| | | msg_number_0_24: 'ТолÑко 0-24', |
| | | msg_noChange: 'ÐÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ конÑигÑÑаÑии Ð´Ð»Ñ ÑоÑ
ÑанениÑ', |
| | | resourceConfiguration: 'ÐаÑÑÑойки ÑеÑÑÑÑов', |
| | | backgroundImage: 'Фоновое изобÑажение', |
| | | selectImage: 'ÐÑбÑаÑÑ Ð¸Ð·Ð¾Ð±Ñажение', |
| | | uploadBackground: 'ÐагÑÑзиÑÑ Ñон', |
| | | uploading: 'ÐагÑÑзка...', |
| | | backgroundUploadTip: 'ÐагÑÑзиÑе изобÑажение в ÑоÑмаÑе PNG Ñ ÑазÑеÑением {n} пикÑелей, изобÑажение бÑÐ´ÐµÑ Ð¿ÑеобÑазовано в Base64 и загÑÑжено на ÑÑÑÑойÑÑво', |
| | | backgroundResolutionMismatch: 'РазÑеÑение изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ {n}', |
| | | backgroundRequired: 'ÐÑбеÑиÑе Ñоновое изобÑажение', |
| | | backgroundImageOnlyPNG: 'ТолÑко PNG', |
| | | backgroundSizeLimit: 'Ð Ð°Ð·Ð¼ÐµÑ â¤ 5MB', |
| | | backgroundParseFailed: 'Ðе ÑдалоÑÑ Ð¿ÑоÑиÑаÑÑ Ð¸Ð·Ð¾Ð±Ñажение', |
| | | backgroundImageSelected: 'ÐзобÑажение вÑбÑано', |
| | | backgroundSuccess: 'Фон загÑÑжен', |
| | | backgroundFailed: 'ÐÑибка загÑÑзки Ñона', |
| | | scanSettings: 'ÐаÑÑÑойки ÑканиÑованиÑ', |
| | | scanSwitch: 'ÐеÑеклÑÑаÑÐµÐ»Ñ ÑканиÑованиÑ', |
| | | scanInterval: 'ÐнÑеÑвал ÑканиÑованиÑ', |
| | | }, |
| | | person: { |
| | | idCard: 'ÐÐ¾Ð¼ÐµÑ ÑдоÑÑовеÑениÑ', |
| | | userType: 'Тип полÑзоваÑелÑ', |
| | | administrator: 'ÐдминиÑÑÑаÑоÑ', |
| | | userId: 'ID', |
| | | user: 'ÐолÑзоваÑелÑ', |
| | | voucher: 'УдоÑÑовеÑение', |
| | | permission: 'РазÑеÑение', |
| | | addUser: 'ÐобавиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ', |
| | | name: 'ÐмÑ', |
| | | editUser: 'РедакÑиÑоваÑÑ', |
| | | placeholderUserId: 'ÐведиÑе ID', |
| | | placeholderName: 'ÐведиÑе имÑ', |
| | | userNotExist: 'ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ найден', |
| | | oneClickClear: 'ÐÑиÑÑиÑÑ Ð²Ñе', |
| | | clearTips: 'ÐÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð²Ñе даннÑе, пÑодолжиÑÑ?', |
| | | clearSuccess: 'УÑпеÑно оÑиÑено', |
| | | clearFailed: 'Ðе ÑдалоÑÑ Ð¾ÑиÑÑиÑÑ', |
| | | }, |
| | | voucher: { |
| | | password: 'ÐаÑолÑ', |
| | | card: 'ÐаÑÑа', |
| | | face: 'ÐиÑо', |
| | | finger: 'ÐÑпеÑаÑок', |
| | | code: 'Ðод', |
| | | codeType: 'Тип кода', |
| | | passthroughCode: 'Сквозной код', |
| | | staticCode: 'СÑаÑиÑеÑкий код', |
| | | dynamicCode: 'ÐинамиÑеÑкий код', |
| | | credentialId: 'ID ÑÑеÑнÑÑ
даннÑÑ
', |
| | | credentialValue: 'ÐнаÑение ÑÑеÑнÑÑ
даннÑÑ
', |
| | | placeholderCode: 'ÐожалÑйÑÑа, введиÑе код ÑеÑÑиÑикаÑа', |
| | | placeholderPwd: 'ÐведиÑе паÑолÑ', |
| | | placeholderCard: 'ÐведиÑе каÑÑÑ', |
| | | validPassword: 'ÐведиÑе 6 ÑиÑÑ', |
| | | validCard: 'ÐведиÑе 8 ÑиÑÑ Ð¸Ð»Ð¸ бÑкв', |
| | | photoRegistration: 'РегиÑÑÑаÑÐ¸Ñ ÑоÑо', |
| | | featureValueRegistration: 'РегиÑÑÑаÑÐ¸Ñ Ð¿Ñизнаков', |
| | | fingerRegistration: 'РегиÑÑÑаÑÐ¸Ñ Ð¾ÑпеÑаÑка', |
| | | fingerFeatureRegistration: 'РегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ Ð¿Ñизнака', |
| | | fingerInput: 'ÐÑиложиÑе Ð¿Ð°Ð»ÐµÑ Ðº ÑканеÑÑ Ð¾ÑпеÑаÑков', |
| | | fingerRemainingTime: 'ÐÑÑавÑееÑÑ Ð²ÑемÑ', |
| | | fingerInputting: 'ÐдÑÑ Ð²Ð²Ð¾Ð´...', |
| | | startFingerInput: 'ÐаÑаÑÑ Ð²Ð²Ð¾Ð´ оÑпеÑаÑка', |
| | | fingerInputTips: 'ÐведиÑе знаÑение пÑизнака оÑпеÑаÑка', |
| | | fingerWaitInput: 'Ðжидание ввода', |
| | | fingerInputNow: 'ÐдÑÑ Ð²Ð²Ð¾Ð´ оÑпеÑаÑка...', |
| | | fingerInputSuccess: 'Ðвод ÑÑпеÑен', |
| | | fingerInputFailed: 'Ðе ÑдалоÑÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð²Ð²Ð¾Ð´ оÑпеÑаÑка', |
| | | fingerReTry: 'ÐÑибка ввода оÑпеÑаÑка, попÑобÑйÑе еÑÑ Ñаз', |
| | | fingerFilled: 'Ðвод оÑпеÑаÑка ÑÑпеÑен, знаÑение пÑизнака заполнено авÑомаÑиÑеÑки', |
| | | fingerFailed: 'ÐÑибка ввода оÑпеÑаÑка', |
| | | fingerTimeout: 'ÐÑÐµÐ¼Ñ Ð²ÑÑло', |
| | | fingerInputTimeout: 'ÐÑÐµÐ¼Ñ Ð²Ð²Ð¾Ð´Ð° оÑпеÑаÑка иÑÑекло, попÑобÑйÑе еÑÑ Ñаз', |
| | | fingerError: 'Ðвод не вÑполнен', |
| | | fingerInputError: 'ÐÑибка ввода оÑпеÑаÑка, попÑобÑйÑе еÑÑ Ñаз', |
| | | fingerInputed: 'ÐÑпеÑаÑок Ñже заÑегиÑÑÑиÑован', |
| | | fingerReInput: 'ÐовÑоÑно ввеÑÑи оÑпеÑаÑок', |
| | | }, |
| | | permission: { |
| | | deletePermission: 'УдалиÑÑ ÑазÑеÑение', |
| | | addPermission: 'ÐобавиÑÑ ÑазÑеÑение', |
| | | permissionId: 'ID ÑазÑеÑениÑ', |
| | | userId: 'ID полÑзоваÑелÑ', |
| | | timeRange: 'ÐÑеменной диапазон', |
| | | extra: 'ÐополниÑелÑно', |
| | | effectiveType: 'Тип дейÑÑвиÑ', |
| | | effectiveTime: 'ÐÑÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑвиÑ', |
| | | effectiveWeek: 'ÐÐµÐ´ÐµÐ»Ñ Ð´ÐµÐ¹ÑÑвиÑ', |
| | | timePeriod: 'ÐеÑиод', |
| | | addTimePeriod: 'ÐобавиÑÑ Ð¿ÐµÑиод', |
| | | modify_previous_time: 'СнаÑала измениÑе пÑедÑдÑÑий пеÑиод', |
| | | cannot_be_earlier: 'ÐÐ¾Ð½ÐµÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑанÑÑе наÑала', |
| | | times_cannot_overlap: 'ÐÑÐµÐ¼Ñ Ð½Ðµ должно пеÑеÑекаÑÑÑÑ', |
| | | choose_time_range: 'ÐÑбеÑиÑе диапазон', |
| | | unlimitedMode: 'Ðез огÑаниÑений', |
| | | usualMode: 'ÐбÑÑнÑй Ñежим', |
| | | dailyMode: 'ÐжедневнÑй', |
| | | weeklyRepetitionMode: 'ÐженеделÑнÑй', |
| | | time_range: 'Ðиапазон вÑемени', |
| | | }, |
| | | common: { |
| | | startDate: 'ÐаÑа наÑала', |
| | | endDate: 'ÐаÑа оконÑаниÑ', |
| | | to: 'до', |
| | | cancel: 'ÐÑмена', |
| | | confirm: 'ÐодÑвеÑдиÑÑ', |
| | | close: 'ÐакÑÑÑÑ', |
| | | delete: 'УдалиÑÑ', |
| | | edit: 'ÐзмениÑÑ', |
| | | batchDelete: 'ÐакеÑное Ñдаление', |
| | | startTime: 'ÐÑÐµÐ¼Ñ Ð½Ð°Ñала', |
| | | endTime: 'ÐÑÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½ÑаниÑ', |
| | | monday: 'ÐонеделÑник', |
| | | tuseday: 'ÐÑоÑник', |
| | | wednesday: 'СÑеда', |
| | | thursday: 'ЧеÑвеÑг', |
| | | friday: 'ÐÑÑниÑа', |
| | | saterday: 'СÑббоÑа', |
| | | sunday: 'ÐоÑкÑеÑенÑе', |
| | | placeholder: 'ÐожалÑйÑÑа, введиÑе', |
| | | placeholderSelect: 'ÐожалÑйÑÑа, вÑбеÑиÑе', |
| | | closeTips: 'ÐодÑвеÑдиÑÑ Ð·Ð°ÐºÑÑÑие?', |
| | | deleteTips: 'ÐодÑвеÑдиÑÑ Ñдаление?', |
| | | deleteSuccess: 'Удалено ÑÑпеÑно', |
| | | addSuccess: 'УÑпеÑно добавлено', |
| | | editSuccess: 'УÑпеÑно изменено', |
| | | saveSuccess: 'СоÑ
Ñанено', |
| | | tips: 'ÐодÑказка', |
| | | operation: 'ÐпеÑаÑиÑ', |
| | | query: 'ÐапÑоÑ', |
| | | reset: 'СбÑоÑ', |
| | | noData: 'ÐÐµÑ Ð´Ð°Ð½Ð½ÑÑ
', |
| | | export: 'ÐкÑпоÑÑ', |
| | | success: 'УÑпеÑ
', |
| | | failure: 'ÐеÑдаÑа', |
| | | incorrectFormat: 'ÐевеÑнÑй ÑоÑмаÑ', |
| | | integerFormat: 'Целое ÑиÑло â¥0', |
| | | positiveIntegerFormat: 'Целое ÑиÑло >0', |
| | | noDataSaved: 'ÐÐµÑ Ð´Ð°Ð½Ð½ÑÑ
Ð´Ð»Ñ ÑоÑ
ÑанениÑ', |
| | | chinese: 'ÐиÑайÑкий', |
| | | english: 'ÐнглийÑкий', |
| | | spanish: 'ÐÑпанÑкий', |
| | | french: 'ФÑанÑÑзÑкий', |
| | | german: 'ÐемеÑкий', |
| | | russian: 'Ð ÑÑÑкий', |
| | | arabic: 'ÐÑабÑкий', |
| | | portuguese: 'ÐоÑÑÑгалÑÑкий', |
| | | korean: 'ÐоÑейÑкий', |
| | | detail: 'ÐодÑобноÑÑи', |
| | | clearTips: 'ÐодÑвеÑдиÑÑ Ð¾ÑиÑÑкÑ?', |
| | | clearSuccess: 'УÑпеÑно оÑиÑено', |
| | | }, |
| | | log: { |
| | | accessMethod: 'СпоÑоб доÑÑÑпа', |
| | | passingTime: 'ÐÑÐµÐ¼Ñ Ð¿ÑоÑ
ода', |
| | | accessPass: 'УдоÑÑовеÑение', |
| | | accessResult: 'РезÑлÑÑаÑ', |
| | | accessPhoto: 'ФоÑо', |
| | | viewPhotos: 'ÐÑоÑмоÑÑ ÑоÑо' |
| | | }, |
| | | error: { |
| | | networkError: 'Сбой ÑеÑи, пÑовеÑÑÑе подклÑÑение', |
| | | timeout: 'Тайм-аÑÑ, попÑобÑйÑе Ñнова', |
| | | serverError: 'ÐнÑÑÑеннÑÑ Ð¾Ñибка ÑеÑвеÑа', |
| | | notFound: 'РеÑÑÑÑ Ð½Ðµ найден', |
| | | unauthorized: 'Ðе авÑоÑизован, войдиÑе Ñнова', |
| | | noResponse: 'ÐÐµÑ Ð¾ÑвеÑа ÑеÑвеÑа', |
| | | unknownError: 'ÐÑибка запÑоÑа, код:', |
| | | requestFailed: 'ÐапÑÐ¾Ñ Ð½Ðµ вÑполнен' |
| | | }, |
| | | security: { |
| | | keyId: 'ID клÑÑа', |
| | | keyType: 'Тип клÑÑа', |
| | | keyEncoding: 'ÐодиÑовка клÑÑа', |
| | | keyValue: 'ÐнаÑение клÑÑа', |
| | | startTime: 'ÐÑÐµÐ¼Ñ Ð½Ð°Ñала', |
| | | expirationTime: 'ÐÑÐµÐ¼Ñ Ð¸ÑÑеÑениÑ', |
| | | newKey: 'ÐобавиÑÑ ÐºÐ»ÑÑ', |
| | | clearKey: 'ÐÑиÑÑиÑÑ ÐºÐ»ÑÑ', |
| | | validTime: 'СÑок дейÑÑвиÑ', |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export default { |
| | | // ç»å½é¡µ |
| | | login: { |
| | | lang: 'è¯è¨', |
| | | systemname: '人è¸è®¾å¤åå°ç»å½', |
| | | username: 'ç¨æ·å', |
| | | username_label: '请è¾å
¥ç¨æ·å', |
| | | pwd: 'å¯ç ', |
| | | pwd_label: '请è¾å
¥å¯ç ', |
| | | pwd_info: '请è¾å
¥æ£ç¡®å¯ç æ ¼å¼', |
| | | success_msg: 'ç»å½æå', |
| | | error_name: 'å¯ç é误', |
| | | error_res: 'ä¸ç¬¦åç»å½è¦æ±', |
| | | login: 'ç»å½', |
| | | }, |
| | | // ä¾§è¾¹æ é¨å |
| | | aside: { |
| | | systemname: '人è¸è®¾å¤åå°', |
| | | quit: 'éåº', |
| | | deviceControl: 'è®¾å¤æ§å¶', |
| | | basicSetting: 'åºç¡è®¾ç½®', |
| | | workerSetting: '人å设置', |
| | | deviceMonitoring: '设å¤çæ§', |
| | | recordManagement: 'è®°å½ç®¡ç', |
| | | securityManagement: 'å¯é¥ç®¡ç', |
| | | tips: 'æç¤º', |
| | | tips_msg: 'æ¯å¦éåºç»å½', |
| | | }, |
| | | // è®¾å¤æ§å¶é¡µé¢ |
| | | control: { |
| | | remoteControl: 'è¿ç¨æ§å¶', |
| | | restart: '设å¤éå¯', |
| | | clickToRestart: 'ç¹å»éå¯è®¾å¤', |
| | | restartConfirm: 'ç¡®å®è¦éå¯è®¾å¤åï¼', |
| | | restartSuccess: 'é坿å', |
| | | restartFailed: 'éå¯å¤±è´¥', |
| | | remoteOpen: 'è¿ç¨å¼é¨', |
| | | clickToOpen: 'ç¹å»è¿ç¨å¼é¨', |
| | | openConfirm: 'ç¡®å®è¦è¿ç¨å¼é¨åï¼', |
| | | remoteOpenSuccess: 'è¿ç¨å¼é¨æå', |
| | | remoteOpenFailed: 'è¿ç¨å¼é¨å¤±è´¥', |
| | | reset: '设å¤éç½®', |
| | | clickToReset: 'ç¹å»é置设å¤', |
| | | resetConfirm: 'ç¡®å®è¦é置设å¤åï¼', |
| | | resetWillOut: "éç½®åå°éåºç»å½", |
| | | resetSuccess: '设å¤éç½®æå', |
| | | resetFailed: '设å¤é置失败', |
| | | firmwareUpgrade: '设å¤å级', |
| | | upgradeConfig: 'å级é
ç½®', |
| | | firmwareUrl: 'åºä»¶å°å', |
| | | md5Checksum: 'md5å¼', |
| | | startUpgrade: 'å¼å§å级', |
| | | urlRequired: 'æä»¶å°åå¿
å¡«', |
| | | md5Required: 'md5å¼å¿
å¡«', |
| | | urlInvalid: '请è¾å
¥æ£ç¡®çå°å', |
| | | md5Invalid: '请è¾å
¥æ£ç¡®çmd5', |
| | | upgradeConfirm: 'ç¡®å®å级设å¤åï¼', |
| | | upgradeSuccess: '设å¤å级æå', |
| | | clearFile: "æ¸
餿件", |
| | | uploading: 'ä¸ä¼ å级ä¸...', |
| | | uploadAndUpgrade: 'ä¸ä¼ å¹¶å级', |
| | | restartTips: 'å®å
¨éå¯è®¾å¤ç³»ç»ï¼ä¸ä¼ä¸¢å¤±æ°æ®', |
| | | restarting: 'éå¯ä¸...', |
| | | remoteTips: 'è¿ç¨æ§å¶é¨ç¦è®¾å¤å¼å¯', |
| | | opening: 'å¼é¨ä¸...', |
| | | resetTips: 'æ¢å¤åºåè®¾ç½®ï¼æ¸
é¤æææ°æ®', |
| | | reseting: 'éç½®ä¸...', |
| | | urlUpgrade: 'URLå级æ¹å¼', |
| | | fileUpgrade: 'æä»¶ä¸ä¼ å级', |
| | | uploadFile: 'ç¹å»ä¸ä¼ åºä»¶æä»¶', |
| | | formatFile: 'æ¯æ .zip æ .dpk æ ¼å¼æä»¶ï¼æå¤§ 20MB', |
| | | fileName: 'æä»¶å', |
| | | size: '大å°', |
| | | }, |
| | | // åºç¡è®¾ç½®é¡µé¢ |
| | | config: { |
| | | second: 'ç§', |
| | | millisecond: '毫ç§', |
| | | min: 'åé', |
| | | notsave: 'ä¸ä¿å', |
| | | save: 'ä¿å', |
| | | noVoice: 'æ è¯é³', |
| | | no: 'å¦', |
| | | yes: 'æ¯', |
| | | // åºç¡é
ç½® |
| | | basicConfiguration: 'åºç¡é
ç½®', |
| | | displaySettings: 'æ¾ç¤ºè®¾ç½®', |
| | | informationDisplay: 'ä¿¡æ¯æ¾ç¤º', |
| | | audioSettings: 'é³é¢è®¾ç½®', |
| | | languageAndThemes: 'è¯è¨ä¸ä¸»é¢', |
| | | autoAdjustScreenBrightness: 'èªå¨è°èå±å¹äº®åº¦', |
| | | screenBrightness: 'å±å¹äº®åº¦', |
| | | autoTurnOffScreen: 'èªå¨æ¯å±', |
| | | autoTurnOffScreenTime: 'èªå¨æ¯å±æ¶é´', |
| | | autoScreenSaver: 'èªå¨å±ä¿', |
| | | autoScreenSaverTime: 'èªå¨å±ä¿æ¶é´', |
| | | displayDeviceSn: 'æ¾ç¤ºSN', |
| | | displayIp: 'æ¾ç¤ºIP', |
| | | displayIdentityCard: 'æ¾ç¤ºäºè¯', |
| | | volume: 'é³é', |
| | | language: 'è¯è¨', |
| | | displayCode: "æ¾ç¤ºå°ç¨åºç ", |
| | | themeMode: "å·¥ä½ä¸»é¢", |
| | | cn: '䏿', |
| | | en: 'è±æ', |
| | | es: '西ççè¯', |
| | | fr: 'æ³è¯', |
| | | de: 'å¾·è¯', |
| | | ru: 'ä¿è¯', |
| | | ar: 'é¿æä¼¯è¯', |
| | | pt: 'è¡èçè¯', |
| | | ko: 'é©è¯', |
| | | standardMode: 'æ 忍¡å¼', |
| | | simpleMode: 'ç®çº¦æ¨¡å¼', |
| | | firstLogin: 'ç¬¬ä¸æ¬¡ç»å½åå°', |
| | | backlight: 'å±å¹èå
', |
| | | brightness: 'ç½è²è¡¥å
ç¯', |
| | | nirBrightness: '红å¤è¡¥å
ç¯', |
| | | never: 'æ°¸ä¸', |
| | | min1: '1åé', |
| | | min2: '2åé', |
| | | min3: '3åé', |
| | | min4: '4åé', |
| | | min5: '5åé', |
| | | // ç½ç»é
ç½® |
| | | networkConfiguration: 'ç½ç»é
ç½®', |
| | | otherConfiguration: 'å
¶ä»é
ç½®', |
| | | ipConfiguration: 'IPé
ç½®', |
| | | devicePassword: '设å¤å¯ç ', |
| | | protocolPassword: 'éä¿¡åè®®å¯ç ', |
| | | networkType: 'ç½ç»ç±»å ', |
| | | ethernet: '以太ç½', |
| | | wifiName: 'Wi-Fiå', |
| | | wifiPassword: 'Wi-Fiå¯ç ', |
| | | dhcpModeSelection: 'DHCP模å¼', |
| | | dhcpMode: 'èªå¨è·å', |
| | | customNetworkConfiguration: 'æå¨é
ç½®', |
| | | ipAddress: 'ipå°å', |
| | | gateway: 'ç½å
³', |
| | | subnetMask: 'åç½æ©ç ', |
| | | dnsServer: 'DNSæå¡å¨', |
| | | mac: 'ç½ç»mac', |
| | | // MQTTé
ç½® |
| | | mqttRelatedConfiguration: 'MQTTé
ç½®', |
| | | mqttConnectionInformation: 'MQTTè¿æ¥ä¿¡æ¯', |
| | | sessionConfiguration: 'ä¼è¯é
ç½®', |
| | | serverAddress: 'æå¡å¨å°å', |
| | | clientID: '客æ·ç«¯ID', |
| | | userName: 'ç¨æ·å', |
| | | userPassword: 'ç¨æ·å¯ç ', |
| | | topicPrefix: '主é¢åç¼', |
| | | onlineChecking: 'å¨çº¿éªè¯', |
| | | onlineCheckingTimeout: "å¨çº¿éªè¯è¶
æ¶", |
| | | cleanSession: 'æ¸
é¤ä¼è¯', |
| | | clientIdSuffix: '客æ·ç«¯IDåç¼', |
| | | willTopic: 'éå±ä¸»é¢', |
| | | enterpriseWechat:'ä¼å¾®æ¨¡å¼æ æ', |
| | | // 人è¸é
ç½® |
| | | faceRelatedConfiguration: '人è¸é
ç½®', |
| | | functionalInformation: 'åè½ä¿¡æ¯', |
| | | prompt: 'æç¤ºè¯', |
| | | faceSimilarityThreshold: '人è¸ç¸ä¼¼åº¦éå¼', |
| | | livenessDetectionFunction: 'æ´»ä½æ£æµåè½', |
| | | livenessDetectionThreshold: 'æ´»ä½æ£æµéå¼', |
| | | infraredImageDisplay: "红å¤å¾åæ¾ç¤º", |
| | | maskRecognition: "å£ç½©è¯å«", |
| | | strangerVoice: "éç人è¯é³", |
| | | voiceMode: "è¯é³æ¨¡å¼", |
| | | voiceModeDate: 'èªå®ä¹é®åè¯', |
| | | imageSaveType: "å¾åä¿åç±»å", |
| | | saveStrangerImage: "ä¿åéç人å¾å", |
| | | fullView: "å
¨æ¯", |
| | | face: "人è¸", |
| | | broadcastPleaseRegisterFirst: 'ææ¾è¯·å
注åå·è¸åè¯', |
| | | broadcastHelloStranger: 'ææ¾æªç»è®°äººå', |
| | | broadcastName: 'ææ¾åå', |
| | | broadcastGreeting: 'ææ¾èªå®ä¹é®åè¯', |
| | | greeting: 'é®åè¯ ', |
| | | broadcastWelcome: 'ææ¾æ¬¢è¿å
临', |
| | | recognitionSwitch: '鿣å¼å
³', |
| | | // ç³»ç»é
ç½® |
| | | systemRelatedConfiguration: 'ç³»ç»é
ç½®', |
| | | functionSwitch: 'åè½å¼å
³', |
| | | cardSwipingSwitch: 'å·å¡å¼å
³', |
| | | passwordSwitch: 'å¯ç å¼å
³', |
| | | strangerImage: 'éç人å¾çå¼å
³', |
| | | cloudCertificateSwitch: 'äºè¯å¼å
³', |
| | | physicalCardNumber: 'ç©çå¡å·', |
| | | cloudCertificateAcquisition: 'äºè¯è·å', |
| | | heartbeatConfig: 'å¿è·³è®¾ç½®', |
| | | heartbeatSwitch: 'å¿è·³å¼å
³', |
| | | heartRateInterval: 'å¿è·³é´é', |
| | | heartbeatTopic: 'å¿è·³ä¸»é¢', |
| | | heartbeatContent: 'å¿è·³å
容', |
| | | basicInformation: 'åºç¡ä¿¡æ¯', |
| | | deviceMac: 'macå°å', |
| | | uuid: '设å¤uuid', |
| | | sn: '设å¤snå·', |
| | | model: '设å¤åå·', |
| | | version: "çæ¬å·", |
| | | appVersion: "åºä»¶çæ¬å·", |
| | | releaseTime: "æ´æ°æ¶é´", |
| | | totaldisk: 'è®¾å¤æ»ç©ºé´', |
| | | freedisk: 'å©ä½ç©ºé´', |
| | | // éè¡é
ç½® |
| | | passageConfiguration: 'éè¡é
ç½®', |
| | | functionConfiguration: 'åè½é
ç½®', |
| | | numberOfPassageRecords: 'éè¡è®°å½æå¤§æ°é', |
| | | durationOfRelayOpening: 'ç»§çµå¨æå¼æ¶é¿', |
| | | alarmSwitch: 'æ¥è¦å¼å
³', |
| | | fireAlarmSwitch: 'ç«è¦å¼å
³', |
| | | fireAlarmStatus: 'ç«è¦ç¶æ', |
| | | normal: 'æ£å¸¸', |
| | | warning: 'é¢è¦', |
| | | tamperSwitch: '鲿æ¥è¦å¼å
³', |
| | | uploadToCloudSwitch: '人è¸ä¸æ¥å¼å
³', |
| | | // æ¶éé
ç½® |
| | | clockConfiguration: 'æ¶éé
ç½®', |
| | | timeSynchronizationSwitch: '对æ¶å¼å
³', |
| | | timeSynchronizationServerIP: 'å¯¹æ¶æå¡å¨IP', |
| | | timedSynchronizationTime: '宿¶åæ¥æ¶é´', |
| | | timeZone: 'æ¶åº', |
| | | setDeviceTime: 'è®¾ç½®è®¾å¤æ¶é´', |
| | | restartAfterSetting: 'æä½å设å¤èªå¨éå¯', |
| | | // äºè¯æ¿æ´» |
| | | cloudCertificateActivation: 'äºè¯æ¿æ´»', |
| | | activationKey: 'æ¿æ´»å¯é¥', |
| | | cloudTips1: '请è¾å
¥æ¿æ´»å¯é¥ï¼ç¡®ä¿æ²¡æç©ºæ ¼', |
| | | cloudTips2: 'æ¿æ´»æåå设å¤å°è¿æ¥å°äºè®¤è¯æå¡', |
| | | confirmActivation: 'ç¡®è®¤æ¿æ´»', |
| | | activationInProgress: 'æ¿æ´»ä¸...', |
| | | activationFailed: 'æ¿æ´»å¤±è´¥', |
| | | activationSuccessful: 'æ¿æ´»æå', |
| | | // å¯ç ä¿®æ¹ |
| | | passwordModification: 'å¯ç ä¿®æ¹', |
| | | password: 'å¯ç ', |
| | | oldPassword: 'æ§å¯ç ', |
| | | newPassword: 'æ°å¯ç ', |
| | | confirmPassword: '确认å¯ç ', |
| | | passwordRule: 'å¯ç è§åæ¨è', |
| | | passwordLength: 'é¿åº¦â¥6', |
| | | cannotBeTheSame: 'ä¸è½ææå符ç¸å', |
| | | cannotOrder: 'ä¸è½å
å«è³å°3个è¿ç»æ°åæå°å忝åºåï¼ååºæéåºï¼', |
| | | cannotWeakPassword: 'ä¸è½æ¯å¸¸è§å¼±å¯ç ï¼å
æ¬', |
| | | submit: 'æäº¤', |
| | | saveConfig: 'ä¿å设置', |
| | | // jsä¸msgæç¤ºè¯ |
| | | msg_please_enter: '请è¾å
¥å
容', |
| | | msg_inputPassword: '请è¾å
¥å¯ç ', |
| | | msg_oldPasswordError: 'æ§å¯ç é误', |
| | | msg_password_mismatch: '两次è¾å
¥çå¯ç ä¸ä¸è´', |
| | | msg_password_min_length: 'å¯ç é¿åº¦è³å°ä¸º6ä½', |
| | | msg_is_weak_password: 'æ¤å¯ç 为弱å¯ç ï¼è¯·éæ°è®¾ç½®', |
| | | msg_pswChangeSuccessAndLogin: 'å¯ç ä¿®æ¹æå,è¯·éæ°ç»å½', |
| | | msg_pswChangeSuccess: 'å¯ç ä¿®æ¹æå', |
| | | msg_pswChangeFail: 'å¯ç ä¿®æ¹å¤±è´¥', |
| | | msg_saveSuccess: 'ä¿åæå', |
| | | msg_saveFail: 'ä¿å失败', |
| | | msg_formFilled: 'è¯·æ£æ¥è¡¨å填忝妿£ç¡®', |
| | | msg_number_0_23: 'ä»
æ¯æ0å°23', |
| | | msg_number_0_24: 'ä»
æ¯æ0å°24', |
| | | msg_noChange: '没æéè¦ä¿åçé
ç½®åæ´', |
| | | // èµæºé
ç½® |
| | | resourceConfiguration: 'èµæºé
ç½®', |
| | | backgroundImage: 'èæ¯å¾ç', |
| | | selectImage: 'éæ©å¾ç', |
| | | uploadBackground: 'ä¸ä¼ èæ¯', |
| | | uploading: 'ä¸ä¼ ä¸...', |
| | | backgroundUploadTip: '请ä¸ä¼ åç´ ä¸º{n}çPNGæ ¼å¼ çå¾çï¼å¾çå°è½¬æ¢ä¸º Base64 æ ¼å¼åä¸ä¼ å°è®¾å¤', |
| | | backgroundResolutionMismatch: 'å¾çå辨çé为 {n}', |
| | | backgroundRequired: '请å
éæ©èæ¯å¾ç', |
| | | backgroundImageOnlyPNG: '请ä¸ä¼ PNG æ ¼å¼çå¾ç', |
| | | backgroundSizeLimit: 'å¾ç大å°ä¸è½è¶
è¿ 5MB', |
| | | backgroundParseFailed: 'å¾ç读å失败ï¼è¯·éè¯', |
| | | backgroundImageSelected: 'å¾çéæ©æå', |
| | | backgroundSuccess: 'èæ¯ä¸ä¼ æå', |
| | | backgroundFailed: 'èæ¯ä¸ä¼ 失败', |
| | | // æ«ç 设置 |
| | | scanSettings: 'æ«ç 设置', |
| | | scanSwitch: 'æ«ç å¼å
³', |
| | | scanInterval: 'æ«ç é´é', |
| | | }, |
| | | // 人å设置 |
| | | person: { |
| | | idCard: '身份è¯å·', |
| | | userType: '人åç±»å', |
| | | administrator: '管çå', |
| | | userId: '人åID', |
| | | user: '人å', |
| | | voucher: 'åè¯', |
| | | permission: 'æé', |
| | | addUser: 'æ·»å 人å', |
| | | name: 'å§å', |
| | | editUser: 'ç¼è¾äººå', |
| | | placeholderUserId: '请è¾å
¥äººåID', |
| | | placeholderName: '请è¾å
¥äººåå§å', |
| | | userNotExist: '人åä¸åå¨', |
| | | oneClickClear: 'ä¸é®æ¸
空', |
| | | clearTips: 'æ¤æä½å°æ°¸ä¹
å 餿æäººåãåè¯åæéæ°æ®ï¼æ¯å¦ç»§ç»ï¼', |
| | | clearSuccess: 'æ¸
空æå', |
| | | clearFailed: 'æ¸
空失败', |
| | | }, |
| | | |
| | | voucher: { |
| | | password: 'å¯ç ', |
| | | card: 'å¡ç', |
| | | face: '人è¸', |
| | | finger: 'æçº¹', |
| | | code: 'ç ', |
| | | codeType: 'ç ç±»å', |
| | | passthroughCode: 'éä¼ ç ', |
| | | staticCode: 'éæç ', |
| | | dynamicCode: '卿ç ', |
| | | credentialId: 'åè¯ID', |
| | | credentialValue: 'åè¯å¼', |
| | | placeholderCode: '请è¾å
¥ç åè¯', |
| | | placeholderPwd: '请è¾å
¥å¯ç åè¯', |
| | | placeholderCard: '请è¾å
¥å¡çåè¯', |
| | | validPassword: '请è¾å
¥6使°å', |
| | | validCard: '请è¾å
¥æ°åæåæ¯', |
| | | photoRegistration: 'ç
§ç注å', |
| | | featureValueRegistration: 'ç¹å¾å¼æ³¨å', |
| | | fingerRegistration: 'æçº¹æ³¨å', |
| | | fingerFeatureRegistration: 'ç¹å¾å¼æ³¨å', |
| | | fingerInput: 'è¯·å°æææ¾å¨æçº¹ééå¨ä¸', |
| | | fingerRemainingTime: 'å©ä½æ¶é´', |
| | | fingerInputting: 'å½å
¥ä¸...', |
| | | startFingerInput: 'å¼å§å½å
¥æçº¹', |
| | | fingerInputTips: '请è¾å
¥æçº¹ç¹å¾å¼', |
| | | fingerWaitInput: 'çå¾
å½å
¥', |
| | | fingerInputNow: 'æ£å¨å½å
¥æçº¹...', |
| | | fingerInputSuccess: 'å½å
¥æå', |
| | | fingerInputFailed: 'æçº¹å½å
¥å¯å¨å¤±è´¥', |
| | | fingerReTry: 'æçº¹å½å
¥å¤±è´¥,请éè¯', |
| | | fingerFilled: 'æçº¹å½å
¥æåï¼ç¹å¾å¼å·²èªå¨å¡«å
', |
| | | fingerFailed: 'æçº¹å½å
¥å¤±è´¥', |
| | | fingerTimeout: 'å½å
¥è¶
æ¶', |
| | | fingerInputTimeout: 'æçº¹å½å
¥è¶
æ¶,请éè¯', |
| | | fingerError: 'å½å
¥å¤±è´¥', |
| | | fingerInputError: 'æçº¹å½å
¥å¤±è´¥,请éè¯', |
| | | fingerInputed: 'æçº¹å·²å½å
¥', |
| | | fingerReInput: 'éæ°å½å
¥æçº¹', |
| | | }, |
| | | |
| | | permission: { |
| | | deletePermission: 'å 餿é', |
| | | addPermission: 'æ·»å æé', |
| | | permissionId: 'æéID', |
| | | userId: '人åID', |
| | | timeRange: 'æ¶é´åºé´', |
| | | extra: 'é¢å¤å±æ§', |
| | | effectiveType: 'ææç±»å', |
| | | effectiveTime: 'çææ¶æ®µ', |
| | | effectiveWeek: 'çæå¨æ', |
| | | timePeriod: 'æ¶é´æ®µ', |
| | | addTimePeriod: 'æ·»å æ¶é´æ®µ', |
| | | modify_previous_time: '请å
ä¿®æ¹ä¸ä¸ä¸ªæ·»å çæ¶é´æ®µ', |
| | | cannot_be_earlier: 'ç»ææ¶é´ä¸å¯å°äºå¼å§æ¶é´', |
| | | times_cannot_overlap: 'æéæ¶é´ä¸å¯éå ', |
| | | choose_time_range: 'è¯·éæ©çææ¶é´èå´', |
| | | unlimitedMode: 'æ éå¶', |
| | | usualMode: 'é常模å¼', |
| | | dailyMode: 'æ¯æ¥æ¨¡å¼', |
| | | weeklyRepetitionMode: 'å¨é夿¨¡å¼', |
| | | time_range: 'æ¶æ®µ', |
| | | }, |
| | | |
| | | common: { |
| | | startDate: 'å¼å§æ¥æ', |
| | | endDate: 'ç»ææ¥æ', |
| | | to: 'è³', |
| | | cancel: 'åæ¶', |
| | | confirm: '确认', |
| | | close: 'å
³é', |
| | | delete: 'å é¤', |
| | | edit: 'ç¼è¾', |
| | | batchDelete: 'æ¹éå é¤', |
| | | startTime: 'å¼å§æ¶é´', |
| | | endTime: 'ç»ææ¶é´', |
| | | monday: 'ææä¸', |
| | | tuseday: 'ææäº', |
| | | wednesday: 'ææä¸', |
| | | thursday: 'ææå', |
| | | friday: 'ææäº', |
| | | saterday: 'ææå
', |
| | | sunday: 'æææ¥', |
| | | placeholder: '请è¾å
¥', |
| | | placeholderSelect: 'è¯·éæ©', |
| | | closeTips: '确认å
³éåï¼', |
| | | deleteTips: '确认å é¤åï¼', |
| | | deleteSuccess: 'å 餿å', |
| | | addSuccess: 'æ°å¢æå', |
| | | editSuccess: 'ç¼è¾æå', |
| | | saveSuccess: 'ä¿åæå', |
| | | tips: 'æç¤º', |
| | | operation: 'æä½', |
| | | query: 'æ¥è¯¢', |
| | | reset: 'éç½®', |
| | | noData: 'ææ æ°æ®', |
| | | export: '导åº', |
| | | success: 'æå', |
| | | failure: '失败', |
| | | incorrectFormat: 'æ ¼å¼ä¸æ£ç¡®', |
| | | integerFormat: 'åªè½ä¸ºå¤§äºçäº0çæ´æ°', |
| | | positiveIntegerFormat: 'åªè½ä¸ºå¤§äº0çæ´æ°', |
| | | noDataSaved: 'æ²¡ææ°æ®éè¦ä¿å', |
| | | chinese: '䏿', |
| | | english: 'è±æ', |
| | | spanish: '西ççè¯', |
| | | french: 'æ³è¯', |
| | | german: 'å¾·è¯', |
| | | russian: 'ä¿è¯', |
| | | arabic: 'é¿æä¼¯è¯', |
| | | portuguese: 'è¡èçè¯', |
| | | korean: 'é©è¯', |
| | | detail: '详æ
', |
| | | clearTips: '确认æ¸
空å?', |
| | | clearSuccess: 'æ¸
空æå', |
| | | }, |
| | | |
| | | log: { |
| | | accessMethod: 'éè¡æ¹å¼', |
| | | passingTime: 'éè¡æ¶é´', |
| | | accessPass: 'éè¡åè¯', |
| | | accessResult: 'éè¡ç»æ', |
| | | accessPhoto: 'éè¡ç
§ç', |
| | | viewPhotos: 'æ¥çç
§ç' |
| | | }, |
| | | |
| | | error: { |
| | | networkError: 'ç½ç»è¯·æ±å¤±è´¥ï¼è¯·æ£æ¥ç½ç»è¿æ¥', |
| | | timeout: '请æ±è¶
æ¶ï¼è¯·æ£æ¥ç½ç»è¿æ¥æç¨åéè¯', |
| | | serverError: 'æå¡å¨å
é¨é误ï¼è¯·ç¨åéè¯', |
| | | notFound: '请æ±çèµæºä¸åå¨', |
| | | unauthorized: 'æªææï¼è¯·éæ°ç»å½', |
| | | noResponse: 'æ æ³è¿æ¥å°æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ææå¡å¨ç¶æ', |
| | | unknownError: '请æ±å¤±è´¥ï¼é误代ç :', |
| | | requestFailed: '请æ±å¤±è´¥' |
| | | }, |
| | | // å¯é¥ç®¡ç |
| | | security: { |
| | | keyId: 'å¯é¥ID', |
| | | keyType: 'å¯é¥ç±»å', |
| | | keyEncoding: 'å¯é¥ç¼ç ', |
| | | keyValue: 'å¯é¥å¼', |
| | | startTime: 'å¼å§æ¶é´', |
| | | expirationTime: 'è¿ææ¶é´', |
| | | newKey: 'æ°å¢å¯é¥', |
| | | clearKey: 'æ¸
空å¯é¥', |
| | | validTime: 'æææ¶é´', |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import Vue from 'vue' |
| | | import App from './App.vue' |
| | | import router from './router' |
| | | import http from './utils/request' |
| | | import i18n from './language' |
| | | import ElementUI from 'element-ui'; |
| | | import 'element-ui/lib/theme-chalk/index.css'; |
| | | // å¼å
¥åä½å¾æ |
| | | // fontclass |
| | | import './assets/font/iconfont.css' |
| | | // Symbol |
| | | import './assets/font/iconfont' |
| | | |
| | | import Blob from '@/excel/Blob.js' |
| | | import Export2Excel from '@/excel/Export2Excel.js' |
| | | import modelPermission from '@/directives/model-permission' |
| | | // å¼¹æ¡æé® |
| | | import { |
| | | Message |
| | | } from 'element-ui'; |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { language } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | if (language === 'CN' && document.title !== '人è¸ç³»ç»') { |
| | | document.title = '人è¸ç³»ç»' |
| | | } |
| | | if (language === 'EN' && document.title !== 'Face device system') { |
| | | document.title = 'Face device system' |
| | | } |
| | | Vue.prototype.$Message = Message |
| | | |
| | | Vue.use(ElementUI); |
| | | Vue.config.productionTip = false |
| | | Vue.prototype.$http = http |
| | | Vue.directive('model-permission', modelPermission) |
| | | |
| | | new Vue({ |
| | | Export2Excel, |
| | | Blob, |
| | | i18n, |
| | | router, |
| | | render: h => h(App), |
| | | }).$mount('#app') |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import Vue from 'vue' |
| | | import Router from 'vue-router' |
| | | import login from './views/login/index.vue' |
| | | import home from './views/home/index.vue' |
| | | import config from './views/config/index.vue' |
| | | import control from './views/control/index.vue' |
| | | import person from './views/person/index.vue' |
| | | import monitor from './views/monitor/index.vue' |
| | | import record from './views/record/index.vue' |
| | | import security from './views/security/index.vue' |
| | | Vue.use(Router) |
| | | |
| | | export default new Router({ |
| | | routes: [{ |
| | | path: '/', |
| | | name: 'login', |
| | | redirect: "login" |
| | | }, |
| | | { |
| | | path: '/login', |
| | | name: 'login', |
| | | component: login |
| | | }, |
| | | { |
| | | path: '/home', |
| | | name: 'home', |
| | | component: home, |
| | | redirect: '/config', |
| | | children: [ |
| | | { |
| | | path: '/monitor', |
| | | name: 'monitor', |
| | | component: monitor |
| | | }, { |
| | | path: '/config', |
| | | name: 'config', |
| | | component: config, |
| | | }, { |
| | | path: '/control', |
| | | name: 'control', |
| | | component: control, |
| | | }, { |
| | | path: '/person', |
| | | name: 'person', |
| | | component: person, |
| | | }, { |
| | | path: '/record', |
| | | name: 'record', |
| | | component: record, |
| | | }, { |
| | | path: '/security', |
| | | name: 'security', |
| | | component: security, |
| | | }], |
| | | }, |
| | | ] |
| | | }) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //å
¨å±çevent busï¼ç¨äºåéåæ¥æ¶æ¶æ¯ |
| | | import Vue from 'vue' |
| | | |
| | | const bus = new Vue() |
| | | export default bus |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /*
|
| | | * @Author: your name
|
| | | * @Date: 2020-09-14 15:13:28
|
| | | * @LastEditTime: 2020-09-24 11:39:53
|
| | | * @LastEditors: Please set LastEditors
|
| | | * @Description: In User Settings Edit
|
| | | * @FilePath: \webadmin\src\utils\export.js
|
| | | */
|
| | | import {
|
| | | MessageBox,
|
| | | Message,
|
| | | Notification
|
| | | } from 'element-ui'
|
| | | import axios from 'axios'
|
| | | // 导åº
|
| | | export function outExcel(name, url, data, info) {
|
| | | MessageBox.confirm(name, "æç¤º", {
|
| | | type: "warning"
|
| | | }).then(async () => {
|
| | | Notification.info({
|
| | | title: 'æç¤º',
|
| | | message: 'æ£å¨å¯¼åºï¼è¯·ç¨å <i class="el-icon-loading" style="font-size:20px"></i>',
|
| | | dangerouslyUseHTMLString: true,
|
| | | position: 'bottom-left',
|
| | | duration: 0
|
| | | })
|
| | | const time = data;
|
| | | let formData = new FormData();
|
| | | if (time != null) {
|
| | | for (var p in time) {
|
| | | formData.append(p, time[p]);
|
| | | }
|
| | | }
|
| | | axios({
|
| | | method: "post",
|
| | | url: process.env.VUE_APP_BASE_API + url,
|
| | | data: formData,
|
| | | headers: {
|
| | | Authorization: "token " + JSON.parse(sessionStorage.getItem("UserInfo")).token,
|
| | | "Content-Type": "multipart/form-data"
|
| | | },
|
| | | responseType: "blob"
|
| | | })
|
| | | .then(data => {
|
| | |
|
| | | if (data.data.type === "application/json") {
|
| | | var reader = new FileReader();
|
| | | reader.onloadend = function () {
|
| | | let res = JSON.parse(reader.result);
|
| | | if (res && res.msg) {
|
| | | Message.warning(res.msg + "," + res.data);
|
| | | setTimeout(() => {
|
| | | Notification.closeAll()
|
| | | }, 1000);
|
| | | }
|
| | | };
|
| | | reader.readAsText(data.data);
|
| | | return;
|
| | | }
|
| | |
|
| | | let url = window.URL.createObjectURL(new Blob([data.data]));
|
| | | let link = document.createElement("a");
|
| | | link.style.display = "none";
|
| | | link.href = url;
|
| | | link.setAttribute("download", info);
|
| | | document.body.appendChild(link);
|
| | | link.click();
|
| | | if (info.indexOf('模æ¿') !== -1) {
|
| | | Message.success('模æ¿ä¸è½½æå')
|
| | | setTimeout(() => {
|
| | | Notification.closeAll()
|
| | | }, 1000);
|
| | | } else {
|
| | | Notification.closeAll()
|
| | | Notification.success({
|
| | | title: 'æç¤º',
|
| | | message: 'å¯¼åºæå',
|
| | | position: 'bottom-left',
|
| | | duration: 2000
|
| | | })
|
| | | setTimeout(() => {
|
| | | Notification.closeAll()
|
| | | }, 2000);
|
| | | // Message.success('å¯¼åºæå')
|
| | | }
|
| | | })
|
| | | .catch(() => {
|
| | | if (info.indexOf('模æ¿') !== -1) {
|
| | | Message.error('模æ¿ä¸è½½å¤±è´¥')
|
| | | } else {
|
| | | Message.error('导åºå¤±è´¥')
|
| | | |
| | | }
|
| | | });
|
| | | })
|
| | | .catch(() => {
|
| | | return false;
|
| | | });
|
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | export function parseTime (time) { |
| | | if (time) { |
| | | var date = new Date(time) |
| | | var year = date.getFullYear() |
| | | /* 卿¥ææ ¼å¼ä¸ï¼æä»½æ¯ä»0å¼å§çï¼å æ¤è¦å 0 |
| | | * 使ç¨ä¸å
表达å¼å¨å°äº10çåé¢å 0ï¼ä»¥è¾¾å°æ ¼å¼ç»ä¸ å¦ 09:11:05 |
| | | * */ |
| | | var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 |
| | | var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() |
| | | var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() |
| | | var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() |
| | | var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() |
| | | // æ¼æ¥ |
| | | return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds |
| | | } else { |
| | | return '' |
| | | } |
| | | } |
| | | |
| | | export function removeEmptyValues(obj) { |
| | | const result = {}; |
| | | for (const key in obj) { |
| | | if (obj[key] != null && obj[key] !== '') { |
| | | result[key] = obj[key]; |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | export function resetObjectValues(obj) { |
| | | Object.keys(obj).forEach(key => { |
| | | obj[key] = ''; |
| | | }); |
| | | return obj; |
| | | } |
| | | |
| | | export function generateRandomString(length = 16) { |
| | | const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; |
| | | let result = ''; |
| | | for (let i = 0; i < length; i++) { |
| | | result += chars.charAt(Math.floor(Math.random() * chars.length)); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * èæµå½æ°ä¼åç |
| | | * @param {Function} func éè¦èæµç彿° |
| | | * @param {number} wait èæµæ¶é´é´é(毫ç§) |
| | | * @param {Object} [options={}] é
ç½®é项 |
| | | * @param {boolean} [options.leading=true] æ¯å¦å
è®¸é¦æ¬¡ç«å³æ§è¡ |
| | | * @param {boolean} [options.trailing=true] æ¯å¦å
许æå䏿¬¡å»¶è¿æ§è¡ |
| | | */ |
| | | export function throttle(func, wait, options = {}) { |
| | | let timeout, context, args; |
| | | let previous = 0; |
| | | |
| | | const later = () => { |
| | | previous = options.leading === false ? 0 : Date.now(); |
| | | timeout = null; |
| | | func.apply(context, args); |
| | | if (!timeout) context = args = null; |
| | | }; |
| | | |
| | | const throttled = function() { |
| | | const now = Date.now(); |
| | | if (!previous && options.leading === false) previous = now; |
| | | |
| | | const remaining = wait - (now - previous); |
| | | context = this; |
| | | args = arguments; |
| | | |
| | | if (remaining <= 0 || remaining > wait) { |
| | | if (timeout) { |
| | | clearTimeout(timeout); |
| | | timeout = null; |
| | | } |
| | | previous = now; |
| | | func.apply(context, args); |
| | | if (!timeout) context = args = null; |
| | | } else if (!timeout && options.trailing !== false) { |
| | | timeout = setTimeout(later, remaining); |
| | | } |
| | | }; |
| | | |
| | | return throttled; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æµè§å¨è¯è¨ï¼æ å°å° messages ä¸å¯¹åºçé®ï¼EN, CN, ES, ...ï¼ |
| | | * @returns {string} è¯è¨é®ï¼å¦ 'EN', 'CN' |
| | | */ |
| | | export function getBrowserLocale() { |
| | | const navLang = navigator.language |
| | | console.log('æµè§å¨è¯è¨:', navLang) |
| | | // æåè¯è¨åç¼ï¼åä¸¤ä¸ªåæ¯ï¼ |
| | | let langPrefix = navLang.substring(0, 2).toLowerCase() |
| | | // ç¹æ®å¤çä¸æï¼æ 论 zh-CN / zh-TW / zh-HK 齿 å°ä¸º CN |
| | | if (langPrefix === 'zh') { |
| | | return 'CN' |
| | | } |
| | | // å
¶ä»è¯è¨æ å°ï¼æ¯æææä½ å·²é
ç½®çè¯è¨ï¼ |
| | | const map = { |
| | | en: 'EN', |
| | | es: 'ES', |
| | | fr: 'FR', |
| | | de: 'DE', |
| | | ru: 'RU', |
| | | ar: 'AR', |
| | | pt: 'PT', |
| | | ko: 'KO' |
| | | } |
| | | // 妿åç¼å¨æ å°è¡¨ä¸ï¼è¿å对åºç大åé®ï¼å¦åè¿åé»è®¤è¯è¨ï¼è¿éé»è®¤è±æï¼ |
| | | return map[langPrefix] || 'EN' |
| | | } |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // src/api/request.js |
| | | import axios from 'axios' |
| | | import { Message } from 'element-ui' |
| | | import router from '../router' |
| | | import i18n from '../language/index' |
| | | |
| | | // // æ¬å°è°è¯ |
| | | // const baseURL = '/api' |
| | | |
| | | // ç产æå
|
| | | const baseURL = (() => { |
| | | const { protocol, hostname } = window.location; |
| | | return `${protocol}//${hostname}:8080`; // åºå®åç«¯ç«¯å£ |
| | | })(); |
| | | |
| | | // å建axioså®ä¾ |
| | | const service = axios.create({ |
| | | baseURL, |
| | | timeout: 100000 |
| | | }) |
| | | |
| | | // è¯·æ±æ¦æªå¨ |
| | | service.interceptors.request.use( |
| | | config => { |
| | | // å¯ä»¥å¨è¿éæ·»å tokenç |
| | | let token = sessionStorage.getItem("token") |
| | | if (token) { |
| | | config.headers['Authorization'] = token |
| | | } |
| | | return config |
| | | }, |
| | | error => { |
| | | return Promise.reject(error) |
| | | } |
| | | ) |
| | | |
| | | // ååºæ¦æªå¨ |
| | | service.interceptors.response.use( |
| | | response => { |
| | | const res = response.data |
| | | if (res.code == 401) { |
| | | Message.error(i18n.t('error.unauthorized')) |
| | | // 触åç»åºæä½ |
| | | sessionStorage.removeItem('token') |
| | | router.push('/login') |
| | | } else { |
| | | return res |
| | | } |
| | | }, |
| | | error => { |
| | | console.error('请æ±é误:', error) |
| | | let errorMessage = i18n.t('error.networkError') |
| | | if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) { |
| | | errorMessage = i18n.t('error.timeout') |
| | | // 触åç»åºæä½ |
| | | sessionStorage.removeItem('token') |
| | | router.push('/login') |
| | | } else if (error.response) { |
| | | const status = error.response.status |
| | | switch (status) { |
| | | case 500: |
| | | errorMessage = i18n.t('error.serverError') |
| | | // 触åç»åºæä½ |
| | | sessionStorage.removeItem('token') |
| | | router.push('/login') |
| | | break |
| | | case 404: |
| | | errorMessage = i18n.t('error.notFound') |
| | | break |
| | | case 401: |
| | | errorMessage = i18n.t('error.unauthorized') |
| | | // 触åç»åºæä½ |
| | | sessionStorage.removeItem('token') |
| | | router.push('/login') |
| | | break |
| | | default: |
| | | errorMessage = i18n.t('error.unknownError') + `: ${status}` |
| | | } |
| | | |
| | | if (error.response.data && error.response.data.message) { |
| | | errorMessage = error.response.data.message |
| | | } |
| | | } else if (error.request) { |
| | | errorMessage = i18n.t('error.noResponse') |
| | | } |
| | | Message.error(errorMessage) |
| | | return Promise.reject(error) |
| | | } |
| | | ) |
| | | |
| | | export default service |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | const timezones = { |
| | | "Pacific/Midway": { |
| | | "utc_offset": "-11:00", |
| | | "name": { |
| | | "zh": "è¨æ©äºæ åæ¶é´ï¼ä¸éå²ï¼", |
| | | "en": "Samoa Standard Time (Midway)", |
| | | "ja": "ãµã¢ã¢æ¨æºæï¼ãããã¦ã§ã¤ï¼", |
| | | "ko": "ì¬ëª¨ì íì¤ì (미ëì¨ì´)", |
| | | "es": "Hora Estándar de Samoa (Midway)", |
| | | "fr": "Heure Standard de Samoa (Midway)", |
| | | "de": "Samoa-Standardzeit (Midway)", |
| | | "ru": "СамоанÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐидÑÑй)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØ³Ø§Ù
ÙØ§ (Ù
ÙØ¯ÙاÙ)", |
| | | "pt": "Hora Padrão de Samoa (Midway)" |
| | | } |
| | | }, |
| | | "America/Adak": { |
| | | "utc_offset": "-10:00", |
| | | "name": { |
| | | "zh": "å¤å¨å¤·-é¿çç³æ åæ¶é´ï¼é¿è¾¾å
ï¼", |
| | | "en": "Hawaii-Aleutian Standard Time (Adak)", |
| | | "ja": "ãã¯ã¤ã»ã¢ãªã¥ã¼ã·ã£ã³æ¨æºæï¼ã¢ããã¯ï¼", |
| | | "ko": "íìì´-ìë¥ì¨ íì¤ì (ìë¥)", |
| | | "es": "Hora Estándar de Hawái-Aleutianas (Adak)", |
| | | "fr": "Heure Standard d'Hawaï-Aléoutiennes (Adak)", |
| | | "de": "Hawaii-Aleuten-Standardzeit (Adak)", |
| | | "ru": "ÐавайÑко-ÐлеÑÑÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Ðдак)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙÙØ§ÙاÙ-Ø£ÙÙØ´Ùا٠(أداÙ)", |
| | | "pt": "Hora Padrão do HavaÃ-Aleutas (Adak)" |
| | | } |
| | | }, |
| | | "Pacific/Honolulu": { |
| | | "utc_offset": "-10:00", |
| | | "name": { |
| | | "zh": "å¤å¨å¤·æ åæ¶é´", |
| | | "en": "Hawaii Standard Time", |
| | | "ja": "ãã¯ã¤æ¨æºæ", |
| | | "ko": "íìì´ íì¤ì", |
| | | "es": "Hora Estándar de Hawái", |
| | | "fr": "Heure Standard d'Hawaï", |
| | | "de": "Hawaii-Standardzeit", |
| | | "ru": "ÐавайÑкое ÑÑандаÑÑное вÑемÑ", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙÙØ§ÙاÙ", |
| | | "pt": "Hora Padrão do HavaÃ" |
| | | } |
| | | }, |
| | | "America/Anchorage": { |
| | | "utc_offset": "-09:00", |
| | | "name": { |
| | | "zh": "é¿ææ¯å æ åæ¶é´", |
| | | "en": "Alaska Standard Time", |
| | | "ja": "ã¢ã©ã¹ã«æ¨æºæ", |
| | | "ko": "ìëì¤ì¹´ íì¤ì", |
| | | "es": "Hora Estándar de Alaska", |
| | | "fr": "Heure Standard de l'Alaska", |
| | | "de": "Alaska-Standardzeit", |
| | | "ru": "ÐлÑÑкинÑкое ÑÑандаÑÑное вÑемÑ", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØ£ÙØ§Ø³ÙØ§", |
| | | "pt": "Hora Padrão do Alasca" |
| | | } |
| | | }, |
| | | "America/Los_Angeles": { |
| | | "utc_offset": "-08:00", |
| | | "name": { |
| | | "zh": "å¤ªå¹³æ´æ åæ¶é´ï¼æ´æç¶ï¼", |
| | | "en": "Pacific Standard Time (Los Angeles)", |
| | | "ja": "å¤ªå¹³æ´æ¨æºæï¼ããµã³ã¼ã«ã¹ï¼", |
| | | "ko": "ííì íì¤ì (ë¡ì¤ì¤ì ¤ë ì¤)", |
| | | "es": "Hora Estándar del PacÃfico (Los Ãngeles)", |
| | | "fr": "Heure Standard du Pacifique (Los Angeles)", |
| | | "de": "Pazifische Standardzeit (Los Angeles)", |
| | | "ru": "ТиÑ
оокеанÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐоÑ-ÐнджелеÑ)", |
| | | "ar": "تÙÙÙØª اÙÙ
ØÙØ· اÙÙØ§Ø¯Ø¦ (ÙÙØ³ Ø£ÙØ¬ÙÙØ³)", |
| | | "pt": "Hora Padrão do PacÃfico (Los Angeles)" |
| | | } |
| | | }, |
| | | "America/Denver": { |
| | | "utc_offset": "-07:00", |
| | | "name": { |
| | | "zh": "山尿 åæ¶é´ï¼ä¸¹ä½ï¼", |
| | | "en": "Mountain Standard Time (Denver)", |
| | | "ja": "山岳鍿¨æºæï¼ãã³ãã¼ï¼", |
| | | "ko": "ì°ì
íì¤ì (ë´ë²)", |
| | | "es": "Hora Estándar de la Montaña (Denver)", |
| | | "fr": "Heure Standard des Rocheuses (Denver)", |
| | | "de": "Rocky-Mountain-Standardzeit (Denver)", |
| | | "ru": "ÐоÑное ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐенвеÑ)", |
| | | "ar": "Ø§ÙØªÙÙÙØª Ø§ÙØ¬Ø¨ÙÙ (دÙÙØ±)", |
| | | "pt": "Hora Padrão das Montanhas (Denver)" |
| | | } |
| | | }, |
| | | "America/Chicago": { |
| | | "utc_offset": "-06:00", |
| | | "name": { |
| | | "zh": "ä¸é¨æ åæ¶é´ï¼èå å¥ï¼", |
| | | "en": "Central Standard Time (Chicago)", |
| | | "ja": "ä¸é¨æ¨æºæï¼ã·ã«ã´ï¼", |
| | | "ko": "ì¤ë¶ íì¤ì (ìì¹´ê³ )", |
| | | "es": "Hora Estándar Central (Chicago)", |
| | | "fr": "Heure Standard du Centre (Chicago)", |
| | | "de": "Central-Standardzeit (Chicago)", |
| | | "ru": "ЦенÑÑалÑное ÑÑандаÑÑное вÑÐµÐ¼Ñ (Чикаго)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙ
Ø±ÙØ²Ù (Ø´ÙÙØ§ØºÙ)", |
| | | "pt": "Hora Padrão Central (Chicago)" |
| | | } |
| | | }, |
| | | "America/New_York": { |
| | | "utc_offset": "-05:00", |
| | | "name": { |
| | | "zh": "ä¸é¨æ åæ¶é´ï¼çº½çº¦ï¼", |
| | | "en": "Eastern Standard Time (New York)", |
| | | "ja": "æ±é¨æ¨æºæï¼ãã¥ã¼ã¨ã¼ã¯ï¼", |
| | | "ko": "ëë¶ íì¤ì (ë´ì)", |
| | | "es": "Hora Estándar del Este (Nueva York)", |
| | | "fr": "Heure Standard de l'Est (New York)", |
| | | "de": "Ãstliche Standardzeit (New York)", |
| | | "ru": "ÐоÑÑоÑное ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐÑÑ-ÐоÑк)", |
| | | "ar": "Ø§ÙØªÙÙÙØª Ø§ÙØ´Ø±ÙÙ (ÙÙÙÙÙØ±Ù)", |
| | | "pt": "Hora Padrão do Leste (Nova York)" |
| | | } |
| | | }, |
| | | "America/Toronto": { |
| | | "utc_offset": "-05:00", |
| | | "name": { |
| | | "zh": "ä¸é¨æ åæ¶é´ï¼å¤ä¼¦å¤ï¼", |
| | | "en": "Eastern Standard Time (Toronto)", |
| | | "ja": "æ±é¨æ¨æºæï¼ããã³ãï¼", |
| | | "ko": "ëë¶ íì¤ì (í ë¡ í )", |
| | | "es": "Hora Estándar del Este (Toronto)", |
| | | "fr": "Heure Standard de l'Est (Toronto)", |
| | | "de": "Ãstliche Standardzeit (Toronto)", |
| | | "ru": "ÐоÑÑоÑное ÑÑандаÑÑное вÑÐµÐ¼Ñ (ТоÑонÑо)", |
| | | "ar": "Ø§ÙØªÙÙÙØª Ø§ÙØ´Ø±ÙÙ (ØªÙØ±ÙÙØªÙ)", |
| | | "pt": "Hora Padrão do Leste (Toronto)" |
| | | } |
| | | }, |
| | | "America/Mexico_City": { |
| | | "utc_offset": "-06:00", |
| | | "name": { |
| | | "zh": "墨西å¥ä¸é¨æ¶é´ï¼å¢¨è¥¿å¥åï¼", |
| | | "en": "Central Time (Mexico City)", |
| | | "ja": "ä¸é¨æéï¼ã¡ãã·ã³ã·ãã£ï¼", |
| | | "ko": "ì¤ë¶ ìê° (ë©ìì½ìí°)", |
| | | "es": "Hora Central (Ciudad de México)", |
| | | "fr": "Heure du Centre (Mexico)", |
| | | "de": "Zentralzeit (Mexiko-Stadt)", |
| | | "ru": "ЦенÑÑалÑное вÑÐµÐ¼Ñ (ÐеÑ
ико)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙ
Ø±ÙØ²Ù (Ù
ÙØ³ÙÙÙ Ø³ÙØªÙ)", |
| | | "pt": "Hora Central (Cidade do México)" |
| | | } |
| | | }, |
| | | "America/Bogota": { |
| | | "utc_offset": "-05:00", |
| | | "name": { |
| | | "zh": "å¥ä¼¦æ¯äºæ¶é´ï¼æ³¢å¥å¤§ï¼", |
| | | "en": "Colombia Time (Bogotá)", |
| | | "ja": "ã³ãã³ãã¢æéï¼ãã´ã¿ï¼", |
| | | "ko": "ì½ë¡¬ë¹ì ìê° (ë³´ê³ í)", |
| | | "es": "Hora de Colombia (Bogotá)", |
| | | "fr": "Heure de Colombie (Bogotá)", |
| | | "de": "Kolumbianische Zeit (Bogotá)", |
| | | "ru": "ÐолÑмбийÑкое вÑÐµÐ¼Ñ (ÐогоÑа)", |
| | | "ar": "تÙÙÙØª ÙÙÙÙÙ
Ø¨ÙØ§ (Ø¨ÙØºÙتا)", |
| | | "pt": "Hora da Colômbia (Bogotá)" |
| | | } |
| | | }, |
| | | "America/Lima": { |
| | | "utc_offset": "-05:00", |
| | | "name": { |
| | | "zh": "ç§é²æ¶é´ï¼å©é©¬ï¼", |
| | | "en": "Peru Time (Lima)", |
| | | "ja": "ãã«ã¼æéï¼ãªãï¼", |
| | | "ko": "í루 ìê° (리ë§)", |
| | | "es": "Hora de Perú (Lima)", |
| | | "fr": "Heure du Pérou (Lima)", |
| | | "de": "Peruanische Zeit (Lima)", |
| | | "ru": "ÐеÑÑанÑкое вÑÐµÐ¼Ñ (Ðима)", |
| | | "ar": "تÙÙÙØª Ø¨ÙØ±Ù (ÙÙÙ
ا)", |
| | | "pt": "Hora do Peru (Lima)" |
| | | } |
| | | }, |
| | | "America/Santiago": { |
| | | "utc_offset": "-04:00", |
| | | "name": { |
| | | "zh": "æºå©æ¶é´ï¼å£å°äºå¥ï¼", |
| | | "en": "Chile Time (Santiago)", |
| | | "ja": "ããªæéï¼ãµã³ãã£ã¢ã´ï¼", |
| | | "ko": "ì¹ ë ìê° (ì°í°ìê³ )", |
| | | "es": "Hora de Chile (Santiago)", |
| | | "fr": "Heure du Chili (Santiago)", |
| | | "de": "Chilenische Zeit (Santiago)", |
| | | "ru": "ЧилийÑкое вÑÐµÐ¼Ñ (СанÑÑÑго)", |
| | | "ar": "تÙÙÙØª تشÙÙÙ (Ø³Ø§ÙØªÙاغÙ)", |
| | | "pt": "Hora do Chile (Santiago)" |
| | | } |
| | | }, |
| | | "America/Argentina/Buenos_Aires": { |
| | | "utc_offset": "-03:00", |
| | | "name": { |
| | | "zh": "é¿æ ¹å»·æ¶é´ï¼å¸å®è¯ºæ¯è¾å©æ¯ï¼", |
| | | "en": "Argentina Time (Buenos Aires)", |
| | | "ja": "ã¢ã«ã¼ã³ãã³æéï¼ãã¨ãã¹ã¢ã¤ã¬ã¹ï¼", |
| | | "ko": "ì르í¨í°ë ìê° (ë¶ìë
¸ì¤ìì´ë ì¤)", |
| | | "es": "Hora de Argentina (Buenos Aires)", |
| | | "fr": "Heure d'Argentine (Buenos Aires)", |
| | | "de": "Argentinische Zeit (Buenos Aires)", |
| | | "ru": "ÐÑгенÑинÑкое вÑÐµÐ¼Ñ (ÐÑÑноÑ-ÐйÑеÑ)", |
| | | "ar": "تÙÙÙØª Ø§ÙØ£Ø±Ø¬ÙتÙÙ (بÙÙÙØ³ Ø¢ÙØ±Ø³)", |
| | | "pt": "Hora da Argentina (Buenos Aires)" |
| | | } |
| | | }, |
| | | "America/Sao_Paulo": { |
| | | "utc_offset": "-03:00", |
| | | "name": { |
| | | "zh": "巴西æ¶é´ï¼å£ä¿ç½ï¼", |
| | | "en": "Brazil Time (São Paulo)", |
| | | "ja": "ãã©ã¸ã«æéï¼ãµã³ãã¦ãï¼", |
| | | "ko": "ë¸ë¼ì§ ìê° (ìíì¸ë£¨)", |
| | | "es": "Hora de Brasil (São Paulo)", |
| | | "fr": "Heure du Brésil (São Paulo)", |
| | | "de": "Brasilianische Zeit (São Paulo)", |
| | | "ru": "ÐÑазилÑÑкое вÑÐµÐ¼Ñ (Сан-ÐаÑлÑ)", |
| | | "ar": "تÙÙÙØª Ø§ÙØ¨Ø±Ø§Ø²ÙÙ (سا٠باÙÙÙ)", |
| | | "pt": "Hora do Brasil (São Paulo)" |
| | | } |
| | | }, |
| | | "Atlantic/Azores": { |
| | | "utc_offset": "-01:00", |
| | | "name": { |
| | | "zh": "äºéå°ç¾¤å²æ¶é´", |
| | | "en": "Azores Time", |
| | | "ja": "ã¢ã¾ã¬ã¹æé", |
| | | "ko": "ìì¡°ë ì¤ ìê°", |
| | | "es": "Hora de las Azores", |
| | | "fr": "Heure des Açores", |
| | | "de": "Azoren-Zeit", |
| | | "ru": "ÐзоÑÑкое вÑемÑ", |
| | | "ar": "تÙÙÙØª Ø§ÙØ£Ø²Ùر", |
| | | "pt": "Hora dos Açores" |
| | | } |
| | | }, |
| | | "Europe/London": { |
| | | "utc_offset": "+00:00", |
| | | "name": { |
| | | "zh": "æ ¼æå°¼æ²»æ åæ¶é´ï¼ä¼¦æ¦ï¼", |
| | | "en": "Greenwich Mean Time (London)", |
| | | "ja": "ã°ãªããã¸æ¨æºæï¼ãã³ãã³ï¼", |
| | | "ko": "그리ëì¹ íì¤ì (ë°ë)", |
| | | "es": "Hora del Meridiano de Greenwich (Londres)", |
| | | "fr": "Heure de Greenwich (Londres)", |
| | | "de": "Mittlere Greenwich-Zeit (London)", |
| | | "ru": "СÑеднее вÑÐµÐ¼Ñ Ð¿Ð¾ ÐÑинвиÑÑ (Ðондон)", |
| | | "ar": "تÙÙÙØª غرÙÙØªØ´ (ÙÙØ¯Ù)", |
| | | "pt": "Hora Média de Greenwich (Londres)" |
| | | } |
| | | }, |
| | | "Europe/Lisbon": { |
| | | "utc_offset": "+00:00", |
| | | "name": { |
| | | "zh": "è¡èçæ¶é´ï¼éæ¯æ¬ï¼", |
| | | "en": "Portugal Time (Lisbon)", |
| | | "ja": "ãã«ãã¬ã«æéï¼ãªã¹ãã³ï¼", |
| | | "ko": "í¬ë¥´í¬ê° ìê° (리ì¤ë³¸)", |
| | | "es": "Hora de Portugal (Lisboa)", |
| | | "fr": "Heure du Portugal (Lisbonne)", |
| | | "de": "Portugiesische Zeit (Lissabon)", |
| | | "ru": "ÐоÑÑÑгалÑÑкое вÑÐµÐ¼Ñ (ÐиÑÑабон)", |
| | | "ar": "تÙÙÙØª Ø§ÙØ¨Ø±ØªØºØ§Ù (ÙØ´Ø¨ÙÙØ©)", |
| | | "pt": "Hora de Portugal (Lisboa)" |
| | | } |
| | | }, |
| | | "Europe/Berlin": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼ææï¼", |
| | | "en": "Central European Time (Berlin)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ãã«ãªã³ï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (ë² ë¥¼ë¦°)", |
| | | "es": "Hora Central Europea (BerlÃn)", |
| | | "fr": "Heure d'Europe Centrale (Berlin)", |
| | | "de": "Mitteleuropäische Zeit (Berlin)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (ÐеÑлин)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (برÙÙÙ)", |
| | | "pt": "Hora da Europa Central (Berlim)" |
| | | } |
| | | }, |
| | | "Europe/Paris": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼å·´é»ï¼", |
| | | "en": "Central European Time (Paris)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ããªï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (í리)", |
| | | "es": "Hora Central Europea (ParÃs)", |
| | | "fr": "Heure d'Europe Centrale (Paris)", |
| | | "de": "Mitteleuropäische Zeit (Paris)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (ÐаÑиж)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (Ø¨Ø§Ø±ÙØ³)", |
| | | "pt": "Hora da Europa Central (Paris)" |
| | | } |
| | | }, |
| | | "Europe/Madrid": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼é©¬å¾·éï¼", |
| | | "en": "Central European Time (Madrid)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ãããªã¼ãï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (ë§ë리ë)", |
| | | "es": "Hora Central Europea (Madrid)", |
| | | "fr": "Heure d'Europe Centrale (Madrid)", |
| | | "de": "Mitteleuropäische Zeit (Madrid)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (ÐадÑид)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (Ù
Ø¯Ø±ÙØ¯)", |
| | | "pt": "Hora da Europa Central (Madri)" |
| | | } |
| | | }, |
| | | "Europe/Rome": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼ç½é©¬ï¼", |
| | | "en": "Central European Time (Rome)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ãã¼ãï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (ë¡ë§)", |
| | | "es": "Hora Central Europea (Roma)", |
| | | "fr": "Heure d'Europe Centrale (Rome)", |
| | | "de": "Mitteleuropäische Zeit (Rom)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (Рим)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (رÙÙ
ا)", |
| | | "pt": "Hora da Europa Central (Roma)" |
| | | } |
| | | }, |
| | | "Europe/Amsterdam": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼é¿å§æ¯ç¹ä¸¹ï¼", |
| | | "en": "Central European Time (Amsterdam)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ã¢ã ã¹ãã«ãã ï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (ìì¤í
르ë´)", |
| | | "es": "Hora Central Europea (Ãmsterdam)", |
| | | "fr": "Heure d'Europe Centrale (Amsterdam)", |
| | | "de": "Mitteleuropäische Zeit (Amsterdam)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (ÐмÑÑеÑдам)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (Ø£Ù
سترداÙ
)", |
| | | "pt": "Hora da Europa Central (Amsterdã)" |
| | | } |
| | | }, |
| | | "Europe/Stockholm": { |
| | | "utc_offset": "+01:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼æ¯å¾·å¥å°æ©ï¼", |
| | | "en": "Central European Time (Stockholm)", |
| | | "ja": "ä¸å¤®ã¨ã¼ãããæéï¼ã¹ããã¯ãã«ã ï¼", |
| | | "ko": "ì¤ìì ë½ ìê° (ì¤í¡íë¦)", |
| | | "es": "Hora Central Europea (Estocolmo)", |
| | | "fr": "Heure d'Europe Centrale (Stockholm)", |
| | | "de": "Mitteleuropäische Zeit (Stockholm)", |
| | | "ru": "ЦенÑÑалÑноевÑопейÑкое вÑÐµÐ¼Ñ (СÑокголÑм)", |
| | | "ar": "تÙÙÙØª ÙØ³Ø· Ø£ÙØ±Ùبا (ستÙÙÙÙÙÙ
)", |
| | | "pt": "Hora da Europa Central (Estocolmo)" |
| | | } |
| | | }, |
| | | "Europe/Athens": { |
| | | "utc_offset": "+02:00", |
| | | "name": { |
| | | "zh": "䏿¬§æ¶é´ï¼é
å
¸ï¼", |
| | | "en": "Eastern European Time (Athens)", |
| | | "ja": "æ±ã¨ã¼ãããæéï¼ã¢ããï¼", |
| | | "ko": "ëì ë½ ìê° (ìí
ë¤)", |
| | | "es": "Hora de Europa Oriental (Atenas)", |
| | | "fr": "Heure d'Europe de l'Est (Athènes)", |
| | | "de": "Osteuropäische Zeit (Athen)", |
| | | "ru": "ÐоÑÑоÑноевÑопейÑкое вÑÐµÐ¼Ñ (ÐÑинÑ)", |
| | | "ar": "تÙÙÙØª Ø´Ø±Ù Ø£ÙØ±Ùبا (أثÙÙØ§)", |
| | | "pt": "Hora da Europa Oriental (Atenas)" |
| | | } |
| | | }, |
| | | "Europe/Istanbul": { |
| | | "utc_offset": "+03:00", |
| | | "name": { |
| | | "zh": "åè³å
¶æ¶é´ï¼ä¼æ¯å¦å¸å°ï¼", |
| | | "en": "Turkey Time (Istanbul)", |
| | | "ja": "ãã«ã³æéï¼ã¤ã¹ã¿ã³ãã¼ã«ï¼", |
| | | "ko": "í°í¤ ìê° (ì´ì¤íë¶)", |
| | | "es": "Hora de TurquÃa (Estambul)", |
| | | "fr": "Heure de Turquie (Istanbul)", |
| | | "de": "Türkische Zeit (Istanbul)", |
| | | "ru": "ТÑÑеÑкое вÑÐµÐ¼Ñ (СÑамбÑл)", |
| | | "ar": "تÙÙÙØª ترÙÙØ§ (Ø¥Ø³Ø·ÙØ¨ÙÙ)", |
| | | "pt": "Hora da Turquia (Istambul)" |
| | | } |
| | | }, |
| | | "Asia/Dubai": { |
| | | "utc_offset": "+04:00", |
| | | "name": { |
| | | "zh": "æµ·æ¹¾æ åæ¶é´ï¼è¿ªæï¼", |
| | | "en": "Gulf Standard Time (Dubai)", |
| | | "ja": "æ¹¾å²¸æ¨æºæï¼ããã¤ï¼", |
| | | "ko": "걸í íì¤ì (ëë°ì´)", |
| | | "es": "Hora Estándar del Golfo (Dubái)", |
| | | "fr": "Heure Standard du Golfe (Dubaï)", |
| | | "de": "Golf-Standardzeit (Dubai)", |
| | | "ru": "СÑандаÑÑное вÑÐµÐ¼Ñ ÐеÑÑидÑкого залива (ÐÑбай)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù Ø§ÙØ®ÙÙØ¬Ù (دبÙ)", |
| | | "pt": "Hora Padrão do Golfo (Dubai)" |
| | | } |
| | | }, |
| | | "Asia/Karachi": { |
| | | "utc_offset": "+05:00", |
| | | "name": { |
| | | "zh": "å·´åºæ¯å¦æ åæ¶é´ï¼å¡æå¥ï¼", |
| | | "en": "Pakistan Standard Time (Karachi)", |
| | | "ja": "ããã¹ã¿ã³æ¨æºæï¼ã«ã©ãï¼", |
| | | "ko": "íí¤ì¤í íì¤ì (ì¹´ë¼ì¹)", |
| | | "es": "Hora Estándar de Pakistán (Karachi)", |
| | | "fr": "Heure Standard du Pakistan (Karachi)", |
| | | "de": "Pakistanische Standardzeit (Karatschi)", |
| | | "ru": "ÐакиÑÑанÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐаÑаÑи)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù Ø§ÙØ¨Ø§ÙستاÙÙ (ÙØ±Ø§ØªØ´Ù)", |
| | | "pt": "Hora Padrão do Paquistão (Carachi)" |
| | | } |
| | | }, |
| | | "Asia/Kolkata": { |
| | | "utc_offset": "+05:30", |
| | | "name": { |
| | | "zh": "å°åº¦æ åæ¶é´ï¼å å°åçï¼", |
| | | "en": "India Standard Time (Kolkata)", |
| | | "ja": "ã¤ã³ãæ¨æºæï¼ã³ã«ã«ã¿ï¼", |
| | | "ko": "ì¸ë íì¤ì (ì½ì¹´í)", |
| | | "es": "Hora Estándar de India (Calcuta)", |
| | | "fr": "Heure Standard de l'Inde (Calcutta)", |
| | | "de": "Indische Standardzeit (Kalkutta)", |
| | | "ru": "ÐндийÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐалÑкÑÑÑа)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù اÙÙÙØ¯Ù (ÙÙÙÙØ§ØªØ§)", |
| | | "pt": "Hora Padrão da Ãndia (Calcutá)" |
| | | } |
| | | }, |
| | | "Asia/Dhaka": { |
| | | "utc_offset": "+06:00", |
| | | "name": { |
| | | "zh": "åå ææ åæ¶é´ï¼è¾¾å¡ï¼", |
| | | "en": "Bangladesh Standard Time (Dhaka)", |
| | | "ja": "ãã³ã°ã©ãã·ã¥æ¨æºæï¼ããã«ï¼", |
| | | "ko": "ë°©ê¸ë¼ë°ì íì¤ì (ë¤ì¹´)", |
| | | "es": "Hora Estándar de Bangladés (Daca)", |
| | | "fr": "Heure Standard du Bangladesh (Dacca)", |
| | | "de": "Bangladeschische Standardzeit (Dhaka)", |
| | | "ru": "ÐангладеÑÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Ðакка)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØ¨ÙØºÙØ§Ø¯ÙØ´ (Ø¯ÙØ§)", |
| | | "pt": "Hora Padrão de Bangladesh (Daca)" |
| | | } |
| | | }, |
| | | "Asia/Bangkok": { |
| | | "utc_offset": "+07:00", |
| | | "name": { |
| | | "zh": "ä¸åå岿¶é´ï¼æ¼è°·ï¼", |
| | | "en": "Indochina Time (Bangkok)", |
| | | "ja": "ã¤ã³ãã·ãæéï¼ãã³ã³ã¯ï¼", |
| | | "ko": "ì¸ëì°¨ì´ë ìê° (ë°©ì½)", |
| | | "es": "Hora de Indochina (Bangkok)", |
| | | "fr": "Heure d'Indochine (Bangkok)", |
| | | "de": "Indochina-Zeit (Bangkok)", |
| | | "ru": "ÐндокиÑайÑкое вÑÐµÐ¼Ñ (Ðангкок)", |
| | | "ar": "تÙÙÙØª اÙÙÙØ¯ Ø§ÙØµÙÙÙØ© (باÙÙÙÙ)", |
| | | "pt": "Hora da Indochina (Bangcoc)" |
| | | } |
| | | }, |
| | | "Asia/Jakarta": { |
| | | "utc_offset": "+07:00", |
| | | "name": { |
| | | "zh": "å°åº¦å°¼è¥¿äºè¥¿é¨æ¶é´ï¼é
å è¾¾ï¼", |
| | | "en": "Western Indonesia Time (Jakarta)", |
| | | "ja": "西ã¤ã³ããã·ã¢æéï¼ã¸ã£ã«ã«ã¿ï¼", |
| | | "ko": "ìì¸ëë¤ìì ìê° (ì카르í)", |
| | | "es": "Hora de Indonesia Occidental (Yakarta)", |
| | | "fr": "Heure de l'Indonésie Occidentale (Jakarta)", |
| | | "de": "Westindonesische Zeit (Jakarta)", |
| | | "ru": "ÐападноиндонезийÑкое вÑÐµÐ¼Ñ (ÐжакаÑÑа)", |
| | | "ar": "تÙÙÙØª غرب Ø¥ÙØ¯ÙÙÙØ³Ùا (Ø¬Ø§ÙØ±ØªØ§)", |
| | | "pt": "Hora da Indonésia Ocidental (Jacarta)" |
| | | } |
| | | }, |
| | | "Asia/Shanghai": { |
| | | "utc_offset": "+08:00", |
| | | "name": { |
| | | "zh": "ä¸å½æ åæ¶é´ï¼å京ï¼", |
| | | "en": "China Standard Time (Beijing)", |
| | | "ja": "ä¸å½æ¨æºæï¼å京ï¼", |
| | | "ko": "ì¤êµ íì¤ì (ë² ì´ì§)", |
| | | "es": "Hora Estándar de China (PekÃn)", |
| | | "fr": "Heure Standard de Chine (Pékin)", |
| | | "de": "Chinesische Standardzeit (Peking)", |
| | | "ru": "ÐиÑайÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Ðекин)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù Ø§ÙØµÙÙÙ (بÙÙÙ)", |
| | | "pt": "Hora Padrão da China (Pequim)" |
| | | } |
| | | }, |
| | | "Asia/Taipei": { |
| | | "utc_offset": "+08:00", |
| | | "name": { |
| | | "zh": "å°æ¹¾æ åæ¶é´ï¼å°åï¼", |
| | | "en": "Taiwan Standard Time (Taipei)", |
| | | "ja": "å°æ¹¾æ¨æºæï¼å°åï¼", |
| | | "ko": "ëë§ íì¤ì (íì´ë² ì´)", |
| | | "es": "Hora Estándar de Taiwán (Taipéi)", |
| | | "fr": "Heure Standard de Taïwan (Taipei)", |
| | | "de": "Taiwanesische Standardzeit (Taipeh)", |
| | | "ru": "ТайванÑÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ТайбÑй)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØªØ§ÙÙØ§Ù (ØªØ§ÙØ¨ÙÙ)", |
| | | "pt": "Hora Padrão de Taiwan (Taipei)" |
| | | } |
| | | }, |
| | | "Asia/Hong_Kong": { |
| | | "utc_offset": "+08:00", |
| | | "name": { |
| | | "zh": "馿¸¯æ¶é´", |
| | | "en": "Hong Kong Time", |
| | | "ja": "馿¸¯æé", |
| | | "ko": "í콩 ìê°", |
| | | "es": "Hora de Hong Kong", |
| | | "fr": "Heure de Hong Kong", |
| | | "de": "Hongkong-Zeit", |
| | | "ru": "ÐонконгÑкое вÑемÑ", |
| | | "ar": "تÙÙÙØª ÙÙÙØº ÙÙÙØº", |
| | | "pt": "Hora de Hong Kong" |
| | | } |
| | | }, |
| | | "Asia/Singapore": { |
| | | "utc_offset": "+08:00", |
| | | "name": { |
| | | "zh": "æ°å 塿 åæ¶é´", |
| | | "en": "Singapore Standard Time", |
| | | "ja": "ã·ã³ã¬ãã¼ã«æ¨æºæ", |
| | | "ko": "ì±ê°í¬ë¥´ íì¤ì", |
| | | "es": "Hora Estándar de Singapur", |
| | | "fr": "Heure Standard de Singapour", |
| | | "de": "Singapur-Standardzeit", |
| | | "ru": "СингапÑÑÑкое ÑÑандаÑÑное вÑемÑ", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØ³ÙغاÙÙØ±Ø©", |
| | | "pt": "Hora Padrão de Cingapura" |
| | | } |
| | | }, |
| | | "Asia/Seoul": { |
| | | "utc_offset": "+09:00", |
| | | "name": { |
| | | "zh": "é©å½æ åæ¶é´ï¼é¦å°ï¼", |
| | | "en": "Korea Standard Time (Seoul)", |
| | | "ja": "é彿¨æºæï¼ã½ã¦ã«ï¼", |
| | | "ko": "íêµ íì¤ì (ìì¸)", |
| | | "es": "Hora Estándar de Corea (Seúl)", |
| | | "fr": "Heure Standard de Corée (Séoul)", |
| | | "de": "Koreanische Standardzeit (Seoul)", |
| | | "ru": "ÐоÑейÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (СеÑл)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù اÙÙÙØ±Ù (سÙÙÙ)", |
| | | "pt": "Hora Padrão da Coreia (Seul)" |
| | | } |
| | | }, |
| | | "Asia/Tokyo": { |
| | | "utc_offset": "+09:00", |
| | | "name": { |
| | | "zh": "æ¥æ¬æ åæ¶é´ï¼ä¸äº¬ï¼", |
| | | "en": "Japan Standard Time (Tokyo)", |
| | | "ja": "æ¥æ¬æ¨æºæï¼æ±äº¬ï¼", |
| | | "ko": "ì¼ë³¸ íì¤ì (ëì¿)", |
| | | "es": "Hora Estándar de Japón (Tokio)", |
| | | "fr": "Heure Standard du Japon (Tokyo)", |
| | | "de": "Japanische Standardzeit (Tokio)", |
| | | "ru": "ЯпонÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Токио)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù اÙÙØ§Ø¨Ø§ÙÙ (Ø·ÙÙÙÙ)", |
| | | "pt": "Hora Padrão do Japão (Tóquio)" |
| | | } |
| | | }, |
| | | "Australia/Perth": { |
| | | "utc_offset": "+08:00", |
| | | "name": { |
| | | "zh": "澳大å©äºè¥¿é¨æ¶é´ï¼çæ¯ï¼", |
| | | "en": "Australian Western Standard Time (Perth)", |
| | | "ja": "ãªã¼ã¹ãã©ãªã¢è¥¿é¨æ¨æºæï¼ãã¼ã¹ï¼", |
| | | "ko": "í¸ì£¼ ìë¶ íì¤ì (í¼ì¤)", |
| | | "es": "Hora Estándar Occidental de Australia (Perth)", |
| | | "fr": "Heure Standard de l'Ouest Australien (Perth)", |
| | | "de": "Westaustralische Standardzeit (Perth)", |
| | | "ru": "ÐападноавÑÑÑалийÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (ÐеÑÑ)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØºØ±Ø¨ أستراÙÙØ§ (Ø¨ÙØ±Ø«)", |
| | | "pt": "Hora Padrão da Austrália Ocidental (Perth)" |
| | | } |
| | | }, |
| | | "Australia/Sydney": { |
| | | "utc_offset": "+10:00", |
| | | "name": { |
| | | "zh": "澳大å©äºä¸é¨æ¶é´ï¼æå°¼ï¼", |
| | | "en": "Australian Eastern Standard Time (Sydney)", |
| | | "ja": "ãªã¼ã¹ãã©ãªã¢æ±é¨æ¨æºæï¼ã·ããã¼ï¼", |
| | | "ko": "í¸ì£¼ ëë¶ íì¤ì (ìëë)", |
| | | "es": "Hora Estándar Oriental de Australia (SÃdney)", |
| | | "fr": "Heure Standard de l'Est Australien (Sydney)", |
| | | "de": "Ostaustralische Standardzeit (Sydney)", |
| | | "ru": "ÐоÑÑоÑноавÑÑÑалийÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Сидней)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙØ´Ø±Ù أستراÙÙØ§ (Ø³ÙØ¯ÙÙ)", |
| | | "pt": "Hora Padrão da Austrália Oriental (Sydney)" |
| | | } |
| | | }, |
| | | "Pacific/Guam": { |
| | | "utc_offset": "+10:00", |
| | | "name": { |
| | | "zh": "å
³å²æ¶é´", |
| | | "en": "Guam Time", |
| | | "ja": "ã°ã¢ã æé", |
| | | "ko": "ê´ ìê°", |
| | | "es": "Hora de Guam", |
| | | "fr": "Heure de Guam", |
| | | "de": "Guam-Zeit", |
| | | "ru": "ÐÑÐµÐ¼Ñ ÐÑама", |
| | | "ar": "تÙÙÙØª ØºÙØ§Ù
", |
| | | "pt": "Hora de Guam" |
| | | } |
| | | }, |
| | | "Pacific/Noumea": { |
| | | "utc_offset": "+11:00", |
| | | "name": { |
| | | "zh": "æ°åéå¤å°¼äºæ¶é´ï¼åªç¾é¿ï¼", |
| | | "en": "New Caledonia Time (Noumea)", |
| | | "ja": "ãã¥ã¼ã«ã¬ããã¢æéï¼ãã¡ã¢ï¼", |
| | | "ko": "ë´ì¹¼ë ëëì ìê° (ëë©ì)", |
| | | "es": "Hora de Nueva Caledonia (Numea)", |
| | | "fr": "Heure de Nouvelle-Calédonie (Nouméa)", |
| | | "de": "Neukaledonische Zeit (Noumea)", |
| | | "ru": "ÐовокаледонÑкое вÑÐµÐ¼Ñ (ÐÑмеа)", |
| | | "ar": "تÙÙÙØª ÙØ§ÙÙØ¯ÙÙÙØ§ Ø§ÙØ¬Ø¯Ùدة (ÙÙÙ
ÙØ§)", |
| | | "pt": "Hora da Nova Caledônia (Numeá)" |
| | | } |
| | | }, |
| | | "Pacific/Auckland": { |
| | | "utc_offset": "+12:00", |
| | | "name": { |
| | | "zh": "æ°è¥¿å
°æ åæ¶é´ï¼å¥¥å
å
°ï¼", |
| | | "en": "New Zealand Standard Time (Auckland)", |
| | | "ja": "ãã¥ã¼ã¸ã¼ã©ã³ãæ¨æºæï¼ãªã¼ã¯ã©ã³ãï¼", |
| | | "ko": "ë´ì§ëë íì¤ì (ì¤í´ëë)", |
| | | "es": "Hora Estándar de Nueva Zelanda (Auckland)", |
| | | "fr": "Heure Standard de Nouvelle-Zélande (Auckland)", |
| | | "de": "Neuseeländische Standardzeit (Auckland)", |
| | | "ru": "ÐовозеландÑкое ÑÑандаÑÑное вÑÐµÐ¼Ñ (Ðкленд)", |
| | | "ar": "Ø§ÙØªÙÙÙØª اÙÙÙØ§Ø³Ù ÙÙÙÙØ²ÙÙÙØ¯Ø§ (Ø£ÙÙÙØ§Ùد)", |
| | | "pt": "Hora Padrão da Nova Zelândia (Auckland)" |
| | | } |
| | | }, |
| | | "Pacific/Fiji": { |
| | | "utc_offset": "+12:00", |
| | | "name": { |
| | | "zh": "ææµæ¶é´", |
| | | "en": "Fiji Time", |
| | | "ja": "ãã£ã¸ã¼æé", |
| | | "ko": "í¼ì§ ìê°", |
| | | "es": "Hora de Fiyi", |
| | | "fr": "Heure de Fidji", |
| | | "de": "Fidschi-Zeit", |
| | | "ru": "ÐÑÐµÐ¼Ñ Ð¤Ð¸Ð´Ð¶Ð¸", |
| | | "ar": "تÙÙÙØª ÙÙØ¬Ù", |
| | | "pt": "Hora de Fiji" |
| | | } |
| | | }, |
| | | "Pacific/Tongatapu": { |
| | | "utc_offset": "+13:00", |
| | | "name": { |
| | | "zh": "æ±¤å æ¶é´ï¼æ±¤å 塿®ï¼", |
| | | "en": "Tonga Time (Tongatapu)", |
| | | "ja": "ãã³ã¬æéï¼ãã³ã¬ã¿ãï¼", |
| | | "ko": "íµê° ìê° (íµê°íí¸)", |
| | | "es": "Hora de Tonga (Tongatapu)", |
| | | "fr": "Heure de Tonga (Tongatapu)", |
| | | "de": "Tonga-Zeit (Tongatapu)", |
| | | "ru": "ÐÑÐµÐ¼Ñ Ð¢Ð¾Ð½Ð³Ð° (ТонгаÑапÑ)", |
| | | "ar": "تÙÙÙØª تÙÙØºØ§ (تÙÙØºØ§ØªØ§Ø¨Ù)", |
| | | "pt": "Hora de Tonga (Tongatapu)" |
| | | } |
| | | } |
| | | } |
| | | |
| | | const timezoneRegionNames = { |
| | | zh: { |
| | | Africa: 'éæ´²', |
| | | America: 'ç¾æ´²', |
| | | Antarctica: 'åææ´²', |
| | | Arctic: 'åæ', |
| | | Asia: 'äºæ´²', |
| | | Atlantic: '大西æ´', |
| | | Australia: '澳大å©äº', |
| | | Europe: '欧洲', |
| | | Indian: 'å°åº¦æ´', |
| | | Pacific: '太平æ´' |
| | | }, |
| | | en: { |
| | | Africa: 'Africa', |
| | | America: 'America', |
| | | Antarctica: 'Antarctica', |
| | | Arctic: 'Arctic', |
| | | Asia: 'Asia', |
| | | Atlantic: 'Atlantic', |
| | | Australia: 'Australia', |
| | | Europe: 'Europe', |
| | | Indian: 'Indian', |
| | | Pacific: 'Pacific' |
| | | }, |
| | | es: { |
| | | Africa: 'Ãfrica', |
| | | America: 'América', |
| | | Antarctica: 'Antártida', |
| | | Arctic: 'Ãrtico', |
| | | Asia: 'Asia', |
| | | Atlantic: 'Atlántico', |
| | | Australia: 'Australia', |
| | | Europe: 'Europa', |
| | | Indian: 'Ãndico', |
| | | Pacific: 'PacÃfico' |
| | | }, |
| | | fr: { |
| | | Africa: 'Afrique', |
| | | America: 'Amérique', |
| | | Antarctica: 'Antarctique', |
| | | Arctic: 'Arctique', |
| | | Asia: 'Asie', |
| | | Atlantic: 'Atlantique', |
| | | Australia: 'Australie', |
| | | Europe: 'Europe', |
| | | Indian: 'Indien', |
| | | Pacific: 'Pacifique' |
| | | }, |
| | | de: { |
| | | Africa: 'Afrika', |
| | | America: 'Amerika', |
| | | Antarctica: 'Antarktis', |
| | | Arctic: 'Arktis', |
| | | Asia: 'Asien', |
| | | Atlantic: 'Atlantik', |
| | | Australia: 'Australien', |
| | | Europe: 'Europa', |
| | | Indian: 'Indischer Ozean', |
| | | Pacific: 'Pazifik' |
| | | }, |
| | | ru: { |
| | | Africa: 'ÐÑÑика', |
| | | America: 'ÐмеÑика', |
| | | Antarctica: 'ÐнÑаÑкÑида', |
| | | Arctic: 'ÐÑкÑика', |
| | | Asia: 'ÐзиÑ', |
| | | Atlantic: 'ÐÑланÑика', |
| | | Australia: 'ÐвÑÑÑалиÑ', |
| | | Europe: 'ÐвÑопа', |
| | | Indian: 'ÐндийÑкий океан', |
| | | Pacific: 'ТиÑ
ий океан' |
| | | }, |
| | | ar: { |
| | | Africa: 'Ø£ÙØ±ÙÙÙØ§', |
| | | America: 'Ø§ÙØ£Ù
رÙÙØªØ§Ù', |
| | | Antarctica: 'Ø£ÙØªØ§Ø±ÙتÙÙØ§', |
| | | Arctic: 'اÙÙØ·Ø¨ Ø§ÙØ´Ù
اÙÙ', |
| | | Asia: 'Ø¢Ø³ÙØ§', |
| | | Atlantic: 'Ø§ÙØ£Ø·ÙسÙ', |
| | | Australia: 'أستراÙÙØ§', |
| | | Europe: 'Ø£ÙØ±Ùبا', |
| | | Indian: 'اÙÙ
ØÙØ· اÙÙÙØ¯Ù', |
| | | Pacific: 'اÙÙ
ØÙØ· اÙÙØ§Ø¯Ø¦' |
| | | }, |
| | | pt: { |
| | | Africa: 'Ãfrica', |
| | | America: 'América', |
| | | Antarctica: 'Antártida', |
| | | Arctic: 'Ãrtico', |
| | | Asia: 'Ãsia', |
| | | Atlantic: 'Atlântico', |
| | | Australia: 'Austrália', |
| | | Europe: 'Europa', |
| | | Indian: 'Ãndico', |
| | | Pacific: 'PacÃfico' |
| | | }, |
| | | ko: { |
| | | Africa: 'ìí리카', |
| | | America: 'ìë©ë¦¬ì¹´', |
| | | Antarctica: 'ë¨ê·¹', |
| | | Arctic: 'ë¶ê·¹', |
| | | Asia: 'ììì', |
| | | Atlantic: 'ëìì', |
| | | Australia: 'ì¤ì¤í¸ë ì¼ë¦¬ì', |
| | | Europe: 'ì ë½', |
| | | Indian: 'ì¸ëì', |
| | | Pacific: 'ííì' |
| | | } |
| | | } |
| | | |
| | | export { timezones, timezoneRegionNames } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div id="configMain"> |
| | | <div class="config-container"> |
| | | <div class="config-tabs"> |
| | | <el-tabs v-model="activeTab" type="card" @tab-click="handleClick"> |
| | | <!-- åºç¡é
ç½® --> |
| | | <el-tab-pane :label="$t('config.basicConfiguration')" name="base"> |
| | | <div class="config-grid"> |
| | | <!-- æ¾ç¤ºè®¾ç½®å¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-monitor config-card__header-icon"></i> |
| | | {{ $t('config.displaySettings') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="displayForm" :model="base" :rules="baseRules" label-width="140px"> |
| | | <!-- èªå¨è°è亮度 --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.autoAdjustScreenBrightness')"> |
| | | <el-switch v-model="base.brightnessAuto" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> --> |
| | | <!-- å±å¹äº®åº¦ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.screenBrightness')"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="base.backlight" :max="100" :min="1" style="width:60%;"></el-slider> |
| | | <span class="value-display">{{ base.backlight }}%</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- èªå¨æ¯å± --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.autoTurnOffScreenTime')" prop="screenOff"> |
| | | <el-select v-model="base.screenOff" placeholder="è¯·éæ©"> |
| | | <!-- <el-option v-for="(item, index) in idleData" :key="index" :label="item" :value="index"> |
| | | </el-option> --> |
| | | <el-option :label="$t('config.never')" :value="0"></el-option> |
| | | <el-option :label="$t('config.min1')" :value="1"></el-option> |
| | | <el-option :label="$t('config.min2')" :value="2"></el-option> |
| | | <el-option :label="$t('config.min3')" :value="3"></el-option> |
| | | <el-option :label="$t('config.min4')" :value="4"></el-option> |
| | | <el-option :label="$t('config.min5')" :value="5"></el-option> |
| | | </el-select> |
| | | <!-- <el-input v-model="base.screenOff" type="number" :min="0" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input><span> |
| | | {{ $t('config.min') }}</span> --> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- èªå¨å±ä¿ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.autoScreenSaverTime')" prop="screensaver"> |
| | | <el-select v-model="base.screensaver" placeholder="è¯·éæ©"> |
| | | <!-- <el-option v-for="(item, index) in idleData" :key="index" :label="item" :value="index"> |
| | | </el-option> --> |
| | | <el-option :label="$t('config.never')" :value="0"></el-option> |
| | | <el-option :label="$t('config.min1')" :value="1"></el-option> |
| | | <el-option :label="$t('config.min2')" :value="2"></el-option> |
| | | <el-option :label="$t('config.min3')" :value="3"></el-option> |
| | | <el-option :label="$t('config.min4')" :value="4"></el-option> |
| | | <el-option :label="$t('config.min5')" :value="5"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- ç½è²è¡¥å
ç¯ --> |
| | | <div class="config-form-item" |
| | | v-if="sys.model == 'vf105' || sys.model == 'vf107' || sys.model == 'vf114' || sys.model == 'vf124' || sys.model == 'vf202'"> |
| | | <el-form-item :label="$t('config.brightness')"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="base.brightness" :max="100" :min="0" style="width:60%;"></el-slider> |
| | | <span class="value-display">{{ base.brightness }}%</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- 红å¤è¡¥å
ç¯ --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.nirBrightness')"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="base.nirBrightness" :max="100" :min="0" style="width:60%;"></el-slider> |
| | | <span class="value-display">{{ base.nirBrightness }}%</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- ä¿¡æ¯æ¾ç¤ºå¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-info config-card__header-icon"></i> |
| | | {{ $t('config.informationDisplay') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="infoForm" :model="base" label-width="140px"> |
| | | <!-- æ¾ç¤ºSN --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.displayDeviceSn')"> |
| | | <el-switch v-model="base.showSn" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¾ç¤ºIP --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.displayIp')"> |
| | | <el-switch v-model="base.showIp" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¾ç¤ºå°ç¨åºç --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.displayCode')"> |
| | | <el-switch v-model="base.showProgramCode" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> --> |
| | | <!-- äºè¯åè½èå --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.displayIdentityCard')"> |
| | | <el-switch v-model="base.showIdentityCard" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- é³é¢è®¾ç½®å¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-mic config-card__header-icon"></i> |
| | | {{ $t('config.audioSettings') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="audioForm" :model="base" label-width="140px"> |
| | | <!-- é³é --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.volume')" prop="volume"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="base.volume" :max="10" :min="0" style="flex: 1"></el-slider> |
| | | <span class="value-display">{{ base.volume }}</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- è¯è¨ä¸ä¸»é¢å¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-s-operation config-card__header-icon"></i> |
| | | {{ $t('config.languageAndThemes') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="systemForm" :model="base" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.language')" prop="language"> |
| | | <el-radio-group v-model="base.language" class="language-radio-group" |
| | | :style="{ 'margin-bottom': version == 0 ? '0px' : '12px' }"> |
| | | <el-radio v-if="version == 0" label="CN">{{ $t('config.cn') }}</el-radio> |
| | | <div v-else> |
| | | <el-radio label="EN">{{ $t('config.en') }}</el-radio> |
| | | <el-radio label="ES">{{ $t('config.es') }}</el-radio> |
| | | <el-radio label="FR">{{ $t('config.fr') }}</el-radio> |
| | | <el-radio label="DE">{{ $t('config.de') }}</el-radio> |
| | | <el-radio label="RU">{{ $t('config.ru') }}</el-radio> |
| | | <el-radio label="AR">{{ $t('config.ar') }}</el-radio> |
| | | <el-radio label="PT">{{ $t('config.pt') }}</el-radio> |
| | | <el-radio label="KO">{{ $t('config.ko') }}</el-radio> |
| | | </div> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å·¥ä½ä¸»é¢ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.themeMode')"> |
| | | <el-radio-group v-model="base.appMode"> |
| | | <el-radio :label="0">{{ $t('config.standardMode') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.simpleMode') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¯å¦ç¬¬ä¸æ¬¡ç»å½åå° --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.firstLogin')"> |
| | | <el-radio-group v-model="base.firstLogin"> |
| | | <el-radio :label="0">{{ $t('config.no') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.yes') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- ç½ç»é
ç½® --> |
| | | <el-tab-pane :label="$t('config.networkConfiguration')" name="net"> |
| | | <div class="config-grid"> |
| | | <!-- ç½ç»ç±»åå¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-connection config-card__header-icon"></i> |
| | | {{ $t('config.networkType') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="networkForm" :model="net" :rules="netRules" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.networkType')"> |
| | | <el-radio-group v-model="net.type"> |
| | | <el-radio :label="1">{{ $t('config.ethernet') }}</el-radio> |
| | | <el-radio :label="2" |
| | | v-model-permission="['vf203', 'vf105', 'vf107', 'vf114', 'vf124', 'vf205']">WiFi</el-radio> |
| | | <el-radio :label="4" v-model-permission="['vf203']">4G</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <template v-if="net.type === 2"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.wifiName')"> |
| | | <el-input v-model="net.ssid" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.wifiPassword')"> |
| | | <el-input v-model="net.psk" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </template> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <el-card class="config-card card-zhanwei"></el-card> |
| | | <!-- IPé
ç½®å¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-s-platform config-card__header-icon"></i> |
| | | {{ $t('config.ipConfiguration') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="ipForm" :model="net" :rules="netRules" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.dhcpModeSelection')"> |
| | | <el-radio-group v-model="net.dhcp"> |
| | | <el-radio :label="1">{{ $t('config.customNetworkConfiguration') }}</el-radio> |
| | | <el-radio :label="2">{{ $t('config.dhcpMode') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <template v-if="net.dhcp === 1"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.ipAddress')" prop="ip"> |
| | | <el-input v-model="net.ip" placeholder="192.168.10.99"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.gateway')" prop="gateway"> |
| | | <el-input v-model="net.gateway" placeholder="192.168.1.1"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.subnetMask')" prop="mask"> |
| | | <el-input v-model="net.mask" placeholder="255.255.255.0"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.dnsServer')" prop="dns"> |
| | | <el-input v-model="net.dns" placeholder="8.8.8.8"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </template> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- å
¶ä»é
ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-s-platform config-card__header-icon"></i> |
| | | {{ $t('config.otherConfiguration') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="ipForm" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.mac')"> |
| | | <el-input v-model="net.mac" placeholder="D6:18:6C:CE:B4:60" :disabled="true"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <el-card class="config-card card-zhanwei"></el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- mqtté
ç½® --> |
| | | <el-tab-pane :label="$t('config.mqttRelatedConfiguration')" name="mqtt" v-if="!isWeCom"> |
| | | <div class="config-grid"> |
| | | <!-- mqttä¿¡æ¯é
ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-connection config-card__header-icon"></i> |
| | | {{ $t('config.mqttConnectionInformation') }}({{ ($t('config.enterpriseWechat')) }}) |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="mqttForm" :model="mqtt" :rules="mqttRules" label-width="140px"> |
| | | <!-- æå¡å¨å°å --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.serverAddress')" prop="addr"> |
| | | <el-input v-model="mqtt.addr" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- ç¨æ·å --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.userName')"> |
| | | <el-input v-model="mqtt.username" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- ç¨æ·å¯ç --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.userPassword')"> |
| | | <el-input v-model="mqtt.password" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- qos --> |
| | | <div class="config-form-item"> |
| | | <el-form-item label="Qos"> |
| | | <el-radio-group v-model="mqtt.qos"> |
| | | <el-radio :label="0">Qos0</el-radio> |
| | | <el-radio :label="1">Qos1</el-radio> |
| | | <el-radio :label="2">Qos2</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- 客æ·ç«¯Id --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.clientID')"> |
| | | <el-input v-model="mqtt.clientId" type="text" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¯å¦å éæºæ° --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.clientIdSuffix')"> |
| | | <el-radio-group v-model="mqtt.clientIdSuffix"> |
| | | <el-radio :label="0">{{ $t('config.no') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.yes') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¸
é¤ä¼è¯ --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.cleanSession')"> |
| | | <el-radio-group v-model="mqtt.cleanSession"> |
| | | <el-radio :label="0">{{ $t('config.no') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.yes') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- ä¼è¯é
ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-s-operation config-card__header-icon"></i> |
| | | {{ $t('config.sessionConfiguration') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="onlineCheckingForm" :model="mqtt" :rules="mqttRules" label-width="140px"> |
| | | <!-- 主é¢åç¼ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.topicPrefix')"> |
| | | <el-input v-model="mqtt.prefix" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- éå± --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.willTopic')"> |
| | | <el-input v-model="mqtt.willTopic" type="text" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- <el-card class="config-card card-zhanwei"></el-card> --> |
| | | <!-- å¨çº¿éªè¯å¡ç --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-link config-card__header-icon"></i> |
| | | {{ $t('config.onlineChecking') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="onlineCheckingForm" :model="mqtt" :rules="mqttRules" label-width="140px"> |
| | | <!-- å¨çº¿éªè¯ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.onlineChecking')"> |
| | | <el-switch v-model="mqtt.onlinecheck" active-color="#1890ff" inactive-color="#ff4949" |
| | | :active-value="1" :inactive-value="0"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å¨çº¿éªè¯è¶
æ¶æ¶é´ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.onlineCheckingTimeout')" prop="timeout"> |
| | | <el-input v-model="mqtt.timeout" :placeholder="$t('config.msg_please_enter')"></el-input><span> |
| | | {{ $t('config.second') }}</span> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- 人è¸é
ç½® --> |
| | | <el-tab-pane :label="$t('config.faceRelatedConfiguration')" name="face"> |
| | | <div class="config-grid"> |
| | | <!-- mqttä¿¡æ¯é
ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-info config-card__header-icon"></i> |
| | | {{ $t('config.functionalInformation') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="faceForm" :model="face" label-width="140px"> |
| | | <!-- 人è¸è¯å«ç¸ä¼¼åº¦ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.faceSimilarityThreshold')"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="face.similarity" :max="100" :min="0" style="width:60%;"></el-slider> |
| | | <span class="value-display">{{ face.similarity }}%</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ´»ä½æ£æµ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.livenessDetectionFunction')"> |
| | | <el-switch v-model="face.livenessOff" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ´»ä½æ£æµéå¼ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.livenessDetectionThreshold')"> |
| | | <div class="compact-controls"> |
| | | <el-slider v-model="face.livenessVal" :max="100" :min="0" style="width:60%;"></el-slider> |
| | | <span class="value-display">{{ face.livenessVal }}</span> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- çº¢å¤æ¡å¼å
³ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.infraredImageDisplay')"> |
| | | <el-switch v-model="face.showNir" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å£ç½©æ£æµå¼å
³ --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.maskRecognition')"> |
| | | <el-switch v-model="face.detectMask" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> --> |
| | | <!-- 鿣å¼å
³ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.recognitionSwitch')"> |
| | | <el-switch v-model="face.recheck" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <el-card class="config-card card-zhanwei"></el-card> |
| | | <!-- æç¤ºè¯ --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-s-grid config-card__header-icon"></i> |
| | | {{ $t('config.prompt') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="faceMsgForm" :model="face" :rules="faceRules" label-width="140px"> |
| | | <!-- æªæ³¨åäººè¸æç¤º --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.strangerVoice')"> |
| | | <el-radio-group v-model="face.stranger"> |
| | | <el-radio :label="0">{{ $t('config.noVoice') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.broadcastPleaseRegisterFirst') }}</el-radio> |
| | | <el-radio :label="2">{{ $t('config.broadcastHelloStranger') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- è¯å«æåææ¾è¯é³ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.voiceMode')"> |
| | | <el-radio-group v-model="face.voiceMode"> |
| | | <el-radio :label="0">{{ $t('config.noVoice') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.broadcastName') }}</el-radio> |
| | | <el-radio :label="2">{{ $t('config.broadcastGreeting') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- èªå®ä¹æ¬¢è¿è¯ --> |
| | | <div class="config-form-item" v-if="face.voiceMode == 2"> |
| | | <el-form-item :label="$t('config.voiceModeDate')"> |
| | | <el-input v-model="face.voiceModeDate" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- ç³»ç»é
ç½® --> |
| | | <el-tab-pane :label="$t('config.systemRelatedConfiguration')" name="sys"> |
| | | <div class="config-grid"> |
| | | <!-- åè½å¼å
³é
ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-video-play config-card__header-icon"></i> |
| | | {{ $t('config.functionSwitch') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="sysForm" :model="sys" label-width="140px"> |
| | | <!-- å·å¡æ ¸éª --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.cardSwipingSwitch')"> |
| | | <el-switch v-model="sys.nfc" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å¯ç å¼é¨ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.passwordSwitch')"> |
| | | <el-switch v-model="sys.pwd" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- éç人ä¿åå¾ç --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.strangerImage')"> |
| | | <el-radio-group v-model="sys.strangerImage"> |
| | | <el-radio :label="0">{{ $t('config.notsave') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.save') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- äºè¯å¼å
³ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.cloudCertificateSwitch')"> |
| | | <el-switch v-model="sys.nfcIdentityCardEnable" :active-value="3" :inactive-value="1" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- å¿è·³è®¾ç½® --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-setting config-card__header-icon"></i> |
| | | {{ $t('config.heartbeatConfig') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="sysForm" :model="sys" label-width="140px"> |
| | | <!-- å¿è·³å¼å
³ --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.heartbeatSwitch')"> |
| | | <el-switch v-model="sys.heart_en" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å¿è·³é´é --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.heartRateInterval')" prop="heart_time"> |
| | | <el-input v-model="sys.heart_time" :placeholder="$t('config.msg_please_enter')" type="number" |
| | | :min="1"></el-input><span> |
| | | {{ $t('config.second') }}</span> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- å¿è·³ä¸»é¢ --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.heartbeatTopic')" prop="heart_topic"> |
| | | <el-input v-model="sys.heart_topic" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> --> |
| | | <!-- å¿è·³å
容 --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.heartbeatContent')" prop="heart_payload"> |
| | | <el-input v-model="sys.heart_payload" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> --> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- æ«ç 设置 --> |
| | | <el-card class="config-card card-theme-display" v-model-permission="['vf105', 'vf114']"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-full-screen config-card__header-icon"></i> |
| | | {{ $t('config.scanSettings') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="sysForm" :model="sys" label-width="140px"> |
| | | <!-- æ«ç å¼å
³ --> |
| | | <!-- <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.scanSwitch')"> |
| | | <el-switch v-model="sys.scan" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> --> |
| | | <!-- æ«ç é´é --> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.scanInterval')" prop="scanInterval"> |
| | | <el-input v-model="sys.scanInterval" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input><span> |
| | | {{ $t('config.second') }}</span> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <!-- åºæ¬ä¿¡æ¯ --> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-info config-card__header-icon"></i> |
| | | {{ $t('config.basicInformation') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="accessForm" :model="sys" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.deviceMac')"> |
| | | <el-input v-model="sys.mac" :placeholder="$t('config.msg_please_enter')" disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.uuid')"> |
| | | <el-input v-model="sys.uuid" :placeholder="$t('config.msg_please_enter')" disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.sn')"> |
| | | <el-input v-model="sys.sn" :placeholder="$t('config.msg_please_enter')" disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.model')"> |
| | | <el-input v-model="sys.model" :placeholder="$t('config.msg_please_enter')" disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.version')"> |
| | | <el-input v-model="sys.version" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.appVersion')"> |
| | | <el-input v-model="sys.appVersion" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.releaseTime')"> |
| | | <el-input v-model="sys.releaseTime" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.totaldisk')"> |
| | | <el-input v-model="sys.totaldisk" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.freedisk')"> |
| | | <el-input v-model="sys.freedisk" :placeholder="$t('config.msg_please_enter')" |
| | | disabled></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- éè¡é
ç½® --> |
| | | <el-tab-pane :label="$t('config.passageConfiguration')" name="access"> |
| | | <div class="config-grid"> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-connection config-card__header-icon"></i> |
| | | {{ $t('config.functionConfiguration') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="accessForm" :model="access" :rules="accessRules" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.numberOfPassageRecords')"> |
| | | <el-input v-model="access.offlineAccessNum" |
| | | :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.durationOfRelayOpening')"> |
| | | <el-input v-model="access.relayTime" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | <span> {{ $t('config.second') }}</span> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.fireAlarmSwitch')"> |
| | | <el-switch v-model="access.fire" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.fireAlarmStatus')"> |
| | | <el-radio-group v-model="access.fireStatus"> |
| | | <el-radio :label="0">{{ $t('config.normal') }}</el-radio> |
| | | <el-radio :label="1">{{ $t('config.warning') }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.tamperSwitch')"> |
| | | <el-switch v-model="access.tamper" :active-value="1" :inactive-value="0" active-color="#1890ff" |
| | | inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.uploadToCloudSwitch')"> |
| | | <el-switch v-model="access.uploadToCloud" :active-value="1" :inactive-value="0" |
| | | active-color="#1890ff" inactive-color="#ff4949"> |
| | | </el-switch> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- æ¶éé
ç½® --> |
| | | <el-tab-pane :label="$t('config.clockConfiguration')" name="ntp"> |
| | | <div class="config-grid"> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-connection config-card__header-icon"></i> |
| | | {{ $t('config.clockConfiguration') }}({{ $t('config.restartAfterSetting') }}) |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="ntpForm" :model="ntp" :rules="ntpRules" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.timeSynchronizationServerIP')" prop="server"> |
| | | <el-input v-model="ntp.server" :placeholder="$t('config.msg_please_enter')"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.timeZone')" prop="gmt"> |
| | | <div class="timezone-selects"> |
| | | <el-select v-model="selectedTimezoneRegion" :placeholder="$t('config.msg_please_enter')" |
| | | @change="handleRegionChange"> |
| | | <el-option v-for="region in timezoneRegions" :key="region.value" :label="region.label" |
| | | :value="region.value"></el-option> |
| | | </el-select> |
| | | <el-select v-model="selectedTimezoneCity" :placeholder="$t('config.msg_please_enter')" |
| | | @change="handleCityChange"> |
| | | <el-option v-for="city in timezoneCities" :key="city.value" :label="city.label" |
| | | :value="city.value"></el-option> |
| | | </el-select> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- äºè¯æ¿æ´» --> |
| | | <el-tab-pane :label="$t('config.cloudCertificateActivation')" name="cloud"> |
| | | <div class="config-grid"> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header cloud-card-header"> |
| | | <i class="el-icon-cloudy config-card__header-icon cloud-icon"></i> |
| | | {{ $t('config.cloudCertificateActivation') }} |
| | | <!-- <div class="cloud-status" :class="cloudStatusClass"> |
| | | {{ cloudStatusText }} |
| | | </div> --> |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="cloudForm" :model="cloudForm" :rules="cloudRules" label-position="top"> |
| | | <div class="activation-container"> |
| | | <!-- æ¿æ´»å¯é¥è¾å
¥åºå --> |
| | | <div class="activation-input-section"> |
| | | <el-form-item :label="$t('config.activationKey')" prop="activationKey" |
| | | class="activation-form-item"> |
| | | <el-input v-model="cloudForm.activationKey" type="textarea" |
| | | :placeholder="$t('config.msg_please_enter')" class="activation-input" clearable> |
| | | <template #prefix> |
| | | <i class="el-icon-key"></i> |
| | | </template> |
| | | </el-input> |
| | | <!-- è¾å
¥æç¤º --> |
| | | <div class="activation-tips"> |
| | | <div class="tip-item"> |
| | | <i class="el-icon-info"></i> |
| | | <span>{{ $t('config.cloudTips1') }}</span> |
| | | </div> |
| | | <div class="tip-item"> |
| | | <i class="el-icon-warning-outline"></i> |
| | | <span>{{ $t('config.cloudTips2') }}</span> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | <!-- æ¿æ´»æé®åºå --> |
| | | <div class="activation-action-section"> |
| | | <el-button type="primary" class="activation-btn" :loading="activating" |
| | | :disabled="!cloudForm.activationKey" @click="handleActivate"> |
| | | <i class="el-icon-check"></i> |
| | | {{ activating ? $t('config.activationInProgress') : $t('config.confirmActivation') }} |
| | | </el-button> |
| | | </div> |
| | | <!-- æ¿æ´»ç¶ææ¾ç¤º --> |
| | | <!-- <div v-if="activationResult" class="activation-result" :class="activationResultClass"> |
| | | <i :class="resultIcon"></i> |
| | | <span>{{ activationResult.message }}</span> |
| | | <span v-if="activationResult.details" class="result-details">{{ activationResult.details |
| | | }}</span> |
| | | </div> --> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- å¯ç é
ç½® --> |
| | | <el-tab-pane :label="$t('config.passwordModification')" name="pwd"> |
| | | <div class="config-grid"> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-connection config-card__header-icon"></i> |
| | | {{ $t('config.password') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <el-form ref="pwdForm" :model="pwd" :rules="pwdRules" label-width="140px"> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.oldPassword')" prop="oldPwd"> |
| | | <el-input style="border:1px solid #eee; width:370px;border-radius: 10px;" v-model="pwd.oldPwd" |
| | | autocomplete="off"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item" style="clear: both;"> |
| | | <el-form-item :label="$t('config.newPassword')" prop="newPwd"> |
| | | <el-input style="border:1px solid #eee; width:370px;border-radius: 10px;" v-model="pwd.newPwd" |
| | | autocomplete="off"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="config-form-item"> |
| | | <el-form-item :label="$t('config.confirmPassword')" prop="quePwd"> |
| | | <el-input style="border:1px solid #eee; width:370px;border-radius: 10px;" v-model="pwd.quePwd" |
| | | autocomplete="off"></el-input> |
| | | </el-form-item> |
| | | </div> |
| | | </el-form> |
| | | <!-- å¯ç è§åæç¤ºè¯ --> |
| | | <div class="password-rules-tip"> |
| | | <div class="rules-title">{{ $t('config.passwordRule') }}ï¼</div> |
| | | <ul class="rules-list"> |
| | | <li>{{ $t('config.passwordLength') }}</li> |
| | | <li>{{ $t('config.cannotBeTheSame') }}</li> |
| | | <li>{{ $t('config.cannotOrder') }}</li> |
| | | <li>{{ $t('config.cannotWeakPassword') }}ï¼</li> |
| | | <li class="weak-passwords">"password", "admin", "qwerty", "iloveyou"<br> |
| | | "letmein", "welcome", "sunshine", "monkey"</li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- èµæºé
ç½® --> |
| | | <el-tab-pane :label="$t('config.resourceConfiguration')" name="resource"> |
| | | <div class="config-grid"> |
| | | <el-card class="config-card card-theme-display"> |
| | | <div class="config-card__header"> |
| | | <i class="el-icon-picture-outline config-card__header-icon"></i> |
| | | {{ $t('config.backgroundImage') }} |
| | | </div> |
| | | <div class="config-card__body"> |
| | | <div class="background-upload-section"> |
| | | <div class="upload-area"> |
| | | <el-upload class="background-upload" action="#" :show-file-list="false" accept="image/png" |
| | | :before-upload="handleBackgroundSelect"> |
| | | <el-button type="primary" icon="el-icon-folder-opened"> |
| | | {{ $t('config.selectImage') }} |
| | | </el-button> |
| | | </el-upload> |
| | | <div v-if="background.name" class="file-info"> |
| | | <i class="el-icon-document"></i> |
| | | <span>{{ background.name }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="upload-actions"> |
| | | <el-button type="primary" icon="el-icon-upload" :disabled="!background.base64" |
| | | :loading="loading.background" @click="uploadBackground"> |
| | | {{ loading.background ? $t('config.uploading') : $t('config.uploadBackground') }} |
| | | </el-button> |
| | | </div> |
| | | <div class="upload-tips"> |
| | | <p v-if="model == 'vf202'">{{ $t('config.backgroundUploadTip').replace('{n}', '480*854') }}</p> |
| | | <p v-if="model == 'vf105' || model == 'vf107' || model == 'vf205'">{{ |
| | | $t('config.backgroundUploadTip').replace('{n}', '800*1280') }}</p> |
| | | <p v-if="model == 'vf114' || model == 'vf124'">{{ $t('config.backgroundUploadTip').replace('{n}', |
| | | '720*1280') }}</p> |
| | | <p v-if="model == 'vf203'">{{ $t('config.backgroundUploadTip').replace('{n}', '600*1024') }}</p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | <el-button v-if="activeTab != 'cloud' && activeTab != 'resource'" class="config-save-btn" type="primary" |
| | | icon="el-icon-check" size="large" @click="saveAll">{{ |
| | | $t('config.saveConfig') }}</el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import { throttle } from '@/utils/index.js' |
| | | import { timezones, timezoneRegionNames } from '@/utils/timezones.js' |
| | | export default { |
| | | data() { |
| | | // å¯ç éªè¯è§å |
| | | const validatePassword = (rule, value, callback) => { |
| | | if (!value || value.trim() === '') { |
| | | callback(new Error(this.$t('config.msg_inputPassword'))); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | // 确认å¯ç éªè¯è§åï¼å¿
须䏿°å¯ç ä¸è´ï¼ |
| | | const validateConfirmPassword = (rule, value, callback) => { |
| | | if (value !== this.pwd.newPwd) { |
| | | callback(new Error(this.$t('config.msg_password_mismatch'))); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | return { |
| | | activeTab: 'base', |
| | | isWeCom: false, |
| | | base: { |
| | | screenOff: 0, |
| | | screensaver: 0, |
| | | brightness: 70, |
| | | // brightnessAuto: 1, |
| | | volume: 50, |
| | | showIp: 1, |
| | | showSn: 1, |
| | | // showProgramCode: 1, |
| | | // showIdentityCard: 1, |
| | | language: 'CN', |
| | | appMode: 1, |
| | | // nirBrightness: 80, |
| | | backlight: 70, |
| | | // firstLogin: 0 |
| | | }, |
| | | idleData: [this.$t('config.never'), this.$t('config.min1'), this.$t('config.min2'), this.$t('config.min3'), this.$t('config.min4'), this.$t('config.min5')], |
| | | baseRules: { |
| | | screenOff: [{ |
| | | message: this.$t("common.integerFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^[0-9]+$/ |
| | | }], |
| | | screensaver: [{ |
| | | message: this.$t("common.integerFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^[0-9]+$/ |
| | | }] |
| | | }, |
| | | net: { |
| | | type: 1, |
| | | ssid: '', |
| | | psk: '', |
| | | dhcp: 2, |
| | | ip: '', |
| | | gateway: '', |
| | | mask: '', |
| | | dns: '', |
| | | mac: '' |
| | | }, |
| | | netRules: { |
| | | ip: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
| | | } |
| | | ], |
| | | gateway: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
| | | } |
| | | ], |
| | | mask: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
| | | } |
| | | ], |
| | | dns: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
| | | } |
| | | ] |
| | | }, |
| | | mqtt: { |
| | | addr: '', |
| | | username: '', |
| | | password: '', |
| | | prefix: '', |
| | | qos: 0, |
| | | onlinecheck: '', |
| | | timeout: '', |
| | | // cleanSession: 0, |
| | | clientId: '', |
| | | clientIdSuffix: '', |
| | | // willTopic: '', |
| | | }, |
| | | mqttRules: { |
| | | addr: [ |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | const supportedProtocols = ['tcp://', 'ssl://', 'mqtt://', 'mqtts://']; |
| | | const ipOrDomainWithPort = /^(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})(:\d{1,5})?$/ |
| | | let hostPort = value; |
| | | let hasSupportedProtocol = false; |
| | | for (const protocol of supportedProtocols) { |
| | | if (value.startsWith(protocol)) { |
| | | hasSupportedProtocol = true; |
| | | hostPort = value.slice(protocol.length); // 廿åè®®åç¼ |
| | | break; |
| | | } |
| | | } |
| | | if (!hasSupportedProtocol && value.includes('://')) callback(new Error(this.$t("common.incorrectFormat"))); |
| | | if (!hostPort) { |
| | | callback(); |
| | | return; |
| | | } |
| | | if (!ipOrDomainWithPort.test(hostPort)) callback(new Error(this.$t("common.incorrectFormat"))); |
| | | const portMatch = hostPort.match(/:(\d{1,5})$/); |
| | | if (portMatch) { |
| | | const port = parseInt(portMatch[1], 10); |
| | | if (port < 1 || port > 65535) callback(new Error(this.$t("common.incorrectFormat"))); |
| | | } |
| | | callback(); |
| | | }, |
| | | trigger: ["blur"] |
| | | }], |
| | | timeout: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^[1-9]\d*$/ |
| | | } |
| | | ], |
| | | }, |
| | | face: { |
| | | similarity: 60, |
| | | livenessOff: 1, |
| | | livenessVal: 0, |
| | | showNir: 0, |
| | | stranger: 0, |
| | | voiceMode: 0, |
| | | voiceModeDate: "", |
| | | recheck: 0 |
| | | }, |
| | | faceRules: { |
| | | // voiceModeDate: [ |
| | | // { |
| | | // message: this.$t("config.msg_charactersAndNumbers"), |
| | | // trigger: ["blur"], |
| | | // pattern: /^[\u4e00-\u9fa5]*([1-9]\d*)?[\u4e00-\u9fa5]*$/ |
| | | // } |
| | | // ], |
| | | }, |
| | | sys: { |
| | | nfc: 1, |
| | | pwd: 1, |
| | | strangerImage: 1, |
| | | heart_en: 0, |
| | | heart_time: 30, |
| | | // heart_topic: '', |
| | | // heart_payload: '', |
| | | mac: '', |
| | | uuid: '', |
| | | sn: '', |
| | | model: '', |
| | | version: '', |
| | | appVersion: '', |
| | | releaseTime: '', |
| | | nfcIdentityCardEnable: 1, |
| | | // scan: '', |
| | | scanInterval: '', |
| | | totaldisk: '', |
| | | freedisk: '', |
| | | }, |
| | | sysRules: { |
| | | heart_time: [{ |
| | | message: this.$t("common.positiveIntegerFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^[1-9]\d*$/ |
| | | }], |
| | | scanInterval: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^[1-9]\d*$/ |
| | | } |
| | | ], |
| | | }, |
| | | access: { |
| | | offlineAccessNum: 2000, |
| | | relayTime: 2000, |
| | | fire: 0, |
| | | fireStatus: 0, |
| | | tamper: 0, |
| | | uploadToCloud: 0, |
| | | }, |
| | | accessRules: {}, |
| | | ntp: { |
| | | server: '182.92.12.11', |
| | | gmt: 'Asia/Shanghai' |
| | | }, |
| | | selectedTimezoneRegion: '', |
| | | selectedTimezoneCity: '', |
| | | ntpRules: { |
| | | ip: [ |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
| | | } |
| | | ], |
| | | gmt: [ |
| | | { |
| | | required: true, |
| | | message: this.$t("config.msg_please_enter"), |
| | | trigger: ["change"] |
| | | } |
| | | ], |
| | | }, |
| | | pwd: { |
| | | orignPwd: '', |
| | | oldPwd: '', |
| | | newPwd: '', |
| | | quePwd: '' |
| | | }, |
| | | pwdRules: { |
| | | oldPwd: [ |
| | | { |
| | | required: true, |
| | | validator: validatePassword, |
| | | trigger: ["blur"] |
| | | } |
| | | ], |
| | | newPwd: [ |
| | | { required: true, validator: validatePassword, trigger: ["blur"] }, |
| | | ], |
| | | quePwd: [ |
| | | { required: true, validator: validatePassword, trigger: ["blur"] }, |
| | | { validator: validateConfirmPassword, trigger: ["blur"] } |
| | | ] |
| | | }, |
| | | passwordStrength: 0, // å¯ç 强度ç级 0-4 |
| | | isWeakPassword: false, |
| | | cloudForm: { |
| | | activationKey: '' |
| | | }, |
| | | cloudRules: { |
| | | activationKey: [ |
| | | { required: true, message: '请è¾å
¥æ¿æ´»å¯é¥', trigger: 'blur' }, |
| | | { |
| | | message: this.$t("common.incorrectFormat"), |
| | | trigger: ["blur"], |
| | | pattern: /^___VBAR_ID_ACTIVE_V/ |
| | | } |
| | | ] |
| | | }, |
| | | activating: false, |
| | | activationResult: null, |
| | | cloudStatus: 'inactive', // 'active' æ 'inactive' |
| | | background: { |
| | | base64: '', |
| | | name: '' |
| | | }, |
| | | loading: { |
| | | background: false |
| | | }, |
| | | reboot: { |
| | | language: '' |
| | | }, |
| | | originalBase: null, // ä¿å仿å¡å¨è·åçåå§baseé
ç½® |
| | | version: 0, // çæ¬ï¼1-å½é
çæ¬ï¼0-å½å
çæ¬ |
| | | model: '' |
| | | } |
| | | }, |
| | | created() { |
| | | // ä»sessionStorageè·åversionï¼é»è®¤ä¸º0ï¼å½å
çæ¬ï¼ |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { version, isWeCom, model } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | if (version == null || version == undefined || version == "CN") { |
| | | this.version = 0 |
| | | } else { |
| | | this.version = 1 |
| | | } |
| | | this.isWeCom = isWeCom |
| | | this.model = model |
| | | this.getConfig() |
| | | }, |
| | | watch: { |
| | | 'ntp.gmt': function () { |
| | | this.initTimezone() |
| | | } |
| | | }, |
| | | computed: { |
| | | activeConfig() { |
| | | let config = this[this.activeTab] || {}; |
| | | if (this.activeTab == 'base') { |
| | | if (this.reboot.language == config.language) { |
| | | config = { ...config } |
| | | delete config.language |
| | | } |
| | | } |
| | | if (this.activeTab == 'face') { |
| | | config.similarity = config.similarity / 100 |
| | | config.livenessVal = config.livenessVal / 10 |
| | | } |
| | | if (this.activeTab == 'pwd') { |
| | | config = { |
| | | password: config.newPwd |
| | | } |
| | | } |
| | | if (this.activeTab == 'ntp') { |
| | | const { gmt, ...rest } = config |
| | | config = { |
| | | ...rest, |
| | | timeZone: gmt |
| | | } |
| | | } |
| | | if (this.activeTab == 'sys') { |
| | | let { nfc, pwd, strangerImage, heart_en, heart_time, nfcIdentityCardEnable, scanInterval } = config |
| | | config = { nfc, pwd, strangerImage, heart_en, heart_time, nfcIdentityCardEnable } |
| | | if (scanInterval) { |
| | | config.scanInterval = scanInterval |
| | | } |
| | | } |
| | | if (this.activeTab == 'mqtt') { |
| | | config = { ...config } |
| | | delete config.clientId |
| | | } |
| | | if (this.activeTab == 'net') { |
| | | delete config.mac |
| | | } |
| | | return config |
| | | }, |
| | | cloudStatusClass() { |
| | | return this.cloudStatus === 'active' ? 'active' : 'inactive' |
| | | }, |
| | | cloudStatusText() { |
| | | return this.cloudStatus === 'active' ? 'å·²æ¿æ´»' : 'æªæ¿æ´»' |
| | | }, |
| | | activationResultClass() { |
| | | return this.activationResult?.type || 'success' |
| | | }, |
| | | resultIcon() { |
| | | return this.activationResult?.type === 'error' ? 'el-icon-close' : 'el-icon-check' |
| | | }, |
| | | timezoneRegions() { |
| | | const regions = new Set() |
| | | Object.keys(timezones).forEach(key => { |
| | | const [region] = key.split('/') |
| | | regions.add(region) |
| | | }) |
| | | const locale = this.$i18n.locale || 'en' |
| | | return Array.from(regions).map(r => ({ label: this.getRegionLabel(r, locale), value: r })) |
| | | }, |
| | | timezoneCities() { |
| | | return this.getCitiesByRegion(this.selectedTimezoneRegion || 'Asia') |
| | | }, |
| | | }, |
| | | methods: { |
| | | initTimezone() { |
| | | const current = this.ntp.gmt && typeof this.ntp.gmt === 'string' ? this.ntp.gmt : 'Asia/Shanghai' |
| | | const parts = current.split('/') |
| | | const region = parts[0] |
| | | const city = parts.slice(1).join('/') |
| | | this.selectedTimezoneRegion = region || 'Asia' |
| | | const cities = this.getCitiesByRegion(this.selectedTimezoneRegion) |
| | | const defaultCity = city && cities.find(c => c.value === city) ? city : (cities[0] && cities[0].value) |
| | | this.selectedTimezoneCity = defaultCity || '' |
| | | if (this.selectedTimezoneRegion && this.selectedTimezoneCity) { |
| | | this.ntp.gmt = `${this.selectedTimezoneRegion}/${this.selectedTimezoneCity}` |
| | | } |
| | | }, |
| | | getCitiesByRegion(region) { |
| | | const locale = this.$i18n.locale || 'en' |
| | | return Object.keys(timezones) |
| | | .filter(key => key.startsWith(region + '/')) |
| | | .map(key => { |
| | | const city = key.split('/')[1] |
| | | const tz = timezones[key] |
| | | const label = (tz.name && (tz.name[locale] || tz.name.en)) || city |
| | | return { value: city, label } |
| | | }) |
| | | }, |
| | | getRegionLabel(region) { |
| | | const locale = this.$i18n.locale || 'en' |
| | | const map = timezoneRegionNames[locale] || timezoneRegionNames.en || {} |
| | | return map[region] || region |
| | | }, |
| | | handleRegionChange(region) { |
| | | const cities = this.getCitiesByRegion(region) |
| | | if (cities.length) { |
| | | this.selectedTimezoneCity = cities[0].value |
| | | this.ntp.gmt = `${region}/${this.selectedTimezoneCity}` |
| | | } else { |
| | | this.selectedTimezoneCity = '' |
| | | this.ntp.gmt = '' |
| | | } |
| | | }, |
| | | handleCityChange(city) { |
| | | if (this.selectedTimezoneRegion && city) { |
| | | this.ntp.gmt = `${this.selectedTimezoneRegion}/${city}` |
| | | } |
| | | }, |
| | | handleActivate() { |
| | | this.$refs['cloudForm'].validate(async (valid) => { |
| | | if (valid) { |
| | | let data = { |
| | | code: this.cloudForm.activationKey |
| | | } |
| | | try { |
| | | const res = await this.$http.post('/eidActive', { data }) |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('config.activationSuccessful')) |
| | | this.cloudForm.activationKey = '' |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | } catch (error) { |
| | | console.log(error) |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | handleClick() { |
| | | if (this.activeTab !== 'pwd') { |
| | | this.getConfig() |
| | | this.pwd = { |
| | | orignPwd: '', |
| | | oldPwd: '', |
| | | newPwd: '', |
| | | quePwd: '' |
| | | } |
| | | } |
| | | if (this.activeTab !== 'cloud' && this.cloudForm.activationKey) { |
| | | this.cloudForm.activationKey = '' |
| | | } |
| | | if (this.$refs.displayForm) { |
| | | this.$refs.displayForm.clearValidate(); |
| | | } |
| | | if (this.$refs.infoForm) { |
| | | this.$refs.infoForm.clearValidate(); |
| | | } |
| | | if (this.$refs.audioForm) { |
| | | this.$refs.audioForm.clearValidate(); |
| | | } |
| | | if (this.$refs.systemForm) { |
| | | this.$refs.systemForm.clearValidate(); |
| | | } |
| | | if (this.$refs.networkForm) { |
| | | this.$refs.networkForm.clearValidate(); |
| | | } |
| | | if (this.$refs.ipForm) { |
| | | this.$refs.ipForm.clearValidate(); |
| | | } |
| | | if (this.$refs.mqttForm) { |
| | | this.$refs.mqttForm.clearValidate(); |
| | | } |
| | | if (this.$refs.onlineCheckingForm) { |
| | | this.$refs.onlineCheckingForm.clearValidate(); |
| | | } |
| | | if (this.$refs.faceForm) { |
| | | this.$refs.faceForm.clearValidate(); |
| | | } |
| | | if (this.$refs.faceMsgForm) { |
| | | this.$refs.faceMsgForm.clearValidate(); |
| | | } |
| | | if (this.$refs.sysForm) { |
| | | this.$refs.sysForm.clearValidate(); |
| | | } |
| | | if (this.$refs.accessForm) { |
| | | this.$refs.accessForm.clearValidate(); |
| | | } |
| | | if (this.$refs.ntpForm) { |
| | | this.$refs.ntpForm.clearValidate(); |
| | | } |
| | | if (this.$refs.pwdForm) { |
| | | this.$refs.pwdForm.clearValidate(); |
| | | } |
| | | if (this.$refs.cloudForm) { |
| | | this.$refs.cloudForm.clearValidate(); |
| | | } |
| | | }, |
| | | async getConfig() { |
| | | const res = await this.$http.post( |
| | | "/getConfig", |
| | | { |
| | | data: "" |
| | | } |
| | | ); |
| | | console.log(res) |
| | | if (res.code == 200) { |
| | | let { base, mqtt, sys, face, ntp, access, net } = res.data || {} |
| | | if (base) { |
| | | this.base = this.mergeWithBase(this.base, base); |
| | | // ä¿ååå§baseé
ç½®ï¼ç¨äºåç»æ¯è¾ |
| | | this.originalBase = { ...base }; |
| | | this.pwd.orignPwd = base.password |
| | | this.reboot.language = base.language |
| | | } |
| | | if (mqtt) { |
| | | this.mqtt = this.mergeWithBase(this.mqtt, mqtt); |
| | | } |
| | | if (sys) { |
| | | sys.totaldisk = sys.totaldisk + ' M' |
| | | sys.freedisk = sys.freedisk + ' M' |
| | | this.sys = this.mergeWithBase(this.sys, sys); |
| | | } |
| | | if (face) { |
| | | face.similarity = Math.round(face.similarity * 100) |
| | | face.livenessVal = face.livenessVal * 10 |
| | | this.face = this.mergeWithBase(this.face, face); |
| | | } |
| | | if (ntp) { |
| | | const mergedNtp = this.mergeWithBase(this.ntp, ntp) |
| | | if (ntp.timeZone) { |
| | | mergedNtp.gmt = ntp.timeZone |
| | | } |
| | | this.ntp = mergedNtp |
| | | this.initTimezone() |
| | | } else { |
| | | this.initTimezone() |
| | | } |
| | | if (access) this.access = this.mergeWithBase(this.access, access); |
| | | if (net) this.net = this.mergeWithBase(this.net, net); |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | }, |
| | | saveAll: throttle(async function () { |
| | | try { |
| | | // åå«éªè¯æ¯ä¸ªè¡¨å |
| | | if (this.activeTab == 'base') { |
| | | await this.$refs.displayForm.validate(); |
| | | } |
| | | if (this.activeTab == 'pwd') { |
| | | await this.$refs.pwdForm.validate(); |
| | | console.log(this.pwd.orignPwd, this.pwd.oldPwd) |
| | | if (this.pwd.orignPwd != this.pwd.oldPwd) { |
| | | this.$message.error(this.$t('config.msg_oldPasswordError')); |
| | | return |
| | | } |
| | | } |
| | | if (this.activeTab == 'face') { |
| | | await this.$refs.faceMsgForm.validate(); |
| | | } |
| | | await this.submitData(); |
| | | } catch (error) { |
| | | console.log(error) |
| | | } |
| | | }, 2000), |
| | | async submitData() { |
| | | const res = await this.$http.post( |
| | | "/setConfig", |
| | | { |
| | | data: { |
| | | [this.activeTab == 'pwd' ? 'base' : this.activeTab]: this.activeConfig |
| | | } |
| | | } |
| | | ); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('config.msg_saveSuccess')) |
| | | if (this.activeTab == 'pwd') { |
| | | this.pwd = { |
| | | orignPwd: '', |
| | | oldPwd: '', |
| | | newPwd: '', |
| | | quePwd: '' |
| | | } |
| | | } |
| | | this.getConfig() |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | }, |
| | | // åªåå¹¶ç®æ 对象ä¸åå¨ç屿§ |
| | | mergeWithBase(target, source) { |
| | | if (!source || typeof source !== 'object') { |
| | | return { ...target }; |
| | | } |
| | | const result = { ...target }; |
| | | const targetKeys = Object.keys(target); |
| | | for (let i = 0; i < targetKeys.length; i++) { |
| | | const key = targetKeys[i]; |
| | | if (Object.prototype.hasOwnProperty.call(source, key)) { |
| | | result[key] = source[key]; |
| | | } |
| | | } |
| | | return result; |
| | | }, |
| | | // å¤çèæ¯å¾çéæ© |
| | | async handleBackgroundSelect(file) { |
| | | if (file.type !== 'image/png') { |
| | | this.$message.error(this.$t('config.backgroundImageOnlyPNG')); |
| | | return false; |
| | | } |
| | | if (file.size > 5 * 1024 * 1024) { |
| | | this.$message.error(this.$t('config.backgroundSizeLimit')); |
| | | return false; |
| | | } |
| | | const targetResolution = this.getBackgroundResolutionByModel(); |
| | | if (targetResolution) { |
| | | try { |
| | | const { width, height } = await this.getImageSize(file); |
| | | if (width !== targetResolution.width || height !== targetResolution.height) { |
| | | this.$message.error(this.$t('config.backgroundResolutionMismatch').replace('{n}', `${targetResolution.width}*${targetResolution.height}`)); |
| | | return false; |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(this.$t('config.backgroundParseFailed')); |
| | | return false; |
| | | } |
| | | } |
| | | try { |
| | | const base64 = await this.readFileAsBase64(file); |
| | | this.background = { |
| | | base64, |
| | | name: file.name |
| | | }; |
| | | this.$message.success(this.$t('config.backgroundImageSelected')); |
| | | } catch (error) { |
| | | this.$message.error(this.$t('config.backgroundParseFailed')); |
| | | } |
| | | return false; |
| | | }, |
| | | getBackgroundResolutionByModel() { |
| | | const resolutionMap = { |
| | | vf202: { width: 480, height: 854 }, |
| | | vf105: { width: 800, height: 1280 }, |
| | | vf107: { width: 800, height: 1280 }, |
| | | vf205: { width: 800, height: 1280 }, |
| | | vf114: { width: 720, height: 1280 }, |
| | | vf124: { width: 720, height: 1280 }, |
| | | vf203: { width: 600, height: 1024 } |
| | | }; |
| | | return resolutionMap[this.model] || null; |
| | | }, |
| | | getImageSize(file) { |
| | | return new Promise((resolve, reject) => { |
| | | const image = new Image(); |
| | | const imageUrl = URL.createObjectURL(file); |
| | | image.onload = () => { |
| | | URL.revokeObjectURL(imageUrl); |
| | | resolve({ width: image.width, height: image.height }); |
| | | }; |
| | | image.onerror = () => { |
| | | URL.revokeObjectURL(imageUrl); |
| | | reject(new Error('image read failed')); |
| | | }; |
| | | image.src = imageUrl; |
| | | }); |
| | | }, |
| | | // 读åæä»¶ä¸ºBase64 |
| | | readFileAsBase64(file) { |
| | | return new Promise((resolve, reject) => { |
| | | const reader = new FileReader(); |
| | | reader.onload = () => { |
| | | const result = reader.result || ''; |
| | | const base64 = typeof result === 'string' ? result.split(',').pop() : ''; |
| | | if (!base64) { |
| | | reject(new Error('empty result')); |
| | | return; |
| | | } |
| | | resolve(base64); |
| | | }; |
| | | reader.onerror = () => reject(new Error('read failed')); |
| | | reader.readAsDataURL(file); |
| | | }); |
| | | }, |
| | | // ä¸ä¼ èæ¯å¾ç |
| | | async uploadBackground() { |
| | | if (!this.background.base64) { |
| | | this.$message.warning(this.$t('config.backgroundRequired')); |
| | | return; |
| | | } |
| | | this.loading.background = true; |
| | | try { |
| | | const res = await this.$http.post("/control", { data: { command: 13, extra: { wallpaperBase64: this.background.base64 } } }); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('config.backgroundSuccess')); |
| | | this.background = { |
| | | base64: '', |
| | | name: '' |
| | | }; |
| | | } else { |
| | | this.$message.error(res.message || this.$t('config.backgroundFailed')); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(this.$t('config.backgroundFailed')); |
| | | } finally { |
| | | this.loading.background = false; |
| | | } |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | <style lang="less" scoped> |
| | | .config-container { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: 100vh; |
| | | max-width: 100vw; |
| | | /* éå¶æå¤§å®½åº¦ä¸ºè§å£å®½åº¦ */ |
| | | overflow-x: hidden; |
| | | /* éèæ¨ªåæº¢åº */ |
| | | } |
| | | .config-grid { |
| | | column-count: 2; |
| | | /* 两å */ |
| | | column-gap: 20px; |
| | | /* åé´è· */ |
| | | margin-bottom: 80px; |
| | | box-sizing: border-box; |
| | | width: 100%; |
| | | } |
| | | .config-card { |
| | | break-inside: avoid; |
| | | /* 鲿¢å¡çè·¨ååå² */ |
| | | display: inline-block; |
| | | /* å
³é®å±æ§ */ |
| | | width: 100%; |
| | | /* å æ»¡å宽 */ |
| | | margin-bottom: 20px; |
| | | /* å¡çé´è· */ |
| | | border-radius: 12px; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); |
| | | background: white; |
| | | transition: transform 0.3s ease; |
| | | vertical-align: top; |
| | | /* é¡¶é¨å¯¹é½ */ |
| | | } |
| | | .config-card:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); |
| | | } |
| | | .config-card__header { |
| | | background: linear-gradient(90deg, #ecf5ff, #f0f9ff); |
| | | border-bottom: 1px solid #ebeef5; |
| | | padding: 16px 20px; |
| | | border-top-left-radius: 12px; |
| | | border-top-right-radius: 12px; |
| | | font-weight: 600; |
| | | color: #409EFF; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .config-card__header-icon { |
| | | margin-right: 8px; |
| | | font-size: 18px; |
| | | } |
| | | .config-card__body { |
| | | padding: 20px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | /* ç¡®ä¿ææå¡çå
容èªç¶é«åº¦ */ |
| | | .card-content { |
| | | display: flex; |
| | | flex-direction: column; |
| | | height: auto !important; |
| | | } |
| | | .config-form-item { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | padding-bottom: 8px; |
| | | border-bottom: 1px dashed #ebeef5; |
| | | } |
| | | /* ç¡®ä¿el-form-itemçlabelå¯¹é½ */ |
| | | .config-card__body ::v-deep .el-form-item { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 100%; |
| | | margin-bottom: 0; |
| | | } |
| | | .config-card__body ::v-deep .el-form-item__label { |
| | | // width: 140px; |
| | | text-align: right; |
| | | padding-right: 15px; |
| | | color: #606266; |
| | | font-weight: 500; |
| | | flex-shrink: 0; |
| | | } |
| | | .config-card__body ::v-deep .el-form-item__content { |
| | | flex: 1; |
| | | margin-left: 0 !important; |
| | | } |
| | | /* è¯è¨é项æ¯è¡3个å¸å± */ |
| | | .language-radio-group { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | width: 100%; |
| | | } |
| | | .language-radio-group ::v-deep .el-radio { |
| | | width: calc(33.333% - 10px); |
| | | margin-right: 15px; |
| | | margin-left: 0; |
| | | } |
| | | .language-radio-group ::v-deep .el-radio:nth-child(3n) { |
| | | margin-right: 0; |
| | | } |
| | | .config-form-item:last-child { |
| | | border-bottom: none; |
| | | margin-bottom: 0; |
| | | padding-bottom: 0; |
| | | } |
| | | .config-form-control { |
| | | flex: 1; |
| | | } |
| | | .config-save-btn { |
| | | position: fixed; |
| | | bottom: 30px; |
| | | right: 30px; |
| | | z-index: 100; |
| | | box-shadow: 0 4px 12px rgba(32, 160, 255, 0.4); |
| | | } |
| | | .config-tabs { |
| | | background: transparent; |
| | | } |
| | | .config-tabs ::v-deep .el-tabs__header { |
| | | background: #fff; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | margin-bottom: 20px; |
| | | border: none; |
| | | } |
| | | .config-tabs ::v-deep .el-tabs__item { |
| | | font-weight: 500; |
| | | height: 50px; |
| | | line-height: 50px; |
| | | } |
| | | .compact-controls { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 15px; |
| | | flex-wrap: wrap; |
| | | } |
| | | .value-display { |
| | | min-width: 40px; |
| | | text-align: center; |
| | | color: #409EFF; |
| | | font-weight: 500; |
| | | } |
| | | .divider { |
| | | height: 1px; |
| | | background: linear-gradient(90deg, transparent, #dcdfe6, transparent); |
| | | margin: 20px 0; |
| | | } |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 1200px) { |
| | | .config-grid { |
| | | grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); |
| | | } |
| | | } |
| | | @media (max-width: 768px) { |
| | | .config-container { |
| | | padding: 10px; |
| | | } |
| | | .config-grid { |
| | | grid-template-columns: 1fr; |
| | | gap: 15px; |
| | | } |
| | | .config-form-item { |
| | | flex-direction: column; |
| | | align-items: flex-start; |
| | | gap: 8px; |
| | | } |
| | | .config-form-control { |
| | | width: 100%; |
| | | } |
| | | .compact-controls { |
| | | width: 100%; |
| | | justify-content: space-between; |
| | | } |
| | | /* å°å±å¹ä¸è¯è¨é项æ¯è¡2个 */ |
| | | .language-radio-group ::v-deep .el-radio { |
| | | width: calc(50% - 8px); |
| | | } |
| | | .language-radio-group ::v-deep .el-radio:nth-child(3n) { |
| | | margin-right: 15px; |
| | | } |
| | | .language-radio-group ::v-deep .el-radio:nth-child(2n) { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | @media (max-width: 480px) { |
| | | .config-card__body { |
| | | padding: 15px; |
| | | } |
| | | .config-form-item { |
| | | margin-bottom: 15px; |
| | | padding-bottom: 15px; |
| | | } |
| | | /* è¶
å°å±å¹ä¸è¯è¨é项æ¯è¡1个 */ |
| | | .language-radio-group ::v-deep .el-radio { |
| | | width: 100%; |
| | | margin-right: 0; |
| | | } |
| | | .language-radio-group ::v-deep .el-radio:nth-child(2n) { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | /* å¡çé¢è²ä¸»é¢ */ |
| | | .card-theme-display { |
| | | --card-header-bg: linear-gradient(90deg, #ecf5ff, #f0f9ff); |
| | | --card-header-color: #409EFF; |
| | | } |
| | | .card-theme-network { |
| | | --card-header-bg: linear-gradient(90deg, #f0f9eb, #f9fbe7); |
| | | --card-header-color: #67C23A; |
| | | } |
| | | .card-theme-audio { |
| | | --card-header-bg: linear-gradient(90deg, #fef0f0, #fef6f6); |
| | | --card-header-color: #F56C6C; |
| | | } |
| | | .card-theme-system { |
| | | --card-header-bg: linear-gradient(90deg, #f4f4f5, #f9f9fa); |
| | | --card-header-color: #909399; |
| | | } |
| | | .card-theme-security { |
| | | --card-header-bg: linear-gradient(90deg, #fdf6ec, #fefcef); |
| | | --card-header-color: #E6A23C; |
| | | } |
| | | .card-theme-display .config-card__header { |
| | | background: var(--card-header-bg); |
| | | color: var(--card-header-color); |
| | | } |
| | | .card-theme-network .config-card__header { |
| | | background: var(--card-header-bg); |
| | | color: var(--card-header-color); |
| | | } |
| | | .card-theme-audio .config-card__header { |
| | | background: var(--card-header-bg); |
| | | color: var(--card-header-color); |
| | | } |
| | | .card-theme-system .config-card__header { |
| | | background: var(--card-header-bg); |
| | | color: var(--card-header-color); |
| | | } |
| | | .card-theme-security .config-card__header { |
| | | background: var(--card-header-bg); |
| | | color: var(--card-header-color); |
| | | } |
| | | .card-zhanwei { |
| | | height: 0; |
| | | border: none; |
| | | } |
| | | /deep/.el-form-item__label { |
| | | text-align: center; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | /deep/.el-form-item__content>.el-input { |
| | | width: 60%; |
| | | } |
| | | .password-strength-container { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-top: 2px; |
| | | width: 400px; |
| | | } |
| | | .password-strength-bar { |
| | | width: 90%; |
| | | height: 6px; |
| | | background-color: #f0f0f0; |
| | | border-radius: 3px; |
| | | overflow: hidden; |
| | | margin-bottom: 4px; |
| | | } |
| | | .password-strength-progress { |
| | | height: 100%; |
| | | transition: all 0.3s ease; |
| | | width: 0%; |
| | | } |
| | | /* ä¿®æ£éæ©å¨ - ç´æ¥åºç¨äºè¿åº¦æ¡å
ç´ */ |
| | | .password-strength-progress.strength-weak { |
| | | width: 25%; |
| | | background-color: #ff4d4f; |
| | | } |
| | | .password-strength-progress.strength-medium { |
| | | width: 50%; |
| | | background-color: #faad14; |
| | | } |
| | | .password-strength-progress.strength-good { |
| | | width: 75%; |
| | | background-color: #1890ff; |
| | | } |
| | | .password-strength-progress.strength-strong { |
| | | width: 100%; |
| | | background-color: #52c41a; |
| | | } |
| | | .password-strength-text { |
| | | line-height: 20px; |
| | | } |
| | | /* ä¿®æ£éæ©å¨ - ç´æ¥åºç¨äºææ¬å
ç´ */ |
| | | .password-strength-text.strength-weak { |
| | | color: #ff4d4f; |
| | | } |
| | | .password-strength-text.strength-medium { |
| | | color: #faad14; |
| | | } |
| | | .password-strength-text.strength-good { |
| | | color: #1890ff; |
| | | } |
| | | .password-strength-text.strength-strong { |
| | | color: #52c41a; |
| | | } |
| | | .password-weak-warning { |
| | | font-size: 12px; |
| | | color: #faad14; |
| | | margin-top: 4px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .password-weak-warning i { |
| | | margin-right: 4px; |
| | | } |
| | | .password-rules-tip { |
| | | margin-top: 20px; |
| | | padding: 12px 16px; |
| | | background: #f8f9fa; |
| | | border: 1px solid #e9ecef; |
| | | border-radius: 8px; |
| | | font-size: 12px; |
| | | line-height: 1.5; |
| | | color: #495057; |
| | | } |
| | | .rules-title { |
| | | font-weight: 600; |
| | | color: #343a40; |
| | | margin-bottom: 8px; |
| | | font-size: 13px; |
| | | } |
| | | .rules-list { |
| | | margin: 0; |
| | | padding-left: 16px; |
| | | list-style: none; |
| | | } |
| | | .rules-list li { |
| | | margin-bottom: 4px; |
| | | position: relative; |
| | | } |
| | | .rules-list li:before { |
| | | content: "·"; |
| | | position: absolute; |
| | | left: -12px; |
| | | color: #6c757d; |
| | | } |
| | | .weak-passwords { |
| | | color: #dc3545; |
| | | font-style: italic; |
| | | margin-top: 4px; |
| | | line-height: 1.4; |
| | | background: rgba(220, 53, 69, 0.05); |
| | | padding: 6px 8px; |
| | | border-radius: 4px; |
| | | border-left: 3px solid #dc3545; |
| | | } |
| | | /* äºè¯æ¿æ´»é¡µé¢æ ·å¼ */ |
| | | .cloud-card-header { |
| | | display: flex; |
| | | align-items: center; |
| | | position: relative; |
| | | } |
| | | .cloud-icon { |
| | | color: #409EFF; |
| | | font-size: 18px; |
| | | } |
| | | .cloud-status { |
| | | margin-left: auto; |
| | | padding: 4px 12px; |
| | | border-radius: 12px; |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | } |
| | | .cloud-status.active { |
| | | background: #f0f9ff; |
| | | color: #1890ff; |
| | | border: 1px solid #91d5ff; |
| | | } |
| | | .cloud-status.inactive { |
| | | background: #fff2f0; |
| | | color: #ff4d4f; |
| | | border: 1px solid #ffccc7; |
| | | } |
| | | .activation-container { |
| | | max-width: 600px; |
| | | margin: 0 auto; |
| | | } |
| | | .activation-form-item { |
| | | margin-bottom: 24px; |
| | | } |
| | | .activation-form-item .el-form-item__label { |
| | | font-weight: 600; |
| | | color: #303133; |
| | | font-size: 14px; |
| | | margin-bottom: 8px; |
| | | padding: 0; |
| | | } |
| | | .activation-input { |
| | | width: 100% !important; |
| | | } |
| | | /deep/.activation-input .el-textarea__inner { |
| | | height: 100px !important; |
| | | border-radius: 8px; |
| | | border: 2px solid #e6e8eb; |
| | | font-size: 14px; |
| | | transition: all 0.3s ease; |
| | | padding-left: 10px; |
| | | } |
| | | .activation-input .el-textarea__inner:focus { |
| | | border-color: #409EFF; |
| | | box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1); |
| | | } |
| | | .activation-input .el-input__prefix { |
| | | display: flex; |
| | | align-items: center; |
| | | left: 12px; |
| | | color: #909399; |
| | | } |
| | | .activation-tips { |
| | | margin-top: 12px; |
| | | padding: 16px; |
| | | background: #f8f9fa; |
| | | border-radius: 8px; |
| | | border-left: 4px solid #409EFF; |
| | | } |
| | | .tip-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-bottom: 8px; |
| | | font-size: 13px; |
| | | color: #606266; |
| | | line-height: 1.4; |
| | | } |
| | | .tip-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | .tip-item i { |
| | | margin-right: 8px; |
| | | margin-top: 2px; |
| | | color: #409EFF; |
| | | font-size: 14px; |
| | | } |
| | | .activation-action-section { |
| | | text-align: center; |
| | | padding: 24px 0; |
| | | border-top: 1px solid #f0f0f0; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | margin: 20px 0; |
| | | } |
| | | .background-upload-section { |
| | | padding: 20px 0; |
| | | } |
| | | .upload-area { |
| | | margin-bottom: 20px; |
| | | } |
| | | .background-upload { |
| | | display: inline-block; |
| | | } |
| | | .file-info { |
| | | margin-top: 12px; |
| | | padding: 8px 12px; |
| | | background: #f5f7fa; |
| | | border-radius: 6px; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | color: #606266; |
| | | font-size: 13px; |
| | | } |
| | | .file-info i { |
| | | color: #409EFF; |
| | | } |
| | | .upload-actions { |
| | | margin-bottom: 16px; |
| | | } |
| | | .upload-tips { |
| | | padding: 12px; |
| | | background: #f0f9ff; |
| | | border-radius: 6px; |
| | | border-left: 3px solid #409EFF; |
| | | } |
| | | .upload-tips p { |
| | | margin: 0; |
| | | color: #606266; |
| | | font-size: 13px; |
| | | line-height: 1.5; |
| | | } |
| | | .activation-btn { |
| | | height: 44px; |
| | | padding: 0 32px; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | border-radius: 8px; |
| | | background: linear-gradient(135deg, #409EFF, #66b1ff); |
| | | border: none; |
| | | box-shadow: 0 2px 8px rgba(64, 158, 255, 0.3); |
| | | transition: all 0.3s ease; |
| | | } |
| | | .activation-btn:hover:not(.is-disabled) { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 4px 12px rgba(64, 158, 255, 0.4); |
| | | } |
| | | .activation-btn:active:not(.is-disabled) { |
| | | transform: translateY(0); |
| | | } |
| | | .action-helpers { |
| | | margin-top: 16px; |
| | | display: flex; |
| | | justify-content: center; |
| | | gap: 16px; |
| | | } |
| | | .helper-btn { |
| | | color: #606266; |
| | | font-size: 13px; |
| | | transition: color 0.3s ease; |
| | | } |
| | | .helper-btn:hover { |
| | | color: #409EFF; |
| | | } |
| | | .activation-result { |
| | | padding: 16px; |
| | | border-radius: 8px; |
| | | margin-top: 20px; |
| | | display: flex; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | text-align: center; |
| | | animation: fadeIn 0.5s ease; |
| | | } |
| | | .activation-result.success { |
| | | background: #f6ffed; |
| | | border: 1px solid #b7eb8f; |
| | | color: #52c41a; |
| | | } |
| | | .activation-result.error { |
| | | background: #fff2f0; |
| | | border: 1px solid #ffccc7; |
| | | color: #ff4d4f; |
| | | } |
| | | .activation-result i { |
| | | font-size: 24px; |
| | | margin-bottom: 8px; |
| | | } |
| | | .result-details { |
| | | margin-top: 8px; |
| | | font-size: 12px; |
| | | color: #8c8c8c; |
| | | line-height: 1.4; |
| | | } |
| | | .timezone-selects { |
| | | display: flex; |
| | | gap: 12px; |
| | | } |
| | | .timezone-selects .el-select { |
| | | flex: 1; |
| | | } |
| | | @keyframes fadeIn { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(-10px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .activation-container { |
| | | max-width: 100%; |
| | | } |
| | | .action-helpers { |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | } |
| | | .activation-btn { |
| | | width: 100%; |
| | | max-width: 280px; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div id="device-control-panel"> |
| | | <!-- æ ç¾é¡µ --> |
| | | <el-tabs v-model="activeTab" type="border-card" class="main-tabs" @tab-click="handleClick"> |
| | | <!-- è¿ç¨æ§å¶æ ç¾ --> |
| | | <el-tab-pane :label="$t('control.remoteControl')" name="remote"> |
| | | <div class="remote-control"> |
| | | <el-row :gutter="20"> |
| | | <!-- éå¯è®¾å¤ --> |
| | | <el-col :span="8"> |
| | | <div class="control-card restart-card" @click="handleRestart" :class="{ 'loading': loading.restart }"> |
| | | <div class="card-content"> |
| | | <div class="card-icon"> |
| | | <i class="el-icon-refresh"></i> |
| | | </div> |
| | | <h3>{{ $t('control.restart') }}</h3> |
| | | <p class="card-description">{{ $t('control.restartTips') }}</p> |
| | | <div class="card-hover-effect"> |
| | | <span>{{ $t('control.clickToRestart') }}</span> |
| | | </div> |
| | | <div v-if="loading.restart" class="loading-overlay"> |
| | | <i class="fas fa-spinner"></i> |
| | | <div class="loading-text">{{ $t('control.restarting') }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | |
| | | <!-- è¿ç¨å¼é¨ --> |
| | | <el-col :span="8"> |
| | | <div class="control-card open-card" @click="handleRemoteOpen" :class="{ 'loading': loading.remoteOpen }"> |
| | | <div class="card-content"> |
| | | <div class="card-icon"> |
| | | <i class="el-icon-unlock"></i> |
| | | </div> |
| | | <h3>{{ $t('control.remoteOpen') }}</h3> |
| | | <p class="card-description">{{ $t('control.remoteTips') }}</p> |
| | | <div class="card-hover-effect"> |
| | | <span>{{ $t('control.clickToOpen') }}</span> |
| | | </div> |
| | | <div v-if="loading.remoteOpen" class="loading-overlay"> |
| | | <i class="fas fa-spinner"></i> |
| | | <div class="loading-text">{{ $t('control.opening') }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | |
| | | <!-- 设å¤éç½® --> |
| | | <el-col :span="8"> |
| | | <div class="control-card reset-card" @click="handleReset" :class="{ 'loading': loading.reset }"> |
| | | <div class="card-content"> |
| | | <div class="card-icon"> |
| | | <i class="el-icon-delete"></i> |
| | | </div> |
| | | <h3>{{ $t('control.reset') }}</h3> |
| | | <p class="card-description">{{ $t('control.resetTips') }}</p> |
| | | <div class="card-hover-effect"> |
| | | <span>{{ $t('control.clickToReset') }}</span> |
| | | </div> |
| | | <div v-if="loading.reset" class="loading-overlay"> |
| | | <i class="fas fa-spinner"></i> |
| | | <div class="loading-text">{{ $t('control.reseting') }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- 设å¤å级æ ç¾ --> |
| | | <el-tab-pane :label="$t('control.firmwareUpgrade')" name="upgrade"> |
| | | <div class="firmware-upgrade"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-card class="upgrade-card" shadow="never"> |
| | | <h3><i class="fas fa-cloud-download-alt"></i>{{ $t('control.urlUpgrade') }}</h3> |
| | | <el-form ref="upgradeForm" :model="upgradeForm" :rules="upgradeRules" label-position="top" |
| | | class="upgrade-form"> |
| | | |
| | | <el-form-item :label="$t('control.firmwareUrl')" prop="url"> |
| | | <el-input v-model="upgradeForm.url" placeholder="https://example.com/firmware.dpk" clearable> |
| | | <i slot="prefix" class="el-input__icon el-icon-link"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item :label="$t('control.md5Checksum')" prop="md5"> |
| | | <el-input v-model="upgradeForm.md5" :placeholder="$t('common.placeholder')" clearable> |
| | | <i slot="prefix" class="el-input__icon el-icon-key"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button type="primary" @click="submitUpgrade" :loading="loading.upgrade" style="width: 100%"> |
| | | {{ $t('control.startUpgrade') }} |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-card class="upgrade-card" shadow="never"> |
| | | <h3><i class="fas fa-info-circle"></i> {{ $t('control.fileUpgrade') }}</h3> |
| | | <div class="upload-area" @click="triggerFileUpload"> |
| | | <div class="upload-icon"> |
| | | <i class="el-icon-upload"></i> |
| | | </div> |
| | | <div class="upload-text">{{ $t('control.uploadFile') }}</div> |
| | | <div class="upload-hint">{{ $t('control.formatFile') }}</div> |
| | | <input type="file" ref="fileInput" style="display: none" accept=".zip,.dpk" |
| | | @change="handleFileUpload"> |
| | | </div> |
| | | <el-form> |
| | | <el-form-item :label="$t('control.md5Checksum')"> |
| | | <el-input v-model="fileMd5" :placeholder="$t('common.placeholder')" clearable> |
| | | <i slot="prefix" class="el-input__icon el-icon-key"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div v-if="uploadedFile" class="file-info"> |
| | | <div class="file-info-item"> |
| | | <div class="file-label">{{ $t('control.fileName') }}:</div> |
| | | <div class="file-value">{{ uploadedFile.name }}</div> |
| | | </div> |
| | | <div class="file-info-item"> |
| | | <div class="file-label">{{ $t('control.size') }}:</div> |
| | | <div class="file-value">{{ formatFileSize(uploadedFile.size) }}</div> |
| | | </div> |
| | | <!-- <div class="file-info-item"> |
| | | <div class="file-label">ç±»å:</div> |
| | | <div class="file-value">{{ uploadedFile.type || 'æªç¥ç±»å' }}</div> |
| | | </div> |
| | | <div class="file-info-item"> |
| | | <div class="file-label">MD5:</div> |
| | | <div class="file-value">{{ fileMd5 || '计ç®ä¸...' }}</div> |
| | | </div> |
| | | <div class="file-info-item"> |
| | | <div class="file-label">URL:</div> |
| | | <div class="file-value">{{ fileUrl || 'å¾
çæ...' }}</div> |
| | | </div> --> |
| | | </div> |
| | | |
| | | <div v-if="uploadedFile" class="upload-actions"> |
| | | <el-button @click="clearUpload">{{ $t('control.clearFile') }}</el-button> |
| | | <el-button type="primary" @click="submitFileUpgrade" :loading="loading.fileUpgrade"> |
| | | {{ loading.fileUpgrade ? $t('control.uploading') : $t('control.uploadAndUpgrade') }} |
| | | </el-button> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | |
| | | <!-- éç½®ç¡®è®¤å¯¹è¯æ¡ --> |
| | | <el-dialog :title="$t('control.resetConfirm')" :visible.sync="resetDialogVisible" width="30%" |
| | | :close-on-click-modal="false" custom-class="reset-dialog"> |
| | | |
| | | <div class="reset-warning"> |
| | | <el-alert :title="$t('control.resetWarningTitle')" type="warning" :description="$t('control.resetWarningDesc')" |
| | | show-icon> |
| | | </el-alert> |
| | | |
| | | <el-form ref="resetForm" :model="resetForm" :rules="resetRules" style="margin-top: 20px"> |
| | | <el-form-item :label="$t('control.resetPassword')" prop="password"> |
| | | <el-input v-model="resetForm.password" type="password" show-password |
| | | :placeholder="$t('control.passwordPlaceholder')"> |
| | | </el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="resetDialogVisible = false">{{ $t('basicSetting.cancelButton') }}</el-button> |
| | | <el-button type="danger" @click="confirmReset" :loading="loading.reset">{{ $t('control.confirmResetBtn') |
| | | }}</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { resetObjectValues, throttle } from '@/utils/index.js' |
| | | export default { |
| | | name: 'Control', |
| | | data () { |
| | | return { |
| | | activeTab: 'remote', |
| | | // è¡¨åæ°æ® |
| | | upgradeForm: { |
| | | type: 0, |
| | | url: '', |
| | | md5: '' |
| | | }, |
| | | |
| | | fileMd5: '', |
| | | |
| | | resetForm: { |
| | | password: '' |
| | | }, |
| | | |
| | | // å¯¹è¯æ¡ç¶æ |
| | | resetDialogVisible: false, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: { |
| | | restart: false, |
| | | remoteOpen: false, |
| | | upgrade: false, |
| | | reset: false, |
| | | fileUpgrade: false, |
| | | }, |
| | | |
| | | // 表åéªè¯è§å |
| | | upgradeRules: { |
| | | url: [ |
| | | { required: true, message: this.$t('control.urlRequired'), trigger: 'blur' }, |
| | | { type: 'url', message: this.$t('control.urlInvalid'), trigger: 'blur' } |
| | | ], |
| | | md5: [ |
| | | { required: true, message: this.$t('control.md5Required'), trigger: 'blur' }, |
| | | { pattern: /^[a-fA-F0-9]{32}$/, message: this.$t('control.md5Invalid'), trigger: 'blur' } |
| | | ], |
| | | password: [ |
| | | { required: true, message: this.$t('control.passwordRequired'), trigger: 'blur' } |
| | | ] |
| | | }, |
| | | |
| | | resetRules: { |
| | | password: [ |
| | | { required: true, message: this.$t('control.passwordRequired'), trigger: 'blur' } |
| | | ] |
| | | }, |
| | | |
| | | uploadedFile: '' |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | // å¤çéå¯ |
| | | handleRestart () { |
| | | this.$confirm( |
| | | this.$t('control.restartConfirm'), |
| | | this.$t('control.restart'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | this.loading.restart = true; |
| | | const res = await this.$http.post("/control", { data: { command: 0 } }); |
| | | if (res.code == 200) { |
| | | this.loading.restart = false; |
| | | this.$message.success(this.$t('control.restartSuccess')); |
| | | } else { |
| | | this.loading.restart = false; |
| | | this.$message.success(this.$t('control.restartFailed')); |
| | | } |
| | | }).catch(() => { |
| | | // åæ¶æä½ |
| | | this.loading.restart = false; |
| | | }); |
| | | }, |
| | | |
| | | // å¤çè¿ç¨å¼é¨ |
| | | handleRemoteOpen () { |
| | | this.$confirm( |
| | | this.$t('control.openConfirm'), |
| | | this.$t('control.remoteOpen'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | this.loading.remoteOpen = true; |
| | | const res = await this.$http.post("/control", { data: { command: 1 } }); |
| | | if (res.code == 200) { |
| | | this.loading.remoteOpen = false; |
| | | this.$message.success(this.$t('control.remoteOpenSuccess')); |
| | | } else { |
| | | this.loading.remoteOpen = false; |
| | | this.$message.success(this.$t('control.remoteOpenFailed')); |
| | | } |
| | | }).catch(() => { |
| | | // åæ¶æä½ |
| | | this.loading.remoteOpen = false |
| | | }); |
| | | }, |
| | | |
| | | // å¤ç设å¤éç½® |
| | | handleReset () { |
| | | let that = this |
| | | this.$confirm( |
| | | this.$t('control.resetConfirm') + this.$t('control.resetWillOut'), |
| | | this.$t('control.reset'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | this.loading.reset = true; |
| | | const res = await this.$http.post("/control", { data: { command: 4 } }); |
| | | if (res.code == 200) { |
| | | this.loading.reset = false; |
| | | this.$message.success(this.$t('control.resetSuccess')); |
| | | setTimeout(() => { |
| | | that.$router.push('/login') |
| | | sessionStorage.removeItem("token") |
| | | sessionStorage.removeItem("publicConfig") |
| | | }, 1000) |
| | | } else { |
| | | this.loading.reset = false; |
| | | this.$message.success(this.$t('control.resetFailed')); |
| | | } |
| | | }).catch(() => { |
| | | // åæ¶æä½ |
| | | this.loading.reset = false; |
| | | }); |
| | | }, |
| | | |
| | | handleClick () { |
| | | if (this.$refs.upgradeForm) { |
| | | this.$refs.upgradeForm.clearValidate(); |
| | | } |
| | | }, |
| | | |
| | | // æäº¤å级 |
| | | submitUpgrade: throttle(function () { |
| | | let that = this |
| | | this.$refs.upgradeForm.validate((valid) => { |
| | | if (valid) { |
| | | this.$confirm( |
| | | this.$t('control.upgradeConfirm'), |
| | | this.$t('control.firmwareUpgrade'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'primary' |
| | | } |
| | | ).then(async () => { |
| | | that.loading.upgrade = true; |
| | | const res = await that.$http.post("/upgradeFirmware", { data: that.upgradeForm }); |
| | | if (res.code == 200) { |
| | | that.loading.upgrade = false; |
| | | that.$message.success(that.$t('control.upgradeSuccess')); |
| | | resetObjectValues(that.upgradeForm) |
| | | } else { |
| | | that.$message.error(res.message) |
| | | } |
| | | }).catch(() => { |
| | | // åæ¶æä½ |
| | | that.loading.upgrade = false; |
| | | }); |
| | | } |
| | | }); |
| | | }, 2000), |
| | | |
| | | confirmReset () { }, |
| | | |
| | | triggerFileUpload () { |
| | | this.$refs.fileInput.click(); |
| | | }, |
| | | |
| | | handleFileUpload (event) { |
| | | const file = event.target.files[0]; |
| | | if (!file) return; |
| | | |
| | | // æ£æ¥æä»¶ç±»å |
| | | const validTypes = ['.zip', '.dpk']; |
| | | const fileExtension = '.' + file.name.split('.').pop().toLowerCase(); |
| | | |
| | | if (!validTypes.includes(fileExtension)) { |
| | | this.$message.error(this.$t('control.formatFile')); |
| | | return; |
| | | } |
| | | |
| | | // æ£æ¥æä»¶å¤§å° (500MB) |
| | | if (file.size > 20 * 1024 * 1024) { |
| | | this.$message.error(this.$t('control.formatFile')); |
| | | return; |
| | | } |
| | | this.uploadedFile = file; |
| | | }, |
| | | |
| | | formatFileSize (bytes) { |
| | | if (bytes === 0) return '0 Bytes'; |
| | | const k = 1024; |
| | | const sizes = ['Bytes', 'KB', 'MB', 'GB']; |
| | | const i = Math.floor(Math.log(bytes) / Math.log(k)); |
| | | return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; |
| | | }, |
| | | |
| | | clearUpload () { |
| | | this.uploadedFile = null; |
| | | this.fileMd5 = ''; |
| | | this.fileUrl = ''; |
| | | this.$refs.fileInput.value = ''; |
| | | }, |
| | | |
| | | async submitFileUpgrade () { |
| | | if (!this.uploadedFile) { |
| | | this.$message.warning('请å
éæ©è¦ä¸ä¼ çæä»¶'); |
| | | return; |
| | | } |
| | | if (!this.fileMd5) { |
| | | this.$message.warning(this.$t('control.md5Required')); |
| | | return; |
| | | } |
| | | this.loading.fileUpgrade = true; |
| | | let formData = new FormData() |
| | | // æ·»å æä»¶ |
| | | formData.append('file', this.uploadedFile) |
| | | formData.append('md5', this.fileMd5) |
| | | const res = await this.$http.post("/upload", formData); |
| | | if (res.code == 200) { |
| | | this.loading.fileUpgrade = false; |
| | | this.$message.success(this.$t('control.upgradeSuccess')); |
| | | this.uploadedFile = null |
| | | this.fileMd5 = '' |
| | | } else { |
| | | this.$message.error(res.message) |
| | | this.loading.fileUpgrade = false; |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | #device-control-panel { |
| | | padding: 20px; |
| | | max-width: 100vw; |
| | | } |
| | | |
| | | .device-status { |
| | | display: flex; |
| | | align-items: center; |
| | | background: rgba(16, 16, 48, 0.7); |
| | | padding: 10px 20px; |
| | | border-radius: 30px; |
| | | border: 1px solid rgba(24, 144, 255, 0.3); |
| | | box-shadow: 0 0 15px rgba(24, 144, 255, 0.2); |
| | | } |
| | | |
| | | .status-indicator { |
| | | width: 12px; |
| | | height: 12px; |
| | | border-radius: 50%; |
| | | margin-right: 10px; |
| | | background: var(--themeColor); |
| | | box-shadow: 0 0 10px var(--themeColor); |
| | | animation: pulse 2s infinite; |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0% { |
| | | box-shadow: 0 0 0 0 rgba(24, 144, 255, 0.7); |
| | | } |
| | | |
| | | 70% { |
| | | box-shadow: 0 0 0 10px rgba(64, 224, 208, 0); |
| | | } |
| | | |
| | | 100% { |
| | | box-shadow: 0 0 0 0 rgba(64, 224, 208, 0); |
| | | } |
| | | } |
| | | |
| | | .main-tabs { |
| | | background: rgba(16, 16, 48, 0.7); |
| | | border-radius: 15px; |
| | | border: 1px solid rgba(24, 144, 255, 0.2); |
| | | box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .main-tabs::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 4px; |
| | | background: linear-gradient(90deg, var(--themeColor), #ff8c00, #ff0080); |
| | | } |
| | | |
| | | .el-tabs__header { |
| | | background: rgba(32, 32, 64, 0.5); |
| | | margin: 0; |
| | | border-bottom: 1px solid rgba(24, 144, 255, 0.2); |
| | | } |
| | | |
| | | .el-tabs__item { |
| | | color: #a0a0ff; |
| | | font-weight: 500; |
| | | padding: 0 25px; |
| | | height: 50px; |
| | | line-height: 50px; |
| | | } |
| | | |
| | | .el-tabs__item.is-active { |
| | | color: var(--themeColor); |
| | | background: rgba(24, 144, 255, 0.1); |
| | | } |
| | | |
| | | .el-tabs__active-bar { |
| | | background-color: var(--themeColor); |
| | | height: 3px; |
| | | box-shadow: 0 0 10px var(--themeColor); |
| | | } |
| | | |
| | | .el-tabs__content { |
| | | padding: 30px; |
| | | } |
| | | |
| | | /* è¿ç¨æ§å¶å¡çæ ·å¼ */ |
| | | .remote-control { |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .control-card { |
| | | height: 220px; |
| | | border-radius: 16px; |
| | | cursor: pointer; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | position: relative; |
| | | overflow: hidden; |
| | | box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); |
| | | border: 1px solid transparent; |
| | | background: rgba(32, 32, 64, 0.5); |
| | | } |
| | | |
| | | .control-card::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 4px; |
| | | background: linear-gradient(90deg, var(--themeColor), #ff8c00, #ff0080); |
| | | } |
| | | |
| | | .control-card:hover { |
| | | transform: translateY(-8px) scale(1.02); |
| | | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4); |
| | | border-color: rgba(24, 144, 255, 0.5); |
| | | } |
| | | |
| | | .control-card:active { |
| | | transform: translateY(-2px) scale(0.98); |
| | | } |
| | | |
| | | .control-card.loading { |
| | | cursor: not-allowed; |
| | | opacity: 0.7; |
| | | } |
| | | |
| | | /* å¡çèæ¯æ¸å */ |
| | | .restart-card { |
| | | background: linear-gradient(135deg, rgba(255, 214, 102, 0.1) 0%, rgba(255, 169, 64, 0.1) 100%); |
| | | } |
| | | |
| | | .open-card { |
| | | background: linear-gradient(135deg, rgba(149, 222, 100, 0.1) 0%, rgba(82, 196, 26, 0.1) 100%); |
| | | } |
| | | |
| | | .reset-card { |
| | | background: linear-gradient(135deg, rgba(255, 156, 110, 0.1) 0%, rgba(255, 77, 79, 0.1) 100%); |
| | | } |
| | | |
| | | .card-content { |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | align-items: center; |
| | | position: relative; |
| | | z-index: 2; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .card-icon { |
| | | width: 70px; |
| | | height: 70px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-bottom: 20px; |
| | | background: rgba(255, 255, 255, 0.1); |
| | | backdrop-filter: blur(10px); |
| | | box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | } |
| | | |
| | | .restart-card .card-icon { |
| | | background: linear-gradient(135deg, rgba(255, 214, 102, 0.3) 0%, rgba(255, 169, 64, 0.3) 100%); |
| | | border-color: rgba(255, 214, 102, 0.5); |
| | | } |
| | | |
| | | .open-card .card-icon { |
| | | background: linear-gradient(135deg, rgba(149, 222, 100, 0.3) 0%, rgba(82, 196, 26, 0.3) 100%); |
| | | border-color: rgba(149, 222, 100, 0.5); |
| | | } |
| | | |
| | | .reset-card .card-icon { |
| | | background: linear-gradient(135deg, rgba(255, 156, 110, 0.3) 0%, rgba(255, 77, 79, 0.3) 100%); |
| | | border-color: rgba(255, 156, 110, 0.5); |
| | | } |
| | | |
| | | .card-icon i { |
| | | font-size: 32px; |
| | | color: white; |
| | | text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); |
| | | } |
| | | |
| | | .control-card h3 { |
| | | color: white; |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | margin: 0 0 10px; |
| | | text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); |
| | | } |
| | | |
| | | .card-description { |
| | | color: rgba(255, 255, 255, 0.8); |
| | | font-size: 14px; |
| | | text-align: center; |
| | | line-height: 1.2; |
| | | } |
| | | |
| | | .card-hover-effect { |
| | | position: absolute; |
| | | bottom: 5px; |
| | | opacity: 0; |
| | | transform: translateY(20px); |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .control-card:hover .card-hover-effect { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | |
| | | .card-hover-effect span { |
| | | color: rgba(255, 255, 255, 0.9); |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | background: rgba(0, 0, 0, 0.3); |
| | | padding: 6px 15px; |
| | | border-radius: 20px; |
| | | backdrop-filter: blur(10px); |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | } |
| | | |
| | | .loading-overlay { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: rgba(0, 0, 0, 0.7); |
| | | backdrop-filter: blur(4px); |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | z-index: 3; |
| | | border-radius: 16px; |
| | | } |
| | | |
| | | .loading-overlay i { |
| | | font-size: 40px; |
| | | color: var(--themeColor); |
| | | margin-bottom: 10px; |
| | | animation: spin 1s linear infinite; |
| | | text-shadow: 0 0 10px var(--themeColor); |
| | | } |
| | | |
| | | .loading-text { |
| | | color: #a0a0ff; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | @keyframes spin { |
| | | 0% { |
| | | transform: rotate(0deg); |
| | | } |
| | | |
| | | 100% { |
| | | transform: rotate(360deg); |
| | | } |
| | | } |
| | | |
| | | /* 设å¤åçº§æ ·å¼ */ |
| | | .firmware-upgrade { |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .upgrade-card { |
| | | background: rgba(32, 32, 64, 0.5); |
| | | border-radius: 12px; |
| | | border: 1px solid rgba(24, 144, 255, 0.2); |
| | | box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); |
| | | } |
| | | |
| | | /* .upgrade-card::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 4px; |
| | | background: linear-gradient(90deg, var(--themeColor), #ff8c00, #ff0080); |
| | | border-radius: 12px 12px 0 0; |
| | | } */ |
| | | |
| | | .upgrade-card h3 { |
| | | margin: 0 0 25px; |
| | | color: var(--themeColor); |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .upgrade-card h3 i { |
| | | margin-right: 10px; |
| | | font-size: 24px; |
| | | } |
| | | |
| | | .upgrade-form { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .el-form-item__label { |
| | | color: #a0a0ff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .el-input__inner { |
| | | background: rgba(16, 16, 48, 0.7); |
| | | border: 1px solid rgba(24, 144, 255, 0.3); |
| | | color: #e0e0ff; |
| | | border-radius: 8px; |
| | | } |
| | | |
| | | .el-input__inner:focus { |
| | | border-color: var(--themeColor); |
| | | box-shadow: 0 0 0 1px rgba(24, 144, 255, 0.2); |
| | | } |
| | | |
| | | .el-input__prefix i { |
| | | color: var(--themeColor); |
| | | } |
| | | |
| | | .el-button { |
| | | border-radius: 8px; |
| | | font-weight: 500; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .el-button--primary { |
| | | background: var(--themeColor); |
| | | border: none; |
| | | box-shadow: 0 4px 15px rgba(24, 144, 255, 0.3); |
| | | } |
| | | |
| | | .el-button--primary:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 6px 20px rgba(24, 144, 255, 0.4); |
| | | } |
| | | |
| | | /* éç½®å¯¹è¯æ¡æ ·å¼ */ |
| | | .reset-dialog .el-dialog { |
| | | background: rgba(16, 16, 48, 0.9); |
| | | border-radius: 15px; |
| | | border: 1px solid rgba(24, 144, 255, 0.3); |
| | | box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); |
| | | backdrop-filter: blur(10px); |
| | | } |
| | | |
| | | .reset-dialog .el-dialog__header { |
| | | background: rgba(32, 32, 64, 0.7); |
| | | border-bottom: 1px solid rgba(24, 144, 255, 0.2); |
| | | padding: 15px 20px; |
| | | border-radius: 15px 15px 0 0; |
| | | } |
| | | |
| | | .reset-dialog .el-dialog__title { |
| | | color: #ff8c00; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .reset-dialog .el-dialog__body { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .reset-warning { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .el-alert { |
| | | background: rgba(255, 154, 110, 0.1); |
| | | border: 1px solid rgba(255, 154, 110, 0.3); |
| | | color: #ff8c00; |
| | | } |
| | | |
| | | .el-alert__title { |
| | | color: #ff8c00; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .reset-dialog .el-dialog__footer { |
| | | background: rgba(32, 32, 64, 0.7); |
| | | border-top: 1px solid rgba(24, 144, 255, 0.2); |
| | | padding: 15px 20px; |
| | | border-radius: 0 0 15px 15px; |
| | | } |
| | | |
| | | .el-button--danger { |
| | | background: linear-gradient(135deg, #ff6b6b, #ff4757); |
| | | border: none; |
| | | box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); |
| | | } |
| | | |
| | | .el-button--danger:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 6px 20px rgba(255, 107, 107, 0.4); |
| | | } |
| | | |
| | | /* æä»¶ä¸ä¼ æ ·å¼ */ |
| | | .upload-card { |
| | | background: rgba(32, 32, 64, 0.5); |
| | | border-radius: 12px; |
| | | border: 1px solid rgba(64, 224, 208, 0.2); |
| | | box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); |
| | | padding: 25px; |
| | | } |
| | | |
| | | .upload-card::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 4px; |
| | | background: linear-gradient(90deg, #ff8c00, #ff0080, var(--themeColor)); |
| | | border-radius: 12px 12px 0 0; |
| | | } |
| | | |
| | | .upload-area { |
| | | border: 2px dashed rgba(24, 144, 255, 0.4); |
| | | border-radius: 12px; |
| | | padding: 40px 20px; |
| | | text-align: center; |
| | | transition: all 0.3s ease; |
| | | background: rgba(16, 16, 48, 0.3); |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .upload-area:hover { |
| | | border-color: var(--themeColor); |
| | | background: rgba(16, 16, 48, 0.5); |
| | | } |
| | | |
| | | .upload-icon { |
| | | font-size: 48px; |
| | | color: var(--themeColor); |
| | | margin-bottom: 15px; |
| | | text-shadow: 0 0 10px rgba(24, 144, 255, 0.5); |
| | | } |
| | | |
| | | .upload-text { |
| | | color: #a0a0ff; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .upload-hint { |
| | | color: #8080cc; |
| | | font-size: 12px; |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .file-info { |
| | | margin-top: 20px; |
| | | padding: 15px; |
| | | background: rgba(16, 16, 48, 0.7); |
| | | border-radius: 8px; |
| | | border: 1px solid rgba(64, 224, 208, 0.2); |
| | | } |
| | | |
| | | .file-info-item { |
| | | display: flex; |
| | | margin-bottom: 8px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .file-info-item:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .file-label { |
| | | color: #a0a0ff; |
| | | width: 80px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .file-value { |
| | | color: #e0e0ff; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .upload-actions { |
| | | margin-top: 20px; |
| | | display: flex; |
| | | gap: 10px; |
| | | } |
| | | |
| | | .upload-actions .el-button { |
| | | flex: 1; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | #device-control-panel { |
| | | padding: 15px; |
| | | } |
| | | |
| | | .el-tabs__content { |
| | | padding: 20px 15px; |
| | | } |
| | | |
| | | .control-card { |
| | | height: 180px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .card-icon { |
| | | width: 60px; |
| | | height: 60px; |
| | | } |
| | | |
| | | .card-icon i { |
| | | font-size: 28px; |
| | | } |
| | | |
| | | .control-card h3 { |
| | | font-size: 18px; |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 480px) { |
| | | .control-card { |
| | | height: 160px; |
| | | } |
| | | |
| | | .card-icon { |
| | | width: 50px; |
| | | height: 50px; |
| | | margin-bottom: 15px; |
| | | } |
| | | |
| | | .card-icon i { |
| | | font-size: 24px; |
| | | } |
| | | |
| | | .control-card h3 { |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .card-description { |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="index"> |
| | | <el-container direction="vertical"> |
| | | <!-- å·¦ä¾§å¯¼èªæ --> |
| | | <el-aside class="modern-sidebar asideL"> |
| | | <div class="sidebar-header"> |
| | | <div class="system-logo"> |
| | | <i class="el-icon-monitor"></i> |
| | | <span class="system-name">{{ $t('aside.systemname') }}</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-menu v-if="num == 1" router unique-opened :default-active="activeIndex" class="modern-menu"> |
| | | <el-menu-item class="modern-menu-item" :index="item.path" v-for="item in filteredMenu" :key="item.name" |
| | | @click="changeItem(item)"> |
| | | <i :class="getMenuIcon(item.path)" class="menu-icon"></i> |
| | | <span class="menu-title">{{ item.name }}</span> |
| | | <div class="menu-indicator"></div> |
| | | </el-menu-item> |
| | | </el-menu> |
| | | |
| | | <el-menu v-if="num == 2" router unique-opened :default-active="activeIndex2" class="modern-menu"> |
| | | <el-menu-item class="modern-menu-item" :index="item.path" v-for="item in personMenuList" :key="item.name" |
| | | @click="changeItem(item)"> |
| | | <i :class="getMenuIcon(item.path)" class="menu-icon"></i> |
| | | <span class="menu-title">{{ item.name }}</span> |
| | | <div class="menu-indicator"></div> |
| | | </el-menu-item> |
| | | </el-menu> |
| | | </el-aside> |
| | | |
| | | <el-container class="asideR"> |
| | | <!-- 头é¨å¯¼èªæ --> |
| | | <el-header class="modern-header rightTop"> |
| | | <div class="header-left"> |
| | | <div class="page-title"> |
| | | <span>{{ getCurrentPageTitle() }}</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="header-right"> |
| | | <!-- <div class="lang-box"> |
| | | <el-select v-model="language" size="mini" @change="changeLang"> |
| | | <el-option :label="$t('common.chinese')" value="zh"></el-option> |
| | | <el-option :label="$t('common.english')" value="en"></el-option> |
| | | <el-option :label="$t('common.spanish')" value="es"></el-option> |
| | | <el-option :label="$t('common.french')" value="fr"></el-option> |
| | | <el-option :label="$t('common.german')" value="de"></el-option> |
| | | <el-option :label="$t('common.russian')" value="ru"></el-option> |
| | | <el-option :label="$t('common.arabic')" value="ar"></el-option> |
| | | <el-option :label="$t('common.portuguese')" value="pt"></el-option> |
| | | <el-option :label="$t('common.korean')" value="ko"></el-option> |
| | | </el-select> |
| | | </div> --> |
| | | <div class="header-actions"> |
| | | <el-button class="logout-btn" type="text" @click="logout"> |
| | | <i class="el-icon-switch-button"></i> |
| | | {{ $t('aside.quit') }} |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </el-header> |
| | | |
| | | <!-- 主ä½é¨å --> |
| | | <el-main class="modern-main pagemain"> |
| | | <router-view></router-view> |
| | | </el-main> |
| | | </el-container> |
| | | </el-container> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | name: "Home", |
| | | computed: { |
| | | // 计ç®å±æ§è¿æ»¤èå |
| | | filteredMenu() { |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { model } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | return this.systemMenuList.filter(item => { |
| | | // æ£æ¥åå· |
| | | if (item.allowedModels && !item.allowedModels.includes(model)) { |
| | | return false |
| | | } |
| | | return true |
| | | }) |
| | | } |
| | | }, |
| | | data () { |
| | | return { |
| | | num: '', |
| | | systemMenuList: [ |
| | | // { |
| | | // path: "/monitor", |
| | | // name: this.$t('aside.deviceMonitoring') |
| | | // }, |
| | | { |
| | | path: "/config", |
| | | name: this.$t('aside.basicSetting') |
| | | }, |
| | | { |
| | | path: "/control", |
| | | name: this.$t('aside.deviceControl') |
| | | }, |
| | | { |
| | | path: "/person", |
| | | name: this.$t('aside.workerSetting') |
| | | }, |
| | | { |
| | | path: "/record", |
| | | name: this.$t('aside.recordManagement') |
| | | }, |
| | | { |
| | | path: "/security", |
| | | name: this.$t('aside.securityManagement'), |
| | | allowedModels: ['vf105', 'vf114'] |
| | | } |
| | | ], |
| | | activeIndex: "/", |
| | | activeIndex2: "/", |
| | | indexx: '/', |
| | | language: "zh" |
| | | }; |
| | | }, |
| | | // æ£æµè·¯ç±åå |
| | | watch: { |
| | | $route () { |
| | | this.setCurrentRoute(); |
| | | }, |
| | | }, |
| | | created () { |
| | | this.setCurrentRoute(); |
| | | this.num = 1 |
| | | }, |
| | | mounted () { |
| | | document.getElementsByTagName('body')[0].style.setProperty('--themeColor', "#1890ff"); |
| | | }, |
| | | methods: { |
| | | // è·åèå徿 |
| | | getMenuIcon (path) { |
| | | const iconMap = { |
| | | // '/monitor': 'el-icon-video-camera', |
| | | '/config': 'el-icon-setting', |
| | | '/person': 'el-icon-user-solid', |
| | | '/control': 'el-icon-key', |
| | | '/record': 'el-icon-tickets', |
| | | '/security': 'el-icon-connection' |
| | | } |
| | | return iconMap[path] || 'el-icon-menu' |
| | | }, |
| | | |
| | | // è·åå½å页颿 é¢ |
| | | getCurrentPageTitle () { |
| | | const titleMap = { |
| | | // '/monitor': this.$t('aside.deviceMonitoring'), |
| | | '/config': this.$t('aside.basicSetting'), |
| | | '/person': this.$t('aside.workerSetting'), |
| | | '/control': this.$t('aside.deviceControl'), |
| | | '/record': this.$t('aside.recordManagement'), |
| | | '/security': this.$t('aside.securityManagement'), |
| | | } |
| | | return titleMap[this.$route.path] || this.$t('aside.basicSetting') |
| | | }, |
| | | |
| | | changeItem (item) { |
| | | this.indexx = item.path |
| | | this.activeIndex = item.path |
| | | console.log(this.indexx); |
| | | }, |
| | | |
| | | setCurrentRoute () { |
| | | this.activeIndex = this.$route.path; // éè¿ä»å°±å¯ä»¥çå¬å°å½åè·¯ç±ç¶æå¹¶æ¿æ´»å½åèå |
| | | this.activeIndex2 = this.$route.path; |
| | | this.indexx = this.$route.path; |
| | | }, |
| | | |
| | | // éåºç»å½ |
| | | logout () { |
| | | const that = this |
| | | that.$confirm(this.$t('aside.tips_msg'), this.$t('aside.tips'), { |
| | | type: "warning" |
| | | }).then(async () => { |
| | | that.toDoLogout() |
| | | }).catch(() => { |
| | | return false |
| | | }) |
| | | }, |
| | | |
| | | toDoLogout () { |
| | | this.$router.push('/login') |
| | | sessionStorage.removeItem("token") |
| | | sessionStorage.removeItem("publicConfig") |
| | | }, |
| | | |
| | | changeLang () { |
| | | this.$i18n.locale = this.language |
| | | sessionStorage.setItem('language', this.language) |
| | | this.systemMenuList = [ |
| | | // { |
| | | // path: "/monitor", |
| | | // name: this.$t('aside.deviceMonitoring') |
| | | // }, |
| | | { |
| | | path: "/config", |
| | | name: this.$t('aside.basicSetting') |
| | | }, |
| | | { |
| | | path: "/control", |
| | | name: this.$t('aside.deviceControl') |
| | | }, |
| | | { |
| | | path: "/person", |
| | | name: this.$t('aside.workerSetting') |
| | | }, |
| | | { |
| | | path: "/record", |
| | | name: this.$t('aside.recordManagement') |
| | | }, |
| | | { |
| | | path: "/security", |
| | | name: this.$t('aside.securityManagement'), |
| | | allowedModels: ['vf105', 'vf114'] |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | }; |
| | | </script> |
| | | <style lang="less" scoped> |
| | | @import '../../assets/styles/theme.css'; |
| | | |
| | | html, |
| | | #app, |
| | | body { |
| | | height: 100%; |
| | | } |
| | | |
| | | .index { |
| | | height: 100vh; |
| | | background: var(--bg-secondary); |
| | | } |
| | | |
| | | .el-container { |
| | | height: 100%; |
| | | } |
| | | |
| | | /* ä¾§è¾¹æ æ ·å¼ */ |
| | | .asideL { |
| | | width: 260px !important; |
| | | height: 100%; |
| | | position: fixed; |
| | | left: 0; |
| | | background: linear-gradient(180deg, var(--bg-sidebar) 0%, #0c1426 100%); |
| | | box-shadow: var(--shadow-lg); |
| | | z-index: 1000; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | .sidebar-header { |
| | | padding: var(--spacing-lg); |
| | | border-bottom: 1px solid rgba(255, 255, 255, 0.1); |
| | | margin-bottom: var(--spacing-md); |
| | | } |
| | | |
| | | .system-logo { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: var(--spacing-md); |
| | | color: var(--text-white); |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | |
| | | i { |
| | | font-size: 24px; |
| | | color: var(--primary-color); |
| | | } |
| | | } |
| | | |
| | | .system-name { |
| | | font-size: 16px; |
| | | letter-spacing: 0.5px; |
| | | } |
| | | |
| | | /* èåæ ·å¼ */ |
| | | .modern-menu { |
| | | background: transparent !important; |
| | | border: none !important; |
| | | padding: 0 var(--spacing-md); |
| | | } |
| | | |
| | | .modern-menu-item { |
| | | height: 48px !important; |
| | | line-height: 48px !important; |
| | | margin-bottom: var(--spacing-xs) !important; |
| | | border-radius: var(--radius-md) !important; |
| | | color: rgba(255, 255, 255, 0.7) !important; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; |
| | | position: relative !important; |
| | | overflow: hidden !important; |
| | | |
| | | &:hover { |
| | | color: var(--text-white) !important; |
| | | background: rgba(255, 255, 255, 0.1) !important; |
| | | transform: translateX(4px); |
| | | } |
| | | |
| | | &.is-active { |
| | | color: var(--text-white) !important; |
| | | background: var(--primary-color) !important; |
| | | box-shadow: var(--shadow-md); |
| | | |
| | | .menu-indicator { |
| | | opacity: 1; |
| | | transform: scaleY(1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .menu-icon { |
| | | font-size: 18px; |
| | | margin-right: var(--spacing-md); |
| | | width: 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .menu-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | flex: 1; |
| | | } |
| | | |
| | | .menu-indicator { |
| | | position: absolute; |
| | | right: 0; |
| | | top: 50%; |
| | | transform: translate(0, -50%) !important; |
| | | width: 3px; |
| | | height: 20px; |
| | | background: var(--text-white); |
| | | border-radius: 2px; |
| | | opacity: 0; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | /* 主å
容åºå */ |
| | | .asideR { |
| | | margin-left: 260px; |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | /* 头鍿 ·å¼ */ |
| | | .rightTop { |
| | | height: 64px !important; |
| | | padding: 0 var(--spacing-lg); |
| | | background: var(--bg-header); |
| | | border-bottom: 1px solid var(--border-light); |
| | | box-shadow: var(--shadow-sm); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | z-index: 999; |
| | | } |
| | | |
| | | .header-left { |
| | | flex: 1; |
| | | } |
| | | |
| | | .page-title { |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | color: var(--text-primary); |
| | | display: flex; |
| | | align-items: center; |
| | | gap: var(--spacing-sm); |
| | | |
| | | &::before { |
| | | content: ''; |
| | | width: 4px; |
| | | height: 20px; |
| | | background: var(--primary-color); |
| | | border-radius: 2px; |
| | | } |
| | | } |
| | | |
| | | .header-right { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .header-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: var(--spacing-lg); |
| | | } |
| | | |
| | | .lang-selector { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: var(--spacing-sm); |
| | | padding: var(--spacing-sm) var(--spacing-md); |
| | | border-radius: var(--radius-md); |
| | | color: var(--text-secondary); |
| | | cursor: pointer; |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | background: var(--bg-tertiary); |
| | | color: var(--text-primary); |
| | | } |
| | | } |
| | | |
| | | .user-info { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: var(--spacing-sm); |
| | | padding: var(--spacing-sm) var(--spacing-md); |
| | | border-radius: var(--radius-md); |
| | | cursor: pointer; |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | background: var(--bg-tertiary); |
| | | } |
| | | } |
| | | |
| | | .user-avatar { |
| | | border: 2px solid var(--border-light); |
| | | } |
| | | |
| | | .user-name { |
| | | font-size: 14px; |
| | | color: var(--text-primary); |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .logout-btn { |
| | | color: var(--error-color) !important; |
| | | font-weight: 500; |
| | | padding: var(--spacing-sm) var(--spacing-md) !important; |
| | | border-radius: var(--radius-md) !important; |
| | | transition: all 0.3s ease !important; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 77, 79, 0.1) !important; |
| | | color: var(--error-color) !important; |
| | | } |
| | | } |
| | | |
| | | /* 主å
容åºå */ |
| | | .modern-main { |
| | | flex: 1; |
| | | padding: var(--spacing-xs) !important; |
| | | background: var(--bg-secondary); |
| | | overflow: auto; |
| | | } |
| | | |
| | | .pagemain { |
| | | height: calc(100vh - 64px) !important; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .asideL { |
| | | width: 240px !important; |
| | | transform: translateX(-100%); |
| | | |
| | | &.mobile-open { |
| | | transform: translateX(0); |
| | | } |
| | | } |
| | | |
| | | .asideR { |
| | | margin-left: 0; |
| | | } |
| | | |
| | | .header-actions { |
| | | gap: var(--spacing-md); |
| | | } |
| | | |
| | | .user-name { |
| | | display: none; |
| | | } |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | .fade-in-up { |
| | | animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | @keyframes fadeInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(30px); |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | /* Element UI ç»ä»¶æ ·å¼è¦ç */ |
| | | /deep/ .el-menu { |
| | | border-right: none !important; |
| | | } |
| | | |
| | | /deep/ .el-menu-item { |
| | | border-left: none !important; |
| | | } |
| | | |
| | | /deep/ .el-dropdown-menu { |
| | | border-radius: var(--radius-md); |
| | | box-shadow: var(--shadow-lg); |
| | | border: 1px solid var(--border-light); |
| | | } |
| | | |
| | | /deep/ .el-dropdown-menu__item { |
| | | padding: var(--spacing-sm) var(--spacing-md); |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | background: var(--bg-tertiary); |
| | | color: var(--primary-color); |
| | | } |
| | | } |
| | | |
| | | /deep/ .el-tooltip__popper { |
| | | background: var(--bg-dark); |
| | | color: var(--text-white); |
| | | border-radius: var(--radius-md); |
| | | box-shadow: var(--shadow-lg); |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div id="login"> |
| | | <!-- è£
饰å
ç´ --> |
| | | <div class="decoration decoration-1"></div> |
| | | <div class="decoration decoration-2"></div> |
| | | <!-- <div class="lang-box">{{ $t('login.lang') }} |
| | | <el-select v-model="language" size="mini" @change="changeLang"> |
| | | <el-option :label="$t('common.chinese')" value="zh"></el-option> |
| | | <el-option :label="$t('common.english')" value="en"></el-option> |
| | | <el-option :label="$t('common.spanish')" value="es"></el-option> |
| | | <el-option :label="$t('common.french')" value="fr"></el-option> |
| | | <el-option :label="$t('common.german')" value="de"></el-option> |
| | | <el-option :label="$t('common.russian')" value="ru"></el-option> |
| | | <el-option :label="$t('common.arabic')" value="ar"></el-option> |
| | | <el-option :label="$t('common.portuguese')" value="pt"></el-option> |
| | | <el-option :label="$t('common.korean')" value="ko"></el-option> |
| | | </el-select> |
| | | </div> --> |
| | | <div class="loginMain"> |
| | | <div class="loginForm"> |
| | | <div class="formTop">{{ $t('login.systemname') }}</div> |
| | | <div class="formMain"> |
| | | <el-form :model="loginForm" status-icon :rules="rulesForm" ref="loginForm"> |
| | | <!-- å¯ç --> |
| | | <el-form-item prop="userPassword" :label="$t('login.pwd')" :label-width="language == 'zh' ? '40px' : '70px'"> |
| | | <el-input type="password" v-model="loginForm.userPassword" :placeholder="$t('login.pwd_label')" |
| | | prefix-icon="iconfont icon-mima"></el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button type="primary" @click="submitForm" class="loginFormBut"> |
| | | {{ $t('login.login') }} |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | data () { |
| | | // å¯ç |
| | | var userPassword = (rule, value, callback) => { |
| | | if (value === "") { |
| | | callback(new Error(this.$t('login.pwd_label'))); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | return { |
| | | language: 'zh', |
| | | loginForm: { |
| | | userPassword: "", |
| | | }, |
| | | // inputéªè¯ |
| | | rulesForm: { |
| | | userPassword: [{ validator: userPassword, trigger: "blur" }], |
| | | }, |
| | | }; |
| | | }, |
| | | created () { |
| | | this.getPublicConfig() |
| | | }, |
| | | mounted () { |
| | | window.addEventListener('keydown', this.keyDown, false); |
| | | }, |
| | | methods: { |
| | | async getPublicConfig() { |
| | | try { |
| | | const res = await this.$http.post('/getPublicConfig', {}) |
| | | if (res.code == 200) { |
| | | sessionStorage.setItem("publicConfig", JSON.stringify(res.data)) |
| | | let { language} = res.data |
| | | this.language = language |
| | | this.$i18n.locale = language |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }, |
| | | |
| | | |
| | | keyDown (e) { |
| | | //妿æ¯åè½¦åæ§è¡ç»å½æ¹æ³ |
| | | if (e.keyCode == 13) { |
| | | e.preventDefault() |
| | | this.submitForm(); |
| | | } |
| | | }, |
| | | |
| | | submitForm () { |
| | | this.$refs.loginForm.validate(async (valid) => { |
| | | if (valid) { |
| | | const res = await this.$http.post("/login", this.loginForm); |
| | | if (res.code == 200) { |
| | | this.$message({ |
| | | message: this.$t('login.success_msg'), |
| | | type: 'success' |
| | | }); |
| | | this.$router.push({ path: "/config" }), |
| | | sessionStorage.setItem("token", res.data.accessToken) |
| | | } else { |
| | | this.$message.error(this.$t('login.error_name')); |
| | | return false |
| | | } |
| | | } else { |
| | | this.$message.error(this.$t('login.error_res')); |
| | | return false |
| | | } |
| | | }); |
| | | } |
| | | |
| | | }, |
| | | destroyed () { |
| | | window.removeEventListener('keydown', this.keyDown, false); |
| | | } |
| | | }; |
| | | </script> |
| | | <style lang="less" scoped> |
| | | #login { |
| | | width: 100%; |
| | | height: 100%; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | background-image: url(../../assets/bg.png); |
| | | background-repeat: no-repeat; |
| | | background-size: cover; |
| | | background-position: center; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | position: relative; |
| | | font-family: 'Helvetica Neue', Arial, sans-serif; |
| | | |
| | | .lang-box { |
| | | position: absolute; |
| | | top: 30px; |
| | | right: 30px; |
| | | font-size: 14px; |
| | | color: white; |
| | | z-index: 10; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .loginMain { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | z-index: 2; |
| | | width: 100%; |
| | | |
| | | .loginForm { |
| | | width: 430px; |
| | | background-color: rgba(255, 255, 255, 0.95); |
| | | border-radius: 16px; |
| | | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2); |
| | | overflow: hidden; |
| | | backdrop-filter: blur(10px); |
| | | border: 1px solid rgba(255, 255, 255, 0.2); |
| | | animation: fadeIn 0.8s ease-out; |
| | | |
| | | .formTop { |
| | | width: 100%; |
| | | font-size: 32px; |
| | | font-weight: 700; |
| | | text-align: center; |
| | | padding: 40px 0 30px; |
| | | color: #333; |
| | | background: linear-gradient(to right, #667eea, #764ba2); |
| | | letter-spacing: 1px; |
| | | } |
| | | |
| | | .formMain { |
| | | width: 80%; |
| | | margin: 0 auto; |
| | | padding-bottom: 40px; |
| | | |
| | | .el-form { |
| | | margin-top: 20px; |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 28px; |
| | | |
| | | .el-form-item__label { |
| | | font-weight: 600; |
| | | color: #555; |
| | | font-size: 14px; |
| | | padding-bottom: 8px; |
| | | display: block; |
| | | } |
| | | |
| | | .el-input { |
| | | width: 100%; |
| | | } |
| | | |
| | | .el-input__inner { |
| | | height: 50px; |
| | | border-radius: 10px; |
| | | border: 2px solid #e1e5e9; |
| | | font-size: 16px; |
| | | padding-left: 45px; |
| | | transition: all 0.3s ease; |
| | | background-color: #f8f9fa; |
| | | } |
| | | |
| | | .el-input__inner:focus { |
| | | border-color: #667eea; |
| | | box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); |
| | | background-color: white; |
| | | } |
| | | |
| | | .el-input__prefix { |
| | | left: 15px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .iconfont { |
| | | font-size: 20px; |
| | | color: #7b8a9b; |
| | | } |
| | | |
| | | .el-input__inner:focus+.el-input__prefix .iconfont { |
| | | color: #667eea; |
| | | } |
| | | |
| | | .loginFormBut { |
| | | width: 100%; |
| | | height: 50px; |
| | | border-radius: 10px; |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | background: linear-gradient(to right, #667eea, #764ba2); |
| | | color: white; |
| | | border: none; |
| | | transition: all 0.3s ease; |
| | | margin-top: 10px; |
| | | letter-spacing: 1px; |
| | | } |
| | | |
| | | .loginFormBut:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 7px 14px rgba(102, 126, 234, 0.3); |
| | | } |
| | | |
| | | .loginFormBut:active { |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @keyframes fadeIn { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(20px); |
| | | } |
| | | |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | #login::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: rgba(0, 0, 0, 0.4); |
| | | z-index: 1; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .loginForm { |
| | | width: 90%; |
| | | max-width: 400px; |
| | | } |
| | | |
| | | .formTop { |
| | | font-size: 28px; |
| | | padding: 30px 0 20px; |
| | | } |
| | | |
| | | .formMain { |
| | | width: 85%; |
| | | } |
| | | |
| | | .el-input__inner { |
| | | height: 46px; |
| | | font-size: 15px; |
| | | } |
| | | |
| | | .loginFormBut { |
| | | height: 46px; |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 480px) { |
| | | .loginForm { |
| | | width: 95%; |
| | | } |
| | | |
| | | .formMain { |
| | | width: 90%; |
| | | } |
| | | |
| | | .lang-box { |
| | | top: 20px; |
| | | right: 20px; |
| | | } |
| | | } |
| | | |
| | | /* æ·»å ä¸äºè£
饰å
ç´ */ |
| | | .decoration { |
| | | position: absolute; |
| | | z-index: 1; |
| | | } |
| | | |
| | | .decoration-1 { |
| | | top: 10%; |
| | | left: 10%; |
| | | width: 80px; |
| | | height: 80px; |
| | | border-radius: 50%; |
| | | background: rgba(255, 255, 255, 0.1); |
| | | } |
| | | |
| | | .decoration-2 { |
| | | bottom: 15%; |
| | | right: 12%; |
| | | width: 120px; |
| | | height: 120px; |
| | | border-radius: 50%; |
| | | background: rgba(255, 255, 255, 0.05); |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <div class="container">
|
| | | <div class="dashboard">
|
| | | <div class="card">
|
| | | <div class="card-header">
|
| | | <h2 class="card-title">è®¾å¤æ¦è§</h2>
|
| | | <i class="fas fa-microchip card-icon"></i>
|
| | | </div>
|
| | | <div class="stats-grid">
|
| | | <div class="stat-item">
|
| | | <div class="stat-label">设å¤ç¶æ</div>
|
| | | <div class="stat-value">{{ deviceStatus.online ? 'å¨çº¿' : '离线' }}</div>
|
| | | <div class="stat-label">{{ deviceStatus.online ? 'è¿è¡æ£å¸¸' : '设å¤å¼å¸¸' }}</div>
|
| | | </div>
|
| | | <div class="stat-item">
|
| | | <div class="stat-label">注å人æ°</div>
|
| | | <div class="stat-value">{{ deviceStats.recognitions }}</div>
|
| | | <div class="stat-label">人次</div>
|
| | | </div>
|
| | | <div class="stat-item">
|
| | | <div class="stat-label">ç½ååæ°</div>
|
| | | <div class="stat-value">{{ whitelist.face }} / {{ whitelist.password }} / {{ whitelist.card }}</div>
|
| | | <div class="stat-label">人è¸/å¯ç /å¡ç</div>
|
| | | </div>
|
| | | <div class="stat-item">
|
| | | <div class="stat-label">éè¡è®°å½æ»æ°</div>
|
| | | <div class="stat-value">{{ systemStatus.memory }}</div>
|
| | | <div class="stat-label">æ¡æ°</div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="card">
|
| | | <div class="card-header">
|
| | | <h2 class="card-title">CPU使ç¨ç</h2>
|
| | | <i class="fas fa-tachometer-alt card-icon"></i>
|
| | | </div>
|
| | | <div class="chart-container" id="cpuChart"></div>
|
| | | </div>
|
| | |
|
| | | <div class="card">
|
| | | <div class="card-header">
|
| | | <h2 class="card-title">å
å使ç¨ç</h2>
|
| | | <i class="fas fa-memory card-icon"></i>
|
| | | </div>
|
| | | <div class="chart-container" id="memoryChart"></div>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="main-content">
|
| | | <div class="card">
|
| | | <div class="card-header">
|
| | | <h2 class="card-title">设å¤è¿è¡æ¥å¿</h2>
|
| | | <i class="fas fa-clipboard-list card-icon"></i>
|
| | | </div>
|
| | | <div class="logs-container">
|
| | | <div v-for="log in logs" :key="log.id" :class="['log-item', log.type]">
|
| | | <div class="log-time">{{ log.time }}</div>
|
| | | <div class="log-message">{{ log.message }}</div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="card">
|
| | | <div class="card-header">
|
| | | <h2 class="card-title">设å¤ä¿¡æ¯</h2>
|
| | | <i class="fas fa-server card-icon"></i>
|
| | | </div>
|
| | | <div class="device-info-container">
|
| | | <div class="device-status">
|
| | | <div :class="['status-indicator', deviceStatus.online ? 'status-online pulse' : 'status-offline']"></div>
|
| | | <div class="device-details">
|
| | | <!-- <div class="device-name">{{ deviceInfo.name }}</div> -->
|
| | | <div class="device-id">设å¤SN: {{ deviceInfo.id }} | IP: {{ deviceInfo.ip }}</div>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="info-grid">
|
| | | <div class="info-item">
|
| | | <div class="info-label">设å¤åå·</div>
|
| | | <div class="info-value">{{ deviceInfo.model }}</div>
|
| | | </div>
|
| | | <div class="info-item">
|
| | | <div class="info-label">åºä»¶çæ¬</div>
|
| | | <div class="info-value">{{ deviceInfo.firmware }}</div>
|
| | | </div>
|
| | | <div class="info-item">
|
| | | <div class="info-label">è¿è¡æ¶é´</div>
|
| | | <div class="info-value">{{ deviceInfo.uptime }}</div>
|
| | | </div>
|
| | | <div class="info-item">
|
| | | <div class="info-label">åå¨ç©ºé´</div>
|
| | | <div class="info-value">{{ deviceInfo.storage }}</div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </template>
|
| | | <script>
|
| | | import * as echarts from "echarts";
|
| | | export default {
|
| | | data () {
|
| | | return {
|
| | | currentTime: '',
|
| | | deviceStatus: {
|
| | | online: true
|
| | | },
|
| | | userCount: 888,
|
| | | whitelist: {
|
| | | face: 99,
|
| | | password: 88,
|
| | | card: 66
|
| | | },
|
| | | deviceStats: {
|
| | | recognitions: 1247
|
| | | },
|
| | | systemStatus: {
|
| | | cpu: 45,
|
| | | memory: 62
|
| | | },
|
| | | deviceInfo: {
|
| | | name: '人è¸è¯å«ç»ç«¯-A01',
|
| | | id: 'FRD-2023-A01',
|
| | | ip: '192.168.1.101',
|
| | | model: 'FRD-X3000',
|
| | | firmware: 'v2.5.3',
|
| | | uptime: '15天 8å°æ¶ 32åé',
|
| | | storage: '78% (128GB/164GB)',
|
| | | network: '稳å®',
|
| | | lastMaintenance: '2023-10-28'
|
| | | },
|
| | | logs: [
|
| | | { id: 1, time: '2023-11-15 14:23:45', message: '人è¸è¯å«æå - ç¨æ·: å¼ ä¸', type: 'normal' },
|
| | | { id: 2, time: '2023-11-15 14:22:30', message: 'CPU使ç¨çè¶
è¿80%', type: 'warning' },
|
| | | { id: 3, time: '2023-11-15 14:21:15', message: 'ç½ç»è¿æ¥çæä¸æï¼å·²æ¢å¤', type: 'error' },
|
| | | { id: 4, time: '2023-11-15 14:20:05', message: 'ç³»ç»éå¯å®æ', type: 'normal' },
|
| | | { id: 5, time: '2023-11-15 14:19:50', message: 'å
å使ç¨çè¶
è¿éå¼', type: 'warning' },
|
| | | { id: 6, time: '2023-11-15 14:18:30', message: 'è¯å«å¼ææ´æ°å®æ', type: 'normal' },
|
| | | { id: 7, time: '2023-11-15 14:17:15', message: '人è¸è¯å«æå - ç¨æ·: æå', type: 'normal' },
|
| | | { id: 8, time: '2023-11-15 14:16:20', message: 'æ°æ®åºå¤ä»½å®æ', type: 'normal' }
|
| | | ],
|
| | | cpuChart: null,
|
| | | memoryChart: null,
|
| | | cpuData: [],
|
| | | memoryData: [],
|
| | | timeData: []
|
| | | }
|
| | | },
|
| | | mounted () {
|
| | | this.updateTime();
|
| | | setInterval(this.updateTime, 1000);
|
| | | this.initCharts();
|
| | | this.simulateDataUpdate();
|
| | | // 模æå®æ¶æ°æ®æ´æ°
|
| | | setInterval(this.updateCharts, 2000);
|
| | | setInterval(this.addRandomLog, 5000);
|
| | | setInterval(this.updateDeviceStats, 3000);
|
| | | },
|
| | | methods: {
|
| | | updateTime () {
|
| | | const now = new Date();
|
| | | this.currentTime = now.toLocaleString('zh-CN', {
|
| | | year: 'numeric',
|
| | | month: '2-digit',
|
| | | day: '2-digit',
|
| | | hour: '2-digit',
|
| | | minute: '2-digit',
|
| | | second: '2-digit',
|
| | | hour12: false
|
| | | });
|
| | | },
|
| | | initCharts () {
|
| | | // åå§åCPUå¾è¡¨
|
| | | this.cpuChart = echarts.init(document.getElementById('cpuChart'));
|
| | | const cpuOption = {
|
| | | tooltip: {
|
| | | trigger: 'axis',
|
| | | formatter: '{b}<br/>CPU: {c}%'
|
| | | },
|
| | | grid: {
|
| | | top: '15%',
|
| | | left: '3%',
|
| | | right: '4%',
|
| | | bottom: '10%',
|
| | | containLabel: true
|
| | | },
|
| | | xAxis: {
|
| | | type: 'category',
|
| | | boundaryGap: false,
|
| | | data: this.timeData,
|
| | | axisLine: {
|
| | | lineStyle: {
|
| | | color: '#a0a0ff'
|
| | | }
|
| | | }
|
| | | },
|
| | | yAxis: {
|
| | | type: 'value',
|
| | | max: 100,
|
| | | axisLine: {
|
| | | lineStyle: {
|
| | | color: '#a0a0ff'
|
| | | }
|
| | | },
|
| | | splitLine: {
|
| | | lineStyle: {
|
| | | color: 'rgba(160, 160, 255, 0.1)'
|
| | | }
|
| | | }
|
| | | },
|
| | | series: [{
|
| | | name: 'CPU使ç¨ç',
|
| | | type: 'line',
|
| | | smooth: true,
|
| | | symbol: 'circle',
|
| | | symbolSize: 8,
|
| | | lineStyle: {
|
| | | width: 3,
|
| | | color: '#1890ff'
|
| | | },
|
| | | itemStyle: {
|
| | | color: '#1890ff',
|
| | | borderColor: '#fff',
|
| | | borderWidth: 2
|
| | | },
|
| | | areaStyle: {
|
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
| | | { offset: 0, color: 'rgba(24, 144, 255, 0.5)' },
|
| | | { offset: 1, color: 'rgba(24, 144, 255, 0.1)' }
|
| | | ])
|
| | | },
|
| | | data: this.cpuData
|
| | | }]
|
| | | };
|
| | | this.cpuChart.setOption(cpuOption);
|
| | |
|
| | | // åå§åå
åå¾è¡¨
|
| | | this.memoryChart = echarts.init(document.getElementById('memoryChart'));
|
| | | const memoryOption = {
|
| | | tooltip: {
|
| | | formatter: '{a} <br/>{b} : {c}%'
|
| | | },
|
| | | series: [
|
| | | {
|
| | | name: 'å
å使ç¨ç',
|
| | | type: 'gauge',
|
| | | radius: '90%',
|
| | | center: ['50%', '60%'],
|
| | | progress: {
|
| | | show: true,
|
| | | width: 20,
|
| | | itemStyle: {
|
| | | color: {
|
| | | type: 'linear',
|
| | | x: 0,
|
| | | y: 0,
|
| | | x2: 0,
|
| | | y2: 1,
|
| | | colorStops: [{
|
| | | offset: 0, color: '#40e0d0'
|
| | | }, {
|
| | | offset: 1, color: '#ff0080'
|
| | | }]
|
| | | }
|
| | | }
|
| | | },
|
| | | axisLine: {
|
| | | lineStyle: {
|
| | | width: 20,
|
| | | color: [
|
| | | [0.3, '#40e0d0'],
|
| | | [0.7, '#ff8c00'],
|
| | | [1, '#ff0080']
|
| | | ]
|
| | | }
|
| | | },
|
| | | axisTick: {
|
| | | distance: -20,
|
| | | length: 8,
|
| | | lineStyle: {
|
| | | color: '#fff',
|
| | | width: 2
|
| | | }
|
| | | },
|
| | | splitLine: {
|
| | | distance: -20,
|
| | | length: 20,
|
| | | lineStyle: {
|
| | | color: '#fff',
|
| | | width: 3
|
| | | }
|
| | | },
|
| | | axisLabel: {
|
| | | distance: -20,
|
| | | color: '#fff',
|
| | | fontSize: 14
|
| | | },
|
| | | anchor: {
|
| | | show: true,
|
| | | size: 15,
|
| | | showAbove: true,
|
| | | itemStyle: {
|
| | | borderWidth: 4,
|
| | | borderColor: '#1890ff'
|
| | | }
|
| | | },
|
| | | detail: {
|
| | | valueAnimation: true,
|
| | | formatter: '{value}%',
|
| | | color: '#fff',
|
| | | fontSize: 24,
|
| | | offsetCenter: [0, '30%']
|
| | | },
|
| | | title: {
|
| | | // åç¬è®¾ç½®åç§°çæ ·å¼
|
| | | show: true,
|
| | | offsetCenter: [0, '50%'], // åç§°ä½ç½® [æ°´å¹³åç§», åç´åç§»]
|
| | | color: '#fff', // åç§°é¢è²æ¹ä¸ºç½è²
|
| | | fontSize: 12,
|
| | | fontWeight: 'bold'
|
| | | },
|
| | | data: [
|
| | | {
|
| | | value: this.systemStatus.memory,
|
| | | name: 'å·²ç¨/æ»(M)ï¼353/780'
|
| | | }
|
| | | ]
|
| | | }
|
| | | ]
|
| | | };
|
| | | this.memoryChart.setOption(memoryOption);
|
| | | },
|
| | | simulateDataUpdate () {
|
| | | // åå§åä¸äºæ¨¡ææ°æ® - 使ç¨ç宿¶é´
|
| | | const now = new Date();
|
| | | for (let i = 10; i >= 0; i--) {
|
| | | const time = new Date(now.getTime() - i * 2000);
|
| | | this.timeData.push(this.formatTime(time));
|
| | | this.cpuData.push(Math.floor(Math.random() * 30) + 30);
|
| | | this.memoryData.push(Math.floor(Math.random() * 20) + 50);
|
| | | }
|
| | | },
|
| | | updateCharts () {
|
| | | // æ´æ°CPUå¾è¡¨æ°æ® - 使ç¨å½åç宿¶é´
|
| | | const now = new Date();
|
| | | const currentTime = this.formatTime(now);
|
| | |
|
| | | this.timeData.push(currentTime);
|
| | | this.timeData.shift();
|
| | |
|
| | | const newCpuValue = Math.floor(Math.random() * 30) + 30;
|
| | | this.cpuData.push(newCpuValue);
|
| | | this.cpuData.shift();
|
| | | this.systemStatus.cpu = newCpuValue;
|
| | |
|
| | | // æ´æ°å
åå¾è¡¨æ°æ®
|
| | | const newMemoryValue = Math.floor(Math.random() * 20) + 50;
|
| | | this.systemStatus.memory = newMemoryValue;
|
| | |
|
| | | this.cpuChart.setOption({
|
| | | xAxis: {
|
| | | data: this.timeData
|
| | | },
|
| | | series: [{
|
| | | data: this.cpuData
|
| | | }]
|
| | | });
|
| | |
|
| | | this.memoryChart.setOption({
|
| | | series: [{
|
| | | data: [{
|
| | | value: newMemoryValue,
|
| | | name: 'å·²ç¨/æ»(M)ï¼353/780'
|
| | | }]
|
| | | }]
|
| | | });
|
| | | },
|
| | | // æ ¼å¼åæ¶é´ä¸º HH:MM:SS æ ¼å¼
|
| | | formatTime (date) {
|
| | | const hours = date.getHours().toString().padStart(2, '0');
|
| | | const minutes = date.getMinutes().toString().padStart(2, '0');
|
| | | const seconds = date.getSeconds().toString().padStart(2, '0');
|
| | | return `${hours}:${minutes}:${seconds}`;
|
| | | },
|
| | | addRandomLog () {
|
| | | const logTypes = ['normal', 'warning', 'error'];
|
| | | const messages = [
|
| | | '人è¸è¯å«æå - ç¨æ·: çäº',
|
| | | 'è®¾å¤æ¸©åº¦å¼å¸¸',
|
| | | 'ç½ç»è¿æ¥æ¢å¤',
|
| | | 'åå¨ç©ºé´ä¸è¶³è¦å',
|
| | | 'è¯å«åç¡®çä¸é',
|
| | | 'ç³»ç»å¤ä»½å®æ',
|
| | | 'å®å
¨çç¥å·²æ´æ°',
|
| | | '设å¤åºä»¶å级å¯ç¨',
|
| | | 'æ°æ®åºä¼å宿',
|
| | | '人è¸åºæ´æ°å®æ'
|
| | | ];
|
| | |
|
| | | const now = new Date();
|
| | | const timeStr = now.getFullYear() + '-' +
|
| | | (now.getMonth() + 1).toString().padStart(2, '0') + '-' +
|
| | | now.getDate().toString().padStart(2, '0') + ' ' +
|
| | | now.getHours().toString().padStart(2, '0') + ':' +
|
| | | now.getMinutes().toString().padStart(2, '0') + ':' +
|
| | | now.getSeconds().toString().padStart(2, '0');
|
| | |
|
| | | const randomType = logTypes[Math.floor(Math.random() * logTypes.length)];
|
| | | const randomMessage = messages[Math.floor(Math.random() * messages.length)];
|
| | |
|
| | | this.logs.unshift({
|
| | | id: this.logs.length + 1,
|
| | | time: timeStr,
|
| | | message: randomMessage,
|
| | | type: randomType
|
| | | });
|
| | |
|
| | | // ä¿ææ¥å¿æ°éä¸è¶
è¿15æ¡
|
| | | if (this.logs.length > 15) {
|
| | | this.logs.pop();
|
| | | }
|
| | | },
|
| | | updateDeviceStats () {
|
| | | // éæºå¢å è¯å«æ¬¡æ°
|
| | | if (Math.random() > 0.7) {
|
| | | this.deviceStats.recognitions += Math.floor(Math.random() * 3) + 1;
|
| | | }
|
| | |
|
| | | // éæºæ¹å设å¤å¨çº¿ç¶æï¼å°æ¦çï¼
|
| | | if (Math.random() > 0.95) {
|
| | | this.deviceStatus.online = !this.deviceStatus.online;
|
| | | }
|
| | | },
|
| | | beforeDestroy () {
|
| | | if (this.cpuChart) {
|
| | | this.cpuChart.dispose();
|
| | | }
|
| | | if (this.memoryChart) {
|
| | | this.memoryChart.dispose();
|
| | | }
|
| | | }
|
| | | }
|
| | | };
|
| | | </script>
|
| | | <style lang="less">
|
| | | .container {
|
| | | max-width: 1400px;
|
| | | margin: 0 auto;
|
| | | padding: 20px;
|
| | | }
|
| | |
|
| | | .dashboard {
|
| | | display: grid;
|
| | | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
| | | gap: 25px;
|
| | | margin-bottom: 30px;
|
| | | }
|
| | |
|
| | | .card {
|
| | | background: rgba(16, 16, 48, 0.7);
|
| | | border-radius: 15px;
|
| | | padding: 25px;
|
| | | box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
| | | border: 1px solid rgba(64, 224, 208, 0.2);
|
| | | transition: all 0.3s ease;
|
| | | position: relative;
|
| | | overflow: hidden;
|
| | | }
|
| | |
|
| | | .card::before {
|
| | | content: '';
|
| | | position: absolute;
|
| | | top: 0;
|
| | | left: 0;
|
| | | width: 100%;
|
| | | height: 4px;
|
| | | background: linear-gradient(90deg, var(--themeColor), #ff8c00, #ff0080);
|
| | | }
|
| | |
|
| | | .card:hover {
|
| | | transform: translateY(-10px);
|
| | | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
|
| | | border-color: rgba(24, 144, 255, 0.5);
|
| | | }
|
| | |
|
| | | .card-header {
|
| | | display: flex;
|
| | | justify-content: space-between;
|
| | | align-items: center;
|
| | | margin-bottom: 20px;
|
| | | }
|
| | |
|
| | | .card-title {
|
| | | font-size: 20px;
|
| | | font-weight: 600;
|
| | | color: var(--themeColor);
|
| | | }
|
| | |
|
| | | .card-icon {
|
| | | font-size: 24px;
|
| | | color: #ff8c00;
|
| | | }
|
| | |
|
| | | .stats-grid {
|
| | | display: grid;
|
| | | grid-template-columns: repeat(2, 1fr);
|
| | | gap: 15px;
|
| | | }
|
| | |
|
| | | .stat-item {
|
| | | text-align: center;
|
| | | padding: 15px;
|
| | | background: rgba(32, 32, 64, 0.5);
|
| | | border-radius: 10px;
|
| | | transition: all 0.3s ease;
|
| | | }
|
| | |
|
| | | .stat-item:hover {
|
| | | background: rgba(32, 32, 64, 0.8);
|
| | | transform: scale(1.05);
|
| | | }
|
| | |
|
| | | .stat-value {
|
| | | font-size: 24px;
|
| | | font-weight: 700;
|
| | | margin: 10px 0;
|
| | | color: #ff8c00;
|
| | | }
|
| | |
|
| | | .stat-label {
|
| | | font-size: 14px;
|
| | | color: #a0a0ff;
|
| | | }
|
| | |
|
| | | .chart-container {
|
| | | height: 300px;
|
| | | margin-top: 10px;
|
| | | }
|
| | |
|
| | | .main-content {
|
| | | display: grid;
|
| | | grid-template-columns: 2fr 1fr;
|
| | | gap: 25px;
|
| | | }
|
| | |
|
| | | .logs-container {
|
| | | max-height: 400px;
|
| | | overflow-y: auto;
|
| | | padding-right: 10px;
|
| | | }
|
| | |
|
| | | .logs-container::-webkit-scrollbar {
|
| | | width: 8px;
|
| | | }
|
| | |
|
| | | .logs-container::-webkit-scrollbar-track {
|
| | | background: rgba(32, 32, 64, 0.5);
|
| | | border-radius: 10px;
|
| | | }
|
| | |
|
| | | .logs-container::-webkit-scrollbar-thumb {
|
| | | background: linear-gradient(180deg, var(--themeColor), #ff8c00);
|
| | | border-radius: 10px;
|
| | | }
|
| | |
|
| | | .log-item {
|
| | | padding: 15px;
|
| | | margin-bottom: 15px;
|
| | | background: rgba(32, 32, 64, 0.5);
|
| | | border-radius: 10px;
|
| | | border-left: 4px solid var(--themeColor);;
|
| | | transition: all 0.3s ease;
|
| | | }
|
| | |
|
| | | .log-item:hover {
|
| | | background: rgba(32, 32, 64, 0.8);
|
| | | transform: translateX(5px);
|
| | | }
|
| | |
|
| | | .log-item.warning {
|
| | | border-left-color: #ff8c00;
|
| | | }
|
| | |
|
| | | .log-item.error {
|
| | | border-left-color: #ff0080;
|
| | | }
|
| | |
|
| | | .log-time {
|
| | | font-size: 12px;
|
| | | color: #a0a0ff;
|
| | | margin-bottom: 5px;
|
| | | }
|
| | |
|
| | | .log-message {
|
| | | font-size: 14px;
|
| | | color: #ffffff;
|
| | | }
|
| | |
|
| | | .device-info-container {
|
| | | display: flex;
|
| | | flex-direction: column;
|
| | | gap: 15px;
|
| | | }
|
| | |
|
| | | .device-status {
|
| | | display: flex;
|
| | | align-items: center;
|
| | | padding: 15px;
|
| | | background: rgba(32, 32, 64, 0.5);
|
| | | border-radius: 10px;
|
| | | transition: all 0.3s ease;
|
| | | }
|
| | |
|
| | | .device-status:hover {
|
| | | background: rgba(32, 32, 64, 0.8);
|
| | | transform: translateX(5px);
|
| | | }
|
| | |
|
| | | .status-indicator {
|
| | | width: 12px;
|
| | | height: 12px;
|
| | | border-radius: 50%;
|
| | | margin-right: 15px;
|
| | | }
|
| | |
|
| | | .status-online {
|
| | | background: var(--themeColor);
|
| | | box-shadow: 0 0 10px var(--themeColor);
|
| | | }
|
| | |
|
| | | .status-offline {
|
| | | background: #ff0080;
|
| | | box-shadow: 0 0 10px #ff0080;
|
| | | }
|
| | |
|
| | | .device-details {
|
| | | flex: 1;
|
| | | }
|
| | |
|
| | | .device-name {
|
| | | font-weight: 600;
|
| | | margin-bottom: 5px;
|
| | | font-size: 18px;
|
| | | }
|
| | |
|
| | | .device-id {
|
| | | font-size: 14px;
|
| | | color: #a0a0ff;
|
| | | }
|
| | |
|
| | | @media (max-width: 992px) {
|
| | | .main-content {
|
| | | grid-template-columns: 1fr;
|
| | | }
|
| | | }
|
| | |
|
| | | @media (max-width: 768px) {
|
| | | .dashboard {
|
| | | grid-template-columns: 1fr;
|
| | | }
|
| | |
|
| | | header {
|
| | | flex-direction: column;
|
| | | gap: 15px;
|
| | | }
|
| | | }
|
| | |
|
| | | .pulse {
|
| | | animation: pulse 2s infinite;
|
| | | }
|
| | |
|
| | | @keyframes pulse {
|
| | | 0% {
|
| | | box-shadow: 0 0 0 0 rgba(24, 144, 255, 0.7);
|
| | | }
|
| | |
|
| | | 70% {
|
| | | box-shadow: 0 0 0 10px rgba(64, 224, 208, 0);
|
| | | }
|
| | |
|
| | | 100% {
|
| | | box-shadow: 0 0 0 0 rgba(64, 224, 208, 0);
|
| | | }
|
| | | }
|
| | |
|
| | | .glow {
|
| | | text-shadow: 0 0 10px currentColor;
|
| | | }
|
| | |
|
| | | .info-grid {
|
| | | display: grid;
|
| | | grid-template-columns: repeat(2, 1fr);
|
| | | gap: 15px;
|
| | | margin-top: 15px;
|
| | | }
|
| | |
|
| | | .info-item {
|
| | | padding: 12px;
|
| | | background: rgba(32, 32, 64, 0.5);
|
| | | border-radius: 8px;
|
| | | font-size: 14px;
|
| | | }
|
| | |
|
| | | .info-label {
|
| | | color: #a0a0ff;
|
| | | margin-bottom: 5px;
|
| | | }
|
| | |
|
| | | .info-value {
|
| | | font-weight: 600;
|
| | | color: #ff8c00;
|
| | | }
|
| | | </style>
|
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- äººåæ°å¢æç¼è¾ --> |
| | | <template> |
| | | <div> |
| | | <el-drawer size="50%" :with-header="false" :visible.sync="visible" :before-close="handleAddClose"> |
| | | <div class="config-tabs"> |
| | | <el-menu :default-active="activeTab" mode="horizontal" class="quanxian-menu"> |
| | | <el-menu-item index="info" @click="activeTab = 'info'">{{ $t('person.user') }}</el-menu-item> |
| | | <el-menu-item index="vourcher" @click="activeTab = 'vourcher'">{{ $t('person.voucher') }}</el-menu-item> |
| | | <el-menu-item index="permission" @click="activeTab = 'permission'">{{ $t('person.permission') }}</el-menu-item> |
| | | </el-menu> |
| | | <!-- åè½é¡µé¢ --> |
| | | <el-scrollbar> |
| | | <div style="padding: 20px;"> |
| | | <component |
| | | :is="currentComponent" |
| | | :key="componentKey" |
| | | :form-data="form" |
| | | :add-or-edit-type="addOrEditType" |
| | | @close-drawer="handleAddClose" |
| | | @operation-success="operationSuccess" |
| | | /> |
| | | </div> |
| | | </el-scrollbar> |
| | | </div> |
| | | </el-drawer> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import Info from '@/views/person/info' |
| | | import Vourcher from '@/views/person/vourcher' |
| | | import Permission from '@/views/person/permission' |
| | | export default { |
| | | components: { Info, Vourcher, Permission }, |
| | | data () { |
| | | return { |
| | | form: { |
| | | userId: "", |
| | | name: "", |
| | | permissionIds: "", |
| | | extra: "" |
| | | }, |
| | | addOrEditType: 'add', |
| | | visible: false, |
| | | activeTab: 'info', |
| | | componentKey: 0, // ç»ä»¶éæ°æ¸²æçkey |
| | | deviceModel: '', |
| | | } |
| | | }, |
| | | computed: { |
| | | currentComponent () { |
| | | return this.activeTab; |
| | | } |
| | | }, |
| | | created () { |
| | | this.initialForm = JSON.parse(JSON.stringify(this.form)); |
| | | }, |
| | | mounted () { |
| | | |
| | | }, |
| | | methods: { |
| | | open (type, row) { |
| | | console.log(type, row) |
| | | this.visible = true |
| | | this.addOrEditType = type |
| | | this.activeTab = 'info'; |
| | | if (row) { |
| | | let extra = row.extra ? JSON.parse(row.extra) : "" |
| | | this.form = { ...row, extra } |
| | | } |
| | | // 强å¶éæ°æ¸²æåç»ä»¶ |
| | | this.componentKey += 1; |
| | | }, |
| | | |
| | | handleAddClose (showConfirm = true) { |
| | | const closeAction = () => { |
| | | this.visible = false; |
| | | this.form = { ...this.initialForm }; |
| | | // 强å¶éæ°æ¸²æåç»ä»¶ï¼ç¡®ä¿ä¸æ¬¡æå¼æ¯å¹²åç |
| | | this.componentKey += 1; |
| | | }; |
| | | if (showConfirm) { |
| | | this.$confirm(this.$t('common.closeTips')) |
| | | .then(closeAction) |
| | | .catch(() => { }); |
| | | } else { |
| | | closeAction(); |
| | | } |
| | | }, |
| | | |
| | | operationSuccess (param) { |
| | | this.form = {...param} |
| | | this.$emit('addOrEditSuccess') |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | <style lang='less' scoped> |
| | | .config-tabs { |
| | | background: transparent; |
| | | } |
| | | |
| | | .config-tabs ::v-deep .el-tabs__header { |
| | | background: #fff; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | margin-bottom: 20px; |
| | | border: none; |
| | | } |
| | | |
| | | .config-tabs ::v-deep .el-tabs__item { |
| | | font-weight: 500; |
| | | height: 50px; |
| | | line-height: 50px; |
| | | } |
| | | |
| | | .drawerHeader { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin: 50px 10px 30px 10px; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .drawerImg { |
| | | height: 20px; |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | // .el-drawer__wrapper { |
| | | // z-index: 3000 !important; |
| | | // }</style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-main> |
| | | <el-row> |
| | | <el-form class="el-InputForm" :inline="true" :model="searchForm" ref="ruleForm"> |
| | | <el-form-item :label="$t('person.userId')" label-width="60px"> |
| | | <el-input v-model="searchForm.userId" :placeholder="$t('person.placeholderUserId')" clearable></el-input> |
| | | </el-form-item> |
| | | <el-form-item :label="$t('person.name')" label-width="80px"> |
| | | <el-input v-model="searchForm.name" :placeholder="$t('person.placeholderName')" clearable></el-input> |
| | | </el-form-item> |
| | | <div style="position: absolute; right: 25px; bottom: 25px;"> |
| | | <el-button type="info" style="margin-left:10px;border:none;" size='medium' icon="el-icon-search" |
| | | @click="search">{{ $t('common.query') }}</el-button> |
| | | <el-button type="warning" style="border:none;" size='medium' icon="el-icon-refresh-right" @click="doReset">{{ |
| | | $t('common.reset') }}</el-button> |
| | | </div> |
| | | </el-form> |
| | | <el-col :span="24" style="margin:20px 0"> |
| | | <el-button type="primary" style="border:none;" size='mini' icon="el-icon-plus" @click="doAdd">{{ |
| | | $t('person.addUser') }}</el-button> |
| | | <el-button type="warning" style="border:none;" size='mini' icon="el-icon-delete" @click="batchDelete">{{ |
| | | $t('common.batchDelete') }}</el-button> |
| | | <el-button type="danger" style="border:none;" size='mini' icon="el-icon-delete-solid" @click="doClear">{{ |
| | | $t('person.oneClickClear') }}</el-button> |
| | | </el-col> |
| | | <!-- æ°å¢äººå --> |
| | | <AddOrEdit ref="addOrEdit" @addOrEditSuccess='fetchData'></AddOrEdit> |
| | | <!-- Table --> |
| | | <el-col :span="24" style="padding: 0"> |
| | | <Table :table-label="tableHeader" v-loading="isSubmitLoading" :table-data="tableData" |
| | | :table-option="tableOption" :table-selection="tableSelection" |
| | | @onHandleSelectionChange="handleSelectionChange"></Table> |
| | | </el-col> |
| | | <!-- å页 --> |
| | | <el-col :span="24" style="text-align: center"> |
| | | <Pagination ref="page" :total="total" @pageChange="pageChange"></Pagination> |
| | | </el-col> |
| | | </el-row> |
| | | </el-main> |
| | | </template> |
| | | <script> |
| | | import Table from "@/components/table/tableList"; |
| | | import Pagination from "@/components/table/pagination"; |
| | | import AddOrEdit from "./addOrEdit.vue" |
| | | import { removeEmptyValues, resetObjectValues } from '@/utils/index.js' |
| | | export default { |
| | | components: { |
| | | Pagination, |
| | | Table, |
| | | AddOrEdit |
| | | }, |
| | | data () { |
| | | return { |
| | | tableHeader: [ |
| | | { label: this.$t('person.userId'), list: 'userId', overflowShow: 'hidden' }, |
| | | { label: this.$t('person.name'), list: 'name', overflowShow: 'hidden' }, |
| | | ], |
| | | tableSelection: { |
| | | key: true, |
| | | type: "selection", |
| | | detaile: false, |
| | | }, |
| | | tableOption: { |
| | | label: this.$t('common.operation'), |
| | | width: "300px", |
| | | value: 0, |
| | | options: [ |
| | | { |
| | | label: this.$t('common.edit'), |
| | | key: 0, |
| | | type: "text", |
| | | State: true, |
| | | method: (row) => { |
| | | this.$refs.addOrEdit.open('edit', { ...row }) |
| | | }, |
| | | }, |
| | | { |
| | | label: this.$t('common.delete'), |
| | | key: 1, |
| | | type: "text", |
| | | State: true, |
| | | method: (row) => { |
| | | this.handleDelete(row.userId) |
| | | }, |
| | | } |
| | | ] |
| | | }, |
| | | tableHeight: 450, |
| | | currentPage: 0, |
| | | pageSize: 20, |
| | | total: 0, |
| | | tableData: [], |
| | | searchForm: { |
| | | userId: '', |
| | | name: '', |
| | | }, |
| | | selectIdList: [], |
| | | isSubmitLoading: false, |
| | | }; |
| | | }, |
| | | created () { |
| | | this.fetchData() |
| | | }, |
| | | methods: { |
| | | async fetchData () { |
| | | let searchForm = removeEmptyValues({ ...this.searchForm }) |
| | | searchForm.page = this.currentPage |
| | | searchForm.size = this.pageSize |
| | | try { |
| | | const res = await this.$http.post("/getUser", { data: searchForm }); |
| | | if (res.code == 200) { |
| | | this.tableData = res.data.content |
| | | this.total = res.data.total |
| | | } else { |
| | | this.$message.error(res.message); |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }, |
| | | |
| | | doAdd () { |
| | | this.$refs.addOrEdit.open('add') |
| | | }, |
| | | |
| | | doReset () { |
| | | resetObjectValues(this.searchForm) |
| | | this.fetchData() |
| | | }, |
| | | |
| | | handleDelete (userId) { |
| | | let that = this |
| | | this.$confirm( |
| | | this.$t('common.deleteTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | try { |
| | | const res = await that.$http.post("delUser", { data: [userId] }) |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('common.deleteSuccess')) |
| | | that.fetchData() |
| | | } else { |
| | | that.$message.error(res.message) |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }).catch(() => { }) |
| | | }, |
| | | |
| | | batchDelete () { |
| | | let that = this |
| | | if (this.selectIdList.length <= 0) { |
| | | this.$message.warning(this.$t('common.placeholderSelect')); |
| | | return; |
| | | } |
| | | this.$confirm(this.$t('common.deleteTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | }) |
| | | .then(async () => { |
| | | that.isSubmitLoading = true; |
| | | const res = await this.$http.post("delUser", { data: this.selectIdList }); |
| | | that.isSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('common.deleteSuccess')) |
| | | that.fetchData() |
| | | } else { |
| | | that.$message.error(res.message) |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | return false; |
| | | }); |
| | | }, |
| | | |
| | | doClear () { |
| | | let that = this |
| | | this.$confirm(this.$t('person.clearTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | }) |
| | | .then(async () => { |
| | | that.isSubmitLoading = true; |
| | | try { |
| | | const res = await this.$http.post("/clearUser", {}); |
| | | that.isSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('person.clearSuccess')) |
| | | that.fetchData() |
| | | } else { |
| | | that.$message.error(that.$t('person.clearFailed')) |
| | | } |
| | | } catch (error) { |
| | | console.log(error) |
| | | } |
| | | |
| | | }) |
| | | .catch(() => { |
| | | return false; |
| | | }); |
| | | }, |
| | | |
| | | handleSelectionChange (vals) { |
| | | this.selectIdList = []; |
| | | vals.map(v => { |
| | | this.selectIdList.push(v.userId); |
| | | }); |
| | | }, |
| | | |
| | | pageChange (item) { |
| | | this.pageSize = item.limit; |
| | | this.currentPage = item.page - 1; |
| | | this.fetchData() |
| | | }, |
| | | |
| | | search () { |
| | | this.currentPage = 0 |
| | | this.$refs.page.Page(1); |
| | | this.fetchData(); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | <style lang="less" scoped> |
| | | .el-InputForm { |
| | | position: relative; |
| | | background-color: #fff; |
| | | padding: 10px 20px; |
| | | box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.16); |
| | | border-radius: 15px; |
| | | } |
| | | |
| | | .card { |
| | | width: 96%; |
| | | height: 85%; |
| | | border-radius: 5px; |
| | | box-shadow: 0px 10px 30px 10px rgba(211, 215, 221, 0.4); |
| | | padding: 20px; |
| | | margin: 20px auto; |
| | | font-size: 14px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- äººåæ°å¢æç¼è¾ -->
|
| | | <template>
|
| | | <div>
|
| | | <el-form ref="localForm" :model="localForm" label-width="100px" :rules="rules" style="width: 90%;margin: 0 auto;">
|
| | | <el-form-item :label="$t('person.userId')" v-if="addOrEditType == 'edit'">
|
| | | <el-input v-model="localForm.userId" :disabled=true :placeholder="$t('common.placeholder')"></el-input>
|
| | | </el-form-item>
|
| | | <el-form-item :label="$t('person.name')" prop="name">
|
| | | <el-input v-model="localForm.name" :placeholder="$t('common.placeholder')"></el-input>
|
| | | </el-form-item>
|
| | | <el-form-item :label="$t('person.idCard')">
|
| | | <el-input v-model="localForm.idCard" :placeholder="$t('common.placeholder')"></el-input>
|
| | | </el-form-item>
|
| | | <el-form-item :label="$t('person.userType')">
|
| | | <el-checkbox v-model="localForm.type">{{ $t('person.administrator') }}</el-checkbox>
|
| | | </el-form-item>
|
| | | </el-form>
|
| | | <div class="dialog-footer">
|
| | | <el-button type="warning" @click="handleAddClose()">{{ $t('common.cancel') }}</el-button>
|
| | | <el-button type="primary" @click="updata()">{{ $t('common.confirm') }}</el-button>
|
| | | </div>
|
| | | </div>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import { generateRandomString, throttle } from '@/utils/index.js'
|
| | | export default {
|
| | | props: {
|
| | | formData: {
|
| | | type: Object,
|
| | | default: () => ({})
|
| | | },
|
| | | addOrEditType: {
|
| | | type: String,
|
| | | default: 'add'
|
| | | }
|
| | | },
|
| | | data () {
|
| | | return {
|
| | | localForm: {
|
| | | userId: "",
|
| | | name: "",
|
| | | type: false,
|
| | | idCard: "",
|
| | | permissionIds: ""
|
| | | },
|
| | | localFormCopy: {},
|
| | | rules: {
|
| | | name: [{ required: true, message: this.$t('common.placeholder'), trigger: ["blur"] },],
|
| | | userId: [{ required: true, message: this.$t('common.placeholder'), trigger: ["blur"] },],
|
| | | },
|
| | | }
|
| | | },
|
| | | created () {
|
| | | if (this.addOrEditType == 'edit') {
|
| | | this.getUser()
|
| | | }
|
| | | this.localFormCopy = { ...this.localForm }
|
| | | },
|
| | | mounted () {
|
| | |
|
| | | },
|
| | | methods: {
|
| | | async getUser () {
|
| | | try {
|
| | | let data = {
|
| | | userId: this.formData.userId,
|
| | | page: 0,
|
| | | size: 99
|
| | | }
|
| | | const res = await this.$http.post('/getUser', { data })
|
| | | if (res.code == 200) {
|
| | | console.log(res)
|
| | | let { userId, name, extra, permissionIds } = res.data.content[0]
|
| | | let { type, idCard } = JSON.parse(extra)
|
| | | this.localForm.userId = userId
|
| | | this.localForm.name = name
|
| | | this.localForm.type = type == 1 ? true : false
|
| | | this.localForm.idCard = idCard
|
| | | this.localForm.permissionIds = permissionIds
|
| | | } else {
|
| | | this.$message.error(res.message);
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | },
|
| | |
|
| | | handleAddClose () {
|
| | | this.$emit('close-drawer', false);
|
| | | },
|
| | |
|
| | | updata: throttle(function () {
|
| | | let data = {
|
| | | name: this.localForm.name,
|
| | | extra: {
|
| | | type: this.localForm.type ? 1 : 0,
|
| | | idCard: this.localForm.idCard
|
| | | },
|
| | | }
|
| | | if (this.localForm.permissionIds) {
|
| | | data.permissionIds = this.localForm.permissionIds.split(',')
|
| | | }
|
| | | this.$refs['localForm'].validate(async (valid) => {
|
| | | if (valid) {
|
| | | if (this.addOrEditType == 'add') {
|
| | | data.userId = generateRandomString()
|
| | | const res = await this.$http.post(
|
| | | "/insertUser",
|
| | | { data: [data] }
|
| | | );
|
| | | if (res.code == 200) {
|
| | | this.$message.success(this.$t('common.addSuccess'))
|
| | | this.$emit("operation-success", { ...data, permissionIds: data.permissionIds ? data.permissionIds.join(',') : '' })
|
| | | } else {
|
| | | if (res.data && res.data[0]) {
|
| | | this.$message.error(res.data[0].errmsg)
|
| | | }
|
| | | }
|
| | | } else {
|
| | | data.userId = this.localForm.userId
|
| | | const res = await this.$http.post(
|
| | | "/modifyUser",
|
| | | { data: [data] }
|
| | | );
|
| | | if (res.code == 200) {
|
| | | this.$message.success(this.$t('common.editSuccess'))
|
| | | this.$emit("operation-success", { ...data, permissionIds: data.permissionIds ? data.permissionIds.join(',') : '' })
|
| | | } else {
|
| | | if (res.data && res.data[0]) {
|
| | | this.$message.error(res.data[0].errmsg)
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | })
|
| | | }, 2000)
|
| | | }
|
| | | }
|
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- æé -->
|
| | | <template>
|
| | | <div>
|
| | | <div style="position: absolute; right: 25px; top: 65px;">
|
| | | <!-- <el-button type="danger" style="margin-left:10px;border:none;" size='medium' icon="el-icon-delete">{{
|
| | | $t('permission.deletePermission') }}</el-button> -->
|
| | | <el-button type="primary" style="border:none;" size='medium' icon="el-icon-plus" @click="openTimeDialog">{{
|
| | | $t('permission.addPermission') }}</el-button>
|
| | | </div>
|
| | | <div style="margin-top: 150px;">
|
| | | <Table :table-label="tableHeader" :table-data="tableData" :table-option="tableOption"></Table>
|
| | | </div>
|
| | | <div class="dialog-footer" style="margin-top: 50px;">
|
| | | <el-button type="warning" @click="doClose">{{ $t('common.close') }}</el-button>
|
| | | </div>
|
| | | <!-- æ·»å æé -->
|
| | | <el-dialog :title="$t('permission.timeRange')" append-to-body modal-append-to-body :visible.sync="timeVisible"
|
| | | width="800px" :before-close="handleClose" class="time-range-dialog">
|
| | | <el-form label-position="right" style="width:80%;margin:0 auto;">
|
| | | <el-form-item>
|
| | | <div> {{ $t('permission.effectiveType') }}</div>
|
| | | <el-radio v-model="radio" :label="0">{{ $t('permission.unlimitedMode') }}</el-radio>
|
| | | <el-radio v-model="radio" :label="1">{{ $t('permission.usualMode') }}</el-radio>
|
| | | <el-radio v-model="radio" :label="2">{{ $t('permission.dailyMode') }}</el-radio>
|
| | | <el-radio v-model="radio" :label="3">{{ $t('permission.weeklyRepetitionMode') }}</el-radio>
|
| | | </el-form-item>
|
| | | <el-form-item v-if="radio === 1">
|
| | | <div>{{ $t('permission.effectiveTime') }}</div>
|
| | | <el-date-picker :clearable="false" v-model="dateTimes" value-format="timestamp"
|
| | | :default-time="['00:00:00', '23:59:59']" type="datetimerange" :range-separator="$t('common.to')"
|
| | | :start-placeholder="$t('common.startDate')" :end-placeholder="$t('common.endDate')">
|
| | | </el-date-picker>
|
| | | </el-form-item>
|
| | |
|
| | | <!-- <el-form-item v-if="radio === 2">
|
| | | <div>{{ $t('permission.effectiveTime') }}</div>
|
| | | <el-time-picker :default-value="['00:00', '23:59']" :clearable="false" is-range value-format="HH:mm"
|
| | | format="HH:mm" v-model="timeRange" :range-separator="$t('common.to')"
|
| | | :start-placeholder="$t('common.startTime')" :end-placeholder="$t('common.endTime')"
|
| | | :placeholder="$t('placeholder.placeholder_choose_time_priod')">
|
| | | </el-time-picker>
|
| | | <div style="margin-top:30px">{{ $t('permission.effectiveWeek') }}</div>
|
| | | <el-date-picker :clearable="false" v-model="dateTimes" value-format="timestamp"
|
| | | :default-time="['00:00:00', '23:59:59']" type="datetimerange" :range-separator="$t('common.to')"
|
| | | :start-placeholder="$t('common.startDate')" :end-placeholder="$t('common.endDate')">
|
| | | </el-date-picker>
|
| | | </el-form-item> -->
|
| | |
|
| | | <el-form-item v-if="radio === 2 || radio == 3">
|
| | | <div>{{ $t('permission.effectiveTime') }}</div>
|
| | | <el-date-picker style="width:400px;" v-model="dateTimes" value-format="timestamp"
|
| | | :default-time="['00:00:00', '23:59:59']" :clearable="false" type="datetimerange"
|
| | | :range-separator="$t('common.to')" :start-placeholder="$t('common.startDate')"
|
| | | :end-placeholder="$t('common.endDate')">
|
| | | </el-date-picker>
|
| | | <div style="margin-top:30px">{{ $t('permission.effectiveWeek') }}</div>
|
| | | <el-row class="the-week-box" v-if="radio == 2">
|
| | | <el-col :span="24">
|
| | | <div @click="goSetTime(dayInfo)">
|
| | | <el-col :span="3">{{ $t('permission.time_range') }}</el-col>
|
| | | <el-col :span="20">{{ dayInfo.timeArr ? dayInfo.timeArr : '-' }}</el-col>
|
| | | <el-col :span="1"><img src="../../assets/right.png" alt=""></el-col>
|
| | | </div>
|
| | | </el-col>
|
| | | </el-row>
|
| | | <el-row class="the-week-box" v-if="radio == 3">
|
| | | <el-col :span="24" v-for="theDay in weeks" :key="theDay.id">
|
| | | <div @click="goSetTime(theDay)">
|
| | | <el-col :span="3">{{ theDay.label }}</el-col>
|
| | | <el-col :span="20">{{ theDay.timeArr ? theDay.timeArr : '-' }}</el-col>
|
| | | <el-col :span="1"><img src="../../assets/right.png" alt=""></el-col>
|
| | | </div>
|
| | | </el-col>
|
| | | </el-row>
|
| | | </el-form-item>
|
| | | </el-form>
|
| | | <div class="dialog-footer">
|
| | | <el-button @click="handleClose" style="color:#1D2129;">{{ $t('common.cancel') }}</el-button>
|
| | | <el-button type="primary" @click="doSubmit">{{ $t('common.confirm') }}</el-button>
|
| | | </div>
|
| | | </el-dialog>
|
| | | <!-- 设置æ¶é´æ®µ -->
|
| | | <el-dialog append-to-body modal-append-to-body :title="title" :visible.sync="timeAreaVisible" width="500px"
|
| | | :before-close="cancelTimeAdd">
|
| | | <el-form label-position="right" label-width="30px">
|
| | | <div>{{ $t('permission.timePeriod') }}
|
| | | <el-button type="success" :disabled="timeArr.length >= 5" style="float: right;" size="mini"
|
| | | icon="el-icon-s-grid" @click="addTime">{{ $t('permission.addTimePeriod') }}</el-button>
|
| | | </div>
|
| | | <el-form-item v-for="(item, index) in timeArr" :key="index" :label="index + 1 + ''">
|
| | | <el-time-picker :data-num="index" :default-value="['00:00', '23:59']" :clearable="false" :key="index"
|
| | | @focus="onTimePicker" @change="theTimeChange" size="mini" style="width:75%;" is-range value-format="HH:mm"
|
| | | format="HH:mm" v-model="item.theTime" :range-separator="$t('common.to')"
|
| | | :start-placeholder="$t('common.startTime')" :end-placeholder="$t('common.endTime')"
|
| | | :placeholder="$t('placeholder.placeholder_choose_time_priod')">
|
| | | </el-time-picker>
|
| | | <el-button style="margin-left:20px" type="text" icon="el-icon-circle-close"
|
| | | @click.prevent="removeTime(index)">{{ $t('common.delete') }}</el-button>
|
| | | </el-form-item>
|
| | | </el-form>
|
| | | <div slot="footer" class="dialog-footer">
|
| | | <el-button style="color:#1D2129;" @click="cancelTimeAdd">{{ $t('common.cancel') }}</el-button>
|
| | | <el-button type="primary" @click="confirmTimeAdd">{{ $t('common.confirm') }}</el-button>
|
| | | </div>
|
| | | </el-dialog>
|
| | | </div>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import Table from "@/components/table/tableList";
|
| | | import { parseTime, generateRandomString } from "@/utils/index.js"
|
| | | export default {
|
| | | props: {
|
| | | formData: {
|
| | | type: Object,
|
| | | default: () => ({})
|
| | | },
|
| | | addOrEditType: {
|
| | | type: String,
|
| | | default: 'add'
|
| | | }
|
| | | },
|
| | | components: {
|
| | | Table
|
| | | },
|
| | | data () {
|
| | | return {
|
| | | localForm: {},
|
| | | permissionIds: [],
|
| | | curPermissionId: '',
|
| | | tableHeader: [
|
| | | {
|
| | | label: this.$t('permission.permissionId'),
|
| | | list: 'permissionId',
|
| | | overflowShow: 'hidden',
|
| | | width: '150px'
|
| | | },
|
| | | {
|
| | | label: this.$t('permission.effectiveType'),
|
| | | type: 'html',
|
| | | overflowShow: 'hidden',
|
| | | width: '100px',
|
| | | code: (row) => {
|
| | | let type = row.time.type
|
| | | switch (type) {
|
| | | case 0:
|
| | | return this.$t('permission.unlimitedMode')
|
| | | case 1:
|
| | | return this.$t('permission.usualMode')
|
| | | case 2:
|
| | | return this.$t('permission.dailyMode')
|
| | | case 3:
|
| | | return this.$t('permission.weeklyRepetitionMode')
|
| | | }
|
| | | }
|
| | | },
|
| | | {
|
| | | label: this.$t('permission.effectiveTime'),
|
| | | type: 'html',
|
| | | overflowShow: 'hidden',
|
| | | code: (row) => {
|
| | | let type = row.time.type
|
| | | if (type == 0) {
|
| | | return '-'
|
| | | } else {
|
| | | let { beginTime, endTime } = row.time.range
|
| | | return `${parseTime(beginTime * 1000)} ~ ${parseTime(endTime * 1000)}`
|
| | | }
|
| | | }
|
| | | },
|
| | | {
|
| | | label: this.$t('permission.effectiveWeek'),
|
| | | type: 'html',
|
| | | overflowShow: 'hidden',
|
| | | code: (row) => {
|
| | | let type = row.time.type
|
| | | switch (type) {
|
| | | case 0:
|
| | | return '-'
|
| | | case 1: {
|
| | | return '-'
|
| | | }
|
| | | case 2: {
|
| | | let dayPeriodTime = row.time.dayPeriodTime
|
| | | let times = dayPeriodTime.split('|')
|
| | | if (times.length === 0) return '-';
|
| | | times = times.map(v => `<div>${v}<div>`)
|
| | | return times.join("");
|
| | | }
|
| | | case 3: {
|
| | | let weekPeriodTime = row.time.weekPeriodTime
|
| | | const weekDays = [this.$t('common.monday'), this.$t('common.tuseday'), this.$t('common.wednesday'), this.$t('common.thursday'), this.$t('common.friday'), this.$t('common.saterday'), this.$t('common.sunday')];
|
| | | let days = [];
|
| | | for (let i = 1; i <= 7; i++) {
|
| | | const dayKey = String(i);
|
| | | if (weekPeriodTime[dayKey]) {
|
| | | days.push(`${weekDays[i - 1]}ï¼ ${weekPeriodTime[dayKey]}`);
|
| | | }
|
| | | }
|
| | | if (days.length === 0) return '-';
|
| | | days = days.map(v => `<div>${v}<div>`)
|
| | | return days.join("");
|
| | | }
|
| | | default:
|
| | | break;
|
| | | }
|
| | | }
|
| | | },
|
| | | // {
|
| | | // label: this.$t('permission.extra'),
|
| | | // type: 'html',
|
| | | // overflowShow: 'hidden',
|
| | | // code: (row) => {
|
| | | // if (row.extra) {
|
| | | // return row.extra
|
| | | // } else {
|
| | | // return '-'
|
| | | // }
|
| | | // }
|
| | | // },
|
| | | ],
|
| | | tableOption: {
|
| | | label: this.$t('common.operation'),
|
| | | width: "100px",
|
| | | value: 0,
|
| | | options: [
|
| | | {
|
| | | label: this.$t('common.edit'),
|
| | | key: 1,
|
| | | type: "text",
|
| | | State: true,
|
| | | method: (row) => {
|
| | | this.operationType = 'edit'
|
| | | this.handleEdit({ ...row })
|
| | | },
|
| | | },
|
| | | {
|
| | | label: this.$t('common.delete'),
|
| | | key: 1,
|
| | | type: "text",
|
| | | State: true,
|
| | | method: (row) => {
|
| | | this.handleDelete(row.permissionId)
|
| | | },
|
| | | }
|
| | | ]
|
| | | },
|
| | | tableData: [],
|
| | | timeRange: ['00:00', '23:59'],
|
| | | visible: false,
|
| | | timeVisible: false,
|
| | | timeAreaVisible: false,
|
| | | chooseWeeks: [],
|
| | | radio: 0,
|
| | | title: "",
|
| | | currentId: "",
|
| | | dateTimes: [],
|
| | | times: [],
|
| | | nowTimeVal: [],
|
| | | nowTimeIndex: 9,
|
| | | count: '',
|
| | | timeType: 'day',
|
| | | dayInfo: {
|
| | | timeArr: '',
|
| | | },
|
| | | initWeeks: [
|
| | | { label: this.$t('common.monday'), id: '1', timeArr: '' },
|
| | | { label: this.$t('common.tuseday'), id: '2', timeArr: '' },
|
| | | { label: this.$t('common.wednesday'), id: '3', timeArr: '' },
|
| | | { label: this.$t('common.thursday'), id: '4', timeArr: '' },
|
| | | { label: this.$t('common.friday'), id: '5', timeArr: '' },
|
| | | { label: this.$t('common.saterday'), id: '6', timeArr: '' },
|
| | | { label: this.$t('common.sunday'), id: '7', timeArr: '' }
|
| | | ],
|
| | | weeks: [],
|
| | | timeArr: [],
|
| | | operationType: 'add'
|
| | | }
|
| | | },
|
| | | created () {
|
| | | this.weeks = [...this.initWeeks]
|
| | | this.getUser()
|
| | | },
|
| | | mounted () { },
|
| | | methods: {
|
| | | openTimeDialog () {
|
| | | this.timeVisible = true
|
| | | this.operationType = 'add'
|
| | | },
|
| | |
|
| | | handleClose () {
|
| | | this.weeks = [...this.initWeeks]
|
| | | this.chooseWeeks.splice(0)
|
| | | this.radio = 0
|
| | | this.dateTimes.splice(0)
|
| | | this.times.splice(0)
|
| | | this.timeVisible = false
|
| | | },
|
| | |
|
| | | doClose () {
|
| | | this.$emit('close-drawer', false);
|
| | | },
|
| | |
|
| | | async getUser () {
|
| | | try {
|
| | | let data = {
|
| | | userId: this.formData.userId,
|
| | | page: 0,
|
| | | size: 99
|
| | | }
|
| | | const res = await this.$http.post('/getUser', { data })
|
| | | if (res.code == 200) {
|
| | | console.log(res)
|
| | | let { userId, name, extra, permissionIds } = res.data.content[0]
|
| | | this.localForm.userId = userId
|
| | | this.localForm.name = name
|
| | | this.localForm.extra = extra ? JSON.parse(extra) : ""
|
| | | this.permissionIds = permissionIds ? permissionIds.split(',') : []
|
| | | this.getPermission()
|
| | | } else {
|
| | | this.$message.error(res.message);
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | },
|
| | |
|
| | | getPermission () {
|
| | | let that = this
|
| | | this.tableData = []
|
| | | if (this.permissionIds) {
|
| | | this.permissionIds.forEach(async v => {
|
| | | let data = {
|
| | | page: 0,
|
| | | size: 100,
|
| | | permissionId: v
|
| | | }
|
| | | try {
|
| | | const res = await that.$http.post('/getPermission', { data })
|
| | | if (res.code == 200) {
|
| | | that.tableData = that.tableData.concat(res.data.content)
|
| | | } else {
|
| | | that.$message.error(res.message)
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even);
|
| | | }
|
| | | })
|
| | | }
|
| | | },
|
| | |
|
| | | handleEdit (row) {
|
| | | console.log(row)
|
| | | this.curPermissionId = row.permissionId
|
| | | this.radio = row.time.type
|
| | | if (row.time.type != 0) {
|
| | | let { beginTime, endTime } = row.time.range
|
| | | this.dateTimes = [beginTime * 1000, endTime * 1000]
|
| | | }
|
| | | if (row.time.type == 2) {
|
| | | this.dayInfo.timeArr = row.time.dayPeriodTime
|
| | | }
|
| | | if (row.time.type == 3) {
|
| | | let weekPeriodTime = row.time.weekPeriodTime
|
| | | this.weeks = this.initWeeks.map(week => ({
|
| | | ...week,
|
| | | timeArr: weekPeriodTime[week.id] || ''
|
| | | }))
|
| | | }
|
| | | this.timeVisible = true
|
| | | },
|
| | |
|
| | | handleDelete (permissionId) {
|
| | | let that = this
|
| | | this.$confirm(
|
| | | this.$t('common.deleteTips'),
|
| | | this.$t('common.tips'),
|
| | | {
|
| | | confirmButtonText: this.$t('common.confirm'),
|
| | | cancelButtonText: this.$t('common.cancel'),
|
| | | type: 'warning'
|
| | | }
|
| | | ).then(async () => {
|
| | | try {
|
| | | const res = await that.$http.post("delPermission", {
|
| | | data: {
|
| | | permissionIds: [permissionId]
|
| | | }
|
| | | })
|
| | | if (res.code == 200) {
|
| | | that.$message.success(this.$t('common.deleteSuccess'))
|
| | | that.updatePerson('delete', permissionId)
|
| | | } else {
|
| | | that.$message.error(res.message)
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | }).catch(() => { })
|
| | | },
|
| | |
|
| | | handleAddClose () {
|
| | | this.$emit('close-drawer', false);
|
| | | },
|
| | |
|
| | | async doSubmit () {
|
| | | if (!this.formData.userId) {
|
| | | this.$message.error(this.$t('person.userNotExist'))
|
| | | return false
|
| | | }
|
| | | const that = this
|
| | | let theData = {
|
| | | time: {
|
| | | type: this.radio
|
| | | }
|
| | | }
|
| | | switch (that.radio) {
|
| | | case 1:
|
| | | if (!that.dateTimes.length) {
|
| | | that.$message.warning(this.$t('permission.choose_time_range'));
|
| | | return false
|
| | | }
|
| | | theData.time.range = {
|
| | | beginTime: new Date(that.dateTimes[0]).getTime() / 1000,
|
| | | endTime: new Date(that.dateTimes[1]).getTime() / 1000
|
| | | }
|
| | | console.log(theData);
|
| | |
|
| | | break;
|
| | | case 2:
|
| | | if (that.dateTimes.length === 0) {
|
| | | that.$message.warning(this.$t('power.choose_time_range'));
|
| | | return false
|
| | | }
|
| | | theData.time.range = {
|
| | | beginTime: new Date(that.dateTimes[0]).getTime() / 1000,
|
| | | endTime: new Date(that.dateTimes[1]).getTime() / 1000
|
| | | }
|
| | | theData.time.dayPeriodTime = that.dayInfo.timeArr
|
| | | console.log(theData);
|
| | | break
|
| | | case 3: {
|
| | | if (that.dateTimes.length === 0) {
|
| | | that.$message.warning(this.$t('power.choose_time_range'));
|
| | | return false
|
| | | }
|
| | | theData.time.range = {
|
| | | beginTime: new Date(that.dateTimes[0]).getTime() / 1000,
|
| | | endTime: new Date(that.dateTimes[1]).getTime() / 1000
|
| | | }
|
| | | let obj = {}
|
| | | this.weeks.forEach(item => {
|
| | | if (item?.timeArr) {
|
| | | obj[item.id] = item.timeArr
|
| | | }
|
| | | })
|
| | | theData.time.weekPeriodTime = obj
|
| | | console.log(theData);
|
| | | break;
|
| | | }
|
| | | }
|
| | | if (this.operationType == 'add') {
|
| | | try {
|
| | | theData.permissionId = generateRandomString()
|
| | | const res = await this.$http.post('/insertPermission', { data: [theData] })
|
| | | if (res.code == 200) {
|
| | | this.$message.success(this.$t('common.addSuccess'))
|
| | | this.timeVisible = false
|
| | | this.updatePerson('add', theData.permissionId)
|
| | | } else {
|
| | | if (res.data && res.data[0]) {
|
| | | this.$message.error(res.data[0].errmsg)
|
| | | }
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even);
|
| | | }
|
| | | } else if (this.operationType == 'edit') {
|
| | | try {
|
| | | theData.permissionId = this.curPermissionId
|
| | | const res = await this.$http.post('/modifyPermission', { data: [theData] })
|
| | | if (res.code == 200) {
|
| | | this.$message.success(this.$t('common.editSuccess'))
|
| | | this.timeVisible = false
|
| | | this.getPermission()
|
| | | } else {
|
| | | if (res.data && res.data[0]) {
|
| | | this.$message.error(res.data[0].errmsg)
|
| | | }
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even);
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | async updatePerson (type, permissionId) {
|
| | | let data = {}
|
| | | data.userId = this.localForm.userId
|
| | | data.name = this.localForm.name
|
| | | data.extra = this.localForm.extra
|
| | | if (type == 'add') {
|
| | | data.permissionIds = this.permissionIds && this.permissionIds.length ? this.permissionIds.concat([permissionId]) : [permissionId]
|
| | | } else if (type == 'delete') {
|
| | | data.permissionIds = this.permissionIds && this.permissionIds.length ? this.permissionIds.filter(v => v != permissionId) : []
|
| | | }
|
| | | const res = await this.$http.post(
|
| | | "/modifyUser",
|
| | | { data: [data] }
|
| | | );
|
| | | if (res.code == 200) {
|
| | | this.permissionIds = [...data.permissionIds]
|
| | | this.getPermission()
|
| | | this.$emit("operation-success", {...data, permissionIds: data.permissionIds ? data.permissionIds.join(',') : ''})
|
| | | } else {
|
| | | this.$message.error(res.message)
|
| | | }
|
| | | },
|
| | |
|
| | | getSecondsFromMidnight (timeStr) {
|
| | | const [hours, minutes] = timeStr.split(':').map(Number);
|
| | | return hours * 3600 + minutes * 60;
|
| | | },
|
| | |
|
| | | // 设置æ¶é´æ®µ
|
| | | goSetTime (theDay) {
|
| | | this.timeAreaVisible = true
|
| | | this.timeArr.splice(0)
|
| | | if (theDay.timeArr !== '') {
|
| | | let aaa = theDay.timeArr.split('|')
|
| | | aaa.forEach(item => {
|
| | | this.timeArr.push({
|
| | | theTime: [item.split('-')[0], item.split('-')[1]]
|
| | | })
|
| | | })
|
| | | }
|
| | | this.currentId = theDay.id
|
| | | this.title = theDay.label
|
| | | },
|
| | |
|
| | | // æ·»å æ¶æ®µ
|
| | | addTime () {
|
| | | if (this.timeArr.length > 0) {
|
| | | let lastTime = this.timeArr[this.timeArr.length - 1].theTime
|
| | | if (lastTime[0] === '00:00' && lastTime[1] === '23:59') {
|
| | | this.$message.warning(this.$t('permission.modify_previous_time'))
|
| | | return false
|
| | | }
|
| | | }
|
| | | this.timeArr.push({ theTime: ['00:00', '23:59'] })
|
| | | },
|
| | |
|
| | | // å 餿¶æ®µ
|
| | | removeTime (index) {
|
| | | this.timeArr.splice(index, 1)
|
| | | },
|
| | |
|
| | | onTimePicker (val) {
|
| | | if (val.$attrs['data-num'] !== this.nowTimeIndex) {
|
| | | setTimeout(() => {
|
| | | this.nowTimeIndex = val.$attrs['data-num']
|
| | | this.nowTimeVal = val.value
|
| | | }, 300)
|
| | | }
|
| | | },
|
| | |
|
| | | // æ¶é´æ®µæ ¡éª
|
| | | async theTimeChange (val) {
|
| | | const [startTime, endTime] = val;
|
| | | // æ ¡éªå¼å§æ¶é´ä¸è½æäºæçäºç»ææ¶é´
|
| | | if (this.toChangeNumber(startTime) >= this.toChangeNumber(endTime)) {
|
| | | this.timeArr[this.nowTimeIndex].theTime = this.nowTimeVal;
|
| | | this.$message.warning(this.$t('permission.cannot_be_earlier'));
|
| | | this.resetTimeSelection();
|
| | | return;
|
| | | }
|
| | | // æ£æ¥æ¶é´æ®µæ¯å¦ä¸å
¶ä»æ¶é´æ®µéå
|
| | | const hasOverlap = this.timeArr.some((item, index) =>
|
| | | index !== this.nowTimeIndex && this.isCross(item.theTime, val)
|
| | | );
|
| | | if (hasOverlap) {
|
| | | this.timeArr[this.nowTimeIndex].theTime = this.nowTimeVal;
|
| | | this.$message.warning(this.$t('permission.times_cannot_overlap'));
|
| | | }
|
| | | this.$nextTick(() => {
|
| | | this.nowTimeIndex = 9
|
| | | this.nowTimeVal = []
|
| | | })
|
| | | },
|
| | |
|
| | | // 转æ¢ä¸ºæ°å
|
| | | toChangeNumber (str) {
|
| | | let theList = str.split(':')
|
| | | return theList[0] * 60 + (theList[1] - 0)
|
| | | },
|
| | |
|
| | | // 夿æ¯å¦äº¤å
|
| | | isCross (data1, data2) {
|
| | | const toMinutes = (str) => {
|
| | | const [hours, minutes] = str.split(':').map(Number);
|
| | | return hours * 60 + minutes;
|
| | | };
|
| | | const [start1, end1] = data1.map(toMinutes);
|
| | | const [start2, end2] = data2.map(toMinutes);
|
| | | // ç´æ¥å¤æéå æ¡ä»¶ï¼ä¸¤ä¸ªåºé´æäº¤é
|
| | | return start1 < end2 && start2 < end1;
|
| | | },
|
| | |
|
| | | // åæ¶æ·»å æ¶æ®µ
|
| | | cancelTimeAdd () {
|
| | | this.timeArr.splice(0)
|
| | | this.timeAreaVisible = false
|
| | | },
|
| | |
|
| | | confirmTimeAdd () {
|
| | | let that = this
|
| | | if (that.timeArr.length > 1) {
|
| | | // æ£æ¥æåä¸ç»æ¯å¦ä¸åé¢ä»»ä½ä¸ç»åå¨äº¤å
|
| | | let lastTime = that.timeArr[that.timeArr.length - 1].theTime
|
| | | const hasCrossWithAnyPrevious = that.timeArr
|
| | | .slice(0, -1) // æé¤æåä¸ç»
|
| | | .some(item => that.isCross(item.theTime, lastTime));
|
| | | if (hasCrossWithAnyPrevious) {
|
| | | that.$message.warning(this.$t('permission.times_cannot_overlap'));
|
| | | return false;
|
| | | }
|
| | | }
|
| | | if (this.radio == 2) {
|
| | | this.dayInfo.timeArr = this.timeArr.map(item => item.theTime.join('-')).join('|')
|
| | | } else {
|
| | | let timeLabel = []
|
| | | if (that.timeArr.length > 0) {
|
| | | that.timeArr.forEach(item => {
|
| | | timeLabel.push(item.theTime[0] + '-' + item.theTime[1])
|
| | | })
|
| | | }
|
| | | that.weeks.map(item => {
|
| | | if (item.id === that.currentId) {
|
| | | item.timeArr = timeLabel.join('|')
|
| | | }
|
| | | })
|
| | | }
|
| | | that.cancelTimeAdd()
|
| | | },
|
| | | }
|
| | | }
|
| | | </script>
|
| | | <style lang='less' scoped>
|
| | | ::v-deep .el-dialog__header {
|
| | | text-align: center !important;
|
| | | }
|
| | |
|
| | | .dialog-footer {
|
| | | text-align: center;
|
| | | }
|
| | |
|
| | | .tagStyle {
|
| | | cursor: pointer;
|
| | | }
|
| | |
|
| | | ::v-deep .el-tag--plain,
|
| | | .el-tag--dark {
|
| | | width: 60px;
|
| | | height: 40px;
|
| | | font-size: 16px;
|
| | | text-align: center;
|
| | | line-height: 40px;
|
| | | }
|
| | |
|
| | | .the-week-box {
|
| | | position: relative;
|
| | |
|
| | | .el-col-24 {
|
| | | padding: 0 10px;
|
| | | background-color: #eeeeee80;
|
| | | height: 50px;
|
| | | line-height: 50px;
|
| | | margin-top: 10px;
|
| | | overflow: hidden;
|
| | | border-radius: 6px;
|
| | | cursor: pointer;
|
| | |
|
| | | &:hover {
|
| | | background-color: #eeeeee;
|
| | | }
|
| | | }
|
| | |
|
| | | img {
|
| | | margin-top: 15px;
|
| | | width: 20px;
|
| | | height: 20px;
|
| | | }
|
| | | }
|
| | |
|
| | | .weeks:hover {
|
| | | background: #f5f7fa;
|
| | | }
|
| | |
|
| | | ::v-deep .el-range-separator {
|
| | | width: 8% !important;
|
| | | }
|
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <div class="drawContent"> |
| | | <!-- åè¯ç±»åéæ© --> |
| | | <el-tabs v-model="activeTab" class="voucher-tabs"> |
| | | <!-- å¯ç åè¯ --> |
| | | <el-tab-pane name="password" :label="$t('voucher.password')"> |
| | | <div class="tab-content"> |
| | | <el-form ref="passwordForm" :model="form" :rules="rules"> |
| | | <el-form-item prop="password"> |
| | | <el-input v-model="form.password" type="text" :placeholder="$t('voucher.validPassword')" maxlength="6" |
| | | show-word-limit clearable> |
| | | </el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- å¡çåè¯ --> |
| | | <el-tab-pane name="card" :label="$t('voucher.card')"> |
| | | <div class="tab-content"> |
| | | <el-form ref="cardForm" :model="form" :rules="rules"> |
| | | <el-form-item prop="card"> |
| | | <el-input v-model="form.card" :placeholder="$t('voucher.validCard')" clearable></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- 人è¸åè¯ --> |
| | | <el-tab-pane name="face" :label="$t('voucher.face')"> |
| | | <div class="tab-content face-tab"> |
| | | <!-- æ³¨åæ¹å¼éæ© --> |
| | | <div class="register-type-selector"> |
| | | <el-radio-group v-model="faceType" @change="handleRegisterTypeChange"> |
| | | <el-radio-button :label="0">{{ $t('voucher.photoRegistration') }}</el-radio-button> |
| | | <el-radio-button :label="1">{{ $t('voucher.featureValueRegistration') }}</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- ç
§çä¸ä¼ 注å --> |
| | | <div v-if="faceType == 0" class="photo-register"> |
| | | <div class="upload-area"> |
| | | <el-upload class="avatar-uploader" action="#" :show-file-list="false" accept=".jpg,.jpeg" :on-change="handleUploadChange" |
| | | :auto-upload="false"> |
| | | <img v-if="faceImage" :src="faceImage" class="avatar" /> |
| | | <i v-else class="el-icon-plus avatar-uploader-icon"></i> |
| | | <!-- æ¸
é¤æé® --> |
| | | <el-button v-if="faceImage" class="clear-btn" type="danger" icon="el-icon-delete" circle |
| | | @click.stop="clearImage"></el-button> |
| | | </el-upload> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- ç¹å¾å¼æ³¨å --> |
| | | <div v-if="faceType == 1" class="feature-register"> |
| | | <div class="feature-input-area"> |
| | | <el-input type="textarea" clearable :rows="6" :placeholder="$t('common.placeholder')" |
| | | v-model="faceFeature" class="feature-textarea"> |
| | | </el-input> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- æçº¹åè¯ --> |
| | | <el-tab-pane v-if="fingerprintEnabled" name="fingerprint" :label="$t('voucher.finger')"> |
| | | <div class="tab-content fingerprint-tab"> |
| | | <!-- æ³¨åæ¹å¼éæ© --> |
| | | <div class="register-type-selector"> |
| | | <el-radio-group v-model="fingerprintType" @change="handleFingerprintTypeChange"> |
| | | <el-radio-button :label="0">{{ $t('voucher.fingerRegistration') }}</el-radio-button> |
| | | <el-radio-button :label="1">{{ $t('voucher.fingerFeatureRegistration') }}</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- æçº¹å½å
¥ --> |
| | | <div v-if="fingerprintType == 0" class="fingerprint-capture"> |
| | | <div class="capture-area"> |
| | | <div class="fingerprint-status"> |
| | | <i :class="fingerprintStatusIcon" class="status-icon"></i> |
| | | <p class="status-text">{{ fingerprintStatusText }}</p> |
| | | </div> |
| | | <el-button |
| | | type="primary" |
| | | :loading="fingerprintLoading" |
| | | :disabled="fingerprintLoading" |
| | | @click="enrollFinger"> |
| | | {{ fingerprintLoading ? $t('voucher.fingerInputting') : (hasFingerprint ? $t('voucher.fingerReInput') : $t('voucher.startFingerInput')) }} |
| | | </el-button> |
| | | <div v-if="fingerprintLoading" class="capture-tips"> |
| | | <p>{{ $t('voucher.fingerInput') }}</p> |
| | | <p class="timeout-text">{{ $t('voucher.fingerRemainingTime') }}: {{ fingerprintTimeout }}S</p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- ç¹å¾å¼æ³¨å --> |
| | | <div v-if="fingerprintType == 1" class="feature-register"> |
| | | <div class="feature-input-area"> |
| | | <el-input type="textarea" clearable :rows="6" :placeholder="$t('voucher.fingerInputTips')" |
| | | v-model="fingerprintFeature" class="feature-textarea"> |
| | | </el-input> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- PINç åè¯ --> |
| | | <el-tab-pane name="code" :label="$t('voucher.code')" v-if="model == 'vf105' || model == 'vf114'"> |
| | | <Table :table-label="tableHeader" :table-data="tableData" :table-option="tableOption"></Table> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | |
| | | <!-- æä½æé® --> |
| | | <div class="dialog-footer"> |
| | | <el-button type="warning" @click="handleAddClose"> |
| | | {{ $t('common.cancel') }} |
| | | </el-button> |
| | | <el-button v-if="activeTab != 'code'" type="primary" :loading="isLoading" :disabled="isLoading" @click="addConfirm"> |
| | | {{ $t('common.confirm') }} |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import Table from "@/components/table/tableList"; |
| | | import { generateRandomString, throttle } from '@/utils/index.js' |
| | | export default { |
| | | props: { |
| | | formData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEditType: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | }, |
| | | components: { |
| | | Table |
| | | }, |
| | | data () { |
| | | return { |
| | | visible: false, |
| | | userId: '', |
| | | name: '', |
| | | form: { |
| | | password: '', |
| | | card: '', |
| | | face: '', |
| | | fingerprint: '', |
| | | // code100: '', |
| | | // code101: '', |
| | | // code103: '', |
| | | oldPassword: '', |
| | | oldCard: '', |
| | | oldFace: '', |
| | | oldFingerprint: '', |
| | | // oldCode100: '', |
| | | // oldCode101: '', |
| | | // oldCode103: '' |
| | | }, |
| | | keyId: { |
| | | password: '', |
| | | card: '', |
| | | face: '', |
| | | fingerprint: '', |
| | | // code100: '', |
| | | // code101: '', |
| | | // code103: '', |
| | | }, |
| | | rules: { |
| | | password: [{ message: this.$t('voucher.validPassword'), trigger: ["blur"], pattern: /^\d{6}$/ }], |
| | | card: [{ message: this.$t('voucher.validCard'), trigger: ["blur"], pattern: /^[0-9a-zA-Z]+$/ },], |
| | | }, |
| | | model: '', |
| | | isLoading: false, |
| | | // åè¯æ°æ® |
| | | activeTab: 'password', |
| | | faceType: 0, // æ³¨åæ¹å¼:0-ç
§ç注å,1-ç¹å¾å¼æ³¨å |
| | | faceImage: '', // 人è¸å¾ç base64 æ URL |
| | | faceFeature: '', // 人è¸ç¹å¾å¼ |
| | | originalFaceData: null, // åå¨åå§äººè¸æ°æ®,ç¨äºå¤ææ¯å¦ä¿®æ¹ |
| | | |
| | | // æçº¹ç¸å
³æ°æ® |
| | | fingerprintType: 0, // æ³¨åæ¹å¼:0-æçº¹å½å
¥,1-ç¹å¾å¼æ³¨å |
| | | fingerprintFeature: '', // æçº¹ç¹å¾å¼ |
| | | fingerprintLoading: false, // æçº¹å½å
¥å è½½ç¶æ |
| | | fingerprintTimeout: 60, // æçº¹å½å
¥è¶
æ¶æ¶é´ |
| | | fingerprintTimer: null, // æçº¹å½å
¥å®æ¶å¨ |
| | | fingerprintPollTimer: null, // æçº¹å½å
¥è½®è¯¢å®æ¶å¨ |
| | | fingerprintStatusText: 'çå¾
å½å
¥', // æçº¹ç¶æææ¬ |
| | | fingerprintStatusIcon: 'el-icon-fingerprint', // æçº¹ç¶æå¾æ |
| | | originalFingerprintData: null, // åå¨åå§æçº¹æ°æ®,ç¨äºå¤ææ¯å¦ä¿®æ¹ |
| | | hasFingerprint: false, // æ¯å¦å·²ææçº¹åè¯ |
| | | tableHeader: [ |
| | | { |
| | | label: this.$t('voucher.credentialId'), |
| | | list: 'keyId', |
| | | }, |
| | | { |
| | | label: this.$t('voucher.codeType'), |
| | | list: 'type', |
| | | }, |
| | | { |
| | | label: this.$t('voucher.credentialValue'), |
| | | list: 'code', |
| | | }, |
| | | ], |
| | | tableOption: { |
| | | label: this.$t('common.operation'), |
| | | width: "100px", |
| | | value: 0, |
| | | options: [ |
| | | { |
| | | label: this.$t('common.delete'), |
| | | key: 1, |
| | | type: "text", |
| | | State: true, |
| | | method: (row) => { |
| | | this.handleDeleteCode(row.keyId) |
| | | }, |
| | | } |
| | | ] |
| | | }, |
| | | tableData: [], |
| | | }; |
| | | }, |
| | | created () { |
| | | this.initialForm = JSON.parse(JSON.stringify(this.form)); |
| | | this.initialKeyId = JSON.parse(JSON.stringify(this.keyId)); |
| | | this.userId = this.formData.userId |
| | | let publicConfig = sessionStorage.getItem('publicConfig') |
| | | let { finger, model } = publicConfig ? JSON.parse(publicConfig) : {} |
| | | this.fingerprintEnabled = finger |
| | | this.model = model |
| | | this.getVoucher() |
| | | }, |
| | | beforeDestroy() { |
| | | // æ¸
ç宿¶å¨ |
| | | this.interruptFinger() |
| | | this.clearFingerprintTimers() |
| | | }, |
| | | methods: { |
| | | // æ¥è¯¢åè¯ |
| | | async getVoucher () { |
| | | let data = { |
| | | page: 0, |
| | | size: 100, |
| | | userId: this.userId |
| | | } |
| | | try { |
| | | const res = await this.$http.post('/getKey', { data }) |
| | | if (res.code == 200) { |
| | | console.log(res) |
| | | let content = res.data.content |
| | | let card = content.filter(v => v.type == 200)[0] |
| | | if (card) { |
| | | this.form.card = card.code |
| | | this.form.oldCard = card.code |
| | | this.keyId.card = card.keyId |
| | | } else { |
| | | this.keyId.card = '' |
| | | } |
| | | let face = content.filter(v => v.type == 300)[0] |
| | | if (face) { |
| | | // ä¿ååå§äººè¸æ°æ® |
| | | let faceType = face.extra ? JSON.parse(face.extra).faceType : 0 |
| | | this.originalFaceData = { |
| | | keyId: face.keyId, |
| | | code: face.code, |
| | | faceType |
| | | } |
| | | if (face.extra) { |
| | | if (faceType == 0) { |
| | | this.faceImage = "data:image/jpeg;base64," + face.code |
| | | } else if (faceType == 1) { |
| | | this.faceFeature = face.code |
| | | } |
| | | this.faceType = faceType |
| | | } |
| | | this.form.face = face.code |
| | | this.form.oldFace = face.code |
| | | this.keyId.face = face.keyId |
| | | } else { |
| | | this.keyId.face = '' |
| | | this.originalFaceData = null |
| | | } |
| | | let password = content.filter(v => v.type == 400)[0] |
| | | if (password) { |
| | | this.form.password = password.code |
| | | this.form.oldPassword = password.code |
| | | this.keyId.password = password.keyId |
| | | } else { |
| | | this.keyId.password = '' |
| | | } |
| | | |
| | | // å¤çæçº¹åè¯ |
| | | let fingerprint = content.filter(v => v.type == 500)[0] |
| | | if (fingerprint) { |
| | | let fingerprintType = fingerprint.extra ? JSON.parse(fingerprint.extra).fingerprintType : 0 |
| | | this.originalFingerprintData = { |
| | | keyId: fingerprint.keyId, |
| | | code: fingerprint.code, |
| | | fingerprintType |
| | | } |
| | | // 妿已ææçº¹åè¯ï¼é»è®¤æ¾ç¤ºæçº¹å½å
¥é¡µé¢ï¼fingerprintType = 0ï¼ |
| | | // ä½ä¿çåå§ fingerprintType ç¨äºå¤ææ¯å¦ä¿®æ¹ |
| | | this.fingerprintType = 0 |
| | | this.hasFingerprint = true |
| | | // 妿åå§æ¯ç¹å¾å¼æ³¨åï¼ä¿åç¹å¾å¼ç¨äºæ¾ç¤º |
| | | if (fingerprint.extra && fingerprintType == 1) { |
| | | this.fingerprintFeature = fingerprint.code |
| | | } |
| | | this.form.fingerprint = fingerprint.code |
| | | this.form.oldFingerprint = fingerprint.code |
| | | this.keyId.fingerprint = fingerprint.keyId |
| | | // è®¾ç½®ç¶æææ¬ä¸º"æçº¹å·²å½å
¥" |
| | | this.fingerprintStatusText = this.$t('voucher.fingerInputed') |
| | | this.fingerprintStatusIcon = 'el-icon-success' |
| | | } else { |
| | | this.keyId.fingerprint = '' |
| | | this.originalFingerprintData = null |
| | | this.hasFingerprint = false |
| | | // éç½®ç¶æææ¬ |
| | | this.fingerprintStatusText = this.$t('voucher.fingerWaitInput') |
| | | this.fingerprintStatusIcon = 'el-icon-fingerprint' |
| | | } |
| | | |
| | | this.tableData = content.filter(v => v.type == 100 || v.type == 101 || v.type == 103) |
| | | console.log(this.tableData) |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | } catch (even) { |
| | | console.log(even); |
| | | } |
| | | }, |
| | | |
| | | // å¤çæ³¨åæ¹å¼åå |
| | | handleRegisterTypeChange (value) { |
| | | console.log('åæ¢æ³¨åæ¹å¼:', value); |
| | | }, |
| | | |
| | | // å¤çæçº¹æ³¨åæ¹å¼åå |
| | | handleFingerprintTypeChange (value) { |
| | | console.log('忢æçº¹æ³¨åæ¹å¼:', value); |
| | | // æ¸
ç宿¶å¨ |
| | | this.clearFingerprintTimers() |
| | | // æ ¹æ®æ¯å¦å·²ææçº¹åè¯è®¾ç½®ç¶æææ¬ |
| | | if (value === 0) { |
| | | this.fingerprintStatusText = this.hasFingerprint ? this.$t('voucher.fingerInputed') : this.$t('voucher.fingerWaitInput') |
| | | this.fingerprintStatusIcon = this.hasFingerprint ? 'el-icon-success' : 'el-icon-fingerprint' |
| | | } else { |
| | | this.fingerprintStatusText = this.$t('voucher.fingerWaitInput') |
| | | this.fingerprintStatusIcon = 'el-icon-fingerprint' |
| | | } |
| | | }, |
| | | |
| | | // æ¸
é¤å®æ¶å¨ |
| | | clearFingerprintTimers() { |
| | | if (this.fingerprintTimer) { |
| | | clearInterval(this.fingerprintTimer) |
| | | this.fingerprintTimer = null |
| | | } |
| | | if (this.fingerprintPollTimer) { |
| | | clearInterval(this.fingerprintPollTimer) |
| | | this.fingerprintPollTimer = null |
| | | } |
| | | }, |
| | | |
| | | // å¼å§æçº¹å½å
¥ |
| | | async enrollFinger() { |
| | | if (!this.fingerprintEnabled) { |
| | | this.$message.warning('å½å设å¤ä¸æ¯ææçº¹æä½') |
| | | return |
| | | } |
| | | if (!this.userId) { |
| | | this.$message.error(this.$t('person.userNotExist')) |
| | | return false |
| | | } |
| | | this.fingerprintLoading = true |
| | | this.fingerprintTimeout = 60 |
| | | this.fingerprintStatusText = this.$t('voucher.fingerInputNow') |
| | | this.fingerprintStatusIcon = 'el-icon-loading' |
| | | |
| | | try { |
| | | // åéæçº¹å½å
¥æä»¤ |
| | | const startRes = await this.$http.post('/control', { |
| | | data: { |
| | | command: 12, |
| | | extra: { |
| | | userId: this.userId, |
| | | fingerprintAction: 0, |
| | | isRemote: false |
| | | }, |
| | | } |
| | | }) |
| | | |
| | | if (startRes.code !== 200) { |
| | | this.$message.error(startRes.message || this.$t('voucher.fingerInputFailed')) |
| | | this.resetFingerprintStatus() |
| | | return |
| | | } |
| | | |
| | | // å¼å§åè®¡æ¶ |
| | | this.fingerprintTimer = setInterval(() => { |
| | | this.fingerprintTimeout-- |
| | | if (this.fingerprintTimeout <= 0) { |
| | | this.handleFingerprintTimeout() |
| | | } |
| | | }, 1000) |
| | | |
| | | // å¼å§è½®è¯¢æ¥è¯¢æçº¹å½å
¥ç»æ |
| | | this.fingerprintPollTimer = setInterval(async () => { |
| | | await this.checkFingerprintResult() |
| | | }, 500) // æ¯0.5ç§æ¥è¯¢ä¸æ¬¡ |
| | | |
| | | } catch (error) { |
| | | console.error('æçº¹å½å
¥å¤±è´¥:', error) |
| | | this.$message.error(this.$t('voucher.fingerReTry')) |
| | | this.resetFingerprintStatus() |
| | | } |
| | | }, |
| | | |
| | | // 䏿æçº¹å½å
¥ |
| | | async interruptFinger () { |
| | | if (!this.fingerprintLoading) return |
| | | try { |
| | | await this.$http.post('/control', { |
| | | data: { |
| | | command: 12, |
| | | extra: { |
| | | fingerprintAction: 1 |
| | | } |
| | | } |
| | | }) |
| | | } catch (error) { |
| | | console.error('䏿æçº¹éé失败:', error) |
| | | } finally { |
| | | this.fingerprintLoading = false |
| | | this.clearFingerprintTimers() |
| | | } |
| | | }, |
| | | |
| | | // æ¥è¯¢æçº¹å½å
¥ç»æ |
| | | async checkFingerprintResult() { |
| | | try { |
| | | const res = await this.$http.post('/getFingerChar', { |
| | | data: { |
| | | userId: this.userId |
| | | } |
| | | }) |
| | | |
| | | if (res.code === 200 && res.data && typeof res.data.ret == 'string') { |
| | | // å½å
¥æåï¼å°ç¹å¾å¼å¡«å
å°form.fingerprintåfingerprintFeature |
| | | const featureValue = res.data.ret |
| | | this.form.fingerprint = featureValue |
| | | this.fingerprintFeature = featureValue |
| | | |
| | | this.fingerprintStatusText = this.$t('voucher.fingerInputSuccess') |
| | | this.fingerprintStatusIcon = 'el-icon-success' |
| | | this.$message.success(this.$t('voucher.fingerFilled')) |
| | | this.resetFingerprintStatus(false) |
| | | |
| | | // æ è®°å·²ææçº¹åè¯ |
| | | this.hasFingerprint = true |
| | | |
| | | // å½å
¥æååï¼èªå¨åæ¢å°ç¹å¾å¼æ³¨å模å¼ï¼å±ç¤ºééå°çç¹å¾å¼ |
| | | // æ 论æ¯é¦æ¬¡å½å
¥è¿æ¯éæ°å½å
¥ï¼é½è¦åæ¢å°ç¹å¾å¼æ³¨åé¡µé¢ |
| | | this.fingerprintType = 1 |
| | | }else if (res.code === 200 && res.data && res.data.ret == -1) { |
| | | this.$message.error(this.$t('voucher.fingerFailed')) |
| | | this.handleFingerprintError() |
| | | } |
| | | } catch (error) { |
| | | console.error('æ¥è¯¢æçº¹ç»æå¤±è´¥:', error) |
| | | } |
| | | }, |
| | | |
| | | // å¤çæçº¹å½å
¥è¶
æ¶ |
| | | handleFingerprintTimeout() { |
| | | this.$message.error(this.$t('voucher.fingerInputTimeout')) |
| | | this.fingerprintStatusText = this.$t('voucher.fingerTimeout') |
| | | this.fingerprintStatusIcon = 'el-icon-error' |
| | | this.resetFingerprintStatus() |
| | | }, |
| | | |
| | | // å¤çæçº¹å½å
¥å¤±è´¥ |
| | | handleFingerprintError() { |
| | | this.$message.error(this.$t('voucher.fingerInputError')) |
| | | this.fingerprintStatusText = this.$t('voucher.fingerError') |
| | | this.fingerprintStatusIcon = 'el-icon-error' |
| | | this.resetFingerprintStatus() |
| | | }, |
| | | |
| | | // éç½®æçº¹å½å
¥ç¶æ |
| | | resetFingerprintStatus(resetText = true) { |
| | | this.fingerprintLoading = false |
| | | this.clearFingerprintTimers() |
| | | if (resetText) { |
| | | setTimeout(() => { |
| | | // æ ¹æ®æ¯å¦å·²ææçº¹åè¯è®¾ç½®ç¶æææ¬ |
| | | this.fingerprintStatusText = this.hasFingerprint ? this.$t('voucher.fingerInputed') : this.$t('voucher.fingerWaitInput') |
| | | this.fingerprintStatusIcon = this.hasFingerprint ? 'el-icon-success' : 'el-icon-fingerprint' |
| | | }, 2000) |
| | | } |
| | | }, |
| | | |
| | | clearImage () { |
| | | this.faceImage = "" |
| | | this.form.face = "" |
| | | }, |
| | | |
| | | handleUploadChange (file) { |
| | | const reader = new FileReader(); |
| | | reader.onload = (e) => { |
| | | console.log(e); |
| | | let result = e.target.result |
| | | this.faceImage = result |
| | | this.form.face = result.split(',').pop() |
| | | }; |
| | | reader.readAsDataURL(file.raw); |
| | | }, |
| | | |
| | | addConfirm: throttle (async function() { |
| | | if (this.isLoading) return |
| | | // æäº¤åè¯é»è¾ |
| | | try { |
| | | // 妿æ¯äººè¸åè¯,éè¦æ ¹æ®å½åç±»åè®¾ç½®æ°æ® |
| | | if (this.activeTab === 'face') { |
| | | if (this.faceType === 1) { |
| | | // ç¹å¾å¼æ³¨å,ç´æ¥ä½¿ç¨ç¹å¾å¼ |
| | | this.form.face = this.faceFeature |
| | | } |
| | | // ç
§ç注åå·²ç»å¨handleUploadChangeä¸è®¾ç½®å¥½äºform.face |
| | | } |
| | | |
| | | // å¦ææ¯æçº¹åè¯,éè¦æ ¹æ®å½åç±»åè®¾ç½®æ°æ® |
| | | if (this.activeTab === 'fingerprint') { |
| | | if (this.fingerprintType === 1) { |
| | | // ç¹å¾å¼æ³¨å,ç´æ¥ä½¿ç¨ç¹å¾å¼ |
| | | this.form.fingerprint = this.fingerprintFeature |
| | | } |
| | | // æçº¹å½å
¥å·²ç»å¨checkFingerprintResultä¸è®¾ç½®å¥½äºform.fingerprint |
| | | } |
| | | |
| | | await this.$refs.passwordForm.validate(); |
| | | await this.$refs.cardForm.validate(); |
| | | this.submitData(); |
| | | } catch (error) { |
| | | console.log(error) |
| | | } |
| | | }, 2000), |
| | | |
| | | handleAddClose () { |
| | | this.interruptFinger() |
| | | this.clearFingerprintTimers() |
| | | this.$emit('close-drawer', false); |
| | | }, |
| | | |
| | | async submitData () { |
| | | this.isLoading = true |
| | | try { |
| | | if (!this.userId) { |
| | | this.$message.error(this.$t('person.userNotExist')) |
| | | return false |
| | | } |
| | | let keyAddList = [] |
| | | let keyEditList = [] |
| | | let keyDeleteList = [] |
| | | // å¤çå¯ç åè¯ |
| | | this.processPasswordVoucher(keyAddList, keyEditList, keyDeleteList) |
| | | // å¤çå¡çåè¯ |
| | | this.processCardVoucher(keyAddList, keyEditList, keyDeleteList) |
| | | // å¤ç人è¸åè¯ |
| | | this.processFaceVoucher(keyAddList, keyEditList, keyDeleteList) |
| | | // å¤çæçº¹åè¯ |
| | | if (this.fingerprintEnabled) { |
| | | this.processFingerprintVoucher(keyAddList, keyEditList, keyDeleteList) |
| | | } |
| | | |
| | | if (keyAddList.length) { |
| | | const res = await this.$http.post( |
| | | "/insertKey", |
| | | { |
| | | data: keyAddList |
| | | } |
| | | ); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('common.saveSuccess')) |
| | | this.getVoucher() |
| | | } else { |
| | | if (res.data && res.data[0]) { |
| | | this.$message.error(res.data[0].errmsg) |
| | | } |
| | | } |
| | | } |
| | | if (keyEditList.length) { |
| | | const res = await this.$http.post( |
| | | "/modifyKey", |
| | | { |
| | | data: keyEditList |
| | | } |
| | | ); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('common.saveSuccess')) |
| | | this.getVoucher() |
| | | } else { |
| | | if (res.data && res.data[0]) { |
| | | this.$message.error(res.data[0].errmsg) |
| | | } |
| | | } |
| | | } |
| | | if (keyDeleteList.length) { |
| | | const res = await this.$http.post( |
| | | "/delKey", |
| | | { |
| | | data: { keyIds: keyDeleteList } |
| | | } |
| | | ); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('common.saveSuccess')) |
| | | this.getVoucher() |
| | | } else { |
| | | if (res.data && res.data[0]) { |
| | | this.$message.error(res.data[0].errmsg) |
| | | } |
| | | } |
| | | } |
| | | // å¦ææ²¡ææ°æ®åå |
| | | if (!keyAddList.length && !keyEditList.length && !keyDeleteList.length) { |
| | | this.$message.info(this.$t('common.noDataSaved')) |
| | | } |
| | | } catch (error) { |
| | | console.error('submitData error:', error) |
| | | } finally { |
| | | this.isLoading = false |
| | | } |
| | | }, |
| | | |
| | | // å¤çå¯ç åè¯ |
| | | processPasswordVoucher (keyAddList, keyEditList, keyDeleteList) { |
| | | // 妿åå¨å¯ç åè¯,ä¸å¯ç æåå,åä¿®æ¹ |
| | | if (this.keyId.password) { |
| | | if (this.form.password) { |
| | | if (this.form.password !== this.form.oldPassword) { |
| | | keyEditList.push({ |
| | | keyId: this.keyId.password, |
| | | userId: this.userId, |
| | | type: '400', |
| | | code: this.form.password |
| | | }) |
| | | } |
| | | } else { |
| | | keyDeleteList.push(this.keyId.password) |
| | | } |
| | | } else { |
| | | // ä¸åå¨å¯ç åè¯,æ°å¢ |
| | | // 妿å¯ç 为空,ä¸å¤ç |
| | | if (!this.form.password) return |
| | | keyAddList.push({ |
| | | keyId: generateRandomString(), |
| | | userId: this.userId, |
| | | type: '400', |
| | | code: this.form.password |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | // å¤çå¡çåè¯ |
| | | processCardVoucher (keyAddList, keyEditList, keyDeleteList) { |
| | | // 妿åå¨å¡çåè¯,ä¸å¡çå·æåå,åä¿®æ¹ |
| | | if (this.keyId.card) { |
| | | if (this.form.card) { |
| | | if (this.form.card !== this.form.oldCard) { |
| | | keyEditList.push({ |
| | | keyId: this.keyId.card, |
| | | userId: this.userId, |
| | | type: '200', |
| | | code: this.form.card |
| | | }) |
| | | } |
| | | } else { |
| | | keyDeleteList.push(this.keyId.card) |
| | | } |
| | | } else { |
| | | // ä¸åå¨å¡çåè¯,æ°å¢ |
| | | // 妿å¡çå·ä¸ºç©º,ä¸å¤ç |
| | | if (!this.form.card) return |
| | | keyAddList.push({ |
| | | keyId: generateRandomString(), |
| | | userId: this.userId, |
| | | type: '200', |
| | | code: this.form.card |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | // å¤ç人è¸åè¯ |
| | | processFaceVoucher (keyAddList, keyEditList, keyDeleteList) { |
| | | // å¦æäººè¸æ°æ®ä¸ºç©º,ä¸å¤ç |
| | | const hasFaceVoucher = this.originalFaceData !== null |
| | | // 妿åå¨äººè¸åè¯,ä¸äººè¸æ°æ®æåå,åä¿®æ¹ |
| | | if (hasFaceVoucher) { |
| | | // å¤ææ°æ®æ¯å¦æåå |
| | | const isDataChanged = |
| | | this.form.face !== this.form.oldFace || |
| | | this.faceType !== this.originalFaceData.faceType |
| | | |
| | | if (isDataChanged) { |
| | | if (this.form.face) { |
| | | keyEditList.push({ |
| | | keyId: this.keyId.face, |
| | | userId: this.userId, |
| | | type: '300', |
| | | code: this.form.face, |
| | | extra: { |
| | | faceType: this.faceType |
| | | } |
| | | }) |
| | | } else { |
| | | keyDeleteList.push(this.keyId.face) |
| | | } |
| | | } |
| | | } else { |
| | | // ä¸åå¨äººè¸åè¯,æ°å¢ |
| | | if (!this.form.face) return |
| | | // 夿æ¯å¦å·²åå¨äººè¸åè¯ |
| | | keyAddList.push({ |
| | | keyId: generateRandomString(), |
| | | userId: this.userId, |
| | | type: '300', |
| | | code: this.form.face, |
| | | extra: { |
| | | faceType: this.faceType |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | // å¤çæçº¹åè¯ |
| | | processFingerprintVoucher (keyAddList, keyEditList, keyDeleteList) { |
| | | // 妿æçº¹æ°æ®ä¸ºç©º,ä¸å¤ç |
| | | const hasFingerprintVoucher = this.originalFingerprintData !== null |
| | | // 妿åå¨æçº¹åè¯,ä¸æçº¹æ°æ®æåå,åä¿®æ¹ |
| | | if (hasFingerprintVoucher) { |
| | | // ç¡®å®è¦ä½¿ç¨ç fingerprintType |
| | | let finalFingerprintType = this.fingerprintType |
| | | // 妿å½åå¨æçº¹å½å
¥é¡µé¢ï¼fingerprintType === 0ï¼ä¸æçº¹æ°æ®æ²¡æååï¼è¯´ææ²¡æéæ°å½å
¥ï¼ä¿æåå§ç fingerprintType |
| | | if (this.fingerprintType === 0 && this.form.fingerprint === this.form.oldFingerprint) { |
| | | finalFingerprintType = this.originalFingerprintData.fingerprintType |
| | | } |
| | | // 妿å½åå¨ç¹å¾å¼æ³¨å页é¢ï¼fingerprintType === 1ï¼ï¼ä½¿ç¨ç¹å¾å¼æ³¨åç±»å |
| | | // å¤ææ°æ®æ¯å¦æåå |
| | | const isDataChanged = |
| | | this.form.fingerprint !== this.form.oldFingerprint || |
| | | finalFingerprintType !== this.originalFingerprintData.fingerprintType |
| | | |
| | | if (isDataChanged) { |
| | | if (this.form.fingerprint) { |
| | | keyEditList.push({ |
| | | keyId: this.keyId.fingerprint, |
| | | userId: this.userId, |
| | | type: '500', |
| | | code: this.form.fingerprint, |
| | | extra: { |
| | | fingerprintType: finalFingerprintType |
| | | } |
| | | }) |
| | | } else { |
| | | keyDeleteList.push(this.keyId.fingerprint) |
| | | } |
| | | } |
| | | } else { |
| | | // ä¸åå¨æçº¹åè¯,æ°å¢ |
| | | if (!this.form.fingerprint) return |
| | | keyAddList.push({ |
| | | keyId: generateRandomString(), |
| | | userId: this.userId, |
| | | type: '500', |
| | | code: this.form.fingerprint, |
| | | extra: { |
| | | fingerprintType: this.fingerprintType |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | handleDeleteCode (keyId) { |
| | | let that = this |
| | | this.$confirm( |
| | | this.$t('common.deleteTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | try { |
| | | const res = await that.$http.post("/delKey", { |
| | | data: { |
| | | keyIds: [keyId] |
| | | } |
| | | }) |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('common.deleteSuccess')) |
| | | that.getVoucher() |
| | | } else { |
| | | that.$message.error(res.message) |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }).catch(() => { }) |
| | | }, |
| | | |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang='less' scoped> |
| | | .voucher-tabs { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .tab-content { |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | /* ä¸ä¼ åºå */ |
| | | .avatar-uploader { |
| | | border: 2px dashed #d9d9d9; |
| | | border-radius: 8px; |
| | | cursor: pointer; |
| | | width: 150px; |
| | | height: 150px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | overflow: hidden; |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | .avatar-uploader:hover { |
| | | border-color: #409eff; |
| | | } |
| | | |
| | | .avatar { |
| | | width: 100%; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | } |
| | | |
| | | .avatar-uploader-icon { |
| | | font-size: 28px; |
| | | color: #999; |
| | | } |
| | | |
| | | .upload-tip { |
| | | margin-top: 8px; |
| | | font-size: 12px; |
| | | color: #999; |
| | | } |
| | | |
| | | /* å¡çæç¤º */ |
| | | .card-scan-tip { |
| | | font-size: 13px; |
| | | color: #666; |
| | | margin-top: 10px; |
| | | padding: 10px; |
| | | background: #e6f7ff; |
| | | border-radius: 4px; |
| | | border-left: 4px solid #1890ff; |
| | | } |
| | | |
| | | .face-register-container { |
| | | max-width: 800px; |
| | | margin: 0 auto; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .register-type-selector { |
| | | margin-bottom: 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .upload-area { |
| | | text-align: center; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .avatar-uploader { |
| | | position: relative; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .avatar-uploader .el-upload { |
| | | border: 1px dashed #d9d9d9; |
| | | border-radius: 6px; |
| | | cursor: pointer; |
| | | position: relative; |
| | | overflow: hidden; |
| | | width: 150px; |
| | | height: 150px; |
| | | } |
| | | |
| | | .avatar-uploader .el-upload:hover { |
| | | border-color: #409EFF; |
| | | } |
| | | |
| | | /deep/.clear-btn { |
| | | position: absolute; |
| | | top: -10px; |
| | | left: 5px; |
| | | width: 24px !important; |
| | | height: 24px !important; |
| | | font-size: 12px; |
| | | z-index: 10; |
| | | } |
| | | |
| | | .avatar-uploader-icon { |
| | | font-size: 28px; |
| | | color: #8c939d; |
| | | width: 150px; |
| | | height: 150px; |
| | | line-height: 150px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .avatar { |
| | | width: 150px; |
| | | height: 150px; |
| | | display: block; |
| | | } |
| | | |
| | | .feature-input-area { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .feature-textarea { |
| | | width: 100%; |
| | | } |
| | | |
| | | .feature-tips { |
| | | margin-top: 10px; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .action-buttons { |
| | | margin-top: 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .el-button { |
| | | margin: 0 10px; |
| | | } |
| | | |
| | | /* æçº¹ç¸å
³æ ·å¼ */ |
| | | .fingerprint-tab { |
| | | min-height: 200px; |
| | | } |
| | | |
| | | .capture-area { |
| | | text-align: center; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .fingerprint-status { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .status-icon { |
| | | font-size: 64px; |
| | | color: #409EFF; |
| | | display: block; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .status-icon.el-icon-loading { |
| | | animation: rotating 2s linear infinite; |
| | | } |
| | | |
| | | .status-icon.el-icon-success { |
| | | color: #67C23A; |
| | | } |
| | | |
| | | .status-icon.el-icon-error { |
| | | color: #F56C6C; |
| | | } |
| | | |
| | | @keyframes rotating { |
| | | from { |
| | | transform: rotate(0deg); |
| | | } |
| | | to { |
| | | transform: rotate(360deg); |
| | | } |
| | | } |
| | | |
| | | .status-text { |
| | | font-size: 16px; |
| | | color: #606266; |
| | | margin: 10px 0; |
| | | } |
| | | |
| | | .capture-tips { |
| | | margin-top: 20px; |
| | | font-size: 14px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .capture-tips p { |
| | | margin: 5px 0; |
| | | } |
| | | |
| | | .timeout-text { |
| | | color: #F56C6C; |
| | | font-weight: bold; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <el-main>
|
| | | <el-row>
|
| | | <el-col :span="24">
|
| | | <el-form :inline="true" class="el-InputForm">
|
| | | <!-- <el-form-item :label="$t('log.accessMethod')">
|
| | | <el-select v-model="searchForm.type" :placeholder="$t('common.placeholderSelect')" clearable>
|
| | | <el-option :label="$t('voucher.password')" value="400"></el-option>
|
| | | <el-option :label="$t('voucher.card')" value="200"></el-option>
|
| | | <el-option :label="$t('voucher.face')" value="300"></el-option>
|
| | | </el-select>
|
| | | </el-form-item>
|
| | | |
| | | <el-form-item label="éè¡ç»æ">
|
| | | <el-select v-model="searchItem.result" placeholder="è¯·éæ©éè¡ç»æ" clearable>
|
| | | <el-option label="æå" value="1"></el-option>
|
| | | <el-option label="失败" value="0"></el-option>
|
| | | </el-select>
|
| | | </el-form-item> -->
|
| | | <el-form-item :label="$t('person.name')" label-width="80px">
|
| | | <el-input v-model="searchForm.name" :placeholder="$t('person.placeholderName')" clearable></el-input>
|
| | | </el-form-item>
|
| | | <el-form-item :label="$t('log.passingTime')" label-width="100px">
|
| | | <el-date-picker v-model="time" value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange" :range-separator="$t('common.to')"
|
| | | :start-placeholder="$t('common.startTime')" :end-placeholder="$t('common.endTime')">
|
| | | </el-date-picker>
|
| | | </el-form-item>
|
| | | <div style="position: absolute; right: 25px; bottom: 25px;">
|
| | | <el-button type="info" size="medium" icon="el-icon-search" @click="search()"
|
| | | style="margin-left:10px;border:none;">{{ $t('common.query') }}</el-button>
|
| | | <el-button type="warning" size="medium" icon="el-icon-refresh-right" @click="doReset()">{{
|
| | | $t('common.reset')
|
| | | }}</el-button>
|
| | | </div>
|
| | | </el-form>
|
| | | <el-col :span="24" style="margin:20px 0">
|
| | | <el-button type="danger" size="mini" style="font-size:12px;" icon="el-icon-delete" @click="batchDelete()">{{
|
| | | $t('common.batchDelete') }}</el-button>
|
| | | </el-col>
|
| | | </el-col>
|
| | | </el-row>
|
| | |
|
| | | <el-col :span="24">
|
| | | <Table :table-label="tableHeader" v-loading="isSubmitLoading" :table-data="tableData" :table-option="tableOption"
|
| | | :table-selection="tableSelection" @onHandleSelectionChange="handleSelectionChange"></Table>
|
| | | <pagination ref="page" :total="total" @pageChange="pageChange"></pagination>
|
| | |
|
| | | </el-col>
|
| | |
|
| | | <!-- éè¡å¾çé¢è§ -->
|
| | | <el-dialog :visible.sync="dialogTableVisible" width="30%">
|
| | | <div class="imgDiv"><img :src="urlImg" alt=""></div>
|
| | | </el-dialog>
|
| | | </el-main>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import Pagination from "@/components/table/pagination.vue"
|
| | | import Table from "@/components/table/tableList.vue"
|
| | | import { removeEmptyValues, resetObjectValues, parseTime } from '@/utils/index.js'
|
| | | export default {
|
| | | name: 'Record',
|
| | | components: { Table, Pagination },
|
| | | data () {
|
| | | return {
|
| | | tableHeader: [
|
| | | { label: this.$t('person.userId'), list: "userId", overflowShow: 'hidden' },
|
| | | {
|
| | | type: "html",
|
| | | label: this.$t('person.name'),
|
| | | code: (row) => {
|
| | | return row.name ? row.name : '-'
|
| | | }
|
| | | },
|
| | | {
|
| | | label: this.$t('log.passingTime'),
|
| | | type: "html",
|
| | | overflowShow: 'hidden',
|
| | | code: (row) => {
|
| | | return parseTime(row.timeStamp * 1000)
|
| | | }
|
| | | },
|
| | | {
|
| | | type: "html",
|
| | | label: this.$t('log.accessMethod'),
|
| | | code: (row) => {
|
| | | if (row.type == 200) {
|
| | | return this.$t('voucher.card')
|
| | | } else if (row.type == 300) {
|
| | | return this.$t('voucher.face')
|
| | | } else if (row.type == 400) {
|
| | | return this.$t('voucher.password')
|
| | | } else if (row.type == 500) {
|
| | | return this.$t('voucher.finger')
|
| | | } else if (row.type == 100 || row.type == 101 || row.type == 103 || row.type == 104) {
|
| | | return this.$t('voucher.code')
|
| | | }
|
| | | }
|
| | | },
|
| | | {
|
| | | type: "html",
|
| | | label: this.$t('log.accessPass'),
|
| | | overflowShow: 'hidden',
|
| | | code: (row) => {
|
| | | return row.type == 300 ? '-' : row.code
|
| | | }
|
| | | },
|
| | | {
|
| | | type: "html",
|
| | | label: this.$t('log.accessResult'),
|
| | | code: (row) => {
|
| | | if (row.result === 1) {
|
| | | return `<span style="color:#ff5722;font-weight:600">${this.$t('common.failure')}</span>`
|
| | | } else if (row.result === 0) {
|
| | | return `<span style="color:#1fab89;font-weight:600">${this.$t('common.success')}</span>`
|
| | | }
|
| | | }
|
| | | },
|
| | | ],
|
| | | tableSelection: {
|
| | | key: true,
|
| | | type: "selection",
|
| | | detaile: false,
|
| | | },
|
| | | tableOption: {
|
| | | label: this.$t('common.operation'),
|
| | | width: "180px",
|
| | | value: 0,
|
| | | options: [
|
| | | {
|
| | | label: this.$t('common.delete'),
|
| | | key: 0,
|
| | | type: "text",
|
| | | State: true,
|
| | | method: (row) => {
|
| | | this.handleDelete(row.id)
|
| | | },
|
| | | },
|
| | | {
|
| | | label: this.$t('log.viewPhotos'),
|
| | | key: 0,
|
| | | type: "text",
|
| | | State: true,
|
| | | show: (row) => {
|
| | | return row.type == 300
|
| | | },
|
| | | method: (row) => {
|
| | | this.getPhoto(row.code)
|
| | | },
|
| | | },
|
| | | ]
|
| | | },
|
| | | tableData: [],
|
| | | isSubmitLoading: false,
|
| | | dialogTableVisible: false,
|
| | | urlImg: "",
|
| | | total: 0,
|
| | | pageSize: 20,
|
| | | currentPage: 0,
|
| | | searchForm: {
|
| | | name: ''
|
| | | },
|
| | | time: [],
|
| | | selectIdList: [],
|
| | | };
|
| | | },
|
| | | created () {
|
| | | this.fetchData()
|
| | | },
|
| | | mounted () { },
|
| | | methods: {
|
| | |
|
| | | search () {
|
| | | let that = this
|
| | | that.currentPage = 0;
|
| | | that.$refs.page.Page(1);
|
| | | that.fetchData();
|
| | | },
|
| | |
|
| | | pageChange (item) {
|
| | | this.pageSize = item.limit;
|
| | | this.currentPage = item.page - 1;
|
| | | this.fetchData();
|
| | | },
|
| | |
|
| | | handleSelectionChange (vals) {
|
| | | this.selectIdList = [];
|
| | | vals.map(v => {
|
| | | this.selectIdList.push(v.id);
|
| | | });
|
| | | },
|
| | |
|
| | | // è·åéè¡è®°å½
|
| | | async fetchData () {
|
| | | let searchForm = removeEmptyValues({ ...this.searchForm })
|
| | | if (this.time.length) {
|
| | | searchForm.startTime = new Date(this.time[0]).getTime() / 1000
|
| | | searchForm.endTime = new Date(this.time[1]).getTime() / 1000
|
| | | }
|
| | | searchForm.page = this.currentPage
|
| | | searchForm.size = this.pageSize
|
| | | searchForm.flag = false
|
| | | try {
|
| | | const res = await this.$http.post('/getRecord', { data: searchForm })
|
| | | if (res.code === 200) {
|
| | | this.tableData = res.data.content
|
| | | this.total = res.data.total
|
| | | } else {
|
| | | this.$message.error(res.message)
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | },
|
| | |
|
| | | handleDelete (id) {
|
| | | let that = this
|
| | | this.$confirm(
|
| | | this.$t('common.deleteTips'),
|
| | | this.$t('common.tips'),
|
| | | {
|
| | | confirmButtonText: this.$t('common.confirm'),
|
| | | cancelButtonText: this.$t('common.cancel'),
|
| | | type: 'warning'
|
| | | }
|
| | | ).then(async () => {
|
| | | try {
|
| | | const res = await that.$http.post("delRecord", { data: { recordId: [id] } })
|
| | | if (res.code == 200) {
|
| | | that.$message.success(this.$t('common.deleteSuccess'))
|
| | | that.fetchData()
|
| | | } else {
|
| | | that.$message.error(res.message)
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | }).catch(() => { })
|
| | | },
|
| | |
|
| | | batchDelete () {
|
| | | let that = this
|
| | | if (this.selectIdList.length <= 0) {
|
| | | this.$message.warning(this.$t('common.placeholderSelect'));
|
| | | return;
|
| | | }
|
| | | this.$confirm(this.$t('common.deleteTips'),
|
| | | this.$t('common.tips'),
|
| | | {
|
| | | confirmButtonText: this.$t('common.confirm'),
|
| | | cancelButtonText: this.$t('common.cancel'),
|
| | | type: 'warning'
|
| | | })
|
| | | .then(async () => {
|
| | | that.isSubmitLoading = true;
|
| | | const res = await this.$http.post("delRecord", { data: { recordId: this.selectIdList }});
|
| | | that.isSubmitLoading = false;
|
| | | if (res.code == 200) {
|
| | | that.$message.success(this.$t('common.deleteSuccess'))
|
| | | that.fetchData()
|
| | | } else {
|
| | | that.$message.error(res.message)
|
| | | }
|
| | | })
|
| | | .catch(() => {
|
| | | return false;
|
| | | });
|
| | | },
|
| | |
|
| | | doReset () {
|
| | | resetObjectValues(this.searchForm)
|
| | | this.time = []
|
| | | this.fetchData()
|
| | | },
|
| | |
|
| | | async getPhoto (code) {
|
| | | try {
|
| | | const res = await this.$http.post('/getRecordMsg', { data: code })
|
| | | if (res.code == 200) {
|
| | | console.log(res);
|
| | | this.urlImg = 'data:image/png;base64,' + res.data
|
| | | this.dialogTableVisible = true
|
| | | } else {
|
| | | this.$message.error(res.message)
|
| | | }
|
| | | } catch (even) {
|
| | | console.log(even)
|
| | | }
|
| | | },
|
| | |
|
| | | // å¾çæ¥ç
|
| | | handleCellClick (e, column) {
|
| | | if (JSON.parse(e.extra).pic && column.label === "éè¡ç
§ç") {
|
| | | this.dialogTableVisible = true
|
| | | let imgUrl = JSON.parse(e.extra).pic
|
| | | this.urlImg = imgUrl.split('&imageView')[0]
|
| | | }
|
| | | },
|
| | | },
|
| | | };
|
| | | </script>
|
| | |
|
| | | <style lang="less" scoped>
|
| | | .el-main {
|
| | | .imgDiv {
|
| | | width: 100%;
|
| | | text-align: center;
|
| | |
|
| | | img {
|
| | | height: 100%;
|
| | | }
|
| | | }
|
| | | }
|
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- æ°å¢å¯é¥ --> |
| | | <template> |
| | | <div> |
| | | <el-drawer size="40%" :with-header="false" :visible.sync="visible" :before-close="handleAddClose"> |
| | | <el-form ref="form" :model="form" label-width="100px" :rules="rules" style="width: 90%;margin: 50px auto;"> |
| | | <el-form-item :label="$t('security.keyId')" v-if="type == 'detail'"> |
| | | <el-input v-model="form.securityId" :placeholder="$t('common.placeholder')"></el-input> |
| | | </el-form-item> |
| | | <el-form-item :label="$t('security.keyType')"> |
| | | <el-radio-group v-model="form.type"> |
| | | <el-radio label="RSA">RSA</el-radio> |
| | | <el-radio label="AES">AES</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item :label="$t('security.keyEncoding')" prop="key"> |
| | | <el-input v-model="form.key" :placeholder="$t('common.placeholder')"></el-input> |
| | | </el-form-item> |
| | | <el-form-item :label="$t('security.keyValue')" prop="value"> |
| | | <el-input type="textarea" clearable :rows="5" v-model="form.value" |
| | | :placeholder="$t('common.placeholder')"></el-input> |
| | | </el-form-item> |
| | | <el-form-item :label="$t('security.validTime')"> |
| | | <el-date-picker :clearable="false" v-model="dateTimes" value-format="timestamp" |
| | | :default-time="['00:00:00', '23:59:59']" type="datetimerange" :range-separator="$t('common.to')" |
| | | :start-placeholder="$t('common.startTime')" :end-placeholder="$t('common.endTime')"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="dialog-footer"> |
| | | <el-button type="warning" @click="handleAddClose(false)">{{ $t('common.cancel') }}</el-button> |
| | | <el-button v-if="type == 'add'" type="primary" @click="updata()">{{ $t('common.confirm') }}</el-button> |
| | | </div> |
| | | </el-drawer> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { generateRandomString, resetObjectValues } from '@/utils/index.js' |
| | | export default { |
| | | data () { |
| | | return { |
| | | form: { |
| | | securityId: "", |
| | | type: "", |
| | | key: "", |
| | | value: "" |
| | | }, |
| | | rules: { |
| | | key: [{ required: true, message: this.$t('common.placeholder'), trigger: ["blur"] },], |
| | | value: [{ required: true, message: this.$t('common.placeholder'), trigger: ["blur"] },], |
| | | }, |
| | | dateTimes: [], |
| | | visible: false, |
| | | type: 'info' |
| | | } |
| | | }, |
| | | created () { |
| | | this.initialForm = JSON.parse(JSON.stringify(this.form)); |
| | | }, |
| | | mounted () { |
| | | |
| | | }, |
| | | methods: { |
| | | open (type, row) { |
| | | if (type == 'add') { |
| | | this.form.type = 'RSA' |
| | | console.log('add') |
| | | } else { |
| | | this.form.securityId = row.securityId |
| | | this.form.type = row.type |
| | | this.form.key = row.key |
| | | this.form.value = row.value |
| | | this.dateTimes = [row.startTime * 1000, row.endTime * 1000] |
| | | } |
| | | this.type = type |
| | | this.visible = true |
| | | }, |
| | | |
| | | handleAddClose (showConfirm = true) { |
| | | const closeAction = () => { |
| | | if (this.$refs.form) { |
| | | this.$refs.form.clearValidate(); |
| | | } |
| | | this.visible = false; |
| | | this.form = { ...this.initialForm }; |
| | | this.dateTimes = [] |
| | | }; |
| | | if (showConfirm) { |
| | | this.$confirm(this.$t('common.closeTips')) |
| | | .then(closeAction) |
| | | .catch(() => { }); |
| | | } else { |
| | | closeAction(); |
| | | } |
| | | }, |
| | | |
| | | updata () { |
| | | let that = this |
| | | this.$refs['form'].validate(async (valid) => { |
| | | if (valid) { |
| | | if (!that.dateTimes.length) { |
| | | that.$message.warning(this.$t('permission.choose_time_range')); |
| | | return false |
| | | } |
| | | let data = { |
| | | securityId: generateRandomString(), |
| | | type: that.form.type, |
| | | key: that.form.key, |
| | | value: that.form.value, |
| | | startTime: new Date(that.dateTimes[0]).getTime() / 1000, |
| | | endTime: new Date(that.dateTimes[1]).getTime() / 1000 |
| | | } |
| | | const res = await this.$http.post( |
| | | "/insertSecurity", |
| | | { data: [data] } |
| | | ); |
| | | if (res.code == 200) { |
| | | this.$message.success(this.$t('common.addSuccess')) |
| | | this.visible = false |
| | | resetObjectValues(this.form) |
| | | this.$emit("operation-success") |
| | | } else { |
| | | if (res.data && res.data[0]) { |
| | | this.$message.error(res.data[0].errmsg) |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-main> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form :inline="true" class="el-InputForm"> |
| | | <el-form-item :label="$t('security.keyId')" label-width="80px"> |
| | | <el-input v-model="searchForm.securityId" :placeholder="$t('common.placeholder')" clearable></el-input> |
| | | </el-form-item> |
| | | <div style="position: absolute; right: 25px; bottom: 25px;"> |
| | | <el-button type="info" size="medium" icon="el-icon-search" @click="search()" |
| | | style="margin-left:10px;border:none;">{{ $t('common.query') }}</el-button> |
| | | <el-button type="warning" size="medium" icon="el-icon-refresh-right" @click="doReset()">{{ |
| | | $t('common.reset') |
| | | }}</el-button> |
| | | </div> |
| | | </el-form> |
| | | <el-col :span="24" style="margin:20px 0"> |
| | | <el-button type="primary" style="border:none;" size='mini' icon="el-icon-plus" @click="doAdd">{{ |
| | | $t('security.newKey') }}</el-button> |
| | | <el-button type="danger" size="mini" style="font-size:12px;" icon="el-icon-delete" @click="batchDelete()">{{ |
| | | $t('security.clearKey') }}</el-button> |
| | | </el-col> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-col :span="24"> |
| | | <Table :table-label="tableHeader" v-loading="isSubmitLoading" :table-data="tableData" :table-option="tableOption"> |
| | | </Table> |
| | | <pagination ref="page" :total="total" @pageChange="pageChange"></pagination> |
| | | </el-col> |
| | | |
| | | <add ref="add" @operation-success="fetchData"></add> |
| | | </el-main> |
| | | </template> |
| | | |
| | | <script> |
| | | import Pagination from "@/components/table/pagination.vue" |
| | | import Table from "@/components/table/tableList.vue" |
| | | import Add from "./add.vue" |
| | | import { removeEmptyValues, resetObjectValues, parseTime } from '@/utils/index.js' |
| | | export default { |
| | | name: 'Record', |
| | | components: { Table, Pagination, Add }, |
| | | data () { |
| | | return { |
| | | tableHeader: [ |
| | | { label: this.$t('security.keyId'), list: "securityId", overflowShow: 'hidden' }, |
| | | { label: this.$t('security.keyType'), list: "type", overflowShow: 'hidden' }, |
| | | { label: this.$t('security.keyEncoding'), list: "key", overflowShow: 'hidden' }, |
| | | { label: this.$t('security.keyValue'), list: "value", overflowShow: 'hidden' }, |
| | | { |
| | | label: this.$t('security.startTime'), |
| | | type: "html", |
| | | overflowShow: 'hidden', |
| | | code: (row) => { |
| | | return parseTime(row.startTime * 1000) |
| | | } |
| | | }, |
| | | { |
| | | label: this.$t('security.expirationTime'), |
| | | type: "html", |
| | | overflowShow: 'hidden', |
| | | code: (row) => { |
| | | return parseTime(row.endTime * 1000) |
| | | } |
| | | } |
| | | ], |
| | | tableOption: { |
| | | label: this.$t('common.operation'), |
| | | width: "180px", |
| | | value: 0, |
| | | options: [ |
| | | { |
| | | label: this.$t('common.delete'), |
| | | key: 0, |
| | | type: "text", |
| | | State: true, |
| | | method: (row) => { |
| | | this.handleDelete(row.securityId) |
| | | }, |
| | | }, |
| | | { |
| | | label: this.$t('common.detail'), |
| | | key: 0, |
| | | type: "text", |
| | | State: true, |
| | | method: (row) => { |
| | | this.$refs.add.open("detail", { ...row }) |
| | | }, |
| | | }, |
| | | ] |
| | | }, |
| | | tableData: [], |
| | | isSubmitLoading: false, |
| | | total: 0, |
| | | pageSize: 20, |
| | | currentPage: 0, |
| | | searchForm: { |
| | | securityId: '' |
| | | }, |
| | | time: [], |
| | | selectIdList: [], |
| | | }; |
| | | }, |
| | | created () { |
| | | this.fetchData() |
| | | }, |
| | | mounted () { }, |
| | | methods: { |
| | | search () { |
| | | let that = this |
| | | that.currentPage = 0; |
| | | that.$refs.page.Page(1); |
| | | that.fetchData(); |
| | | }, |
| | | |
| | | pageChange (item) { |
| | | this.pageSize = item.limit; |
| | | this.currentPage = item.page - 1; |
| | | this.fetchData(); |
| | | }, |
| | | |
| | | // è·åå¯é¥ |
| | | async fetchData () { |
| | | let searchForm = removeEmptyValues({ ...this.searchForm }) |
| | | searchForm.page = this.currentPage |
| | | searchForm.size = this.pageSize |
| | | try { |
| | | const res = await this.$http.post('/getSecurity', { data: searchForm }) |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.content |
| | | this.total = res.data.total |
| | | } else { |
| | | this.$message.error(res.message) |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }, |
| | | |
| | | doAdd () { |
| | | this.$refs.add.open('add') |
| | | }, |
| | | |
| | | handleDelete (id) { |
| | | let that = this |
| | | this.$confirm( |
| | | this.$t('common.deleteTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ).then(async () => { |
| | | try { |
| | | const res = await that.$http.post("/delSecurity", { data: [id] }) |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('common.deleteSuccess')) |
| | | that.fetchData() |
| | | } else { |
| | | if (res.data && res.data[0]) { |
| | | that.$message.error(res.data[0].errmsg) |
| | | } |
| | | } |
| | | } catch (even) { |
| | | console.log(even) |
| | | } |
| | | }).catch(() => { }) |
| | | }, |
| | | |
| | | batchDelete () { |
| | | let that = this |
| | | this.$confirm(this.$t('common.clearTips'), |
| | | this.$t('common.tips'), |
| | | { |
| | | confirmButtonText: this.$t('common.confirm'), |
| | | cancelButtonText: this.$t('common.cancel'), |
| | | type: 'warning' |
| | | }) |
| | | .then(async () => { |
| | | that.isSubmitLoading = true; |
| | | const res = await this.$http.post("/clearSecurity", { data: {} }); |
| | | that.isSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | that.$message.success(this.$t('common.clearSuccess')) |
| | | that.fetchData() |
| | | } else { |
| | | that.$message.error(res.message) |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | return false; |
| | | }); |
| | | }, |
| | | |
| | | doReset () { |
| | | resetObjectValues(this.searchForm) |
| | | this.time = [] |
| | | this.fetchData() |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .el-main { |
| | | .imgDiv { |
| | | width: 100%; |
| | | text-align: center; |
| | | |
| | | img { |
| | | height: 100%; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | const http = require('http');
|
| | |
|
| | | // èªå®ä¹ä»£çä¸é´ä»¶ï¼å®å
¨æ§å¶è¯·æ±å¤´
|
| | | module.exports = {
|
| | | devServer: {
|
| | | port: 8080,
|
| | | open: true, |
| | | before: function(app) {
|
| | | app.post('/api/*', (req, res) => {
|
| | | const options = {
|
| | | hostname: '192.168.10.132',
|
| | | port: 8080,
|
| | | path: req.url.replace('/api', ''),
|
| | | method: 'POST',
|
| | | headers: {
|
| | | // åªå¤å¶å¿
è¦ç头é¨ï¼å®å
¨æ¨¡æPostman
|
| | | 'Content-Type': req.headers['content-type'],
|
| | | 'Content-Length': req.headers['content-length'],
|
| | | 'Host': '192.168.10.132:8080',
|
| | | 'Connection': 'keep-alive',
|
| | | 'User-Agent': 'Mozilla/5.0'
|
| | | }
|
| | | };
|
| | | |
| | | const proxyReq = http.request(options, (proxyRes) => {
|
| | | res.writeHead(proxyRes.statusCode, proxyRes.headers);
|
| | | proxyRes.pipe(res);
|
| | | });
|
| | | |
| | | proxyReq.on('error', (err) => {
|
| | | console.error('代ç请æ±å¤±è´¥:', err);
|
| | | res.status(500).json({ error: '设å¤è¿æ¥å¤±è´¥' });
|
| | | });
|
| | | |
| | | req.pipe(proxyReq);
|
| | | });
|
| | | }
|
| | | }
|
| | | }; |
| | |
| | | [2026/4/11 13:35:44] --- Start runUsb --- |
| | | [2026/4/11 13:35:44] Platform: win32 |
| | | [2026/4/11 13:35:44] Kill command defined: wmic process where "name='node.exe' and commandline like '%device_manager.js%'" delete || powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'node.exe' -and $_.CommandLine -like '*device_manager.js*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }" |
| | | [2026/4/11 13:35:44] Node.js check passed |
| | | [2026/4/11 13:35:45] Process exited with code: 0, signal: null |
| | | [2026/4/11 13:35:45] Kill stdout: ɾ��ʵ�� \\ACER-LGQ\ROOT\CIMV2:Win32_Process.Handle="31720"
|
| | | [2026/4/20 13:31:51] --- Start runUsb --- |
| | | [2026/4/20 13:31:51] Platform: win32 |
| | | [2026/4/20 13:31:51] Kill command defined: wmic process where "name='node.exe' and commandline like '%device_manager.js%'" delete || powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'node.exe' -and $_.CommandLine -like '*device_manager.js*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }" |
| | | [2026/4/20 13:31:54] Node.js check passed |
| | | [2026/4/20 13:31:54] Process exited with code: 0, signal: null |
| | | [2026/4/20 13:31:54] Kill stdout: ɾ��ʵ�� \\ACER-LGQ\ROOT\CIMV2:Win32_Process.Handle="39096"
|
| | | ʵ��ɾ���ɹ��� |
| | | [2026/4/11 13:35:45] Manager script path: c:\Users\lgq10\.vscode\extensions\dxide.dxide-1.0.41\src\device\device_manager.js |
| | | [2026/4/11 13:35:45] Spawning child process... |
| | | [2026/4/11 13:35:45] Sending connect command: {"cmd":"connect","lang":"zh","model":"VF105_V12"} |
| | | [2026/4/20 13:31:54] Manager script path: c:\Users\lgq10\.vscode\extensions\dxide.dxide-1.0.41\src\device\device_manager.js |
| | | [2026/4/20 13:31:54] Spawning child process... |
| | | [2026/4/20 13:31:55] Sending connect command: {"cmd":"connect","lang":"zh","model":"VF105_V12"} |
| | |
| | | "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa", |
| | | "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae", |
| | | "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1", |
| | | "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14", |
| | | "dxmodules\\dxDriver.js": "63c8348a2a4a31911ce8a1626aa8f5c4", |
| | | "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6", |
| | | "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2", |
| | | "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17", |
| | |
| | | "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3", |
| | | "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4", |
| | | "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a", |
| | | "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f", |
| | | "dxmodules\\dxOta.js": "2dd095485717018eb451e5110aca4934", |
| | | "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c", |
| | | "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210", |
| | | "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536", |
| | |
| | | "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\langPack.js": "956b0d902f723e4817319436ee7df117", |
| | | "resource\\langPack.js": "72c5238aa93a1dc6a79b9466b5ebcf44", |
| | | "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132", |
| | | "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59", |
| | | "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0", |
| | |
| | | "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a", |
| | | "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b", |
| | | "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d", |
| | | "src\\config.json": "6619f6367ac0230030de3131160a2178", |
| | | "src\\controller.js": "954bd6baaf4a7f91b7534f71b0e2365b", |
| | | "src\\driver.js": "42e819e90d7d5b00191447edb06e928c", |
| | | "src\\main.js": "51de780e61133a6f39ba5554dacf7644", |
| | | "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28", |
| | | "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295", |
| | | "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a", |
| | | "src\\config.json": "53cf90582fedb3aca8e3ac2848386f36", |
| | | "src\\controller.js": "35dd417593c4510119576717c717e20b", |
| | | "src\\driver.js": "b0c3958d69f7e0021a70d8537077ff5d", |
| | | "src\\main.js": "d455a38100d386fc2eed8bef4c92e7ba", |
| | | "src\\screen.js": "01812eb2816143c98595939d2c54f2ff", |
| | | "src\\service\\accessService.js": "e242b879cf8d1e4f326aee9168e9d4d5", |
| | | "src\\service\\api.js": "24a45cb2acc4306a1f4dd54de559f9f0", |
| | | "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d", |
| | | "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19", |
| | | "src\\service\\configService.js": "c45b2005ba236b74be9f04ab76635abf", |
| | | "src\\service\\demo.js": "1f9a570135f63aa5b607743bb5a9e7f4", |
| | | "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795", |
| | | "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba", |
| | | "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b", |
| | | "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c", |
| | | "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e", |
| | | "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9", |
| | | "src\\service\\grainService.js": "940788cbc2aea5b20789b752641df6a7", |
| | | "src\\service\\httpService.js": "6c62661a42e45226f3f82df3d7e0a37e", |
| | | "src\\service\\mqttService.js": "b7f598ec25422433bccd821b8b29d5f3", |
| | | "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd", |
| | | "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83", |
| | | "src\\service\\sqliteService.js": "f1816a98a378b3ed2fbd759f6965a8df", |
| | | "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa", |
| | | "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f", |
| | | "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049", |
| | |
| | | "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e", |
| | | "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f", |
| | | "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449", |
| | | "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e", |
| | | "src\\view\\config\\menu\\doorControlView.js": "f2476da5f529cac859dd24776b210bf6", |
| | | "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63", |
| | | "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3", |
| | | "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe", |
| | | "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0", |
| | | "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "e9991161a3e5d4344b22f7c4ad3dac4c", |
| | | "src\\view\\config\\menu\\localUserView.js": "2533606f36feba75efe922cc6b6f883a", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "740f7a643a0fb4c3caa3eb85482d85cc", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "b3ef27a7b02bc59a5c2aa4d977efc30d", |
| | | "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "c92914b05b2353c446fa66c519b95f2f", |
| | | "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852", |
| | | "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "36107f1e81acd1f711fcb44b246981a5", |
| | | "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f", |
| | | "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85", |
| | | "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11", |
| | |
| | | "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c", |
| | | "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd", |
| | | "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46", |
| | | "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421", |
| | | "src\\view\\mainView.js": "1a0d51f7ece88d821f4ba9938a505cd9", |
| | | "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9", |
| | | "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68", |
| | | "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987", |
| | |
| | | "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f", |
| | | "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49", |
| | | "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362", |
| | | "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d", |
| | | "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff", |
| | | "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4", |
| | | "src\\worker\\mqttWorker.js": "611a50d831add8ca508fc69dbef69905", |
| | | "src\\worker\\netWorker.js": "6ee5ea8dedc2a330974d72a448175d45", |
| | | "src\\worker\\passRecordWorker.js": "8b2ce900d926878f65db8fdc69b1eb3a", |
| | | "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647" |
| | | } |
| | |
| | | "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa", |
| | | "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae", |
| | | "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1", |
| | | "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14", |
| | | "dxmodules\\dxDriver.js": "63c8348a2a4a31911ce8a1626aa8f5c4", |
| | | "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6", |
| | | "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2", |
| | | "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17", |
| | |
| | | "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3", |
| | | "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4", |
| | | "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a", |
| | | "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f", |
| | | "dxmodules\\dxOta.js": "2dd095485717018eb451e5110aca4934", |
| | | "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c", |
| | | "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210", |
| | | "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536", |
| | |
| | | "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106", |
| | | "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283", |
| | | "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740", |
| | | "resource\\langPack.js": "956b0d902f723e4817319436ee7df117", |
| | | "resource\\langPack.js": "72c5238aa93a1dc6a79b9466b5ebcf44", |
| | | "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132", |
| | | "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59", |
| | | "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0", |
| | |
| | | "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a", |
| | | "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b", |
| | | "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d", |
| | | "src\\config.json": "6619f6367ac0230030de3131160a2178", |
| | | "src\\controller.js": "954bd6baaf4a7f91b7534f71b0e2365b", |
| | | "src\\driver.js": "42e819e90d7d5b00191447edb06e928c", |
| | | "src\\main.js": "51de780e61133a6f39ba5554dacf7644", |
| | | "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28", |
| | | "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295", |
| | | "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a", |
| | | "src\\config.json": "53cf90582fedb3aca8e3ac2848386f36", |
| | | "src\\controller.js": "35dd417593c4510119576717c717e20b", |
| | | "src\\driver.js": "b0c3958d69f7e0021a70d8537077ff5d", |
| | | "src\\main.js": "d455a38100d386fc2eed8bef4c92e7ba", |
| | | "src\\screen.js": "01812eb2816143c98595939d2c54f2ff", |
| | | "src\\service\\accessService.js": "e242b879cf8d1e4f326aee9168e9d4d5", |
| | | "src\\service\\api.js": "24a45cb2acc4306a1f4dd54de559f9f0", |
| | | "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d", |
| | | "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19", |
| | | "src\\service\\configService.js": "c45b2005ba236b74be9f04ab76635abf", |
| | | "src\\service\\demo.js": "1f9a570135f63aa5b607743bb5a9e7f4", |
| | | "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795", |
| | | "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba", |
| | | "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b", |
| | | "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c", |
| | | "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e", |
| | | "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9", |
| | | "src\\service\\grainService.js": "940788cbc2aea5b20789b752641df6a7", |
| | | "src\\service\\httpService.js": "6c62661a42e45226f3f82df3d7e0a37e", |
| | | "src\\service\\mqttService.js": "b7f598ec25422433bccd821b8b29d5f3", |
| | | "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd", |
| | | "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83", |
| | | "src\\service\\sqliteService.js": "f1816a98a378b3ed2fbd759f6965a8df", |
| | | "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa", |
| | | "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f", |
| | | "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049", |
| | |
| | | "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e", |
| | | "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f", |
| | | "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449", |
| | | "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e", |
| | | "src\\view\\config\\menu\\doorControlView.js": "f2476da5f529cac859dd24776b210bf6", |
| | | "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63", |
| | | "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3", |
| | | "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe", |
| | | "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0", |
| | | "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b", |
| | | "src\\view\\config\\menu\\localUser\\localUserAddView.js": "e9991161a3e5d4344b22f7c4ad3dac4c", |
| | | "src\\view\\config\\menu\\localUserView.js": "2533606f36feba75efe922cc6b6f883a", |
| | | "src\\view\\config\\menu\\networkSettingView.js": "740f7a643a0fb4c3caa3eb85482d85cc", |
| | | "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "b3ef27a7b02bc59a5c2aa4d977efc30d", |
| | | "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc", |
| | | "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "c92914b05b2353c446fa66c519b95f2f", |
| | | "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852", |
| | | "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092", |
| | | "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "36107f1e81acd1f711fcb44b246981a5", |
| | | "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f", |
| | | "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85", |
| | | "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11", |
| | |
| | | "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c", |
| | | "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd", |
| | | "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46", |
| | | "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421", |
| | | "src\\view\\mainView.js": "1a0d51f7ece88d821f4ba9938a505cd9", |
| | | "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9", |
| | | "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68", |
| | | "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987", |
| | |
| | | "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f", |
| | | "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49", |
| | | "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362", |
| | | "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d", |
| | | "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff", |
| | | "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4", |
| | | "src\\worker\\mqttWorker.js": "611a50d831add8ca508fc69dbef69905", |
| | | "src\\worker\\netWorker.js": "6ee5ea8dedc2a330974d72a448175d45", |
| | | "src\\worker\\passRecordWorker.js": "8b2ce900d926878f65db8fdc69b1eb3a", |
| | | "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647" |
| | | } |
| | |
| | | // HTTPæ¥å£è·¯å¾ |
| | | "http.safeInputAccess": "http://192.168.1.227:80/cgi-bin/safeInputAccess", |
| | | // æ¯å¦å¼å¯æ°ä½æµåº¦éªè¯ 1:æ¯ 0:å¦ |
| | | "gas.verification": 1 |
| | | "gas.verification": 0, |
| | | //æ¯å¦å¼å¯å®å
¨å
¥ä»è卿§å¶ 1ï¼æ¯ 0ï¼å¦ |
| | | "safeInputControl": 0 |
| | | } |
| | |
| | | const grainService = {} |
| | | |
| | | // ä»é
ç½®ä¸è·åä¸å¡ç¼ç å®ä¹ |
| | | const functionId = { |
| | | gasDetection: config.get('functionId.gasDetection') || "1000", |
| | | safeInputControl: config.get('functionId.safeInputControl') || "2000", |
| | | lightControl: config.get('functionId.lightControl') || "3000", |
| | | doorStatus: config.get('functionId.doorStatus') || "4000" |
| | | function getFunctionId() { |
| | | return { |
| | | gasDetection: config.get('functionId.gasDetection') || "1000", |
| | | safeInputControl: config.get('functionId.safeInputControl') || "2000", |
| | | lightControl: config.get('functionId.lightControl') || "3000", |
| | | doorStatus: config.get('functionId.doorStatus') || "4000" |
| | | } |
| | | } |
| | | |
| | | // ä»é
ç½®ä¸è·åæ¥å£è¿åç¼ç |
| | | const respCode = { |
| | | success: config.get('respCode.success') || "200", |
| | | badRequest: config.get('respCode.badRequest') || "400", |
| | | unauthorized: config.get('respCode.unauthorized') || "401", |
| | | forbidden: config.get('respCode.forbidden') || "403", |
| | | notFound: config.get('respCode.notFound') || "404", |
| | | serverError: config.get('respCode.serverError') || "500" |
| | | function getRespCode() { |
| | | return { |
| | | success: config.get('getRespCode().success') || "200", |
| | | badRequest: config.get('respCode.badRequest') || "400", |
| | | unauthorized: config.get('respCode.unauthorized') || "401", |
| | | forbidden: config.get('respCode.forbidden') || "403", |
| | | notFound: config.get('respCode.notFound') || "404", |
| | | serverError: config.get('respCode.serverError') || "500" |
| | | } |
| | | } |
| | | |
| | | // é误ç 对åºçéè¯¯ä¿¡æ¯ |
| | |
| | | * @returns {boolean} true表示æ°ä½æµåº¦åæ ¼ï¼false表示æ°ä½æµåº¦ä¸åæ ¼ |
| | | */ |
| | | grainService.checkGasConcentration = function(callback) { |
| | | // æ£æ¥æ¯å¦å¼å¯æ°ä½æµåº¦éªè¯ |
| | | const isGasDetectionEnabled = config.get('gas.verification') !== 0 |
| | | if (!isGasDetectionEnabled) { |
| | | logger.info('[grain]: æ°ä½æµåº¦éªè¯æªå¯ç¨ï¼ç´æ¥è¿å') |
| | | // è°ç¨åè°å½æ° |
| | | if (callback) { |
| | | callback() |
| | | } |
| | | return true |
| | | } |
| | | |
| | | // 使ç¨setTimeoutå°HTTPè¯·æ±æ¾å
¥åå°æ§è¡ï¼é¿å
é»å¡ä¸»çº¿ç¨ |
| | | std.setTimeout(() => { |
| | | try { |
| | |
| | | sn: config.get("sys.sn") || " ", // 设å¤åºåå·ï¼ä»é
ç½®ä¸è·å |
| | | houseId: "0000", // ä»å»ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | outId: "0000", // èªå®ä¹ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | functionId: functionId.gasDetection, // æ°ä½æµåº¦æ£æµåè½ç |
| | | functionId: getFunctionId().gasDetection, // æ°ä½æµåº¦æ£æµåè½ç |
| | | timestamp: Date.now().toString() // æ¶é´æ³ |
| | | } |
| | | |
| | |
| | | logger.info(`[grain]: è§£æåçæ°ä½æµåº¦æ°æ®: ${JSON.stringify(gasData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (gasData.respCode === respCode.success) { |
| | | if (gasData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: æ°ä½æµåº¦æ£æµæ¥å£è°ç¨æå`) |
| | | } else { |
| | | logger.error(`[grain]: æ°ä½æµåº¦æ£æµæ¥å£è°ç¨å¤±è´¥ï¼è¿åç¼ç : ${gasData.respCode}, è¿åä¿¡æ¯: ${gasData.respMsg}`) |
| | |
| | | logger.info(`[grain]: æ¸
çåè§£æçæ°ä½æµåº¦æ°æ®: ${JSON.stringify(gasData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (gasData.respCode === respCode.success) { |
| | | if (gasData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: æ°ä½æµåº¦æ£æµæ¥å£è°ç¨æå`) |
| | | } else { |
| | | logger.error(`[grain]: æ°ä½æµåº¦æ£æµæ¥å£è°ç¨å¤±è´¥ï¼è¿åç¼ç : ${gasData.respCode}, è¿åä¿¡æ¯: ${gasData.respMsg}`) |
| | |
| | | * @returns {boolean} trueè¡¨ç¤ºç¶æä¿¡æ¯è·åæåï¼false表示失败 |
| | | */ |
| | | grainService.checkDevConcentration = function(params) { |
| | | // æ£æ¥æ¯å¦å¼å¯å®å
¨å
¥ä»è卿§å¶ |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | return false |
| | | } |
| | | |
| | | // 使ç¨setTimeoutå°HTTPè¯·æ±æ¾å
¥åå°æ§è¡ï¼é¿å
é»å¡ä¸»çº¿ç¨ |
| | | std.setTimeout(() => { |
| | | try { |
| | |
| | | sn: config.get("sys.sn") || " ", // 设å¤åºåå·ï¼ä»é
ç½®ä¸è·å |
| | | houseId: "0000", // ä»å»ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | outId: "0000", // èªå®ä¹ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | functionId: params && params.functionId ? params.functionId : functionId.safeInputControl, // åè½ç ï¼é»è®¤ä¸ºå®å
¨å
¥ä»è卿§å¶ |
| | | functionId: params && params.functionId ? params.functionId : getFunctionId().safeInputControl, // åè½ç ï¼é»è®¤ä¸ºå®å
¨å
¥ä»è卿§å¶ |
| | | timestamp: Date.now().toString(), // æ¶é´æ³ |
| | | data: {} |
| | | } |
| | |
| | | logger.info(`[grain]: è§£æåçç¶æä¿¡æ¯æ°æ®: ${JSON.stringify(statusData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (statusData.respCode === respCode.success) { |
| | | if (statusData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: ç¶æä¿¡æ¯æ¥å£è°ç¨æå`) |
| | | // æ£æ¥dataæ¯å¦ä¸ºç©ºï¼ä¸ä¸ºç©ºæè§¦åéç¥ |
| | | if (Object.keys(postData.data).length > 0) { |
| | |
| | | logger.info(`[grain]: æ¸
çåè§£æçç¶æä¿¡æ¯æ°æ®: ${JSON.stringify(statusData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (statusData.respCode === respCode.success) { |
| | | if (statusData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: ç¶æä¿¡æ¯æ¥å£è°ç¨æå`) |
| | | // æ£æ¥dataæ¯å¦ä¸ºç©ºï¼ä¸ä¸ºç©ºæè§¦åéç¥ |
| | | if (Object.keys(postData.data).length > 0) { |
| | |
| | | sn: config.get("sys.sn") || " ", // 设å¤åºåå·ï¼ä»é
ç½®ä¸è·å |
| | | houseId: "0000", // ä»å»ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | outId: "0000", // èªå®ä¹ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | functionId: functionId.lightControl, // ä»å
ç
§æè卿§å¶åè½ç |
| | | functionId: getFunctionId().lightControl, // ä»å
ç
§æè卿§å¶åè½ç |
| | | timestamp: Date.now().toString(), // æ¶é´æ³ |
| | | data: {} |
| | | } |
| | |
| | | logger.info(`[grain]: è§£æåçä»å
ç
§æè卿§å¶ååºæ°æ®: ${JSON.stringify(statusData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (statusData.respCode === respCode.success) { |
| | | if (statusData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: ä»å
ç
§æè卿§å¶æ¥å£è°ç¨æå`) |
| | | // 触åæåå¼¹çª |
| | | bus.fire('showAccessResult', { |
| | |
| | | logger.info(`[grain]: æ¸
çåè§£æçä»å
ç
§æè卿§å¶ååºæ°æ®: ${JSON.stringify(statusData)}`) |
| | | |
| | | // æ ¹æ®æ¥å£è¿åç¼ç è¿è¡æ¥å¿è¾åº |
| | | if (statusData.respCode === respCode.success) { |
| | | if (statusData.respCode === getRespCode().success) { |
| | | logger.info(`[grain]: ä»å
ç
§æè卿§å¶æ¥å£è°ç¨æå`) |
| | | // 触åæåå¼¹çª |
| | | bus.fire('showAccessResult', { |
| | |
| | | sn: config.get("sys.sn") || " ", // 设å¤åºåå·ï¼ä»é
ç½®ä¸è·å |
| | | houseId: "0000", // ä»å»ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | outId: "0000", // èªå®ä¹ç¼ç ï¼é»è®¤å¡«å
"0000" |
| | | functionId: functionId.doorStatus, // é¨ç£ç¶æåè½ç |
| | | functionId: getFunctionId().doorStatus, // é¨ç£ç¶æåè½ç |
| | | timestamp: Date.now().toString(), // æ¶é´æ³ |
| | | data: { |
| | | doorStatus: doorStatusData.status // é¨ç£ç¶æ |
| | |
| | | onlineCheckingSettingSwitch.select(configAll['mqtt.onlinecheck'] == 1) |
| | | onlineCheckingTimeoutSettingInput.text(configAll['mqtt.timeout'] + '') |
| | | gasVerificationSwitch.select(configAll['gas.verification'] == 1) |
| | | safeInputControlSwitch.select(configAll['safeInputControl'] == 1) |
| | | }) |
| | | |
| | | const titleBox = viewUtils.title(screenMain, configView.screenMain, 'doorControlViewTitle', 'doorControlView.title') |
| | |
| | | gasVerificationSwitch.setSize(screen.screenSize.width * (70 / 600), screen.screenSize.height * (35 / 1280)) |
| | | gasVerificationSwitch.bgColor(0x000000, NativeObject.APP.NativeComponents.NativeEnum.LV_PART_INDICATOR | NativeObject.APP.NativeComponents.NativeEnum.LV_STATE_CHECKED) |
| | | |
| | | // å®å
¨å
¥ä»è卿§å¶è®¾ç½® |
| | | const safeInputControlBox = dxui.View.build('safeInputControlBox', screenMain) |
| | | viewUtils._clearStyle(safeInputControlBox) |
| | | safeInputControlBox.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (956 / 1280)) |
| | | safeInputControlBox.setSize(screen.screenSize.width * (550 / 600), screen.screenSize.height * (76 / 1280)) |
| | | safeInputControlBox.borderWidth(1) |
| | | safeInputControlBox.setBorderColor(0xDEDEDE) |
| | | safeInputControlBox.obj.setStyleBorderSide(dxui.Utils.ENUM.LV_BORDER_SIDE_BOTTOM, 0) |
| | | |
| | | const safeInputControlLbl = dxui.Label.build('safeInputControlLbl', safeInputControlBox) |
| | | safeInputControlLbl.text('å®å
¨å
¥ä»è卿§å¶') |
| | | safeInputControlLbl.align(dxui.Utils.ALIGN.LEFT_MID, 0, 0) |
| | | safeInputControlLbl.textFont(viewUtils.font(26)) |
| | | |
| | | const safeInputControlSwitch = dxui.Switch.build('safeInputControlSwitch', safeInputControlBox) |
| | | safeInputControlSwitch.align(dxui.Utils.ALIGN.RIGHT_MID, 0, 0) |
| | | safeInputControlSwitch.setSize(screen.screenSize.width * (70 / 600), screen.screenSize.height * (35 / 1280)) |
| | | safeInputControlSwitch.bgColor(0x000000, NativeObject.APP.NativeComponents.NativeEnum.LV_PART_INDICATOR | NativeObject.APP.NativeComponents.NativeEnum.LV_STATE_CHECKED) |
| | | |
| | | const saveBtn = viewUtils.bottomBtn(screenMain, screenMain.id + 'saveBtn', 'doorControlView.save', () => { |
| | | const saveConfigData = { |
| | | access: { |
| | |
| | | gas: { |
| | | verification: gasVerificationSwitch.isSelect() ? 1 : 0 |
| | | }, |
| | | safeInputControl: safeInputControlSwitch.isSelect() ? 1 : 0, |
| | | mqtt: { |
| | | addr: mqttSettingInput.text(), |
| | | username: mqttUserSettingInput.text(), |
| | |
| | | const mainView = { |
| | | authComplete: false, // è®¤è¯æ¯å¦å®æï¼ç¨äºæ§å¶UIæ´æ° |
| | | verifiedUsers: {}, // åå¨å·²æ ¸éªæåçç¨æ·ä¿¡æ¯ |
| | | eventListenersRegistered: false // äºä»¶çå¬å¨æ¯å¦å·²æ³¨å |
| | | eventListenersRegistered: false, // äºä»¶çå¬å¨æ¯å¦å·²æ³¨å |
| | | resetTimerId: null // åå¨éç½®ç¨æ·UIç宿¶å¨ID |
| | | } |
| | | |
| | | // å 载主è§å¾çæ¹æ³ |
| | |
| | | // ä¾å¦æ´æ°è®¾å¤ä¿¡æ¯ãæ°ä½æµåº¦æ°æ®ç |
| | | try { |
| | | // æ´æ°è®¾å¤ä¿¡æ¯ |
| | | let config = screen.getConfig() |
| | | let sn = config["sys.sn"] || "" |
| | | let screenConfig = screen.getConfig() |
| | | let sn = screenConfig["sys.sn"] || "" |
| | | // ç´æ¥ä»net模åè·åIPå°åï¼ç¡®ä¿è·åå°ææ°çIP |
| | | let ip = "" |
| | | try { |
| | |
| | | ip = param.ip |
| | | } |
| | | } catch (error) { |
| | | // åºéæ¶ä½¿ç¨configä¸çIP |
| | | ip = config["net.ip"] || "" |
| | | // åºéæ¶ä½¿ç¨screenConfigä¸çIP |
| | | ip = screenConfig["net.ip"] || "" |
| | | } |
| | | // éè¿mainViewå¯¹è±¡è®¿é®æ ç¾ |
| | | if (mainView.snInfoLbl && mainView.ipInfoLbl) { |
| | |
| | | |
| | | // æ´æ°è®¾å¤ä¿¡æ¯ï¼SNåIPï¼ |
| | | function updateDeviceInfo() { |
| | | let config = screen.getConfig() |
| | | let sn = config["sys.sn"] || "" |
| | | let screenConfig = screen.getConfig() |
| | | let sn = screenConfig["sys.sn"] || "" |
| | | // ç´æ¥ä»net模åè·åIPå°åï¼ç¡®ä¿è·åå°ææ°çIP |
| | | let ip = "" |
| | | try { |
| | |
| | | ip = param.ip |
| | | } |
| | | } catch (error) { |
| | | // åºéæ¶ä½¿ç¨configä¸çIP |
| | | ip = config["net.ip"] || "" |
| | | // åºéæ¶ä½¿ç¨screenConfigä¸çIP |
| | | ip = screenConfig["net.ip"] || "" |
| | | } |
| | | // éè¿mainViewå¯¹è±¡è®¿é®æ ç¾ |
| | | if (mainView.snInfoLbl && mainView.ipInfoLbl) { |
| | |
| | | |
| | | // æ´æ°åºåºåç§°åä»å·ï¼åªå¨ç¨åºå¯å¨åé
ç½®ä¿®æ¹æ¶è°ç¨ï¼ |
| | | function updateWarehouseInfo() { |
| | | let config = screen.getConfig() |
| | | let screenConfig = screen.getConfig() |
| | | // è·åä»å·ä¿¡æ¯ |
| | | let houseName = config["houseName"] || "01å·ä»" |
| | | let houseName = screenConfig["houseName"] || "01å·ä»" |
| | | // è·ååºåºåç§° |
| | | let GranaryName = config["GranaryName"] || "ä¸å¤®å¨å¤ç²®ææç´å±åº" |
| | | let GranaryName = screenConfig["GranaryName"] || "ä¸å¤®å¨å¤ç²®ææç´å±åº" |
| | | logger.info(`[mainView]: æ´æ°åºåºåç§°åä»å·: ä»å·=${houseName}, åºåºåç§°=${GranaryName}`) |
| | | // æ´æ°é¡¶é¨æ 颿 çåºåºåç§° |
| | | if (mainView.headerLbl) { |
| | |
| | | // æ´æ°ç½ç»å¾æ |
| | | function updateNetworkIcon() { |
| | | try { |
| | | let config = screen.getConfig() |
| | | let netType = config["net.type"] || 1 |
| | | let screenConfig = screen.getConfig() |
| | | let netType = screenConfig["net.type"] || 1 |
| | | let isConnected = net.isConnected() |
| | | |
| | | // éèææç½ç»å¾æ |
| | |
| | | logger.info('[mainView]: accessResäºä»¶è§¦å, result=' + result + ', data=' + JSON.stringify(data)) |
| | | |
| | | // æ¸
é¤ä¹åç宿¶å¨ |
| | | if (resetTimerId) { |
| | | std.clearTimeout(resetTimerId) |
| | | resetTimerId = null |
| | | if (mainView.resetTimerId) { |
| | | std.clearTimeout(mainView.resetTimerId) |
| | | mainView.resetTimerId = null |
| | | logger.info('[mainView]: æ¸
é¤ä¹åçéç½®å®æ¶å¨') |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 设置1åéåéç½®ç¨æ·UIç宿¶å¨ |
| | | resetTimerId = std.setTimeout(() => { |
| | | mainView.resetTimerId = std.setTimeout(() => { |
| | | logger.info('[mainView]: 1åé宿¶å¨è§¦åï¼éç½®ç¨æ·UI') |
| | | // 触åéè¡è§£é宿äºä»¶ï¼éç¥UIéç½® |
| | | bus.fire("accessUnlockComplete") |
| | |
| | | let dualAuthInfo = data.dualAuthInfo |
| | | logger.info('[mainView]: åäººè®¤è¯æåï¼æ´æ°ç¨æ·UI, user1=' + dualAuthInfo.firstUserId + ', user2=' + dualAuthInfo.secondUserId) |
| | | |
| | | // åå¨å·²æ ¸éªæåçç¨æ·ä¿¡æ¯ |
| | | mainView.verifiedUsers[1] = dualAuthInfo.firstUserId |
| | | mainView.verifiedUsers[2] = dualAuthInfo.secondUserId |
| | | logger.info('[mainView]: åå¨å人认è¯ç¨æ·ä¿¡æ¯, user1=' + dualAuthInfo.firstUserId + ', user2=' + dualAuthInfo.secondUserId) |
| | | |
| | | // æ´æ°ç¨æ·1çUI |
| | | mainView.updateUserUI(1, dualAuthInfo.firstUserId, true, data.firstUserFileName || fileName) |
| | | |
| | |
| | | let dualAuthInfo = data.dualAuthInfo |
| | | logger.info('[mainView]: 第ä¸ç¨æ·è®¤è¯æåï¼çå¾
第äºç¨æ·è®¤è¯ï¼æ´æ°ç¨æ·UI, user1=' + dualAuthInfo.firstUserId) |
| | | |
| | | // åå¨å·²æ ¸éªæåçç¨æ·ä¿¡æ¯ |
| | | mainView.verifiedUsers[1] = dualAuthInfo.firstUserId |
| | | logger.info('[mainView]: åå¨ç¬¬ä¸ç¨æ·è®¤è¯ä¿¡æ¯, user1=' + dualAuthInfo.firstUserId) |
| | | |
| | | // æ´æ°ç¨æ·1çUI |
| | | mainView.updateUserUI(1, dualAuthInfo.firstUserId, true, data.firstUserFileName || fileName) |
| | | } else { |
| | | // å人认è¯ï¼æ´æ°ç¨æ·1çUI |
| | | if (data.userId) { |
| | | logger.info('[mainView]: åäººè®¤è¯æåï¼æ´æ°ç¨æ·UI, userId=' + data.userId) |
| | | |
| | | // åå¨å·²æ ¸éªæåçç¨æ·ä¿¡æ¯ |
| | | mainView.verifiedUsers[1] = data.userId |
| | | logger.info('[mainView]: åå¨å人认è¯ç¨æ·ä¿¡æ¯, user1=' + data.userId) |
| | | |
| | | mainView.updateUserUI(1, data.userId, true, fileName) |
| | | } |
| | | } |
| | |
| | | logger.info('[mainView]: äºä»¶çå¬å¨æ³¨å宿') |
| | | } |
| | | |
| | | // åå¨å®æ¶å¨ID |
| | | let resetTimerId = null |
| | | |
| | | |
| | | // è·åæ°ä½æµåº¦åç¶æä¿¡æ¯ |
| | | grainService.checkGasConcentration() |
| | |
| | | const headerLbl = dxui.Label.build('headerLbl', headerBox) |
| | | mainView.headerLbl = headerLbl |
| | | // ä»é
ç½®ä¸è·ååºåºåç§° |
| | | const config = screen.getConfig() |
| | | const GranaryName = config['GranaryName'] || 'ä¸å¤®å¨å¤ç²®ææç´å±åº' |
| | | const screenConfig = screen.getConfig() |
| | | const GranaryName = screenConfig['GranaryName'] || 'ä¸å¤®å¨å¤ç²®ææç´å±åº' |
| | | headerLbl.text(GranaryName) |
| | | headerLbl.textFont(viewUtils.font(30)) // å¢å¤§åä½ |
| | | headerLbl.textColor(0xffffff) |
| | |
| | | const warehouseLbl = dxui.Label.build('warehouseLbl', overlayBox) |
| | | mainView.warehouseLbl = warehouseLbl |
| | | // ä»é
ç½®ä¸è·åä»å·ä¿¡æ¯ |
| | | const houseName = config['houseName'] || '01å·ä»' |
| | | const houseName = screenConfig['houseName'] || '01å·ä»' |
| | | warehouseLbl.text(houseName) |
| | | warehouseLbl.textFont(viewUtils.font(30, dxui.Utils.FONT_STYLE.BOLD)) |
| | | warehouseLbl.textColor(0x000000) |
| | |
| | | // 设置æé®ç¹å»äºä»¶ |
| | | mode1Btn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å
许è¿ä»æ¨¡å¼æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | inBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å
¥ä»æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | outBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('åºä»æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | mode2Btn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å¬å£é飿¨¡å¼æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*è卿§å¶æä½æ æé*" |
| | | }) |
| | | // ææ¾è¯é³æç¤º |
| | | driver.audio.play('/app/code/resource/CN/wav/control_f.wav') |
| | | return |
| | | } |
| | | // æ£æ¥æ¯å¦æç§é¿æé |
| | | let hasSectionChief = false |
| | | // æ£æ¥ç¨æ·1 |
| | | if (mainView.verifiedUsers[1]) { |
| | | let user1 = sqliteService.d1_person.find({ userId: mainView.verifiedUsers[1] }) |
| | | if (user1 && user1.length > 0) { |
| | | try { |
| | | let userType = JSON.parse(user1[0].extra).type || 0 |
| | | if (userType === 1) { |
| | | hasSectionChief = true |
| | | } |
| | | } catch (error) { |
| | | logger.error("è§£æç¨æ·1ç±»å失败") |
| | | } |
| | | } |
| | | } |
| | | // æ£æ¥ç¨æ·2 |
| | | if (!hasSectionChief && mainView.verifiedUsers[2]) { |
| | | let user2 = sqliteService.d1_person.find({ userId: mainView.verifiedUsers[2] }) |
| | | if (user2 && user2.length > 0) { |
| | | try { |
| | | let userType = JSON.parse(user2[0].extra).type || 0 |
| | | if (userType === 1) { |
| | | hasSectionChief = true |
| | | } |
| | | } catch (error) { |
| | | logger.error("è§£æç¨æ·2ç±»å失败") |
| | | } |
| | | } |
| | | } |
| | | // å¦ææ²¡æç§é¿æéï¼æ¾ç¤ºæ ¸éªå¤±è´¥ |
| | | if (!hasSectionChief) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: false, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*æ ç§é¿æéï¼ç¦æ¢æä½*" |
| | | }) |
| | | // ææ¾è¯é³æç¤º |
| | | driver.audio.play('/app/code/resource/CN/wav/control_f.wav') |
| | |
| | | |
| | | startBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å¯å¨æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | stopBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å
³éæé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | mode3Btn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('ç¦æ¢è¿ä»æ¨¡å¼æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*è卿§å¶æä½æ æé*" |
| | | }) |
| | | // ææ¾è¯é³æç¤º |
| | | driver.audio.play('/app/code/resource/CN/wav/control_f.wav') |
| | | return |
| | | } |
| | | // æ£æ¥æ¯å¦æç§é¿æé |
| | | let hasSectionChief = false |
| | | // æ£æ¥ç¨æ·1 |
| | | if (mainView.verifiedUsers[1]) { |
| | | let user1 = sqliteService.d1_person.find({ userId: mainView.verifiedUsers[1] }) |
| | | if (user1 && user1.length > 0) { |
| | | try { |
| | | let userType = JSON.parse(user1[0].extra).type || 0 |
| | | if (userType === 1) { |
| | | hasSectionChief = true |
| | | } |
| | | } catch (error) { |
| | | logger.error("è§£æç¨æ·1ç±»å失败") |
| | | } |
| | | } |
| | | } |
| | | // æ£æ¥ç¨æ·2 |
| | | if (!hasSectionChief && mainView.verifiedUsers[2]) { |
| | | let user2 = sqliteService.d1_person.find({ userId: mainView.verifiedUsers[2] }) |
| | | if (user2 && user2.length > 0) { |
| | | try { |
| | | let userType = JSON.parse(user2[0].extra).type || 0 |
| | | if (userType === 1) { |
| | | hasSectionChief = true |
| | | } |
| | | } catch (error) { |
| | | logger.error("è§£æç¨æ·2ç±»å失败") |
| | | } |
| | | } |
| | | } |
| | | // å¦ææ²¡æç§é¿æéï¼æ¾ç¤ºæ ¸éªå¤±è´¥ |
| | | if (!hasSectionChief) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: false, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*æ ç§é¿æéï¼ç¦æ¢æä½*" |
| | | }) |
| | | // ææ¾è¯é³æç¤º |
| | | driver.audio.play('/app/code/resource/CN/wav/control_f.wav') |
| | |
| | | |
| | | emergencyInBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('ç´§æ¥å
¥ä»æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | emergencyOutBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('åºä»æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | lightOnBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å¼ç¯æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |
| | |
| | | |
| | | lightOffBtn.on(dxui.Utils.EVENT.CLICK, () => { |
| | | logger.info('å
³ç¯æé®ç¹å»') |
| | | const isSafeInputControlEnabled = config.get('safeInputControl') === 1 |
| | | if (!isSafeInputControlEnabled) { |
| | | logger.info('[grain]: å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨') |
| | | // è§¦åæªå¯ç¨å¼¹çª |
| | | bus.fire('showAccessResult', { |
| | | faceAuth: true, |
| | | gasConcentration: true, |
| | | accessAllowed: false, |
| | | message: "*å®å
¨å
¥ä»è卿§å¶åè½æªå¯ç¨*" |
| | | }) |
| | | return false |
| | | } |
| | | // æ£æ¥æ¯å¦æç¨æ·å·²æ ¸éªæå |
| | | if (!mainView.verifiedUsers[1] && !mainView.verifiedUsers[2]) { |
| | | // æ¾ç¤ºå¼¹çªéç¥ |