Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
wanglei
2021-12-13 10:52:05 +08:00
14 changed files with 109 additions and 277 deletions

View File

@@ -56,20 +56,20 @@ const start = () => {
chalkTag.info('开始生成pages.json...') chalkTag.info('开始生成pages.json...')
let json = { let json = {
easycom: { easycom: {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue",
"^(Ai|V)(.*)": "@/components/$1$2.vue"
}, },
pages: [ pages: [
{path: 'pages/loading'}, {path: 'pages/loading'},
{path: 'pages/login'}, {path: 'pages/login'}
{path: 'pages/mainEntry', style: {navigationBarTitleText: "村微产品应用库"}}
], ],
globalStyle: { globalStyle: {
pageOrientation: "auto", pageOrientation: "auto",
navigationStyle: "custom" navigationStyle: "custom"
} }
} }
findApp('src/utils', file => { findApp('src/apps', file => {
if (/.*\\.+\\App[^\\]+\.vue/g.test(file)) { if (/.*\\.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
let app = { let app = {
name: file.replace(/.*\\([^\\]+).vue/g, '$1'), name: file.replace(/.*\\([^\\]+).vue/g, '$1'),
path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/') path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/')

View File

@@ -48,6 +48,7 @@ body {
uni-page-body { uni-page-body {
// min-height: 100%; // min-height: 100%;
min-height: 100vh;
background: #f5f5f5; background: #f5f5f5;
position: relative; position: relative;
} }

View File

@@ -9,7 +9,7 @@
<script> <script>
import {mapActions, mapState} from "vuex"; import {mapActions, mapState} from "vuex";
import FormDetail from "./formDetail"; import FormDetail from "./components/formDetail";
import AiResult from "../../components/AiResult"; import AiResult from "../../components/AiResult";
export default { export default {

View File

@@ -66,13 +66,13 @@
<script> <script>
import {mapState} from "vuex"; import {mapState} from "vuex";
import AiTextarea from "../../components/AiTextarea"; import AiTextarea from "../../../components/AiTextarea";
import AiUploader from "../../components/AiUploader"; import AiUploader from "../../../components/AiUploader";
import AiSelect from "../../components/AiSelect"; import AiSelect from "../../../components/AiSelect";
import AiLoading from "../../components/AiLoading"; import AiLoading from "../../../components/AiLoading";
import AiResult from "../../components/AiResult"; import AiResult from "../../../components/AiResult";
import AiImage from "../../components/AiImage"; import AiImage from "../../../components/AiImage";
import AiBack from "../../components/AiBack"; import AiBack from "../../../components/AiBack";
export default { export default {
name: "formDetail", name: "formDetail",

View File

@@ -1,20 +1,19 @@
<template> <template>
<div class="AppInterview"> <div class="AppInterview">
<template v-if="!showDetail"> <AiTopFixed>
<ai-top-fixed>
<div flex> <div flex>
<ai-date placeholder="日期选择" mode="range" @change="handleDateSearch"/> <AiDate placeholder="日期选择" mode="range" @change="handleDateSearch"/>
<u-search placeholder="请输入标题" :show-action="false" v-model="search.title" @search="current=1,getList()"/> <u-search placeholder="请输入标题" :show-action="false" v-model="search.title" @search="current=1,getList()"/>
</div> </div>
</ai-top-fixed> </AiTopFixed>
<template v-if="list.length>0"> <template v-if="list.length>0">
<ai-card :ref="'aiCard' + index" v-for="(e,index) in list" :key="index" @click.native="goDetail(e.id,1)"> <AiCard :ref="'aiCard' + index" v-for="(e,index) in list" :key="index" @click.native="goDetail(e.id,1)">
<template #custom> <template #custom>
<div flex> <div flex>
<b class="fill">{{ e.title }}</b> <b class="fill">{{ e.title }}</b>
</div> </div>
<div flex v-if="!!e.fileList" class="wrap" @click.stop> <div flex v-if="!!e.fileList" class="wrap" @click.stop>
<ai-image v-for="(op,i) in e.fileList.slice(0,3)" :src="op.accessUrl" preview :key="i"/> <AiImage v-for="(op,i) in e.fileList.slice(0,3)" :src="op.accessUrl" preview :key="i"/>
</div> </div>
<div class="bottom">{{ e.createTime }}</div> <div class="bottom">{{ e.createTime }}</div>
</template> </template>
@@ -22,7 +21,7 @@
<div class="menu" @tap.stop="goDetail(e.id)">编辑</div> <div class="menu" @tap.stop="goDetail(e.id)">编辑</div>
<div class="menu" @tap.stop="handleDelete(e.id, index)">删除</div> <div class="menu" @tap.stop="handleDelete(e.id, index)">删除</div>
</template> </template>
</ai-card> </AiCard>
<u-loadmore :status="loadmore" color="#999" font-size="24" <u-loadmore :status="loadmore" color="#999" font-size="24"
margin-top="32" margin-bottom="80"/> margin-top="32" margin-bottom="80"/>
</template> </template>
@@ -30,23 +29,14 @@
<image src="https://cdn.cunwuyun.cn/wxAdmin/img/message.png"/> <image src="https://cdn.cunwuyun.cn/wxAdmin/img/message.png"/>
<p>您还未添加过入户调查走访<br>点击<b>新增按钮</b>试试吧~</p> <p>您还未添加过入户调查走访<br>点击<b>新增按钮</b>试试吧~</p>
</div> </div>
<ai-fixed-btn> <AiFixedBtn>
<div class="addBtn iconfont iconfont-iconfangda" @tap="gotoAdd()"/> <div class="addBtn iconfont iconfont-iconfangda" @tap="gotoAdd()"/>
</ai-fixed-btn> </AiFixedBtn>
</template>
<interview-detail v-else/>
</div> </div>
</template> </template>
<script> <script>
import AiSelect from "../../components/AiSelect"; import qs from "query-string"
import AiTopFixed from "../../components/AiTopFixed";
import AiCard from "../../components/AiCard";
import AiImage from "../../components/AiImage";
import AiDate from "../../components/AiDate";
import AiFixedBtn from "../../components/AiFixedBtn";
import InterviewDetail from "./interviewDetail";
import AiBack from "../../components/AiBack";
export default { export default {
name: "AppInterview", name: "AppInterview",
@@ -54,7 +44,6 @@ export default {
inject: { inject: {
root: {} root: {}
}, },
components: {AiBack, InterviewDetail, AiFixedBtn, AiDate, AiImage, AiCard, AiTopFixed, AiSelect},
data() { data() {
return { return {
search: {title: ""}, search: {title: ""},
@@ -66,25 +55,9 @@ export default {
computed: { computed: {
loadmore() { loadmore() {
return this.pages <= this.current ? 'loading ' : 'nomore' return this.pages <= this.current ? 'loading ' : 'nomore'
},
showDetail() {
return this.$route.hash == "#add"
} }
}, },
methods: { methods: {
emitShow() {
document.title = "调查走访"
if (this.showDetail) {
document.title = this.$route.query.detail ? "走访详情" : "新增走访"
} else {
this.current = 1;
this.getList()
}
},
emitReachBottom() {
this.current++;
this.getList()
},
getList() { getList() {
this.$http.post('/app/appinterview/list-xcx', null, { this.$http.post('/app/appinterview/list-xcx', null, {
params: { params: {
@@ -102,10 +75,10 @@ export default {
goDetail(id, readonly) { goDetail(id, readonly) {
let query = {id} let query = {id}
readonly && (query.detail = 1) readonly && (query.detail = 1)
this.root.goto({hash: "#add", query}) uni.navigateTo({url: `./interviewDetail?${qs.stringify(query)}`})
}, },
gotoAdd() { gotoAdd() {
this.root.goto({hash: "#add"}) uni.navigateTo({url: `./interviewDetail`})
}, },
handleDelete(ids, index) { handleDelete(ids, index) {
this.$refs[`aiCard${index}`][0].handleClose() this.$refs[`aiCard${index}`][0].handleClose()
@@ -126,7 +99,16 @@ export default {
this.current = 1 this.current = 1
this.getList() this.getList()
} }
} },
onShow() {
document.title = "调查走访"
this.current = 1;
this.getList()
},
onReachBottom() {
this.current++;
this.getList()
},
} }
</script> </script>

View File

@@ -133,8 +133,8 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import AiEmpty from '../../components/AiEmpty.vue' import AiEmpty from '../../components/AiEmpty.vue'
import add from './components/add.vue' import add from './add.vue'
import detail from './components/detail.vue' import detail from './detail.vue'
import AiAreaPicker from '../../components/AiAreaPicker.vue' import AiAreaPicker from '../../components/AiAreaPicker.vue'
export default { export default {

View File

@@ -9,9 +9,9 @@
<ai-area-picker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect" style="color: #333"> </ai-area-picker> <ai-area-picker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect" style="color: #333"> </ai-area-picker>
</u-form-item> </u-form-item>
<u-form-item label="走访对象" prop="applicationId" required style="position: relative"> <u-form-item label="走访对象" prop="application" required style="position: relative">
<u-input v-model="forms.applicationId" disabled placeholder="请选择走访对象" @click="toWalkObject" /> <u-input v-model="forms.application" disabled placeholder="请选择走访对象" @click="handerSelecUser" />
<!-- @click="showObject = true" --> <!-- @click="showObject = true" @click="toWalkObject" -->
<u-select v-model="showObject" :list="Objectlist" @confirm="applicaStatus"></u-select> <u-select v-model="showObject" :list="Objectlist" @confirm="applicaStatus"></u-select>
@@ -54,10 +54,10 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import AiUploader from '../../../components/AiUploader.vue' import { mapActions } from 'vuex'
import AiBack from '../../../components/AiBack.vue' import AiUploader from '../../components/AiUploader.vue'
import walkObject from './walkObject.vue' import AiBack from '../../components/AiBack.vue'
import AiAreaPicker from '../../../components/AiAreaPicker' import AiAreaPicker from '../../components/AiAreaPicker'
export default { export default {
name: 'add', name: 'add',
@@ -70,7 +70,7 @@ export default {
}, },
forms: { forms: {
areaId: '', areaId: '',
applicationId: '', application: '',
reality: '', reality: '',
realityValue: '', realityValue: '',
title: '', title: '',
@@ -89,6 +89,7 @@ export default {
flag: false, flag: false,
addList: true, addList: true,
areaIdProps: '', areaIdProps: '',
clickedUserSelect: false,
} }
}, },
computed: { ...mapState(['user']) }, computed: { ...mapState(['user']) },
@@ -98,13 +99,34 @@ export default {
}, },
mounted() {}, mounted() {},
methods: { methods: {
...mapActions(['selectEnterpriseContact']),
handerSelecUser() {
console.log(this.clickedUserSelect)
if (this.clickedUserSelect) return this.$u.toast('正在打开人员选择器')
this.clickedUserSelect = true
this.selectEnterpriseContact({
fromDepartmentId: 0,
type: ['user'],
optionId: this.forms.application?.map((e) => e.id),
})
.then((res) => {
// this.change(res?.userList || [])
this.clickedUserSelect = false
})
.catch(() => {
this.clickedUserSelect = false
})
},
submit() { submit() {
console.log(1) console.log(1)
if (this.flag) return if (this.flag) return
this.$refs.uForm.validate((valid) => { this.$refs.uForm.validate((valid) => {
if (valid) { if (valid) {
if (!this.forms.applicationId) { if (!this.forms.application) {
return this.$u.toast('请选择走访对象') return this.$u.toast('请选择走访对象')
} }
if (!this.forms.title) { if (!this.forms.title) {
@@ -125,7 +147,7 @@ export default {
this.$instance this.$instance
.post(`/appjobresume/addOrUpdate`, { .post(`/appjobresume/addOrUpdate`, {
areaId: this.forms.areaId, areaId: this.forms.areaId,
applicationId: '8883942d30aa4b76b33de1660d4870e4', applicationId: '',
// object: this.forms.object, // object: this.forms.object,
reality: this.forms.reality == Number ? this.forms.reality : this.forms.realitylabel, reality: this.forms.reality == Number ? this.forms.reality : this.forms.realitylabel,
title: this.forms.title, title: this.forms.title,
@@ -191,6 +213,7 @@ export default {
::v-deep .u-form { ::v-deep .u-form {
.u-form-item { .u-form-item {
margin-bottom: 16px; margin-bottom: 16px;
// padding-bottom: 10px !important;
.u-form-item__body { .u-form-item__body {
// .u-form-item--right { // .u-form-item--right {
// .u-form-item--right__content { // .u-form-item--right__content {

View File

@@ -1,155 +0,0 @@
<template>
<div class="walkObject">
<u-navbar title="选择走访慰问对象" back-icon-color="#fff" title-color="#fff" title-width="300" title-size="36" :border-bottom="false" :background="backgroundNavbar"> </u-navbar>
<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>
</div>
<div class="header-middle">
<div class="hint">可选范围</div>
<div class="empty-div"></div>
<div class="Checkbox">
<u-checkbox-group :wrap="true" @change="checkboxGroupChange">
<u-checkbox @change="checkboxChange" v-model="item.checked" v-for="(item, index) in list" shape="circle" :key="index" :name="item.name">
<img src="./images/user.png" alt="" style="width: 36px; height: 36px; border-radius: 8px; vertical-align: middle; margin: 0 18px 0 17px" />
<span>{{ item.name }}</span>
<u-icon name="arrow-right" color="#ccc" style="position: absolute; right: 0; top: 20px"></u-icon>
</u-checkbox>
</u-checkbox-group>
</div>
</div>
<div class="fixedBtn">
<div class="typeName">
<span class="typeName-box" v-for="(item, index) in list" :key="index" v-if="item.checked == true">
{{ item.name }}
</span>
</div>
<div class="subBtn" @click="submit">确定选择</div>
</div>
</div>
</template>
<script>
export default {
name: 'walkObject',
components: {},
props: {},
data() {
return {
backgroundNavbar: {
backgroundColor: '#3975C6',
},
keyword: '',
list: [
{
name: '残疾人',
},
{
name: '精神病患者',
},
{
name: '吸毒人员',
},
],
nameList: [],
}
},
computed: {},
created() {},
mounted() {},
methods: {
checkboxGroupChange(e) {
console.log(1, e)
e.map((item) => {
console.log(item)
})
// list.map((item) => {
// if (item.checked == true) {
// var obj = { name: item.name }
// this.nameList.push(obj)
// }
// })
},
checkboxChange(e) {
console.log(2, e)
},
submit() {},
},
}
</script>
<style lang="scss" scoped>
.walkObject {
background: #ffffff;
padding-bottom: 118px;
.header-top {
background: #fff;
padding: 20px 32px;
}
.header-middle {
.hint {
padding: 0 20px 0 32px;
height: 112px;
line-height: 112px;
box-shadow: 0px 1px 0px 0px #e4e5e6;
font-size: 30px;
font-weight: 500;
}
.empty-div {
height: 16px;
background: #f5f5f5;
}
.Checkbox {
padding: 0 20px 0 30px;
::v-deep .u-checkbox-group {
.u-checkbox {
position: relative;
height: 112px;
}
}
}
}
.fixedBtn {
display: flex;
justify-content: space-between;
position: fixed;
bottom: 0;
width: 100%;
box-sizing: border-box;
padding: 0 32px;
.subBtn {
margin: 20px 0 18px 0;
padding: 18px 32px;
background: #1365dd;
border-radius: 4px;
font-size: 32px;
color: #ffffff;
}
.typeName {
// margin: 48px 0 44px 0;
margin: 36px 0 22px 0;
.typeName-box {
padding: 16px 14px;
background: #eaeef1;
border-radius: 8px;
font-size: 30px;
font-weight: 500;
margin-left: 10px;
}
.typeName-box:first-child {
margin-left: 0;
}
}
}
}
</style>

View File

@@ -30,10 +30,10 @@
<div class="hint-con">本次议事会通过7步议事法即收集意见确认议题制定方案发布公告组织协商结果运用反馈公示的模拟方式进行协商讨论并教授议事会成员自如运用议事措施开展后续落地计划的学习性和功能性会议 组织协商结果运用反馈公示的模拟方式进行协商讨论并教授议事会成员自如运用议事措施开展后续落地计划的线上学习性和功能性会议作为基层民主自治的新亮点已经全面铺开的互联网+议事大厅使得三联村成功走出了一条集思广益民主决策和村民自治的新路子</div> <div class="hint-con">本次议事会通过7步议事法即收集意见确认议题制定方案发布公告组织协商结果运用反馈公示的模拟方式进行协商讨论并教授议事会成员自如运用议事措施开展后续落地计划的学习性和功能性会议 组织协商结果运用反馈公示的模拟方式进行协商讨论并教授议事会成员自如运用议事措施开展后续落地计划的线上学习性和功能性会议作为基层民主自治的新亮点已经全面铺开的互联网+议事大厅使得三联村成功走出了一条集思广益民主决策和村民自治的新路子</div>
<div class="imgs"> <div class="imgs">
<img src="../components/images/天使彦5.jpg" alt="" /> <img src="./components/images/天使彦5.jpg" alt="" />
<img src="../components/images/天使彦5.jpg" alt="" /> <img src="./components/images/天使彦5.jpg" alt="" />
<img src="../components/images/天使彦5.jpg" alt="" /> <img src="./components/images/天使彦5.jpg" alt="" />
<img src="../components/images/天使彦5.jpg" alt="" /> <img src="./components/images/天使彦5.jpg" alt="" />
</div> </div>
</div> </div>
@@ -42,7 +42,7 @@
</template> </template>
<script> <script>
import AiBack from '../../../components/AiBack.vue' import AiBack from '../../components/AiBack.vue'
export default { export default {
name: 'detail', name: 'detail',

View File

@@ -1,25 +0,0 @@
const install = function (Vue) {
if (install.installed) return
// 遍历注册全局组件
let apps = []
let contexts = require.context('.', true, /\.(\/.+)\/App[^\/]+\.vue$/)
if (contexts) {
contexts.keys().map(e => {
if (contexts(e).default) {
apps.push(contexts(e).default)
Vue.component(contexts(e).default.name, contexts(e).default)
}
})
}
return Promise.resolve(apps)
}
// 判断是否是直接引入文件
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue)
}
export default {
// 导出的对象必须具有 install才能被 Vue.use() 方法安装
install
}

View File

@@ -43,5 +43,14 @@ export default {
}, },
formatName: (name) => { formatName: (name) => {
return Array.from(name)?.slice(-2)?.toString() || ""; return Array.from(name)?.slice(-2)?.toString() || "";
},
loading: title => {
uni.showLoading({
title: title ? title : '加载中',
mask: true
})
},
hideLoading: () => {
uni.hideLoading()
} }
} }

View File

@@ -47,8 +47,8 @@ export default {
} else if (this.custom) { } else if (this.custom) {
this.$emit("back") this.$emit("back")
} else if (this.custom) { } else if (this.custom) {
} else this.root.goto({}, () => { } else uni.navigateBack({
if (this.eventName != '') { success: () => {
uni.$emit(this.eventName, this.data) uni.$emit(this.eventName, this.data)
} }
}) })

View File

@@ -4,7 +4,6 @@ import store from './store';
import axios from './common/axios'; import axios from './common/axios';
import utils from './common/util'; import utils from './common/util';
import ui from 'uview-ui' import ui from 'uview-ui'
import apps from './apps/index'
const loading = title => { const loading = title => {
uni.showLoading({ uni.showLoading({
@@ -21,7 +20,6 @@ Vue.prototype.$loading = loading
Vue.prototype.$hideLoading = hideLoading Vue.prototype.$hideLoading = hideLoading
Vue.use(ui) Vue.use(ui)
Vue.use(apps)
Vue.config.productionTip = false; Vue.config.productionTip = false;
Vue.prototype.$store = store; Vue.prototype.$store = store;
//初始化接口工具类 //初始化接口工具类

View File

@@ -47,8 +47,7 @@ export default {
}) })
}, },
handleGotoApp(app) { handleGotoApp(app) {
console.log(app) uni.navigateTo({url: `/apps${app.path}`})
uni.navigateTo({url: `./mainEntry?app=${app.key}`})
}, },
handleLogin() { handleLogin() {
uni.navigateTo({url: "./login"}) uni.navigateTo({url: "./login"})