y595705120 3 tahun lalu
induk
melakukan
ab2305c14d

+ 1 - 1
.env.development

@@ -2,4 +2,4 @@
 ENV = 'development'
 
 # base api
-VUE_APP_BASE_API = '/rental'
+VUE_APP_BASE_API = '/'

+ 1 - 1
.env.production

@@ -2,5 +2,5 @@
 ENV = 'production'
 
 # base api
-VUE_APP_BASE_API = '/rental'
+VUE_APP_BASE_API = '/'
 

+ 1 - 1
.env.staging

@@ -4,5 +4,5 @@ NODE_ENV = production
 ENV = 'staging'
 
 # base api
-VUE_APP_BASE_API = '/rental'
+VUE_APP_BASE_API = '/'
 

+ 26 - 34
src/api/article.js

@@ -1,41 +1,33 @@
-import request from '@/utils/request'
+import service from '@/utils/request'
 
-export function fetchList(query) {
-  return request({
-    url: '/vue-element-admin/article/list',
-    method: 'get',
-    params: query
-  })
+export const getArticalList = (data) => {
+    return service({
+        url: "/artical/getArticalList",
+        method: 'post',
+        data
+    })
 }
 
-export function fetchArticle(id) {
-  return request({
-    url: '/vue-element-admin/article/detail',
-    method: 'get',
-    params: { id }
-  })
+export const getHotArticalList = (data) => {
+    return service({
+        url: "/artical/getHotArticalList",
+        method: 'post',
+        data
+    })
 }
 
-export function fetchPv(pv) {
-  return request({
-    url: '/vue-element-admin/article/pv',
-    method: 'get',
-    params: { pv }
-  })
+export const addArtical = (data) => {
+    return service({
+        url: "/artical/addArtical",
+        method: 'post',
+        data
+    })
 }
 
-export function createArticle(data) {
-  return request({
-    url: '/vue-element-admin/article/create',
-    method: 'post',
-    data
-  })
-}
-
-export function updateArticle(data) {
-  return request({
-    url: '/vue-element-admin/article/update',
-    method: 'post',
-    data
-  })
-}
+export const getArticalInfo = (data) => {
+    return service({
+        url: "/artical/getArticalInfo",
+        method: 'post',
+        data
+    })
+}

+ 3 - 0
src/main.js

@@ -14,6 +14,7 @@ import 'normalize.css/normalize.css' // a modern alternative to CSS resets
 import './icons' // icon
 import './permission' // permission control
 import './utils/error-log' // error log
+import Bus from '@/utils/bus.js'
 
 import * as filters from './filters' // global filters
 
@@ -22,6 +23,8 @@ Vue.use(Element, {
   locale: enLang // 如果使用中文,无需设置,请删除
 })
 
+Vue.use(Bus)
+
 // register global utility filters
 Object.keys(filters).forEach(key => {
   Vue.filter(key, filters[key])

+ 7 - 9
src/pages/other/components/IHeader.vue

@@ -2,15 +2,13 @@
   <div>
     <div class="nav">
       <ul>
-        <li class=""><a href="/">网站首页</a></li>
-        <li><a href="/gkxx/">机构概况</a></li>
-        <li><a href="/xxgk/">信息公开</a></li>
-        <li><a href="/wsbs/">网上办事</a></li>
-        <li><a href="/zmhd/">政民互动</a></li>
-        <li><a href="/hygl/">行业管理</a></li>
-        <li><a href="/gzfw/">公众服务</a></li>
-        <li><a href="/ztzl/">专题专栏</a></li>
-        <li class="navfirst"><a href="/bzzx/">帮助中心</a></li>
+        <li ><a href="/">网站首页</a></li>
+        <li class="navfirst"><a href="/gkxx/">所有科室</a></li>
+        <li><a href="/xxgk/">公开资料</a></li>
+        <li><a href="/wsbs/">科室资料</a></li>
+        <li><a href="/wsbs/">个人资料</a></li>
+        <li><a href="/wsbs/">申请记录</a></li>
+        <li><a href="/wsbs/">收到资料</a></li>
       </ul>
     </div>
     <div class="sousuo">

+ 101 - 27
src/pages/other/file-manage.vue

@@ -51,69 +51,113 @@
             </el-autocomplete>
           </div>
         </div>
+
+
         <el-card class="box-card" v-if="!isShowMore">
           <div slot="header" class="clearfix">
-            <span>{{ selectDepartName }} 法律法规规定资料</span>
+            <span>{{ selectDepartName }} 法律法规资料</span>
             <el-button style="float: right; padding: 3px 0;color: #999;font-size: 12px;" type="text" @click="handleOpenMore(1)">更多></el-button>
           </div>
-          <div v-for="o in 4" :key="o" class="text item">
-            <div style="display: inline-block;width: 100%;">
-              <el-link target="_blank" download="下载文件名" :href="require('@/icons/img/logo-apple.png')" :underline="false">
-                <el-button class="fl" type="text">{{ selectDepartName + ' 文件名文件名' + o }}</el-button>
+          <div v-for="(o,index) in restaurants.laws" :key="o.id" class="text item">
+            <div style="display: inline-block;width: 100%;"  >
+              <el-link target="_blank" download="下载文件名"  :href="require('@/icons/img/logo-apple.png')" :underline="false">
+                <span class="oneline" >
+                    {{ (index+1)}} 、 {{o.title|filterTitle}}
+                </span>
               </el-link>
-              <span class="fr" style="color: #b4b4b4;">{{'2021-05-14 08:49:5' + o }}</span>
+
+              <!-- <span class="fr" style="color: #b4b4b4;">{{o.createAt }}</span> -->
+              <el-button @click="applyDoc()"> 申请材料 </el-button>
               <span style="clear: both;"></span>
             </div>
           </div>
         </el-card>
+
         <el-card class="box-card" v-if="!isShowMore">
           <div slot="header" class="clearfix">
-            <span>{{ selectDepartName }} 制度机制类资料</span>
+            <span>{{ selectDepartName }} 机制类资料</span>
             <el-button style="float: right; padding: 3px 0;color: #999;font-size: 12px;" type="text" @click="handleOpenMore(2)">更多></el-button>
           </div>
-          <div v-for="o in 4" :key="o" class="text item">
+          <div v-for="(o,index) in restaurants.mechanism" :key="o.id" class="text item">
             <div style="display: inline-block;width: 100%;">
-              <el-link target="_blank" download="下载文件名" :href="require('@/icons/img/logo-apple.png')" :underline="false">
-                <el-button class="fl" type="text">{{ selectDepartName + ' 文件名文件名' + o }}</el-button>
+              <el-link target="_blank" download="下载文件名"  :href="require('@/icons/img/logo-apple.png')" :underline="false">
+                <span class="oneline" >
+                    {{ (index+1)}} 、 {{o.title|filterTitle}}
+                </span>
               </el-link>
-              <span class="fr" style="color: #b4b4b4;">{{'2021-05-14 08:49:5' + o }}</span>
+
+              <span class="fr" style="color: #b4b4b4;">{{o.createAt }}</span>
               <span style="clear: both;"></span>
             </div>
           </div>
         </el-card>
+
+
         <el-card class="box-card" v-if="!isShowMore">
           <div slot="header" class="clearfix">
-            <span>{{ selectDepartName }} 基础性数据资料</span>
+            <span>{{ selectDepartName }} 成果类资料</span>
             <el-button style="float: right; padding: 3px 0;color: #999;font-size: 12px;" type="text" @click="handleOpenMore(3)">更多></el-button>
           </div>
-          <div v-for="o in 4" :key="o" class="text item">
+          <div v-for="(o,index) in restaurants.result" :key="o.id" class="text item">
             <div style="display: inline-block;width: 100%;">
-              <el-link target="_blank" download="下载文件名" :href="require('@/icons/img/logo-apple.png')" :underline="false">
-                <el-button class="fl" type="text">{{ selectDepartName + ' 文件名文件名' + o }}</el-button>
+              <el-link target="_blank" download="下载文件名"  :href="require('@/icons/img/logo-apple.png')" :underline="false">
+                <span class="oneline" >
+                    {{ (index+1)}} 、 {{o.title|filterTitle}}
+                </span>
               </el-link>
-              <span class="fr" style="color: #b4b4b4;">{{'2021-05-14 08:49:5' + o }}</span>
+              <span class="fr" style="color: #b4b4b4;">{{o.createAt }}</span>
               <span style="clear: both;"></span>
             </div>
           </div>
         </el-card>
+
+
+
+
         <el-card class="box-card" v-if="isShowMore">
           <div slot="header" class="clearfix">
-            <span>{{ selectDepartName }} 其他类</span>
-            <el-button style="float: right; padding: 3px 0;color: #999;font-size: 12px;" type="text" @click="handleCloseMore">返回</el-button>
+            <span>{{ selectDepartName }} 成果类资料</span>
           </div>
-          <div v-for="o in 20" :key="o" class="text item">
+          <div v-for="(o,index) in restaurants.result" :key="o.id" class="text item">
             <div style="display: inline-block;width: 100%;">
-              <el-link target="_blank" download="下载文件名" :href="require('@/icons/img/logo-apple.png')" :underline="false">
-                <el-button class="fl" type="text">{{ selectDepartName + ' 文件名文件名' + o }}</el-button>
+              <el-link target="_blank" :download="o.filename"  :href="'/'+o.filename" :underline="false">
+                <span class="oneline" >
+                    {{ (index+1)}} 、 {{o.title|filterTitle}}
+                </span>
               </el-link>
-              <span class="fr" style="color: #b4b4b4;">{{'2021-05-14 08:49:5' + o }}</span>
+              <span class="fr" style="color: #b4b4b4;">{{o.createAt }}</span>
               <span style="clear: both;"></span>
             </div>
           </div>
+
+          <el-pagination
+            :current-page="1"
+            :page-size="10"
+            :page-sizes="[10, 30, 50, 100]"
+            :style="{float:'right',padding:'20px'}"
+            :total="315"
+            layout="total, sizes, prev, pager, next, jumper"
+          ></el-pagination>
         </el-card>
       </div>
+
+
+
+
+
     </div>
+    <el-dialog title="申请材料" center :visible.sync="dialogFormVisible"  >
+      <h3> 本材料非公开,需要向对应科室申请</h3>
+      <div class="dialog-footer" slot="footer">
+        <el-button type="warning" size="medium" style="width: 100px; padding: 10px; margin: 20px;" @click="dialogFormVisible=false">取 消</el-button>
+        <el-button type="primary" size="medium" style="width: 100px; padding: 10px; margin: 20px;" @click="dialogFormVisible=false">确认申请</el-button>
+      </div>
+    </el-dialog>
+
     <IFooter />
+
+
+
   </div>
 </template>
 
@@ -122,6 +166,8 @@ import IHeader from "./components/IHeader";
 import IFooter from "./components/IFooter";
 import glIcon from '@/icons/img/2016smyjj_gl_icon.jpg'
 import data  from '../data/data.js'
+import {getHotArticalList,getArticalList}  from '@/api/article'
+
 export default {
   name: 'application',
   components: {
@@ -130,18 +176,29 @@ export default {
   },
   data() {
     return {
+      dialogFormVisible: false,
       glIcon: glIcon,
       list: data.departs,
       searchDepartId: "",
-      restaurants: [],
+      restaurants: {},
       state3: '',
       selectDepartId:1,
-      selectDepartName: '局办公室',
+      selectDepartName: '',
+      category:'',
       isShowMore: false
     }
   },
   mounted() {
-    this.restaurants = this.loadAll();
+    this.getHotArticalList();
+  },
+  filters:{
+    filterTitle(val){
+      if( val.length > 35) {
+        return val.substr(0,32)+"..."
+      }else{
+        return val
+      }
+    }
   },
   watch: {
     selectDepartId: function(newDepartId, oldDepartId) {
@@ -160,13 +217,23 @@ export default {
       // 调用 callback 返回建议列表的数据
       cb(results);
     },
+    applyDoc(){
+      this.dialogFormVisible = true
+    },
     createFilter(queryString) {
       return (restaurant) => {
         return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
       };
     },
-    loadAll() {
-      return data.filelist;
+    getHotArticalList() {
+      let param = {
+        "department": this.selectDepartName,
+        "category": this.category
+      }
+      getHotArticalList( param ).then( res=>{
+        this.restaurants = res.data
+        console.log("getHotArticalList", res)
+      })
     },
     querySearchAsync(queryString, cb) {
       var restaurants = this.restaurants;
@@ -248,4 +315,11 @@ export default {
     width: 200px;
     min-height: 400px;
   }
+
+  .oneline {
+    line-height: 30px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
 </style>

+ 3 - 2
src/store/modules/user.js

@@ -5,7 +5,7 @@ import { authDB } from '@/db'
 
 const state = {
   userInfo: {},
-  token: getToken(),
+  token: authDB.get('token'),
   name: '',
   avatar: '',
   introduction: '',
@@ -14,12 +14,13 @@ const state = {
 
 const mutations = {
   SET_INFO: (state, info) => {
-    const { uid } = info
+    const { uid, token } = info
     authDB.set('uid', uid)
     state.userInfo = info
   },
   SET_TOKEN: (state, token) => {
     setToken(token)
+    authDB.set('token', token)
     state.token = token
   },
   SET_INTRODUCTION: (state, introduction) => {

+ 18 - 0
src/utils/bus.js

@@ -0,0 +1,18 @@
+const install = (Vue) => {
+    const Bus = new Vue({
+        methods: {
+            emit(event, ...args) {
+                this.$emit(event, ...args)
+            },
+            on(event, cb) {
+                this.$on(event, cb)
+            },
+            off(event, cb) {
+                this.$off(event, cb)
+            }
+        },
+    })
+    Vue.prototype.$bus = Bus
+}
+
+export default install

+ 78 - 109
src/utils/request.js

@@ -1,124 +1,93 @@
-import store from '@/store'
-import axios from 'axios'
-import md5 from '@/utils/md5'
-import { MessageBox, Message, Notification } from 'element-ui'
-import { getToken } from '@/utils/auth'
+import axios from 'axios'; // 引入axios
+import { Message } from 'element-ui';
+import { store } from '@/store/index'
+import context from '@/main.js'
 import { authDB } from '@/db'
 
-function renderURL(method, data = {}) {
-  const isSign = method.indexOf('auth.') > -1
-  const version = '1.0'
-  const secret = '017c0743819088468e590246464cc75f';
-  // const uid = 0;
-  const uid = isSign ? '' : authDB.get('uid');
-  const token = isSign ? '' : getToken();
-  // const role = '';
-  const mtime = parseInt(Date.now() / 1000);
-  const body = JSON.stringify(data);
-  const sign = md5('rental_' + version + token + body + method + mtime + secret);
-  return {
-    url: `${method}?t=${mtime}&u=${uid}&v=${version}&s=${sign}`,
-    method: 'post',
-    data: body
-  }
-}
-
-// create an axios instance
 const service = axios.create({
-  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
-  // withCredentials: true, // send cookies when cross-domain requests
-  timeout: 5000 // request timeout
+    baseURL: process.env.VUE_APP_BASE_API,
+    timeout: 99999
 })
+let acitveAxios = 0
+// let timer
+// const showLoading = () => {
+//     acitveAxios++
+//     if (timer) {
+//         clearTimeout(timer)
+//     }
+//     timer = setTimeout(() => {
+//         if (acitveAxios > 0) {
+//             context.$bus.emit("showLoading")
+//         }
+//     }, 400);
+// }
 
-// request interceptor
+// const closeLoading = () => {
+//         acitveAxios--
+//         if (acitveAxios <= 0) {
+//             clearTimeout(timer)
+//             context.$bus.emit("closeLoading")
+//         }
+//     }
+    //http request 拦截器
 service.interceptors.request.use(
-  config => {
-    // do something before request is sent
-    if (store.getters.token) {
-      // let each request carry token
-      // ['X-Token'] is a custom headers key
-      // please modify it according to the actual situation
-      config.headers['X-Token'] = getToken()
-    }
-    const { url = '' } = config
-    let { data } = config
-
-    if (data && typeof data === 'string') {
-      data = JSON.parse(data)
+    config => {
+        // if (!config.donNotShowLoading) {
+        //     showLoading()
+        // }
+        config.data = JSON.stringify(config.data);
+        config.headers = {
+            'Content-Type': 'application/json',
+            'x-token': authDB.get('token'),
+            'x-user-id': authDB.get('uid')
+        }
+        return config;
+    },
+    error => {
+        // closeLoading()
+        Message({
+            duration:2000,
+            showClose: true,
+            message: error,
+            type: 'error'
+        })
+        return error;
     }
-    // const method = url.replace(baseURL, '')
+);
 
-    const obj = renderURL(url, data)
 
-    // if (process.env.NODE_ENV !== 'production') {
-    // }
-    return Object.assign({}, config, obj)
-  },
-  error => {
-    // do something with request error
-    console.log(error) // for debug
-    return Promise.reject(error)
-  }
-)
-
-// response interceptor
+//http response 拦截器
 service.interceptors.response.use(
-  /**
-   * If you want to get http information such as headers or status
-   * Please return  response => response
-  */
-
-  /**
-   * Determine the request status by custom code
-   * Here is just an example
-   * You can also judge the status by HTTP Status Code
-   */
-  response => {
-    const res = response.data
-    // if the custom code is not 20000, it is judged as an error.
-    if (res.code !== 200) {
-      Notification({
-        title: '失败',
-        message: res.msg || 'Error',
-        type: 'error',
-        duration: 2000
-      })
-
-      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
-      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
-        // to re-login
-        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
-          confirmButtonText: 'Re-Login',
-          cancelButtonText: 'Cancel',
-          type: 'warning'
-        }).then(() => {
-          store.dispatch('user/resetToken').then(() => {
-            location.reload()
-          })
-        })
-      }
-      return Promise.reject(new Error(res.message || 'Error'))
-    } else {
-      if(res.msg != '' && res.msg != '成功' && res.msg != 'success' && res.msg != 'Success'){
-        Notification({
-          title: 'Info',
-          message: res.msg || 'Duplicate name',
-          type: 'info',
-          duration: 3000
+    response => {
+        // closeLoading()
+        if (response.headers["new-token"]) {
+            store.commit('user/setToken', response.headers["new-token"])
+        }
+        if (response.data.code == 200 || response.headers.success === "true") {
+            return response.data
+        } else {
+            Message({
+                duration:2000,
+                showClose: true,
+                message: response.data.msg || decodeURI(response.headers.msg),
+                type: response.headers.msgtype||'error',
+            })
+            if (response.data.data && response.data.data.reload) {
+                store.commit('user/LoginOut')
+            }
+            return response.data.msg ? response.data : response
+        }
+    },
+    error => {
+        // closeLoading()
+        Message({
+          duration:2000,
+            showClose: true,
+            message: error,
+            type: 'error'
         })
-      }
-      return res.data
+        return error
     }
-  },
-  error => {
-    console.log('err' + error) // for debug
-    Message({
-      message: error.message,
-      type: 'error',
-      duration: 5 * 1000
-    })
-    return Promise.reject(error)
-  }
 )
 
 export default service

+ 3 - 3
vue.config.js

@@ -37,13 +37,13 @@ module.exports = {
       errors: true
     },
     proxy: {
-      '/rental': {
-        target: 'http://rental.nd98.vip:8888',
+      '/artical': {
+        target: 'http://localhost:8889',
         changeOrigin: true,
         // pathRewrite: { '^/rental': '' },
       },
       '/upload': {
-        target: 'http://rental.nd98.vip:8888',
+        target: 'http://localhost:8889',
         changeOrigin: true,
         // pathRewrite: { '^/rental': '' },
       }