pyt
2025-02-24 70b46c6a0f21ed39b5b7e96286f0996240954725
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
10个文件已修改
14个文件已删除
57个文件已添加
4487 ■■■■■ 已修改文件
H5/.hbuilderx/launch.json 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/config/index.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/index.html 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/main.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages.json 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/Appeal.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/add-progress/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/components/certificate/certificate.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/components/certificate/service.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/index.vue 336 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/service.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/location/location.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/problemReporting/problemReporting.vue 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/result-entry/index.vue 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/maxVideo.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/postpone-apply.vue 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 1063 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/Appeal/add.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/Appeal/amplify.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/Appeal/left.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/Appeal/trash.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/activesend.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/activeupload@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/bg@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/sendmessage.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/upload@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/vioce.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 12@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 1@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 1@2x(1).png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 1@3x_副本.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 1@3x(2).png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 2@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 4@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/aiicon/分组 4@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/Oval.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/Ovaled.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/back.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/dwei.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/explain.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/notice.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/open.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/right.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/right1.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/bg1.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/bg2.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img1.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img2.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img3.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img4.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img5.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img6.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img7.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img8.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img9.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/location/back.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/location/bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/location/location.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/location/search.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/location/toleft.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/pop@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/position@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/warnng@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/store/index.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/utils/request.js 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/routes.ts 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/app.tsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/AvatarDropdown.tsx 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/components/addAndEdit.jsx 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/index.jsx 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/service.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order-setting/index.jsx 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/components/addAndEdit.jsx 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/index.jsx 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/service.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/problem-type/components/addAndEdit.jsx 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/problem-type/index.jsx 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/problem-type/service.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/requestErrorConfig.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/.hbuilderx/launch.json
New file
@@ -0,0 +1,16 @@
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
    "version": "0.0",
    "configurations": [{
         "default" :
         {
             "launchtype" : "local"
         },
         "mp-weixin" :
         {
             "launchtype" : "local"
         },
         "type" : "uniCloud"
     }
    ]
}
H5/config/index.js
New file
@@ -0,0 +1,3 @@
export default {
    BASE_URL: 'http://192.168.110.188:6194',
}
H5/index.html
@@ -1,20 +1,25 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script>
      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
        CSS.supports('top: constant(a)'))
      document.write(
        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
    </script>
    <title></title>
    <!--preload-links-->
    <!--app-context-->
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script type="module" src="/main.js"></script>
  </body>
</html>
    <head>
        <meta charset="UTF-8" />
        <script>
            var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
                CSS.supports('top: constant(a)'))
            document.write(
                '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
                (coverSupport ? ', viewport-fit=cover' : '') + '" />')
        </script>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </script>
        <title></title>
        <!--preload-links-->
        <!--app-context-->
    </head>
    <body>
        <div id="app"><!--app-html--></div>
        <script type="module" src="/main.js"></script>
    </body>
