Przeglądaj źródła

fix 应急资源

wenhongquan 3 lat temu
rodzic
commit
c8add67205

+ 40 - 4
src/App.tsx

@@ -1,16 +1,52 @@
-import { defineComponent } from 'vue';
+import { defineComponent, onMounted } from 'vue';
 import zhCN from 'element-plus/lib/locale/lang/zh-cn';
-import { RouterView } from 'vue-router';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+
 
 export default defineComponent({
   name: 'App',
   setup() {
     const locale = zhCN;
 
+    const route = useRoute();
+    const router = useRouter();
+
+    // console.log(route); // 第二步
+
+    // onMounted(() => {
+    //   console.log(route.query);
+    //   var islogin = false;
+    //   //判断url是否含有ticket
+    //   if (route.query.ticket != undefined && route.query.ticket != null) {
+    //     //存在ticket 根据ticket获取token 并保存清除ticket
+    //     api_gettokenByTicket((route.query.ticket as string) ?? '').then(
+    //       (res) => {
+    //         window.localStorage.setItem('userdata', JSON.stringify(res.data));
+    //         // let newQuery = JSON.parse(JSON.stringify(route.query)); // 深拷贝
+    //         // delete newQuery.ticket;
+    //         // router.replace({ query: newQuery });
+    //       },
+    //     );
+    //     //ticket 失效直接跳过
+    //   } else {
+    //     let userinfojson = window.localStorage.getItem('userdata');
+    //     if (userinfojson != undefined || userinfojson != null) {
+    //       islogin = true;
+    //     }
+    //     if (!islogin) {
+    //       // debugger;
+    //       // window.location.href = LOGIN_URL;
+    //     }
+    //   }
+    // });
+
     return () => (
-      <el-configProvider locale={locale}>
+      // <el-configProvider locale={locale}>
+      <div>
         <RouterView />
-      </el-configProvider>
+      </div>
+
+      //  </el-configProvider>
     );
   },
 });

+ 3 - 1
src/main.ts

@@ -6,4 +6,6 @@ import router from "./router";
 import "nprogress/nprogress.css";
 // import './styles/element/index.scss';
 import "./styles/global.scss";
-createApp(App).use(createPinia()).use(router).mount("#app");
+import Vant from 'vant';
+import 'vant/lib/index.css';
+createApp(App).use(createPinia()).use(Vant).use(router).mount('#app');

+ 36 - 0
src/router/index.ts

@@ -5,6 +5,8 @@ import {
   RouteLocation,
   RouteRecordRaw,
 } from 'vue-router';
+import { LOGIN_URL } from '@/utils/constant';
+import { api_gettokenByTicket } from '@/service/login';
 import NProgress from 'nprogress';
 
 const BaseLayout = () =>
@@ -36,6 +38,10 @@ const routes: RouteRecordRaw[] = [
         path: '/status/:status/report',
         component: () => import('@/views/IncidentManagementReport'),
       },
