rk
2025-09-22 f34f5322ffa898b42ce4467af9916c9e73deb4f9
Merge remote-tracking branch 'origin/master'
已添加3个文件
已修改15个文件
832 ■■■■ 文件已修改
frontWuhu/.env.development 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/api/business/applicationInfo.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/api/business/serverProvider.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/assets/images/bg_yingyong.png 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/Protocol.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/business/OperaApplicationInfoWindow.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/business/OperaDetailsAWindow.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/business/OperaDetailsBWindow.vue 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/business/OperaServerProviderWindow.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/components/common/RichEditor.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/utils/request.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/business/appHall.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/business/applicationInfo.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/business/demandRecord.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/business/serverProvider.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/business/serviceProviderResources.vue 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/src/views/system/menu.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
frontWuhu/.env.development
@@ -8,7 +8,8 @@
# VVUE_APP_API_BASE_URL='http://192.168.0.102:10031'
# ä»»åº·æœ¬åœ°
VUE_APP_API_BASE_URL='http://192.168.1.54:10031'
# VUE_APP_API_BASE_URL='http://192.168.1.54:10031'
VUE_APP_API_BASE_URL = 'http://wuhu.dtkey.cn/hfznzzzd'
#焦松本地
# VUE_APP_API_BASE_URL='http://192.168.0.36:10011'
frontWuhu/src/api/business/applicationInfo.js
@@ -34,3 +34,9 @@
export function deleteById (id) {
  return request.get(`/business/applicationInfo/delete/${id}`)
}
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/business/applicationInfo/${id}`)
}
frontWuhu/src/api/business/serverProvider.js
@@ -35,4 +35,7 @@
  return request.get(`/business/serverProvider/delete/${id}`)
}
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/business/serverProvider/${id}`)
}
frontWuhu/src/assets/images/bg_yingyong.png
frontWuhu/src/components/Protocol.vue
@@ -47,7 +47,11 @@
    open(title, target) {
      this.title = title
      this.visible = true
      this.getProtocl()
      if (target) {
        this.content = target
      } else {
        this.getProtocl()
      }
    },
    getProtocl() {
      companyUserRules()
@@ -59,7 +63,7 @@
          this.$message.error(e)
        })
    },
  },
}
</script>
frontWuhu/src/components/business/OperaApplicationInfoWindow.vue
@@ -29,7 +29,7 @@
        <el-input type="textarea" :autosize="{ minRows: 12, maxRows: 6 }" v-model="form.introduction" placeholder="请输入应用简介" v-trim/>
      </el-form-item>
      <el-form-item label="应用详情" prop="details">
        <el-input v-model="form.details" placeholder="请输入应用详情" v-trim/>
        <RichEditor :content="{ content: form.details }" @edit="form.details = $event" :max-length="0" />
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -40,10 +40,11 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/business/serverProvider'
import RichEditor from '@/components/common/RichEditor'
export default {
  name: 'OperaApplicationInfoWindow',
  extends: BaseOpera,
  components: { GlobalWindow, UploadAvatarImage },
  components: { GlobalWindow, UploadAvatarImage, RichEditor },
  data () {
    return {
      // è¡¨å•数据
@@ -92,6 +93,8 @@
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.file.imgurl = ''
        this.file.imgurlfull = ''
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
@@ -103,6 +106,9 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        setTimeout(() => {
          this.form.details = target.details
        }, 500)
        this.file.imgurl = target.logo
        this.file.imgurlfull = target.fullLog
      })
frontWuhu/src/components/business/OperaDetailsAWindow.vue
@@ -3,18 +3,36 @@
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
    :withFooter="false"
  >
    <div class="com">
    <div class="com" v-if="info">
      <div class="com_image">
        <img src="../../assets/images/zhuce_ic_qiye@2x.png" />
        <img :src="info.fullLog" />
      </div>
      <div class="com_info">
        <div class="com_info_title">大唐融合物联科技无锡有限公司</div>
        <div class="com_info_title">{{info.name}}</div>
        <div class="com_info_list">
          <div class="com_info_list_item">
            <div class="com_info_list_item_label">行业类别:</div>
            <div class="com_info_list_item_val">电子产品及软件</div>
            <div class="com_info_list_item_val">{{info.industryName}}</div>
          </div>
          <div class="com_info_list_item">
            <div class="com_info_list_item_label">服务商星级:</div>
            <div class="com_info_list_item_val">
              <el-rate v-model="info.starLevel" :colors="['#FF934D','#FF934D','#FF934D']" disabled text-color="#ff9900"></el-rate>
            </div>
          </div>
          <div class="com_info_list_item">
            <div class="com_info_list_item_label">联系人:</div>
            <div class="com_info_list_item_val">{{info.linkName}}</div>
          </div>
          <div class="com_info_list_item">
            <div class="com_info_list_item_label">联系方式:</div>
            <div class="com_info_list_item_val">{{info.linkPhone}}</div>
          </div>
          <div class="com_info_list_item">
            <div class="com_info_list_item_label">企业介绍:</div>
            <div class="com_info_list_item_val">{{info.introduction}}</div>
          </div>
        </div>
      </div>
@@ -25,20 +43,24 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getById } from '@/api/business/serverProvider'
export default {
  name: 'OperaDemandRecordWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      form: {}
      value: 4,
      info: null
    }
  },
  created () {
    this.config({
      api: '/business/demandRecord',
      'field.id': 'id'
    })
  methods: {
    async open (title, id) {
      this.title = title
      this.info = await getById(id)
      this.visible = true
    }
  }
}
</script>
@@ -53,6 +75,13 @@
      flex-shrink: 0;
      background: #F4F7FC;
      margin-right: 30px;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
      img {
        width: 100%;
      }
    }
    .com_info {
      flex: 1;
@@ -62,6 +91,7 @@
        font-weight: 600;
        font-size: 26px;
        color: #222222;
        margin-bottom: 20px;
      }
      .com_info_list {
        display: flex;
@@ -69,12 +99,18 @@
        .com_info_list_item {
          width: 100%;
          display: flex;
          align-items: center;
          margin-bottom: 30px;
          .com_info_list_item_label {
            font-weight: 400;
            font-size: 16px;
            color: #666666;
            flex-shrink: 0;
          }
          .com_info_list_item_val {
            flex: 1;
            font-weight: 400;
            font-size: 16px;
            color: #333333;
          }
        }
      }
