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> <script>
import config from './config' import config from './config'
import store from '@/store' import store from '@/store'
import { getAccessToken } from '@/utils/auth' import { getAccessToken, removeToken } from '@/utils/auth'
export default { export default {
onLaunch: function () { onLaunch: function () {
@ -20,12 +20,11 @@ export default {
this.checkLogin() this.checkLogin()
}, },
initConfig() { initConfig() {
// removeToken()
this.globalData.config = config this.globalData.config = config
}, },
checkLogin() { 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) { export function getEnterPriseList(params) {
return request({ return request({
url: `/system/enterprise/page`, url: `/system/enterprise/getEnterpriseByUserId`,
method: 'GET', method: 'GET',
params 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; grid-template-rows: auto 1fr auto;
height: 100vh; height: 100vh;
width: 100vw; width: 100vw;
overflow: hidden;
.view { .view {
position: relative; position: relative;
.inner { .inner {

2
main.js

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

11
manifest.json

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

7
pages.json

@ -17,7 +17,8 @@
"navigationBarTitleText": "企业", "navigationBarTitleText": "企业",
"usingComponents": { "usingComponents": {
"van-dropdown-menu": "/wxcomponents/vant/dropdown-menu/index", "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": "enterprise/edit"
}, { }, {
"path": "common/waiting" "path": "common/waiting"
}, {
"path": "enterprise/detail"
}, {
"path": "chat/index"
}] }]
}], }],
"tabBar": { "tabBar": {

15
pages/chat.vue

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

150
pages/enterprise.vue

@ -1,27 +1,140 @@
<template> <template>
<cs-page :selected="3" title="企业信息" isTab> <cs-page :selected="3" title="企业档案" isTab>
<view class="page-container"></view> <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> </cs-page>
</template> </template>
<script> <script>
import { getEnterPriseList } from '@/api/enterprise/index.js' import { getEnterPriseList } from '@/api/enterprise/index.js'
import { getDictBatchByType, getDeptTree } from '@/api/system/dict.js'
export default { export default {
data() { data() {
return { return {
queryParams: { queryParams: {
pageSize: 10, pageSize: 10,
pageNo: 1 pageNo: 1,
} region: '',
dept: '',
enterprisesName: ''
},
list: [],
load: 'loadmore',
dictMap: {}
} }
}, },
async onLoad() {
await this.getDict()
},
onShow() { onShow() {
this.getList() this.queryEnterprise()
}, },
methods: { methods: {
async getList() { async getList() {
uni.showToast({
title: '加载中',
mask: true,
icon: 'loading'
})
this.load = 'loading'
const res = await getEnterPriseList(this.queryParams) 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%; height: 100%;
overflow: hidden; 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> </style>

2
pages/login.vue

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

8
pages/owner.vue

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

61
sub/owner/edit.vue

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

41
sub/owner/invite.vue

@ -1,20 +1,41 @@
<template> <template>
<cs-page title="邀请企业" @goback="goback"></cs-page> <cs-page title="邀请企业" @goback="goback">
<button open-type="share">邀请企业</button>
</cs-page>
</template> </template>
<script> <script>
import storage from '@/utils/storage' import { getQrcode } from '@/api/common/wxApi.js'
export default { export default {
data() { data() {
return {} 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 { return {
title: '邀请企业', title: '邀请企业入驻',
path: `/pages/login?invateId=${this.$store.getters.userId}`, 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: { methods: {
goback() { goback() {
uni.switchTab({ uni.switchTab({
@ -25,4 +46,12 @@ export default {
} }
</script> </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>
<view v-else> <view v-else>
<view class="operation" v-if="isTab"> <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>
<view class="operation wd-flex wd-flex-row wd-items-center" style="gap: 10px" v-else @tap="goback"> <view class="operation wd-flex wd-flex-row wd-items-center" style="gap: 10px" v-else @tap="goback">
<view class="icon-box"> <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" :key="index"
@click="changeTab(tab)" @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> <u--image :src="selected == tab.code ? tab.selectIcon : tab.icon" width="24px" height="24px" v-else></u--image>
<view class="name"> <view class="name">
{{ tab.name }} {{ tab.name }}
@ -48,6 +53,7 @@ export default {
name: '', name: '',
path: '/pages/chat', path: '/pages/chat',
icon: '/static/images/tabbers/chat.png', icon: '/static/images/tabbers/chat.png',
selectIcon: '/static/images/tabbers/chat-select.png',
type: 'middle', type: 'middle',
code: 2 code: 2
}, },
@ -92,7 +98,7 @@ export default {
box-shadow: 0 -1px 2px 1px $cs-shadow-color; box-shadow: 0 -1px 2px 1px $cs-shadow-color;
} }
.noTab { .noTab {
background-color: #fff; // background-color: #fff;
} }
.fit-content { .fit-content {
height: 20px; height: 20px;

1
utils/dict.js

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

Loading…
Cancel
Save