调整工程目录

This commit is contained in:
aixianling
2021-12-15 14:37:20 +08:00
parent 76b0abe1ea
commit dd1aef6fb3
107 changed files with 17044 additions and 16746 deletions

View File

@@ -69,13 +69,23 @@ const start = () => {
}
}
findApp('src/apps', file => {
if (/.*\\.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
let app = {
name: file.replace(/.*\\([^\\]+).vue/g, '$1'),
path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/')
}
json.pages.push(app)
}
}).then(() => {
return findApp('src/sass', file => {
if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
let app = {
name: file.replace(/.*\\([^\\]+).vue/g, '$1'),
path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/')
}
json.pages.push(app)
}
})
}).then(() => {
fsExtra.outputJson('src/pages.json', json, () => {
chalkTag.done('生成pages.json')

View File

@@ -11,7 +11,8 @@
"main": "src/apps/index.js",
"files": [
"src/components",
"src/apps"
"src/apps",
"src/sass"
],
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",

View File

@@ -1,193 +0,0 @@
<template>
<div class="template-wrapper">
<div class="form-list">
<div
class="form-list__item"
@click="toAdd(index)"
:style="{'background-image': `url(${$cdn}askform/${index + 1}.png)`}"
v-for="(item, index) in itemList"
:key="index">
<h2>{{ item.name }}</h2>
<div>立即创建</div>
</div>
</div>
<div class="template" v-if="list.length">
<h2>共享模板</h2>
<div class="template-list">
<div class="template-item" v-for="(item, index) in list" :key="index" hover-class="bg-hover" @click="quote(item.id)">
<image :src="`${$cdn}askform/6.png`" />
<h2>{{ item.title }}</h2>
<u-icon name="arrow-right" color="#E1E2E3" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'addList',
label: '新建项目',
data () {
return {
itemList: [{
name: '问卷调查'
}, {
name: '考试测评'
}, {
name: '报名登记'
}, {
name: '满意调查'
}, {
name: '投票评选'
}],
list: []
}
},
mounted () {
this.getList()
},
methods: {
toAdd (type) {
this.$emit('change', {
type: 'AddForm',
params: {
type
}
})
},
quote (id) {
this.$emit('change', {
type: 'AddForm',
params: {
id,
isQuote: 1
}
})
},
getList () {
this.$http.post(`/app/appquestionnairetemplate/list`, null, {
params: {
current: 1,
templateType: 1,
size: 10000
}
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
}
})
}
}
}
</script>
<style lang="scss" scoped>
.template-wrapper {
padding-bottom: 120rpx;
.template {
margin: 32px 32px 0;
background: #fff;
border-radius: 8px;
overflow: hidden;
& > h2 {
height: 88px;
line-height: 88px;
padding: 0 24px;
color: #333333;
font-size: 30px;
}
.template-item {
display: flex;
align-items: center;
height: 104px;
padding: 0 24px;
border-bottom: 1px solid #D8DDE6;
&:active {
background-color: #eee;
}
&:last-child {
border: none;
}
image {
width: 36px;
height: 42px;
}
i {
font-size: 30px;
color: #E1E2E3;
}
h2 {
flex: 1;
padding: 0 18px;
color: #333333;
font-size: 28px;
font-weight: normal;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
}
}
.form-list {
display: flex;
flex-wrap: wrap;
padding: 0 32px 0;
div {
box-sizing: border-box;
}
.form-list__item {
width: calc(50% - 13px);
height: 216px;
margin: 32px 24px 0 0;
padding: 40px 20px 52px;
background-color: #FFFFFF;
border-radius: 8px;
background-size: 100% 100%;
&:active {
background-color: #eee;
}
&:nth-of-type(2n) {
margin-right: 0;
}
div {
width: 148px;
height: 48px;
line-height: 48px;
text-align: center;
color: #fff;
font-size: 28px;
background: #6BA1F9;
border-radius: 24px;
}
h2 {
margin-bottom: 32px;
padding-left: 10px;
color: #333333;
font-weight: 700;
font-size: 32px;
}
}
}
}
</style>

View File

@@ -1,163 +0,0 @@
export const components = [
{
type: 'radio',
label: '单选',
fixedLabel: '单选',
value: '',
points: '',
icon: 'iconradio',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'checkbox',
label: '多选',
fixedLabel: '多选',
points: '',
icon: 'iconcheck_box',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: [],
value: [],
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
},
{
dictName: '答对几项得几分,答错不得分',
dictValue: '2'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: [],
checked: false
},
{
label: '选项2',
point: '',
value: '',
img: [],
checked: false
}
],
title: ''
},
{
type: 'select',
label: '单下拉框',
fixedLabel: '单下拉框',
value: '',
points: '',
icon: 'iconSelect',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
placeholder: '请选择',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'input',
label: '单行填空',
fixedLabel: '单行填空',
value: '',
pointType: '0',
icon: 'icontext_box',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
placeholder: '请输入...',
answer: ''
},
{
type: 'textarea',
label: '多行填空',
fixedLabel: '多行填空',
pointType: '0',
icon: 'icontext_area',
points: '',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
placeholder: '请输入...',
value: ''
},
{
type: 'upload',
label: '上传图片',
fixedLabel: '上传图片',
value: '',
icon: 'iconpic',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
answer: ''
}
];

View File

@@ -1,558 +0,0 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="!list">
<div class="card">
<header>{{ detail.title }}</header>
<u-gap height="16"></u-gap>
<u-row v-if="detail.createUserId">
<!-- <u-avatar :src="$cdn + 'common/xzh.png'" v-if="false"></u-avatar>-->
<div class="u-avatar__img">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</div>
<span class="user-name">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="32"></u-gap>
<u-row>
<img :src="$cdn + 'common/meeting.png'" alt="">
<span :style="{color:color(detail.status)}">{{ $dict.getLabel('meetStatus', detail.status) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{ detail.startTime && detail.startTime.substr(0, 16) }} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row style="align-items: start;flex-wrap: nowrap;">
<img :src="$cdn + 'common/location.png'" alt="">
<span>{{ detail.address }}</span>
</u-row>
</div>
<div class="card">
<span>{{ detail.content }}</span>
</div>
<div class="card" v-if="detail.files && detail.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detail.files" @click="preFile(item)" :key="index">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.fileName }}.{{ item.postfix }}</span>
</label>
<span>{{ item.fileSizeStr }}</span>
</u-row>
</div>
</div>
<div class="card item-wrap">
<u-row justify="between">
<span>参会人</span>
<label class="right" @click="list=true">
查看全部<em>{{ detail.attendees && detail.attendees.length }}</em>
<div class="right-arrow"></div>
</label>
</u-row>
</div>
<div class="footer cancel" v-if="detail.status==1 && detail.createUserId == user.id" @click="handleCancel">取消会议
</div>
<template v-else>
<div class="footer" v-if="['1','2'].includes(detail.status) && ['0','3'].includes(detail.joinStatus)">
<div class="leave" @click="updateStatus(0)">
<img :src="$cdn + 'sass/leave.png'" alt="">请假
</div>
<div @click="toDo" class="leave">
<img :src="$cdn + 'sass/toBe.png'" alt="">待定
</div>
<div @click="updateStatus(1)">确认会议</div>
</div>
<!-- <div class="footer" v-if="['1','2'].includes(detail.status) && detail.joinStatus!=0">-->
<!-- <label>{{ detail.joinStatus|transform }}</label>-->
<!-- <img :src="$cdn + tag(detail.joinStatus)" alt="">-->
<!-- </div>-->
</template>
</template>
<template v-else>
<div class="att-list">
<AiTopFixed>
<u-tabs :list="tabs" :current="current" height="96" :is-scroll="false" bar-width="192"
@change="change"></u-tabs>
</AiTopFixed>
<div v-for="(item,index) in detail.attendees && detail.attendees.filter(e=>e.joinStatus==current)" :key="index"
class="att-wrap">
<div class="left">
<u-avatar :src="item.avatar || (($cdn + 'common/xztx.png'))" size="74" mode="square" style="margin-right: 8px"></u-avatar>
<AiOpenData type="userName" :openid="item.name"></AiOpenData>
</div>
<!-- <img :src="$cdn + 'common/phone.png'" alt="" @click="call(item)">-->
</div>
</div>
</template>
<u-modal v-model="show" title="提示" show-cancel-button content='是否要取消该会议?' @confirm="onConfirm"></u-modal>
<AiBack/>
</div>
</template>
<script>
import {mapActions, mapState} from "vuex";
export default {
name: "detail",
data() {
return {
detail: {},
list: false,
current: 0,
pageShow: false,
show: false,
id:null,
}
},
onLoad(opt){
this.id = opt.id;
},
computed: {
...mapState(["user"]),
tabs() {
return [
{name: this.count(0) + "人未确认"},
{name: this.count(1) + "人已确认"},
{name: this.count(2) + "人已请假"},
{name: this.count(3) + "人待定"},
]
},
},
methods: {
onConfirm() {
this.$http.post("/app/appmeetinginfo/cancel", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("取消成功");
this.getDetail();
}
})
},
handleCancel() {
this.show = true;
},
toDo() {
this.$http.post("/app/appmeetinginfo/tobeConfirm", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("会议待定");
setTimeout(_ => {
uni.navigateBack();
}, 800)
}
})
},
count(sta) {
return this.detail.attendees ? this.detail.attendees?.filter(e => e.joinStatus == sta)?.length : 0;
},
change(index) {
this.current = index;
this.detail = {};
this.getDetail();
},
call(item) {
if (item.phone) {
uni.makePhoneCall({
phoneNumber: item.phone
});
}
},
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
tag(status) {
return {
"1": "common/2confirmed2.png",
"2": "common/2absent2.png"
}[status]
},
updateStatus(status) {
this.$http.post(status == 0 ? "/app/appmeetinginfo/absent" : "/app/appmeetinginfo/confirm", null, {
params: {
meetingId: this.id,
reason: status == 0 ? "" : null
}
}).then(res => {
if (res.code == 0) {
this.$u.toast(status == 0 ? "请假成功" : "确认成功")
this.getDetail()
}
})
},
color(status) {
if (status == 1) {
return "#FF8822"
}
if (status == 2) {
return "#1365DD"
}
if (status == 3) {
return "#FF4466"
}
return "#343D65"
},
getDetail() {
this.$http.post("/app/appmeetinginfo/info-id", null, {
params: {id: this.id}
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.pageShow = true
}
})
}
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "会议详情";
this.$dict.load("meetStatus");
wx.hideOptionMenu();
},
filters: {
transform(status) {
if (status == 1) {
return "已确认"
}
if (status == 2) {
return "已请假"
}
}
}
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .AiTopFixed {
margin-bottom: 16px;
.content {
padding: 0 !important;
}
}
.att-list {
min-height: 100%;
.att-wrap {
display: flex;
height: 112px;
align-items: center;
justify-content: space-between;
background-color: #ffffff;
box-sizing: border-box;
padding: 0 50px;
border-bottom: 1px solid #E4E5E6;
.left {
display: flex;
align-items: center;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
.name {
font-size: 30px;
font-weight: 600;
color: #333333;
}
}
& > img {
width: 48px;
height: 48px;
}
}
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
/*margin-left: 8px;*/
}
& > span {
font-size: 30px;
color: #343D65;
margin-left: 16px;
}
::v-deep .u-avatar__img {
width: 56px;
height: 56px;
vertical-align: middle;
color: #ffffff;
background-color: #2266FF;
font-size: 16px;
}
.user-name{
font-size: 30px;
color: #343D65;
}
img {
width: 48px;
height: 48px;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
box-sizing: border-box;
padding: 16px 0;
}
.label {
height: 96px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 522px;
display: flex;
align-items: center;
& > img {
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
text-overflow: ellipsis;
overflow-x: hidden;
white-space: nowrap;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
.name {
font-size: 32px;
font-weight: 400;
color: #333333;
}
.wrap {
height: 112px;
display: flex;
align-items: center;
position: relative;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
& > label {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #4E8EEE;
font-size: 28px;
font-weight: 600;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.item-wrap {
height: 112px;
padding: 0 32px;
.u-row {
height: 100%;
& > span {
font-size: 32px;
font-weight: 400;
color: #333333;
}
}
.right {
font-size: 28px;
color: #999999;
display: flex;
align-items: center;
em {
font-style: normal;
color: #1365DD;
}
.right-arrow {
width: 16px;
height: 16px;
border-top: 5px solid #CCCCCC;
border-right: 5px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
& > div {
font-size: 28px;
color: #666666;
display:flex;
flex-direction: column;
& > img {
width: 48px;
height: 48px;
}
}
& > div:nth-child(1), & > div:nth-child(2) {
width: 135px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
& > div:last-child {
width: calc(100% - 270px);
height: 100%;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
background-color: #1365DD;
}
& > label {
font-size: 36px;
font-weight: 400;
color: #999999;
}
/*img {*/
/* width: 158px;*/
/* height: 104px;*/
/* position: absolute;*/
/* right: 0;*/
/* top: 0;*/
/*}*/
}
.cancel {
color: #ffffff;
font-size: 36px;
background-color: #005DFF
}
}
</style>

View File

@@ -1,226 +0,0 @@
<template>
<div class="meeting-list">
<div class="card" v-for="(item,index) in list" :key="index" @click="detail(item)">
<header>
<span>{{item.title}}</span>
<span>
<span v-if="index==2">保存于</span>
{{item.createTime}}</span>
</header>
<u-row justify="between">
<div class="time">
<span>{{item.startTime|format}}</span>
<span>{{item.startTime|formatDate(0)}}{{item.startTime|formatDate(1)}}{{item.startTime|formatDate(2)}} {{item.startTime|formatWeek}}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{item.endTime|format}}</span>
<span>{{item.endTime|formatDate(0)}}{{item.endTime|formatDate(1)}}{{item.endTime|formatDate(2)}} {{item.endTime|formatWeek}}</span>
</div>
</u-row>
<u-row class="info">
<span>发起人员</span>
<AiOpenData type="userName" :openid="item.createUserId"/>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{item.address}}</span>
</u-row>
<div class="tag" v-if="item.status!=0" :style="{background:'url(' + $cdn + tag(item.status) +')'}"></div>
</div>
<u-loadmore :status="status" v-if="list.length"/>
<AiEmpty v-if="!list.length"></AiEmpty>
<AiBack/>
</div>
</template>
<script>
export default {
name: "meetingList",
props: {
params: {
type: [String, Number, Object],
}
},
data() {
return {
list: [],
current: 1,
index: null,
status: "加载更多",
}
},
onLoad(opt) {
this.index = opt.index
uni.setNavigationBarTitle({
title: opt.index == 0 ? "历史会议" : "草稿箱"
});
this.getData();
},
methods: {
detail({id}) {
let url
if (this.index == 2) {
url = "/apps/AppMeetingNotice/addMeeting?id=" + id
} else {
url = "/apps/AppMeetingNotice/detail?id=" + id
}
uni.navigateTo({url})
},
tag(status) {
return {
"1": 'common/1wks.png',
"2": 'common/1jxz.png',
"3": 'common/1yqx.png',
"4": 'common/1yjs.png'
}[status]
},
getData() {
this.$http.post("/app/appmeetinginfo/list", null, {
params: {
listType: this.index == 0 ? "2" : '0',
meetingStatus: this.index == 0 ? "4" : "0",
size: 10,
current: this.current,
}
}).then(res => {
if (res && res.data) {
if (this.current > 1 && this.current > res.data.pages) {
this.status = "已经到底啦"
}
this.list = this.current > 1 ? [...this.list, ...res.data.records] : res.data.records
}
})
},
},
onReachBottom() {
this.current ++;
this.getData();
},
filters: {
format(date) {
return date.split(" ")[1].substr(0, 5)
},
formatDate(date, index) {
return date.split(" ")[0].split("-")[index]
},
formatWeek(date) {
return "日一二三四五六".charAt((new Date(date.split(" ")[0]).getDay()))
}
},
}
</script>
<style lang="scss" scoped>
.meeting-list {
min-height: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
padding: 32px;
.card {
background-color: #FFFFFF;
box-sizing: border-box;
padding: 32px;
border-radius: 8px;
margin-bottom: 32px;
position: relative;
&:last-child {
margin-bottom: 0;
}
& > header {
width: 95%;
font-size: 32px;
font-weight: 600;
color: #333333;
display: flex;
flex-direction: column;
& > span:last-child {
font-size: 28px;
font-weight: 400;
color: #999999;
margin-top: 10px;
}
}
.time {
display: flex;
flex-direction: column;
margin: 46px 0;
& > span:first-child {
font-size: 60px;
font-weight: 600;
color: #333333;
line-height: 84px;
}
& > span:last-child {
font-size: 22px;
color: #333333;
}
}
.arrow {
width: 28px;
height: 68px;
overflow: hidden;
position: relative;
transform: rotate(180deg);
&:before, &:after {
content: "";
width: 50px;
height: 50px;
position: absolute;
transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
}
&:before {
top: 59px;
background-color: #CCCCCC;
}
&:after {
left: 7px;
top: 59px;
background-color: #FFFFFF;
}
}
.info {
flex-wrap: nowrap;
& > span:first-child {
flex-shrink: 0;
font-size: 30px;
color: #999999;
}
& > span:last-child {
font-size: 30px;
color: #343D65;
}
}
.tag {
width: 112px;
height: 112px;
background-repeat: no-repeat !important;
background-size: 100% 100% !important;
position: absolute;
top: 0;
right: 0;
}
}
}
</style>

View File

@@ -1,360 +0,0 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="detailObj.status!=2">
<div class="card">
<header>{{ detailObj.title }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>发布人</span>
<span v-if="detailObj.createUserId">
<AiOpenData type="userName" :openid="detailObj.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布部门</span>
<span v-if="detailObj.unitName">
<AiOpenData type="departmentName" :openid="detailObj.unitName"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布日期</span>
<span>{{ detailObj.releaseTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
</div>
<div class="card">
<div class="label">公告内容</div>
<u-parse :html="detailObj.content"></u-parse>
</div>
<div class="card" style="padding-top: 0" v-if="detailObj.files && detailObj.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detailObj.files" :key="index" @click="preFile(item)">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.name }}.{{ item.postfix }}</span>
</label>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
<div class="card" @click="handleClick">
<u-row justify="between" class="item">
<span>接收对象</span>
<div class="right">
<em>{{ detailObj.readNum }}</em>已读
<em>{{ detailObj.unReadNum }}</em>未读
<div class="arrow"></div>
</div>
</u-row>
</div>
</template>
<AiEmpty description="该通知已撤回" v-else/>
<AiBack/>
</div>
</template>
<script>
import {mapActions} from "vuex";
export default {
name: "detail",
data() {
return {
detailObj: {},
id: null,
pageShow: false,
flag: false,
}
},
onLoad(opt) {
this.id = opt.id;
this.flag = opt.flag;
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "公告详情";
wx.hideOptionMenu();
},
methods: {
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
getDetail() {
this.$http.post("/app/appannouncement/detail", null, {
params: {
id: this.id,
detail: this.flag
}
}).then(res => {
if (res && res.data) {
this.detailObj = res.data;
this.pageShow = true
}
})
},
handleClick() {
uni.navigateTo({
url:"/apps/AppNotification/read?id=" + this.id,
})
}
},
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .content {
padding: 0;
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 22px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
}
& > span {
font-size: 30px;
color: #343D65;
line-height: 48px;
}
& > span:last-child {
font-size: 30px;
/*color: #343D65;*/
/*margin-left: 16px;*/
line-height: 48px;
}
.title {
width: 490px;
height: 112px;
display: flex;
align-items: center;
font-size: 32px;
color: #333333;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.right {
font-size: 28px;
display: flex;
align-items: center;
color: #666666;
.arrow {
width: 16px;
height: 16px;
border-top: 3px solid #CCCCCC;
border-right: 3px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.item {
position: relative;
height: 80px;
&:after {
width: 100%;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
content: "";
position: absolute;
left: 0;
bottom: 0;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
}
.label {
height: 80px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
& > em {
font-style: normal;
font-size: 32px;
color: #1365DD;
}
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 476px;
display: flex;
align-items: center;
word-break: break-all;
& > img {
flex-shrink: 0;
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
& > text {
width: 100%;
display: inline-block;
font-size: 30px;
color: #649EFD;
text-align: center;
}
.progress {
height: 12px;
background: #F2F4FC;
border-radius: 12px;
position: relative;
margin: 16px 0 64px 0;
.pro-active {
height: 12px;
background: #639EFD;
border-radius: 12px;
position: absolute;
left: 0;
top: 0;
}
}
em {
font-style: normal;
font-size: 28px;
color: #1365DD;
}
::v-deep .u-collapse {
position: relative;
&:after {
content: "";
width: 718px;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
position: absolute;
left: 0;
bottom: 0;
}
.u-collapse-head {
padding: 40px 0;
}
.u-collapse-content {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background: #1365DD;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
color: #FFFFFF;
}
}
</style>

View File

@@ -2,7 +2,8 @@
<div class="AppWalkask">
<template v-if="isList">
<div class="header-top">
<u-tabs :list="tabList" :is-scroll="false" :current="currentTabs" height="96" bg-color="#3975C6" inactive-color="#fff" active-color="#fff" @change="change"></u-tabs>
<u-tabs :list="tabList" :is-scroll="false" :current="currentTabs" height="96" bg-color="#3975C6"
inactive-color="#fff" active-color="#fff" @change="change"></u-tabs>
</div>
<div class="header-middle">
@@ -11,10 +12,13 @@
<div class="left">
<img src="./components/images/icon2.png" alt=""/>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect" style="color: #fff"> </AiAreaPicker>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect"
style="color: #fff"></AiAreaPicker>
</div>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF" search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF"
search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch"
@clear="handerClear"></u-search>
</div>
<template v-if="data.length > 0">
@@ -29,7 +33,8 @@
<div class="cards-hint">{{ item.description }}</div>
<div class="imgs">
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i" @click.stop="previewImage(item.images, items.url)" />
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i"
@click.stop="previewImage(item.images, items.url)"/>
</div>
<div class="cards-bottom">
@@ -57,10 +62,13 @@
<div class="left">
<img src="./components/images/icon2.png" alt=""/>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect" style="color: #fff"> </AiAreaPicker>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect"
style="color: #fff"></AiAreaPicker>
</div>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF" search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF"
search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch"
@clear="handerClear"></u-search>
</div>
<template v-if="data.length > 0">
@@ -75,7 +83,8 @@
<div class="cards-hint">{{ item.description }}</div>
<div class="imgs">
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i" @click.stop="previewImage(item.images, items.url)" />
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i"
@click.stop="previewImage(item.images, items.url)"/>
</div>
<div class="cards-bottom">
@@ -99,7 +108,8 @@
</div>
</div>
<u-modal v-model="deletShow" content="您确认要删除该条信息吗?" :show-cancel-button="true" :mask-close-able="true" :show-title="false" @confirm="delet"></u-modal>
<u-modal v-model="deletShow" content="您确认要删除该条信息吗?" :show-cancel-button="true" :mask-close-able="true"
:show-title="false" @confirm="delet"></u-modal>
<AiFixedBtn>
<div class="addBtn iconfont iconfont-iconfangda" @tap.stop="goDetail()"/>
@@ -152,7 +162,8 @@ export default {
this.areaId = this.user.areaId
this.getList()
},
mounted() {},
mounted() {
},
methods: {
getList() {
this.$http
@@ -247,11 +258,13 @@ export default {
<style lang="scss" scoped>
.AppWalkask {
height: 100%;
.header-middle {
.currentLeft,
.currentRight {
padding-bottom: 56px;
background: #fff;
.currentLeft-top {
display: flex;
align-items: center;
@@ -262,6 +275,7 @@ export default {
width: 40%;
display: flex;
align-items: center;
img {
width: 48px;
height: 48px;
@@ -272,6 +286,7 @@ export default {
.AiCard {
::v-deep .start {
border-bottom: 1px solid #dddddd;
.fill {
.cards-left {
.walkName {
@@ -280,6 +295,7 @@ export default {
margin-right: 16px;
color: #333;
}
.tags {
display: inline-block;
padding: 6px 16px;
@@ -290,6 +306,7 @@ export default {
margin-left: 16px;
}
}
.cards-hint {
margin-top: 16px;
font-size: 30px;
@@ -302,17 +319,21 @@ export default {
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.imgs {
margin-top: 20px;
img {
width: 221px;
height: 221px;
margin-right: 8px;
}
img:nth-child(3n + 0) {
margin-right: 0;
}
}
.cards-bottom {
margin: 24px 0 16px 0;
font-size: 24px;
@@ -341,6 +362,7 @@ export default {
color: #b7b7b7;
margin-top: 5px;
font-weight: 800;
.toAdds {
color: #467dfe;
}

View File

@@ -4,7 +4,8 @@
<div class="header-description">
<u-form :model="forms" ref="uForm" label-width="auto">
<u-form-item label="区域选择" prop="areaId" style="position: relative">
<AiAreaPicker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect" style="color: #333"> </AiAreaPicker>
<AiAreaPicker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect"
style="color: #333"></AiAreaPicker>
</u-form-item>
<u-form-item label="走访对象" prop="create_user_name" required style="position: relative">
@@ -16,18 +17,21 @@
<u-form-item label="现实状态" prop="reality" style="position: relative">
<u-input v-model="forms.reality" disabled placeholder="请选择走访慰问对象" @click="showStstus = true"/>
<u-select v-model="showStstus" :list="$dict.getDict('realityStatus')" value-name="dictValue" label-name="dictName" @confirm="realityStstus"></u-select>
<u-select v-model="showStstus" :list="$dict.getDict('realityStatus')" value-name="dictValue"
label-name="dictName" @confirm="realityStstus"></u-select>
<u-icon name="arrow-right" color="#CCCCCC" style="position: absolute; top: 25px; right: 30px"></u-icon>
</u-form-item>
<u-form-item label="入户走访事项" prop="title" required label-position="top">
<u-input v-model="forms.title" placeholder="请输入入户走访事项(30字以内)" type="textarea" auto-height height="60" maxlength="30" />
<u-input v-model="forms.title" placeholder="请输入入户走访事项(30字以内)" type="textarea" auto-height height="60"
maxlength="30"/>
<div>{{ forms.title.length }}/30</div>
</u-form-item>
<u-form-item label="入户走访内容" prop="description" label-position="top">
<u-input v-model="forms.description" placeholder="请输入入户走访事项(500字以内)" type="textarea" auto-height height="60" maxlength="500" />
<u-input v-model="forms.description" placeholder="请输入入户走访事项(500字以内)" type="textarea" auto-height height="60"
maxlength="500"/>
<div>{{ forms.description.length }}/500</div>
</u-form-item>
@@ -187,20 +191,24 @@ export default {
.add {
height: 100%;
padding-bottom: 112px;
.header-description {
::v-deep .u-form {
.u-form-item {
margin-bottom: 16px;
.u-form-item__body {
.u-form-item--right__content__slot {
padding-bottom: 0;
}
}
}
.u-form-item:last-child {
margin-bottom: 0;
padding-bottom: 20px !important;
}
.avatars {
.u-form-item__body {
.default {

View File

@@ -54,7 +54,8 @@ export default {
this.getDetail()
})
},
mounted() {},
mounted() {
},
methods: {
getDetail() {
this.$http.post(`/app/appvisitvondolence/queryDetailById?id=${this.params.id}`).then((res) => {
@@ -73,14 +74,17 @@ export default {
<style lang="scss" scoped>
.detail {
height: 100%;
.header-top {
background: #3975c6;
padding: 24px 32px 32px;
.hint {
font-size: 40px;
font-weight: 500;
color: #ffffff;
}
.walk-item {
font-size: 28px;
color: #d7e3f3;
@@ -91,17 +95,21 @@ export default {
.header-middle {
background: #fff;
padding: 32px 32px 32px 32px;
.hint-con {
font-size: 32px;
color: #666666;
}
.imgs {
margin: 32px 0 48px 0;
img {
width: 218px;
height: 218px;
margin-right: 16px;
}
img:nth-child(3n + 0) {
margin-right: 0;
}

View File

@@ -1,7 +1,8 @@
<template>
<div class="walkObject">
<div class="header-top">
<u-search v-model="keyword" placeholder="搜索" :show-action="false" bg-color="#F5F5F5" search-icon-color="#CCCCCC" placeholder-color="#999999" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" placeholder="搜索" :show-action="false" bg-color="#F5F5F5" search-icon-color="#CCCCCC"
placeholder-color="#999999" @search="handerSearch" @clear="handerClear"></u-search>
</div>
<div class="header-middle">
@@ -12,7 +13,8 @@
<div class="Checkbox">
<div v-if="DiyList.length > 0">
<u-collapse event-type="close" arrowaccordion>
<u-collapse-item v-for="(item, index) in DiyList" :title="item.menuLevel2Name" :key="index" @change="selectUser(item)">
<u-collapse-item v-for="(item, index) in DiyList" :title="item.menuLevel2Name" :key="index"
@change="selectUser(item)">
<u-radio-group v-model="value">
<u-radio v-for="(item, index) in userList" :key="index" :name="item.create_user_name">
{{ item.create_user_name }}
@@ -73,7 +75,8 @@ export default {
created() {
this.getDiyList()
},
mounted() {},
mounted() {
},
methods: {
getDiyList() {
this.$http.post('/app/appapplicationinfo/queryApplicationListByType?type=0').then((res) => {
@@ -109,6 +112,7 @@ export default {
.walkObject {
background: #ffffff;
padding-bottom: 118px;
.header-top {
background: #fff;
padding: 20px 32px;
@@ -123,10 +127,12 @@ export default {
font-size: 30px;
font-weight: 500;
}
.empty-div {
height: 16px;
background: #f5f5f5;
}
.Checkbox {
padding: 0 20px 0 30px;
@@ -153,6 +159,7 @@ export default {
width: 100%;
box-sizing: border-box;
padding: 0 32px;
.subBtn {
margin: 20px 0 18px 0;
padding: 18px 32px;
@@ -161,8 +168,10 @@ export default {
font-size: 32px;
color: #ffffff;
}
.typeName {
margin: 36px 0 22px 0;
.typeName-box {
padding: 16px 14px;
background: #eaeef1;
@@ -171,6 +180,7 @@ export default {
font-weight: 500;
margin-left: 10px;
}
.typeName-box:first-child {
margin-left: 0;
}

View File

@@ -9,9 +9,7 @@
<script>
export default {
name: "AiAdd",
props: {
},
props: {},
data() {
return {}
},
@@ -48,6 +46,7 @@
align-items: center;
flex-direction: column;
justify-content: center;
&:before, &:after {
content: "";
background: #FFFFFF;

View File

@@ -10,7 +10,8 @@
</div>
<div class="areaSelector">
<div class="fixedTop">
<span v-for="(area, i) in fullArea" :key="area.id" v-text="area.name" :class="{ current: area.id == index }" @click="selectNode(area, i)" />
<span v-for="(area, i) in fullArea" :key="area.id" v-text="area.name" :class="{ current: area.id == index }"
@click="selectNode(area, i)"/>
</div>
<span v-text="currentArea.name"/>
</div>

View File

@@ -26,13 +26,13 @@ export default {
justify-content: center;
.emptyImg {
width: 400 rpx;
height: 240 rpx;
width: 400px;
height: 240px;
margin-top: 112px;
}
.emptyText {
font-size: 29 rpx;
font-size: 29px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(183, 183, 183, 1);

View File

@@ -2,7 +2,8 @@
<view class="imt-audio">
<view class="audio-wrapper">
<view class="audio-number">{{ format(current) }}</view>
<slider class="audio-slider" :activeColor="color" block-size="16" :value="current" :max="duration || 10" @changing="seek=true,current=$event.detail.value" @change="audio.seek($event.detail.value)"></slider>
<slider class="audio-slider" :activeColor="color" block-size="16" :value="current" :max="duration || 10"
@changing="seek=true,current=$event.detail.value" @change="audio.seek($event.detail.value)"></slider>
<view class="audio-number">{{ format(duration) }}</view>
</view>
<view class="audio-control-wrapper" :style="{color}">
@@ -18,6 +19,7 @@
<script>
import stopImg from '../pages/resourcesManage/img/stop-img.png'
import playImg from '../pages/resourcesManage/img/play-icon.png'
export default {
data() {
return {

View File

@@ -19,7 +19,8 @@
<span>联系方式</span>
</div>
<div class="right">
<input placeholder="请输入" type="number" v-model="form.phone" :maxlength="11" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" type="number" v-model="form.phone" :maxlength="11"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -64,7 +65,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.move">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -78,7 +81,8 @@
<span>安置地区</span>
</div>
<div class="right">
<AiAreaPicker ref="area" class="aiArea" :areaId.sync="form.placeAreaId" mode="custom" all @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :areaId.sync="form.placeAreaId" mode="custom" all
@select="onChange">
<span class="label" v-if="form.placeArea">{{ form.placeArea }}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd"/>
@@ -223,6 +227,7 @@
.aiArea {
display: flex;
align-items: center;
.label {
color: #303133 !important;
font-size: 30px;

View File

@@ -133,7 +133,8 @@
<span>务工时长()</span>
</div>
<div class="right">
<input placeholder="请输入" type="number" v-model="form.workingMonths" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" type="number" v-model="form.workingMonths"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -147,7 +148,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.medicalInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -160,7 +163,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.sicknessInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -173,7 +178,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.endowmentInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -186,7 +193,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.subsistenceAllowance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -199,7 +208,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.destitute">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -212,6 +223,7 @@
<script>
import AiSelect from '@/components/AiSelect'
import AiDate from '@/components/AiDate'
export default {
data() {
return {

View File

@@ -47,14 +47,17 @@
</div>
<div class="item-info">
<label>监测员电话</label>
<span style="color: #3D94FB;" @click="call(info.monitoringContactPhone)">{{ info.monitoringContactPhone || '-' }}</span>
<span style="color: #3D94FB;"
@click="call(info.monitoringContactPhone)">{{ info.monitoringContactPhone || '-' }}</span>
</div>
</div>
<div class="item-wrapper">
<div class="item-header">
<div class="left">
<h2>家庭成员</h2>
<i :style="{color: info.familyList.length ? '#2EA222' : '#FF4466'}">({{ info.familyList.length ? '已填写' : '未填写' }})</i>
<i :style="{color: info.familyList.length ? '#2EA222' : '#FF4466'}">({{
info.familyList.length ? '已填写' : '未填写'
}})</i>
</div>
<span @click="linkTo('/pages/Monitor/FamilyMember?id=' + info.id)">编辑</span>
</div>
@@ -71,7 +74,9 @@
<div class="item-header">
<div class="left">
<h2>家庭情况</h2>
<i :style="{color: isFamilySituation ? '#2EA222' : '#FF4466'}">({{ isFamilySituation ? '已填写' : '未填写' }})</i>
<i :style="{color: isFamilySituation ? '#2EA222' : '#FF4466'}">({{
isFamilySituation ? '已填写' : '未填写'
}})</i>
</div>
<span @click="linkTo('/pages/Monitor/FamilySituation?id=' + info.id)">编辑</span>
</div>
@@ -132,7 +137,8 @@
</div>
<p>{{ item.detail }}</p>
<div class="imgs">
<image :src="img.url" @click="prevImg(item.imgs, img.url)" v-for="(img, index) in item.imgs" :key="index" />
<image :src="img.url" @click="prevImg(item.imgs, img.url)" v-for="(img, index) in item.imgs"
:key="index"/>
</div>
</div>
</div>
@@ -148,6 +154,7 @@
<script>
import AiFixedBtn from '@/components/AiFixedBtn'
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
name: 'detail',

View File

@@ -9,7 +9,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.dilapidatedHouse">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -22,7 +24,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.drinkingWaterSafety">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>

View File

@@ -7,7 +7,8 @@
<span>工资收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income1" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income1" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -17,7 +18,8 @@
<span>生产经营收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income2" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income2" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -27,7 +29,8 @@
<span>财产性收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income3" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income3" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -37,7 +40,8 @@
<span>转移性收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income4" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income4" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -47,7 +51,8 @@
<span>理赔收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income8" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income8" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -59,7 +64,8 @@
<span>生产经营支出</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income5" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income5" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -69,7 +75,8 @@
<span>合规自然支出</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income9" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income9" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>

View File

@@ -86,7 +86,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.isRisk" @change="onRiskChange">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>

View File

@@ -7,7 +7,8 @@
<div class="label" v-if="addressArea">{{ addressArea }}</div>
<i v-else>请选择</i>
</AiArea> -->
<AiAreaPicker ref="area" class="aiArea" :name.sync="addressArea" :areaId="areaId" mode="custom" @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :name.sync="addressArea" :areaId="areaId" mode="custom"
@select="onChange">
<span class="label" v-if="addressArea">{{ addressArea }}</span>
<i v-else>请选择</i>
</AiAreaPicker>

View File

@@ -3,7 +3,8 @@
<div class="area">
<i>可选范围</i>
<span class="separat">/</span>
<AiAreaPicker ref="area" class="aiArea" :areaId="areaId" :name.sync="addressArea" mode="custom" @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :areaId="areaId" :name.sync="addressArea" mode="custom"
@select="onChange">
<span class="label" v-if="addressArea">{{ addressArea }}</span>
<i v-else>请选择</i>
</AiAreaPicker>
@@ -200,8 +201,7 @@
const y = data.map(v => this.$dict.getLabel('fpRiskType', v.risk_type) || '其他')
const v = data.map(v => v.c)
const option = {
tooltip: {
},
tooltip: {},
color: ['#2896FF', '#09DBFE', '#61FDB9', '#FFBB69', '#8429FF', '#ea7ccc'],
grid: {
top: '4%',

View File

@@ -10,7 +10,8 @@
</span>
</div>
<div class="list">
<div class="item" v-for="(item, index) in list" :key="index" @click="linkTo('/pages/PovertyAlleviation/NewsDetail?id=' + item.id)">
<div class="item" v-for="(item, index) in list" :key="index"
@click="linkTo('/pages/PovertyAlleviation/NewsDetail?id=' + item.id)">
<div class="left">
<h2>{{ item.title }}</h2>
<div class="item-bottom">
@@ -27,6 +28,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
data() {
return {

View File

@@ -17,7 +17,8 @@
<div class="news">
<h2>最新动态</h2>
<div class="news-list">
<div class="news-item" v-for="(item, index) in list" :key="index" @click="linkTo(`/pages/PovertyAlleviation/NewsDetail?id=${item.id}`)">
<div class="news-item" v-for="(item, index) in list" :key="index"
@click="linkTo(`/pages/PovertyAlleviation/NewsDetail?id=${item.id}`)">
<div class="left">
<h2>{{ item.title }}</h2>
<div class="item-bottom">

View File

@@ -25,8 +25,11 @@
</div>
<div class="radio-content">
<div class="title">播放方式</div>
<div class="item mar-r50" :class="formData.taskType == 0 ? 'active' : ''" @click="formData.taskType = 0">立即播放<img src="./img/bigHorn-xz.png" alt=""></div>
<div class="item" :class="formData.taskType == 1 ? 'active' : ''" @click="formData.taskType = 1"><img src="./img/bigHorn-xz.png" alt="">定时播放</div>
<div class="item mar-r50" :class="formData.taskType == 0 ? 'active' : ''" @click="formData.taskType = 0">立即播放<img
src="./img/bigHorn-xz.png" alt=""></div>
<div class="item" :class="formData.taskType == 1 ? 'active' : ''" @click="formData.taskType = 1"><img
src="./img/bigHorn-xz.png" alt="">定时播放
</div>
</div>
<div class="content" v-if="formData.taskType != 0">
<div class="item">
@@ -39,13 +42,16 @@
</div>
<div class="radio-content" v-if="formData.taskType != 0 && formData.cyclingType == 2">
<div class="title">播放天数</div>
<div class="mini-item" :class="item.isCheck ? 'mini-active' : ''" v-for="(item, index) in dayList" :key="index" @click="checkClick(index)">{{item.label}}</div>
<div class="mini-item" :class="item.isCheck ? 'mini-active' : ''" v-for="(item, index) in dayList" :key="index"
@click="checkClick(index)">{{ item.label }}
</div>
</div>
<div class="content" v-if="formData.taskType != 0 && formData.cyclingType == 3">
<div class="item">
<div class="label">播放天数</div>
<div class="value">
<u-input type="text" placeholder="请输入" height="18" input-align="right" v-model="formData.broadcastDay" maxlength="4" />
<u-input type="text" placeholder="请输入" height="18" input-align="right" v-model="formData.broadcastDay"
maxlength="4"/>
</div>
</div>
</div>
@@ -73,13 +79,15 @@
</div>
</div>
<div class="btn" @click="addConfirm">确认</div>
<u-select v-model="showSelect" :list="selectList" @confirm="confirm" label-name="dictName" value-name="dictValue"></u-select>
<u-select v-model="showSelect" :list="selectList" @confirm="confirm" label-name="dictName"
value-name="dictValue"></u-select>
<u-picker v-model="showDateTime" mode="time" :params="params" @confirm="confirm"></u-picker>
<AiBack></AiBack>
</div>
</template>
<script>
import AiBack from "@/components/AiBack";
export default {
name: "addPlay",
data() {
@@ -367,9 +375,11 @@ export default {
<style lang="scss" scoped>
.addPlay {
padding-bottom: 128px;
.content {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
padding: 34px 0;
@@ -381,10 +391,12 @@ export default {
display: flex;
color: #333;
justify-content: space-between;
.label {
width: 198px;
font-size: 32px;
}
.value {
display: flex;
align-items: center;
@@ -401,6 +413,7 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
img {
width: 32px;
height: 32px;
@@ -408,15 +421,18 @@ export default {
margin-left: 6px;
}
}
.color-999 {
color: #999;
}
}
}
.radio-content {
padding: 34px 32px 38px;
border-bottom: 1px solid #ddd;
background-color: #fff;
.title {
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
@@ -424,11 +440,13 @@ export default {
color: #333;
line-height: 44px;
margin-bottom: 54px;
span {
font-size: 24px;
font-weight: 400;
}
}
.item {
display: inline-block;
width: 320px;
@@ -441,14 +459,17 @@ export default {
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333;
img {
display: none;
}
}
.active {
background: #E7F1FE;
color: #1174FE;
position: relative;
img {
display: inline-block;
position: absolute;
@@ -458,9 +479,11 @@ export default {
height: 46px;
}
}
.mar-r50 {
margin-right: 50px;
}
.mini-item {
display: inline-block;
width: 128px;
@@ -474,15 +497,18 @@ export default {
margin-right: 58px;
margin-bottom: 32px;
}
.mini-item:nth-of-type(5) {
margin-right: 0;
}
.mini-active {
background: #F2F8FE;
border: 1px solid #89B2EE;
box-sizing: border-box;
}
}
.btn {
position: fixed;
bottom: 0;

View File

@@ -19,7 +19,8 @@
</div>
</div>
<div class="banner">
<div class="item" :class="item.bgClass" v-for="(item, index) in bannerList" :key="index" @click="linkTo(item.path)">
<div class="item" :class="item.bgClass" v-for="(item, index) in bannerList" :key="index"
@click="linkTo(item.path)">
<h2>{{ item.title }}</h2>
<div>{{ item.text }}</div>
<img :src="item.imgUrl" alt="">
@@ -77,10 +78,12 @@ export default {
.bigHorn {
.header {
position: relative;
img {
width: 100%;
height: 306px;
}
.content {
width: 686px;
padding: 40px 0;
@@ -92,14 +95,17 @@ export default {
left: 50%;
transform: translateX(-50%);
display: flex;
.item {
text-align: center;
flex: 1;
img {
width: 64px;
height: 64px;
margin-bottom: 18px;
}
div {
font-size: 30px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -108,6 +114,7 @@ export default {
line-height: 42px;
margin-bottom: 10px;
}
h2 {
font-size: 40px;
font-family: DINAlternate-Bold, DINAlternate;
@@ -118,8 +125,10 @@ export default {
}
}
}
.banner {
margin-top: 150px;
.item {
width: 686px;
height: 190px;
@@ -129,6 +138,7 @@ export default {
box-sizing: border-box;
color: #FFF;
position: relative;
h2 {
font-size: 42px;
font-family: PingFangSC-Medium, PingFang SC;
@@ -136,6 +146,7 @@ export default {
line-height: 60px;
margin-bottom: 16px;
}
div {
font-size: 26px;
font-family: PingFangSC-Regular, PingFang SC;
@@ -143,6 +154,7 @@ export default {
color: #FFF;
line-height: 32px;
}
img {
width: 160px;
position: absolute;
@@ -150,15 +162,19 @@ export default {
right: 30px;
}
}
.bg-67A3F4 {
background: #67A3F4;
}
.bg-4ED5BB {
background: #4ED5BB;
}
.bg-E5B565 {
background: #E5B565;
}
.bg-F19661 {
background: #F19661;
}

View File

@@ -16,6 +16,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiBack from "@/components/AiBack";
export default {
name: "onlineList",
data() {
@@ -59,18 +60,22 @@ export default {
.record {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
border-bottom: 1px solid #ddd;
display: flex;
padding: 12px 40px 16px 0;
img {
width: 48px;
height: 48px;
margin: 12px 16px 0 0;
}
.info {
width: calc(100% - 100px);
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -79,6 +84,7 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;

View File

@@ -17,6 +17,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiBack from "@/components/AiBack";
export default {
name: "onlinePlayList",
data() {
@@ -61,18 +62,22 @@ export default {
.record {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
border-bottom: 1px solid #ddd;
display: flex;
padding: 12px 40px 16px 0;
img {
width: 48px;
height: 48px;
margin: 12px 16px 0 0;
}
.info {
width: calc(100% - 100px);
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -81,6 +86,7 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;

View File

@@ -11,7 +11,10 @@
<span>{{ item.createTime }}</span><br/>
<span>{{ item.deviceName }}</span>
</div>
<div class="btn bg-3975C6" v-if="item.broadcastStatus == 0 || item.broadcastStatus == 1 || item.broadcastStatus == 2" @click="cancel(item.broadcastId)">撤销</div>
<div class="btn bg-3975C6"
v-if="item.broadcastStatus == 0 || item.broadcastStatus == 1 || item.broadcastStatus == 2"
@click="cancel(item.broadcastId)">撤销
</div>
<div class="btn bg-AFD0FC" v-if="item.broadcastStatus == 6">已取消</div>
</div>
</div>
@@ -20,6 +23,7 @@
</template>
<script>
import AiBack from "@/components/AiBack";
export default {
name: "playList",
data() {
@@ -84,9 +88,11 @@ export default {
box-sizing: border-box;
border-bottom: 1px solid #ddd;
}
.record {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
border-bottom: 1px solid #ddd;
@@ -94,10 +100,12 @@ export default {
justify-content: space-between;
padding: 12px 40px 16px 0;
box-sizing: border-box;
.info {
width: 480px;
margin-right: 40px;
word-break: break-all;
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -106,6 +114,7 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -114,6 +123,7 @@ export default {
line-height: 32px;
}
}
.btn {
width: 154px;
height: 60px;
@@ -126,9 +136,11 @@ export default {
color: #FFF;
margin-top: 18px;
}
.bg-3975C6 {
background: #3975C6;
}
.bg-AFD0FC {
background: #AFD0FC;
}

View File

@@ -43,9 +43,7 @@ export default {
value: ''
}
},
methods: {
},
methods: {},
mounted() {
}
@@ -54,6 +52,7 @@ export default {
<style lang="scss" scoped>
.selectEquipment {
padding-bottom: 128px;
.search {
width: 100%;
height: 104px;
@@ -61,6 +60,7 @@ export default {
margin-bottom: 4px;
padding: 20px 32px;
box-sizing: border-box;
.search-bg {
width: 686px;
height: 64px;
@@ -69,6 +69,7 @@ export default {
background: #F5F5F5;
border-radius: 32px;
position: relative;
img {
width: 32px;
height: 32px;
@@ -76,6 +77,7 @@ export default {
top: 16px;
left: 32px;
}
.search-input {
width: 590px;
height: 36px;
@@ -85,23 +87,28 @@ export default {
}
}
}
.record {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
display: flex;
border-bottom: 1px solid #ddd;
.check-img {
width: 32px;
height: 32px;
margin: 32px 32px 0 0;
}
.voice-img {
width: 48px;
height: 48px;
margin: 28px 16px 0 0;
}
.info {
width: calc(100% - 148px);
padding: 18px 0;
@@ -109,6 +116,7 @@ export default {
font-size: 34px;
display: flex;
justify-content: space-between;
.text {
p {
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -116,6 +124,7 @@ export default {
color: #333;
margin-bottom: 8px;
}
span {
font-size: 26px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -124,6 +133,7 @@ export default {
line-height: 36px;
}
}
.status {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
@@ -134,6 +144,7 @@ export default {
}
}
}
.btn {
position: fixed;
bottom: 0;
@@ -144,6 +155,7 @@ export default {
border-top: 1px solid #ddd;
padding: 24px 32px 24px 0;
box-sizing: border-box;
div {
width: 192px;
height: 80px;

View File

@@ -17,13 +17,9 @@
export default {
name: "selectMp3",
data() {
return {
}
},
methods: {
return {}
},
methods: {},
mounted() {
}
@@ -32,17 +28,21 @@ export default {
<style lang="scss" scoped>
.selectMp3 {
padding-bottom: 128px;
.record {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
display: flex;
img {
width: 32px;
height: 32px;
margin: 40px 16px 0 0;
}
.info {
width: calc(100% - 60px);
padding-bottom: 16px;
@@ -57,6 +57,7 @@ export default {
}
}
}
.btn {
position: fixed;
bottom: 0;
@@ -67,6 +68,7 @@ export default {
border-top: 1px solid #ddd;
padding: 24px 32px 24px 0;
box-sizing: border-box;
div {
width: 192px;
height: 80px;

View File

@@ -6,7 +6,8 @@
type="primary"
:custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }"
@click="goBack"
>{{ btnText }}</u-button
>{{ btnText }}
</u-button
>
<back></back>
</div>

View File

@@ -16,7 +16,8 @@
<u-gap height="8"></u-gap>
<u-row>
<span>紧急程度</span>
<span :style="{color:$dict.getColor('documentEmergencyLevel',detail.emergencyLevel)}">{{$dict.getLabel("documentEmergencyLevel",detail.emergencyLevel)}}</span>
<span
:style="{color:$dict.getColor('documentEmergencyLevel',detail.emergencyLevel)}">{{ $dict.getLabel("documentEmergencyLevel", detail.emergencyLevel) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
@@ -60,8 +61,10 @@
<div class="avatar">{{ item.flowUserName && item.flowUserName.substr(-2) }}</div>
<div class="right">
<u-row justify="between">
<text class="status" :style="{color:item.readStatus==1?'#FF8822':'#1365DD'}">{{$dict.getLabel(detail.readType ==1 ? "readingStatus" :
"documentFlowStatus",detail.readType ==0 ? item.flowStatus : item.readStatus)}}
<text class="status" :style="{color:item.readStatus==1?'#FF8822':'#1365DD'}">{{
$dict.getLabel(detail.readType == 1 ? "readingStatus" :
"documentFlowStatus", detail.readType == 0 ? item.flowStatus : item.readStatus)
}}
</text>
<text class="date">{{ item.flowTime }}</text>
</u-row>
@@ -81,7 +84,9 @@
<div @click="handleClick(1)">流转</div>
</div>
<div class="footer" v-if="detail.readType==1 && detail.flowRight==1" @click="read" style="background-color: #1365DD;color: #FFFFFF">我已阅完</div>
<div class="footer" v-if="detail.readType==1 && detail.flowRight==1" @click="read"
style="background-color: #1365DD;color: #FFFFFF">我已阅完
</div>
</template>

View File

@@ -2,7 +2,8 @@
<div class="document-flow">
<ai-top-fixed>
<header class="pad">
<u-search placeholder="请输入公文名称" v-model="documentName" @clear="documentName='',getList()" @search="getList" clearabled :show-action="false" height="64"></u-search>
<u-search placeholder="请输入公文名称" v-model="documentName" @clear="documentName='',getList()" @search="getList"
clearabled :show-action="false" height="64"></u-search>
</header>
</ai-top-fixed>
<div class="list pad" v-if="list.length">

View File

@@ -55,9 +55,11 @@ export default {
::v-deep .u-drawer {
text-align: center;
.uni-scroll-view-content {
max-height: 672px;
}
.option {
font-size: 32px;
cursor: pointer;

View File

@@ -13,6 +13,7 @@
<script>
import AiBack from "../../components/AiBack";
export default {
name: "historyList",
components: {AiBack},

View File

@@ -29,7 +29,8 @@
</div>
<div class="card">
<AiUploader :multiple="true" type="file" :limit="9" placeholder="上传附件" @list="fileList" :def="form.files"></AiUploader>
<AiUploader :multiple="true" type="file" :limit="9" placeholder="上传附件" @list="fileList"
:def="form.files"></AiUploader>
</div>
<div class="card item-wrap" @click="select">
@@ -73,7 +74,8 @@
</div>
<u-picker mode="time" v-model="show" :params="params" @confirm="confirm"></u-picker>
<AiBack ref="aiBack" v-if="!userSelect"/>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.attendees" v-if="userSelect" @change="change"></AiSelectEnterprise>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.attendees" v-if="userSelect"
@change="change"></AiSelectEnterprise>
</div>
</template>

View File

@@ -17,7 +17,9 @@
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{ detail.startTime && detail.startTime.substr(0, 16) }} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
<span>{{
detail.startTime && detail.startTime.substr(0, 16)
}} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>

View File

@@ -199,6 +199,7 @@
.info {
flex-wrap: nowrap;
& > span:first-child {
flex-shrink: 0;
font-size: 30px;

View File

@@ -2,7 +2,8 @@
<div class="meeting">
<ai-top-fixed>
<u-grid :col="3" :border="false">
<u-grid-item v-for="(item,index) in grid" :key="index" :custom-style="{padding:'14px 0'}" @click="handleClick(index)">
<u-grid-item v-for="(item,index) in grid" :key="index" :custom-style="{padding:'14px 0'}"
@click="handleClick(index)">
<u-icon :name="item.icon" :size="64"></u-icon>
<view class="label">{{ item.label }}</view>
</u-grid-item>
@@ -211,6 +212,7 @@
position: absolute;
transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
}
&:before {
top: 59px;
background-color: #CCCCCC;

View File

@@ -12,7 +12,8 @@
</div>
<div class="card">
<AiUploader :multiple="true" type="image" :limit="9" placeholder="上传图片" @list="fileList" :def="form.files"></AiUploader>
<AiUploader :multiple="true" type="image" :limit="9" placeholder="上传图片" @list="fileList"
:def="form.files"></AiUploader>
</div>
<div class="card item-wrap" @click="select">
@@ -62,7 +63,8 @@
</div>
<AiBack ref="aiBack" v-if="!userSelect"/>
<u-picker v-model="show" mode="time" :params="params" @confirm="confirm"></u-picker>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.persons" v-if="userSelect" @change="change"></AiSelectEnterprise>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.persons" v-if="userSelect"
@change="change"></AiSelectEnterprise>
</div>
</template>
@@ -283,6 +285,7 @@
bottom: 0;
}
}
.active {
background-color: #E7F1FE;
color: #1174FE;

View File

@@ -8,7 +8,9 @@
<template v-if="!item.imgUrl">
<label>
<b v-if="index==0 && item.readStatus==0"></b>
<div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
<div class="tag" v-if="index==1" :style="color(item.status)">
{{ $dict.getLabel("announcementStatus", item.status) }}
</div>
{{ item.title }}
</label>
<u-gap height="16"></u-gap>
@@ -22,7 +24,9 @@
<div class="left">
<label>
<b v-if="index==0 && item.readStatus==0"></b>
<div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
<div class="tag" v-if="index==1" :style="color(item.status)">
{{ $dict.getLabel("announcementStatus", item.status) }}
</div>
{{ item.title }}
</label>
<u-gap height="16"></u-gap>
@@ -310,6 +314,7 @@
-webkit-line-clamp: 2;
}
}
& > img {
width: 192px;
height: 144px;

View File

@@ -172,6 +172,7 @@
.right {
text-align: center;
image {
width: 64px;
height: 64px;

View File

@@ -8,7 +8,9 @@
<div class="item" v-for="(item, index) in list" :key="index" hover-class="bg-hover" @click="toDetail(item.id)">
<div class="item-top">
<h2>{{ item.name || item.phone }}</h2>
<span :style="{color: item.riskEliminationMethod ? '#2EA222' : '#FF4466'}">{{ item.riskEliminationMethod ? '已解除' : '未解除' }}</span>
<span :style="{color: item.riskEliminationMethod ? '#2EA222' : '#FF4466'}">{{
item.riskEliminationMethod ? '已解除' : '未解除'
}}</span>
</div>
<p>{{ item.addressArea }} {{ item.address }}</p>
<div class="item-bottom">家庭收入</div>
@@ -20,6 +22,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
name: 'list',

View File

@@ -194,6 +194,7 @@ export default {
<style lang="scss" scoped>
.info {
padding-bottom: 130px;
.certBtn {
cursor: pointer;
background: $uni-color-primary;

View File

@@ -12,17 +12,20 @@
</div>
<div class="radio-content">
<div class="title">素材标题</div>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;" maxlength="30"></textarea>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;"
maxlength="30"></textarea>
</div>
</div>
<div v-else>
<div class="radio-content mar-b16">
<div class="title">素材标题</div>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;" maxlength="30"></textarea>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;"
maxlength="30"></textarea>
</div>
<div class="radio-content">
<div class="title">文本内容</div>
<textarea rows="8" placeholder="请输入文本内容12000字以内" v-model="content" style="width:100%;height:300px;" maxlength="12000"></textarea>
<textarea rows="8" placeholder="请输入文本内容12000字以内" v-model="content" style="width:100%;height:300px;"
maxlength="12000"></textarea>
</div>
</div>
<div class="btn" @click="confirm">确认</div>
@@ -32,6 +35,7 @@
<script>
import AiBack from "@/components/AiBack";
export default {
name: "addPlay",
data() {
@@ -118,9 +122,11 @@
<style lang="scss" scoped>
.addPlay {
padding-bottom: 128px;
.content {
padding-left: 32px;
background-color: #fff;
.item {
width: 100%;
padding: 34px 0;
@@ -132,10 +138,12 @@
display: flex;
color: #333;
justify-content: space-between;
.label {
width: 198px;
font-size: 32px;
}
.value {
font-size: 28px;
width: calc(100% - 198px);
@@ -150,14 +158,17 @@
margin-left: 6px;
}
}
.color-999 {
color: #999;
}
}
}
.radio-content {
padding: 34px 32px 38px;
background-color: #fff;
.title {
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
@@ -165,15 +176,18 @@
color: #333;
line-height: 44px;
margin-bottom: 32px;
span {
font-size: 24px;
font-weight: 400;
}
}
}
.mar-b16 {
margin-bottom: 16px;
}
.btn {
position: fixed;
bottom: 0;

View File

@@ -326,6 +326,7 @@
uni-page-body {
background-color: #fff;
}
.recording {
height: 100vh;
overflow-y: hidden;
@@ -333,11 +334,13 @@
.content {
padding-top: 310px;
text-align: center;
img {
width: 406px;
height: 306px;
margin-bottom: 48px;
}
.text {
font-size: 30px;
color: #999;
@@ -345,6 +348,7 @@
text-align: center;
}
}
.footer {
display: flex;
align-items: center;
@@ -357,6 +361,7 @@
background: #F6F8FC;
padding: 20px 86px;
box-sizing: border-box;
span {
display: inline-block;
width: 160px;
@@ -370,6 +375,7 @@
vertical-align: top;
margin-top: 30px;
}
img {
width: 128px;
height: 128px;
@@ -407,6 +413,7 @@
background: url(./img/top.png) repeat-x;
background-size: auto 6px;
}
.time {
width: 100%;
margin-top: 208px;
@@ -449,6 +456,7 @@
border-radius: 4px;
background-color: #3476EE;
}
.header-line span.line1 {
animation-delay: -1s;
}
@@ -488,6 +496,7 @@
.header-line span.line10 {
animation-delay: -0.1s;
}
.header-line span.line11 {
animation-delay: -1s;
}

View File

@@ -1,7 +1,8 @@
<template>
<div class="resourcesManage">
<div class="tab">
<u-tabs :list="tab" :is-scroll="false" :current="currIndex" @change="change" height="96" :bar-style="barStyle"></u-tabs>
<u-tabs :list="tab" :is-scroll="false" :current="currIndex" @change="change" height="96"
:bar-style="barStyle"></u-tabs>
</div>
<div class="record" v-if="currIndex == 0">
<div class="item" v-for="(item, index) in list" :key="index" @click="choose(item)">
@@ -30,6 +31,7 @@
<script>
import AiVideo from '@/components/AiVideo'
import AiBack from "@/components/AiBack";
export default {
name: "resourcesManage",
data() {
@@ -147,6 +149,7 @@
<style lang="scss" scoped>
.resourcesManage {
padding-bottom: 128px;
.tab {
border-bottom: 1px solid #ddd;
margin-bottom: 4px;
@@ -157,6 +160,7 @@
height: 400 rpx;
box-sizing: border-box;
padding: 104 rpx 0 46 rpx;
audio {
}
@@ -164,17 +168,20 @@
.record {
background-color: #fff;
.item {
width: 100%;
display: flex;
border-bottom: 1px solid #ddd;
padding: 32px 30px;
box-sizing: border-box;
img {
width: 56px;
height: 56px;
margin-right: 14px;
}
.info {
width: calc(100% - 70px);
line-height: 44px;
@@ -192,14 +199,17 @@
}
}
}
.record-text {
background-color: #fff;
.item {
width: 100%;
border-bottom: 1px solid #ddd;
padding: 32px 30px;
box-sizing: border-box;
font-size: 30px;
div {
font-size: 30px;
font-family: PingFangSC-Medium, PingFang SC;
@@ -209,16 +219,20 @@
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 12px;
.color-0063E5 {
color: #0063E5;
}
.color-FF8100 {
color: #FF8100;
}
.color-FF4466 {
color: #FF4466;
}
}
p {
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
@@ -235,6 +249,7 @@
}
}
}
.add-img {
width: 120px;
position: fixed;

View File

@@ -19,13 +19,9 @@
export default {
name: "talking",
data() {
return {
}
},
methods: {
return {}
},
methods: {},
mounted() {
}
@@ -35,6 +31,7 @@ export default {
uni-page-body {
background-color: #fff;
}
.talking {
.header {
width: 100%;
@@ -44,21 +41,26 @@ uni-page-body{
box-sizing: border-box;
display: flex;
justify-content: space-between;
p {
font-size: 32px;
color: #333;
line-height: 44px;
span {
color: #1174FE;
}
}
img {
width: 32px;
height: 32px;
}
}
.content {
margin-top: 224px;
.time {
width: 100%;
text-align: center;
@@ -66,11 +68,13 @@ uni-page-body{
color: #000000;
line-height: 134px;
}
img {
width: 406px;
height: 306px;
margin: 0 0 48px 172px;
}
.text {
font-size: 30px;
color: #999;
@@ -78,6 +82,7 @@ uni-page-body{
text-align: center;
}
}
.footer {
position: fixed;
bottom: 0;
@@ -87,6 +92,7 @@ uni-page-body{
background: #F6F8FC;
padding: 20px 310px;
box-sizing: border-box;
img {
width: 128px;
height: 128px;

View File

@@ -30,7 +30,8 @@
<text class="title">事件描述</text>
<div class="content">{{ detail.explain }}</div>
<div class="photos">
<img :src="item.url" alt="" v-for="(item,index) in detail.files" :key="index" @click.stop="previewImage(detail.files,index)">
<img :src="item.url" alt="" v-for="(item,index) in detail.files" :key="index"
@click.stop="previewImage(detail.files,index)">
</div>
<template v-if="detail.handleResult">
<u-row justify="space-between" class="result">

View File

@@ -142,6 +142,7 @@ export default {
.balance {
min-height: 100%;
background-color: #ffffff;
.operate {
height: 120px;
display: flex;

View File

@@ -2,13 +2,16 @@
<div class="result-page">
<img :src="imgSrc" alt="">
<text>{{ text }}</text>
<u-button type="primary" :custom-style="{width:'100%',borderRadius:'4px',marginTop:'48px'}" @click="goBack">{{btnText}}</u-button>
<u-button type="primary" :custom-style="{width:'100%',borderRadius:'4px',marginTop:'48px'}" @click="goBack">
{{ btnText }}
</u-button>
<back></back>
</div>
</template>
<script>
import Back from "../../../../components/AiBack";
export default {
name: "result-page",
components: {Back},

View File

@@ -49,6 +49,7 @@
<script>
import AiEmpty from "../../components/AiEmpty";
import {mapState} from "vuex";
export default {
name: "supermarket",
components: {AiEmpty},
@@ -246,10 +247,12 @@
.wrap {
display: flex;
justify-content: flex-end;
.lxc-count {
display: flex;
align-items: center;
justify-content: center;
.less {
width: 40px;
height: 40px;

View File

@@ -70,7 +70,8 @@
</div>
<div class="card" v-if="detail.processList.length">
<u-collapse>
<u-collapse-item :title="item.createDate && item.createDate.split(' ')[0]" v-for="(item, index) in detail.processList" :key="index">
<u-collapse-item :title="item.createDate && item.createDate.split(' ')[0]"
v-for="(item, index) in detail.processList" :key="index">
<template slot="info">
完成到<em>{{ item.percent }}%</em>
</template>
@@ -103,7 +104,9 @@
</template>
<ai-back></ai-back>
<div class="footer" v-if="index==1 && detail.myUserInfo.taskRole == 1 && detail.myUserInfo.doStatus==0" @click="handleClick">去完成</div>
<div class="footer" v-if="index==1 && detail.myUserInfo.taskRole == 1 && detail.myUserInfo.doStatus==0"
@click="handleClick">去完成
</div>
<div class="footer" v-if="index==2" @click="createSubTask">创建子任务</div>
</div>
</template>

View File

@@ -9,7 +9,8 @@
<span class="icon">*</span>
<span> 审批意见:</span>
</span>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="opinion" class="textarea" clearable="false"> </textarea>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="opinion" class="textarea"
clearable="false"> </textarea>
<div class="clearn" @click="clearn">清空内容</div>
<div class="msg_length">
<span class="font">{{ opinion.length }}</span>
@@ -26,7 +27,8 @@
<span class="icon" v-if="item.mustFill == 1">*</span>
<span> {{ item.fieldName }}:</span>
</span>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="item.fieldValue" class="textarea" clearable="false"> </textarea>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="item.fieldValue" class="textarea"
clearable="false"> </textarea>
<div class="clearn" @click="clearn">清空内容</div>
<div class="msg_length">
<span class="font">{{ item.fieldValue.length }}</span>
@@ -42,7 +44,8 @@
<span> {{ item.fieldName }}:</span>
</div>
<div class="left">
<u-input type="text" @click="timeSelect(index)" class="right" placeholder="请选择" disabled v-model="item.fieldValue"></u-input>
<u-input type="text" @click="timeSelect(index)" class="right" placeholder="请选择" disabled
v-model="item.fieldValue"></u-input>
</div>
</div>
</div>
@@ -56,7 +59,8 @@
<!-- 单个文件最大10MB.zip.rar.doc.docx.xls.xlsx.ppt.pptx.pdf.txt.jpg.png格式 -->
<div class="upload">
<div class="info">
<ai-uploader multiple @list="(v) => (annex = v)" :limit="9" action="/admin/file/add2" type="file" placeholder="添加文件" preview />
<ai-uploader multiple @list="(v) => (annex = v)" :limit="9" action="/admin/file/add2" type="file"
placeholder="添加文件" preview/>
</div>
</div>
</div>
@@ -119,9 +123,11 @@ export default {
// 监听
watch: {},
// 实例创建后
onShow() {},
onShow() {
},
// 实例渲染后
mounted() {},
mounted() {
},
// 方法
methods: {
timeSelect(index) {

View File

@@ -6,7 +6,8 @@
<p>审批通过:</p>
<div class="save">
<div style="display:inline">[{{ this.list.tableInfo.tableName }}]已签署完成,</div>
<ai-image preview :file="list.pdfFile" style="display:inline-block;margin-left:4px ;"><span class="clicksave">点击查看和保存</span> </ai-image>
<ai-image preview :file="list.pdfFile" style="display:inline-block;margin-left:4px ;"><span class="clicksave">点击查看和保存</span>
</ai-image>
</div>
</div>
@@ -19,7 +20,8 @@
<div class="people_msg">
<!-- 圆形头像 -->
<div class="avatar">
<span v-if="list.createUserAvatar"><img :src="list.createUserAvatar" alt="" style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-if="list.createUserAvatar"><img :src="list.createUserAvatar" alt=""
style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-else> {{ $formatName(list.createUserName) }}</span>
</div>
@@ -81,20 +83,24 @@
</div>
<!-- tabs栏 -->
<u-tabs class="tabs" :list="list_tabs" height="96" active-color="#1365dd" inactive-color="#999" bar-width="374" font-size="30" :is-scroll="false" :current="current" @change="change"></u-tabs>
<u-tabs class="tabs" :list="list_tabs" height="96" active-color="#1365dd" inactive-color="#999" bar-width="374"
font-size="30" :is-scroll="false" :current="current" @change="change"></u-tabs>
<!-- 表单申请的折叠窗 -->
<div style="background-color:#fff">
<div v-if="current == 0" class="collapse">
<u-collapse event-type="close" :arrow="true" :accordion="true">
<u-collapse-item v-if="item.length > 0" v-for="(item, index) in inforlist" :title="item[0].groupName" :key="index">
<u-collapse-item v-if="item.length > 0" v-for="(item, index) in inforlist" :title="item[0].groupName"
:key="index">
<div v-for="(items, indexs) in item" :key="indexs">
<div class="item_msg">
<!-- -->
<span class="msg_lef">{{ items.fieldName }}</span>
<!-- -->
<!-- 字典值 items.dictionaryCode -->
<span class="msg_lright" v-if="items.fieldDataType != 5">{{ $dict.getLabel(items.dictionaryCode, items.fieldValue) }}</span>
<span class="msg_lright" v-if="items.fieldDataType != 5">{{
$dict.getLabel(items.dictionaryCode, items.fieldValue)
}}</span>
<span class="msg_lright" v-else>
<span v-for="(itemL, indexL) in items.fieldValue" :key="indexL"
>{{ $dict.getLabel(items.dictionaryCode, itemL) }}
@@ -120,7 +126,8 @@
<div class="item-left-ava-icon">
<!-- 头像 -->
<div class="avatar" v-if="item.userName">
<span v-if="item.stepAvatar"><img :src="item.stepAvatar" alt="" style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-if="item.stepAvatar"><img :src="item.stepAvatar" alt=""
style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-else> {{ $formatName(item.userName) }}</span>
</div>
@@ -191,7 +198,8 @@
<div class="examine_docx1">
<!-- 图片 -->
<div class="examine_img" v-if="item.pictureFiles && item.pictureFiles.length > 0" style="">
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id" style="width: 65px;height: 75px;float: left;margin-left: 6px;margin-bottom: 4px;overflow: hidden;" />
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id"
style="width: 65px;height: 75px;float: left;margin-left: 6px;margin-bottom: 4px;overflow: hidden;"/>
</div>
<!-- 附件资料 -->
@@ -214,7 +222,8 @@
<div class="examine_docx1">
<!-- 图片 -->
<div class="examine_img" v-if="item.pictureFiles && item.pictureFiles.length > 0" style="">
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id" style="width: 69px;height: 75px;float: left;margin-left: 4px;margin-bottom: 4px;overflow: hidden;" />
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id"
style="width: 69px;height: 75px;float: left;margin-left: 4px;margin-bottom: 4px;overflow: hidden;"/>
</div>
<!-- 附件资料 -->

View File

@@ -2,7 +2,9 @@
<div class="closemsg">
<img :src="imgSrc" alt=""/>
<text>{{ text }}</text>
<u-button type="primary" :custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }" @click="goBack">{{ btnText }} </u-button>
<u-button type="primary" :custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }" @click="goBack">
{{ btnText }}
</u-button>
<back></back>
</div>
</template>

View File

@@ -2,7 +2,8 @@
<div class="workonline">
<!-- 顶部搜索 -->
<div class="search">
<u-search class="serach_content" placeholder="请输入标题" :show-action="false" v-model="keyword" @clear="search" @search="search"></u-search>
<u-search class="serach_content" placeholder="请输入标题" :show-action="false" v-model="keyword" @clear="search"
@search="search"></u-search>
</div>
<u-tabs :list="list" :is-scroll="false" :current="currentType" @change="change"></u-tabs>
@@ -22,10 +23,14 @@
<span class="item_info">审批进度</span>
<!-- 申请类型 ing -->
<span class="business_status" v-if="item.approvalStatus == 0"> {{ $dict.getLabel('listApprovalStatusHb', item.approvalStatus) }}</span>
<span class="business_status" v-if="item.approvalStatus == 0"> {{
$dict.getLabel('listApprovalStatusHb', item.approvalStatus)
}}</span>
<!-- end -->
<span class="business_status_blue" v-if="item.approvalStatus == 1"> {{ $dict.getLabel('listApprovalStatusHb', item.approvalStatus) }}</span>
<span class="business_status_blue" v-if="item.approvalStatus == 1"> {{
$dict.getLabel('listApprovalStatusHb', item.approvalStatus)
}}</span>
<!-- false -->
<span class="business_status_gray" v-if="item.approvalStatus == 2">
@@ -95,7 +100,8 @@ export default {
})
},
// 实例渲染后
mounted() {},
mounted() {
},
// 方法
methods: {
getList() {

View File

@@ -469,7 +469,7 @@ export default {
.u-checkbox__icon-wrap, .u-radio__icon-wrap {
position: absolute;
top: 4 rpx;
top: 4px;
}
.u-radio__label, .u-checkbox__label {

View File

@@ -0,0 +1,194 @@
<template>
<div class="template-wrapper">
<div class="form-list">
<div
class="form-list__item"
@click="toAdd(index)"
:style="{'background-image': `url(${$cdn}askform/${index + 1}.png)`}"
v-for="(item, index) in itemList"
:key="index">
<h2>{{ item.name }}</h2>
<div>立即创建</div>
</div>
</div>
<div class="template" v-if="list.length">
<h2>共享模板</h2>
<div class="template-list">
<div class="template-item" v-for="(item, index) in list" :key="index" hover-class="bg-hover"
@click="quote(item.id)">
<image :src="`${$cdn}askform/6.png`"/>
<h2>{{ item.title }}</h2>
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'addList',
label: '新建项目',
data() {
return {
itemList: [{
name: '问卷调查'
}, {
name: '考试测评'
}, {
name: '报名登记'
}, {
name: '满意调查'
}, {
name: '投票评选'
}],
list: []
}
},
mounted() {
this.getList()
},
methods: {
toAdd(type) {
this.$emit('change', {
type: 'AddForm',
params: {
type
}
})
},
quote(id) {
this.$emit('change', {
type: 'AddForm',
params: {
id,
isQuote: 1
}
})
},
getList() {
this.$http.post(`/app/appquestionnairetemplate/list`, null, {
params: {
current: 1,
templateType: 1,
size: 10000
}
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
}
})
}
}
}
</script>
<style lang="scss" scoped>
.template-wrapper {
padding-bottom: 120 rpx;
.template {
margin: 32px 32px 0;
background: #fff;
border-radius: 8px;
overflow: hidden;
& > h2 {
height: 88px;
line-height: 88px;
padding: 0 24px;
color: #333333;
font-size: 30px;
}
.template-item {
display: flex;
align-items: center;
height: 104px;
padding: 0 24px;
border-bottom: 1px solid #D8DDE6;
&:active {
background-color: #eee;
}
&:last-child {
border: none;
}
image {
width: 36px;
height: 42px;
}
i {
font-size: 30px;
color: #E1E2E3;
}
h2 {
flex: 1;
padding: 0 18px;
color: #333333;
font-size: 28px;
font-weight: normal;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
.form-list {
display: flex;
flex-wrap: wrap;
padding: 0 32px 0;
div {
box-sizing: border-box;
}
.form-list__item {
width: calc(50% - 13px);
height: 216px;
margin: 32px 24px 0 0;
padding: 40px 20px 52px;
background-color: #FFFFFF;
border-radius: 8px;
background-size: 100% 100%;
&:active {
background-color: #eee;
}
&:nth-of-type(2n) {
margin-right: 0;
}
div {
width: 148px;
height: 48px;
line-height: 48px;
text-align: center;
color: #fff;
font-size: 28px;
background: #6BA1F9;
border-radius: 24px;
}
h2 {
margin-bottom: 32px;
padding-left: 10px;
color: #333333;
font-weight: 700;
font-size: 32px;
}
}
}
}
</style>

View File

@@ -2,7 +2,9 @@
<div class="form-config">
<div class="config-group">
<div class="config-item">
<u-input class="form-maintitle" :maxlength="200" v-model="config.label" :placeholder="`请输入${config.fixedLabel||''}标题 ${config.required ? '(必填)' : ''}`" placeholder-style="color: #999999; font-weight: 600" />
<u-input class="form-maintitle" :maxlength="200" v-model="config.label"
:placeholder="`请输入${config.fixedLabel||''}标题 ${config.required ? '(必填)' : ''}`"
placeholder-style="color: #999999; font-weight: 600"/>
</div>
<div class="config-item__select--wrapper" v-if="['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item__select" v-for="(item, index) in config.options" :key="index">
@@ -12,7 +14,8 @@
<image v-else :src="item.img[0].url"/>
</div>
<div class="textarea">
<textarea type="textarea" placeholder-style="color: #CDCDCF" :auto-height="true" v-model="item.label" :maxlength="100" placeholder="请输入选项" />
<textarea type="textarea" placeholder-style="color: #CDCDCF" :auto-height="true" v-model="item.label"
:maxlength="100" placeholder="请输入选项"/>
</div>
</div>
<div class="config-item__select config-item__select--add" @click="addOptions">
@@ -35,7 +38,8 @@
<span>是否必填</span>
</div>
<div class="config-item__right">
<u-switch v-model="config.required" active-value="1" inactive-value="0" :size="40" active-color="#1088F9"></u-switch>
<u-switch v-model="config.required" active-value="1" inactive-value="0" :size="40"
active-color="#1088F9"></u-switch>
</div>
</div>
<div class="config-item" v-if="!['upload'].includes(config.type)">
@@ -54,7 +58,8 @@
<u-input v-model="config.answer" placeholder="请输入正确答案" input-align="right"/>
</div>
</div>
<div class="config-item" v-if="['radio', 'select'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item"
v-if="['radio', 'select'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item__left">
<span>正确答案</span>
</div>
@@ -63,7 +68,8 @@
<u-icon name="arrow-down-fill" color="#c0c4cc" size="24"></u-icon>
</div>
</div>
<div class="config-item config-item__checkbox" v-if="config.isShowPoints && ['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item config-item__checkbox"
v-if="config.isShowPoints && ['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item__left">
<span>计分方式</span>
</div>
@@ -72,13 +78,15 @@
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
<div class="config-item config-item__answer config-item__checkbox" v-if="['checkbox'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item config-item__answer config-item__checkbox"
v-if="['checkbox'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item__left">
<span>正确答案</span>
</div>
<div class="config-item__right">
<u-checkbox-group wrap @change="onCheckboxChange">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label" v-for="(field, i) in config.options" :key="i">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label"
v-for="(field, i) in config.options" :key="i">
<span>{{ field.label }}</span>
</u-checkbox>
</u-checkbox-group>
@@ -104,7 +112,8 @@
</div>
<div class="config-item config-item__point" v-if="config.isShowPoints && config.pointType === '2'">
<u-checkbox-group wrap @change="onCheckboxChange">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label" v-for="(field, i) in config.options" :key="i">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label"
v-for="(field, i) in config.options" :key="i">
<span>{{ field.label }}</span>
<u-input v-model="field.point" type="number" placeholder="请输入分值" input-align="right"/>
</u-checkbox>
@@ -119,8 +128,10 @@
</div>
</div>
</div>
<u-select :list="config.options" :default-value="defaultAnswer" value-name="value" label-name="label" v-model="isShowAnswer" @confirm="answerChange"></u-select>
<u-select :list="config.pointDict" :default-value="defaultType" value-name="dictValue" label-name="dictName" v-model="isShowType" @confirm="pointTypeChange"></u-select>
<u-select :list="config.options" :default-value="defaultAnswer" value-name="value" label-name="label"
v-model="isShowAnswer" @confirm="answerChange"></u-select>
<u-select :list="config.pointDict" :default-value="defaultType" value-name="dictValue" label-name="dictName"
v-model="isShowType" @confirm="pointTypeChange"></u-select>
<div class="add-form__footer">
<div @click="back">
<span>取消</span>
@@ -132,6 +143,7 @@
<script>
import {components} from './config'
export default {
props: ['filed', 'index', 'filedType'],
@@ -139,8 +151,7 @@ export default {
return {
isShowType: false,
isShowAnswer: false,
config: {
}
config: {}
}
},
@@ -422,6 +433,7 @@ export default {
.config-item__left {
margin-bottom: 32 rpx;
span {
word-break: break-all;
color: #333;
@@ -449,6 +461,7 @@ export default {
// justify-content: flex-end;
}
}
.config-item__point {
height: auto;
padding: 0;

View File

@@ -71,7 +71,8 @@
<div @click="confirm">{{ type === 'edit' ? '发布' : '确定' }}</div>
</div>
<u-modal v-model="isShowModal" :content="tips"></u-modal>
<u-picker mode="time" v-model="isShowTime" :show-time-tag="true" @close="isShowTime = false" @confirm="onTimeChange" :params="params"></u-picker>
<u-picker mode="time" v-model="isShowTime" :show-time-tag="true" @close="isShowTime = false" @confirm="onTimeChange"
:params="params"></u-picker>
</div>
</template>

View File

@@ -27,7 +27,7 @@
<span>{{ $dict.getLabel('questionnaireStatus', item.status) }}</span>
</div>
</div>
<div style="height: 30rpx"></div>
<u-gap/>
<AiEmpty v-if="!list.length && isMore"></AiEmpty>
</scroll-view>
<u-popup v-model="isShow" :closeable="false" mode="bottom" :z-index="11">

View File

@@ -0,0 +1,163 @@
export const components = [
{
type: 'radio',
label: '单选',
fixedLabel: '单选',
value: '',
points: '',
icon: 'iconradio',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'checkbox',
label: '多选',
fixedLabel: '多选',
points: '',
icon: 'iconcheck_box',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: [],
value: [],
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
},
{
dictName: '答对几项得几分,答错不得分',
dictValue: '2'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: [],
checked: false
},
{
label: '选项2',
point: '',
value: '',
img: [],
checked: false
}
],
title: ''
},
{
type: 'select',
label: '单下拉框',
fixedLabel: '单下拉框',
value: '',
points: '',
icon: 'iconSelect',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
placeholder: '请选择',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'input',
label: '单行填空',
fixedLabel: '单行填空',
value: '',
pointType: '0',
icon: 'icontext_box',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
placeholder: '请输入...',
answer: ''
},
{
type: 'textarea',
label: '多行填空',
fixedLabel: '多行填空',
pointType: '0',
icon: 'icontext_area',
points: '',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
placeholder: '请输入...',
value: ''
},
{
type: 'upload',
label: '上传图片',
fixedLabel: '上传图片',
value: '',
icon: 'iconpic',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
answer: ''
}
];

View File

@@ -10,12 +10,16 @@
<u-row justify="between">
<div class="time">
<span>{{ item.startTime|formatTime }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
<span>{{ item.startTime|formatDate(0) }}{{
item.startTime|formatDate(1)
}}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{ item.endTime|formatTime }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{
item.endTime|formatWeek
}}</span>
</div>
</u-row>
<u-row class="info">

View File

@@ -0,0 +1,561 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="!list">
<div class="card">
<header>{{ detail.title }}</header>
<u-gap height="16"></u-gap>
<u-row v-if="detail.createUserId">
<!-- <u-avatar :src="$cdn + 'common/xzh.png'" v-if="false"></u-avatar>-->
<div class="u-avatar__img">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</div>
<span class="user-name">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="32"></u-gap>
<u-row>
<img :src="$cdn + 'common/meeting.png'" alt="">
<span :style="{color:color(detail.status)}">{{ $dict.getLabel('meetStatus', detail.status) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{
detail.startTime && detail.startTime.substr(0, 16)
}} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row style="align-items: start;flex-wrap: nowrap;">
<img :src="$cdn + 'common/location.png'" alt="">
<span>{{ detail.address }}</span>
</u-row>
</div>
<div class="card">
<span>{{ detail.content }}</span>
</div>
<div class="card" v-if="detail.files && detail.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detail.files" @click="preFile(item)" :key="index">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.fileName }}.{{ item.postfix }}</span>
</label>
<span>{{ item.fileSizeStr }}</span>
</u-row>
</div>
</div>
<div class="card item-wrap">
<u-row justify="between">
<span>参会人</span>
<label class="right" @click="list=true">
查看全部<em>{{ detail.attendees && detail.attendees.length }}</em>
<div class="right-arrow"></div>
</label>
</u-row>
</div>
<div class="footer cancel" v-if="detail.status==1 && detail.createUserId == user.id" @click="handleCancel">取消会议
</div>
<template v-else>
<div class="footer" v-if="['1','2'].includes(detail.status) && ['0','3'].includes(detail.joinStatus)">
<div class="leave" @click="updateStatus(0)">
<img :src="$cdn + 'sass/leave.png'" alt="">请假
</div>
<div @click="toDo" class="leave">
<img :src="$cdn + 'sass/toBe.png'" alt="">待定
</div>
<div @click="updateStatus(1)">确认会议</div>
</div>
<!-- <div class="footer" v-if="['1','2'].includes(detail.status) && detail.joinStatus!=0">-->
<!-- <label>{{ detail.joinStatus|transform }}</label>-->
<!-- <img :src="$cdn + tag(detail.joinStatus)" alt="">-->
<!-- </div>-->
</template>
</template>
<template v-else>
<div class="att-list">
<AiTopFixed>
<u-tabs :list="tabs" :current="current" height="96" :is-scroll="false" bar-width="192"
@change="change"></u-tabs>
</AiTopFixed>
<div v-for="(item,index) in detail.attendees && detail.attendees.filter(e=>e.joinStatus==current)" :key="index"
class="att-wrap">
<div class="left">
<u-avatar :src="item.avatar || (($cdn + 'common/xztx.png'))" size="74" mode="square"
style="margin-right: 8px"></u-avatar>
<AiOpenData type="userName" :openid="item.name"></AiOpenData>
</div>
<!-- <img :src="$cdn + 'common/phone.png'" alt="" @click="call(item)">-->
</div>
</div>
</template>
<u-modal v-model="show" title="提示" show-cancel-button content='是否要取消该会议?' @confirm="onConfirm"></u-modal>
<AiBack/>
</div>
</template>
<script>
import {mapActions, mapState} from "vuex";
export default {
name: "detail",
data() {
return {
detail: {},
list: false,
current: 0,
pageShow: false,
show: false,
id: null,
}
},
onLoad(opt) {
this.id = opt.id;
},
computed: {
...mapState(["user"]),
tabs() {
return [
{name: this.count(0) + "人未确认"},
{name: this.count(1) + "人已确认"},
{name: this.count(2) + "人已请假"},
{name: this.count(3) + "人待定"},
]
},
},
methods: {
onConfirm() {
this.$http.post("/app/appmeetinginfo/cancel", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("取消成功");
this.getDetail();
}
})
},
handleCancel() {
this.show = true;
},
toDo() {
this.$http.post("/app/appmeetinginfo/tobeConfirm", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("会议待定");
setTimeout(_ => {
uni.navigateBack();
}, 800)
}
})
},
count(sta) {
return this.detail.attendees ? this.detail.attendees?.filter(e => e.joinStatus == sta)?.length : 0;
},
change(index) {
this.current = index;
this.detail = {};
this.getDetail();
},
call(item) {
if (item.phone) {
uni.makePhoneCall({
phoneNumber: item.phone
});
}
},
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
tag(status) {
return {
"1": "common/2confirmed2.png",
"2": "common/2absent2.png"
}[status]
},
updateStatus(status) {
this.$http.post(status == 0 ? "/app/appmeetinginfo/absent" : "/app/appmeetinginfo/confirm", null, {
params: {
meetingId: this.id,
reason: status == 0 ? "" : null
}
}).then(res => {
if (res.code == 0) {
this.$u.toast(status == 0 ? "请假成功" : "确认成功")
this.getDetail()
}
})
},
color(status) {
if (status == 1) {
return "#FF8822"
}
if (status == 2) {
return "#1365DD"
}
if (status == 3) {
return "#FF4466"
}
return "#343D65"
},
getDetail() {
this.$http.post("/app/appmeetinginfo/info-id", null, {
params: {id: this.id}
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.pageShow = true
}
})
}
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "会议详情";
this.$dict.load("meetStatus");
wx.hideOptionMenu();
},
filters: {
transform(status) {
if (status == 1) {
return "已确认"
}
if (status == 2) {
return "已请假"
}
}
}
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .AiTopFixed {
margin-bottom: 16px;
.content {
padding: 0 !important;
}
}
.att-list {
min-height: 100%;
.att-wrap {
display: flex;
height: 112px;
align-items: center;
justify-content: space-between;
background-color: #ffffff;
box-sizing: border-box;
padding: 0 50px;
border-bottom: 1px solid #E4E5E6;
.left {
display: flex;
align-items: center;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
.name {
font-size: 30px;
font-weight: 600;
color: #333333;
}
}
& > img {
width: 48px;
height: 48px;
}
}
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
/*margin-left: 8px;*/
}
& > span {
font-size: 30px;
color: #343D65;
margin-left: 16px;
}
::v-deep .u-avatar__img {
width: 56px;
height: 56px;
vertical-align: middle;
color: #ffffff;
background-color: #2266FF;
font-size: 16px;
}
.user-name {
font-size: 30px;
color: #343D65;
}
img {
width: 48px;
height: 48px;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
box-sizing: border-box;
padding: 16px 0;
}
.label {
height: 96px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 522px;
display: flex;
align-items: center;
& > img {
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
text-overflow: ellipsis;
overflow-x: hidden;
white-space: nowrap;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
.name {
font-size: 32px;
font-weight: 400;
color: #333333;
}
.wrap {
height: 112px;
display: flex;
align-items: center;
position: relative;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
& > label {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #4E8EEE;
font-size: 28px;
font-weight: 600;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.item-wrap {
height: 112px;
padding: 0 32px;
.u-row {
height: 100%;
& > span {
font-size: 32px;
font-weight: 400;
color: #333333;
}
}
.right {
font-size: 28px;
color: #999999;
display: flex;
align-items: center;
em {
font-style: normal;
color: #1365DD;
}
.right-arrow {
width: 16px;
height: 16px;
border-top: 5px solid #CCCCCC;
border-right: 5px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
& > div {
font-size: 28px;
color: #666666;
display: flex;
flex-direction: column;
& > img {
width: 48px;
height: 48px;
}
}
& > div:nth-child(1), & > div:nth-child(2) {
width: 135px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
& > div:last-child {
width: calc(100% - 270px);
height: 100%;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
background-color: #1365DD;
}
& > label {
font-size: 36px;
font-weight: 400;
color: #999999;
}
/*img {*/
/* width: 158px;*/
/* height: 104px;*/
/* position: absolute;*/
/* right: 0;*/
/* top: 0;*/
/*}*/
}
.cancel {
color: #ffffff;
font-size: 36px;
background-color: #005DFF
}
}
</style>

View File

@@ -0,0 +1,226 @@
<template>
<div class="meeting-list">
<div class="card" v-for="(item,index) in list" :key="index" @click="detail(item)">
<header>
<span>{{ item.title }}</span>
<span>
<span v-if="index==2">保存于</span>
{{ item.createTime }}</span>
</header>
<u-row justify="between">
<div class="time">
<span>{{ item.startTime|format }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{ item.endTime|format }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
</div>
</u-row>
<u-row class="info">
<span>发起人员</span>
<AiOpenData type="userName" :openid="item.createUserId"/>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{ item.address }}</span>
</u-row>
<div class="tag" v-if="item.status!=0" :style="{background:'url(' + $cdn + tag(item.status) +')'}"></div>
</div>
<u-loadmore :status="status" v-if="list.length"/>
<AiEmpty v-if="!list.length"></AiEmpty>
<AiBack/>
</div>
</template>
<script>
export default {
name: "meetingList",
props: {
params: {
type: [String, Number, Object],
}
},
data() {
return {
list: [],
current: 1,
index: null,
status: "加载更多",
}
},
onLoad(opt) {
this.index = opt.index
uni.setNavigationBarTitle({
title: opt.index == 0 ? "历史会议" : "草稿箱"
});
this.getData();
},
methods: {
detail({id}) {
let url
if (this.index == 2) {
url = "/apps/AppMeetingNotice/addMeeting?id=" + id
} else {
url = "/apps/AppMeetingNotice/detail?id=" + id
}
uni.navigateTo({url})
},
tag(status) {
return {
"1": 'common/1wks.png',
"2": 'common/1jxz.png',
"3": 'common/1yqx.png',
"4": 'common/1yjs.png'
}[status]
},
getData() {
this.$http.post("/app/appmeetinginfo/list", null, {
params: {
listType: this.index == 0 ? "2" : '0',
meetingStatus: this.index == 0 ? "4" : "0",
size: 10,
current: this.current,
}
}).then(res => {
if (res && res.data) {
if (this.current > 1 && this.current > res.data.pages) {
this.status = "已经到底啦"
}
this.list = this.current > 1 ? [...this.list, ...res.data.records] : res.data.records
}
})
},
},
onReachBottom() {
this.current++;
this.getData();
},
filters: {
format(date) {
return date.split(" ")[1].substr(0, 5)
},
formatDate(date, index) {
return date.split(" ")[0].split("-")[index]
},
formatWeek(date) {
return "日一二三四五六".charAt((new Date(date.split(" ")[0]).getDay()))
}
},
}
</script>
<style lang="scss" scoped>
.meeting-list {
min-height: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
padding: 32px;
.card {
background-color: #FFFFFF;
box-sizing: border-box;
padding: 32px;
border-radius: 8px;
margin-bottom: 32px;
position: relative;
&:last-child {
margin-bottom: 0;
}
& > header {
width: 95%;
font-size: 32px;
font-weight: 600;
color: #333333;
display: flex;
flex-direction: column;
& > span:last-child {
font-size: 28px;
font-weight: 400;
color: #999999;
margin-top: 10px;
}
}
.time {
display: flex;
flex-direction: column;
margin: 46px 0;
& > span:first-child {
font-size: 60px;
font-weight: 600;
color: #333333;
line-height: 84px;
}
& > span:last-child {
font-size: 22px;
color: #333333;
}
}
.arrow {
width: 28px;
height: 68px;
overflow: hidden;
position: relative;
transform: rotate(180deg);
&:before, &:after {
content: "";
width: 50px;
height: 50px;
position: absolute;
transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
}
&:before {
top: 59px;
background-color: #CCCCCC;
}
&:after {
left: 7px;
top: 59px;
background-color: #FFFFFF;
}
}
.info {
flex-wrap: nowrap;
& > span:first-child {
flex-shrink: 0;
font-size: 30px;
color: #999999;
}
& > span:last-child {
font-size: 30px;
color: #343D65;
}
}
.tag {
width: 112px;
height: 112px;
background-repeat: no-repeat !important;
background-size: 100% 100% !important;
position: absolute;
top: 0;
right: 0;
}
}
}
</style>

View File

@@ -0,0 +1,360 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="detailObj.status!=2">
<div class="card">
<header>{{ detailObj.title }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>发布人</span>
<span v-if="detailObj.createUserId">
<AiOpenData type="userName" :openid="detailObj.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布部门</span>
<span v-if="detailObj.unitName">
<AiOpenData type="departmentName" :openid="detailObj.unitName"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布日期</span>
<span>{{ detailObj.releaseTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
</div>
<div class="card">
<div class="label">公告内容</div>
<u-parse :html="detailObj.content"></u-parse>
</div>
<div class="card" style="padding-top: 0" v-if="detailObj.files && detailObj.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detailObj.files" :key="index" @click="preFile(item)">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.name }}.{{ item.postfix }}</span>
</label>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
<div class="card" @click="handleClick">
<u-row justify="between" class="item">
<span>接收对象</span>
<div class="right">
<em>{{ detailObj.readNum }}</em>已读
<em>{{ detailObj.unReadNum }}</em>未读
<div class="arrow"></div>
</div>
</u-row>
</div>
</template>
<AiEmpty description="该通知已撤回" v-else/>
<AiBack/>
</div>
</template>
<script>
import {mapActions} from "vuex";
export default {
name: "detail",
data() {
return {
detailObj: {},
id: null,
pageShow: false,
flag: false,
}
},
onLoad(opt) {
this.id = opt.id;
this.flag = opt.flag;
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "公告详情";
wx.hideOptionMenu();
},
methods: {
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
getDetail() {
this.$http.post("/app/appannouncement/detail", null, {
params: {
id: this.id,
detail: this.flag
}
}).then(res => {
if (res && res.data) {
this.detailObj = res.data;
this.pageShow = true
}
})
},
handleClick() {
uni.navigateTo({
url: "/apps/AppNotification/read?id=" + this.id,
})
}
},
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .content {
padding: 0;
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 22px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
}
& > span {
font-size: 30px;
color: #343D65;
line-height: 48px;
}
& > span:last-child {
font-size: 30px;
/*color: #343D65;*/
/*margin-left: 16px;*/
line-height: 48px;
}
.title {
width: 490px;
height: 112px;
display: flex;
align-items: center;
font-size: 32px;
color: #333333;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.right {
font-size: 28px;
display: flex;
align-items: center;
color: #666666;
.arrow {
width: 16px;
height: 16px;
border-top: 3px solid #CCCCCC;
border-right: 3px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.item {
position: relative;
height: 80px;
&:after {
width: 100%;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
content: "";
position: absolute;
left: 0;
bottom: 0;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
}
.label {
height: 80px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
& > em {
font-style: normal;
font-size: 32px;
color: #1365DD;
}
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 476px;
display: flex;
align-items: center;
word-break: break-all;
& > img {
flex-shrink: 0;
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
& > text {
width: 100%;
display: inline-block;
font-size: 30px;
color: #649EFD;
text-align: center;
}
.progress {
height: 12px;
background: #F2F4FC;
border-radius: 12px;
position: relative;
margin: 16px 0 64px 0;
.pro-active {
height: 12px;
background: #639EFD;
border-radius: 12px;
position: absolute;
left: 0;
top: 0;
}
}
em {
font-style: normal;
font-size: 28px;
color: #1365DD;
}
::v-deep .u-collapse {
position: relative;
&:after {
content: "";
width: 718px;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
position: absolute;
left: 0;
bottom: 0;
}
.u-collapse-head {
padding: 40px 0;
}
.u-collapse-content {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background: #1365DD;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
color: #FFFFFF;
}
}
</style>

View File

@@ -2,12 +2,10 @@
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory();
}
else if (typeof define === "function" && define.amd) {
} else if (typeof define === "function" && define.amd) {
// AMD
define([], factory);
}
else {
} else {
// Global (browser)
root.CryptoJS = factory();
}
@@ -41,7 +39,8 @@
if (!crypto && typeof require === 'function') {
try {
crypto = require('crypto');
} catch (err) {}
} catch (err) {
}
}
/*
@@ -55,14 +54,16 @@
if (typeof crypto.getRandomValues === 'function') {
try {
return crypto.getRandomValues(new Uint32Array(1))[0];
} catch (err) {}
} catch (err) {
}
}
// Use randomBytes method (NodeJS)
if (typeof crypto.randomBytes === 'function') {
try {
return crypto.randomBytes(4).readInt32LE();
} catch (err) {}
} catch (err) {
}
}
}
@@ -74,7 +75,8 @@
*/
var create = Object.create || (function () {
function F() {}
function F() {
}
return function (obj) {
var subtype;
@@ -4311,8 +4313,7 @@
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
// Pad
data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
},
unpad: function (data) {
@@ -5549,8 +5550,7 @@
CryptoJS.mode.CTRGladman = (function () {
var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
function incWord(word)
{
function incWord(word) {
if (((word >> 24) & 0xff) === 0xff) { //overflow
var b1 = (word >> 16) & 0xff;
var b2 = (word >> 8) & 0xff;
@@ -5559,25 +5559,17 @@
if (b1 === 0xff) // overflow b1
{
b1 = 0;
if (b2 === 0xff)
{
if (b2 === 0xff) {
b2 = 0;
if (b3 === 0xff)
{
if (b3 === 0xff) {
b3 = 0;
}
else
{
} else {
++b3;
}
}
else
{
} else {
++b2;
}
}
else
{
} else {
++b1;
}
@@ -5585,18 +5577,14 @@
word += (b1 << 16);
word += (b2 << 8);
word += b3;
}
else
{
} else {
word += (0x01 << 24);
}
return word;
}
function incCounter(counter)
{
if ((counter[0] = incWord(counter[0])) === 0)
{
function incCounter(counter) {
if ((counter[0] = incWord(counter[0])) === 0) {
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
counter[1] = incWord(counter[1]);
}
@@ -5637,8 +5625,6 @@
}());
(function () {
// Shortcuts
var C = CryptoJS;