frontWuhu/src/components/business/OperaDetailsBWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,199 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    :withFooter="false"
  >
    <div class="com" v-if="info">
      <div class="com_image">
        <img :src="info.fullLog" />
      </div>
      <div class="com_info">
        <div class="com_info_title">{{info.name}}</div>
        <div class="list_item_cate">
          <div class="list_item_cate_row" v-for="(item, index) in info.lablesList" :key="index">{{item}}</div>
        </div>
        <div class="com_info_text1">服务商:{{info.serverName}}</div>
        <div class="com_info_text">{{info.introduction}}</div>
        <div class="com_info_btn" @click="openT" v-if="[1, 2].includes(userInfo.type)">联系我们</div>
        <div class="com_info_x"></div>
        <div class="com_info_content" v-html="info.details"></div>
      </div>
      <el-dialog
        title="联系我们"
        :destroy-on-close="true"
        :visible.sync="show"
        :close-on-click-modal="false"
        :modal-append-to-body="false"
        width="500px">
        <el-form :model="formData" label-position="right" :rules="rules" ref="ruleForm">
          <el-form-item label="联系人" prop="name">
            <el-input v-model="formData.name"></el-input>
          </el-form-item>
          <el-form-item label="联系电话" prop="phone">
            <el-input type="number" v-model="formData.phone" maxlength="11"></el-input>
          </el-form-item>
          <el-form-item label="简要描述" prop="description">
            <el-input v-model="formData.description"></el-input>
          </el-form-item>
        </el-form>
        <span slot="footer" class="dialog-footer">
          <el-button @click="show = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="submit">ç¡® å®š</el-button>
        </span>
      </el-dialog>
    </div>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getById } from '@/api/business/applicationInfo'
