Browse Source

企业详情

master
parent
commit
a032322ab6
  1. 7
      App.vue
  2. 26
      api/common/wxApi.js
  3. 13
      api/enterprise/index.js
  4. 1
      components/cs-page/index.vue
  5. 2
      main.js
  6. 11
      manifest.json
  7. 7
      pages.json
  8. 15
      pages/chat.vue
  9. 150
      pages/enterprise.vue
  10. 2
      pages/login.vue
  11. 8
      pages/owner.vue
  12. 2
      permission.js
  13. BIN
      static/images/tabbers/chat-select.png
  14. BIN
      static/images/tabbers/chat.png
  15. 29
      sub/chat/index.vue
  16. 142
      sub/enterprise/detail.vue
  17. 97
      sub/enterprise/edit.vue
  18. 61
      sub/owner/edit.vue
  19. 41
      sub/owner/invite.vue
  20. 7
      uni_modules/s-components/s-header/index.vue
  21. 10
      uni_modules/s-components/s-tabber/index.vue
  22. 1
      utils/dict.js

7
App.vue

@ -1,7 +1,7 @@
<script>
import config from './config'
import store from '@/store'
import { getAccessToken } from '@/utils/auth'
import { getAccessToken, removeToken } from '@/utils/auth'
export default {
onLaunch: function () {
@ -20,12 +20,11 @@ export default {
this.checkLogin()
},
initConfig() {
// removeToken()
this.globalData.config = config
},
checkLogin() {
if (!getAccessToken()) {
this.$tab.reLaunch('/pages/login')
}
this.$tab.reLaunch('/pages/login')
}
}
}

26
api/common/wxApi.js

@ -0,0 +1,26 @@
import {
getAccessToken
} from '@/utils/auth'
import {
toast
} from '@/utils/common.js'
export function getQrcode(data) {
return new Promise((resolve, reject) => {
uni.request({
url: `https://api.weixin.qq.com/wxa/getwxacode?access_token=${getAccessToken()}`,
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data,
method: 'POST',
dataType: 'json',
success: (res) => {
resolve(res.data)
},
fail: (err) => {
reject(toast(err.errMsg))
}
})
})
}

13
api/enterprise/index.js