+      {
+        path: '/warehouse/detail',
+        component: () => import('@/views/Warehouse/index.vue'),
+      },
     ],
   },
   {
@@ -44,6 +50,7 @@ const routes: RouteRecordRaw[] = [
     meta: { title: '页面不见啦.' },
     component: () => import(/* webpackChunkName: "404" */ '@/views/About'),
   },
+
   {
     path: '/:pathMatch(.*)*',
     name: 'All',
@@ -72,6 +79,35 @@ router.afterEach((to) => {
   document!.title = to.meta.title
     ? to?.meta?.title + ' - 交通运输应急指挥系统'
     : '交通运输应急指挥系统';
+  console.log(router.currentRoute.value.query);
+
+
+  var route = router.currentRoute.value;
+  var islogin = false;
+    //判断url是否含有ticket
+  if (route.query.ticket != undefined && route.query.ticket != null) {
+    //存在ticket 根据ticket获取token 并保存清除ticket
+    api_gettokenByTicket((route.query.ticket as string) ?? '').then(
+      (res) => {
+         console.log(res);
+        window.localStorage.setItem('userdata', JSON.stringify(res.data));
+        let newQuery = JSON.parse(JSON.stringify(route.query)); // 深拷贝
+        delete newQuery.ticket;
+        router.replace({ query: newQuery });
+        setTimeout(() => { 
+          location.reload();
+        },1000)
+      }
+    );
+  } else {
+    let userinfojson = window.localStorage.getItem('userdata');
+    if (userinfojson != undefined || userinfojson != null) {
+      islogin = true;
+    }
+    if (!islogin) {
+      window.location.href = LOGIN_URL;
+    }
+  }
 });
 
 export default router;

+ 23 - 0
src/service/login.ts

@@ -0,0 +1,23 @@
+import request from "@/utils/request";
+import { BASE_USER_URL } from "@/utils/constant";
+
+
+
+export const api_gettokenByTicket = (ticket:string) => { 
+   return request<Object>('GET', {
+     url: `${BASE_USER_URL}/user?ticket=${ticket}`
+   });
+}
+
+
+  
+function docheck() { 
+  var token = localStorage.getItem("token");
+  if (token == null || token == undefined || token == "undefined") {
+    if (window.location.href.indexOf("login") == -1) {
+
+    }
+    return false;
+  }
+  return true;
+}

+ 30 - 0
src/service/warehouse.ts

@@ -0,0 +1,30 @@
+import request from "@/utils/request";
+import { BASE_USER_URL } from "@/utils/constant";
+
+
+
+export const api_getresource = (parmares:object) => { 
+   return request<Object>('GET', {
+     url: `/zhdd/resource/list`,
+     params: parmares,
+   });
+}
+
+
+export const api_getresourcedetail = (id: number) => {
+  return request<Object>('GET', {
+    url: `zhdd/resource/${id}`
+  });
+};
+
+export const api_putresource = (parmares:object) => {
+  return request<Object>('PUT', {
+    url: `/zhdd/resource`,
+    data: parmares,
+  });
+};
+
+
+
+
+

+ 4 - 0
src/utils/constant.ts

@@ -0,0 +1,4 @@
+export const BASE_URL = "http://61.147.254.211:30876/YJZH-SQ/api";
+export const BASE_USER_URL = 'http://61.147.254.211:30876/tpbd-cas';
+export const BASE_RESOURCE_URL = BASE_URL + '/common/download/resource?resource=';
+export const LOGIN_URL = 'http://61.147.254.211:9999/home/#/login';

+ 21 - 3
src/utils/request.ts

@@ -2,11 +2,13 @@ import axios, { AxiosRequestConfig } from 'axios';
 import qs from 'querystring';
 import { ElMessage } from 'element-plus';
 import useMainStore from '@/store/useMainStore';
+import {  LOGIN_URL,BASE_URL} from "@/utils/constant"
+import { indexOf } from 'lodash';
 
 const baseURL =
   process.env.NODE_ENV === 'production'
     ? // ? 'http://api.xt.wenhq.top:8083/mock/43/zhdd'
-      'http://sqpcbg.xt.wenhq.top:8083/api'
+      BASE_URL
     : '/api';
 
 const CancelToken = axios.CancelToken;
@@ -31,6 +33,10 @@ axios.interceptors.response.use(
           // message: `401. 没有权限访问该接口: ${res.config.url}`,
           message: `401. 没有权限访问该接口`,
         });
+        if (res.data.data.indexOf('Jwt expired') != -1) {
+          window.localStorage.removeItem('userdata');
+          window.location.href = LOGIN_URL;
+        }
         throw Error(res.statusText);
       }
       if (res.data?.code === 404) {
@@ -38,7 +44,13 @@ axios.interceptors.response.use(
         throw Error(res.statusText);
       }
       if (res.data?.code >= 500) {
-        ElMessage.error({ message: res.data?.msg ?? '系统异常, 请稍后重试!' });
+        if (res.data?.message == 'invalid ticket') {
+          window.localStorage.removeItem('userdata');
+          window.location.href = LOGIN_URL;
+        }
+          ElMessage.error({
+            message: res.data?.msg ?? '系统异常, 请稍后重试!',
+          });
         throw Error(res.statusText);
       }
     }
