Browse Source

接入省域登录

songxy 3 tháng trước cách đây
mục cha
commit
a557eadd82

+ 1 - 0
ais_search_zj/web/public/config.js

@@ -17,6 +17,7 @@
 
     // server: 'https://zdzy.zrzyt.zj.gov.cn/aisKnowledge',
     server: '/server',
+    authServer: '/auth',
     policyServer: 'https://zjugpt.com/server',
     chatServer: '/chat',
     knowledgeServer: 'https://zdzy.zrzyt.zj.gov.cn/aiServer',

+ 73 - 3
ais_search_zj/web/src/App.vue

@@ -11,21 +11,91 @@
 <script setup>
 import { RouterView } from 'vue-router';
 import { onBeforeMount, ref } from 'vue';
+import http from "@/utils/auth-api";
 
 import zhCN from 'ant-design-vue/es/locale/zh_CN';
 import dayjs from 'dayjs';
+import { message } from 'ant-design-vue';
+import { useUserStore } from '@/stores';
+
 import 'dayjs/locale/zh-cn';
 dayjs.locale('zh-cn');
 
 const locale = ref(zhCN)
 
+const store = useUserStore();
 onBeforeMount(() => {
   document.title = window?.AppGlobalConfig?.system?.name || '';
-
-  console.log(useRouter().currentRoute.value.redirectedFrom);
 })
+const route = useRoute();
+const router = useRouter();
+const foundHandle = () => {
+  router.push({
+    name: '404'
+  })
+}
+const ticketStr = ref()
+const getUrlParamByToken = () => {
+  const routePath = route.path
+  if (routePath.indexOf('404') !== -1) { return }
+  var urlStr = window.location.href
+  var arr = urlStr.split('?')
+  if (arr.length === 1) {
+    foundHandle()
+    return
+  }
 
-
+  var paramStr = arr[1]
+  var paramArr = paramStr.split('&')
+  var paramMap = {}
+  paramArr.forEach(item => {
+    var arr = item.split('=')
+    paramMap[arr[0]] = arr[1]
+  })
+  if (paramMap["debugger"] == "1") {
+      return;
+  }
+  if (!paramMap.hasOwnProperty('sykjzlptv2_ticket')) {
+    foundHandle()
+    return
+  }
+  ticketStr.value = paramMap['sykjzlptv2_ticket']
+  const storeTicketStr = localStorage.getItem('_sykjzlptv2_ticket')
+  if (storeTicketStr) {
+    if (storeTicketStr === paramMap['sykjzlptv2_ticket']) {
+      return
+    }
+  }
+  localStorage.removeItem('sykjzlptv2_ticket')
+  getCommonToken()
+}
+const getCommonToken = async () => {
+  if (!ticketStr.value) { return }
+  const urlApi = `/auth/ticket`
+  var p = { ticket: ticketStr.value };
+  http.get(urlApi, p, this, false).then(async (result) => {
+    const resultData = result['data']
+    if (!resultData || resultData['error_code']) {
+      message.error('用户不合法,请核实用户信息!')
+      foundHandle()
+      return
+    }
+    if (resultData['error']) {
+      message.error(resultData['error'])
+      foundHandle()
+      return
+    }
+    if(resultData['syUser']){
+      const syUserObj = resultData["syUser"];
+      
+      store.updateUser({
+        syUser: syUserObj
+      })
+      localStorage.setItem("_sykjzlptv2_ticket", ticketStr.value);
+    }
+  });
+}
+getUrlParamByToken()
 </script>
 
 <style lang="scss" scoped>

BIN
ais_search_zj/web/src/assets/images/no_auth.png


+ 8 - 2
ais_search_zj/web/src/router/routes.js