</html>
H5/main.js
@@ -2,23 +2,27 @@
// #ifndef VUE3
import Vue from 'vue'
import store from '@/store/index.js'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
Vue.prototype.$store = store
import uView from '@/uni_modules/uview-ui'
App.mpType = 'app'
const app = new Vue({
  ...App
    ...App
})
app.$mount()
// #endif
Vue.use(uView)
// #ifdef VUE3
import { createSSRApp } from 'vue'
import {
    createSSRApp
} from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  return {
    app
  }
    const app = createSSRApp(App)
    return {
        app
    }
}
// #endif
H5/pages.json
@@ -1,45 +1,114 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "uni-app"
            }
        },
        {
            "path": "pages/add-progress/index",
            "style": {
                "navigationBarTitleText": "添加办理进度",
                "navigationBarBackgroundColor": "#ffffff"
            }
        },
        {
            "path": "pages/list/list",
            "style": {
                "navigationBarTitleText": "诉求列表",
                "navigationBarBackgroundColor": "#fff"
            }
        },
        {
            "path": "pages/delay/delay",
            "style": {
                "navigationBarTitleText": "延期情况说明",
                "navigationBarBackgroundColor": "#fff"
            }
        },
        {
            "path": "pages/progress/progress",
            "style": {
                "navigationBarTitleText": "办理进度",
                "navigationBarBackgroundColor": "#fff"
            }
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
    "uniIdRouter": {}
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    {
        "path": "pages/index/index",
        "style": {
            "navigationBarTitleText": "uni-app",
            "navigationStyle": "custom"
        }
    },
    {
        "path": "pages/list/list",
        "style": {
            "navigationBarTitleText": "诉求列表",
            "navigationBarBackgroundColor": "#fff"
        }
    },
    {
        "path": "pages/delay/delay",
        "style": {
            "navigationBarTitleText": "延期情况说明",
            "navigationBarBackgroundColor": "#fff"
        }
    },
    {
        "path": "pages/progress/progress",
        "style": {
            "navigationBarTitleText": "办理进度",
            "navigationBarBackgroundColor": "#fff"
        }
    },
        {
            "path": "pages/add-progress/index",
            "style": {
                "navigationBarTitleText": "添加办理进度",
                "navigationBarBackgroundColor": "#ffffff"
            }
        }, {
            "path": "pages/work-detail/work-detail",
            "style": {
                "navigationBarBackgroundColor": "#ffffff",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/work-detail/maxVideo",
            "style": {
                "navigationBarBackgroundColor": "#000000",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/problemReporting/problemReporting",
            "style": {
                "navigationBarTitleText": "问题上报",
                "navigationBarBackgroundColor": "#ffffff"
            }
        },
        {
            "path": "pages/dispatchWorkOrder/dispatchWorkOrder",
            "style": {
                "navigationBarTitleText": "工单下派",
                "navigationBarBackgroundColor": "#ffffff"
            }
        },
        {
            "path": "pages/Appeal/Appeal",
            "style": {
                "navigationBarTitleText": "诉求录入",
                "navigationBarBackgroundColor": "#ffffff"
            }
        },
        {
            "path": "pages/location/location",
            "style": {
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/result-entry/index",
            "style": {
                "navigationBarTitleText": "办结结果录入",
                "navigationBarBackgroundColor": "#ffffff"
            }
        },
        {
            "path": "pages/work-detail/postpone-apply",
            "style": {
                "navigationBarTitleText": "延期申请",
                "navigationBarBackgroundColor": "#ffffff"
            }
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
    "permission": {
        "scope.userLocation": {
            "desc": "你的位置信息将用于地图显示"
        }
    },
    "requiredPrivateInfos": [
        "getLocation",
        "chooseLocation"
    ],
    "setting": {
        "urlCheck": false
    },
    "uniIdRouter": {}
}
H5/pages/Appeal/Appeal.vue
New file
@@ -0,0 +1,182 @@
<template>
    <view class="content">
        <view class="main">
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">时间</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题发生的时间" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">问题类型</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题类型" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">群众</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入群众姓名" />
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">联系电话</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入群众联系电话" />
            </view>
            <view class="card  flex a-center h-108 j-between" @click="goTopage">
                <text class="w-108 fs-27 font-bold mr-85">地点</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题发生具体地点" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">详细地址</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入详细地址描述" />
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">问题描述</text>
                <view class="bg mt-27 fs-27">
                    <view class="h-94 " style="border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);">
                        <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="h-94 pl-31 flex1"
                            placeholder="请输入问题标题" />
                    </view>
                    <textarea name="" id="" cols="30" placeholder="请输入问题描述内容"
                        placeholder-style="color: rgba(0, 0, 0, 0.30);font-size:27rpx;" rows="10"></textarea>
                </view>
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">图片</text>
                <view class="mt-27 flex a-center">
                    <view class="img mr-15">
                        <image src="/static/logo.png" class="w-140 h-140" mode=""></image>
                        <view class="img-icon">
                            <image class="w-19 h-19" src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" src="/static/Appeal/trash.png" mode=""></image>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode=""></image>
                </view>
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">视频</text>
                <view class="mt-27 flex a-center">
                    <view class="img mr-15">
                        <image src="/static/logo.png" class="w-140 h-140" mode=""></image>
                        <view class="img-icon">
                            <image class="w-19 h-19" src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" src="/static/Appeal/trash.png" mode=""></image>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode=""></image>
                </view>
            </view>
        </view>
        <view class="btn">
            保存
        </view>
        <u-datetime-picker :show="showDate" v-model="value1" mode="date"></u-datetime-picker>
        <u-picker :show="showList" :columns="columns" @confirm="confirm" @cancel="cancel"></u-picker>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                showList: false,
                showDate: false,
                value1: Number(new Date()),
                columns: [['医疗','教育','就业','住房','养老']],
            };
        },
        methods:{
            confirm(e){
                console.log(e,'eeee');
            },
            cancel(e){
                console.log(e,'eeee');
            },
            goTopage(){
                uni.navigateTo({
                    url:'/pages/location/location'
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    .card {
        border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
    }
    .bg {
        background: #F8F8F8;
    }
    .content {
        padding: 38rpx 31rpx 62rpx 31rpx;
        .main {
            padding: 0 27rpx 48rpx 27rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            border-radius: 19rpx;
        }
    }
    textarea {
        padding: 27rpx 31rpx 27rpx 31rpx;
        font-weight: 500;
    }
    .img {
        position: relative;
        .img-icon {
            height: 140rpx;
            line-height: 140rpx;
            position: absolute;
            top: 0rpx;
            left: 35rpx;
        }
    }
    .btn {
        width: 688rpx;
        height: 96rpx;
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 48rpx;
        font-weight: 600;
        font-size: 35rpx;
        color: #FFFFFF;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-top: 38rpx
    }
    /deep/.u-popup__content {
        border-radius: 16rpx 16rpx 0rpx 0rpx;
    }
    /deep/ .u-toolbar {
        border-bottom: 2rpx solid RGBA(243, 243, 243, 1);
    }
    /deep/ .u-toolbar__wrapper__cancel {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
    /deep/ .u-toolbar__wrapper__confirm {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
</style>
H5/pages/add-progress/index.vue
@@ -7,7 +7,7 @@
            </view>
            <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                <view class="fs-27 lh-38 color2">江苏省常州市溧阳市牛顿大道172号</view>
                <image src="../../static/public/gps.png" class="w-31 h-31 shrink0" />
                <image src="@/static/public/gps.png" class="w-31 h-31 shrink0" />
            </view>
            <view class="flex a-center j-between mt-31 mx-13">
                <view class="flex-column a-center">
@@ -24,6 +24,40 @@
                </view>
            </view>
        </view>
        <view class="br-19 mt-38 bs-1 pt-35 pb-33 px-31">
            <view class="fs-27 lh-38 font-bold">办理进度描述</view>
            <textarea class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4" style="height: 365rpx;" placeholder="请输入办理进度描述" />
            <view class="fs-27 mt-38 lh-38 font-bold">图片</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                        </view>
                    </view>
                </view>
                <image src="/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
            <view class="fs-27 mt-37 lh-38 font-bold">视频</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="@/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                        </view>
                    </view>
                </view>
                <image src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
        </view>
        <view class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4">确认添加</view>
        <view class="safe-box"></view>
    </view>
</template>
@@ -35,7 +69,11 @@
            }
        },
        methods: {
            viewImage(item) {
                uni.previewImage({
                    urls:[require('@/static/logo.png')]
                })
            }
        }
    }
</script>
@@ -57,6 +95,10 @@
        color: #FAAD14;
    }
    .color4 {
        color: #FFFFFF;
    }
    .bgcolor1 {
        background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
    }
@@ -69,7 +111,23 @@
        background: #FFFBE6;
    }
    .bgcolor4 {
        background: #F8F8F8;
    }
    .bgcolor5 {
        background: rgba(0, 0, 0, .23);
    }
    .bgcolor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .border1 {
        border: 2rpx solid #FFF1B8;
    }
    .safe-box {
        height: env(safe-area-inset-bottom);
    }
</style>
H5/pages/components/certificate/certificate.vue
New file
@@ -0,0 +1,126 @@
<template>
    <view>
        <u-popup :show="show" mode="center" @open="open">
            <view class="popup_main">
                <view class="popup_content flex flex-column a-center">
                    <text class="fs-35 font-bold color3 mt-46">党员证件</text>
                    <view class="bg font-w500 fs-23 mt-38 flex  flex-column a-center">
                        <image src="/static/home/img9.png" class="w-133 h-156 mt-40" mode=""></image>
                        <view class="flex mt-8">
                            <view class="flex flex-column mr-40 lh-48">
                                <text>姓名:</text>
                                <text>身份证号码:</text>
                                <text>所在党组织:</text>
                            </view>
                            <view class="flex flex-column a-end lh-48">
                                <text>李雷</text>
                                <text>500000000000000000</text>
                                <text>成都市锦江区XXXXX部门</text>
                            </view>
                        </view>
                    </view>
                    <view class="flex a-center mt-31">
                        <view class="btn_left" @click="onclose">
                            关闭
                        </view>
                        <view class="btn_right">
                            编辑
                        </view>
                    </view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    export default {
        props: {
            show: Boolean
        },
        data() {
            return {
            };
        },
        methods: {
            open() {
            },
            onclose() {
                this.$emit('onCancel',false)
            },
        },
        created() {},
    }
</script>
<style lang="scss">
    .color3 {
        color: #fff;
    }
    /deep/ .u-popup__content {
        width: 635rpx;
        height: 654rpx;
        border-radius: 40rpx;
    }
    .popup_main {
        width: 635rpx;
        height: 654rpx;
        border-radius: 40rpx;
        background-image: url('@/static/home/bg1.png');
        /* 背景图片铺满容器 */
        background-size: cover;
        /* 背景图片不重复 */
        background-repeat: no-repeat;
        /* 背景图片居中显示 */
        background-position: center;
        /* 设置容器的宽度和高度 */
    }
    .bg {
        width: 577rpx;
        height: 371rpx;
        background-image: url('@/static/home/bg2.png');
        /* 背景图片铺满容器 */
        background-size: cover;
        /* 背景图片不重复 */
        background-repeat: no-repeat;
        /* 背景图片居中显示 */
        background-position: center;
    }
    .btn_left {
        width: 212rpx;
        height: 77rpx;
        border-radius: 48rpx;
        border: 2rpx solid rgba(0, 0, 0, 0.8);
        font-size: 27rpx;
        color: rgba(0, 0, 0, 0.8);
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .btn_right {
        width: 212rpx;
        height: 77rpx;
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border: 2rpx solid #fff;
        border-radius: 48rpx;
        font-weight: 600;
        font-size: 27rpx;
        color: #FFFFFF;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-left: 33rpx;
    }
</style>
H5/pages/components/certificate/service.js
New file
@@ -0,0 +1,8 @@
import request from '@/utils/request.js'
export const getBanner =(params)=>{
    return request.get(`/api/huacheng-sangeshenbian/applet/home/banner-list`,params)
}
export const getMessagelist =(params)=>{
    return request.post(`/api/huacheng-sangeshenbian/applet/home/message`,params)
}
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue
New file
@@ -0,0 +1,342 @@
<template>
    <view class="problem-report-page">
        <view class="info-cards">
            <view class="info-top">
                <view class="num">诉求号:7843523454</view>
                <view class="status">正在办理</view>
            </view>
            <view class="address">
                <view class="adr">江苏省常州市溧阳市牛顿大道172号</view>
                <image src="/static/position@2x.png" class="w-31 h-31" mode="aspectFill"></image>
            </view>
            <view class="table-head">
                <view class="type flex1">问题类型</view>
                <view class="person flex1">群众</view>
                <view class="phone flex1">联系电话</view>
            </view>
            <view class="table-body">
                <view class="table-item">
                    <view class="type-tip flex1">
                        <view class="tip">
                            教育
                        </view>
                    </view>
                    <view class="person-item flex1">沙振</view>
                    <view class="phone-item flex1">14225874426</view>
                </view>
            </view>
        </view>
        <view class="input-card">
            <view class="title mb-27">
                上报说明
            </view>
            <u--textarea style="background-color:rgba(248, 248, 248, 1);border: unset;padding:25rpx 30.77rpx;"
                height="365.38rpx" v-model="content" placeholder="请输入内容"></u--textarea>
        </view>
        <view class="notice-tip flex a-center ">
            <image src="/static/warnng@2x.png" class="w-31 h-31 mr-15" mode="aspectFill"></image>
            提交后会由上级部门进行审核,请留意审核结果
        </view>
        <view class="btn">下派至下级部门</view>
        <u-popup round="19rpx" :show="showPop" mode="center" @close="close" @open="open">
            <view class="popup-content">
                <view class="title-pop">请选择下派单位</view>
                <view class="pop-label">社区:</view>
                <view class="pop-select">
                    请选择
                </view>
                <view class="botton-btn">
                    <view class="cancle">取消</view>
                    <view class="sure">确定</view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                content: '',
                showPop: false,
            };
        }
    }
</script>
<style lang="scss" scoped>
    .problem-report-page {
        padding-top: 38.46rpx;
        margin: 0 30.77rpx;
        .info-cards {
            padding: 21.15rpx 26.92rpx 36.54rpx 26.92rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%);
            border-radius: 19rpx;
            .info-top {
                display: flex;
                justify-content: space-between;
                align-items: center;
                .num {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 600;
                    font-size: 23rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 33rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .status {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 600;
                    font-size: 23rpx;
                    color: #FF4948;
                    line-height: 33rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .address {
                margin: 32.69rpx 13.46rpx 30.77rpx 13.46rpx;
                display: flex;
                justify-content: space-between;
                // height: 106rpx;
                background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
                box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                border-radius: 19rpx;
                align-items: center;
                padding: 38.46rpx 26.92rpx 36.54rpx 26.92rpx;
                .adr {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .table-head {
                display: flex;
                text-align: center;
                .type {
                    text-align: left;
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .person {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .phone {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .table-item {
                display: flex;
                display: flex;
                text-align: center;
                margin-top: 8rpx;
                .tip {
                    width: calc(108rpx - 30.77rpx - 30.77rpx);
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 400;
                    font-size: 23rpx;
                    color: #FAAD14;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                    padding: 1.92rpx 30.77rpx;
                    background: #FFFBE6;
                    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                    border-radius: 8rpx;
                    border: 2rpx solid #FFF1B8;
                }
                .person-item {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .phone-item {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
        }
        .input-card {
            // width: 688rpx;
            min-height: calc(504rpx - 34.62rpx - 38.46rpx);
            padding: 34.62rpx 30.77rpx 38.46rpx 30.77rpx;
            border-radius: 19rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            margin-top: 38.46rpx;
            .title {
                font-family: PingFangSC, PingFang SC;
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            }
        }
        .notice-tip {
            margin-top: 38.46rpx;
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 42rpx;
        }
        .btn {
            position: fixed;
            bottom: calc(38.46rpx + env(safe-area-inset-bottom));
            left: 0;
            right: 0;
            width: 688rpx;
            height: 96rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            margin: 0 auto;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: #FFFFFF;
        }
    }
    .popup-content {
        background: url('/static/pop@2x.png') no-repeat center center;
        width: 576.92rpx;
        height: 425rpx;
        border-radius: 19rpx;
        .title-pop {
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 35rpx;
            text-align: center;
            margin-top: 46.15rpx;
        }
        .pop-label {
            font-family: PingFang-SC, PingFang-SC;
            font-weight: 500;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.6);
            margin-top: 46.15rpx;
            margin-left: 64.54rpx;
        }
        .pop-select {
            height: 77rpx;
            background: #FFFFFF;
            border-radius: 15rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.15);
            margin-left: 61.54rpx;
            margin-top: 19.23rpx;
            margin-right: 61.54rpx;
            display: flex;
            align-items: center;
            padding-left: 30.77rpx;
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.24);
            cursor: pointer;
        }
        .botton-btn {
            display: flex;
            margin-top: 44.23rpx;
            justify-content: center;
        }
        .cancle {
            width: 212rpx;
            height: 77rpx;
            border-radius: 48rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.8);
            font-family: PingFangSC, PingFang SC;
            font-weight: 500;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            margin-right: 32.69rpx;
            cursor: pointer;
        }
        .sure {
            width: 212rpx;
            height: 77rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 27rpx;
            color: #FFFFFF;
            cursor: pointer;
        }
    }
</style>
H5/pages/index/index.vue
@@ -1,53 +1,343 @@
<template>
    <view class="content">
        <image class="logo" src="/static/logo.png"></image>
        <view class="text-area">
            <text class="title">{{title}}</text>
            <u-button type="primary" icon="map" text="图标按钮"></u-button>
        <view class="top_content">
            <image src="/static/home/bg@2x.png" class="bg-img vw100" style="z-index: 1;" mode=""></image>
            <view class="main">
                <image src="/static/home/img6.png" class="h-85" mode=""></image>
                <image class="w-275 h-28 mt-15" src="/static/home/img3.png" mode=""></image>
                <view class="flex a-center mt-17   mb-31">
                    <image class="h-32" src="/static/home/img5.png" mode=""></image>
                </view>
                <swiper class="swiper " :indicator-dots="false" :autoplay="true" :interval="3000">
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    </swiper-item>
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    </swiper-item>
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    </swiper-item>
                </swiper>
            </view>
        </view>
        <view class="pt-38 pl-31 pr-31 flex flex-column">
            <view class="flex j-between a-center">
                <text class="color1">工作台</text>
                <text class="color2" @click="showData =!showData">查看更多</text>
            </view>
            <view class="flex flex-wrap j-between">
                <view class="pt-38 pb-38 bg1 w-333 flex br-19 mt-19 a-center" @click="goTopage()">
                    <image class="w-81 h-77 ml-38" src="/static/home/img4.png" mode=""></image>
                    <text class="ml-37">诉求录入</text>
                </view>
                <view class="pt-38  pb-38 bg1 w-333 mt-19 br-19 flex a-center">
                    <image class="w-81 h-77 ml-38" src="/static/home/img2.png" mode=""></image>
                    <text class="ml-37">诉求列表</text>
                </view>
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center">
                    <image class="w-79 h-77 ml-38" src="/static/home/img1.png" mode=""></image>
                    <text class="ml-37">回访评价</text>
                </view>
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center">
                    <image class="w-81 h-77 ml-38" src="/static/home/img8.png" mode=""></image>
                    <text class="ml-37">分析统计</text>
                </view>
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center" @click="onClick()" v-if="showData">
                    <image class="w-94 h-77 ml-38" src="/static/home/img7.png" mode=""></image>
                    <text class="ml-37">党员证</text>
                </view>
            </view>
            <view class="flex j-between a-center mt-38">
                <text class="color1">消息通知</text>
            </view>
            <view class=" mt-15">
                <view class="flex a-center">
                    <view class="msg mr-19" @click="isactive=1" :class="isactive==1? 'active':''">
                        消息
                        <view class="tips">
                            6
                        </view>
                    </view>
                    <view class="representative" @click="isactive=2" :class="isactive==2? 'active':''">
                        待办
                        <view class="tips">
                            6
                        </view>
                    </view>
                </view>
                <view class="list mt-29">
                    <view class="flex a-center mb-27" v-for="item in 5">
                        <view class="avater pb-33">
                            <image class="w-85 h-85 br50" src="/static/home/img9.png" mode=""></image>
                            <view class="tips">
                            </view>
                        </view>
                        <view class="border-b flex1 ml-18 pb-33">
                            <view class="fs-31  font-w500 flex  flex1 j-between">
                                <text>钟山淑</text>
                                <text class="fs-23 font-w400">16分钟前</text>
                            </view>
                            <view class="fs-27 flex j-between mt-8">
                                <text>向你发来10份报告</text>
                                <view class="read">已读</view>
                                <view class="noread">未读</view>
                            </view>
                        </view>
                    </view>
                    <text class="flex j-center fs-27 color4 pb-48">全部已读</text>
                </view>
            </view>
        </view>
        <popupCertificate :show="isClick" @onCancel="isClick=false"></popupCertificate>
    </view>
</template>
<script>
    import popupCertificate from '../components/certificate/certificate.vue'
    import {
        getBanner,
        getMessagelist
    } from './service.js'
    export default {
        components: {
            popupCertificate
        },
        data() {
            return {
                title: 'Hello'
                isactive: 1,
                list1: [],
                showData: false,
                isClick: false,
            }
        },
        onLoad() {
this.getBanner()
        },
        methods: {
            getBanner(){
                getBanner().then(resp=>{
                    console.log(resp,'获取banner');
                })
            },
            change() {
                console.log('1111');
            },
            onClick() {
                this.isClick = true
                console.log('this.isClick', this.isClick);
            },
            goTopage() {
                uni.navigateTo({
                    url: '/pages/Appeal/Appeal',
                    success: function(res) {
                        // 跳转成功的回调函数
                    },
                    fail: function(err) {
                        // 跳转失败的回调函数
                    },
                    complete: function() {
                        // 无论跳转成功或失败都会执行的回调函数
                    }
                });
            }
        }
    }
</script>
<style>
    .content {
<style lang="scss">
    .border-b {
        border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
    }
    .color1 {
        color: #3D2124;
    }
    .color2 {
        color: rgba(61, 33, 36, 0.6);
    }
    .color4 {
        color: rgba(0, 0, 0, 0.4);
    }
    .bg1 {
        background-color: rgba(255, 248, 230, 1);
    }
    .flex-wrap {
        flex-wrap: wrap;
    }
    .read {
        width: 77rpx;
        height: 42rpx;
        border-radius: 8rpx;
        border: 2rpx solid rgba(0, 0, 0, 0.15);
        font-weight: 400;
        font-size: 23rpx;
        color: rgba(0, 0, 0, 0.45);
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }
    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }
    .text-area {
    .noread {
        width: 77rpx;
        height: 42rpx;
        background: #FFF1F0;
        border-radius: 8rpx;
        border: 2rpx solid #FFCCC7;
        font-weight: 400;
        font-size: 23rpx;
        color: #FF4D4F;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .title {
        font-size: 36rpx;
        color: #8f8f94;
    .avater {
        position: relative;
        .tips {
            position: absolute;
            top: 0;
            left: 63rpx;
            width: 12rpx;
            height: 12rpx;
            border-radius: 50%;
            background: #FF3141;
        }
    }
</style>
    .top_content {
        position: relative;
        .main {
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            padding: 0 31rpx;
            position: absolute;
            bottom: 8rpx;
            z-index: 100;
            left: 0;
            .tip {
                /* 让文字颜色透明,显示出渐变背景 */
                color: #FFEEA7;
                /* 设置文字大小 */
                font-weight: 800;
                font-size: 31rpx;
            }
            .title {
                font-weight: 400;
                font-size: 58rpx;
                color: #FFEEA7;
                line-height: 85rpx;
                text-shadow: 0px 4px 8px rgba(0, 0, 0, 0.26);
                text-align: right;
                font-style: normal;
            }
        }
    }
    .bg-img {
        height: 648rpx;
    }
    .swiper {
        width: 688rpx;
        height: 270rpx;
        border-radius: 19rpx;
    }
    .msg {
        width: 173rpx;
        height: 58rpx;
        border-radius: 29rpx;
        background: #F6F6F6;
        font-weight: 400;
        color: #797F81;
        font-size: 27rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
        .tips {
            position: absolute;
            top: -12rpx;
            right: 35rpx;
            width: 27rpx;
            height: 27rpx;
            text-align: center;
            line-height: 27rpx;
            background: #FF3141;
            border: 2rpx solid #FFFFFF;
            border-radius: 50%;
            font-weight: 400;
            font-size: 17rpx;
            color: #FFFFFF;
        }
    }
    .representative {
        font-weight: 400;
        font-size: 27rpx;
        color: #797F81;
        width: 173rpx;
        height: 58rpx;
        background: #F6F6F6;
        border-radius: 29rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
        .tips {
            position: absolute;
            top: -12rpx;
            right: 35rpx;
            width: 27rpx;
            height: 27rpx;
            text-align: center;
            line-height: 27rpx;
            background: #FF3141;
            border: 2rpx solid #FFFFFF;
            border-radius: 50%;
            font-weight: 400;
            font-size: 17rpx;
            color: #FFFFFF;
        }
    }
    .active {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        color: #FFFFFF;
        font-weight: 600;
    }
</style>
H5/pages/index/service.js
New file
@@ -0,0 +1,8 @@
import request from '@/utils/request.js'
export const getBanner =(params)=>{
    return request.get(`/api/huacheng-sangeshenbian/applet/home/banner-list`,params)
}
export const getMessagelist =(params)=>{
    return request.post(`/api/huacheng-sangeshenbian/applet/home/message`,params)
}
H5/pages/location/location.vue
New file
@@ -0,0 +1,99 @@
<template>
    <view class="content">
        <u-navbar title="选择地点" bgColor="transparent" titleStyle="font-size: 35rpx;font-weight:bold;" placeholder>
            <view slot="left">
                <image src="/static/location/back.png" class="w-19 h-35" mode=""></image>
            </view>
        </u-navbar>
    <web-view src="https://api.map.baidu.com/api?v=3.0&ak=W3x8DhCWKc2UFIwYgclpRBdL6BeGLLQt"></wwb-view>
        <view class="">
            <view class="searchMain mb-35">
                <view class="search fs-27 ">
                    <text class="mr-35 ml-50">成都市</text>
                    <image class="w-17 h-8 mr-35" src="/static/location/toleft.png" mode=""></image>
                    <image class="w-31 h-31 mr-13" src="/static/location/search.png" mode=""></image>
                    <input class="flex1" placeholder="搜索小区/写字楼等" placeholder-style="font-size:27rpx"></input>
                    <view class="sure">
                        确定
                    </view>
                </view>
            </view>
            <view class="card" :class="" v-for="item in 5">
                <text>天府新谷九号楼二单元</text>
                <text class="font-w500 fs-23 mt-25" style="color: rgba(0, 0, 0, 0.6);">四川省成都市高新区府城大道西段399号天</text>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                latitude: 39.909,
                longitude: 116.39742,
            };
        },
    }
</script>
<style lang="scss" scoped>
    #baiduMap {
        width: 100vw;
        height: 517rpx;
    }
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
    }
    .searchMain {
        padding-left: 40rpx;
        padding-right: 40rpx;
        border-radius: 40rpx;
        .search {
            width: 669rpx;
            height: 77rpx;
            background: #FFFFFF;
            border-radius: 38rpx;
            border: 2rpx solid #DADADA;
            display: flex;
            align-items: center;
            justify-content: space-between;
        }
    }
    .sure {
        width: 104rpx;
        height: 69rpx;
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 48rpx;
        font-weight: 500;
        font-size: 23rpx;
        color: #FFFFFF;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .card {
        display: flex;
        flex-direction: column;
        font-weight: 800;
        font-size: 31rpx;
        color: rgba(0, 0, 0, 0.8);
        padding: 34rpx 38rpx 33rpx 38rpx;
        background: #F2F2F2;
        border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
    }
</style>
H5/pages/problemReporting/problemReporting.vue
New file
@@ -0,0 +1,247 @@
<template>
    <view class="problem-report-page">
        <view class="info-cards">
            <view class="info-top">
                <view class="num">诉求号:7843523454</view>
                <view class="status">正在办理</view>
            </view>
            <view class="address">
                <view class="adr">江苏省常州市溧阳市牛顿大道172号</view>
                <image src="/static/position@2x.png" class="w-31 h-31" mode="aspectFill"></image>
            </view>
            <view class="table-head">
                <view class="type flex1">问题类型</view>
                <view class="person flex1">群众</view>
                <view class="phone flex1">联系电话</view>
            </view>
            <view class="table-body">
                <view class="table-item">
                    <view class="type-tip flex1">
                        <view class="tip">
                            教育
                        </view>
                    </view>
                    <view class="person-item flex1">沙振</view>
                    <view class="phone-item flex1">14225874426</view>
                </view>
            </view>
        </view>
        <view class="input-card">
            <view class="title mb-27">
                上报说明
            </view>
            <u--textarea style="background-color:rgba(248, 248, 248, 1);border: unset;padding:25rpx 30.77rpx;"
                height="365.38rpx" v-model="content" placeholder="请输入内容"></u--textarea>
        </view>
        <view class="notice-tip flex a-center ">
            <image src="/static/warnng@2x.png" class="w-31 h-31 mr-15" mode="aspectFill"></image>
            提交后会由上级部门进行审核,请留意审核结果
        </view>
        <view class="btn">提交至上级部门</view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                content: '',
            };
        }
    }
</script>
<style lang="scss" scoped>
    .problem-report-page {
        padding-top: 38.46rpx;
        margin: 0 30.77rpx;
        .info-cards {
            padding: 21.15rpx 26.92rpx 36.54rpx 26.92rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%);
            border-radius: 19rpx;
            .info-top {
                display: flex;
                justify-content: space-between;
                align-items: center;
                .num {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 600;
                    font-size: 23rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 33rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .status {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 600;
                    font-size: 23rpx;
                    color: #FF4948;
                    line-height: 33rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .address {
                margin: 32.69rpx 13.46rpx 30.77rpx 13.46rpx;
                display: flex;
                justify-content: space-between;
                // height: 106rpx;
                background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
                box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                border-radius: 19rpx;
                align-items: center;
                padding: 38.46rpx 26.92rpx 36.54rpx 26.92rpx;
                .adr {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .table-head {
                display: flex;
                text-align: center;
                .type {
                    text-align: left;
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .person {
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .phone {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
            .table-item {
                display: flex;
                display: flex;
                text-align: center;
                margin-top: 8rpx;
                .tip {
                    width: calc(108rpx - 30.77rpx - 30.77rpx);
                    font-family: PingFangSC, PingFang SC;
                    font-weight: 400;
                    font-size: 23rpx;
                    color: #FAAD14;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                    padding: 1.92rpx 30.77rpx;
                    background: #FFFBE6;
                    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                    border-radius: 8rpx;
                    border: 2rpx solid #FFF1B8;
                }
                .person-item {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .phone-item {
                    font-family: PingFang-SC, PingFang-SC;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
            }
        }
        .input-card {
            // width: 688rpx;
            min-height: calc(504rpx - 34.62rpx - 38.46rpx);
            padding: 34.62rpx 30.77rpx 38.46rpx 30.77rpx;
            border-radius: 19rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            margin-top: 38.46rpx;
            .title {
                font-family: PingFangSC, PingFang SC;
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            }
        }
        .notice-tip {
            margin-top: 38.46rpx;
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 42rpx;
        }
        .btn {
            position: fixed;
            bottom: calc(38.46rpx + env(safe-area-inset-bottom));
            left: 0;
            right: 0;
            width: 688rpx;
            height: 96rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            margin: 0 auto;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: #FFFFFF;
        }
    }
</style>
H5/pages/result-entry/index.vue
New file
@@ -0,0 +1,253 @@
<template>
    <view class="px-31 pt-38">
        <view class="br-19 bs-1 pt-21 pb-35 px-27 bgcolor2 relative transition-h"
            :class="unfoldFlag ? 'max-9999' : 'max-300'">
            <view>
                <view class="flex a-center j-between fs-23 lh-33 font-bold">
                    <view>诉求号:7843523454</view>
                    <view class="color1">正在办理</view>
                </view>
                <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                    <view class="fs-27 lh-38 color2">江苏省常州市溧阳市牛顿大道172号</view>
                    <image src="@/static/public/gps.png" class="w-31 h-31 shrink0" />
                </view>
                <view v-if="!unfoldFlag" class="flex a-center j-between mt-31 mx-13">
                    <view class="flex-column a-center">
                        <view class="fs-27 lh-38 font-bold">问题类型</view>
                        <view class="mt-8 fs-23 lh-42 txt-center px-31 font-w400 color3 bgcolor3 border1">教育</view>
                    </view>
                    <view class="flex-column a-center">
                        <view class="fs-27 lh-38 font-bold">群众</view>
                        <view class="fs-27 lh-38 mt-10">沙振</view>
                    </view>
                    <view class="flex-column a-center">
                        <view class="fs-27 lh-38 font-bold">联系电话</view>
                        <view class="fs-27 lh-38 mt-10">14225874426</view>
                    </view>
                </view>
                <view v-else class="mt-33">
                    <view class="fs-27 lh-77 flex j-between">
                        <view class="shrink0 color2 font-w400">
                            <view>创建时间</view>
                            <view>问题类型</view>
                            <view>群众</view>
                            <view>联系电话</view>
                            <view>详细地址</view>
                        </view>
                        <view class="font-bold txt-aligin-r" style="max-width: 404rpx;">
                            <view>2025-09-09 11:09:0</view>
                            <view>教育</view>
                            <view>张三</view>
                            <view>15708179461</view>
                            <view class="lh-35">上报说明上报说明上报说明上报说明上报说明上报说明上报说明上报说</view>
                        </view>
                    </view>
                    <view class="line-box my-35"></view>
                    <view class="fs-27 lh-38 font-bold mx-31">问题描述</view>
                    <view class="br-8 bgcolor4 py-29 mt-27 fs-27">
                        <view class="ml-31">问题标题问题标题问题标题问题标题</view>
                        <view class="line-box my-27"></view>
                        <view class="mx-31 color2">
                            问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容
                        </view>
                    </view>
                    <view class="fs-27 mt-35 lh-38 font-bold">描述图片</view>
                    <view class="flex wrap mt-27">
                        <view @tap="viewImage(item)" class="relative mr-15" v-for="item in 4" :key="item">
                            <image src="/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                        </view>
                    </view>
                    <view class="fs-27 mt-37 lh-38 font-bold">描述视频</view>
                    <view class="flex wrap mt-27">
                        <view @tap="viewImage(item)" class="relative mr-15" v-for="item in 4" :key="item">
                            <image src="@/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                        </view>
                    </view>
                </view>
            </view>
            <view @tap="unfold" class="bgcolor3 absolute w-100 txt-center"
                style="bottom:-58rpx;left: 50%;transform: translate(-50%,-50%);">
                <image src="/static/location/back.png" class="h-23 w-15" style="transform: rotate(-90deg);" />
            </view>
        </view>
        <view class="br-19 mt-76 bs-1 pt-35 pb-33">
            <view class="fs-27 lh-38 font-bold ml-31">处理状态</view>
            <view class="br-15 py-15 pl-31 mx-31 pr-27 mt-27 flex j-between a-center border2">
                <view class="color6">请选择当前处理状态</view>
                <image src="/static/location/back.png" class="h-23 w-15" style="transform: rotate(-90deg);" />
            </view>
            <view class="fs-27 lh-38 font-bold ml-31 mt-38">办结结果描述</view>
            <view class="mt-23 br-38 pt-31 pb-16 pl-31 pr-29 fs-23 color5 bgcolor8">
                <view class="flex mb-15">
                    <view class="w-8 h-8 br50 shrink0 mr-12 mt-12 bgcolor7"></view>
                    <view>处理措施:记录为解决该问题所采取的具体措施,包括政策宣传、沟通协调、现场处理等方式。</view>
                </view>
                <view class="flex mb-15">
                    <view class="w-8 h-8 br50 shrink0 mr-12 mt-12 bgcolor7"></view>
                    <view>处理时间:记录处理该问题的时间节点,包括开始处理时间、处理完成时间等。</view>
                </view>
                <view class="flex mb-15">
                    <view class="w-8 h-8 br50 shrink0 mr-12 mt-12 bgcolor7"></view>
                    <view>参与人员:记录参与处理该问题的人员名单,包括走访人员、相关部门工作人员等。</view>
                </view>
                <view class="flex mb-15">
                    <view class="w-8 h-8 br50 shrink0 mr-12 mt-12 bgcolor7"></view>
                    <view>结果概述:简要描述问题的处理结果,是否得到有效解决,是否达到走访对象的期望等。</view>
                </view>
                <view class="flex mb-15">
                    <view class="w-8 h-8 br50 shrink0 mr-12 mt-12 bgcolor7"></view>
                    <view>后续跟进:如需进一步跟进或处理,记录后续跟进的计划、时间节点及责任人员。</view>
                </view>
            </view>
            <view class="mx-31">
                <textarea class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4" style="height: 365rpx;"
                    placeholder="请按上述标准描述处理结果" />
                <view class="fs-27 mt-38 lh-38 font-bold">图片</view>
                <view class="flex wrap mt-27">
                    <view class="relative mr-15" v-for="item in 4" :key="item">
                        <image src="/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                        <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                            <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                                <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                    mode="" />
                                <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                            </view>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140 shrink0" />
                </view>
                <view class="fs-27 mt-37 lh-38 font-bold">视频</view>
                <view class="flex wrap mt-27">
                    <view class="relative mr-15" v-for="item in 4" :key="item">
                        <image src="@/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                        <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                            <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                                <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                    mode="" />
                                <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                            </view>
                        </view>
                    </view>
                    <image src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
                </view>
                <view class="fs-27 lh-38 mt-40 font-bold">其他说明</view>
                <textarea class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4" style="height: 365rpx;"
                    placeholder="请输入补充说明内容" />
            </view>
        </view>
        <view class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4">提交办结结果</view>
        <view class="safe-box"></view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                unfoldFlag: false, //是否展开
            }
        },
        methods: {
            unfold() {
                this.unfoldFlag = !this.unfoldFlag
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [require('@/static/logo.png')]
                })
            }
        }
    }
</script>
<style scoped lang="scss">
    .bs-1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
    .color1 {
        color: #FF4948;
    }
    .color2 {
        color: rgba(0, 0, 0, .8);
    }
    .color3 {
        color: #FAAD14;
    }
    .color4 {
        color: #FFFFFF;
    }
    .color5 {
        color: #FC8D55;
    }
    .color6 {
        color: rgba(0, 0, 0, 0.24);
    }
    .bgcolor1 {
        background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
    }
    .bgcolor2 {
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 91rpx);
    }
    .bgcolor3 {
        background: #FFFBE6;
    }
    .bgcolor4 {
        background: #F8F8F8;
    }
    .bgcolor5 {
        background: rgba(0, 0, 0, .23);
    }
    .bgcolor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .bgcolor7 {
        background-color: rgba(252, 141, 85, 1);
    }
    .bgcolor8 {
        background: #FFFBE6;
    }
    .border1 {
        border: 2rpx solid #FFF1B8;
    }
    .border2 {
        border: 2rpx solid rgba(0, 0, 0, 0.15);
    }
    .safe-box {
        height: env(safe-area-inset-bottom);
    }
    .line-box {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        height: 2rpx;
        background: rgba(0, 10, 26, 0.07);
    }
    .transition-h {
        transition: max-height 0.5s ease-out;
    }
    .max-300 {
        max-height: 300rpx;
    }
    .max-9999 {
        max-height: 9999rpx;
    }
</style>
H5/pages/work-detail/maxVideo.vue
New file
@@ -0,0 +1,50 @@
<template>
    <view>
        <u-navbar title=" " bgColor="#000000" autoBack leftIconColor="#ffffff">
        </u-navbar>
        <view class="preview-full">
            <video class="videoMax" :autoplay="true" :src="videoUrl" :show-fullscreen-btn="false">
            </video>
        </view>
    </view>
</template>
<script>
    export default {
        // props: {
        //     show: Boolean
        // },
        data() {
            return {
                videoUrl: ''
            };
        },
        onLoad(params) {
            this.videoUrl = params.url
        },
        methods: {
        },
        created() {},
    }
</script>
<style scoped lang="less">
    .preview-full {
        width: 100vw;
        height: 100vh;
        background-color: #000000;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        .videoMax {
            width: 100%;
        }
    }
</style>
H5/pages/work-detail/postpone-apply.vue
New file
@@ -0,0 +1,220 @@
<template>
    <view class="px-31 pt-38">
        <view class="br-19 bs-1 pt-21 pb-35 px-27 bgcolor2">
            <view class="flex a-center j-between fs-23 lh-33 font-bold">
                <view>诉求号:7843523454</view>
                <view class="color1">正在办理</view>
            </view>
            <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                <view class="fs-27 lh-38 color2">江苏省常州市溧阳市牛顿大道172号</view>
                <image src="@/static/public/gps.png" class="w-31 h-31 shrink0" />
            </view>
            <view class="flex a-center j-between mt-31 mx-13">
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">问题类型</view>
                    <view class="mt-8 fs-23 lh-42 txt-center px-31 font-w400 color3 bgcolor3 border1">教育</view>
                </view>
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">群众</view>
                    <view class="fs-27 lh-38 mt-10">沙振</view>
                </view>
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">联系电话</view>
                    <view class="fs-27 lh-38 mt-10">14225874426</view>
                </view>
            </view>
        </view>
        <view class="br-19 mt-38 bs-1 pt-35 pb-33 px-31">
            <view class="fs-27 lh-38 font-bold">办理进度描述</view>
            <textarea class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4" style="height: 365rpx;" placeholder="请输入办理进度描述" />
            <view class="fs-27 mt-38 lh-38 font-bold">图片</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                        </view>
                    </view>
                </view>
                <image src="/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
            <view class="fs-27 mt-37 lh-38 font-bold">视频</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="@/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                        </view>
                    </view>
                </view>
                <image src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
        </view>
        <view class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4">提交延期申请</view>
        <view class="safe-box"></view>
        <u-popup round="19rpx" :show="showPop" mode="center" @close="close" @open="open">
            <view class="popup-content">
                <view class="title-pop">确认操作</view>
                <view class="pop-textArea">
                    是否确认提交延期申请?
                </view>
                <view class="botton-btn">
                    <view class="cancle" @click.stop="showPop=false">取消</view>
                    <view class="sure" @click.stop="submitReject">确认</view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                showPop: true,
            }
        },
        methods: {
            close() {
            },
            open() {
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [require('@/static/logo.png')]
                })
            }
        }
    }
