Browse Source

增加工作汇报

master
赵鹏 1 month ago
parent
commit
5fe8acc262
  1. 38
      api/jobinfo/index.js
  2. 28
      pages.json
  3. 2
      pages/index.vue
  4. 32
      pages/owner.vue
  5. 4
      sub/owner/invite.vue
  6. 143
      sub/owner/job-detail.vue
  7. 143
      sub/owner/job-view.vue
  8. 266
      sub/owner/jobInfo.vue

38
api/jobinfo/index.js

@ -0,0 +1,38 @@
import request from '@/utils/request'
// 工作汇报 API
export const JobInfoApi = {
// 查询工作汇报分页
getJobInfoPage: (params) => {
return request({ url: `/system/job-info/page`, params ,method: 'get'})
},
// 查询工作汇报详情
getJobInfo: (id) => {
return request({ url: `/system/job-info/get?id=` + id,method: 'get' })
},
// 模板信息
jobDetail: (id) => {
return request({ url: `/system/job-info/jobDetail?id=` + id,method: 'get' })
},
// 新增工作汇报
createJobInfo: (data) => {
return request({ url: `/system/job-info/create`, data, method: 'post' })
},
// 修改工作汇报
updateJobInfo: (data) => {
return request({ url: `/system/job-info/update`, data , method: 'put'})
},
// 删除工作汇报
deleteJobInfo: (id) => {
return request({ url: `/system/job-info/delete?id=` + id , method: 'delete' })
}
}

28
pages.json