import { create } from '@/api/business/demandRecord'
import { mapState } from 'vuex'
export default {
  name: 'OperaDemandRecordWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  computed: {
    ...mapState(['userInfo'])
  },
  data () {
    return {
      form: {},
      formData: {
        name: '',
        phone: '',
        description: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入', trigger: 'blur' }
        ],
        phone: [
          { required: true, message: '请输入', trigger: 'blur' }
        ]
      },
      show: false,
      info: null
    }
  },
  methods: {
    async open (title, id) {
      this.title = title
      this.info = await getById(id)
      this.info.lablesList = this.info.lables.split(',') || []
      this.visible = true
    },
    openT() {
      this.formData.name = ''
      this.formData.phone = ''
      this.formData.description = ''
      this.show = true
    },
    submit() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          create({
            applicationId: this.info.id,
            linkName: this.formData.name,
            linkPhone: this.formData.phone,
            details: this.formData.description
          }).then(res => {
            this.$message.success('提交成功!')
            this.show = false
          })
        } else {
          return false;
        }
      });
    }
  }
}
</script>
<style lang="scss" scoped>
  .com {
    width: 100%;
    display: flex;
    .com_image {
      width: 140px;
      height: 140px;
      flex-shrink: 0;
      background: #F4F7FC;
      margin-right: 30px;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
      img {
        width: 100%;
      }
    }
    .com_info {
      flex: 1;
      display: flex;
      flex-direction: column;
      .com_info_title {
        font-weight: 600;
        font-size: 26px;
        color: #222222;
      }
      .com_info_text1 {
        font-weight: 400;
        font-size: 13px;
        color: #666666;
        margin-top: 15px;
      }
      .com_info_text {
        font-weight: 400;
        font-size: 16px;
        color: #666666;
        margin-top: 15px;
      }
      .com_info_btn {
        width: 96px;
        height: 36px;
        line-height: 36px;
        text-align: center;
        font-weight: 400;
        font-size: 14px;
        color: #FFFFFF;
        background: #216EEE;
        border-radius: 2px;
        cursor: pointer;
        margin-top: 15px;
      }
      .com_info_x {
        width: 100%;
        height: 1px;
        margin: 20px 0;
        background-color: #DFE2E8;
      }
      .com_info_content {
        width: 100%;
      }
      .list_item_cate {
        width: 100%;
        display: flex;
        align-items: center;
        margin-top: 12px;
        .list_item_cate_row {
          padding: 5px 8px;
          box-sizing: border-box;
          background: rgba(33,110,238,0.1);
          border-radius: 2px;
          font-weight: 400;
          font-size: 12px;
          color: #216EEE;
          margin-right: 10px;
          &:last-child {
            margin-right: 0 !important;
          }
        }
      }
    }
  }
</style>
frontWuhu/src/components/business/OperaServerProviderWindow.vue
@@ -105,6 +105,8 @@
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.file.imgurlfull = ''
        this.file.imgurl = ''
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
frontWuhu/src/components/common/RichEditor.vue
@@ -16,7 +16,7 @@
    />
  </div>
</template>
<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
export default {
@@ -129,7 +129,7 @@
              console.log(`${file.name} ä¸Šä¼ å‡ºé”™`, err, res)
            },
          },
        }
      },
      mode: 'default', // or 'simple'