</script>
<style scoped lang="scss">
    .bs-1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
    .color1 {
        color: #FF4948;
    }
    .color2 {
        color: rgba(0, 0, 0, .8);
    }
    .color3 {
        color: #FAAD14;
    }
    .color4 {
        color: #FFFFFF;
    }
    .bgcolor1 {
        background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
    }
    .bgcolor2 {
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 25%);
    }
    .bgcolor3 {
        background: #FFFBE6;
    }
    .bgcolor4 {
        background: #F8F8F8;
    }
    .bgcolor5 {
        background: rgba(0, 0, 0, .23);
    }
    .bgcolor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .border1 {
        border: 2rpx solid #FFF1B8;
    }
    .safe-box {
        height: env(safe-area-inset-bottom);
    }
    .popup-content {
        background: url('/static/pop@2x.png') no-repeat center center;
        width: 576.92rpx;
        // height: 425rpx;
        border-radius: 19rpx;
        .title-pop {
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 35rpx;
            text-align: center;
            margin-top: 46.15rpx;
        }
        .pop-textArea {
            margin-top: 50rpx;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.6);
            line-height: 42rpx;
            text-align: center;
        }
        .botton-btn {
            display: flex;
            margin-top: 44.23rpx;
            justify-content: center;
            padding-bottom: 36rpx;
        }
        .cancle {
            width: 212rpx;
            height: 77rpx;
            border-radius: 48rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.8);
            font-family: PingFangSC, PingFang SC;
            font-weight: 500;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            margin-right: 32.69rpx;
            cursor: pointer;
        }
        .sure {
            width: 212rpx;
            height: 77rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 27rpx;
            color: #FFFFFF;
            cursor: pointer;
        }
    }