@@ -46,6 +58,7 @@ axios.interceptors.response.use(
       ElMessage.error({
         message: `401. 没有权限访问该接口: ${res.config.url}`,
       });
+      
       throw Error(res.statusText);
     }
     if (res.status === 404) {
@@ -68,14 +81,19 @@ export default function request<T>(
   method: AxiosRequestConfig['method'] = 'GET',
   confifg: AxiosRequestConfig & {},
 ): Promise<T> {
+  var tokenkjson = window.localStorage.getItem('userdata');
+  tokenkjson = tokenkjson == null ? "{}" : tokenkjson;
+  tokenkjson = tokenkjson == undefined ? "{}" : tokenkjson;
+  tokenkjson = JSON.parse(tokenkjson);
   return axios.request({
     method,
     baseURL,
     ...confifg,
     headers: {
       Accept: 'application/json',
+      AppId: '3bcb760743ea456faba29a1dfb247bf4',
+      Authorization: 'Bearer ' + (tokenkjson["accessToken"]),
       'Content-Type': 'application/json',
-      Authorization: 'asdd',
       ...confifg.headers,
     },
   });

+ 10 - 3
src/views/IncidentManagementReport/index.tsx

@@ -78,20 +78,27 @@ export default defineComponent({
       });
     };
 
-    const handleSaveReport = () => {
+    const handleSaveReport = async () => {
       const { id } = route.query;
 
-      const saveFn = id ? store.putIncidentItem : store.postIncidentItem;
+       const saveFn = id ? store.putIncidentItem : store.postIncidentItem;
       // console.log(formRef);
 
-      const result = saveFn({
+       const result = await saveFn({
         ...form.value,
         level: Number(form.value.level) ?? null,
         type: Number(form.value.type) ?? null,
         pic: imagessrclist.map((i: UploadData) => i.url).join(','),
         video: videosrclist.map((i: UploadData) => i.url).join(','),
+        source: '1',
         // status: route.params.status as unknown as number,
       });
+      if (result) { 
+        router.push("/")
+      }
+
+
+
 
     };
 

+ 232 - 0
src/views/Warehouse/index.vue

@@ -0,0 +1,232 @@
+<template>
+  <div>
+    <van-nav-bar title="应急仓库" left-arrow placeholder :fixed="true" >
+      <template #right>
+        <van-icon name="edit" size="18"  @click="editclick"/>
+      </template>
+    </van-nav-bar>
+    <div v-if="!isempt">
+      <div class="content">
+        <div>
+          <van-cell-group>
+            <van-field
+              v-model="whdata.value.name"
+              label="仓库命名"
+              input-align="right"
+              :readonly="isedit"
+              placeholder="请输入仓库命名"
+            />
+            <van-field
+              v-model="whdata.value.manageUnit"
+              label="管理单位"
+              input-align="right"
+               :readonly="isedit"
+              placeholder="请输入管理单位"
+            />
+            <van-field
+              v-model="whdata.value.contactName"
+              required
+               :readonly="isedit"
+              label="联系人"
+              input-align="right"
+              placeholder="请输入联系人"
+            />
+            <van-field
+              v-model="whdata.value.contactPhone"
+              required
+              label="联系方式"
+               :readonly="isedit"
+              input-align="right"
+              placeholder="请输入联系方式"
+            />
+          </van-cell-group>
+        </div>
+
+        <div v-for="(item, index) in wzdata.aar" v-bind:key="index">
+          <div class="cell-header">
+            <span>应急物资({{ index + 1 }})</span>
+            <div style="float: right" @click="deletewz(index)">删除</div>
+          </div>
+          <van-cell-group style="">
+            <van-field
+              v-model="item.name"
+              label="名称"
+              input-align="right"
+              placeholder="请输入名称"
+            />
+            <van-field
+              v-model="item.model"
+              label="型号"
+              input-align="right"
+              placeholder="请输入型号"
+            />
+            <van-field
+              v-model="item.size"
+              label="规格"
+              input-align="right"
+              placeholder="请输入规格"
+            />
+            <van-field
+              v-model="item.num"
+              label="仓储数量"
+              type="number"
+              input-align="right"
+              placeholder="请输入数量"
+            />
+            <van-field
+              v-model="item.availableNum"
+              label="可用数量"
+              type="number"
+              input-align="right"
+              placeholder="请输入数量"
+            />
+            <van-field
+              v-model="item.unit"
+              label="单位"
+              input-align="right"
+              placeholder="请输入单位"
+            />
+          </van-cell-group>
+        </div>
+      </div>
+      <div style="text-align: center">
+        <van-button
+          @click="doaddwzClick"
+          icon="plus"
+          style="color: #0b33a8; background: rgba(0, 0, 0, 0); border: none"
+          >新增物资</van-button
+        >
+      </div>
+
+      <div style="padding: 10px 20px">
+        <van-button type="primary" block style="border-radius: 30px" @click="dosavedata">提交</van-button>
+      </div>
+    </div>
+    <div><van-empty v-if="isempt" description="无仓库" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive,onUpdated } from "vue";
+import { api_getresource,api_getresourcedetail,api_putresource} from "@/service/warehouse"
+import { Toast } from 'vant';
+
+const whdata = reactive({value:{ name: "",manageUnit:"",contactName:"",contactPhone:"" }});
+const isedit = ref(true);
+const isempt = ref(true);
+// let  deletwzarr = [];
+const wzdata = reactive({aar:[
+]});
+
+const doaddwzClick = () => {
+  var wz = {
+    name: "",
+    model: "",
+    size: "",
+    num: 0,
+    unit: "",
+    availableNum: "",
+  };
+  wzdata.aar.push(wz);
+};
+const editclick=()=>{
+    isedit.value = false;
+}
+const deletewz = (index)=>{
+   if(index>=wzdata.aar.length){
+       return;
+   }
+  wzdata.aar.splice(index,1);
+  //  if(wz.id!=0){
+  //    deletwzarr.push(wz.id);
+  //  }
+}
+
+const dosavedata = ()=>{
+   Toast.loading({
+  message: '加载中...',
+   duration: 0,
+  forbidClick: true,
+});
+  var data = whdata.value;
+  data["resourceDetailList"] = wzdata.aar;
+  api_putresource(data).then(()=>{
+    Toast.clear();
+    Toast("保存成功")
+    getdata()
+
+  }).catch((ee)=>{Toast.clear();});
+}
+
+const getdata = ()=>{
+  Toast.loading({
+  message: '加载中...',
+   duration: 0,
+  forbidClick: true,
+});
+api_getresource({}).then((res)=>{
+    Toast.clear();
+  if(res.rows.length>0){
+    isempt.value=false;
+    whdata.value = res.rows.find(i=>i.id=="1481549762984415233")
+    // whdata.value = (res.rows[0]) ;
+    api_getresourcedetail(whdata.value.id).then((res1)=>{
+      if(res1.data.resourceDetailList == null || res1.data.resourceDetailList.length==0){
+        // debugger
+         Toast('仓库还没有物资,请添加物资!');
+      }else{
+        wzdata.aar = res1.data.resourceDetailList;
+        // console.log(whdata)
+      }
+
+    })
+
+
+  }else{
+    Toast('未获取到仓库信息,请联系管理员!');
+
+  }
+
+
+    }).catch((eer)=>{  Toast.clear();})
+}
+getdata();
+
+
+// onUpdated(()=>{
+//     //根据管理单位获取仓库信息
+//     api_getresource({}).then((res)=>{
+
+//     })
+
+// });
+
+
+
+
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+  font-size: 15px;
+  font-family: PingFangSC, PingFangSC-Regular;
+  color: #333333;
+}
+.content {
+  .cell-header {
+    font-family: PingFangSC, PingFangSC-Regular;
+    font-weight: 400;
+    line-height: 42px;
+    padding: 0px 15px;
+    span {
+      font-size: 12px;
+    }
+    div {
+      font-size: 14px;
+      color: #0b33a8;
+    }
+  }
+}
+</style>

+ 4 - 3
vite.config.ts

@@ -6,7 +6,7 @@ import svgLoader from "vite-svg-loader";
 import Components from "unplugin-vue-components/vite";
 import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
 import ElementPlus from "unplugin-element-plus/vite";
-
+import {  LOGIN_URL,BASE_URL} from "./src/utils/constant"
 import styleImport from "vite-plugin-style-import";
 /**
  * @type {import('vite').UserConfig}
@@ -25,9 +25,10 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
       force: true,
       proxy: {
         "/api": {
-          target: "http://sqpcbg.xt.wenhq.top:8083/",
+          // target: "http://sqpcbg.xt.wenhq.top:8083/",
+          target:BASE_URL,
           changeOrigin: true,
-          // rewrite: (path) => path.replace(/^\/api/, ''),
+          rewrite: (path) => path.replace(/^\/api/, ''),
         },
       },
     },