@@ -145,19 +145,20 @@
      this.editor = Object.seal(editor)
    },
    onChange (editor) {
      console.log('editor', editor)
      // debugger
      this.$emit('edit', this.content.content)
      // this.value = this.html
      // console.log(this.content);
    },
    // onBlur (editor) {
    //   console.log('onBlur', editor)
    //   this.$emit('edit', this.html)
    // },
  },
}
</script>
<style src="@wangeditor/editor/dist/css/style.css"></style>
<style src="@wangeditor/editor/dist/css/style.css"></style>
frontWuhu/src/router/index.js
@@ -67,7 +67,7 @@
router.beforeEach((to, from, next) => {
  if (to.path === '/business/screen') {
    // window.open('http://localhost:8080/#/maturity')
    window.open('http://106.14.20.42/screen/#/maturity')
    window.open(process.env.VUE_APP_SCREENURL2)
    next({ name: from.name })
    return
  }
frontWuhu/src/utils/request.js
@@ -3,6 +3,7 @@
import pkg from '../../package'
import { trim } from './util'
import cache from '../plugins/cache'
import { Message } from 'element-ui'
axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8'
const axiosInstance = axios.create({
@@ -64,6 +65,7 @@
  }
  // ä¸šåŠ¡å¤±è´¥
  if (!response.data.success) {
    Message.error(response.data.message)
    return Promise.reject(response.data)
  }
  return response.data.data
frontWuhu/src/views/business/appHall.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
<template>
    <div class="box">
        <div class="box_head">
            <div class="box_head_title">应用大厅</div>
            <div class="box_head_info">发力企业运营“研产供销服“关键环节,汇集多家优质服务商,提供精选应用与服务</div>
            <div class="box_head_search">
                <div class="left">
                    <div class="box_head_search_input">
                        <input type="text" v-model="applicationInfo" placeholder="输入应用名称/服务商名称搜索">
                        <img src="../../assets/images/ic_clear@2x.png" v-if="applicationInfo" @click="clearText" />
                    </div>
                    <div class="box_head_search_btn" @click="search">查询</div>
                </div>
            </div>
        </div>
        <div class="box_cate">
            <div class="list" v-if="list.length > 0">
                <div class="list_item" v-for="(item, index) in list" :key="index">
                    <div class="list_item_image">
                        <img :src="item.fullLog" alt="" />
                    </div>
                    <div class="list_item_title">{{item.name}}</div>
                    <div class="list_item_cate" v-if="item.lables">
                        <div class="list_item_cate_row" v-for="(child, i) in item.lablesList" :key="i">{{child}}</div>
                    </div>
                    <div class="list_item_company">服务商:{{item.serverName}}</div>
                    <div class="list_item_info">{{item.introduction}}</div>
                    <div class="list_item_btn" @click="$refs.operaDetailsBWindow.open('应用详情', item.id)">查看详情</div>
                </div>
                <div class="list_zw"></div>
                <div class="list_zw"></div>
            </div>
            <div class="list" v-else>
                <div class="list_wu">无数据</div>
            </div>
            <div class="pagination">
                <el-pagination
                    v-if="list.length > 0"
                    @current-change="handleCurrentChange"
                    :current-page="page"
                    :page-sizes="[12, 24, 36, 48]"
                    :page-size="12"
                    layout="total, prev, pager, next, jumper"
                    :total="total">
                </el-pagination>
                <div class="pagination_info">Copyright Â© 2022 - 2023 æ™ºèƒ½åˆ¶é€ è¯Šæ–­ç»¼åˆæœåŠ¡å¹³å°. All Rights Reserved.  ç‰ˆæƒæ‰€æœ‰</div>
            </div>
        </div>
        <!--    è¯¦æƒ…    -->
        <OperaDetailsBWindow ref="operaDetailsBWindow" @success="" />
    </div>
</template>
<script>
  import OperaDetailsBWindow from '@/components/business/OperaDetailsBWindow'
  import { fetchList } from '@/api/business/applicationInfo'
  export default {
    name: 'serviceProviderResources',
    components: { OperaDetailsBWindow },
    data() {
      return {
        applicationInfo: '',
        value: 3,
        page: 1,
        total: 0,
        list: []
      }
    },
    created () {
      this.getList()
    },
    methods: {
      search() {
        this.page = 1
        this.getList()
      },
      handleCurrentChange(e) {
        this.page = e
        this.getList()
      },
      clearText() {
        this.applicationInfo = ''
      },
      getList() {
        fetchList({
          capacity: 12,
          page: this.page,
          model: {
            applicationInfo: this.applicationInfo,
            status: 0
          }
        }).then(res => {
          res.records.forEach((item) => {
            item.lablesList = item.lables.split(',') || []
          })
          this.list = res.records
          this.total = res.total
        })
      }
    }
  }
</script>
<style lang="scss" scoped>
    .box {
        width: 100%;
        .box_head {
            width: 100%;
            height: 264px;
            padding: 36px 50px;
            box-sizing: border-box;
            background-image: url("../../assets/images/bg_yingyong.png");
            background-repeat: no-repeat;
            background-size: cover;
            display: flex;
            flex-direction: column;
            .box_head_title {
                font-weight: 600;
                font-size: 40px;
                color: #216EEE;
            }
            .box_head_info {
                font-weight: 400;
                font-size: 16px;
                color: #333333;
                margin-top: 14px;
            }
            .box_head_search {
                width: 100%;
                display: flex;
                align-items: center;
                justify-content: space-between;
                margin-top: 36px;
                .left {
                    display: flex;
                    align-items: center;
                    .box_head_search_input {
                        width: 360px;
                        height: 48px;
                        padding: 0 15px;
                        box-sizing: border-box;
                        background: rgba(255,255,255,0.72);
                        border-radius: 2px;
                        margin-right: 10px;
                        display: flex;
                        align-items: center;
                        img {
                            width: 20px;
                            height: 20px;
                            flex-shrink: 0;
                            cursor: pointer;
                        }
                        input {
                            flex: 1;
                            height: 100%;
                            margin-right: 15px;
                            font-weight: 400;
                            font-size: 14px;
                            color: #222222;
                            border: none;
                            outline: none;
                            background: rgba(0,0,0,0);
                            &::-webkit-input-placeholder {
                                color: #999999;
                                font-size: 14px;
                                font-weight: 400;
                            }
                        }
                    }
                    .box_head_search_btn {
                        width: 68px;
                        height: 48px;
                        line-height: 48px;
                        text-align: center;
                        background: #216EEE;
                        border-radius: 2px;
                        font-weight: 600;
                        font-size: 15px;
                        color: #FFFFFF;
                        cursor: pointer;
                    }
                }
            }
        }
        .box_cate {
            width: 100%;
            padding: 0 20px;
            box-sizing: border-box;
            position: relative;
            top: -30px;
            left: 0;
            z-index: 9;
            .list {
                width: 100%;
                display: flex;
                align-items: center;
                flex-wrap: wrap;
                justify-content: space-between;
                .list_wu {
                    width: 100%;
                    text-align: center;
                    margin: 50px 0;
                    font-size: 14px;
                    color: #666666;
                }
                .list_zw {
                    width: 24%;
                    height: 0;
                }
                .list_item {
                    width: 24%;
                    height: 317px;
                    padding: 20px 30px;
                    box-sizing: border-box;
                    display: flex;
                    flex-direction: column;
                    align-items: center;
                    justify-content: space-between;
                    background: #FFFFFF;
                    border-radius: 8px;
                    margin-bottom: 1%;
                    .list_item_btn {
                        font-weight: 400;
                        font-size: 14px;
                        color: #FFFFFF;
                        width: 96px;
                        height: 36px;
                        line-height: 36px;
                        text-align: center;
                        background: #216EEE;
                        border-radius: 2px;
                        cursor: pointer;
                    }
                    .list_item_image {
                        width: 70px;
                        height: 70px;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        overflow: hidden;
                        img {
                            width: 100%;
                        }
                    }
                    .list_item_title {
                        font-weight: 600;
                        font-size: 18px;
                        color: #222222;
                    }
                    .list_item_cate {
                        width: 100%;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        .list_item_cate_row {
                            padding: 5px 8px;
                            box-sizing: border-box;
                            background: rgba(33,110,238,0.1);
                            border-radius: 2px;
                            font-weight: 400;
                            font-size: 12px;
                            color: #216EEE;
                            margin-right: 10px;
                            &:last-child {
                                margin-right: 0 !important;
                            }
                        }
                    }
                    .list_item_company {
                        width: 100%;
                        text-align: center;
                        font-weight: 400;
                        font-size: 12px;
                        color: #666666;
                    }
                    .list_item_info {
                        width: 100%;
                        text-align: center;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 2; /* é™åˆ¶æ–‡æœ¬ä¸º2行 */
                        overflow: hidden;
                        font-weight: 400;
                        font-size: 12px;
                        color: #999999;
                    }
                }
            }
            .pagination {
                width: 100%;
                display: flex;
                align-items: center;
                flex-direction: column;
                justify-content: center;
                margin-top: 20px;
                .pagination_info {
                    width: 100%;
                    text-align: center;
                    font-weight: 400;
                    font-size: 12px;
                    color: #828D9E;
                    margin-top: 30px;
                }
            }
        }
    }
</style>
frontWuhu/src/views/business/applicationInfo.vue
@@ -5,12 +5,11 @@
      <el-form-item label="应用名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入应用名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="服务商名称" prop="serverId">
        <el-input v-model="searchForm.serverId" placeholder="请输入服务商名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="服务商名称" prop="serverName">
        <el-input v-model="searchForm.serverName" placeholder="请输入服务商名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:applicationinfo:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
@@ -38,7 +37,11 @@
        <el-table-column prop="serverName" label="服务商" min-width="100px"></el-table-column>
        <el-table-column prop="lables" label="标签" min-width="100px"></el-table-column>
        <el-table-column prop="introduction" label="简介" min-width="100px"></el-table-column>
        <el-table-column prop="details" label="详情" min-width="100px"></el-table-column>
        <el-table-column prop="details" label="详情" min-width="100px">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.protocol.open('详情', row.details || '<p></p>')">点击查看</el-button>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
@@ -72,6 +75,7 @@
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaApplicationInfoWindow ref="operaApplicationInfoWindow" @success="handlePageChange"/>
    <Protocol ref="protocol"/>
  </TableLayout>
</template>
@@ -81,28 +85,17 @@
import Pagination from '@/components/common/Pagination'
import OperaApplicationInfoWindow from '@/components/business/OperaApplicationInfoWindow'
import { updateStatus } from '@/api/business/applicationInfo'
import Protocol from "@/components/Protocol.vue";
export default {
  name: 'ApplicationInfo',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaApplicationInfoWindow },
  components: { TableLayout, Pagination, OperaApplicationInfoWindow, Protocol },
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        status: '',
        remark: '',
        serverId: '',
        name: '',
        logo: '',
        lables: '',
        introduction: '',
        details: ''
        serverName: '',
        name: ''
      }
    }
  },