</style>
H5/pages/work-detail/work-detail.vue
New file
@@ -0,0 +1,1063 @@
<template>
    <view class="content">
        <u-navbar title="诉求详情" :bgColor="scoreTopHeight>300?'#ffffff':'transparent'" autoBack>
        </u-navbar>
        <view class="topColor">
        </view>
        <view class="allContent">
            <view class="topStatus">
                <view class="status">上报待上级审核</view>
                <view class="flex a-center j-between mb-17">
                    <view class="tit">当前状态</view>
                    <!-- 延期状态 -->
                    <view v-if="false" class="flex a-center">
                        <image src="../../static/detailImg/explain.png" class="plainIcon shrink0"></image>
                        <view class="explain">延期情况说明</view>
                    </view>
                    <!-- 超时状态 -->
                    <view v-if="true" class="flex a-center">
                        <image src="../../static/detailImg/notice.png" class="overTimeIcon shrink0"></image>
                        <view class="overTime">已超时</view>
                        <view class="day">12</view>
                        <view class="overTime">天</view>
                    </view>
                </view>
            </view>
            <!-- 已完结诉求信息 -->
            <view class="mt-19 flex a-center j-between topMore">
                <view class="name">诉求信息</view>
                <view class="flex a-center">
                    <view class="more">办理进度</view>
                    <image src="../../static/detailImg/right1.png" class="moreIcon shrink0"></image>
                </view>
            </view>
            <!-- 上报待上级审核--待审核状态显示 -->
            <view class="card1" v-if="status==3">
                <image src="../../static/detailImg/Ovaled.png" class="topIcon shrink0"></image>
                <view class="infoCard">
                    <view class="flex j-between">
                        <view class="label">上报人</view>
                        <view class="value">张三</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">联系电话</view>
                        <view class="value">13987654321</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">所属部门</view>
                        <view class="value">XXXXXXX部门</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">上报时间</view>
                        <view class="value">2025-09-09 11:09:09</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">上报说明</view>
                        <view class="value">上报说明上报说明上报说明上报上报说明上报说明上报说明上报上报说明上报说明上报说明上报</view>
                    </view>
                </view>
            </view>
            <!--  -->
            <view class="cardInfo">
                <view class="flex j-between a-center">
                    <view class="title">诉求号:7843523454</view>
                    <view class="flex a-center" v-if="true" @click.stop="applyOverTime">
                        <view class="apply">延期申请</view>
                        <image src="../../static/detailImg/right.png" class="rightIcon shrink0"></image>
                    </view>
                </view>
                <view class="addressCard">
                    <view class="address">江苏省常州市溧阳市牛顿大道172号</view>
                    <image src="../../static/detailImg/dwei.png" class="addressIcon shrink0" mode="aspectFill"></image>
                </view>
                <view class="flex j-between">
                    <view class="label">创建时间</view>
                    <view class="value">2025-09-09 11:09:09</view>
                </view>
                <view class="flex j-between">
                    <view class="label">问题类型</view>
                    <view class="value">教育</view>
                </view>
                <view class="flex j-between">
                    <view class="label">群众</view>
                    <view class="value">张三</view>
                </view>
                <view class="flex j-between">
                    <view class="label"> 联系电话</view>
                    <view class="value">13987654321</view>
                </view>
                <view class="flex j-between">
                    <view class="label">详细地址</view>
                    <view class="value">上报说明上报说明上报说明上报
                        上报说明上报说明上报说明上报说</view>
                </view>
                <!-- 上级端需要的字段 -->
                <view class="flex j-between">
                    <view class="label">录入人</view>
                    <view class="value">上报说明上报说明上报说明</view>
                </view>
                <view class="flex j-between">
                    <view class="label">录入人联系方式</view>
                    <view class="value">13987654321</view>
                </view>
                <!--  上级端需要的字段-->
            </view>
            <!-- 问题描述 -->
            <view class="problem">
                <view class="title">问题描述</view>
                <view class="desc">
                    <view class="top">问题标题问题标题问题标题问题标题</view>
                    <view class="line1"></view>
                    <view class="context">问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容问题描述内容</view>
                </view>
                <view class="title">描述图片</view>
                <view class="descPic">
                    <view class="picItem" v-for="(item,index) in 3">
                        <image src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
                            class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
                </view>
                <view class="title">描述视频</view>
                <view class="descPic">
                    <view class="picItem relative" v-for="(item,index) in 3">
                        <!-- <image src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
                            class="img shrink0" mode="aspectFill">
                        </image> -->
                        <!-- <video :autoplay="true" src="https://www.w3schools.com/tags/movie.mp4"
                            class="img shrink0"></video> -->
                        <video id="myVideo" class="videoImg shrink0" disabled :controls="false"
                            :show-center-play-btn="false" :src="src">
                        </video>
                        <view class="videoOpen" @click.stop="openVideo(src)">
                            <image src="../../static/detailImg/open.png" class="video shrink0" mode="aspectFill">
                            </image>
                        </view>
                    </view>
                </view>
            </view>
            <!-- 办结情况 -->
            <view class=" flex a-center j-between topMore topMore1 ">
                <view class="name">办结情况</view>
                <view class="flex a-center">
                </view>
            </view>
            <!-- 办结结果描述 -->
            <view class="resultDesc">
                <view class="topInfo">
                    <view class="flex a-center j-between mb-15">
                        <view class="flex a-center">
                            <view class="name">办结人员:</view>
                            <view class="value">13987654321</view>
                        </view>
                        <view class="flex a-center">
                            <view class="name">联系电话:</view>
                            <view class="value">13987654321</view>
                        </view>
                    </view>
                    <view class="flex a-center">
                        <view class="name">办结时间:</view>
                        <view class="value">13987654321</view>
                    </view>
                </view>
                <view class="title">办结结果描述</view>
                <view class="context">
                    1、处理措施:记录为解决该问题所采取的具体措施,包括政策宣传、处理沟通、现场处理等方式。
                    2、处理时间:记录处理该问题的时间节点,包括开始处理时间、处理完成时间等。
                    3、参与人员:记录参与处理该问题的人员名单,包括走访人员、相关部门工作人员等。
                    4、结果概述:简要描述问题的处理结果,是否得到有效解决,是否达到走访对象的期望等。
                    5、后续跟进:如需进一步跟进或处理,记录后续跟进的计划、时间节点及责任人员。
                </view>
                <view class="title">描述图片</view>
                <view class="descPic">
                    <view class="picItem" v-for="(item,index) in 3">
                        <image src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
                            class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
                </view>
                <view class="title">描述视频</view>
                <view class="descPic" v-if="false">
                    <view class="picItem" v-for="(item,index) in 3">
                        <image src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
                            class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
                </view>
                <view v-else class="noData">暂无数据</view>
            </view>
            <!-- 详情/办理进度 --正在办理显示-->
            <view class="progress">
                <view class="title">当前办理进度</view>
                <view class="proCard">
                    <view class="proItem" v-for="(item,index) in 3">
                        <view class="mr-31 flex flex-column a-center">
                            <image src="../../static/detailImg/right.png" class="proIcon shrink0" mode="aspectFill">
                            </image>
                            <view class="proLine">
                            </view>
                        </view>
                        <view>
                            <view class="flex a-center j-between mb-10">
                                <view class="name">李雷</view>
                                <view class="time">2024年9月29日11:09:09</view>
                            </view>
                            <view class="context">处理进度说明处理进度说明处理进度说明处理进
                                度说明处理进度说明处理进度说明处理进度说明处理进度说明</view>
                            <view class="proImg">
                                <view class="imgOrVedio" v-for="(item,index) in 4">
                                    <image
                                        src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
                                        class="img shrink0" mode="aspectFill">
                                    </image>
                                    <view class="openVideo" v-if="item==4">
                                        <image src="../../static/detailImg/open.png" class="video shrink0"
                                            mode="aspectFill">
                                        </image>
                                    </view>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <!-- 详情/诉求流转 --正在办理显示-->
            <view class="careRequire">
                <view class="title">诉求流转</view>
                <view class="proCard">
                    <view class="proItem" v-for="(item,index) in 3">
                        <view class="mr-34 flex flex-column a-center">
                            <image v-if="item==3" src="../../static/detailImg/Ovaled.png" class="proIcon shrink0"
                                mode="aspectFill">
                            </image>
                            <image v-else src="../../static/detailImg/Ovaled.png" class="proIcon shrink0"
                                mode="aspectFill">
                            </image>
                            <view v-if="item!=3" class="proLine">
                            </view>
                        </view>
                        <view class="requireItem">
                            <view class="flex a-center j-between mb-23">
                                <view class="name" :class="item==3?'opt1':''">市级下派</view>
                                <view class="time" :class="item==3?'opt1':''">2024年9月29日11:09:09</view>
                            </view>
                            <view class="name fs-23" :class="item==3?'opt1':''">上报</view>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <!-- 上级显示 -->
        <view class="btnButtom" v-if="false">
            <view class="btnDown">问题上报</view>
            <view class="btnDown">诉求下派</view>
            <view class="btnAdd">添加办理进度</view>
            <view class="btnAdd">办理结果录入</view>
        </view>
        <view class="btnButtom" v-if="false">
            <view class="cancel" @click.stop="showPop=true">驳回</view>
            <view class="sure">审核通过</view>
        </view>
        <!-- 上级显示 -->
        <!-- 党员显示 -->
        <view class="btnButtom" v-if="true">
            <view class="btnDown partyUp">问题上报</view>
            <view class="btnAdd partyDown">添加办理进度</view>
            <view class="btnAdd partyDown">办理结果录入</view>
        </view>
        <!-- 党员显示 -->
        <u-popup round="19rpx" :show="showPop" mode="center" @close="close" @open="open">
            <view class="popup-content">
                <view class="title-pop">操作驳回</view>
                <view class="pop-textArea">
                    <u--textarea v-model="rejectText" placeholder="请输入驳回原因"></u--textarea>
                </view>
                <view class="botton-btn">
                    <view class="cancle" @click.stop="showPop=false">取消</view>
                    <view class="sure" @click.stop="submitReject">确定</view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                showPop: false, //弹窗驳回
                rejectText: "", //驳回原因
                status: '2', //1 正在办理2已完结
                scoreTopHeight: 0, //距离顶部多高
                src: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4'
            };
        },
        onPageScroll(e) {
            this.scoreTopHeight = e.scrollTop
        },
        onShow() {
        },
        methods: {
            open() {},
            close() {},
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4'}`
                })
            },
            // 获取订单详情信息
            getDetailInfo() {
            },
            // 确认驳回
            submitReject() {
                this.showPop = false
            },
            //延期申请
            applyOverTime() {
                uni.navigateTo({
                    url: `/pages/work-detail/postpone-apply`
                })
            },
        }
    }
