1
0
Просмотр исходного кода

Merge branch 'xj' of http://192.168.0.115:3000/bill/public-fuse into xj

bill 1 год назад
Родитель
Сommit
424482e7e4

+ 2 - 1
src/app/fire/routeConfig.ts

@@ -20,7 +20,8 @@ export const menuRouteNames = [
   FireRouteName.downloadLog,
   FireRouteName.setting,
   FireRouteName.recycle,
-  FireRouteName.firmware,
+  FireRouteName.cameraVersion,
+  FireRouteName.cameraVersionApp,
 ];
 
 export const routes: Routes = [

+ 5 - 0
src/request/config.ts

@@ -25,6 +25,8 @@ import {
   userReg,
   getCaseScriptInfoUrl,
   getCaseScriptSaveOrUpdateUrl,
+  cameraVersionUpload,
+  cameraVersionAppUpload,
 } from "./urls";
 
 // 不需要登录就能请求的接口
@@ -51,6 +53,9 @@ export const fileUrls = [
   uploadFile,
   insertCaseFile,
   saveCaseFileInfo,
+  cameraVersionUpload,
+  cameraVersionAppUpload
+
 ];
 // 需要限定卫GET请求方式的url
 export const GetUrls = [getRoleList, getCompanyList];

+ 14 - 3
src/request/urls.ts

@@ -18,6 +18,8 @@ export const userReg = "/web/user/register";
 export const sendUserMsg = "/fusion-xj/notAuth/getMsgAuthCode";
 // 修改密码
 export const updatePsw = "/fusion-xj/notAuth/changePassword";
+// 重置密码
+export const restPassword = "/fusion-xj/notAuth/restPassword";
 // 新增用户
 export const userAdd = "/fusion-xj/web/user/addUser";
 //修改用户
@@ -245,6 +247,15 @@ export const caseApiUpdateSort = "/fusion-xj/caseImg/updateSort";
 
 export const getSysSetting = `/fusion-xj/systemSetting/info`;
 export const updateSysSetting = `/fusion-xj/systemSetting/save`;
-// 脚本管理
-export const getCaseScriptInfoUrl = `/fusion-xj/caseScript/info`;
-export const getCaseScriptSaveOrUpdateUrl = `/fusion-xj/caseScript/saveOrUpdate`;
+
+// 固件管理
+export const cameraVersionUpload = `/fusion-xj/cameraVersion/addAndUpload`;
+export const cameraVersionUpdate = `/fusion-xj/cameraVersion/update`;
+export const cameraVersionDelete = `/fusion-xj/cameraVersion/delete`;
+export const cameraVersionList = `/fusion-xj/cameraVersion/list`;
+
+// app管理
+export const cameraVersionAppUpload = `/fusion-xj/cameraVersionApp/addAndUpload`;
+export const cameraVersionAppUpdate = `/fusion-xj/cameraVersionApp/update`;
+export const cameraVersionAppDelete = `/fusion-xj/cameraVersionApp/delete`;
+export const cameraVersionAppList = `/fusion-xj/cameraVersionApp/list`;

+ 9 - 3
src/router/config.ts

@@ -98,11 +98,17 @@ export const routes: Routes = [
         meta: { title: "系统设置", icon: "icon-nav-setup" },
       },
       {
-        name: RouteName.firmware,
-        path: "firmware",
-        component: () => import("@/view/firmware/index.vue"),
+        name: RouteName.cameraVersion,
+        path: "cameraVersion",
+        component: () => import("@/view/cameraVersion/index.vue"),
         meta: { title: "固件管理", icon: "icon-nav-setup" },
       },
+      {
+        name: RouteName.cameraVersionApp,
+        path: "cameraVersionApp",
+        component: () => import("@/view/cameraVersionApp/index.vue"),
+        meta: { title: "APP管理", icon: "icon-nav-setup" },
+      },
     ],
   },
   {

+ 3 - 1
src/router/routeName.ts

@@ -17,7 +17,9 @@ export const RouteName = {
   sceneVisitor: "sceneVisitor",
   records: "records",
   setting: "setting",
-  firmware: "firmware",
+  // firmware: "firmware",
+  cameraVersion: "cameraVersion",
+  cameraVersionApp: "cameraVersionApp",
 } as const;
 
 type RouteNamesType = typeof RouteName;

+ 33 - 0
src/store/cameraVersion.ts

@@ -0,0 +1,33 @@
+import {
+  axios,
+  PaggingReq,
+  PaggingRes,
+  cameraVersionList,
+  cameraVersionUpload,
+  cameraVersionDelete,
+  cameraVersionUpdate,
+
+} from "@/request";
+
+export type CameraVersionEntity = {
+  id?: string;
+  version: string;
+  description: string;
+  minVersion: string;
+  type: number | string;
+  file: File | undefined
+}
+
+
+export type CameraVersionType = PaggingReq<{
+  version: string;
+  type: number;
+}>
+
+export const getCameraVersionList = (params: CameraVersionType) => {
+  return axios.post(cameraVersionList, params) as unknown as PaggingRes<CameraVersionEntity[]>;
+}
+
+export const addCameraVersion = async (params: CameraVersionType) => {
+  return (await axios.post<string>(cameraVersionUpload, { ...params })).data;
+};

+ 10 - 3
src/store/user.ts

@@ -12,6 +12,7 @@ import {
   sendUserMsg,
   setAuthHook,
   updatePsw,
+  restPassword,
   userAdd,
   userEdit,
   userLogout,
@@ -60,12 +61,13 @@ export const logout = async () => {
   user.value.info = {} as any;
 };
 
-type UpdataPassowrdParams = {
+type UpDataPasswordParams = {
   userName: string;
-  code: string;
+  // code: string;
+  oldPassword: string;
   password: string;
 };
-export const updatePassword = async (params: UpdataPassowrdParams) => {
+export const updatePassword = async (params: UpDataPasswordParams) => {
   const password = encodePwd(params.password);
   await axios.post(updatePsw, {
     ...params,
@@ -73,6 +75,11 @@ export const updatePassword = async (params: UpdataPassowrdParams) => {
     confirmPwd: password,
   });
 };
+export const resetPassword = async (params: Pick<UpDataPasswordParams, 'userName'>) => {
+  await axios.post(restPassword, {
+    ...params,
+  });
+};
 
 type RegisterParams = Pick<
   UserInfo,

+ 135 - 0
src/view/cameraVersion/edit.vue

@@ -0,0 +1,135 @@
+<template>
+  <el-form
+    :model="data"
+    ref="form"
+    label-width="120px"
+    class="cameraVersion-from"
+  >
+    <el-form-item label="设备类型" class="mandatory">
+      {{ cameraTypeDesc[data.type] }}
+    </el-form-item>
+    <el-form-item label="版本号" class="mandatory">
+      <el-input
+        maxlength="30"
+        v-model.trim="data.version"
+        placeholder="请输入最新版本号"
+      ></el-input>
+    </el-form-item>
+    <el-form-item label="最低版本号">
+      <el-input
+        maxlength="30"
+        v-model.trim="data.minVersion"
+        placeholder="请输入最低版本(低于此版本号强制更新)"
+      ></el-input>
+    </el-form-item>
+
+    <el-form-item label="版本更新说明" class="mandatory">
+      <el-input
+        maxlength="200"
+        type="textarea"
+        :autosize="{ minRows: 4, maxRows: 10 }"
+        v-model.trim="data.description"
+        placeholder="请输入版本更新说明"
+      ></el-input>
+    </el-form-item>
+    <el-form-item label="文件" class="mandatory">
+      <el-upload
+        class="upload-demo"
+        :multiple="false"
+        :limit="1"
+        :disabled="!!data.file"
+        :before-upload="upload"
+        :file-list="fileList"
+        :http-request="httpsApi"
+        :on-preview="previewFile"
+        :accept="accept"
+        :before-remove="removeFile"
+      >
+        <el-button type="primary" :disabled="!!data.file">
+          <el-icon><Upload /></el-icon>上传
+        </el-button>
+        <template v-slot:tip>
+          <div class="el-upload__tip">注:可上传{{ size }}以内的文件</div>
+        </template>
+        <!-- <template v-slot:file="{ file }: { file: UploadFile }">
+          <div class="file" @click.stop="previewFile()">
+            <div>
+              <el-icon><Document /></el-icon>
+              <span class="name">{{ file.name }}</span>
+            </div>
+            <el-icon @click.stop="removeFile()"><Close /></el-icon>
+          </div>
+        </template> -->
+      </el-upload>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script setup lang="ts">
+import { computed, ref, watchEffect } from "vue";
+import { QuiskExpose } from "@/helper/mount";
+import { CameraVersionEntity } from "@/store/cameraVersion";
+import { useUpload } from "@/hook/upload";
+import { maxFileSize } from "@/constant/caseFile";
+import { CameraType } from "@/store/camera";
+import { cameraTypeDesc } from "@/constant/camera";
+import { addCameraVersion, CameraVersionType } from "@/store/cameraVersion";
+import { ElMessage } from "element-plus";
+
+const cameraTypes = [CameraType.SWKJ, CameraType.SWSS1, CameraType.SWSS2];
+const props = defineProps<{
+  type: string | number;
+  entity?: CameraVersionEntity;
+}>();
+const data = ref<CameraVersionEntity>({
+  version: "",
+  description: "",
+  minVersion: "",
+  type: props.type.toString(),
+  file: undefined,
+});
+
+const form = ref();
+
+const isAdd = computed(() => !props.entity?.id);
+
+const httpsApi = async ({ file }) => {
+  console.log("httpsApi", file);
+  // let fileUrl = await uploadFile(file);
+  data.value.file = file;
+  // file.url = fileUrl;
+  // console.log("httpsApi", file, fileUrl);
+};
+
+const { size, fileList, upload, removeFile, previewFile, file, accept } =
+  useUpload({
+    maxSize: maxFileSize,
+    formats: [".jpg", ".jpeg"],
+  });
+defineExpose<QuiskExpose>({
+  async submit() {
+    if (!data.value.version) {
+      ElMessage.error("版本号不能为空!");
+      throw "版本号不能为空!";
+    }
+    if (!data.value.file) {
+      ElMessage.error("文件不能为空!");
+      throw "文件不能为空!";
+    }
+    if (!data.value.description) {
+      ElMessage.error("版本更新说明不能为空!");
+      throw "版本更新说明不能为空!";
+    }
+    const res = await addCameraVersion(data.value as any as CameraVersionType);
+    console.log("res", res);
+    ElMessage.success("添加成功!");
+  },
+});
+</script>
+
+<style scoped>
+.icon-style {
+  font-size: 20px;
+  line-height: 50px;
+}
+</style>

+ 74 - 0
src/view/cameraVersion/index.vue

@@ -0,0 +1,74 @@
+<template>
+  <com-head :options="headOptions" v-model="pageHook.pagging.state.query.type">
+    <el-form label-width="94px" inline>
+      <slot name="header" />
+      <el-form-item label="版本号">
+        <el-input placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item class="searh-btns" style="grid-area: 1 / 4 / 2 / 4">
+        <el-button type="primary" @click="pageHook.pagging.refresh"
+          >查询</el-button
+        >
+        <el-button type="primary" plain @click="pageHook.pagging.queryReset"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </com-head>
+
+  <div class="body-layer">
+    <div class="body-but">
+      <el-button type="primary" v-pdpath="'add'" @click="addHandler"
+        >新增</el-button
+      >
+    </div>
+    {{ pageHook }}
+    <el-table
+      :data="tableData"
+      tooltip-effect="dark"
+      style="width: 100%"
+      size="large"
+    >
+      <el-table-column label="版本号" prop="version"></el-table-column>
+      <el-table-column
+        label="版本更新说明"
+        prop="description"
+      ></el-table-column>
+      <el-table-column label="最低版本号" prop="minVersion"></el-table-column>
+      <el-table-column label="创建人" prop="deptLevelStr"></el-table-column>
+      <el-table-column label="创建时间" prop="createTime"></el-table-column>
+      <el-table-column label="状态" prop="status"></el-table-column>
+    </el-table>
+    <com-pagination
+      @size-change="pageHook.pagging.changPageSize"
+      @current-change="pageHook.pagging.changPageCurrent"
+      :current-page="pageHook.pagging.state.pag.currentPage"
+      :page-size="pageHook.pagging.state.pag.size"
+      :total="pageHook.pagging.state.pag.total"
+    />
+  </div>
+</template>
+<script lang="ts" setup>
+import { ref } from "vue";
+import comHead from "@/components/head/index.vue";
+import comPagination from "@/components/pagination/index.vue";
+import { useScenePaggingParams } from "./paging";
+import { CameraType } from "@/store/camera";
+import { addCameraVersion, editCameraVersion } from "./quisk";
+const tableData = ref();
+
+const headOptions = [
+  { value: CameraType.SWKJ, name: "双目转台" },
+  { value: CameraType.SWSS1, name: "激光转台" },
+  { value: CameraType.SWSS2, name: "激光移动" },
+];
+
+const pageHook = useScenePaggingParams();
+
+const addHandler = async () => {
+  (await addCameraVersion({ type: pageHook.pagging.state.query.type })) &&
+    pageHook.pagging.refresh();
+};
+
+
+</script>

+ 37 - 0
src/view/cameraVersion/paging.ts

@@ -0,0 +1,37 @@
+import { usePagging } from "@/hook/pagging";
+// import { SceneType, getScenePagging } from "@/store/scene";
+import { CameraType } from "@/store/camera";
+import { getCameraVersionList } from '@/store/cameraVersion'
+import { computed, reactive, watch, watchEffect } from "vue";
+
+export const useScenePaggingParams = () => {
+
+  const pagging = usePagging({
+    get: getCameraVersionList,
+    paramsTemlate: {
+      type: CameraType.SWKJ,
+      version: '',
+    },
+  });
+
+  watchEffect(() => {
+
+  });
+
+  watch(
+    () => pagging.state.query.type,
+    () => {
+      pagging.state.pag.currentPage = 1;
+    }
+  );
+
+  const queryResetRaw = pagging.queryReset;
+  pagging.queryReset = () => {
+    const type = pagging.state.query.type;
+    queryResetRaw();
+    pagging.state.query.type = type;
+  };
+
+  return reactive({ pagging });
+};
+export type ScenePagging = ReturnType<typeof useScenePaggingParams>["pagging"];

+ 11 - 0
src/view/cameraVersion/quisk.ts

@@ -0,0 +1,11 @@
+import { quiskMountFactory } from "@/helper/mount";
+import EditCameraVersion from "./edit.vue";
+
+export const editCameraVersion = quiskMountFactory(EditCameraVersion, {
+  title: "编辑固件",
+  width: 540,
+});
+export const addCameraVersion = quiskMountFactory(EditCameraVersion, {
+  title: "新增固件",
+  width: 540,
+});

+ 4 - 1
src/view/firmware/index.vue

@@ -1,5 +1,8 @@
 <template>
-  <com-head :options="headOptions" v-model="params.pagging.state.query.type">
+  <com-head
+    :options="[{ name: 'app管理', value: '1' }]"
+    class="app-head frame-head"
+  >
     <el-form label-width="94px" inline>
       <slot name="header" />
       <el-form-item label="版本号">

+ 1 - 0
src/view/firmware/paging.ts

@@ -28,6 +28,7 @@ export const useScenePaggingParams = () => {
   });
 
   let oldSnCode = pagging.state.query.snCode;
+
   watchEffect(() => {
     if (isSwmx.value) {
       oldSnCode = pagging.state.query.snCode;

+ 2 - 1
src/view/layout/slide/index.vue

@@ -24,7 +24,8 @@ import { FireRouteName } from "@/app/fire/routeConfig";
 const props = defineProps<{ names: string[] }>();
 
 const routes = getPermissionRoutes(props.names, [
-  RouteName.firmware,
+  RouteName.cameraVersion,
+  RouteName.cameraVersionApp,
   RouteName.setting,
   FireRouteName.recycle,
 ]);

+ 82 - 29
src/view/system/updatePsw.vue

@@ -6,41 +6,91 @@
     </div>
 
     <el-form-item label="手机号:" class="mandatory">
-      <el-input v-model="data.phone" placeholder="请输入手机号码" disabled></el-input>
+      <el-input
+        v-model="data.phone"
+        placeholder="请输入手机号码"
+        disabled
+      ></el-input>
     </el-form-item>
     <el-form-item label="旧密码:" class="mandatory">
-      <el-input v-model="data.code" placeholder="请输入">
-        <!-- <template v-slot:suffix>
-          <el-button
-            type="primary"
-            plain
-            class="input-inner-btn"
-            @click="sendCode"
-            :disabled="msgStatus && msgStatus.status !== CountdownStuts.never"
-          >
-            {{
-              msgStatus?.status === CountdownStuts.effective
-                ? `${msgStatus.miss}S后可重新发送`
-                : "获取验证码"
-            }}
-          </el-button>
-        </template> -->
+      <!-- <el-input v-model="data.oldPassword" placeholder="请输入旧密码"> </el-input> -->
+      <el-input
+        autocomplete="off"
+        readonly
+        onfocus="this.removeAttribute('readonly');"
+        v-model="data.oldPassword"
+        :type="addPassoldFlag ? 'text' : 'password'"
+        :maxlength="16"
+        placeholder="请输入旧密码"
+      >
+        <template #suffix>
+          <span @click="addPassoldFlag = !addPassoldFlag" style="cursor: pointer">
+            <el-icon v-if="addPassoldFlag">
+              <View />
+            </el-icon>
+            <el-icon v-else>
+              <Hide />
+            </el-icon>
+          </span>
+        </template>
       </el-input>
+
     </el-form-item>
     <el-form-item label="新密码:" class="mandatory">
-      <el-input
+      <!-- <el-input
         v-model="data.password"
         type="password"
         :maxlength="16"
         placeholder="请输入8-16位数字、英文大小写组合"
-      ></el-input>
+      >
+    </el-input> -->
+      <el-input
+        autocomplete="off"
+        readonly
+        onfocus="this.removeAttribute('readonly');"
+        v-model="data.password"
+        :type="addPassFlag ? 'text' : 'password'"
+        :maxlength="16"
+        placeholder="请输入8-16位数字、字母大小写组合"
+      >
+        <template #suffix>
+          <span @click="addPassFlag = !addPassFlag" style="cursor: pointer">
+            <el-icon v-if="addPassFlag">
+              <View />
+            </el-icon>
+            <el-icon v-else>
+              <Hide />
+            </el-icon>
+          </span>
+        </template>
+      </el-input>
     </el-form-item>
     <el-form-item label="密码确认:" class="mandatory">
-      <el-input
+      <!-- <el-input
         v-model="data.confimPsw"
         type="password"
         placeholder="请输入8-16位数字、英文大小写组合"
-      ></el-input>
+      ></el-input> -->
+      <el-input
+        autocomplete="off"
+        readonly
+        onfocus="this.removeAttribute('readonly');"
+        v-model="data.confimPsw"
+        :type="addPassPwFlag ? 'text' : 'password'"
+        :maxlength="16"
+        placeholder="请输入8-16位数字、字母大小写组合"
+      >
+        <template #suffix>
+          <span @click="addPassPwFlag = !addPassPwFlag" style="cursor: pointer">
+            <el-icon v-if="addPassPwFlag">
+              <View />
+            </el-icon>
+            <el-icon v-else>
+              <Hide />
+            </el-icon>
+          </span>
+        </template>
+      </el-input>
     </el-form-item>
   </el-form>
 </template>
@@ -58,13 +108,15 @@ import {
 import { ref, reactive } from "vue";
 import { PSW } from "@/constant/REG";
 import { QuiskExpose } from "@/helper/mount";
-
+const addPassoldFlag = ref(false);
+const addPassFlag = ref(false);
+const addPassPwFlag = ref(false);
 const data = ref({
   oldPassword: "",
   password: "",
   confimPsw: "",
   phone: user.value.info.userName,
-  code: "",
+  // code: "",
 });
 const msgStatus = ref<CountdownStore>();
 const sendCode = async () => {
@@ -81,17 +133,18 @@ defineExpose<QuiskExpose>({
       openErrorMsg(PSW.tip);
       throw PSW.tip;
     }
-    if (!data.value.code || !data.value.code.trim()) {
-      openErrorMsg("请输入验证码");
-      throw "请输入验证码";
-    }
+    // if (!data.value.code || !data.value.code.trim()) {
+    //   openErrorMsg("请输入验证码");
+    //   throw "请输入验证码";
+    // }
 
     await updatePassword({
       userName: data.value.phone,
-      code: data.value.code,
+      // code: data.value.code,
+      oldPassword: data.value.oldPassword,
       password: data.value.password,
     });
-    data.value.oldPassword = data.value.password = data.value.confimPsw = "";
+    // data.value.oldPassword = data.value.password = data.value.confimPsw = "";
   },
 });
 </script>

+ 56 - 15
src/view/user/index.vue

@@ -5,10 +5,16 @@
         <com-company v-model="state.query.deptId" />
       </el-form-item>
       <el-form-item label="用户账号:">
-        <el-input v-model="state.query.userName" placeholder="请输入手机号"></el-input>
+        <el-input
+          v-model="state.query.userName"
+          placeholder="请输入手机号"
+        ></el-input>
       </el-form-item>
       <el-form-item label="用户姓名:">
-        <el-input v-model="state.query.nickName" placeholder="请输入"></el-input>
+        <el-input
+          v-model="state.query.nickName"
+          placeholder="请输入"
+        ></el-input>
       </el-form-item>
       <el-form-item label="状态:">
         <el-select v-model="state.query.status" placeholder="全部">
@@ -27,7 +33,9 @@
 
   <div class="body-layer" style="padding-top: 8px">
     <div class="body-but">
-      <el-button type="primary" v-pdpath="'add'" @click="addHandler">新增用户</el-button>
+      <el-button type="primary" v-pdpath="'add'" @click="addHandler"
+        >新增用户</el-button
+      >
     </div>
 
     <el-table
@@ -41,7 +49,10 @@
           {{ state.pag.size * (state.pag.currentPage - 1) + $index + 1 }}
         </div>
       </el-table-column>
-      <el-table-column label="用户账号(手机号)" prop="userName"></el-table-column>
+      <el-table-column
+        label="用户账号(手机号)"
+        prop="userName"
+      ></el-table-column>
       <el-table-column label="用户姓名" prop="nickName"></el-table-column>
       <el-table-column label="所属架构" prop="deptName"></el-table-column>
       <el-table-column label="角色" prop="roleName"></el-table-column>
@@ -51,6 +62,12 @@
       <el-table-column label="操作" v-slot:default="{ row }">
         <span
           class="oper-span"
+          :class="{ disable: user.info.id == row.id }"
+          @click="resetHandler(row)"
+          >重置密码</span
+        >
+        <span
+          class="oper-span"
           v-pdpath="['edit']"
           :class="{ disable: row.type === 0 }"
           @click="editHandler(row)"
@@ -90,20 +107,28 @@ import { usePagging } from "@/hook/pagging";
 import comHead from "@/components/head/index.vue";
 import comCompany from "@/components/company-select/index.vue";
 import comPagination from "@/components/pagination/index.vue";
-import { UserInfo, changeUserStatus, delUser, getUserPagging, user } from "@/store/user";
-import { ElMessage } from "element-plus";
+import {
+  UserInfo,
+  changeUserStatus,
+  delUser,
+  getUserPagging,
+  user,
+  resetPassword,
+} from "@/store/user";
+import { ElMessage, ElMessageBox } from "element-plus";
 import { confirm } from "@/helper/message";
 import { addUser, editUser } from "./quisk";
 
-const { state, queryReset, refresh, changPageCurrent, changPageSize } = usePagging({
-  get: getUserPagging,
-  paramsTemlate: {
-    nickName: "",
-    status: "" as any,
-    deptId: "",
-    userName: "",
-  },
-});
+const { state, queryReset, refresh, changPageCurrent, changPageSize } =
+  usePagging({
+    get: getUserPagging,
+    paramsTemlate: {
+      nickName: "",
+      status: "" as any,
+      deptId: "",
+      userName: "",
+    },
+  });
 
 const delInfo = async (row: UserInfo) => {
   if (
@@ -121,6 +146,22 @@ const addHandler = async () => {
   (await addUser({})) && refresh();
 };
 
+const resetHandler = async (row: UserInfo) => {
+  await resetPassword({
+    userName: row.userName,
+  });
+
+  await ElMessageBox.confirm(
+    "当前用户密码已重置为 xj12345678用户可登录自行修改。",
+    "重置密码",
+    {
+      confirmButtonText: "确定",
+      cancelButtonText: "取消",
+      type: "warning",
+    }
+  );
+};
+
 const editHandler = async (row: UserInfo) => {
   if (!row.status) {
     return ElMessage.error("请先启用用户");

+ 4 - 2
vite.config.ts

@@ -45,12 +45,14 @@ export default defineConfig({
     host: "0.0.0.0",
     proxy: {
       "/api": {
-        target: dev ? "https://xj-mix3d.4dkankan.com" : "mix3d.4dkankan.com",
+        secure: false,
+        target: dev ? "https://192.168.0.25:14000" : "mix3d.4dkankan.com",
         changeOrigin: true,
         rewrite: (path) => path.replace(new RegExp(`^/api`), ""),
       },
       "/fusion-xj": {
-        target: dev ? "https://xj-mix3d.4dkankan.com" : "mix3d.4dkankan.com",
+        secure: false,
+        target: dev ? "https://192.168.0.25:14000" : "mix3d.4dkankan.com",
         changeOrigin: true,
         rewrite: (path) => path.replace(new RegExp(`^/api`), "/fusion-xj"),
       },