This commit is contained in:
yanran200730
2022-08-15 09:35:30 +08:00
16 changed files with 475 additions and 40 deletions

View File

@@ -12,12 +12,12 @@
<span @click="linkTo('./SetGird')" v-if="isGridAdmin">网格配置</span> <span @click="linkTo('./SetGird')" v-if="isGridAdmin">网格配置</span>
</div> </div>
<component v-if="refresh && isGridMember" :is="component" @change="onChange" :params="params"/> <component v-if="refresh && isGridMember" :is="component" @change="onChange" :params="params"/>
<div class="tabs" v-if="isTab && isGridMember"> <!-- <div class="tabs" v-if="isTab && isGridMember">
<div class="item" @click="tabClick(index, item.component)" v-for="(item, index) in tabs" :key="index"> <div class="item" @click="tabClick(index, item.component)" v-for="(item, index) in tabs" :key="index">
<img :src="tabIndex == index ? item.activeImg : item.img" alt=""/> <img :src="tabIndex == index ? item.activeImg : item.img" alt=""/>
<p :class="tabIndex == index ? 'color-3267F0' : ''">{{ item.text }}</p> <p :class="tabIndex == index ? 'color-3267F0' : ''">{{ item.text }}</p>
</div> </div>
</div> </div> -->
<div v-if="!isGridMember" class="empty"> <div v-if="!isGridMember" class="empty">
<img src="./components/img/no-admin.png" alt=""> <img src="./components/img/no-admin.png" alt="">
<p>没有网格员权限<br/>无法查看网格信息哦~</p> <p>没有网格员权限<br/>无法查看网格信息哦~</p>
@@ -45,7 +45,7 @@ export default {
}, },
data() { data() {
return { return {
component: 'Statistics', component: 'Organization',
params: {}, params: {},
refresh: true, refresh: true,
tabIndex: 0, tabIndex: 0,

View File

@@ -0,0 +1,149 @@
<template>
<div class="feedback">
<div class="suggest">
<div flex class="title"><em v-text="'*'"/>请输入您的宝贵意见</div>
<AiTextarea v-model="content" placeholder="请输入200字以内" :maxlength="200"/>
</div>
<div class="name">
<div flex><em v-text="'*'"/>联系人</div>
<input type="text" placeholder="请输入您的姓名" style="text-align: right;" v-model="name" class="inp">
</div>
<div class="phone">
<div flex><em v-text="'*'"/>联系方式</div>
<input type="number" placeholder="请输入您的联系方式" style="text-align: right;" v-model="phone" class="inp">
</div>
<div class="photo">
<div class="photo-title">图片 <span>最多9张</span></div>
<div class="pad-120">
<AiUploader :limit="9" multiple :def.sync="picture" placeholder="上传图片" action="/admin/file/add2"/>
</div>
</div>
<div style="height: 56px;"></div>
<div class="btn" @click="submit">保存</div>
</div>
</template>
<script>
export default {
name: 'feedback',
data() {
return {
content: '',
picture: [],
name: '',
phone: ''
}
},
methods: {
submit() {
let {phone, content, picture, name} = this
if (!content) {
return this.$u.toast("请输入您的宝贵意见")
}
if (!name) {
return this.$u.toast("请输入您的姓名")
}
if (!phone) {
return this.$u.toast("请输入联系方式")
}
if (!/^\d{11}$/g.test(phone)) {
return this.$u.toast("联系方式格式有误!")
}
this.$http.post("/oms/api/appfeedback/addOrUpdate", {
phone,
opinion: content,
pictureUrl: picture?.map(e=>e.url).toString(),
contacts: name,
sourceHost: location.host
}, {
withoutToken: true
}).then(res => {
if (res?.code == 0) {
this.$u.toast("保存成功!")
setTimeout(() => {
uni.navigateBack({})
}, 1500)
}
})
}
},
onShow() {
document.title = '意见反馈'
},
}
</script>
<style lang="scss" scoped>
.feedback {
padding-bottom: 100px;
em {
display: block;
color: red;
font-style: normal;
height: initial;
}
.suggest {
padding: 15px 30px;
box-sizing: border-box;
background-color: #FFFFFF;
margin-bottom: 8px;
.title {
width: 100%;
height: 100px;
line-height: 100px;
font-size: 32px;
color: #333333;
}
}
.name,
.phone {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #FFFFFF;
margin-bottom: 8px;
padding: 0 30px;
width: 100%;
height: 112px;
line-height: 112px;
font-size: 32px;
box-sizing: border-box;
}
.photo {
background-color: #FFFFFF;
padding: 20px 30px;
.photo-title {
width: 100%;
height: 100px;
line-height: 80px;
color: #333333;
& > span {
color: #999999;
}
}
}
.btn {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 112px;
line-height: 112px;
text-align: center;
background-color: #1365DD;
color: #FFFFFF;
}
}
</style>

View File

@@ -0,0 +1,19 @@
<template>
<div class="gridMemberPoints">
<img src="./img/my/grid-point.png" alt="" class="right-icon">
</div>
</template>
<script>
export default {
name: "gridMemberPoints",
}
</script>
<style lang="scss" scoped>
.gridMemberPoints {
img {
width: 100%;
}
}
</style>

View File

@@ -0,0 +1,92 @@
<template>
<div class="HelpDocs">
<div class="bg-fff title">
<p>系统初始化</p>
<p>进入应用-网格管理模块添加网格信息</p>
<p>进入应用-网格管理模块添加网格员相关信息</p>
<p>进入首页-居民档案添加居民档案</p>
<p>进入应用-网格管理-选中网格员添加责任家庭</p>
</div>
<div class="bg-fff">
<div class="flex">
<span>系统后台</span>
<div @click="copy">https://saasweb.icunwei.com/login<span class="copy">复制</span></div>
</div>
<div class="flex">
<span>联系电话</span>
<div @click="callPhone('18186229224')">18186229224<img src="./img/my/phone-icon.png" /></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "HelpDocs",
data() {
return {
}
},
methods: {
copy() {
uni.setClipboardData({
data: 'https://saasweb.icunwei.com/login', // e是你要保存的内容
success: () => {
uni.showToast({
title:'复制成功',
icon:'none'
})
}
})
},
callPhone(phoneNumber) {
uni.makePhoneCall({phoneNumber})
}
},
}
</script>
<style lang="scss" scoped>
.HelpDocs {
width: 100%;
height: 100%;
background-color: #F5F6F7;
.bg-fff {
background-color: #fff;
}
.title {
padding: 30px;
margin-bottom: 20px;
p {
width: 100%;
font-size: 28px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333;
line-height: 40px;
}
}
.flex {
display: flex;
// justify-content: space-between;
padding: 0 30px;
line-height: 100px;
font-size: 28px;
font-family: PingFangSC-Regular, PingFang SC;
color: #030303;
div {
color: #3975C6;
margin-left: 32px;
}
.copy {
margin-left: 24px;
}
img {
width: 48px;
height: 48px;
margin-left: 16px;
vertical-align: middle;
}
}
}
</style>

View File

@@ -0,0 +1,73 @@
<template>
<div class="uploadPhoto">
<div class="photo">
<div class="photo-title">图片 <span>最多1张</span></div>
<div class="pad-120">
<AiUploader :limit="1" multiple placeholder="上传图片" :def.sync="picture" action="/admin/file/add-portrait"/>
</div>
</div>
<div style="height: 56px;"></div>
<div class="btn" @click="back">返回</div>
</div>
</template>
<script>
import {mapActions} from "vuex";
export default {
name: 'uploadPhoto',
data() {
return {
picture: []
}
},
methods: {
...mapActions(['getAccount']),
back() {
uni.navigateBack({
success: () => {
this.getAccount()
}
})
}
},
onShow() {
document.title = '头像上传'
},
}
</script>
<style lang="scss" scoped>
.uploadPhoto {
.photo {
background-color: #FFFFFF;
padding: 20px 30px;
.photo-title {
width: 100%;
height: 100px;
line-height: 80px;
color: #333333;
& > span {
color: #999999;
}
}
}
.btn {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 112px;
line-height: 112px;
text-align: center;
background-color: #1365DD;
color: #FFFFFF;
}
}
</style>

View File

@@ -63,10 +63,15 @@ export default {
linkUrl: '/apps/AppInterview/AppInterview' linkUrl: '/apps/AppInterview/AppInterview'
}, },
{ {
img: require('../img/app/app-xtxf-icon.png'), img: require('../img/home/home-xtxf-icon.png'),
title: '协同宣发', title: '协同宣发',
linkUrl: '/apps/AppCooperationPropaganda/AppCooperationPropaganda' linkUrl: '/apps/AppCooperationPropaganda/AppCooperationPropaganda'
}, },
{
img: require('../img/app/app-xftj-icon.png'),
title: '宣发统计',
linkUrl: '/apps/AppPropagandaStatistics/AppPropagandaStatistics'
},
{ {
img: require('../img/app/app-tzgg-icon.png'), img: require('../img/app/app-tzgg-icon.png'),
title: '通知公告', title: '通知公告',
@@ -75,7 +80,7 @@ export default {
{ {
img: require('../img/app/app-wgyjf-icon.png'), img: require('../img/app/app-wgyjf-icon.png'),
title: '网格员积分', title: '网格员积分',
linkUrl: '/apps/AppBuilding/AppBuilding' linkUrl: './GridMemberPoints'
}, },
] ]
} }

View File

@@ -62,8 +62,8 @@ export default {
.banner-img { .banner-img {
padding: 32px 32px 16px; padding: 32px 32px 16px;
img { img {
width: 686px; width: 100%;
height: 240px; // height: 240px;
} }
} }
.content { .content {

View File

@@ -1,8 +1,11 @@
<template> <template>
<div class="Home"> <div class="Home">
<div class="tips"> <div @click="linkTo('./HelpDocs')">
<img src="../img/home/tips-icon.png" alt="">慧政务改版上线了点此查看帮助文档 <u-notice-bar mode="horizontal" :list="list"></u-notice-bar>
</div> </div>
<!-- <div class="tips">
<img src="../img/home/tips-icon.png" alt="">慧政务改版上线了点此查看帮助文档
</div> -->
<div class="content"> <div class="content">
<div class="user-info"> <div class="user-info">
<div class="left"> <div class="left">
@@ -11,7 +14,7 @@
</div> </div>
<div class="right"> <div class="right">
<p class="name">你好<AiOpenData v-if="user.wxUserId" type="userName" :openid="user.wxUserId"></AiOpenData></p> <p class="name">你好<AiOpenData v-if="user.wxUserId" type="userName" :openid="user.wxUserId"></AiOpenData></p>
<p class="time">您已加入慧政务 <span>15</span></p> <p class="time">您已加入慧政务 <span>{{ girdInfo['加入天数'] }}</span></p>
</div> </div>
</div> </div>
<div class="app-list"> <div class="app-list">
@@ -24,10 +27,10 @@
<div class="tab-content"> <div class="tab-content">
<div class="item" v-for="(item, index) in tabStatistics" :key="index"> <div class="item" v-for="(item, index) in tabStatistics" :key="index">
<p><span></span>{{ item.title }}</p> <p><span></span>{{ item.title }}</p>
<div>{{ item.num }}</div> <div>{{ girdInfo[item.key] }}</div>
</div> </div>
</div> </div>
<div class="title">居民活跃指数</div> <div class="title">消息发送情况</div>
<div class="chart-content" id="statistic"></div> <div class="chart-content" id="statistic"></div>
</div> </div>
</div> </div>
@@ -43,7 +46,7 @@ export default {
appList: [ appList: [
{ {
img: require('../img/home/home-jmgl-icon.png'), img: require('../img/home/home-jmgl-icon.png'),
title: '居民管理', title: '居民档案',
linkUrl: '/apps/AppResidentDocument/AppResidentDocument' linkUrl: '/apps/AppResidentDocument/AppResidentDocument'
}, },
{ {
@@ -57,30 +60,32 @@ export default {
linkUrl: '/apps/AppConflictMediation/AppConflictMediation' linkUrl: '/apps/AppConflictMediation/AppConflictMediation'
}, },
{ {
img: require('../img/home/home-xftj-icon.png'), img: require('../img/home/home-xtxf-icon.png'),
title: '宣发统计', title: '协同宣发',
linkUrl: '/apps/AppCooperationPropaganda/AppCooperationPropaganda' linkUrl: '/apps/AppCooperationPropaganda/AppCooperationPropaganda'
} }
], ],
tabStatistics: [ tabStatistics: [
{ {
title: '网格数', title: '网格数',
num: 15 key: '网格数'
}, },
{ {
title: '网格员数', title: '网格员数',
num: 35 key: '网格员'
}, },
{ {
title: '辖区户数', title: '辖区户数',
num: 1550 key: '辖区户数'
}, },
{ {
title: '居民群数', title: '居民群数',
num: 15 key: '居民群'
} }
], ],
echartData: null echartData: null,
list: ['慧政务改版上线了,点此查看帮助文档!'],
girdInfo: {}
} }
}, },
computed: { ...mapState(['user']) }, computed: { ...mapState(['user']) },
@@ -89,22 +94,67 @@ export default {
this.echartData = echarts.init(document.getElementById('statistic')) this.echartData = echarts.init(document.getElementById('statistic'))
var option = { var option = {
grid: { grid: {
left: '6%', left: '5%',
right: '8%', right: '5%',
bottom: '3%', bottom: '3%',
containLabel: true containLabel: true
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] boundaryGap: false,
axisLine: {
lineStyle: {
color: '#E1E5EF', //x轴的颜色
width: 1, //轴线的宽度
},
},
axisLabel: {
show: true,
textStyle: {
color: '#666',
},
},
data: ['4月', '5月', '6月', '7月', '8月',]
}, },
yAxis: { yAxis: {
type: 'value' axisLine:{ //y轴
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
textStyle: {
color: '#666',
},
},
type: 'value',
minInterval: 50,
},
tooltip: {
trigger: 'axis'
}, },
series: [ series: [
{ {
data: [150, 230, 224, 218, 135, 147, 260], data: [155, 130, 120, 160, 120, 130, 110],
type: 'line', type: 'line',
areaStyle: {//覆盖区域的渐变色
normal: {
color: {
type: 'linear',x: 0,y: 0,x2: 0,y2: 1,
colorStops: [
{
offset: 0, color: 'rgba(58,132,255, 0.8)' // 0% 处的颜色
},
{
offset: 1, color: 'rgba(58,132,255, 0)' // 100% 处的颜色
}
],
global: false // 缺省为 false
},
}
},
lineStyle: { lineStyle: {
normal: { normal: {
color: '#2891FF' color: '#2891FF'
@@ -121,10 +171,19 @@ export default {
this.echartData.setOption(option) this.echartData.setOption(option)
}, },
linkTo(url) { linkTo(url) {
console.log(url)
uni.navigateTo({ url }) uni.navigateTo({ url })
},
getGirdInfo() {
this.$http.post(`/app/appgirdmemberinfo/girdMemberOrNotStatistic`).then(res => {
if (res.code == 0) {
this.girdInfo = res.data
}
})
} }
}, },
created() { created() {
this.getGirdInfo()
this.$nextTick(() => { this.$nextTick(() => {
this.chartInit() this.chartInit()
}) })
@@ -219,7 +278,7 @@ export default {
.tab-content { .tab-content {
.item { .item {
display: inline-block; display: inline-block;
width: 336px; width: calc(50% - 8px);
height: 160px; height: 160px;
background: #FFF; background: #FFF;
box-shadow: 0 0 8px 0 rgba(0,0,0,0.0200); box-shadow: 0 0 8px 0 rgba(0,0,0,0.0200);
@@ -266,7 +325,7 @@ export default {
} }
} }
.chart-content{ .chart-content{
width: 686px; width: 100%;
height: 514px; height: 514px;
background: #FFF; background: #FFF;
box-shadow: 0 0 8px 0 rgba(0,0,0,0.0200); box-shadow: 0 0 8px 0 rgba(0,0,0,0.0200);
@@ -274,5 +333,23 @@ export default {
margin-bottom: 82px; margin-bottom: 82px;
} }
} }
::v-deep .u-type-warning-light-bg {
padding: 20px 32px!important;
background-color: #3975C6!important;
}
::v-deep .u-icon__icon--warning {
color: #D7E3F3;
width: 32px;
height: 32px;
font-size: 0px!important;
background-image: url('../img/home/tips-icon.png');
background-size: 100%;
}
::v-deep .u-type-warning {
color: #fff;
font-size: 28px;
font-family: PingFangSC-Regular, PingFang SC;
line-height: 40px;
}
} }
</style> </style>

View File

@@ -10,7 +10,7 @@
</div> </div>
<div class="bottom">{{ user.corpName }}</div> <div class="bottom">{{ user.corpName }}</div>
</div> </div>
<div class="link" v-for="(item, index) in linkList" :key="index"> <div class="link" v-for="(item, index) in linkList" :key="index" @click="linkTo(item.linkUrl)">
<div class="left"> <div class="left">
<img :src="item.img" alt="">{{ item.title }} <img :src="item.img" alt="">{{ item.title }}
</div> </div>
@@ -22,7 +22,7 @@
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapActions, mapState } from 'vuex'
export default { export default {
name: "My", name: "My",
data() { data() {
@@ -30,31 +30,46 @@ export default {
linkList: [ linkList: [
{ {
title: '头像上传', title: '头像上传',
img: require('../img/my/my-txsc.png') img: require('../img/my/my-txsc.png'),
linkUrl: './UploadPhoto'
}, },
{ {
title: '意见反馈', title: '意见反馈',
img: require('../img/my/my-yjfk.png') img: require('../img/my/my-yjfk.png'),
linkUrl: './FeedBack'
}, },
{ {
title: '联系我们', title: '联系我们',
img: require('../img/my/my-lxwm.png') img: require('../img/my/my-lxwm.png'),
linkUrl: 'contact'
}, },
{ {
title: '帮助文档', title: '帮助文档',
img: require('../img/my/my-bzwd.png') img: require('../img/my/my-bzwd.png'),
linkUrl: './HelpDocs'
} }
] ]
} }
}, },
computed: { ...mapState(['user']) }, computed: { ...mapState(['user']) },
methods: { methods: {
...mapActions(['wxInvoke', 'injectJWeixin']),
linkTo(url) { linkTo(url) {
uni.navigateTo({ url }) if(url == 'contact') { //联系我们
this.wxInvoke(["openThirdAppServiceChat", {}, res => {
if (res.err_msg == "openThirdAppServiceChat:fail") {
window.open("https://work.weixin.qq.com/kfid/kfcc23927b18d1ad4f4")
}
}])
}else {
console.log(url)
uni.navigateTo({ url })
}
} }
}, },
created() { created() {
this.injectJWeixin('openThirdAppServiceChat')
}, },
} }
</script> </script>
@@ -64,7 +79,7 @@ export default {
.content { .content {
padding: 32px 32px 0; padding: 32px 32px 0;
.user-info{ .user-info{
width: 686px; width: 100%;
height: 248px; height: 248px;
border-radius: 8px; border-radius: 8px;
background-color: #fff; background-color: #fff;

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

View File

@@ -69,7 +69,7 @@
<div class="item"> <div class="item">
<span class="label"><span class="tips"></span>所属网格</span> <span class="label"><span class="tips"></span>所属网格</span>
<div class="value"> <div class="value">
<AiPagePicker type="custom" v-model="form.girdId" @select="handleSelectGrid" <AiPagePicker type="custom" @select="handleSelectGrid"
:ops="{url:'../AppGridManagement/SelectGird',label: 'girdName'}"> :ops="{url:'../AppGridManagement/SelectGird',label: 'girdName'}">
<AiMore v-model="form.girdName"/> <AiMore v-model="form.girdName"/>
</AiPagePicker> </AiPagePicker>
@@ -158,7 +158,8 @@ export default {
address: '', address: '',
girdName: '', girdName: '',
areaId: '', areaId: '',
sex: '' sex: '',
girdId: '',
}, },
dateShow: false, dateShow: false,
deteParams: {year: true, month: true, day: true, hour: false, minute: false, second: false}, deteParams: {year: true, month: true, day: true, hour: false, minute: false, second: false},
@@ -434,7 +435,9 @@ export default {
}, },
handleSelectGrid(v) { handleSelectGrid(v) {
console.log(v)
this.form.girdName = v?.girdName || "" this.form.girdName = v?.girdName || ""
this.form.girdId = v.id
}, },
submit() { submit() {

View File

@@ -69,7 +69,7 @@
<div class="item"> <div class="item">
<span class="label"><span class="tips"></span>所属网格</span> <span class="label"><span class="tips"></span>所属网格</span>
<div class="value"> <div class="value">
<AiPagePicker type="custom" v-model="form.girdId" @select="handleSelectGrid" <AiPagePicker type="custom" @select="handleSelectGrid"
:ops="{url:'../AppGridManagement/SelectGird',label: 'girdName'}"> :ops="{url:'../AppGridManagement/SelectGird',label: 'girdName'}">
<AiMore v-model="form.girdName"/> <AiMore v-model="form.girdName"/>
</AiPagePicker> </AiPagePicker>
@@ -158,7 +158,8 @@ export default {
address: '', address: '',
girdName: '', girdName: '',
areaId: '', areaId: '',
sex: '' sex: '',
girdId: ''
}, },
dateShow: false, dateShow: false,
deteParams: {year: true, month: true, day: true, hour: false, minute: false, second: false}, deteParams: {year: true, month: true, day: true, hour: false, minute: false, second: false},
@@ -435,6 +436,7 @@ export default {
handleSelectGrid(v) { handleSelectGrid(v) {
this.form.girdName = v?.girdName || "" this.form.girdName = v?.girdName || ""
this.form.girdId = v.id
}, },
submit() { submit() {