frontWuhu/src/views/business/demandRecord.vue
@@ -2,14 +2,22 @@
  <TableLayout :permissions="['business:demandrecord:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="应用名称" prop="applicationId">
        <el-input v-model="searchForm.applicationId" placeholder="请输入应用名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="应用名称" prop="applicationName">
        <el-input v-model="searchForm.applicationName" placeholder="请输入应用名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="需求提出者" prop="linkName">
        <el-input v-model="searchForm.linkName" placeholder="请输入联系人姓名" @keypress.enter.native="search"></el-input>
        <el-input v-model="searchForm.linkName" placeholder="请输入需求提出者姓名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="提交时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请选择提交时间" @change="search"/>
          <el-date-picker
              v-model="time"
              type="daterange"
              range-separator="至"
              @change="getTime"
              value-format="yyyy-MM-dd"
              start-placeholder="开始日期"
              end-placeholder="结束日期">
          </el-date-picker>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
@@ -27,23 +35,12 @@
        :data="tableData.list"
        stripe
      >
        <el-table-column prop="applicationId" label="应用名称" min-width="100px"></el-table-column>
        <el-table-column prop="companyId" label="需求企业" min-width="100px"></el-table-column>
        <el-table-column prop="applicationName" label="应用名称" min-width="100px"></el-table-column>
        <el-table-column prop="companyName" label="需求企业" min-width="100px"></el-table-column>
        <el-table-column prop="linkName" label="联系人姓名" min-width="100px"></el-table-column>
        <el-table-column prop="linkPhone" label="联系人电话" min-width="100px"></el-table-column>
        <el-table-column prop="details" label="描述" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="提交时间" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:demandrecord:update', 'business:demandrecord:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaDemandRecordWindow.open('编辑需求记录', row)" icon="el-icon-edit" v-permissions="['business:demandrecord:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:demandrecord:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
@@ -70,20 +67,12 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        status: '',
        remark: '',
        applicationId: '',
        companyId: '',
        applicationName: '',
        linkName: '',
        linkPhone: '',
        details: ''
      }
        startDate: '',
        endDate: ''
      },
      time: []
    }
  },
  created () {
@@ -94,6 +83,18 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    getTime(e) {
      if (e && e.length > 0) {
        this.searchForm.startDate = e[0]
        this.searchForm.endDate = e[1]
      } else {
        this.searchForm.startDate = ''
        this.searchForm.endDate = ''
      }
      this.search()
    }
  }
}
</script>
frontWuhu/src/views/business/serverProvider.vue
@@ -17,7 +17,7 @@
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:serverprovider:exportExcel']" @click="exportExcel">导出</el-button>
<!--        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:serverprovider:exportExcel']" @click="exportExcel">导出</el-button>-->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
frontWuhu/src/views/business/serviceProviderResources.vue
@@ -9,37 +9,43 @@
                        <input type="text" v-model="name" placeholder="输入服务商名称搜索">
                        <img src="../../assets/images/ic_clear@2x.png" v-if="name" @click="clearText" />
                    </div>
                    <div class="box_head_search_btn">查询</div>
                    <div class="box_head_search_btn" @click="search">查询</div>
                </div>
                <div class="right">
                    <img src="../../assets/images/ic_fuwushang@2x.png" alt="" />
                    <span class="right_name">服务商总数:</span>
                    <span class="right_num">220</span>
                    <span class="right_name">服务商总数:<span class="right_num">{{total}}</span></span>
                </div>
            </div>
        </div>
        <div class="box_cate">
            <div class="cate">
                <div class="cate_label">行业分类:</div>
                <div class="cate_val">
                    <div :class="index === 0 ? 'cate_val_row active' : 'cate_val_row'" v-for="(item, index) in cateList" :key="index">{{item}}</div>
                <div class="cate_val" :style="{ height: open ? 'auto' : '30px' }">
                    <div :class="cateId === item.id ? 'cate_val_row active' : 'cate_val_row'" v-for="(item, index) in cateList" :key="index" @click="select(item.id)">{{item.name}}</div>
                </div>
                <div class="cate_dwon">
                    <span>展开</span>
                    <i class="el-icon-arrow-down"></i>
                <div class="cate_dwon" @click="open = !open">
                    <template v-if="open">
                        <span>收起</span>
                        <i class="el-icon-arrow-up"></i>
                    </template>
                    <template v-else>
                        <span>展开</span>
                        <i class="el-icon-arrow-down"></i>
                    </template>
                </div>
            </div>
            <div class="list">
                <div class="list_item" v-for="(item, index) in 6" :key="index" @click="$refs.operaDetailsAWindow.open('服务商详情')">
            <div class="list" v-if="list.length > 0">
                <div class="list_item" v-for="(item, index) in list" :key="index" @click="$refs.operaDetailsAWindow.open('服务商详情', item.id)">
                    <div class="list_item_image">
                        <img src="../../assets/images/zhuce_ic_qiye@2x.png" alt="" />
                        <img :src="item.fullLog" alt="" />
                    </div>
                    <div class="list_item_title">安徽豆米科技有限公司</div>
                    <div class="list_item_info">安徽豆米科技有限公司以软件开发、人工智能应用开发为核心...</div>
                    <div class="list_item_title">{{item.name}}</div>
                    <div class="list_item_info">{{item.introduction}}</div>
                    <div class="list_item_divide">
                        <el-rate
                            v-model="value"
                            v-model="item.starLevel"
                            disabled
                            :colors="['#FF934D','#FF934D','#FF934D']"
                            text-color="#ff9900">
                        </el-rate>
                    </div>