</script>
<style>
    page {
        background: linear-gradient(180deg, #FFFFFF 0%, #F9F9F9 6%, #F8F8F8 100%);
    }
</style>
<style lang="scss" scoped>
    .topColor {
        height: 346rpx;
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%);
        // padding: 176rpx 27rpx 17rpx 27rpx;
    }
    .allContent {
        margin-top: -243rpx;
        padding: 0 31rpx 178rpx 31rpx;
        .topStatus {
            .status {
                font-weight: 600;
                font-size: 44rpx;
                color: #000000;
                line-height: 62rpx;
                margin-bottom: 15rpx;
            }
            .tit {
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
                // margin-bottom: 17rpx;
            }
            .plainIcon {
                width: 36rpx;
                height: 36rpx;
            }
            .explain {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.6);
                line-height: 33rpx;
                margin-left: 8rpx;
            }
            .overTimeIcon {
                width: 30.77rpx;
                height: 30.77rpx;
                margin-right: 15rpx;
            }
            .overTime {
                font-weight: 400;
                font-size: 23rpx;
                color: #FF4948;
                line-height: 33rpx;
            }
            .day {
                margin: -11rpx 12rpx 0 9rpx;
                background: #FFEAEA;
                border-radius: 19rpx;
                border: 2rpx solid #FF4948;
                padding: 4rpx 24rpx;
                font-weight: 600;
                font-size: 42rpx;
                color: #FF4948;
                line-height: 42rpx;
            }
        }
        .topMore {
            padding: 8rpx 31rpx;
            margin: 19rpx -31rpx 0 -31rpx;
            background: linear-gradient(270deg, rgba(102, 102, 102, 0) 0%, rgba(102, 102, 102, 0.14) 100%);
            .name {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 33rpx;
            }
            .more {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.6);
                line-height: 33rpx;
            }
            .moreIcon {
                width: 19.23rpx;
                height: 19.23rpx;
                margin-left: 15rpx;
            }
        }
        .topMore1 {
            margin-top: 38rpx !important;
        }
        .card1 {
            margin-top: 21rpx;
            display: flex;
            justify-content: space-between;
            .topIcon {
                margin-top: 17rpx;
                width: 19.23rpx;
                height: 19.23rpx;
                margin-right: 46rpx;
            }
            .infoCard {
                flex: 1;
                background: #FFFFFF;
                box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.06);
                padding: 13rpx 30.77rpx 19rpx 31rpx;
                border-radius: 27rpx;
                .label {
                    font-weight: 400;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 77rpx;
                }
                .value {
                    max-width: 403rpx;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 77rpx;
                }
            }
        }
        .cardInfo {
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            border-radius: 8rpx;
            padding: 21rpx 31rpx 38rpx 31rpx;
            border-radius: 27rpx;
            background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 20%, rgba(255, 255, 255, 0) 100%);
            .title {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 33rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            }
            .apply {
                font-weight: 600;
                font-size: 23rpx;
                color: #FF4948;
                line-height: 33rpx;
                margin-right: 15rpx;
            }
            .rightIcon {
                width: 19.23rpx;
                height: 19.23rpx;
            }
            .addressCard {
                margin: 33rpx 10rpx;
                padding: 33rpx 27rpx;
                background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
                border-radius: 19rpx;
                display: flex;
                justify-content: space-between;
                .address {
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .addressIcon {
                    width: 23.08rpx;
                    height: 25.64rpx;
                }
            }
            .label {
                font-weight: 400;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 77rpx;
            }
            .value {
                max-width: 403rpx;
                font-weight: 500;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 77rpx;
            }
        }
        .problem {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 0 31rpx 34rpx 31rpx;
            .title {
                padding-top: 34rpx;
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 27rpx;
            }
            .desc {
                background: #F8F8F8;
                // box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                border-radius: 8rpx;
                padding: 29rpx 0 121rpx 0;
                .top {
                    padding: 0 31rpx;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.8);
                    line-height: 38rpx;
                }
                .line1 {
                    margin: 27rpx 0;
                    height: 2rpx;
                    background: rgba(0, 10, 26, 0.07);
                }
                .context {
                    padding: 0 31rpx;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.8);
                    line-height: 38rpx;
                }
            }
            .descPic {
                display: flex;
                flex-wrap: wrap;
                .picItem {
                    margin-right: 15rpx;
                    .img {
                        width: 140.38rpx;
                        height: 140.38rpx;
                        border-radius: 7.69rpx;
                    }
                }
            }
        }
        .progress {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 34rpx 31rpx;
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 48rpx;
            }
            .proCard {
                .proItem {
                    display: flex;
                    padding-bottom: 46rpx;
                    .proIcon {
                        width: 19.23rpx;
                        height: 19.23rpx;
                        margin: 10rpx 0;
                    }
                    .proLine {
                        flex: 1;
                        width: 4rpx;
                        min-height: 50rpx;
                        background: rgba(0, 0, 0, 0.06);
                        border-radius: 3rpx;
                    }
                    .name {
                        font-weight: 400;
                        font-size: 27rpx;
                        color: rgba(0, 0, 0, 0.8);
                        line-height: 38rpx;
                    }
                    .time {
                        font-weight: 400;
                        font-size: 23rpx;
                        color: rgba(0, 0, 0, 0.4);
                        line-height: 33rpx;
                    }
                    .context {
                        font-size: 27rpx;
                        color: rgba(0, 0, 0, 0.8);
                        line-height: 38rpx;
                    }
                    .proImg {
                        display: flex;
                        flex-wrap: wrap;
                        .imgOrVedio {
                            margin-right: 17rpx;
                            position: relative;
                            .img {
                                width: 140rpx;
                                height: 140rpx;
                                border-radius: 8rpx;
                                margin-top: 19rpx;
                            }
                            .openVideo {
                                position: absolute;
                                top: 19rpx;
                                left: 0;
                                width: 140rpx;
                                height: 140rpx;
                                border-radius: 8rpx;
                                display: flex;
                                align-items: center;
                                justify-content: center;
                                .video {
                                    width: 140rpx;
                                    height: 140rpx;
                                }
                            }
                        }
                    }
                }
                .proItem:last-child {
                    .proLine {
                        display: none;
                    }
                }
            }
        }
        .careRequire {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 34rpx 31rpx;
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 38rpx;
            }
            .proCard {
                .proItem {
                    display: flex;
                    .proIcon {
                        width: 19.23rpx;
                        height: 19.23rpx;
                        margin: 23rpx 0 19rpx 0;
                    }
                    .proLine {
                        flex: 1;
                        width: 4rpx;
                        min-height: 50rpx;
                        background: rgba(0, 0, 0, 0.06);
                        border-radius: 3rpx;
                    }
                    .requireItem {
                        flex: 1;
                        background: #F9F9F9;
                        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                        border-radius: 8rpx;
                        padding: 31rpx;
                        margin-bottom: 46rpx;
                        .name {
                            font-weight: 400;
                            font-size: 27rpx;
                            color: rgba(0, 0, 0, 0.8);
                            line-height: 38rpx;
                        }
                        .time {
                            font-weight: 400;
                            font-size: 23rpx;
                            color: rgba(0, 0, 0, 0.4);
                            line-height: 33rpx;
                        }
                        .opt1 {
                            color: rgba(0, 0, 0, 0.10) !important;
                        }
                    }
                }
                .proItem:last-child {
                    .proLine {
                        display: none;
                    }
                }
            }
        }
        .resultDesc {
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            margin-top: 27rpx;
            padding: 31rpx 31rpx 31rpx 27rpx;
            border-radius: 27rpx;
            .topInfo {
                background: rgba(252, 141, 85, 0.1);
                border-radius: 8rpx;
                padding: 19rpx 27rpx;
                .name {
                    font-size: 23rpx;
                    color: #000000;
                    line-height: 33rpx;
                    margin-right: 8rpx;
                }
                .value {
                    font-size: 23rpx;
                    color: #000000;
                    line-height: 33rpx;
                }
            }
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                margin-top: 38rpx;
                margin-bottom: 27rpx;
            }
            .context {
                padding: 25rpx 30rpx 29rpx 31rpx;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
            }
        }
    }
    .descPic {
        display: flex;
        flex-wrap: wrap;
        .picItem {
            margin-right: 15rpx;
            .img {
                width: 140.38rpx;
                height: 140.38rpx;
                border-radius: 7.69rpx;
            }
        }
        .videoImg {
            width: 140.38rpx;
            height: 140.38rpx;
            border-radius: 7.69rpx;
            position: relative;
        }
        .videoOpen {
            position: absolute;
            top: 10rpx;
            left: 0;
            z-index: 99;
            width: 140rpx;
            height: 140rpx;
            border-radius: 8rpx;
            display: flex;
            align-items: center;
            justify-content: center;
            .video {
                z-index: 999;
                width: 140rpx;
                height: 140rpx;
            }
        }
    }
    .noData {
        font-size: 27rpx;
        color: rgba(0, 0, 0, 0.40);
        line-height: 38rpx;
    }
    #myVideo {
        z-index: 1;
    }
    .btnButtom {
        z-index: 99;
        position: fixed;
        bottom: 0;
        width: 100vw;
        box-sizing: border-box;
        padding: 33rpx 31rpx;
        display: flex;
        background-color: #ffffff;
        justify-content: space-between;
        .cancel {
            background: #FFFFFF;
            border: 2rpx solid;
            box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
            border-image-slice: 1;
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 38rpx;
            padding: 19rpx 138rpx;
        }
        .sure {
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FFFFFF;
            line-height: 38rpx;
            padding: 19rpx 119rpx 19rpx 119rpx;
        }
        .btnDown {
            background: #FFFFFF;
            border: 2rpx solid;
            box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
            border-image-slice: 1;
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 38rpx;
            padding: 19rpx 13rpx;
        }
        .btnAdd {
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FFFFFF;
            line-height: 38rpx;
            padding: 19rpx 15rpx 19rpx 15rpx;
        }
        .partyUp {
            padding: 19rpx 52rpx !important;
        }
        .partyDown {
            padding: 19rpx 25rpx 19rpx 25rpx !important;
        }
    }
    .popup-content {
        background: url('/static/pop@2x.png') no-repeat center center;
        width: 576.92rpx;
        // height: 425rpx;
        border-radius: 19rpx;
        .title-pop {
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 35rpx;
            text-align: center;
            margin-top: 46.15rpx;
        }
        .pop-textArea {
            padding: 34rpx 44rpx 0 44rpx;
            ::v-deep .u-textarea {}
        }
        .pop-label {
            font-family: PingFang-SC, PingFang-SC;
            font-weight: 500;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.6);
            margin-top: 46.15rpx;
            margin-left: 64.54rpx;
        }
        .pop-select {
            height: 77rpx;
            background: #FFFFFF;
            border-radius: 15rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.15);
            margin-left: 61.54rpx;
            margin-top: 19.23rpx;
            margin-right: 61.54rpx;
            display: flex;
            align-items: center;
            padding-left: 30.77rpx;
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.24);
            cursor: pointer;
        }
        .botton-btn {
            display: flex;
            margin-top: 44.23rpx;
            justify-content: center;
            padding-bottom: 55rpx;
        }
        .cancle {
            width: 212rpx;
            height: 77rpx;
            border-radius: 48rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.8);
            font-family: PingFangSC, PingFang SC;
            font-weight: 500;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            margin-right: 32.69rpx;
            cursor: pointer;
        }
        .sure {
            width: 212rpx;
            height: 77rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 27rpx;
            color: #FFFFFF;
            cursor: pointer;
        }
    }
    .preview-full {
        width: 100vw;
        height: 100vh;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        background-color: #000000;
        .maxVideo {
            width: 100%;
        }
    }
