tangning 8 mēneši atpakaļ
vecāks
revīzija
7cf369ffcf
44 mainītis faili ar 2829 papildinājumiem un 556 dzēšanām
  1. 1 1
      .env
  2. 2 2
      .env.development
  3. 1 2
      .env.production
  4. BIN
      public/resource/img/logo.png
  5. BIN
      public/resource/img/logo1.png
  6. 53 53
      src/api/operate/index.ts
  7. 12 10
      src/api/sys/user.ts
  8. BIN
      src/assets/images/grey-logo.png
  9. 8 18
      src/components/Application/src/AppLogo.vue
  10. 1 0
      src/enums/httpEnum.ts
  11. 1 1
      src/enums/pageEnum.ts
  12. 2 2
      src/layouts/default/header/index.vue
  13. 2 0
      src/locales/lang/en.ts
  14. 2 1
      src/locales/lang/en/common.ts
  15. 20 0
      src/locales/lang/en/routes/account.ts
  16. 1163 0
      src/locales/lang/weblate/en.json
  17. 1184 0
      src/locales/lang/weblate/zh.json
  18. 19 6
      src/locales/lang/zh-CN/routes/account.ts
  19. 0 1
      src/locales/lang/zh-CN/routes/staff.ts
  20. 2 0
      src/locales/lang/zh_CN.ts
  21. 0 0
      src/router/routes/bf/about.ts
  22. 0 0
      src/router/routes/bf/account.ts
  23. 52 52
      src/router/routes/modules/customer.ts
  24. 30 0
      src/router/routes/bf/dashboard.ts
  25. 0 0
      src/router/routes/bf/dealer.ts
  26. 1 2
      src/router/routes/modules/device.ts
  27. 0 0
      src/router/routes/bf/invoice.ts
  28. 0 0
      src/router/routes/bf/operate.ts
  29. 0 0
      src/router/routes/bf/order.ts
  30. 0 0
      src/router/routes/bf/product.ts
  31. 84 84
      src/router/routes/modules/productOperation.ts
  32. 0 0
      src/router/routes/bf/staff.ts
  33. 0 0
      src/router/routes/bf/user.ts
  34. 22 2
      src/router/routes/index.ts
  35. 5 13
      src/router/routes/modules/dashboard.ts
  36. 1 1
      src/settings/projectSetting.ts
  37. 1 1
      src/store/modules/app.ts
  38. 0 1
      src/utils/http/axios/checkStatus.ts
  39. 6 1
      src/utils/http/axios/index.ts
  40. 30 27
      src/views/case/addCaseModal.vue
  41. 21 41
      src/views/case/list.vue
  42. 35 151
      src/views/sys/login/Login.vue
  43. 28 83
      src/views/sys/login/LoginForm.vue
  44. 40 0
      translate.js

+ 1 - 1
.env

@@ -2,7 +2,7 @@
 VITE_PORT = 3100
 
 # spa-title
-VITE_GLOB_APP_TITLE = 江门公安
+VITE_GLOB_APP_TITLE = 融合平台
 
 # spa shortname
 VITE_GLOB_APP_SHORT_NAME = 融合平台

+ 2 - 2
.env.development

@@ -6,14 +6,14 @@ VITE_PUBLIC_PATH = ./
 
 # Cross-domain proxy, you can configure multiple
 # Please note that no line breaks
-VITE_PROXY = [["/service","http://192.168.0.25"], ["/fusion","http://192.168.0.25"]]
+VITE_PROXY = [["/ucenter","https://eur.4dkankan.com/ucenter"], ["/fusion","https://testeur.4dkankan.com/fusion"]]
 # VITE_PROXY=[["/api","https://vvbin.cn/test"]]
 
 # Delete console
 VITE_DROP_CONSOLE = false
 
 # Basic interface address SPA
-VITE_GLOB_API_URL=/service
+VITE_GLOB_API_URL=
 
 # File upload address, optional
 VITE_GLOB_UPLOAD_URL=/upload

+ 1 - 2
.env.production

@@ -5,8 +5,7 @@ VITE_USE_MOCK = false
 VITE_PUBLIC_PATH = ./
 
 # VITE_PROXY = [["/basic-api","http://localhost:3000"],["/upload","http://v4-test.4dkankan.com/service/manage/common/upload/files"],["/service","http://v4-test.4dkankan.com/service/"]]
-VITE_PROXY = [["/basic-api","http://localhost:3000"],["/upload","https://v4-uat.4dkankan.com/service/manage/common/upload/files"],["/service","https://v4-uat.4dkankan.com"]]
-
+VITE_PROXY = [["/ucenter","https://eur.4dkankan.com/ucenter"], ["/fusion","https://testeur.4dkankan.com/fusion"]]
 # Delete console
 VITE_DROP_CONSOLE = true
 

BIN
public/resource/img/logo.png


BIN
public/resource/img/logo1.png


+ 53 - 53
src/api/operate/index.ts