@@ -47,14 +53,18 @@
                <div class="list_zw"></div>
                <div class="list_zw"></div>
            </div>
            <div class="list" v-else>
                <div class="list_wu">无数据</div>
            </div>
            <div class="pagination">
                <el-pagination
                    v-if="list.length > 0"
                    @current-change="handleCurrentChange"
                    :current-page="currentPage"
                    :page-sizes="[10, 20, 30, 40]"
                    :page-size="10"
                    :current-page="page"
                    :page-sizes="[12, 24, 36, 48]"
                    :page-size="12"
                    layout="total, prev, pager, next, jumper"
                    :total="50">
                    :total="total">
                </el-pagination>
                <div class="pagination_info">Copyright Â© 2022 - 2023 æ™ºèƒ½åˆ¶é€ è¯Šæ–­ç»¼åˆæœåŠ¡å¹³å°. All Rights Reserved.  ç‰ˆæƒæ‰€æœ‰</div>
            </div>
@@ -66,25 +76,60 @@
<script>
    import OperaDetailsAWindow from '@/components/business/OperaDetailsAWindow'
    import { list } from '@/api/business/labels'
    import { fetchList } from '@/api/business/serverProvider'
  export default {
    name: 'serviceProviderResources',
    components: { OperaDetailsAWindow },
    data() {
      return {
        name: '',
        value: 5,
        cateList: ['全部','新材料','其他','新型平板显示','生物医药','食品加工','冶金','汽车工业','轻工纺织','装备制造','化工','电子产品及软件','生产性服务业','节能环保','家具制造行业']
        value: 3,
        page: 1,
        cateId: '',
        total: 0,
        cateList: [],
        list: [],
        open: false
      }
    },
    created () {
      this.getAll()
      this.getList()
    },
    methods: {
      handleCurrentChange(e) {
        console.log(e)
      },
      currentPage(e) {
        console.log(e)
        this.page = e
        this.getList()
      },
      clearText() {
        this.name = ''
      },
      async getAll() {
        this.cateList = await list({ type: 1, isdeleted: 0 })
        this.cateList.unshift({ name: '全部', id: '' })
      },
      select(id) {
        this.cateId = id
        this.page = 1
        this.getList()
      },
      search() {
        this.page = 1
        this.getList()
      },
      getList() {
        fetchList({
          capacity: 12,
          page: this.page,
          model: {
            industryId: this.cateId,
            name: this.name
          }
        }).then(res => {
          this.list = res.records
          this.total = res.total
        })
      }
    }
  }