</style>
H5/static/Appeal/add.png
H5/static/Appeal/amplify.png
H5/static/Appeal/left.png
H5/static/Appeal/trash.png
H5/static/aiicon/activesend.png
Binary files differ
H5/static/aiicon/activeupload@3x.png
Binary files differ
H5/static/aiicon/bg@3x.png
Binary files differ
H5/static/aiicon/sendmessage.png
Binary files differ
H5/static/aiicon/upload@3x.png
Binary files differ
H5/static/aiicon/vioce.png
Binary files differ
H5/static/aiicon/分组 12@2x.png
Binary files differ
H5/static/aiicon/分组 1@2x.png
Binary files differ
H5/static/aiicon/分组 1@2x(1).png
Binary files differ
H5/static/aiicon/分组 1@3x_副本.png
Binary files differ
H5/static/aiicon/分组 1@3x(2).png
Binary files differ
H5/static/aiicon/分组 2@2x.png
Binary files differ
H5/static/aiicon/分组 4@2x.png
Binary files differ
H5/static/aiicon/分组 4@3x.png
Binary files differ
H5/static/detailImg/Oval.png
H5/static/detailImg/Ovaled.png
H5/static/detailImg/back.png
H5/static/detailImg/dwei.png
H5/static/detailImg/explain.png
H5/static/detailImg/notice.png
H5/static/detailImg/open.png
H5/static/detailImg/right.png
H5/static/detailImg/right1.png
H5/static/home/bg1.png
H5/static/home/bg2.png
H5/static/home/bg@2x.png
H5/static/home/img1.png
H5/static/home/img2.png
H5/static/home/img3.png
H5/static/home/img4.png
H5/static/home/img5.png
H5/static/home/img6.png
H5/static/home/img7.png
H5/static/home/img8.png
H5/static/home/img9.png
H5/static/location/back.png
H5/static/location/bg@2x.png
H5/static/location/location.png
H5/static/location/search.png
H5/static/location/toleft.png
H5/static/pop@2x.png
H5/static/position@2x.png
H5/static/warnng@2x.png
H5/store/index.js
New file
@@ -0,0 +1,11 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
    state: {},
    mutations: {},
    actions: {}
})
export default store
H5/utils/request.js
New file
@@ -0,0 +1,175 @@
const GET = 'GET';
const POST = 'POST';
const PUT = 'PUT';
const FORM = 'FORM';
const DELETE = 'DELETE';
import config from '@/config/index.js'
const baseURL = config.BASE_URL;
const waitingList = [] //等待队列
const excutingList = [] //执行队列
let showLogoutModal = true //是否显示冻结弹窗
function request(method, url, data, type, lodingFlag) {
    if (lodingFlag) {
        uni.showLoading({
            mask: true,
        })
    }
    return new Promise(function(resolve, reject) {
        let token = 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE2MTc3LCJ0eXBlIjoxLCJleHAiOjE3NDE2NjExMDYsImNyZWF0ZWQiOjE3NDAzNjUxMDY1MTh9.XRkMgKjEhRo6_BQK5fEVQ_Pv5bM-xeT36s4ju4Oh1F7ZmkIQOJUrdDnefub13JO6rZs3GT6dKnHZgCSyyQpsjg'
        let header = {
            'content-type': type ? 'application/x-www-form-urlencoded;charset=UTF-8' : 'application/json',
            'Authorization': token,
            'lang': uni.getStorageSync('locale') === 'zh-Hans' ? 'zh_CN' : 'zh-tw',
        }
        const requestTask = uni.request({
            url: baseURL + url,
            method: method,
            data: data,
            header: header,
            success: (res) => {
                //判断状态码
                if (lodingFlag) {
                    uni.hideLoading()
                }
                if (res.data.code == 200) {
                    resolve(res.data);
                    return
                }
                if (res.data.code == 502) {
                    resolve(res.data);
                    uni.showToast({
                        title: res.data.msg,
                        duration: 2000,
                        icon: 'none',
                        mask: true,
                    })
                    return
                }
                if (res.data.code == 500 && url.includes('/applet/user/check')) {
                    resolve(res.data);
                    return
                }
                if (res.data.code == 1 || res.data.code == 500) {
                    uni.showToast({
                        title: res.data.msg || res.data.data || '服务器错误',
                        duration: 2000,
                        icon: 'none',
                        mask: true,
                    })
                    return
                }
                if (res.data.code == 401 || res.data.code == 510 || res.data.code == 504 || res.data
                    .code == 505) {
                    uni.removeStorageSync('token')
                    if (res.data.code == 504) {
                        uni.showToast({
                            title: res.data.msg,
                            duration: 2000,
                            icon: 'none',
                            mask: true,
                        })
                    } else if (res.data.code == 505) {
                        handleLogout('当前登录账号在其他设备登录')
                    } else {
                        handleLogout('登录失效,请重新登录')
                    }
                    return
                }
                if (res.data.code == 501) {
                    uni.showToast({
                        title: res.data.msg,
                        duration: 2000,
                        icon: 'none',
                        mask: true,
                    })
                    return
                }
                if (res.data.code == 506) {
                    resolve(res.data);
                    return
                }
                uni.showToast({
                    title: res.data.msg || '服务器错误',
                    duration: 2000,
                    icon: 'none',
                    mask: true,
                })
            },
            fail(err) {
                if (lodingFlag) {
                    uni.hideLoading()
                }
                reject(err)
            },
            complete: () => {
                const excutingIndex = excutingList.findIndex(item => item === requestTask)
                excutingList.splice(excutingIndex, 1)
                const [apiFn] = waitingList
                if (excutingList.length === 0 && typeof apiFn === 'function') {
                    apiFn()
                    waitingList.splice(0, 1)
                }
            },
        })
        excutingList.push(requestTask)
    })
}
// 被冻结跳转到登录页并取消后续请求
function handleLogout(str) {
    let routeStr = getCurrentPages()[getCurrentPages().length - 1].route
    if (excutingList.length >= 1) {
        showLogoutModal = true
    }
    if (showLogoutModal) {
        showLogoutModal = false
        uni.showModal({
            title: '提示',
            content: str,
            showCancel: false,
            success: function(res) {
                if (res.confirm) {
                    if (routeStr == 'pages/login/index') {
                        uni.reLaunch({
                            url: '/pages/login/index'
                        })
                        return
                    }
                    uni.reLaunch({
                        url: '/pages/login/index'
                    })
                }
            }
        });
        clearAllRequest()
    }
}
// 清除请求队列
function clearAllRequest() {
    if (excutingList.length > 0) {
        for (var i = 0; i < excutingList.length; i++) {
            const item = excutingList[i]
            if (item && item.abort) {
                item.abort()
            }
        }
        excutingList.length = 0
        waitingList.length = 0
    }
}
export default {
    get: (url, data, type = false, lodingFlag = true) => request(GET, url, data, type, lodingFlag),
    post: (url, data, type = false, lodingFlag = true) => request(POST, url, data, type, lodingFlag),
    put: (url, data, type = false, lodingFlag = true) => request(PUT, url, data, type, lodingFlag),
    FORM: (url, data, type = false, lodingFlag = true) => request(FORM, url, data, type, lodingFlag),
    delete: (url, data, type = false, lodingFlag = true) => request(DELETE, url, data, type, lodingFlag),
}
management/config/routes.ts
@@ -35,25 +35,47 @@
  },
  {
    path: '/setting',
    layout: false,
    // layout: false,
    name:'系统设置',
    routes: [
      {
        name: '职位管理',
        path: '/career',
        component: './setting/career',
        path: '/setting/career',
        component: './setting/career/index',
      },
    ],
  },
  {
    path: '/work-order',
    layout: false,
    // layout: false,
    name:'工单事项管理',
    routes: [
      {
        name: '工单事项配置',
        path: '/configuration',
        component: './work-order-settimg/configuration',
        path: '/work-order/configuration',
        component: './work-order-setting/index',
      },
      {
        name: '问题类型管理',
        path: '/work-order/problemType',
        component: './work-order/problem-type/index',
      },
      {
        name: 'banner管理',
        path: '/work-order/banner',
        component: './work-order/banner/index',
      },
    ],
  },
  {
    path: '/message-notification',
    // layout: false,
    name:'消息通知',
    routes: [
      {
        name: '消息通知',
        path: '/message-notification/list',
        component: './message-notification/index',
      },
    ],
  },