@@ -30,68 +30,68 @@ if (!window.location.host.includes('test')) {
 }
 
 enum Api {
-  pageList = '/service/manage/news/pageNews',
-  newDisplay = '/service/manage/news/display',
-  newPutTop = '/service/manage/news/putTop',
-  newUpdateNews = '/service/manage/news/updateNews',
-  newAddNews = '/service/manage/news/addNews',
-  newDelete = '/service/manage/news/delete',
-  publicNews = '/service/manage/news/publicNews',
-  newGetNewsDetail = '/service/manage/news/getNewsDetail',
+  pageList = '/fusion/news/pageNews',
+  newDisplay = '/fusion/news/display',
+  newPutTop = '/fusion/news/putTop',
+  newUpdateNews = '/fusion/news/updateNews',
+  newAddNews = '/fusion/news/addNews',
+  newDelete = '/fusion/news/delete',
+  publicNews = '/fusion/news/publicNews',
+  newGetNewsDetail = '/fusion/news/getNewsDetail',
   //招聘
-  employNoteList = '/service/manage/employNote/list',
-  addOrUpdate = '/service/manage/employNote/addOrUpdate',
-  employNoteDelete = '/service/manage/employNote/delete',
-  employNoteIsPush = '/service/manage/employNote/isPush',
-  employNoteIsTop = '/service/manage/employNote/isTop',
+  employNoteList = '/fusion/employNote/list',
+  addOrUpdate = '/fusion/employNote/addOrUpdate',
+  employNoteDelete = '/fusion/employNote/delete',
+  employNoteIsPush = '/fusion/employNote/isPush',
+  employNoteIsTop = '/fusion/employNote/isTop',
   //留言
-  intercomMessageList = '/service/manage/intercomMessage/list',
-  intercomMessageHandle = '/service/manage/intercomMessage/handle',
+  intercomMessageList = '/fusion/intercomMessage/list',
+  intercomMessageHandle = '/fusion/intercomMessage/handle',
 
-  operateSceneList = '/service/manage/scene/list',
-  sceneMove = '/service/manage/scene/move',
-  sceneDelete = '/service/manage/scene/delete',
-  qjsceneDelete = '/service/manage/overall/delete',
-  sceneDownload = '/service/manage/scene/downScene',
-  sceneCopy = '/service/manage/scene/copy',
-  checkDownLoad = '/service/manage/scene/checkDownLoad',
-  downloadProcess = '/service/manage/scene/downloadProcess',
-  rebuildScene = '/service/manage/scene/rebuildScene',
+  operateSceneList = '/fusion/scene/list',
+  sceneMove = '/fusion/scene/move',
+  sceneDelete = '/fusion/scene/delete',
+  qjsceneDelete = '/fusion/overall/delete',
+  sceneDownload = '/fusion/scene/downScene',
+  sceneCopy = '/fusion/scene/copy',
+  checkDownLoad = '/fusion/scene/checkDownLoad',
+  downloadProcess = '/fusion/scene/downloadProcess',
+  rebuildScene = '/fusion/scene/rebuildScene',
   //案件
   caseCheckDown = '/fusion/offlinePackage/checkDown',
   caseProcess = '/fusion/offlinePackage/process',
   caseDown = '/fusion/offlinePackage/down',
 
-  overallList = '/service/manage/overall/list',
-  overallDelete = '/service/manage/overall/delete',
-  agentAuditList = '/service/manage/agentAudit/list',
-  agentAuditHandle = '/service/manage/agentAudit/handle',
-  sceneApplyList = '/service/manage/sceneApply/list',
-  sendEmail = '/service/manage/sceneApply/sendEmail',
-  sceneApplyHandle = '/service/manage/sceneApply/handle',
-  getInfoMail = '/service/manage/getInfo',
-  updateMail = '/service/manage/update',
-  caseaddOrUpdate = '/service/manage/case/addOrUpdate',
-  caseList = '/service/manage/case/list',
-  caseSceneList = '/service/manage/case/sceneList',
-  caseDel = '/service/manage/case/del',
-  caseRelease = '/service/manage/case/isShow',
-  caseWithdraw = '/service/manage/case/release',
-  getAuthList = '/service/manage/jy/sceneUserAuth/getAuthList',
-  getAuthType = '/service/manage/jy/sceneUserAuth/getAuthType',
-  getByRyId = '/service/manage/jy/user/getByRyId',
-  getinnerByRyId = '/service/manage/inner/getByRyId',
-  addAuth = '/service/manage/jy/sceneUserAuth/addAuth',
-  setAuthType = '/service/manage/jy/sceneUserAuth/setAuthType',
-  delAuth = '/service/manage/jy/sceneUserAuth/delAuth',
-  checkAuthOther = '/service/manage/jy/sceneUserAuth/checkAuthOther',
-  sceneCount = '/service/manage/scene/sceneCount',
+  overallList = '/fusion/overall/list',
+  overallDelete = '/fusion/overall/delete',
+  agentAuditList = '/fusion/agentAudit/list',
+  agentAuditHandle = '/fusion/agentAudit/handle',
+  sceneApplyList = '/fusion/sceneApply/list',
+  sendEmail = '/fusion/sceneApply/sendEmail',
+  sceneApplyHandle = '/fusion/sceneApply/handle',
+  getInfoMail = '/fusion/getInfo',
+  updateMail = '/fusion/update',
+  caseaddOrUpdate = '/fusion/case/addOrUpdate',
+  caseList = '/fusion/case/list',
+  caseSceneList = '/fusion/case/sceneList',
+  caseDel = '/fusion/case/del',
+  caseRelease = '/fusion/case/isShow',
+  caseWithdraw = '/fusion/case/release',
+  getAuthList = '/fusion/jy/sceneUserAuth/getAuthList',
+  getAuthType = '/fusion/jy/sceneUserAuth/getAuthType',
+  getByRyId = '/fusion/jy/user/getByRyId',
+  getinnerByRyId = '/fusion/inner/getByRyId',
+  addAuth = '/fusion/jy/sceneUserAuth/addAuth',
+  setAuthType = '/fusion/jy/sceneUserAuth/setAuthType',
+  delAuth = '/fusion/jy/sceneUserAuth/delAuth',
+  checkAuthOther = '/fusion/jy/sceneUserAuth/checkAuthOther',
+  sceneCount = '/fusion/scene/sceneCount',
   //生成obj新的接口
-  sceneDetail = '/service/manage/scene/sceneDetail',
-  buildSceneObj = '/service/manage/scene/buildSceneObj',
-  userShareAdd = '/service/manage/jy/userShare/add',
-  sceneList = '/service/manage/jy/userShare/sceneList',
-  getCaseByNum = '/service/manage/case/getCaseByNum',
+  sceneDetail = '/fusion/scene/sceneDetail',
+  buildSceneObj = '/fusion/scene/buildSceneObj',
+  userShareAdd = '/fusion/jy/userShare/add',
+  sceneList = '/fusion/jy/userShare/sceneList',
+  getCaseByNum = '/fusion/case/getCaseByNum',
 }
 
 /**

+ 12 - 10
src/api/sys/user.ts

@@ -6,10 +6,10 @@ import type { AppRouteRecordRaw } from '/@/router/types';
 
 enum Api {
   // Login = '/basic-api/login',
-  Login = '/service/manage/login',
-  Logout = '/service/manage/logout',
-  GetUserInfo = '/service/manage/sysUser/getInfo',
-  GetPermCode = '/service/manage/sysMenu/getButtonByUserId',
+  Login = '/ucenter/sso/user/login',
+  Logout = '/ucenter/sso/user/logout',
+  GetUserInfo = '/ucenter/user/getUserInfo',
+  GetPermCode = '/fusion/manage/sysMenu/getButtonByUserId',
 }
 
 /**
@@ -19,11 +19,13 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
   return defHttp.post<LoginResultModel>(
     {
       url: Api.Login,
-      params:{
+      params: {
         ...params,
-        userName:params.username,
-        password: encodeStr(window.btoa(params.password))
-    },
+        randomcode: '1234',
+        rememberMe: false,
+        phoneNum: params.username,
+        password: encodeStr(window.btoa(params.password)),
+      },
     },
     {
       errorMessageMode: mode,
@@ -35,7 +37,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
  * @description: getUserInfo
  */
 export function getUserInfo() {
-  return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
+  return defHttp.post<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
 }
 
 export function getPermCode() {
@@ -43,5 +45,5 @@ export function getPermCode() {
 }
 
 export function doLogout() {
-  return defHttp.get({ url: Api.Logout });
+  return defHttp.post({ url: Api.Logout });
 }

BIN
src/assets/images/grey-logo.png


+ 8 - 18
src/components/Application/src/AppLogo.vue

@@ -4,22 +4,20 @@
 -->
 <template>
   <div class="anticon" :class="getAppLogoClass" @click="goHome">
-    <!-- <img src="../../../assets/images/grey-logo.png" /> -->
-    <img src="/resource/img/logo.png" />
-    <div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="showTitle">
-      {{ mytitle || title1 }}
-    </div>
+    <img src="../../../assets/images/grey-logo.png" />
+    <!-- <div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="showTitle">
+      {{ title }}
+    </div> -->
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed, unref, ref } from 'vue';
+  import { computed, unref } from 'vue';
   import { useGlobSetting } from '/@/hooks/setting';
   import { useGo } from '/@/hooks/web/usePage';
   import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
   import { useDesign } from '/@/hooks/web/useDesign';
   import { PageEnum } from '/@/enums/pageEnum';
   import { useUserStore } from '/@/store/modules/user';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
 
   const props = defineProps({
     /**
@@ -36,12 +34,10 @@
     alwaysShowTitle: { type: Boolean },
   });
 
-  const { getTitle } = useRootSetting();
-  const mytitle = computed(() => getTitle.value);
   const { prefixCls } = useDesign('app-logo');
   const { getCollapsedShowTitle } = useMenuSetting();
   const userStore = useUserStore();
-  const { title1 } = useGlobSetting();
+  const { title } = useGlobSetting();
   const go = useGo();
 
   const getAppLogoClass = computed(() => [
@@ -67,7 +63,7 @@
   .@{prefix-cls} {
     display: flex;
     align-items: center;
-    padding-left: 10px;
+    padding-left: 7px;
     cursor: pointer;
     transition: all 0.2s ease;
 
@@ -94,10 +90,4 @@
       line-height: normal;
     }
   }
-  .anticon {
-    img {
-      height: 28px;
-      width: 28px;
-    }
-  }
-</style>
+</style>

+ 1 - 0
src/enums/httpEnum.ts

@@ -5,6 +5,7 @@ export enum ResultEnum {
   SUCCESS = 0,
   ERROR = 1,
   TIMEOUT = 4008,
+  TIMEOUT1 = 3004,
   TYPE = 'success',
 }
 

+ 1 - 1
src/enums/pageEnum.ts

@@ -2,7 +2,7 @@ export enum PageEnum {
   // basic login path
   BASE_LOGIN = '/login',
   // basic home path
-  BASE_HOME = '/statistics/scene',
+  BASE_HOME = '/dashboard/home',
   // error page path
   ERROR_PAGE = '/exception',
   // error log page path

+ 2 - 2
src/layouts/default/header/index.vue

@@ -41,12 +41,12 @@
 
       <FullScreen v-if="getShowFullScreen" :class="`${prefixCls}-action__item fullscreen-item`" />
 
-      <!-- <AppLocalePicker
+      <AppLocalePicker
         v-if="getShowLocalePicker"
         :reload="true"
         :showText="false"
         :class="`${prefixCls}-action__item`"
-      /> -->
+      />
 
       <UserDropDown :theme="getHeaderTheme" />
       <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" />

+ 2 - 0
src/locales/lang/en.ts

@@ -1,11 +1,13 @@
 import { genMessage } from '../helper';
 import antdLocale from 'ant-design-vue/es/locale/en_US';
 // import momentLocale from 'moment/dist/locale/en-us';
+import en from './weblate/en.json';
 
 const modules = import.meta.globEager('./en/**/*.ts');
 export default {
   message: {
     ...genMessage(modules, 'en'),
+    weblate: en,
     antdLocale,
   },
   momentLocale: null,

+ 2 - 1
src/locales/lang/en/common.ts

@@ -8,7 +8,8 @@ export default {
   resetText: 'Reset',
   searchText: 'Search',
   queryText: 'Search',
-
+  edit: 'Edit',
+  operating: 'Operating',
   inputText: 'Please enter',
   chooseText: 'Please choose',
 

+ 20 - 0
src/locales/lang/en/routes/account.ts

@@ -0,0 +1,20 @@
+export default {
+  type: {
+    1: '权益订单',
+    2: '下载订单',
+    3: '消费订单',
+  },
+  name: 'Project Name',
+  home: 'Project',
+  add: 'New project',
+  addTips: 'Added successfully',
+  title: 'Title',
+  nameTips: 'Please enter the project name',
+  sceneName: 'Name',
+  sceneNametips: 'Please enter a name',
+  userName: 'Account',
+  size: 'Scene size',
+  fc: 'Sealed',
+  caseTitle: 'Case name',
+  createTime: 'Creation time',
+};

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1163 - 0
src/locales/lang/weblate/en.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1184 - 0
src/locales/lang/weblate/zh.json


+ 19 - 6
src/locales/lang/zh-CN/routes/account.ts

@@ -1,7 +1,20 @@
 export default {
-  type:{
-    1:'权益订单',
-    2:'下载订单',
-    3:'消费订单',
-  }
-};
+  type: {
+    1: '权益订单',
+    2: '下载订单',
+    3: '消费订单',
+  },
+  name: '项目名称',
+  home: '项目管理',
+  add: '新增项目',
+  addTips: '添加成功',
+  title: '标题',
+  nameTips: '请输入项目名称',
+  sceneName: '名称',
+  sceneNametips: '请输入名称',
+  userName: '账户',
+  size: '场景大小',
+  fc: '封存',
+  caseTitle: '案件名称',
+  createTime: '创建时间',
+};

+ 0 - 1
src/locales/lang/zh-CN/routes/staff.ts

@@ -6,7 +6,6 @@ export default {
   mobile: '手机',
   permList: '权益',
   userId: '账号',
-  createTime: '创建时间',
   updateTime: '修改时间',
   staffList: '账号列表',
   updateBtn: '修改密码',

+ 2 - 0
src/locales/lang/zh_CN.ts

@@ -1,11 +1,13 @@
 import { genMessage } from '../helper';
 import antdLocale from 'ant-design-vue/es/locale/zh_CN';
 import momentLocale from 'moment/dist/locale/zh-cn';
+import zh from './weblate/zh.json';
 
 const modules = import.meta.globEager('./zh-CN/**/*.ts');
 export default {
   message: {
     ...genMessage(modules, 'zh-CN'),
+    weblate: zh,
     antdLocale,
   },
   momentLocale,

src/router/routes/modules/about.ts → src/router/routes/bf/about.ts


src/router/routes/modules/account.ts → src/router/routes/bf/account.ts


+ 52 - 52
src/router/routes/modules/customer.ts

@@ -1,52 +1,52 @@
-import type { AppRouteRecordRaw } from '/@/router/types';
-import { t } from '/@/hooks/web/useI18n';
-import { LAYOUT } from '/@/router/constant';
-
-export const customer: AppRouteRecordRaw = {
-  path: '/customer',
-  name: 'Customer',
-  redirect: '/customer/index',
-  component: LAYOUT,
-  meta: {
-    title: t('routes.dashboard.customer'),
-    icon: 'raphael:customer',
-    orderNo: 112,
-    hideChildrenInMenu: true,
-  },
-  children: [
-    {
-      path: 'index',
-      name: 'CustomerIndex',
-      component: () => import('/@/views/customer/index.vue'),
-      meta: {
-        title: t('routes.dashboard.customer'),
-        hideBreadcrumb: true,
-        // icon: 'la:file-invoice-dollar',
-      },
-    },
-    {
-      path: 'device/:id',
-      name: 'Device',
-      component: () => import('/@/views/customer/device.vue'),
-
-      meta: {
-        title: t('routes.dashboard.customerDevice'),
-        hideMenu: true,
-        hideBreadcrumb: true,
-        // icon: 'la:file-invoice-dollar',
-      },
-    },
-    {
-      path: 'scene/:id',
-      name: 'Scene',
-      component: () => import('/@/views/customer/scene.vue'),
-      meta: {
-        title: t('routes.dashboard.customerScene'),
-        hideMenu: true,
-        hideBreadcrumb: true,
-        // icon: 'la:file-invoice-dollar',
-      },
-    },
-  ],
-};
-export default customer;
+import type { AppRouteRecordRaw } from '/@/router/types';
+import { t } from '/@/hooks/web/useI18n';
+import { LAYOUT } from '/@/router/constant';
+
+export const customer: AppRouteRecordRaw = {
+  path: '/customer',
+  name: 'Customer',
+  redirect: '/customer/index',
+  component: LAYOUT,
+  meta: {
+    title: t('routes.dashboard.customer'),
+    icon: 'raphael:customer',
+    orderNo: 112,
+    hideChildrenInMenu: true,
+  },
+  children: [
+    {
+      path: 'index',
+      name: 'CustomerIndex',
+      component: () => import('/@/views/customer/index.vue'),
+      meta: {
+        title: t('routes.dashboard.customer'),
+        hideBreadcrumb: true,
+        // icon: 'la:file-invoice-dollar',
+      },
+    },
+    {
+      path: 'device/:id',
+      name: 'Device',
+      component: () => import('/@/views/customer/device.vue'),
+
+      meta: {
+        title: t('routes.dashboard.customerDevice'),
+        hideMenu: true,
+        hideBreadcrumb: true,
+        // icon: 'la:file-invoice-dollar',
+      },
+    },
+    {
+      path: 'scene/:id',
+      name: 'Scene',
+      component: () => import('/@/views/customer/scene.vue'),
+      meta: {
+        title: t('routes.dashboard.customerScene'),
+        hideMenu: true,
+        hideBreadcrumb: true,
+        // icon: 'la:file-invoice-dollar',
+      },
+    },
+  ],
+};
+export default customer;

+ 30 - 0
src/router/routes/bf/dashboard.ts

@@ -0,0 +1,30 @@
+import type { AppRouteModule } from '/@/router/types';
+
+import { LAYOUT } from '/@/router/constant';
+import { t } from '/@/hooks/web/useI18n';
+
+const dashboard: AppRouteModule = {
+  path: '/dashboard',
+  name: 'Dashboard',
+  component: LAYOUT,
+  redirect: '/dashboard/home',
+  meta: {
+    orderNo: 10,
+    icon: 'ion:grid-outline',
+    title: '案件管理',
+    hideChildrenInMenu: true,
+  },
+  children: [
+    {
+      path: 'home',
+      name: 'Home',
+      component: () => import('/@/views/case/list.vue'),
+      meta: {
+        // affix: true,
+        title: t('routes.dashboard.analysis'),
+      },
+    },
+  ],
+};
+
+export default dashboard;

src/router/routes/modules/dealer.ts → src/router/routes/bf/dealer.ts


+ 1 - 2
src/router/routes/modules/device.ts

@@ -9,8 +9,7 @@ export const ProductRoute: AppRouteRecordRaw = {
     title: t('routes.dashboard.devices'),
     icon: 'la:file-invoice-dollar',
     orderNo: 90,
-  },      
+  },
   component: () => import('/@/views/device/index.vue'),
-
 };
 export default ProductRoute;

src/router/routes/modules/invoice.ts → src/router/routes/bf/invoice.ts


src/router/routes/modules/operate.ts → src/router/routes/bf/operate.ts


src/router/routes/modules/order.ts → src/router/routes/bf/order.ts


src/router/routes/modules/product.ts → src/router/routes/bf/product.ts


+ 84 - 84
src/router/routes/modules/productOperation.ts

@@ -1,84 +1,84 @@
-import type { AppRouteRecordRaw } from '/@/router/types';
-import { t } from '/@/hooks/web/useI18n';
-import { LAYOUT } from '/@/router/constant';
-
-export const productOperation: AppRouteRecordRaw = {
-  path: '/productOperation',
-  name: 'ProductOperation',
-  redirect: '/productOperation/index',
-  component: LAYOUT,
-  meta: {
-    title: t('routes.dashboard.productOperation'),
-    icon: 'carbon:carbon-for-ibm-product',
-    orderNo: 102,
-    // hideChildrenInMenu: true,
-  },
-  children: [
-    {
-      path: 'cameraScene',
-      name: 'CameraScene',
-      component: () => import('/@/views/productOperation/cameraScene.vue'),
-      meta: {
-        title: t('routes.dashboard.cameraScene'),
-        icon: 'material-symbols:scene-outline',
-      },
-      // children: [
-      //   {
-      //     path: 'laserScene',
-      //     name: 'LaserScene',
-      //     component: () => import('/@/views/productOperation/sceneManager/laserScene.vue'),
-      //     meta: {
-      //       title: t('routes.dashboard.laserScene'),
-      //       // icon: 'la:file-invoice-dollar',
-      //     },
-      //   },
-      //   // {
-      //   //   path: 'liteScene',
-      //   //   name: 'LiteScene',
-      //   //   component: () => import('/@/views/productOperation/sceneManager/liteScene.vue'),
-      //   //   meta: {
-      //   //     title: t('routes.dashboard.liteScene'),
-      //   //     // icon: 'la:file-invoice-dollar',
-      //   //   },
-      //   // },
-      //   {
-      //     path: 'kankanScene',
-      //     name: 'KankanScene',
-      //     component: () => import('/@/views/productOperation/sceneManager/kankanScene.vue'),
-      //     meta: {
-      //       title: t('routes.dashboard.kankanScene'),
-      //       // icon: 'la:file-invoice-dollar',
-      //     },
-      //   },
-      //   {
-      //     path: 'minionScene',
-      //     name: 'MinionScene',
-      //     component: () => import('/@/views/productOperation/sceneManager/minionScene.vue'),
-      //     meta: {
-      //       title: t('routes.dashboard.MinionScene'),
-      //       // icon: 'la:file-invoice-dollar',
-      //     },
-      //   },
-      // ],
-    },
-    {
-      path: 'sxz',
-      name: 'Sxz',
-      component: () => import('/@/views/productOperation/sxz.vue'),
-      meta: {
-        title: t('routes.dashboard.sxz'),
-        icon: 'icon-park-outline:projector-two',
-      },
-    },
-    {
-      path: 'viewKankan',
-      name: 'ViewKankan',
-      component: () => import('/@/views/productOperation/viewKankan.vue'),
-      meta: {
-        title: t('routes.dashboard.viewKankan'),
-        icon: 'fa6-solid:panorama',
-      },
-    },
-  ],
-};
-export default productOperation;
+import type { AppRouteRecordRaw } from '/@/router/types';
+import { t } from '/@/hooks/web/useI18n';
+import { LAYOUT } from '/@/router/constant';
+
+export const productOperation: AppRouteRecordRaw = {
+  path: '/productOperation',
+  name: 'ProductOperation',
+  redirect: '/productOperation/index',
+  component: LAYOUT,
+  meta: {
+    title: t('routes.dashboard.productOperation'),
+    icon: 'carbon:carbon-for-ibm-product',
+    orderNo: 102,
+    // hideChildrenInMenu: true,
+  },
+  children: [
+    {
+      path: 'cameraScene',
+      name: 'CameraScene',
+      component: () => import('/@/views/productOperation/cameraScene.vue'),
+      meta: {
+        title: t('routes.dashboard.cameraScene'),
+        icon: 'material-symbols:scene-outline',
+      },
+      // children: [
+      //   {
+      //     path: 'laserScene',
+      //     name: 'LaserScene',
+      //     component: () => import('/@/views/productOperation/sceneManager/laserScene.vue'),
+      //     meta: {
+      //       title: t('routes.dashboard.laserScene'),
+      //       // icon: 'la:file-invoice-dollar',
+      //     },
+      //   },
+      //   // {
+      //   //   path: 'liteScene',
+      //   //   name: 'LiteScene',
+      //   //   component: () => import('/@/views/productOperation/sceneManager/liteScene.vue'),
+      //   //   meta: {
+      //   //     title: t('routes.dashboard.liteScene'),
+      //   //     // icon: 'la:file-invoice-dollar',
+      //   //   },
+      //   // },
+      //   {
+      //     path: 'kankanScene',
+      //     name: 'KankanScene',
+      //     component: () => import('/@/views/productOperation/sceneManager/kankanScene.vue'),
+      //     meta: {
+      //       title: t('routes.dashboard.kankanScene'),
+      //       // icon: 'la:file-invoice-dollar',
+      //     },
+      //   },
+      //   {
+      //     path: 'minionScene',
+      //     name: 'MinionScene',
+      //     component: () => import('/@/views/productOperation/sceneManager/minionScene.vue'),
+      //     meta: {
+      //       title: t('routes.dashboard.MinionScene'),
+      //       // icon: 'la:file-invoice-dollar',
+      //     },
+      //   },
+      // ],
+    },
+    {
+      path: 'sxz',
+      name: 'Sxz',
+      component: () => import('/@/views/productOperation/sxz.vue'),
+      meta: {
+        title: t('routes.dashboard.sxz'),
+        icon: 'icon-park-outline:projector-two',
+      },
+    },
+    {
+      path: 'viewKankan',
+      name: 'ViewKankan',
+      component: () => import('/@/views/productOperation/viewKankan.vue'),
+      meta: {
+        title: t('routes.dashboard.viewKankan'),
+        icon: 'fa6-solid:panorama',
+      },
+    },
+  ],
+};
+export default productOperation;

src/router/routes/modules/staff.ts → src/router/routes/bf/staff.ts


src/router/routes/modules/user.ts → src/router/routes/bf/user.ts


+ 22 - 2
src/router/routes/index.ts

@@ -1,5 +1,5 @@
 import type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types';
-
+import { LAYOUT } from '/@/router/constant';
 import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE, ERROR_LOG_ROUTE } from '/@/router/routes/basic';
 
 import { mainOutRoutes } from './mainOut';
@@ -15,7 +15,7 @@ Object.keys(modules).forEach((key) => {
   const modList = Array.isArray(mod) ? [...mod] : [mod];
   routeModuleList.push(...modList);
 });
-
+// ...routeModuleList
 export const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList];
 
 export const RootRoute: AppRouteRecordRaw = {
@@ -36,9 +36,29 @@ export const LoginRoute: AppRouteRecordRaw = {
   },
 };
 
+export const HomeRoute: AppRouteRecordRaw = {
+  path: '/home',
+  name: 'Home',
+  meta: {
+    title: t('routes.dashboard.devices'),
+    icon: 'la:file-invoice-dollar',
+    orderNo: 90,
+  },
+  component: () => import('/@/views/device/index.vue'),
+};
+// {
+//   path: '/home',
+//   name: 'Home',
+//   component: () => import('/@/views/case/list.vue'),
+//   meta: {
+//     title: t('routes.basic.login'),
+//   },
+// };
+
 // Basic routing without permission
 export const basicRoutes = [
   LoginRoute,
+  HomeRoute,
   RootRoute,
   ...mainOutRoutes,
   REDIRECT_ROUTE,

+ 5 - 13
src/router/routes/modules/dashboard.ts

@@ -7,31 +7,23 @@ const dashboard: AppRouteModule = {
   path: '/dashboard',
   name: 'Dashboard',
   component: LAYOUT,
-  redirect: '/dashboard/analysis',
+  redirect: '/dashboard/home',
   meta: {
     orderNo: 10,
     icon: 'ion:grid-outline',
-    title: t('routes.dashboard.dashboard'),
+    title: t('routes.account.home'),
     hideChildrenInMenu: true,
   },
   children: [
     {
-      path: 'analysis',
-      name: 'Analysis',
-      component: () => import('/@/views/dashboard/analysis/index.vue'),
+      path: 'home',
+      name: 'Home',
+      component: () => import('/@/views/case/list.vue'),
       meta: {
         // affix: true,
         title: t('routes.dashboard.analysis'),
       },
     },
-    {
-      path: 'workbench',
-      name: 'Workbench',
-      component: () => import('/@/views/dashboard/workbench/index.vue'),
-      meta: {
-        title: t('routes.dashboard.workbench'),
-      },
-    },
   ],
 };
 

+ 1 - 1
src/settings/projectSetting.ts

@@ -24,7 +24,7 @@ const setting: ProjectConfig = {
   settingButtonPosition: SettingButtonPositionEnum.AUTO,
 
   // Permission mode
-  permissionMode: PermissionModeEnum.BACK,
+  permissionMode: PermissionModeEnum.ROUTE_MAPPING,
 
   // Permission-related cache is stored in sessionStorage or localStorage
   permissionCacheType: CacheTypeEnum.LOCAL,

+ 1 - 1
src/store/modules/app.ts

@@ -36,7 +36,7 @@ export const useAppStore = defineStore({
     pageLoading: false,
     projectConfig: Persistent.getLocal(PROJ_CFG_KEY),
     beforeMiniInfo: {},
-    title: '江门公安',
+    title: '融合平台',
     // description: '',
   }),
   getters: {

+ 0 - 1
src/utils/http/axios/checkStatus.ts

@@ -19,7 +19,6 @@ export function checkStatus(
   const { t } = useI18n();
   const userStore = useUserStoreWithOut();
   let errMessage = '';
-
   switch (status) {
     case 400:
       errMessage = `${msg}`;

+ 6 - 1
src/utils/http/axios/index.ts

@@ -59,10 +59,15 @@ const transform: AxiosTransform = {
     // 在此处根据自己项目的实际情况对不同的code执行不同的操作
     // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可
     let timeoutMsg = '';
+    const userStore = useUserStoreWithOut();
     switch (code) {
       case ResultEnum.TIMEOUT:
         timeoutMsg = t('sys.api.timeoutMessage');
-        const userStore = useUserStoreWithOut();
+        userStore.setToken(undefined);
+        userStore.logout(true);
+        break;
+      case ResultEnum.TIMEOUT1:
+        timeoutMsg = t('sys.api.timeoutMessage');
         userStore.setToken(undefined);
         userStore.logout(true);
         break;

+ 30 - 27
src/views/case/addCaseModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="新增案件"
+    :title="t('routes.account.add')"
     @visible-change="handleVisibleChange"
     @ok="handleSubmit"
     :confirmLoading="loading"
@@ -11,9 +11,9 @@
   >
     <div class="pt-2px pr-3px">
       <div class="mx-5 BasicForm flex">
-        <span style="line-height: 32px; margin-right: 10px">案件名称</span>
+        <span style="line-height: 32px; margin-right: 10px">{{t('routes.account.name')}}</span>
         <div class="input">
-          <a-input style="width: 600px" maxlength="100" showCount v-model:value="fileFlow.caseTitle" placeholder="请输入" />
+          <a-input style="width: 600px" maxlength="100" showCount v-model:value="fileFlow.caseTitle" :placeholder="t('common.inputText')" />
         </div>
         <!-- <a-button type="primary" @click="handleAdd"> 新增</a-button> -->
       </div>
@@ -68,7 +68,7 @@
       });
       const columns: BasicColumn[] = [
         {
-          title: '场景标题',
+          title: t('weblate.program.case.sceneName'),
           dataIndex: 'sceneName',
           ellipsis: true,
           slots: { customRender: 'href' },
@@ -77,18 +77,18 @@
           width: 150,
         },
         {
-          title: '场景码',
+          title: t('weblate.program.case.num'),
           dataIndex: 'num',
           ellipsis: true,
           width: 180,
         },
         {
-          title: '计算完成时间',
+          title: t('weblate.program.sceneDetail.calc_done_time'),
           dataIndex: 'algorithmTime',
           width: 180,
         },
         {
-          title: '场景大小',
+          title: t('routes.account.size'),
           dataIndex: 'sceneSize',
           width: 80,
           customRender: ({ record }) => {
@@ -98,26 +98,29 @@
           },
         },
         {
-          title: '状态',
+          title: t('weblate.mediaLibrary.statusStr'),
           dataIndex: 'status',
           width: 80,
           customRender: ({ record }) => {
             let str;
             switch (record.status - 0) {
               case 0:
-                str = '计算中';
+                str = t('weblate.program.case.status_0');
                 break;
-              case 1:
-                str = '计算成功';
+              case 2:
+                str = t('weblate.program.case.status_2');
                 break;
               case -2:
-                str = '计算成功';
+                str = t('weblate.program.case.status_2');
+                break;
+              case 1:
+                str = t('weblate.program.case.status_');
                 break;
               case -1:
-                str = '计算失败';
+                str = t('weblate.program.case.status_');
                 break;
             }
-            return record.payStatus == -2 ? '封存' : str;
+            return record.payStatus == -2 ? t('routes.account.fc') : str;
           },
         },
       ];
@@ -128,11 +131,10 @@
         schemas: [
           {
             field: 'sceneName',
-            label: '名称',
+            label: t('routes.account.sceneName'),
             component: 'Input',
             componentProps: {
               maxLength: 100,
-              placeholder: ' 请名称搜索',
             },
             colProps: {
               xl: 7,
@@ -141,7 +143,7 @@
           },
           {
             field: 'isObj',
-            label: '场景类型',
+            label: t('weblate.program.case.sceneType'),
             component: 'Select',
             labelWidth: 80,
             // labelWidth: 50,
@@ -150,12 +152,12 @@
               allowClear: false,
               options: [
                 {
-                  label: '点云场景',
+                  label: t('weblate.program.scene.laserClo'),
                   value: '0',
                   key: '0',
                 },
                 {
-                  label: 'Mesh 场景',
+                  label: t('weblate.program.scene.laserObj'),
                   value: '1',
                   key: '1',
                 },
@@ -206,7 +208,7 @@
       });
       function getRowSelection(record) {
         return {
-        disabled: record.inCase || !(record.status == 1 || record.status == -2), // Column configuration not to be checked
+        disabled: !(record.status == 2 && record.payStatus == 1), // Column configuration not to be checked
         name: record.name,}
        }
       function onSelectChange(selectedRowKeys: any, selectedRows: any) {
@@ -232,17 +234,17 @@
           dictName: fileFlow.dictName.trim(),
         };
         if (!fileFlow.dictName.trim()) {
-          return createMessage.warning('请输入名称');
+          return createMessage.warning(t('routes.account.sceneNametips'));
         }
         addOrUpdate(params).then((res) => {
-          createMessage.success('添加成功');
+          createMessage.success(t('routes.account.addTips'));
           fileFlow.dictName = '';
           reload();
         });
       }
       const handleSubmit = async () => {
         if(!fileFlow.caseTitle?.trim()){
-          return createMessage.warning('请输入案件名称')
+          return createMessage.warning(t('routes.account.nameTips'))
         }
         try {
           loading.value = true;
@@ -263,7 +265,7 @@
           const res = await caseaddOrUpdateApi(apiData);
           console.log('res', res);
           closeModal();
-          createMessage.success('新增案件成功。');
+          createMessage.success(t('routes.account.addTips'));
           emit('update');
           loading.value = false;
         } catch (error) {
@@ -278,12 +280,13 @@
       async function handleDelete(record: Recordable) {
         console.log('handleDelete', record);
         createConfirm({
-          title: '删除',
-          content: '确定要删除吗?',
+          title: t('common.delText'),
+
+          content: t('weblate.mediaLibrary.tips.deltext'),
           onOk: async () => {
             del({ id: record.id }).then(() => {
               createMessage.success({
-                content: '删除成功',
+                content: t('weblate.mediaLibrary.tips.del'),
               });
               reload();
             });

+ 21 - 41
src/views/case/list.vue

@@ -1,16 +1,16 @@
 <template>
   <div class="scren">
     <PageWrapper contentBackground>
-      <template #footer>
+      <!-- <template #footer>
         <a-tabs v-model:activeKey="tableType" @change="changeTable">
           <Tabs.TabPane :key="0" tab="案件管理" :disabled="loading" />
-          <Tabs.TabPane :key="1" tab="案件共享" :disabled="loading" />
+          <Tabs.TabPane :key="1" tab="案件共享" :disabled="loading" /> 
         </a-tabs
-      ></template>
+      ></template> -->
       <div class="desc-wrap-BasicTable">
         <BasicTable @register="registerTable">
           <template #toolbar>
-            <a-button type="primary"  @click="handleAdd" v-if="getCheckPerm('case-Add') && tableType == 0"> 新增案件</a-button>
+            <a-button type="primary"  @click="handleAdd" > {{t('routes.account.add')}}</a-button>
           </template>
 
           <template #href="{ record }">
@@ -28,34 +28,14 @@
               stopButtonPropagation
               :actions="[
                 {
-                  label: '编辑',
+                  label: t('common.edit'),
                   disabled: tableType == 1 && !record.isEdit,
-                  ifShow: getTypeCheckPerm('case-edit'),
+                  //ifShow: getTypeCheckPerm('case-edit'),
                   onClick: handlegotoEdit.bind(null, record),
                 },
                 {
-                  label: '权限',
-                  disabled: tableType == 1 && !record.isAuth,
-                  ifShow: getTypeCheckPerm('case-powers'),
-                  onClick: handlePowers.bind(null, record),
-                },
-                {
-                  label: '下载',
-                  ifShow: getTypeCheckPerm('case-download') && !record.isOpen,
-                  //  getTypeCheckPerm('scenes-download') &&
-                  //  tableType != 3 &&
-                  //  (record.userName == userInfo.userName ||
-                  //    userInfo.roleId == 1 ||
-                  //    userInfo.roleId == 45 ||
-                  //    userInfo.roleId == 48),
-                  // disabled: !(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
-                  //icon: 'carbon:download',
-                  disabled:  tableType == 1,
-                  onClick: createConfirmDownload.bind(null, record),
-                },
-                {
-                  label: '删除',
-                  ifShow: getTypeCheckPerm('case-delete') && !record.isOpen,
+                  label: t('common.delText'),
+                  ifShow: !record.isOpen,
                   //icon: 'ic:outline-delete-outline',
                   disabled: tableType == 1,
                   color: 'error',
@@ -154,7 +134,7 @@
       const tableType = ref<number>(0); //0看看 、1看见、2深时
       const columns: BasicColumn[] = [
         {
-          title: '标题',
+          title: t('routes.account.title'),
           dataIndex: 'sceneName',
           ellipsis: true,
           slots: { customRender: 'href' },
@@ -163,19 +143,19 @@
           width: 300,
         },
         {
-          title: '人员编号',
+          title: t('routes.account.userName'),
           dataIndex: 'userName',
           ellipsis: true,
-          width: 100,
-        },
-        {
-          title: '姓名',
-          dataIndex: 'nickName',
-          ellipsis: true,
-          width: 100,
+          width: 220,
         },
+        // {
+        //   title: '姓名',
+        //   dataIndex: 'nickName',
+        //   ellipsis: true,
+        //   width: 100,
+        // },
         {
-          title: '创建时间',
+          title: t('routes.account.createTime'),
           dataIndex: 'createTime',
           width: 230,
           customRender: ({ record }) => {
@@ -281,7 +261,7 @@
         //   },
         // },
         {
-          title: '操作',
+          title: t('common.operating'),
           dataIndex: 'action',
           slots: { customRender: 'action' },
           ifShow: true,
@@ -297,7 +277,7 @@
         schemas: [
           {
             field: 'caseTitle',
-            label: '案件名称',
+            label: t('routes.account.name'),
             component: 'Input',
             componentProps: {
               maxLength: 100,
@@ -499,7 +479,7 @@
         return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
       }
       function handlegotoEdit(record) {
-        window.open(`/mix3d/#/home/${record.caseId}`);
+        window.open(`/mix3d/#/homes/${record.caseId}`);
         // let url = record.webSite.replace('smg', 'epg');
         // if (!record.editAuthTime || (record.editAuthTime && dayjs() < dayjs(record.editAuthTime))) {
         //   window.open(url);

+ 35 - 151
src/views/sys/login/Login.vue

@@ -1,23 +1,21 @@
 <template>
-  <div :class="prefixCls" class="relative w-full h-full px-4 login-main">
-    <!-- <AppLocalePicker
+  <div :class="prefixCls" class="relative w-full h-full px-4">
+    <AppLocalePicker
       class="absolute text-white top-4 right-4 enter-x xl:text-gray-600"
       :showText="false"
       v-if="!sessionTimeout && showLocale"
-    /> -->
-    <!-- <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" /> -->
+    />
+    <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" />
 
     <span class="-enter-x xl:hidden">
       <AppLogo :alwaysShowTitle="true" />
     </span>
-    <div class="suoyuan"
-      >公安部鉴定中心 & 江门市公安局 & 四维时代 | 公安部科技强警基础工作计划(2022JC13)</div
-    >
+
     <div class="container relative h-full py-2 mx-auto sm:px-10">
       <div class="flex h-full">
-        <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-5/12">
+        <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12">
           <AppLogo class="-enter-x" />
-          <div class="my-auto" style="visibility: hidden">
+          <div class="my-auto">
             <img
               :alt="title"
               src="../../../assets/svg/login-box-bg.svg"
@@ -31,37 +29,27 @@
             </div>
           </div>
         </div>
-        <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-7/12">
+        <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12">
           <div
             :class="`${prefixCls}-form`"
-            class="relative 2xl:left-48 xl:left-16 w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-8 2xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-4/5 lg:w-3/5 xl:w-auto enter-x"
+            class="
+              relative
+              w-full
+              px-5
+              py-8
+              mx-auto
+              my-auto
+              rounded-md
+              shadow-md
+              xl:ml-16 xl:bg-transparent
+              sm:px-8
+              xl:p-4 xl:shadow-none
+              sm:w-3/4
+              lg:w-2/4
+              xl:w-auto
+              enter-x
+            "
           >
-            <div class="title" v-if="mytitle != '江门公安'">
-              <div class="titleText" style="font-weight: bold; letter-spacing: 12px">
-                <div style="margin-bottom: 0; white-space: nowrap">案事件实景三维重建</div>
-                <div>及数字化建档系统</div>
-              </div>
-              <div
-                class="en text-sm font-normal mb-5 titleSubtext"
-                style="line-height: 30px; margin-bottom: 24px; color: #666"
-              >
-                <div>3D Scene Reconstruction and Digital Archiving System of Police</div>
-                <div>Cases and Events</div>
-              </div>
-            </div>
-            <div class="title" v-else>
-              <div class="titleText" style="font-weight: bold; letter-spacing: 12px">
-                <div style="margin-bottom: 0">江门市公安局</div>
-                <div>警用三维实景平台</div>
-              </div>
-              <div
-                class="en text-sm font-normal mb-5 titleSubtext"
-                style="line-height: 30px; margin-bottom: 24px; color: #666"
-              >
-                <div>Three-Dimensional Police Scene Platform for Public Security</div>
-                <div>Bureau of Jiangmen Municipality</div>
-              </div>
-            </div>
             <LoginForm />
             <ForgetPasswordForm />
             <RegisterForm />
@@ -86,82 +74,32 @@
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useDesign } from '/@/hooks/web/useDesign';
   import { useLocaleStore } from '/@/store/modules/locale';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useUserStoreWithOut } from '/@/store/modules/user';
-  import { addressKey } from '/@/api/jyUserPlatform/index';
-  import { useAppStoreWithOut } from '/@/store/modules/app';
-  import { useMessage } from '/@/hooks/web/useMessage';
-
-  const appStore = useAppStoreWithOut();
 
   defineProps({
     sessionTimeout: {
       type: Boolean,
     },
   });
-  const { getTitle } = useRootSetting();
-  const mytitle = computed(() => getTitle.value);
+
   const globSetting = useGlobSetting();
-  const useUserStore = useUserStoreWithOut();
   const { prefixCls } = useDesign('login');
   const { t } = useI18n();
   const localeStore = useLocaleStore();
   const showLocale = localeStore.getShowPicker;
   const title = computed(() => globSetting?.title ?? '');
-  function getUrlParams2() {
-    const { createConfirm } = useMessage();
-    let url = window.location.href;
-    let urlStr = url.split('?')[1];
-    const urlSearchParams = new URLSearchParams(urlStr);
-    const result = Object.fromEntries(urlSearchParams.entries());
-    let address = result['key'];
-    if (address) {
-      addressKey(address).then((res) => {
-        if (res.status == 1) {
-          createConfirm({
-            iconType: 'warning',
-            title: '警告',
-            content: `此平台已被禁用`,
-            onOk: async () => {
-              onClose();
-            },
-            onCancel: async () => {
-              onClose();
-            },
-          });
-          return;
-        }
-        appStore.setTitle(res.platformName);
-      });
-    }
-  }
-  const onClose = () => {
-    window.opener = null;
-    window.open('about:blank', '_top')?.close();
-  };
-  getUrlParams2();
 </script>
 <style lang="less">
   @prefix-cls: ~'@{namespace}-login';
   @logo-prefix-cls: ~'@{namespace}-app-logo';
   @countdown-prefix-cls: ~'@{namespace}-countdown-input';
   @dark-bg: #293146;
-  @media screen and (min-width: 3000px) {
-    .login-main {
-      .titleText {
-        line-height: 46px !important;
-      }
-      .mymargin {
-        margin-bottom: 10px !important;
-      }
-    }
-  }
+
   html[data-theme='dark'] {
     .@{prefix-cls} {
       background-color: @dark-bg;
 
       &::before {
-        background-image: url(/@/assets/svg/login-bg-dark.svg);
+        background-image: url(/@/assets/svg/login-bg.svg);
       }
 
       .ant-input,
@@ -188,39 +126,7 @@
       box-shadow: inherit !important;
     }
   }
-  .title {
-    width: 450px;
-    .titleText {
-      font-size: 40px;
-      @media (max-width: 1024px) {
-        font-size: 24px;
-        line-height: 40px;
-      }
-      @media (max-width: @screen-xl) {
-        font-size: 40px;
-      }
-      @media (max-width: 3000px) {
-        font-size: 28px;
-      }
-    }
-    .titleSubtext {
-      font-size: 14px;
-      @media (max-width: @screen-sm) {
-        font-size: 12px;
-        line-height: 14px !important;
-      }
-      @media (max-width: 1024px) {
-        font-size: 12px;
-        line-height: 18px !important;
-        margin-bottom: 0 !important;
-      }
-      @media (min-width: 3000px) {
-        font-size: 12px;
-        line-height: 20px !important;
-        margin-bottom: 16px !important;
-      }
-    }
-  }
+
   .@{prefix-cls} {
     min-height: 100%;
     overflow: hidden;
@@ -239,6 +145,7 @@
       width: 100%;
       height: 100%;
       margin-left: -48%;
+      background-image: url(/@/assets/svg/login-bg.svg);
       background-position: 100%;
       background-repeat: no-repeat;
       background-size: auto 100%;
@@ -255,7 +162,7 @@
 
       &__title {
         font-size: 16px;
-        // color: #fff;
+        color: #fff;
       }
 
       img {
@@ -270,18 +177,12 @@
         height: 80px;
 
         &__title {
-          // font-size: 24px;
-          // color: #fff;
-          font-size: 32px;
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: 500;
-          color: #000000;
-          line-height: 38px;
+          font-size: 24px;
+          color: #fff;
         }
 
         img {
-          width: 40px;
-          height: 40px;
+          width: 150px;
         }
       }
     }
@@ -327,21 +228,4 @@
       color: @text-color-secondary;
     }
   }
-  .login-main {
-    background-image: url(../bg_ga.jpg);
-    background-position: 100%;
-    background-repeat: no-repeat;
-    background-size: cover;
-  }
-  .suoyuan {
-    position: absolute;
-    bottom: 30px;
-    width: 100%;
-    font-size: 14px;
-    font-family: Microsoft YaHei, Microsoft YaHei;
-    font-weight: 400;
-    color: #999999;
-    line-height: 30px;
-    text-align: center;
-  }
-</style>
+</style>

+ 28 - 83
src/views/sys/login/LoginForm.vue

@@ -1,15 +1,14 @@
 <template>
-  <!-- <LoginFormTitle v-show="getShow" class="enter-x" /> -->
+  <LoginFormTitle v-show="getShow" class="enter-x" />
   <Form
-    class="p-4 enter-x m-auto"
-    style="max-width: 400px"
+    class="p-4 enter-x"
     :model="formData"
     :rules="getFormRules"
     ref="formRef"
     v-show="getShow"
     @keypress.enter="handleLogin"
   >
-    <FormItem name="account" class="enter-x mymargin">
+    <FormItem name="account" class="enter-x">
       <Input
         size="large"
         v-model:value="formData.account"
@@ -17,7 +16,7 @@
         class="fix-auto-fill"
       />
     </FormItem>
-    <FormItem name="password" class="enter-x mymargin">
+    <FormItem name="password" class="enter-x">
       <InputPassword
         size="large"
         visibilityToggle
@@ -28,7 +27,7 @@
 
     <ARow class="enter-x">
       <ACol :span="12">
-        <FormItem class="mymargin">
+        <FormItem>
           <!-- No logic, you need to deal with it yourself -->
           <Checkbox v-model:checked="rememberMe" size="small">
             {{ t('sys.login.rememberMe') }}
@@ -36,7 +35,7 @@
         </FormItem>
       </ACol>
       <ACol :span="12">
-        <FormItem :style="{ 'text-align': 'right' }" class="mymargin">
+        <FormItem :style="{ 'text-align': 'right' }">
           <!-- No logic, you need to deal with it yourself -->
           <!-- <Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)">
             {{ t('sys.login.forgetPassword') }}
@@ -46,21 +45,12 @@
     </ARow>
 
     <FormItem class="enter-x">
-      <Button
-        class="mybtmargin"
-        style="border-radius: 5px"
-        type="primary"
-        size="large"
-        block
-        @click="handleLogin"
-        :loading="loading"
-      >
+      <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
         {{ t('sys.login.loginButton') }}
       </Button>
-      <Button size="large" class="mybtmargin enter-x" block @click="handleRegister">
+      <!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">
         {{ t('sys.login.registerButton') }}
-      </Button>
-      <Button size="large" class="enter-x" block @click="handlesybz"> 使用帮助 </Button>
+      </Button> -->
     </FormItem>
     <!-- <ARow class="enter-x">
       <ACol :md="8" :xs="24">
@@ -93,9 +83,8 @@
 </template>
 <script lang="ts" setup>
   import { reactive, ref, unref, computed, onMounted } from 'vue';
-  import { useRoute } from 'vue-router'
 
-  import { Checkbox, Form, Input, Row, Col, Button } from 'ant-design-vue'; //  Divider
+  import { Checkbox, Form, Input, Row, Col, Button, } from 'ant-design-vue';//  Divider
   // import {
   //   GithubFilled,
   //   WechatFilled,
@@ -107,7 +96,7 @@
 
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { useAppStoreWithOut } from '/@/store/modules/app';
+
   import { useUserStore } from '/@/store/modules/user';
   import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
   import { useDesign } from '/@/hooks/web/useDesign';
@@ -121,20 +110,14 @@
   const { notification, createErrorModal } = useMessage();
   const { prefixCls } = useDesign('login');
   const userStore = useUserStore();
-  const appStore = useAppStoreWithOut();
 
   const { setLoginState, getLoginState } = useLoginState();
   const { getFormRules } = useFormRules();
-  const { query } = useRoute()
+
   const formRef = ref();
   const loading = ref(false);
   const rememberMe = ref(false);
-  const registerUrl = ref('');
-  fetch('./register.json')
-    .then((response) => response.json())
-    .then((data) => {
-      registerUrl.value = data.url;
-    });
+
   const formData = reactive({
     account: '',
     password: '',
@@ -147,32 +130,18 @@
   const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN);
 
   onMounted(() => {
-    let localePass = localStorage.getItem('password');
-    if (localePass) {
+    let localePass = localStorage.getItem('password')
+    if(localePass){
       let password = decodeURIComponent(escape(window.atob(localePass))),
-        account: string = localStorage.getItem('username');
-      formData.account = account;
-      formData.password = password;
-      rememberMe.value = true;
+      account:string = localStorage.getItem('username')
+      formData.account = account
+      formData.password = password
+      rememberMe.value = true
     }
+
   });
-  function handleRegister() {
-    window.open(registerUrl.value);
-  }
-  function handlesybz() {
-    window.open('//help.map.jms.gd/forum-4.htm');
-  }
-  function isUrl(string){
-  try {
-    new URL(string);
-    return true;
-  } catch (err) {
-    return false;
-  }
-}
 
   async function handleLogin() {
-    console.log('handleLogin', query);
     const data = await validForm();
     if (!data) return;
     try {
@@ -183,20 +152,13 @@
         mode: 'none', //不要默认的错误提示
       });
       if (userInfo) {
-        console.log('handleLogin', userInfo, query);
-        if (userInfo.platformName) {
-          appStore.setTitle(userInfo.platformName);
-        }
-        if (rememberMe.value) {
-          let password: string = window.btoa(unescape(encodeURIComponent(data.password)));
-          localStorage.setItem('password', password);
-          localStorage.setItem('username', data.account);
-        } else {
-          localStorage.removeItem('password');
-          localStorage.removeItem('username');
-        }
-        if(query?.redirect && isUrl(query?.redirect as string)){
-          window.open(query?.redirect as string);
+        if(rememberMe.value){
+          let password:string = window.btoa(unescape(encodeURIComponent(data.password)))
+          localStorage.setItem('password',password)
+          localStorage.setItem('username',data.account)
+        }else{
+          localStorage.removeItem("password");
+          localStorage.removeItem("username");
         }
         notification.success({
           message: t('sys.login.loginSuccessTitle'),
@@ -214,21 +176,4 @@
       loading.value = false;
     }
   }
-</script>
-<style lang="less" scoped>
-  .mymargin {
-    margin-bottom: 24px;
-    @media (max-width: 3000px) {
-      margin-bottom: 12px;
-    }
-  }
-  .mybtmargin {
-    margin-bottom: 20px;
-    @media (max-width: 1024px) {
-      margin-bottom: 10px;
-    }
-    @media (max-width: 3000px) {
-      margin-bottom: 10px;
-    }
-  }
-</style>
+</script>

+ 40 - 0
translate.js

@@ -0,0 +1,40 @@
+const http = require('http');
+const fs = require('fs');
+
+function checkIfPhishing(urlToPrint, path, lang = 'zh') {
+  fs.mkdirSync(path, { recursive: true });
+  const file = fs.createWriteStream(`${path}/${lang}.json`);
+  const request = http.get(urlToPrint, function (response) {
+    response
+      .on('finish', function () {
+        console.log('done');
+        // console.log(fs.readFileSync(`${lang}.json`, { encoding: "utf8" }));
+      })
+      .pipe(file);
+  });
+}
+//  zh
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/zh_Hans/',
+  'src/locales/lang/weblate',
+  'zh',
+);
+//  en
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/en/',
+  'src/locales/lang/weblate',
+  'en',
+);
+// //  ja
+// checkIfPhishing(
+//   'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/ja/',
+//   'src/i18n/weblate',
+//   'ja'
+// )
+
+// //  ja
+// checkIfPhishing(
+//   'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/ko/',
+//   'src/i18n/weblate',
+//   'kr'
+// )