@ -18,8 +18,19 @@ export function createEnterPrise(data) {
*/
export function getEnterPriseList(params) {
return request({
url: `/system/enterprise/page`,
url: `/system/enterprise/getEnterpriseByUserId`,
method: 'GET',
params
})
}
/**
* 获取企业详情
* @param {Object} id
*/
export function getEnterPrise(id) {
return request({
url: `/system/enterprise/get?id=${id}`,
method: 'GET',
})
}

1
components/cs-page/index.vue

@ -40,6 +40,7 @@ export default {
grid-template-rows: auto 1fr auto;
height: 100vh;
width: 100vw;
overflow: hidden;
.view {
position: relative;
.inner {

2
main.js

@ -12,6 +12,8 @@ import uView from '@/uni_modules/uview-ui'
// Vue.mixin(mpShare)
// 挂载全局对象
Vue.use(plugins).use(uView)
let mpShare = require('@/uni_modules/uview-ui/libs/mixin/mpShare.js');
Vue.mixin(mpShare)
Vue.config.productionTip = false

11
manifest.json

@ -51,7 +51,16 @@
"optimization": {
"subPackages": true
},
"usingComponents": true
"usingComponents": true,
"lazyCodeLoading": "requiredComponents",
"permission": {
"scope.record": {
"desc": "用于语音输入"
},
"scope.userLocation": {
"desc": "获取企业位置"
}
}
},
"vueVersion": "2",
"h5": {

7
pages.json

@ -17,7 +17,8 @@
"navigationBarTitleText": "企业",
"usingComponents": {
"van-dropdown-menu": "/wxcomponents/vant/dropdown-menu/index",
"van-dropdown-item": "/wxcomponents/vant/dropdown-item/index"
"van-dropdown-item": "/wxcomponents/vant/dropdown-item/index",
"van-search": "/wxcomponents/vant/search/index"
}
}
},
@ -57,6 +58,10 @@
"path": "enterprise/edit"
}, {
"path": "common/waiting"
}, {
"path": "enterprise/detail"
}, {
"path": "chat/index"
}]
}],
"tabBar": {

15
pages/chat.vue

@ -1,13 +1,18 @@
<template>
<cs-page :selected="2" isTab></cs-page>
<cs-page :selected="2" isTab title="智慧生态"></cs-page>
</template>
<script>
export default {
data() {
return {}
}
data() {
return {}
},
onShow() {
uni.navigateTo({
url: '/sub/chat/index'
})
}
}
</script>
<style lang="scss"></style>
<style lang="scss"></style>

150
pages/enterprise.vue

@ -1,27 +1,140 @@
<template>
<cs-page :selected="3" title="企业信息" isTab>
<view class="page-container"></view>
<cs-page :selected="3" title="企业档案" isTab>
<view class="page-container">
<van-search
:value="queryParams.enterprisesName"
placeholder="输入企业名称或类型查询"
@sreach="queryEnterprise"
@clear="resetQuery('enterpriseName')"
/>
<van-dropdown-menu safe-area-tab-bar>
<van-dropdown-item
:value="queryParams.region"
:options="getDropdownOption('enterprises_area')"
@change="queryEnterprise"
/>
<van-dropdown-item :value="queryParams.dept" :options="getDropdownOption('dept')" @change="queryEnterprise" />
</van-dropdown-menu>
<u-list @scrolltolower="loadMore" class="list" height="67vh">
<u-list-item v-for="enterprise in list" :key="enterprise.id">
<view class="wd-flex wd-items-center enterprise" @click="goDetail(enterprise.id)">
<u-avatar :src="enterprise.files[0]" shape="square" size="64"></u-avatar>
<view class="wd-flex wd-flex-col" style="gap: 4px">
<text class="wd-font-800">{{ enterprise.enterprisesName }}</text>
<text class="address">{{ enterprise.address }}</text>
</view>
<view
class="audit"
v-if="enterprise.audit != 2"
:style="{ color: enterprise.audit == 1 ? '#EAB308' : '#ea000c' }"
>
{{ $dict.echoDicValue(dictMap.user_audit_type, enterprise.audit) }}
</view>
</view>
</u-list-item>
<u-loadmore :status="load" />
</u-list>
</view>
</cs-page>
</template>
<script>
import { getEnterPriseList } from '@/api/enterprise/index.js'
import { getDictBatchByType, getDeptTree } from '@/api/system/dict.js'
export default {
data() {
return {
queryParams: {
pageSize: 10,
pageNo: 1
}
pageNo: 1,
region: '',
dept: '',
enterprisesName: ''
},
list: [],
load: 'loadmore',
dictMap: {}
}
},
async onLoad() {
await this.getDict()
},
onShow() {
this.getList()
this.queryEnterprise()
},
methods: {
async getList() {
uni.showToast({
title: '加载中',
mask: true,
icon: 'loading'
})
this.load = 'loading'
const res = await getEnterPriseList(this.queryParams)
console.log(res)
this.list.push(...res.data.list)
this.load = 'loadmore'
if (this.list.length == res.data.total) {
this.load = 'nomore'
}
uni.hideToast()
},
async getDict() {
const dict = await getDictBatchByType({ type: ['enterprises_area', 'user_audit_type'].join(',') })
const dept = await getDeptTree()
this.dictMap = {
...dict.data,
dept: dept.data.map(i => {
return {
...i,
label: i.name,
value: i.id
}
})
}
},
getDropdownOption(key) {
if (!this.dictMap[key]) return []
const keyMap = {
enterprises_area: '全部区域',
dept: '全部部门'
}
const data = this.dictMap[key].map(d => {
return {
value: d.value,
text: d.label
}
})
data.push({
value: '',
text: keyMap[key]
})
return data
},
queryEnterprise() {
this.queryParams.pageNo = 1
this.load = 'loadmore'
this.list = []
this.getList()
},
loadMore() {
if (this.load == 'nomore') {
uni.showToast({
title: '没有更多了',
icon: 'none'
})
return
}
this.queryParams.pageNo++
this.getList()
},
resetQuery(key) {
this.queryParams[key] = ''
this.queryEnterprise()
},
goDetail(id) {
uni.navigateTo({
url: `/sub/enterprise/detail?id=${id}`
})
}
}
}
@ -32,4 +145,29 @@ export default {
height: 100%;
overflow: hidden;
}
.enterprise {
padding: 12px;
background-color: #fff;
border-radius: $cs-border-radius;
gap: 12px;
margin-top: 12px;
position: relative;
.address {
color: $uni-text-color-grey;
}
.audit {
position: absolute;
right: 1%;
top: 16%;
transform: rotateZ(39deg);
transform-origin: 50% 50%;
}
}
::v-deep .van-dropdown-menu {
box-shadow: none;
}
::v-deep .u-list {
padding: 12px;
}
</style>