@@ -100,7 +145,7 @@
            box-sizing: border-box;
            background-image: url("../../assets/images/bg_fuwushang.png");
            background-repeat: no-repeat;
            background-size: 100% 100%;
            background-size: cover;
            display: flex;
            flex-direction: column;
            .box_head_title {
@@ -170,9 +215,7 @@
                    }
                }
                .right {
                    width: 173px;
                    height: 48px;
                    padding: 0 15px;
                    padding: 15px;
                    box-sizing: border-box;
                    background: #FFFFFF;
                    border-radius: 2px;
@@ -180,10 +223,13 @@
                    align-items: center;
                    justify-content: space-between;
                    img {
                        flex-shrink: 0;
                        width: 16px;
                        height: 16px;
                        margin-right: 6px;
                    }
                    .right_name {
                        flex: 1;
                        font-weight: 400;
                        font-size: 15px;
                        color: #333333;
@@ -210,6 +256,13 @@
                align-items: center;
                flex-wrap: wrap;
                justify-content: space-between;
                .list_wu {
                    width: 100%;
                    text-align: center;
                    margin: 50px 0;
                    font-size: 14px;
                    color: #666666;
                }
                .list_zw {
                    width: 24%;
                    height: 0;
@@ -225,6 +278,7 @@
                    justify-content: space-between;
                    background: #FFFFFF;
                    border-radius: 8px;
                    cursor: pointer;
                    margin-bottom: 1%;
                    .list_item_image {
                        width: 70px;
@@ -244,6 +298,7 @@
                    }
                    .list_item_info {
                        width: 100%;
                        text-align: center;
                        white-space: nowrap;
                        overflow: hidden;
                        text-overflow: ellipsis;
@@ -273,6 +328,7 @@
                    display: flex;
                    align-items: center;
                    flex-wrap: wrap;
                    overflow: hidden;
                    .active {
                        background: #216EEE !important;
                        border-radius: 2px !important;
@@ -297,6 +353,9 @@
                        font-size: 12px;
                        color: #216EEE;
                    }
                    .el-icon-arrow-up {
                        color: #216EEE;
                    }
                    .el-icon-arrow-down {
                        color: #216EEE;
                    }
frontWuhu/src/views/system/menu.vue
@@ -16,11 +16,11 @@
        row-key="id"
        stripe
        border
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" align="center" fixed="left"></el-table-column>
        <el-table-column prop="name" label="菜单名称"  fixed="left" align="center" min-width="160px"></el-table-column>
        <el-table-column prop="name" label="菜单名称"  fixed="left" min-width="160px"></el-table-column>
        <el-table-column prop="icon" label="图标" align="center" min-width="80px" class-name="table-column-icon">
          <template slot-scope="{row}">
            <i v-if="row.icon != null && row.icon !== ''" :class="{[row.icon]: true}"></i>