@ -96,6 +96,34 @@
"componentPlaceholder": {}
}
},
{
"path": "owner/jobInfo",
"style": {
"navigationBarTitleText": "工作汇报",
"usingComponents": {
"van-search": "/wxcomponents/vant/search/index"
},
"componentPlaceholder": {
"u-modal": "view"
}
}
},
{
"path": "owner/job-detail",
"style": {
"navigationBarTitleText": "工作汇报",
"usingComponents": {},
"componentPlaceholder": {}
}
},
{
"path": "owner/job-view",
"style": {
"navigationBarTitleText": "工作汇报",
"usingComponents": {},
"componentPlaceholder": {}
}
},
{
"path": "enterprise/edit",
"style": {

2
pages/index.vue

@ -178,7 +178,7 @@
<view>
<u-count-to
:start-val="0"
:end-val="item.count"
:end-val="Number(item.count) || 0"
bold
font-size="14"
color="#17C653"

32
pages/owner.vue

@ -74,7 +74,7 @@
<u-icon name="arrow-right"></u-icon>
</view>
</view> -->
<view
<button
class="section wd-flex wd-flex-row wd-justify-between"
@click="btnPolicy"
>
@ -99,7 +99,7 @@
></u-count-to>
<u-icon name="arrow-right"></u-icon>
</view>
</view>
</button>
<button
class="section wd-flex wd-flex-row wd-justify-between"
open-type="share"
@ -142,6 +142,26 @@
<u-icon name="arrow-right"></u-icon>
</view>
</view>
<button
class="section wd-flex wd-flex-row wd-justify-between"
@click="btnJobInfo"
>
<view class="wd-flex wd-flex-row" style="gap: 16rpx">
<u--image
src="/static/images/owner/edit.png"
width="20px"
height="20px"
mode="aspectFit"
></u--image>
<text class="wd-font-800">工作汇报</text>
</view>
<view
class="wd-flex wd-flex-row wd-items-center"
style="gap: 16rpx"
>
<u-icon name="arrow-right"></u-icon>
</view>
</button>
</scroll-view>
</cs-page>
</template>
@ -175,6 +195,11 @@ export default {
url: '/sub/owner/policy'
})
},
btnJobInfo() {
uni.navigateTo({
url: '/sub/owner/jobInfo'
})
},
init() {
getUserProfile().then(res => {
this.user = res.data
@ -200,12 +225,13 @@ export default {
url: '/sub/owner/edit'
})
},
invite() {
this.share = {
title: '邀请企业入驻', //
path: `/pages/login?inviteId=${this.$store.getters.userId}`,
imageUrl:
'http://82.156.141.150:9001/api/v1/download-shared-object/aHR0cDovL2xvY2FsaG9zdDo5MDAwL2h1YW5iYW8vbWluaWFwcC9pbnZhdGUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUQxODY1RVA2NEczMEdEUUhDVTglMkYyMDI1MDIxOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMThUMDcyMDI0WiZYLUFtei1FeHBpcmVzPTQzMTk5JlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlJERTROalZGVURZMFJ6TXdSMFJSU0VOVk9DSXNJbVY0Y0NJNk1UY3pPVGt3TmpJME55d2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLmp6djBhdEY5QVBYXzVjYWg4c18yeXhVV3oxek9BekFzSVdzemVrUmZwcXlHd0RPWkptazlUSGJRUnBDdVNmLVMyU0otWTI1cldUd2hpNUlrY0xBSThRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjcxZTkzOTE1MDkwYzUzYmRjYTg0MjQ1MTJhYjk3ZWQxZWMyN2QzM2MwM2U3NGUwYmRhNTBmYjQyNWI0N2MyOQ'
'https://hb.jzce.com/fx_qyrz.png'
}
},
callPhone() {

4
sub/owner/invite.vue

@ -26,7 +26,7 @@ export default {
title: '邀请企业入驻',
path: `/pages/login?inviteId=${this.$store.getters.userId}`,
imageUrl:
'http://82.156.141.150:9001/api/v1/download-shared-object/aHR0cDovL2xvY2FsaG9zdDo5MDAwL2h1YW5iYW8vbWluaWFwcC9pbnZhdGUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUQxODY1RVA2NEczMEdEUUhDVTglMkYyMDI1MDIxOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMThUMDcyMDI0WiZYLUFtei1FeHBpcmVzPTQzMTk5JlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlJERTROalZGVURZMFJ6TXdSMFJSU0VOVk9DSXNJbVY0Y0NJNk1UY3pPVGt3TmpJME55d2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLmp6djBhdEY5QVBYXzVjYWg4c18yeXhVV3oxek9BekFzSVdzemVrUmZwcXlHd0RPWkptazlUSGJRUnBDdVNmLVMyU0otWTI1cldUd2hpNUlrY0xBSThRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjcxZTkzOTE1MDkwYzUzYmRjYTg0MjQ1MTJhYjk3ZWQxZWMyN2QzM2MwM2U3NGUwYmRhNTBmYjQyNWI0N2MyOQ'
'https://hb.jzce.com/fx_qyrz.png'
}
},
onShareTimeline() {
@ -34,7 +34,7 @@ export default {
title: '邀请企业入驻', //
path: `/pages/login?inviteId=${this.$store.getters.userId}`,
imageUrl:
'http://82.156.141.150:9001/api/v1/download-shared-object/aHR0cDovL2xvY2FsaG9zdDo5MDAwL2h1YW5iYW8vbWluaWFwcC9pbnZhdGUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUQxODY1RVA2NEczMEdEUUhDVTglMkYyMDI1MDIxOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMThUMDcyMDI0WiZYLUFtei1FeHBpcmVzPTQzMTk5JlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlJERTROalZGVURZMFJ6TXdSMFJSU0VOVk9DSXNJbVY0Y0NJNk1UY3pPVGt3TmpJME55d2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLmp6djBhdEY5QVBYXzVjYWg4c18yeXhVV3oxek9BekFzSVdzemVrUmZwcXlHd0RPWkptazlUSGJRUnBDdVNmLVMyU0otWTI1cldUd2hpNUlrY0xBSThRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjcxZTkzOTE1MDkwYzUzYmRjYTg0MjQ1MTJhYjk3ZWQxZWMyN2QzM2MwM2U3NGUwYmRhNTBmYjQyNWI0N2MyOQ'
'https://hb.jzce.com/fx_qyrz.png'
}
},

143
sub/owner/job-detail.vue

@ -0,0 +1,143 @@
<template>
<view class="jobInfo-detail">
<!-- 详情内容区 -->
<view class="content-wrap">
<view class="jobInfo-title">{{ jobInfoDetail.title }}</view>
<view class="jobInfo-time">生效时间{{ jobInfoDetail.jobDate }}</view>
<!-- 富文本内容 -->
<view class="jobInfo-content">
<rich-text :nodes="jobInfoDetail.context"></rich-text>
</view>
</view>
</view>
</template>
<script>
import { jobInfoApi } from '@/api/jobinfo/index.js'
export default {
data() {
return {
id: '', // ID
jobInfoDetail: {
name: '',
createTime: '',
context: ''
}
}
},
onLoad(options) {
if (options.id) {
this.id = options.id
this.getjobInfoDetail()
}
},
methods: {
//
async getjobInfoDetail() {
try {
const res = await jobInfoApi.getjobInfo(this.id)
if (res.code === 0) {
this.jobInfoDetail = {
...res.data,
jobDate: this.formatTime(res.data.jobDate),
//
context: this.formatRichText(res.data.context)
}
}
} catch (error) {
uni.showToast({
title: '获取详情失败',
icon: 'none'
})
}
},
//
formatTime(time) {
if (!time) return ''
const date = new Date(time)
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`
},
//
formatRichText(html) {
if (!html) return ''
//
return html.replace(/<img/gi, '<img style="max-width:100%;height:auto;display:block;"')
},
//
handleBack() {
uni.navigateBack()
}
}
}
</script>
<style lang="scss">
.jobInfo-detail {
height: 100vh;
background: #fff;
overflow-y: auto;
.nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 88rpx;
background: #fff;
display: flex;
align-items: center;
padding: 0 30rpx;
border-bottom: 1rpx solid #eee;
z-index: 100;
.back-btn {
font-size: 28rpx;
color: #333;
}
.title {
flex: 1;
text-align: center;
font-size: 32rpx;
font-weight: bold;
padding-right: 60rpx;
}
}
.content-wrap {
padding: 30rpx 30rpx 30rpx;
.jobInfo-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
}
.jobInfo-time {
font-size: 24rpx;
color: #999;
margin-bottom: 40rpx;
}
.jobInfo-content {
font-size: 28rpx;
line-height: 1.8;
color: #333;
:deep(img) {
max-width: 100%;
height: auto;
}
:deep(p) {
margin-bottom: 20rpx;
}
}
}
}
</style>

143
sub/owner/job-view.vue

@ -0,0 +1,143 @@
<template>
<view class="jobInfo-detail">
<!-- 详情内容区 -->
<view class="content-wrap">
<view class="jobInfo-title">{{ jobInfoDetail.title }}</view>
<view class="jobInfo-time">生效时间{{ jobInfoDetail.jobDate }}</view>
<!-- 富文本内容 -->
<view class="jobInfo-content">
<rich-text :nodes="jobInfoDetail.context"></rich-text>
</view>
</view>
</view>
</template>
<script>
import { jobInfoApi } from '@/api/jobinfo/index.js'
export default {
data() {
return {
id: '', // ID
jobInfoDetail: {
name: '',
createTime: '',
context: ''
}
}
},
onLoad(options) {
if (options.id) {
this.id = options.id
this.getjobInfoDetail()
}
},
methods: {
//
async getjobInfoDetail() {
try {
const res = await jobInfoApi.getjobInfo(this.id)
if (res.code === 0) {
this.jobInfoDetail = {
...res.data,
jobDate: this.formatTime(res.data.jobDate),
//
context: this.formatRichText(res.data.context)
}
}
} catch (error) {
uni.showToast({
title: '获取详情失败',
icon: 'none'
})
}
},
//
formatTime(time) {
if (!time) return ''
const date = new Date(time)
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`
},
//
formatRichText(html) {
if (!html) return ''
//
return html.replace(/<img/gi, '<img style="max-width:100%;height:auto;display:block;"')
},
//
handleBack() {
uni.navigateBack()
}
}
}
</script>
<style lang="scss">
.jobInfo-detail {
height: 100vh;
background: #fff;
overflow-y: auto;
.nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 88rpx;
background: #fff;
display: flex;
align-items: center;
padding: 0 30rpx;
border-bottom: 1rpx solid #eee;
z-index: 100;
.back-btn {
font-size: 28rpx;
color: #333;
}
.title {
flex: 1;
text-align: center;
font-size: 32rpx;
font-weight: bold;
padding-right: 60rpx;
}
}
.content-wrap {
padding: 30rpx 30rpx 30rpx;
.jobInfo-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
}
.jobInfo-time {
font-size: 24rpx;
color: #999;
margin-bottom: 40rpx;
}
.jobInfo-content {
font-size: 28rpx;
line-height: 1.8;
color: #333;
:deep(img) {
max-width: 100%;
height: auto;
}
:deep(p) {
margin-bottom: 20rpx;
}
}
}
}
</style>