2
pages/login.vue

@ -36,6 +36,7 @@ export default {
state: 'default',
userType: this.getUserType()
}
console.log('Login', data)
//
this.$store.dispatch('Login', data).then(() => {
this.loginSuccess()
@ -52,6 +53,7 @@ export default {
},
loginSuccess() {
this.$store.dispatch('GetInfo').then(res => {
console.log('loginSuccess', res.data)
this.handlerNavigateTo(res.data.user)
})
},

8
pages/owner.vue

@ -1,11 +1,5 @@
<template>
<cs-page :selected="4" isTab isCustom>
<template #header>
<view class="header">
<u--image src="/static/favicon.png" width="20px" height="20px" mode="aspectFit"></u--image>
<view class="title">个人中心</view>
</view>
</template>
<cs-page :selected="4" isTab title="个人中心">
<scroll-view class="owner-container" scroll-y>
<view class="section wd-flex wd-flex-row wd-justify-between wd-items-center" @tap="edit">
<view class="wd-flex wd-flex-col" style="gap: 4px">

2
permission.js

@ -24,7 +24,7 @@ let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
list.forEach(item => {
uni.addInterceptor(item, {
invoke(to) {
console.log('addInterceptor', to);
console.log('routeTo', to);
if (getAccessToken()) {
if (to.path === loginPage) {
uni.reLaunch({

BIN
static/images/tabbers/chat-select.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/images/tabbers/chat.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

29
sub/chat/index.vue

@ -0,0 +1,29 @@
<template>
<view class="chat-container">
<web-view :webview-styles="webviewStyles" src="http://192.168.2.5:28180/ui/chat/aa39d6777becd0e1"></web-view>
</view>
</template>
<script>
export default {
data() {
return {}
},
onLoad() {
uni.authorize({
scope: 'scope.record',
success() {
uni.getRecorderManager()
}
})
}
}
</script>
<style lang="scss" scoped>
.chat-container {
height: 100vh;
width: 100vw;
background: linear-gradient(180deg, #02815b 0%, #114636 100%);
}
</style>

142
sub/enterprise/detail.vue

@ -0,0 +1,142 @@
<template>
<cs-page isCustom>
<template #header>
<view class="wd-flex wd-flex-row wd-flex-center" style="position: relative" @click="goBack">
<view class="icon-box">
<u-icon name="arrow-left" size="12"></u-icon>
</view>
<view class="wd-font-800 wd-text-16">企业档案</view>
</view>
</template>
<view class="detail-container">
<view class="box detail">
<view>
<text class="wd-font-800">{{ detail.enterprisesName }}</text>
</view>
<view class="address">企业地址 {{ detail.address }}</view>
<text>{{ detail.introduction }}</text>
<view class="images-box">
<image v-for="(src, index) in detail.files" :key="index" :src="src" mode="widthFix" class="image"></image>
</view>
<view>
<text class="address" style="margin-right: 8px">环保负责人</text>
<text style="margin-right: 8px">{{ detail.enterprisesName }}</text>
<text style="text-decoration: underline">{{ detail.environmentalContactPhone }}</text>
</view>
<view>
<text class="address" style="margin-right: 8px">成立时间</text>
<text>{{ $util.formatDate(detail.establishmentDate, 'YYYY年M月D日') }}</text>
</view>
<view class="prove-list">
<view class="prove" v-for="prove in detail.qualificationList" :key="prove.id">
<view>
{{ $dict.echoDicValue(dictMap.enterprise_qua, prove.qualificationName.toString()) }}
</view>
<view class="">
{{ $util.formatDate(prove.handleDate, 'YYYY年M月D日') }}-
{{ $util.formatDate(prove.expiryDate, 'YYYY年M月D日') }}
</view>
</view>
</view>
</view>
<!--
<view class="box">
<view class="wd-font-800">资质许可</view>
</view> -->
<view class="box">
<view class="wd-font-800">实时监控</view>
</view>
<view class="box">
<view class="wd-font-800">检查记录</view>
</view>
</view>
</cs-page>
</template>
<script>
import { getEnterPrise } from '@/api/enterprise/index.js'
import { getDictBatchByType } from '@/api/system/dict.js'
export default {
data() {
return {
detail: {
id: ''
},
dictMap: {}
}
},
onLoad(res) {
if (res.id) {
this.detail.id = res.id
}
this.getDict()
this.init()
},
methods: {
/**
* 获取字典
*/
async getDict() {
const dict = await getDictBatchByType({ type: ['enterprises_type', 'enterprise_qua'].join(',') })
this.dictMap = {
...dict.data
}
},
async init() {
const res = await getEnterPrise(this.detail.id)
this.detail = res.data
},
goBack() {
uni.navigateBack()
}
}
}
</script>
<style lang="scss" scoped>
.detail-container {
padding: 12px;
.box {
margin-bottom: 12px;
background-color: #fff;
border-radius: $cs-border-radius;
padding: 16px;
}
.detail {
display: flex;
flex-flow: column nowrap;
gap: 16px;
.address {
color: $uni-text-color-grey;
}
}
.images-box {
display: flex;
flex-flow: row nowrap;
gap: 12px;
.image {
border-radius: $cs-border-radius;
}
}
.prove-list {
display: flex;
flex-flow: column nowrap;
gap: 5px;
.prove {
border: 1px solid $uni-color-primary;
padding: 5px 10px;
border-radius: 6px;
color: $uni-color-primary;
background-color: #ecf5ff;
}
}
}
.icon-box {
position: absolute;
left: 0;
}
</style>

97
sub/enterprise/edit.vue

@ -128,8 +128,8 @@
{{ $dict.echoDicValue(dictMap.enterprise_qua, prove.qualificationName.toString()) }}
</view>
<view class="">
{{ $util.formatDate(prove.expiryDate, 'YYYY年M月D日') }}-
{{ $util.formatDate(prove.handleDate, 'YYYY年M月D日') }}
{{ $util.formatDate(prove.expiryDate, 'YYYY年M月D日') }}
</view>
</view>
</view>
@ -165,6 +165,7 @@ import { createProve, getProveList, updateProve } from '@/api/enterprise/prove.j
export default {
data() {
return {
// id
invateId: undefined,
//
info: {
@ -208,15 +209,21 @@ export default {
}
}
},
//
dictMap: {},
//
picker: {
show: false,
//
key: null,
data: []
},
//
calendar: {
//
key: null
},
//
step: {
options: [
{
@ -231,7 +238,8 @@ export default {
//
prove: {
list: [],
isEdit: false,
//
isEdit: true,
loading: false,
form: {
enterpriseId: '',
@ -256,6 +264,10 @@ export default {
this.initProveList()
},
methods: {
/**
* 选择图片并上传
* @param {Object} e
*/
async addEnterprisePhoto(e) {
this.info.form.photo = e.file.map(p => {
return {
@ -264,6 +276,7 @@ export default {
message: '上传中'
}
})
// 使promise.all()
await Promise.all(
this.info.form.photo.map(async (p, i) => {
const res = await uploadFile({ name: `file`, filePath: p.url })
@ -277,29 +290,51 @@ export default {
this.info.form.photo = res
})
},
/**
* 删除图片
* @param {Object} e
*/
delEnterprisePhoto(e) {
this.info.form.photo.splice(e.index, 1)
},
/**
* 弹出选择器
* @param {String} type 字典类型
* @param {String} key 表单中需要赋值的健
*/
showPicker(type, key) {
// type
this.picker.data.push(this.dictMap[type])
this.picker.key = key
this.picker.show = true
},
/**
* 获取字典
*/
async getDict() {
const dict = await getDictBatchByType({ type: ['enterprises_type', 'enterprise_qua'].join(',') })
this.dictMap = {
...dict.data
}
},
/**
* 选择器确认回调
* @param {Object} e
*/
confirmPicker(e) {
const { value } = e
if (this.step.active == 1) {
// 1
this.prove.form[this.picker.key] = value[0].value
} else {
// 0
this.info.form[this.picker.key] = value[0].value
}
this.closePicker()
},
/**
* 关闭选择器
*/
closePicker() {
this.picker = {
show: false,
@ -307,55 +342,93 @@ export default {
data: []
}
},
/**
* 显示日历
* @param {Object} key 表单中需要赋值的键
*/
showCalendar(key) {
this.$refs.calendarRef.open()
this.calendar = {
key
}
},
/**
* 日历选中之后的回调
* @param {Object} e
*/
confirmCalendar(e) {
if (this.step.active == 1) {
// 1
this.prove.form[this.calendar.key] = e.fulldate
} else {
// 0
this.info.form[this.calendar.key] = e.fulldate
}
this.closeCalendar()
},
/**
* 关闭日历
*/
closeCalendar() {
this.calendar = {
key: null
}
},
/**
* 企业基本信息表单提交事件
*/
submitInfo() {
this.$refs.infoFormRef.validate().then(async res => {
this.handlerInfoApi()
})
},
/**
* 触发创建企业接口
*/
async handlerInfoApi() {
const data = this.info.form
data.fileIds = this.info.form.photo.map(p => p.file_id)
data.userId = this.invateId
let enterprise
if (this.info.form.id) {
//
} else {
enterprise = await createEnterPrise(data)
//idid
this.info.form.id = enterprise.data
uni.showToast({
icon: 'success',
title: '操作成功'
})
//
this.step.active = 1
}
this.initProveList()
},
/**
* 添加资质
*/
addProve() {
this.prove.isEdit = true
},
/**
* 提交资质
*/
submitProve() {
this.handlerProveApi()
},
/**
* 初始化资质列表
*/
async initProveList() {
this.prove.loading = true
const res = await getProveList({ pageSize: -1, enterpriseId: this.info.form.id })
this.prove.list = res.data.list
this.prove.loading = false
},
/**
* 触发资质新增修改的接口
*/
async handlerProveApi() {
let prove
const data = this.prove.form
@ -366,14 +439,34 @@ export default {
prove = await createProve(data)
}
this.prove.isEdit = false
uni.showToast({
icon: 'success',
title: '操作成功'
})
this.prove.form = {
enterpriseId: '',
id: '',
qualificationName: '',
expiryDate: '',
qualificationDescription: '',
handleDate: '',
enterpriseAuth: ''
}
this.initProveList()
},
/**
* 编辑资质
* @param {Object} prove 列表中的资质实例对象
*/
editProve(prove) {
this.prove.form = prove
this.prove.form.handleDate = this.$util.formatDate(prove.handleDate, 'YYYY-MM-DD')
this.prove.form.expiryDate = this.$util.formatDate(prove.expiryDate, 'YYYY-MM-DD')
this.prove.isEdit = true
},
/**
* 完成事件
*/
handlerDone() {
uni.navigateTo({
url: '/sub/common/waiting'

61
sub/owner/edit.vue

@ -75,10 +75,12 @@
<u-icon name="arrow-right" color="#99A1B7" size="16"></u-icon>
</view>
</view>
<button class="button" v-if="form.audit == 1">
{{ $dict.echoDicValue(dictMap.user_audit_type, form.audit) }}
</button>
<button class="button" @click="submit" v-else>提交</button>
<view class="button-box">
<button class="button audit" v-if="form.audit == 1">
{{ $dict.echoDicValue(dictMap.user_audit_type, form.audit) }}
</button>
<button class="button submit" @click="submit" v-else>提交</button>
</view>
</view>
<u-picker
:show="picker.show"
@ -161,7 +163,7 @@ export default {
filePath: e.detail.avatarUrl
}
uploadFile(data).then(res => {
this.form.avatar = res.data
this.form.avatar = res.data.url
})
},
validateForm() {
@ -210,12 +212,21 @@ export default {
return true
},
submit() {
uni.showLoading({
mask: true,
title: '提交中...'
})
if (!this.validateForm()) return
updateUserProfile(this.form).then(res => {
console.log(res)
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'success',
duration: 500
})
this.init()
})
},
confirmPicker(e) {
const { value } = e
this.form[this.picker.key] = value[0].value
@ -235,26 +246,40 @@ export default {
<style lang="scss" scoped>
.container {
height: 100%;
padding: 10px;
padding: 32rpx;
position: relative;
.section {
border-radius: $cs-border-radius;
border-radius: 16rpx;
background: #fff;
box-shadow: 0 0 4px 2px $cs-shadow-color;
margin-bottom: $cs-gap;
margin-bottom: 32rpx;
padding: 24px;
height: 140rpx;
font-size: 30rpx;
}
.button {
background-color: $uni-color-primary;
color: #fff;
border-radius: 30px;
.button-box {
position: fixed;
bottom: 30px;
bottom: 116rpx;
right: 10px;
left: 10px;
height: 40px;
line-height: 40px;
box-sizing: border-box;
.button {
width: 60vw;
border-radius: 30px;
font-size: 32rpx;
font-weight: bold;
height: 40px;
line-height: 40px;
box-sizing: border-box;
box-shadow: 0px 3px 4px 0px rgba(0, 0, 0, 0.1);
}
.submit {
color: #fff;
background: #17c653;
}
.audit {
color: #17c653;
background: #eafff1;
}
}
.placeholder {
color: $uni-text-color-grey;

41
sub/owner/invite.vue

@ -1,20 +1,41 @@
<template>
<cs-page title="邀请企业" @goback="goback"></cs-page>
<cs-page title="邀请企业" @goback="goback">
<button open-type="share">邀请企业</button>
</cs-page>
</template>
<script>
import storage from '@/utils/storage'
import { getQrcode } from '@/api/common/wxApi.js'
export default {
data() {
return {}
},
onShareAppMessage(res) {
onLoad(res) {
console.log('invite', res)
getQrcode({
data: {
page: 'pages/login',
scene: `invateId=${this.$store.getters.userId}`
}
}).then(res => {
console.log(res)
})
},
onShareAppMessage() {
return {
title: '邀请企业',
title: '邀请企业入驻',
path: `/pages/login?invateId=${this.$store.getters.userId}`,
imageUrl: '/static/images/invateImage.png'
imageUrl: require('@/static/images/invateImage.png')
}
},
onShareTimeline() {
return {
title: '邀请企业入驻', //
path: `/pages/login?invateId=${this.$store.getters.userId}`,
imageUrl: require('@/static/images/invateImage.png')
}
},
methods: {
goback() {
uni.switchTab({
@ -25,4 +46,12 @@ export default {
}
</script>
<style lang="scss"></style>
<style lang="scss" scoped>
.invate {
height: 100%;
// background: linear-gradient(180deg, #17c653 0%, #17c653 100%);
display: flex;
justify-content: center;
align-items: center;
}
</style>

7
uni_modules/s-components/s-header/index.vue

@ -6,7 +6,10 @@
</view>
<view v-else>
<view class="operation" v-if="isTab">
<text class="title">{{ title }}</text>
<view class="wd-flex wd-items-center" style="gap: 10px">
<u--image src="/static/favicon.png" width="20px" height="20px" mode="aspectFit"></u--image>
<text class="title">{{ title }}</text>
</view>
</view>
<view class="operation wd-flex wd-flex-row wd-items-center" style="gap: 10px" v-else @tap="goback">
<view class="icon-box">
@ -66,4 +69,4 @@ export default {
}
}
}
</style>
</style>

10
uni_modules/s-components/s-tabber/index.vue

@ -7,7 +7,12 @@
:key="index"
@click="changeTab(tab)"
>
<u--image :src="tab.icon" width="42px" height="42px" v-if="tab.type == 'middle'"></u--image>
<u--image
:src="selected == tab.code ? tab.selectIcon : tab.icon"
width="42px"
height="42px"
v-if="tab.type == 'middle'"
></u--image>
<u--image :src="selected == tab.code ? tab.selectIcon : tab.icon" width="24px" height="24px" v-else></u--image>
<view class="name">
{{ tab.name }}
@ -48,6 +53,7 @@ export default {
name: '',
path: '/pages/chat',
icon: '/static/images/tabbers/chat.png',
selectIcon: '/static/images/tabbers/chat-select.png',
type: 'middle',
code: 2
},
@ -92,7 +98,7 @@ export default {
box-shadow: 0 -1px 2px 1px $cs-shadow-color;
}
.noTab {
background-color: #fff;
// background-color: #fff;
}
.fit-content {
height: 20px;

1
utils/dict.js

@ -4,6 +4,7 @@
* @param {Object} value
*/
export function echoDicValue(dict, value) {
if (!dict) return ''
return dict.find(d => d.value == value).label || ''
}

Loading…
Cancel
Save