@@ -28,7 +28,7 @@ export default [
             name: 'Document',
             meta: { title: 'ai文档' },
             component: () => import('@/views/document/index.vue'),
-          },
+          }
         ]
       },
       {
@@ -54,7 +54,13 @@ export default [
       //   name: 'register',
       //   meta: { title: '注册页面' },
       //   component: () => import('@/views/register/register.vue'),
-      // },
+      // },,
+      {
+        path: '404',
+        name: '404',
+        meta: { title: '404' },
+        component: () => import('@/views/404/index.vue'),
+      },
       {
         path: '/viewer',
         name: 'viewer',

+ 18 - 1
ais_search_zj/web/src/stores/user/user.js

@@ -7,11 +7,28 @@ export const useUserStore = defineStore('user', () => {
   const user = ref({
     username: '',
     displayName: '',
+    syUser: {
+      "Id": " ",
+      "UserName": "",
+      "Name": "",
+      "Account": "",
+      "OrganizationName": "",
+      "Xzqh": "",
+      "XzqhCode": null,
+      "OrganizationLine": "",
+      "Role": null,
+      "LastLoginTime": "",
+      "Job": null,
+      "EmployeeCode":"",
+      "OrganizationCode":null,
+      "NodesAuth": ""
+    }
   });
 
   const isLogin = ref(false);
 
-  function updateUser(_user) {
+  function updateUser (_user) {
+    console.log(_user)
     user.value = { ..._user };
   }
 

+ 218 - 0
ais_search_zj/web/src/utils/auth-api.js

@@ -0,0 +1,218 @@
+import axios from 'axios'
+
+const baseUrl=window.AppGlobalConfig.authServer
+
+axios.defaults.withCredentials = true
+
+/**
+ * 请求前拦截
+ * 添加加载进度条
+ */
+axios.interceptors.request.use(config => {
+  return config
+}, error => {
+  return Promise.reject(error)
+})
+
+/**
+ * 请求后拦截
+ *
+ */
+axios.interceptors.response.use(response => {
+  return response
+}, error => {
+  Promise.resolve(error.response)
+  if (!error.response) {
+    if (error.message == 'without token cancel request') { // token过期会取消请求
+      return {
+        status: 9002,
+        statusText: error.message
+      }
+    }
+    return {
+      status: 503,
+      statusText: error.message
+    }
+  }
+  return error.response
+})
+
+/**
+ * 检查状态
+ * 并对异常状态进行处理
+ * @param response
+ * @returns {*}
+ */
+function checkResponseStatus(response) {
+  if (response.status === 200 || response.status === 304) {
+    const data = response.data
+    data.status = 200
+    return data
+  }
+}
+
+/**
+ * 检查状态码
+ * @param res
+ * @returns {*}
+ */
+function checkResponseCode(res) {
+  if (!res) return null;
+  if (res.status !== 200) { // 网络请求存在问题
+  }
+  return res
+}
+/**
+ * 导出方法
+ */
+export default {
+  /**
+   * post请求
+   * @param url
+   * @param data
+   * @param vue vue 实例
+   * @param requireToken
+   * @returns {Promise<AxiosResponse<any>>}
+   */
+  post(url, data, vue, requireToken) {
+    return axios({
+      method: 'post',
+      url: url,
+      baseURL: baseUrl,
+      data: data,
+      timeout: 60000,
+      vue: vue,
+      requireToken: requireToken == null ? true : requireToken,
+      headers: {
+        'X-Requested-With': 'XMLHttpRequest',
+        'Content-Type': 'application/json; charset=UTF-8'
+      }
+    }).then(checkResponseStatus)
+      .then(checkResponseCode)
+  },
+  /**
+   * postJson请求
+   * @param url
+   * @param data
+   * @param vue vue 实例
+   * @param requireToken
+   * @returns {Promise<AxiosResponse<any>>}
+   */
+  postJson(url, data, vue, requireToken) {
+    return axios({
+      method: 'post',
+      url: url,
+      baseURL: baseUrl,
+      data: data,
+      timeout: 30000,
+      vue: vue,
+      requireToken: requireToken == null ? false : requireToken,
+      headers: {
+        'X-Requested-With': 'XMLHttpRequest',
+        'Content-Type': 'application/json; charset=UTF-8'
+      }
+    }).then(checkResponseStatus).then(checkResponseCode)
+  },
+
+
+  /**
+   * get请求
+   * @param url
+   * @param params
+   * @param vue vue 实例
+   * @param requireToken
+   * @returns {Promise<AxiosResponse<any>>}
+   */
+  get(url, params, vue, requireToken) {
+    return axios({
+      method: 'get',
+      url: url,
+      baseURL: baseUrl,
+      params: params,
+      timeout: 180000,
+      vue: vue,
+      requireToken: requireToken == null ? true : requireToken,
+      headers: {
+        'X-Requested-With': 'XMLHttpRequest'
+      }
+    }).then(checkResponseStatus)
+      .then(checkResponseCode)
+  },
+
+  /**
+   * post 下载文件
+   * @param url
+   * @param params
+   * @param vue
+   * @param requireToken
+   * @returns {AxiosPromise}
+   */
+  postDownLoadFile(url, data, vue, requireToken) {
+    return axios({
+      method: 'post',
+      url: url,
+      baseURL: baseUrl,
+      data: data,
+      timeout: 30000,
+      vue: vue,
+      requireToken: requireToken == null ? true : requireToken,
+      responseType: 'arraybuffer',
+      headers: {
+        'X-Requested-With': 'XMLHttpRequest',
+        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
+        'Content-Disposition': ''
+      }
+    }).then(checkResponseCode)
+  },
+
+  downLoadFile(url, data, title, vue, requireToken) {
+    return axios({
+      method: 'post',
+      url: url,
+      baseURL: baseUrl,
+      data: data,
+      timeout: 30000,
+      vue: vue,
+      requireToken: requireToken == null ? true : requireToken,
+      responseType: 'arraybuffer',
+      headers: {
+        'X-Requested-With': 'XMLHttpRequest',
+        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+      }
+    }).then(checkResponseCode)
+  },
+
+  /**
+   * 超长的post请求,一般用于请求arcgisserve等参数过长的post请求
+   * @param {*} url
+   * @param {*} data
+   * @param {*} vue
+   * @param {*} requireToken
+   * @returns
+   */
+  request(url, data, _headers) {
+    return axios({
+      method: 'post',
+      url: url,
+      data: data,
+      transformRequest: [
+        function (data) {
+          let ret = ''
+          for (const it in data) {
+            ret +=
+              encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
+          }
+          ret = ret.substring(0, ret.lastIndexOf('&'))
+          return ret
+        }
+      ],
+      headers: _headers || {
+        'Content-Type': 'application/x-www-form-urlencoded'
+      }
+    })
+      .then(checkResponseStatus)
+      .then(checkResponseCode)
+  }
+
+}
+

+ 22 - 0
ais_search_zj/web/src/views/404/index.vue

@@ -0,0 +1,22 @@
+
+
+<template>
+  <div class="no_auth_box">
+    <img src="../../assets/images/no_auth.png" />
+    <p>抱歉,您暂无当前页面的访问权限,请联系管理员</p>
+  </div>
+</template>
+
+<script setup>
+
+</script>
+
+<style lang="scss" scoped>
+.no_auth_box {
+  text-align: center;
+  >p {
+    color: #373C45;
+    font-size: 20px;
+  }
+}
+</style>

+ 4 - 4
ais_search_zj/web/src/views/document/FileUpload.vue

@@ -26,7 +26,7 @@
         <inbox-outlined></inbox-outlined>
       </p>
       <p class="ant-upload-text">点击上传或拖入文档</p>
-      <p class="ant-upload-hint">文档单个最大50MB;当前仅支持PDF格式</p>
+      <p class="ant-upload-hint">文档单个最大100MB;当前仅支持PDF格式</p>
     </a-upload-dragger>
   </a-modal>
 </template>
@@ -54,11 +54,11 @@ const loading = ref(false)
 // 文件上传部分
 const fileList = ref<any[]>([]);
 const handleUpload = async (file: any) => {
-  if(props.id === null) return;
+  if(props.pid === null) return;
   if(!file) return;
   const sizeNum = parseFloat((file.size / 1024 / 1024).toFixed(2))
-  if(sizeNum > 50){
-    message.error("上传文件不能大于50MB!");
+  if(sizeNum > 100){
+    message.error("上传文件不能大于100MB!");
     return;
   }
   const urlStr = '/ai/knowledge/file/create'

+ 0 - 1
ais_search_zj/web/src/views/document/Menus.vue

@@ -70,7 +70,6 @@ const toggleMenusHandle = (item) => {
 const onClickHandle = (type, payload) => {
   if(type === 'query'){
     toggleMenusHandle(payload)
-    if(payload['parentId'] === 0 && payload['id'] !== -1) return;
   }
   emits('menu-click', {
     type,

+ 1 - 0
ais_search_zj/web/src/views/document/index.vue

@@ -284,6 +284,7 @@ const columns = [
     title: "创建时间",
     dataIndex: "createTime",
     key: "createTime",
+    width: 160,
     align: "center",
   },
   {

+ 13 - 2
ais_search_zj/web/src/views/home/components/HomeHeader.vue

@@ -7,15 +7,21 @@
       </div>
       <div v-if="subTitle" class="sub_title">{{ subTitle }}</div>
     </div>
-    <div class="right user-panel" v-if="false">
-      <user-avatar />
+    <div class="right user-panel" v-if="syUser['Name']">
+      {{syUser['Name']}}
     </div>
   </div>
 </template>
 <script setup>
 import UserAvatar from '@/views/components/UserNewAvatar.vue';
 import { linkToHome } from '@/utils/external-links';
+import { useUserStore } from '@/stores';
+import { computed } from 'vue';
 
+const store = useUserStore();
+console.log("store---------------------------------")
+console.log(store.user)
+const syUser = computed(() => store.user.syUser);
 const systemTitle = ref(AppGlobalConfig.system.name)
 const props = defineProps({
   subTitle: {
@@ -77,6 +83,11 @@ const props = defineProps({
   .right {
     height: 100%;
     width: 180px;
+    color: #fff;
+    overflow: hidden;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
   }
 }
 </style>

+ 9 - 1
ais_search_zj/web/vite.config.js

@@ -41,11 +41,19 @@ export default defineConfig({
     cors: true,
     proxy: {
       '/server': {
-          target: 'http://localhost:9999/',
+        // target: 'http://localhost:9999/',
+          target: 'https://ai.zrzyt.zj.gov.cn/aisKnowledge',
           // target: 'https://zdzy.zrzyt.zj.gov.cn/aisKnowledge',
           changeOrigin: true,
           rewrite: function (path) { return path.replace(/^\/server/, ''); }
       },
+      '/auth': {
+        // target: 'http://localhost:9999/',
+          target: 'https://ai.zrzyt.zj.gov.cn/auth',
+          // target: 'https://zdzy.zrzyt.zj.gov.cn/aisKnowledge',
+          changeOrigin: true,
+          rewrite: function (path) { return path.replace(/^\/auth/, ''); }
+      },
       // '/server': {
       //   target: 'http://localhost:7501',
       //   changeOrigin: true,