Kaynağa Gözat

+ 国际化

chen.cheng 5 ay önce
ebeveyn
işleme
b744fdcb24

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 园区安防
+VUE_APP_TITLE = Digital Construction Management
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 北斗能力中心方案
+VUE_APP_TITLE = Digital Construction Management
 
 BABEL_ENV = production
 

BIN
public/favicon.ico


BIN
src/assets/images/login-background.png


+ 25 - 2
src/i18n/en.js

@@ -1,4 +1,5 @@
 export default {
+  sysTitle: "Digital Construction Management",
   common: {
     username: 'User name',
     password: 'Password',
@@ -15,7 +16,7 @@ export default {
     importModeMsg: "Drag your file here or Click.",
     export: "Export"
   },
-  session:{
+  session: {
     invalid: "Invalid session, or session has expired, please log in again.",
     repeatSubmit: "The data is processing, please do not submit again.",
     outTime: "Your login status has expired. You can continue to stay on this page or log in again."
@@ -34,5 +35,27 @@ export default {
     index: "id",
     pileHoleImportTitle: "Pile hole CAD data import"
   },
-  search: "search"
+  login: {
+    "title": "User Login",
+    "username": "Username",
+    "password": "Password",
+    "code": "Verification Code",
+    "codeImg": "Can't see clearly? Change one",
+    "loginBtn": "Login",
+    "logining": "Login...",
+    "register": "Sign up",
+    "remember": "Remember password",
+    "forget": "Forgot password",
+    "validate": {
+      "username": "Please enter your username",
+      "password": "Please enter your password",
+      "code": "Please enter the verification code"
+    }
+  },
+  search: "search",
+  sysSetting: {
+    layout: "Layout settings",
+    usrCenter: "Personal center",
+    logout: "Logout"
+  }
 }

+ 25 - 1
src/i18n/zh.js

@@ -1,4 +1,5 @@
 export default {
+  sysTitle: "数字化施工管理",
   common: {
     username: '用户名',
     password: '密码',
@@ -15,6 +16,23 @@ export default {
     importModeMsg: "将文件拖到此处,或点击上传。",
     export: "导出"
   },
+  login: {
+    title: "用户登录",
+    username: "用户名",
+    password: "密码",
+    code: "验证码",
+    codeImg: "看不清,换一张",
+    loginBtn: "登 录",
+    logining: "登 录 中...",
+    register: "立即注册",
+    remember: "记住密码",
+    forget: "忘记",
+    validate: {
+      username: "请输入用户名",
+      password: "请输入密码",
+      code: "请输入验证码"
+    }
+  },
   session: {
     invalid: "无效的会话,或者会话已过期,请重新登录。",
     repeatSubmit: "数据正在处理,请不要重复提交。",
@@ -34,5 +52,11 @@ export default {
     index: "编号",
     pileHoleImportTitle: "桩点CAD数据导入"
   },
-  search: "搜索"
+  search: "搜索",
+  // 个人中心  布局设置  退出登录
+  sysSetting: {
+    layout: "布局设置",
+    usrCenter: "个人中心",
+    logout: "退出登录"
+  },
 }

+ 4 - 6
src/layout/components/Navbar.vue

@@ -10,9 +10,7 @@
       <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item"/>
         <screenfull id="screenfull" class="right-menu-item hover-effect"/>
-        <el-tooltip content="布局大小" effect="dark" placement="bottom">
-          <size-select id="size-select" class="right-menu-item hover-effect"/>
-        </el-tooltip>
+        <size-select id="size-select" class="right-menu-item hover-effect"/>
         <language-switcher></language-switcher>
       </template>
 
@@ -23,13 +21,13 @@
         </div>
         <el-dropdown-menu slot="dropdown">
           <router-link to="/user/profile">
-            <el-dropdown-item>个人中心</el-dropdown-item>
+            <el-dropdown-item>{{ $t("sysSetting.usrCenter") }}</el-dropdown-item>
           </router-link>
           <el-dropdown-item @click.native="setting = true">
-            <span>布局设置</span>
+            <span>{{ $t("sysSetting.layout") }}</span>
           </el-dropdown-item>
           <el-dropdown-item divided @click.native="logout">
-            <span>退出登录</span>
+            <span>{{ $t("sysSetting.logout") }}</span>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>

+ 9 - 5
src/layout/components/Sidebar/Logo.vue

@@ -1,13 +1,18 @@
 <template>
   <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
     <transition name="sidebarLogoFade">
+
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
+          {{ $t("sysTitle") }}
+        </h1>
       </router-link>
       <router-link v-else key="expand" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
+          {{ $t("sysTitle") }}
+        </h1>
       </router-link>
     </transition>
   </div>
@@ -35,7 +40,7 @@ export default {
   },
   data() {
     return {
-      title: process.env.VUE_APP_TITLE,
+      title: this.$t("sysTitle"),
       logo: logoImg
     }
   }
@@ -55,7 +60,6 @@ export default {
 .sidebar-logo-container {
   position: relative;
   width: 100%;
-  height: 50px;
   line-height: 50px;
   background: #2b2f3a;
   text-align: center;
@@ -77,7 +81,7 @@ export default {
       margin: 0;
       color: #fff;
       font-weight: 600;
-      line-height: 50px;
+      line-height: 15px;
       font-size: 14px;
       font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
       vertical-align: middle;

+ 10 - 4
src/utils/index.js

@@ -1,5 +1,6 @@
-import { parseTime } from './ruoyi'
-import { UUID } from 'uuidjs';
+import {parseTime} from './ruoyi'
+import {UUID} from 'uuidjs';
+
 /**
  * 表格时间格式化
  */
@@ -14,9 +15,11 @@ export function formatDate(cellValue) {
   var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
   return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
 }
+
 export const uuid = () => {
   return UUID.generate();
 };
+
 /**
  * @param {number} time
  * @param {string} option
@@ -220,7 +223,7 @@ export function getTime(type) {
 export function debounce(func, wait, immediate) {
   let timeout, args, context, timestamp, result
 
-  const later = function() {
+  const later = function () {
     // 据上一次触发时间间隔
     const last = +new Date() - timestamp
 
@@ -237,7 +240,7 @@ export function debounce(func, wait, immediate) {
     }
   }
 
-  return function(...args) {
+  return function (...args) {
     context = this
     timestamp = +new Date()
     const callNow = immediate && !timeout
@@ -390,3 +393,6 @@ export function isNumberStr(str) {
   return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
 }
 
+export const sysLanguage = () => {
+  return localStorage.getItem('language') || process.env.VUE_APP_DEF_LANGUAGE
+}

+ 2 - 0
src/utils/request.js

@@ -7,6 +7,7 @@ import {blobValidate, tansParams} from "@/utils/ruoyi";
 import cache from '@/plugins/cache'
 import {saveAs} from 'file-saver'
 import i18n from '@/i18n'
+import {sysLanguage} from "@/utils/index";
 
 let downloadLoadingInstance;
 // 是否显示重新登录
@@ -31,6 +32,7 @@ service.interceptors.request.use(config => {
   if (getToken() && !isToken) {
     config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
   }
+  config.headers['lang'] = sysLanguage()
   // get请求映射params参数
   if (config.method === 'get' && config.params) {
     let url = config.url + '?' + tansParams(config.params);

+ 39 - 24
src/views/login.vue

@@ -1,15 +1,15 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">{{title}}</h3>
+      <h3 class="title">{{ title }}</h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"
           type="text"
           auto-complete="off"
-          placeholder="账号"
+          :placeholder="$t('login.username')"
         >
-          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon"/>
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
@@ -17,27 +17,30 @@
           v-model="loginForm.password"
           type="password"
           auto-complete="off"
-          placeholder="密码"
+          :placeholder="$t('login.password')"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
         <el-input
           v-model="loginForm.code"
           auto-complete="off"
-          placeholder="验证码"
+          :placeholder="$t('login.code')"
           style="width: 63%"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon"/>
         </el-input>
         <div class="login-code">
           <img :src="codeUrl" @click="getCode" class="login-code-img"/>
         </div>
       </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
+      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">{{
+          $t('login.remember')
+        }}
+      </el-checkbox>
       <el-form-item style="width:100%;">
         <el-button
           :loading="loading"
@@ -46,32 +49,33 @@
           style="width:100%;"
           @click.native.prevent="handleLogin"
         >
-          <span v-if="!loading">登 录</span>
-          <span v-else>登 录 中...</span>
+          <span v-if="!loading">{{ $t('login.loginBtn') }}</span>
+          <span v-else>{{ $t('login.logining') }}</span>
         </el-button>
         <div style="float: right;" v-if="register">
-          <router-link class="link-type" :to="'/register'">立即注册</router-link>
+          <router-link class="link-type" :to="'/register'">{{ $t('login.register') }}</router-link>
         </div>
       </el-form-item>
     </el-form>
     <!--  底部  -->
     <div class="el-login-footer">
-      <span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span>
+      <span>Copyright © 2024-{{ parseTime(new Date(), '{y}') }} China Design Group All Rights Reserved.</span>
     </div>
   </div>
 </template>
 
 <script>
-import { getCodeImg } from "@/api/login";
+import {getCodeImg} from "@/api/login";
 import Cookies from "js-cookie";
-import { encrypt, decrypt } from '@/utils/jsencrypt'
+import {decrypt, encrypt} from '@/utils/jsencrypt'
+import {parseTime} from "../utils/ruoyi";
 
 export default {
   name: "Login",
   data() {
     return {
       codeUrl: "",
-      title: process.env.VUE_APP_TITLE,
+      title: this.$t("sysTitle"),
       loginForm: {
         username: "admin",
         password: "admin123",
@@ -81,12 +85,12 @@ export default {
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" }
+          {required: true, trigger: "blur", message: this.$t("login.validate.username")}
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" }
+          {required: true, trigger: "blur", message: this.$t("login.validate.password")}
         ],
-        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
+        code: [{required: true, trigger: "change", message: this.$t("login.validate.code")}]
       },
       loading: false,
       // 验证码开关
@@ -98,7 +102,7 @@ export default {
   },
   watch: {
     $route: {
-      handler: function(route) {
+      handler: function (route) {
         this.redirect = route.query && route.query.redirect;
       },
       immediate: true
@@ -109,6 +113,7 @@ export default {
     this.getCookie();
   },
   methods: {
+    parseTime,
     getCode() {
       getCodeImg().then(res => {
         this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
@@ -133,16 +138,17 @@ export default {
         if (valid) {
           this.loading = true;
           if (this.loginForm.rememberMe) {
-            Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
-            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
+            Cookies.set("username", this.loginForm.username, {expires: 30});
+            Cookies.set("password", encrypt(this.loginForm.password), {expires: 30});
+            Cookies.set('rememberMe', this.loginForm.rememberMe, {expires: 30});
           } else {
             Cookies.remove("username");
             Cookies.remove("password");
             Cookies.remove('rememberMe');
           }
           this.$store.dispatch("Login", this.loginForm).then(() => {
-            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
+            this.$router.push({path: this.redirect || "/"}).catch(() => {
+            });
           }).catch(() => {
             this.loading = false;
             if (this.captchaEnabled) {
@@ -162,9 +168,10 @@ export default {
   justify-content: center;
   align-items: center;
   height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
+  background-image: url("../assets/images/login-background.png");
   background-size: cover;
 }
+
 .title {
   margin: 0px auto 30px auto;
   text-align: center;
@@ -176,32 +183,39 @@ export default {
   background: #ffffff;
   width: 400px;
   padding: 25px 25px 5px 25px;
+
   .el-input {
     height: 38px;
+
     input {
       height: 38px;
     }
   }
+
   .input-icon {
     height: 39px;
     width: 14px;
     margin-left: 2px;
   }
 }
+
 .login-tip {
   font-size: 13px;
   text-align: center;
   color: #bfbfbf;
 }
+
 .login-code {
   width: 33%;
   height: 38px;
   float: right;
+
   img {
     cursor: pointer;
     vertical-align: middle;
   }
 }
+
 .el-login-footer {
   height: 40px;
   line-height: 40px;
@@ -214,6 +228,7 @@ export default {
   font-size: 12px;
   letter-spacing: 1px;
 }
+
 .login-code-img {
   height: 38px;
 }

+ 1 - 1
src/views/register.vue

@@ -152,7 +152,7 @@ export default {
   justify-content: center;
   align-items: center;
   height: 100%;
-  background-image: url("../assets/images/login-background.jpg");
+  background-image: url("../assets/images/login-background.png");
   background-size: cover;
 }
 .title {