management/src/app.tsx
@@ -48,7 +48,7 @@
      const { location: { pathname } } = history;
      // 如果没有登录,重定向到 login
      if (!initialState?.currentUser && location.pathname !== loginPath) {
        history.push(loginPath);
        // history.push(loginPath);
        return
      }
    },
management/src/components/RightContent/AvatarDropdown.tsx
@@ -34,12 +34,12 @@
    const redirect = urlParams.get('redirect');
    // Note: There may be security issues, please note
    if (window.location.pathname !== '/login' && !redirect) {
      history.replace({
        pathname: '/login',
        search: stringify({
          redirect: pathname + search,
        }),
      });
      // history.replace({
      //   pathname: '/login',
      //   search: stringify({
      //     redirect: pathname + search,
      //   }),
      // });
    }
  };
  const actionClassName = useEmotionCss(({ token }) => {
management/src/pages/message-notification/components/addAndEdit.jsx
New file
@@ -0,0 +1,175 @@
import { sendRequest } from '@/utils/antdUtils';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { PageContainer, } from '@ant-design/pro-components';
import { Button, Select, Row, Col, Input, Card, Space, Form, Upload, Spin, message, InputNumber } from 'antd';
import { useState, useEffect } from 'react';
import { addAndEdit, getDetail } from '../service';
import { history, useLocation } from 'umi';
import { customRequest } from '@/utils/utils';
const AddOrEditOrDetail = () => {
  const [form] = Form.useForm();
  const [fileList, setFileList] = useState([])//banner图片
  const [loading, setLoading] = useState(false);
  const { search } = useLocation();
  const searchParams = new URLSearchParams(search);
  const config = {
    name: 'file',
    action: BASE_URL + '/file/obs/upload',
    headers: {
      authorization: localStorage.getItem('token'),
    },
  };
  const formItemLayout = {
    labelCol: { span: 6 },
    wrapperCol: { span: 20 },
  };
  const uploadButton = (text) => {
    return <div>
      <PlusOutlined />
      <div
        style={{
          marginTop: 8,
        }}
      >
      </div>
    </div>
  };
  useEffect(() => {
    if (searchParams.get('id')) {
      getDetail( searchParams.get('id') ).then(res => {
          if (res.data.picUrl) {
              let obj = [{
                  uid: 1,
                  name: 'banner',
                  url: res.data.picUrl
              }]
              setFileList(obj)
          }
          form.setFieldsValue(res.data)
      })
    }
  }, [])
  // 上传banner前
  const beforeUpload = (file) => {
    return new Promise(async (resolve, reject) => {
      if (file.name.includes(',')) {
        message.warning('上传文件不能包含英文逗号(,)')
        return Upload.LIST_IGNORE
      }
      setLoading(true)
      resolve(file)
    });
  };
  // 上传banner
  const handleChange = ({ file: file, fileList: newFileList }) => {
    if (file.status == 'error') {
      setLoading(false)
      setFileList([])
      message.error('上传失败')
      return
    }
    if (file.status == 'done') {
      setLoading(false)
      message.success('上传成功')
    }
    newFileList.map((item) => {
      if (!item.url && item.status == 'done') {
        item.url = item.response.data;
      }
    });
    setFileList(newFileList);
  };
  // 提交表单
  const submit = () => {
    form.validateFields().then(async (values) => {
      console.log('fileList',fileList)
      values.picUrl = fileList[0].url
      delete values.image
      if (searchParams.get('id')) {
          values.id = searchParams.get('id')
          let state = await sendRequest(addAndEdit, values)
          if (state) {
              history.back()
          }
          return
      }
      let state = await sendRequest(addAndEdit, values)
      if (state) {
          history.back()
      }
    })
  }
  return (
    <PageContainer title={searchParams.get('detail') ? '查看详情' : searchParams.get('id') ? '编辑banner' : '添加banner'}>
      <Spin spinning={loading}>
        <Form scrollToFirstError layout="horizontal" {...formItemLayout} form={form}>
          <Card style={{ background: '#fff', paddingTop: '15px' }}>
            <Row>
              <Col span={12}>
                <Form.Item
                  name="bannerName"
                  label='banner名称' rules={[
                    {
                      required: true,
                      message: '请输入banner名称',
                    },
                  ]}
                >
                  <Input disabled={searchParams.get('detail')} placeholder='请输入banner名称'></Input>
                </Form.Item>
                <Form.Item
                  name="image"
                  label="banner图片"
                  extra={
                    <div>
                      <div>推荐尺寸732px * 320px</div>
                    </div>
                  }
                  rules={[
                    {
                      required: fileList.length == 0 ? true : false,
                      message: '请上传banner图片',
                    },
                  ]}
                >
                  <Upload
                    {...config}
                    listType="picture-card"
                    maxCount={1}
                    beforeUpload={beforeUpload}
                    onChange={handleChange}
                    showUploadList={{
                      showPreviewIcon: false,
                    }}
                    customRequest={customRequest}
                    // accept="image/png, image/jpeg, image/jpg"
                    fileList={fileList}
                    disabled={searchParams.get('detail')}
                  >
                    {fileList?.length == 1 || searchParams.get('detail') ? null : uploadButton()}
                  </Upload>
                </Form.Item>
              </Col>
            </Row>
            <div style={{ display: 'flex', justifyContent: 'center' }}>
              <Space size='large'>
                <Button onClick={() => history.back()}>关闭</Button>
                {
                  !searchParams.get('detail') && <Button type='primary' onClick={submit}>保存</Button>
                }
              </Space>
            </div>
          </Card>
        </Form>
      </Spin>
    </PageContainer >
  );
}
export default AddOrEditOrDetail
management/src/pages/message-notification/index.jsx
New file
@@ -0,0 +1,101 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { Button, message, Space } from 'antd';
import { useRef, useState } from 'react';
import { Access, history, useAccess } from 'umi';
import { getList, updateStatus, deleteBanner } from './service'
const Banner = () => {
  const actionRef = useRef();
  const access = useAccess();
  const columns = [
    {
      title: '诉求标题',
      dataIndex: 'bannerName'
    },
    {
      title: '承办者',
      dataIndex: 'bannerName1'
    },
    {
      title: '联系方式',
      dataIndex: 'bannerName'
    },
    {
      title: '所在单位',
      dataIndex: 'bannerName'
    },
    {
      title: '所属职位',
      dataIndex: 'bannerName'
    },
    {
      title: '诉求应处理时间',
      dataIndex: 'bannerName',
      hideInSearch: true,
    },
    {
      title: '提示类型',
      dataIndex: 'bannerName',
      hideInSearch: true,
    },
    {
      title: '状态',
      dataIndex: 'listingStatus',
      hideInSearch: true,
      valueEnum: {
        '上架中': { text: '已读' },
        '已下架' : { text: '未读' },
      }
    },
    {
      title: '操作',
      hideInSearch: true,
      render: (text, record) => {
        return (
          <Space>
            <Button
              type="link"
              onClick={() => {
                showDelConfirm(async () => {
                  let status = await sendRequest(deleteBanner,  record.id)
                  if (status) {
                    actionRef.current.reload();
                  }
                },'确认标记已读所选信息吗?');
              }}
            >
              标记已读
            </Button>
          </Space >
        );
      },
    },
  ]
  return <div>
    <PageContainer title='消息通知'>
      <ProTable
        rowKey='id'
        actionRef={actionRef}
        columns={columns}
        pagination={{
          showSizeChanger: true,
          showQuickJumper: true,
          defaultPageSize: 10,
        }}
        search={{labelWidth: 140}}
        request={(params) => {
          params.bannerType = Number(params.bannerType)
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={false}
      />
    </PageContainer>
  </div>;
};
export default Banner;
management/src/pages/message-notification/service.js
New file
@@ -0,0 +1,52 @@
import { request } from '@umijs/max';
// 列表
export const getList = async (data) => {
    return request(`/promotion/mgt/promotion-banner/page`, {
        method: 'POST',
        data
    });
}
// 详情
export const getDetail = async (id) => {
    return request(`/promotion/mgt/promotion-banner/detail/${id}`, {
        method: 'GET',
        // data
    });
}
// 详情列表
export const getDetailList = async (data) => {
    return request(`/goods/mgt/goods-sku/page`, {
        method: 'POST',
        data
    });
}
// 删除
export const deleteBanner = async (id) => {
    return request(`/promotion/mgt/promotion-banner/${id}`, {
        method: 'delete',
        // params
    });
}
// 添加 编辑
export const addAndEdit = async (data) => {
    return request('/promotion/mgt/promotion-banner/save', {
        method: 'POST',
        data,
    });
}
// 上下架
export const updateStatus = async (data) => {
    return request(`/promotion/mgt/promotion-banner/upd-status`, {
        method: 'POST',
        data
    });
}
management/src/pages/work-order-setting/index.jsx
@@ -8,7 +8,7 @@
// import AddAndEdit from './components/addAndEdit';
// import { getConfig, saveConfig } from './service';
const TabPane = Tabs.TabPane;
// const TabPane = Tabs.TabPane;
const Account = () => {
    const actionRef = useRef();
    const addViewRef = useRef();
@@ -19,7 +19,6 @@
    const [selectedRowKeys, setSelectedRowKeys] = useState([]);
    const changeStatusRef = useRef();
    const [addWarnVisible, handleAddWarnVisible] = useState(false);
    const { RangePicker } = DatePicker;
    const [dataSource, setDataSource] = useState([]);
    const [data, setData] = useState([]);
    const access = useAccess();
@@ -49,76 +48,87 @@
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Form.Item label="市级账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入市级账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内"  ></InputNumber>
                            </Form.Item>
                            <Space style={{ marginTop: 20,display:'flex',flexWrap:'wrap'}}>
                                <Form.Item label="市级账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
                                    <InputNumber controls={false} precision={0} min={0} addonAfter="天内"  ></InputNumber>
                                </Form.Item>
                            <Form.Item label="区县账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入区县账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                                <Form.Item label="区县账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入区县账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                            <Form.Item label="街道账号" name="isAuctioneer" rules={
                                 [{ required: true, message: '请输入街道账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                            <Form.Item label="社区账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入社区账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                            <Form.Item label="党员账号" name="isAuctioneer" rules={
                                  [{ required: true, message: '请输入党员账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                                <Form.Item label="街道账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入街道账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="社区账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入社区账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="党员账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入党员账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                            </Space>
                        </Card>
                        <Card>
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Space style={{ marginTop: 20,display:'flex',flexWrap:'wrap'}}>
                                <Form.Item label="市级账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入市级账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内"  ></InputNumber>
                            </Form.Item>
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内"  controls={false}></InputNumber>
                                </Form.Item>
                            <Form.Item label="区县账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入区县账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                                <Form.Item label="区县账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入区县账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                            <Form.Item label="街道账号" name="isAuctioneer" rules={
                                 [{ required: true, message: '请输入街道账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                            <Form.Item label="社区账号" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入社区账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                            <Form.Item label="党员账号" name="isAuctioneer" rules={
                                  [{ required: true, message: '请输入党员账号' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                            </Form.Item>
                                <Form.Item label="街道账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入街道账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="社区账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入社区账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="党员账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入党员账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                            </Space>
                        </Card>
                        <Card>
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            <div style={{marginBottom:20}}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Form.Item label="添加后处理时间" name="isAuctioneer" rules={
                                [{ required: true, message: '请输入添加后处理时间' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" ></InputNumber>
                                <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                            </Form.Item>
                        </Card>
                        <div style={{ marginTop: 20,display:'flex',justifyContent:'center'}}>
                            <Button type="primary" htmlType="submit" style={{ marginRight: 20 }}>
                                保存
                            </Button>
                        </div>
                    </Form>
                </Card>
            </PageContainer>
management/src/pages/work-order/banner/components/addAndEdit.jsx
New file
@@ -0,0 +1,175 @@
import { sendRequest } from '@/utils/antdUtils';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { PageContainer, } from '@ant-design/pro-components';
import { Button, Select, Row, Col, Input, Card, Space, Form, Upload, Spin, message, InputNumber } from 'antd';
import { useState, useEffect } from 'react';
import { addAndEdit, getDetail } from '../service';
import { history, useLocation } from 'umi';
import { customRequest } from '@/utils/utils';
const AddOrEditOrDetail = () => {
  const [form] = Form.useForm();
  const [fileList, setFileList] = useState([])//banner图片
  const [loading, setLoading] = useState(false);
  const { search } = useLocation();
  const searchParams = new URLSearchParams(search);
  const config = {
    name: 'file',
    action: BASE_URL + '/file/obs/upload',
    headers: {
      authorization: localStorage.getItem('token'),
    },
  };
  const formItemLayout = {
    labelCol: { span: 6 },
    wrapperCol: { span: 20 },
  };
  const uploadButton = (text) => {
    return <div>
      <PlusOutlined />
      <div
        style={{
          marginTop: 8,
        }}
      >
      </div>
    </div>
  };
  useEffect(() => {
    if (searchParams.get('id')) {
      getDetail( searchParams.get('id') ).then(res => {
          if (res.data.picUrl) {
              let obj = [{
                  uid: 1,
                  name: 'banner',
                  url: res.data.picUrl
              }]
              setFileList(obj)
          }
          form.setFieldsValue(res.data)
      })
    }
  }, [])
  // 上传banner前
  const beforeUpload = (file) => {
    return new Promise(async (resolve, reject) => {
      if (file.name.includes(',')) {
        message.warning('上传文件不能包含英文逗号(,)')
        return Upload.LIST_IGNORE
      }
      setLoading(true)
      resolve(file)
    });
  };
  // 上传banner
  const handleChange = ({ file: file, fileList: newFileList }) => {
    if (file.status == 'error') {
      setLoading(false)
      setFileList([])
      message.error('上传失败')
      return
    }
    if (file.status == 'done') {
      setLoading(false)
      message.success('上传成功')
    }
    newFileList.map((item) => {
      if (!item.url && item.status == 'done') {
        item.url = item.response.data;
      }
    });
    setFileList(newFileList);
  };
  // 提交表单
  const submit = () => {
    form.validateFields().then(async (values) => {
      console.log('fileList',fileList)
      values.picUrl = fileList[0].url
      delete values.image
      if (searchParams.get('id')) {
          values.id = searchParams.get('id')
          let state = await sendRequest(addAndEdit, values)
          if (state) {
              history.back()
          }
          return
      }
      let state = await sendRequest(addAndEdit, values)
      if (state) {
          history.back()
      }
    })
  }
  return (
    <PageContainer title={searchParams.get('detail') ? '查看详情' : searchParams.get('id') ? '编辑banner' : '添加banner'}>
      <Spin spinning={loading}>
        <Form scrollToFirstError layout="horizontal" {...formItemLayout} form={form}>
          <Card style={{ background: '#fff', paddingTop: '15px' }}>
            <Row>
              <Col span={12}>
                <Form.Item
                  name="bannerName"
                  label='banner名称' rules={[
                    {
                      required: true,
                      message: '请输入banner名称',
                    },
                  ]}
                >
                  <Input disabled={searchParams.get('detail')} placeholder='请输入banner名称'></Input>
                </Form.Item>
                <Form.Item
                  name="image"
                  label="banner图片"
                  extra={
                    <div>
                      <div>推荐尺寸732px * 320px</div>
                    </div>
                  }
                  rules={[
                    {
                      required: fileList.length == 0 ? true : false,
                      message: '请上传banner图片',
                    },
                  ]}
                >
                  <Upload
                    {...config}
                    listType="picture-card"
                    maxCount={1}
                    beforeUpload={beforeUpload}
                    onChange={handleChange}
                    showUploadList={{
                      showPreviewIcon: false,
                    }}
                    customRequest={customRequest}
                    // accept="image/png, image/jpeg, image/jpg"
                    fileList={fileList}
                    disabled={searchParams.get('detail')}
                  >
                    {fileList?.length == 1 || searchParams.get('detail') ? null : uploadButton()}
                  </Upload>
                </Form.Item>
              </Col>
            </Row>
            <div style={{ display: 'flex', justifyContent: 'center' }}>
              <Space size='large'>
                <Button onClick={() => history.back()}>关闭</Button>
                {
                  !searchParams.get('detail') && <Button type='primary' onClick={submit}>保存</Button>
                }
              </Space>
            </div>
          </Card>
        </Form>
      </Spin>
    </PageContainer >
  );
}
export default AddOrEditOrDetail
management/src/pages/work-order/banner/index.jsx
New file
@@ -0,0 +1,142 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { Button, message, Space } from 'antd';
import { useRef, useState } from 'react';
import { Access, history, useAccess } from 'umi';
import { getList, updateStatus, deleteBanner } from './service'
const Banner = () => {
  const actionRef = useRef();
  const access = useAccess();
  const columns = [
    {
      title: 'banner名称',
      dataIndex: 'bannerName'
    },
    // {
    //   title: '添加时间',
    //   dataIndex: 'createTime',
    //   hideInSearch: true,
    // },
    // {
    //   title: '排序',
    //   dataIndex: 'sortNum',
    //   hideInSearch: true,
    // },
    // {
    //   title: '状态',
    //   dataIndex: 'listingStatus',
    //   valueEnum: {
    //     '上架中': { text: '上架中' },
    //     '已下架' : { text: '已下架' },
    //   }
    // },
    {
      title: '操作',
      hideInSearch: true,
      render: (text, record) => {
        return (
          <Space>
            <Button
              type="link"
              onClick={() => {
                history.push(`/marketing/banner/add?id=${record.id}&edit=true`);
              }}
            >
              编辑
            </Button>
            <Button
              type="link"
              onClick={() => {
                showDelConfirm(async () => {
                  let status = await sendRequest(deleteBanner,  record.id)
                  if (status) {
                    actionRef.current.reload();
                  }
                },'确认删除所选信息吗?');
              }}
            >
              删除
            </Button>
            {/* <Button
              type="link"
              onClick={() => {
                history.push( `/marketing/banner/add?id=${record.id}&detail=true`);
              }}
            >
              查看详情
            </Button>
            {
              record.listingStatus == '已下架' &&
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(updateStatus, { id: record.id, listingStatus: '上架中' })
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认上架所选信息吗?');
                }}
              >
                上架
              </Button>
            }
            {
              record.listingStatus == '上架中' &&
              <Button
                type="link"
                onClick={async () => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(updateStatus, { id: record.id, listingStatus: '已下架' })
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认下架所选信息吗?');
                }}
              >
                下架
              </Button>
            } */}
          </Space >
        );
      },
    },
  ]
  return <div>
    <PageContainer title='banner管理'>
      <ProTable
        rowKey='id'
        actionRef={actionRef}
        columns={columns}
        pagination={{
          showSizeChanger: true,
          showQuickJumper: true,
          defaultPageSize: 10,
        }}
        request={(params) => {
          params.bannerType = Number(params.bannerType)
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={(action, selectRows) => [
            <Space>
              <Button
                type="primary"
                onClick={() => {
                  history.push({
                    pathname: `/marketing/banner/add`,
                  });
                }}
              >
                添加
              </Button>
            </Space>
        ]}
      />
    </PageContainer>
  </div>;
};
export default Banner;
management/src/pages/work-order/banner/service.js
New file
@@ -0,0 +1,52 @@
import { request } from '@umijs/max';
// 列表
export const getList = async (data) => {
    return request(`/promotion/mgt/promotion-banner/page`, {
        method: 'POST',
        data
    });
}
// 详情
export const getDetail = async (id) => {
    return request(`/promotion/mgt/promotion-banner/detail/${id}`, {
        method: 'GET',
        // data
    });
}
// 详情列表
export const getDetailList = async (data) => {
    return request(`/goods/mgt/goods-sku/page`, {
        method: 'POST',
        data
    });
}
// 删除
export const deleteBanner = async (id) => {
    return request(`/promotion/mgt/promotion-banner/${id}`, {
        method: 'delete',
        // params
    });
}
// 添加 编辑
export const addAndEdit = async (data) => {
    return request('/promotion/mgt/promotion-banner/save', {
        method: 'POST',
        data,
    });
}
// 上下架
export const updateStatus = async (data) => {
    return request(`/promotion/mgt/promotion-banner/upd-status`, {
        method: 'POST',
        data
    });
}
management/src/pages/work-order/problem-type/components/addAndEdit.jsx
New file
@@ -0,0 +1,63 @@
import { Form, Input, Modal, Select } from 'antd';
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
const formItemLayout = {
  labelCol: { span: 7 },
  wrapperCol: { span: 12 },
};
const AddEditView = ({ visible, onSave, onUpdate, onCancel, }, ref) => {
  const [form] = Form.useForm();
  const [editData, setEditData] = useState({});
  /**
   * 确定按钮事件
   */
  const okHandle = () => {
    form.validateFields().then((values) => {
      if (editData.id) {
        values.id = editData.id;
        onUpdate(values);
      } else {
        onSave(values);
      }
    });
  };
  useImperativeHandle(ref, () => {
    return {
      refreshData: (data) => {
        form.resetFields();
        form.setFieldsValue(data);
        setEditData(data);
      },
      clean: () => {
        form.resetFields();
      },
    };
  });
  return (
    <Modal
      getContainer={false}
      width="25%"
      destroyOnClose
      title={editData.id ? '编辑问题类型' : '添加问题类型'}
      open={visible}
      onCancel={() => onCancel(false)}
      onOk={okHandle}
    >
      <Form layout="horizontal" {...formItemLayout} form={form}>
      <Form.Item
          name="categoryName"
          label="问题名称"
          rules={[{ required: true, message: '请输入' }]}
        >
          <Input placeholder="请输入" />
        </Form.Item>
      </Form>
    </Modal>
  );
};
export default forwardRef(AddEditView);
management/src/pages/work-order/problem-type/index.jsx
New file
@@ -0,0 +1,115 @@
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, Space } from 'antd';
import { useRef, useState } from 'react';
import { useAccess,Access } from 'umi';
import AddAndEdit from './components/addAndEdit';
import { addAndEdit, del, getList } from './service';
const Account = () => {
  const actionRef = useRef();
  const addViewRef = useRef();
  const [modalVisible, handleModalVisible] = useState(false);
  const access = useAccess();
  const columns = [
    {
      title: '问题类型名称',
      dataIndex: 'categoryName',
    },
    {
      title: '操作',
      hideInSearch: true,
      render: (text, record) => {
        return (
          <Space>
            {/* <Access accessible={access.pm5 || false}> */}
              <Button
                type="link"
                onClick={() => {
                  addViewRef.current.refreshData(record);
                  handleModalVisible(true);
                }}
              >
                编辑
              </Button>
            {/* </Access> */}
            {/* <Access accessible={access.pm5 || false}> */}
            <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(del, record.id);
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认删除该信息吗?');
                }}
              >
                删除
              </Button>
            {/* </Access> */}
          </Space>
        );
      },
    },
  ];
  return (
    <div>
      <PageContainer>
        <ProTable
          rowKey="id"
          actionRef={actionRef}
          columns={columns}
          pagination={{
            showSizeChanger: true,
            showQuickJumper: true,
            defaultPageSize: 10,
          }}
          search={{
            labelWidth: 'auto',
          }}
          request={(params) => {
            return buildProTableDataSource(getList, params);
          }}
          toolBarRender={(action, selectRows) => [
            <Space>
              {/* <Access accessible={access.pm4 || false}> */}
                <Button
                  type="primary"
                  onClick={() => {
                    addViewRef.current.refreshData({});
                    handleModalVisible(true);
                  }}
                >
                  添加
                </Button>
              {/* </Access> */}
            </Space>,
          ]}
        />
        <AddAndEdit
          ref={addViewRef}
          visible={modalVisible}
          onCancel={() => handleModalVisible(false)}
          onSave={async (fileds) => {
            const success = await sendRequest(addAndEdit, fileds);
            if (success) {
              handleModalVisible(false);
              actionRef.current.reload();
            }
          }}
          onUpdate={async (fileds) => {
            const success = await sendRequest(addAndEdit, fileds);
            if (success) {
              handleModalVisible(false);
              actionRef.current.reload();
            }
          }}
        />
      </PageContainer>
    </div>
  );
};
export default Account;
management/src/pages/work-order/problem-type/service.js
New file
@@ -0,0 +1,31 @@
import { request } from '@umijs/max';
// 列表
export const getList = async (data) => {
    return request(`/goods/mgt/goods-category/page`, {
        method: 'POST',
        data
    });
}
// 添加dept
export const addAndEdit = async (data) => {
    return request('/goods/mgt/goods-category/save', {
        method: 'POST',
        data,
    });
}
// 批量删除dept
export const del = async (id) => {
    return request(`/goods/mgt/goods-category/${id}`, {
        method: 'DELETE',
        // data
    });
}
management/src/requestErrorConfig.ts
@@ -52,7 +52,7 @@
      const { data } = response as unknown as ResponseStructure;
      if (data?.code === 103 || data?.code === 401) {
        localStorage.clear()
        history.replace('/login')
        // history.replace('/login')
        return Promise.resolve(response)
      }
      if (data?.code != 200) {