266
sub/owner/jobInfo.vue

@ -0,0 +1,266 @@
<template>
<!-- 政策法规列表页面容器 -->
<view class="jobInfo-container">
<!-- 搜索框区域 -->
<view class="search-box">
<van-search
:value="abc"
placeholder="输入关键字查询"
id="sreach"
@clear="handleClear"
@change="handleSearch"
/>
</view>
<!-- 政策法规列表区域 -->
<!-- 修改列表项部分 -->
<view class="jobInfo-list">
<scroll-view
class="jobInfo-scroll"
scroll-y
@scrolltolower="loadNextPage"
@refresherrefresh="onRefresh"
refresher-enabled
:refresher-triggered="isRefreshing"
>
<view
class="jobInfo-item"
v-for="item in jobInfoList"
:key="item.id"
@click="btnView (item)"
>
<view class="item-left">
<image :src="itemImgUrl" class="jobInfo-icon"></image>
</view>
<view class="item-right">
<view class="jobInfo-title">{{ item.title }}</view>
<view class="jobInfo-time">汇报日期: {{ item.jobDate }}</view>
</view>
</view>
</scroll-view>
</view>
<!-- 加载更多状态组件 -->
<uni-load-more :status="loadMoreStatus" />
</view>
</template>
<script>
import { formatDate } from '@/utils/ruoyi.js'
import config from '@/config'
import { JobInfoApi } from '@/api/jobinfo/index.js'
export default {
data() {
return {
isRefreshing: false, //
searchValue: '', //
abc: '',
jobInfoList: [], //
pageNum: 1, //
pageSize: 10, //
total: 0, //
loadMoreStatus: 'more' ,// more- loading- noMore-
itemImgUrl: config.imgUrl + '/miniohb/c103c92335bdd30d33ff8a062c219ead0626bf0a1898536bd7590285ca11c9db.png'
}
},
//
onShow() {
console.log(this.itemImgUrl)
this.getjobInfoList()
},
methods: {
btnView(itml){
console.log('查看',itml)
let url = itml.pdfUrl
//
wx.downloadFile({
// PDFURL
url: url,
success: function (res) {
const filePath = res.tempFilePath;
wx.openDocument({
filePath: filePath,
fileType: 'pdf', // PDF
success: function (res) {
console.log('打开文档成功');
},
fail: function (err) {
console.error('打开文档失败', err);
}
});
},
fail: function (err) {
console.error('下载文件失败', err);
}
});
},
//
onRefresh() {
this.isRefreshing = true
this.pageNum = 1
this.getjobInfoList()
},
loadNextPage() {
console.log('列表值',this.jobInfoList.length)
if (this.jobInfoList.length < this.total) {
this.pageNum++
this.getjobInfoList()
}
},
//
async getjobInfoList() {
try {
console.log('jobInfoApi',JobInfoApi)
this.loadMoreStatus = 'loading'
const res = await JobInfoApi.getJobInfoPage({
pageNum: this.pageNum,
pageSize: this.pageSize,
title: this.searchValue //
})
if (res.code === 0 && res.data.total > 0) {
//
const formattedData = res.data.list.map(item => ({
...item,
title: item.title.length > 15 ? item.title.slice(0, 15) + '...' : item.title,
jobDate: formatDate(item.jobDate,'YYYY年MM月DD日')
}))
//
if (this.pageNum === 1) {
this.jobInfoList = formattedData
} else {
this.jobInfoList = [...this.jobInfoList, ...formattedData]
}
console.log('列表信息',res)
this.total = res.data.total
//
this.loadMoreStatus = this.jobInfoList.length >= this.total ? 'noMore' : 'more'
}
} catch (error) {
console.error(error)
this.loadMoreStatus = 'more'
uni.showToast({
title: '获取列表失败',
icon: 'none'
})
}
finally {
this.loadMoreStatus = this.jobInfoList.length >= this.total? 'noMore' :'more'
//
//
setTimeout(() => {
this.isRefreshing = false
}, 300) //
}
},
//
handleSearch(e) {
if(e.detail && e.detail.length > 1){
this.pageNum = 1 //
this.searchValue = e.detail //
this.getjobInfoList()
}
},
//
handleClear() {
this.pageNum = 1 //
this.searchValue = '' //
this.getjobInfoList()
},
//
handlejobInfoClick(item) {
uni.navigateTo({
url: `/sub/owner/job-detail?id=${item.id}`
})
}
}
}
</script>
<style lang="scss">
.jobInfo-container {
background: var(--LightMode-Secondary-Secondary, #F9F9F9);
min-height: 100vh;
display: flex;
flex-direction: column;
.search-box {
padding: 20rpx;
background: #fff;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1;
}
.jobInfo-list {
margin-top: 120rpx; //
flex: 1;
.jobInfo-scroll {
height: calc(100vh - 120rpx);
box-sizing: border-box;
}
.jobInfo-item {
display: flex;
padding: 24rpx;
align-items: center;
gap: 24rpx;
background: #fff;
margin: 24rpx;
margin-bottom: 0;
border-radius: 16rpx;
.item-left {
border-radius: 100rpx;
background: var(--LightMode-Grey-Grey-100, #F9F9F9);
padding: 16rpx;
display: flex;
justify-content: center;
align-items: center;
.jobInfo-icon {
width: 40rpx;
height: 40rpx;
flex-shrink: 0;
}
}
.item-right {
flex: 1;
overflow: hidden;
.jobInfo-title {
font-size: 28rpx;
color: #333;
margin-bottom: 12rpx;
line-height: 1.4;
}
.jobInfo-time {
font-size: 24rpx;
color: #999;
line-height: 1.2;
}
}
}
}
}
//
::v-deep .uni-load-more {
padding: 24rpx 0;
}
</style>
Loading…
Cancel
Save