Browse Source

提交

prod
zzc 9 months ago
parent
commit
97122cbd8d
  1. 1
      app
  2. 7648
      package-lock.json
  3. 5
      package.json
  4. 216
      大唐会议前台1/App.vue
  5. 9
      大唐会议前台1/common/config.js
  6. BIN
      大唐会议前台1/imgs/arrow-left.png
  7. BIN
      大唐会议前台1/imgs/back.png
  8. BIN
      大唐会议前台1/imgs/bg-top.png
  9. BIN
      大唐会议前台1/imgs/left.png
  10. BIN
      大唐会议前台1/imgs/leftLogo.png
  11. BIN
      大唐会议前台1/imgs/out.png
  12. BIN
      大唐会议前台1/imgs/th.png
  13. BIN
      大唐会议前台1/imgs/tx.png
  14. 156
      大唐会议前台1/manifest.json
  15. 26
      大唐会议前台1/pages.json
  16. 239
      大唐会议前台1/pages/components/MeetingList.vue
  17. 169
      大唐会议前台1/pages/index/details.vue
  18. 172
      大唐会议前台1/pages/index/index.vue
  19. 302
      大唐会议前台1/pages/index/pdf.vue
  20. 303
      大唐会议前台1/pages/index/pdf平铺.vue
  21. BIN
      大唐会议前台1/pages/user/leftLog.jpg
  22. BIN
      大唐会议前台1/pages/user/leftLogo.jpg
  23. 402
      大唐会议前台1/pages/user/login.vue
  24. BIN
      大唐会议前台1/static/quxia.4289b7cb.png
  25. 8
      大唐会议后台/.env.development
  26. 15
      大唐会议后台/.env.production
  27. 21
      大唐会议后台/.env.staging
  28. 1
      大唐会议后台/package.json
  29. 48
      大唐会议后台/public/index.html
  30. BIN
      大唐会议后台/public/quxia.4289b7cb.png
  31. 111
      大唐会议后台/src/layout/components/Navbar.vue
  32. 69
      大唐会议后台/src/layout/components/Sidebar/Logo.vue
  33. BIN
      大唐会议后台/src/layout/components/Sidebar/logo.png
  34. 177
      大唐会议后台/src/router/index.js
  35. 250
      大唐会议后台/src/utils/request.js
  36. 80
      大唐会议后台/src/views/components/MeetingList.vue
  37. 4
      大唐会议后台/src/views/index.vue
  38. BIN
      大唐会议后台/src/views/leftLogo.png
  39. 6
      大唐会议后台/src/views/login.vue
  40. 17
      大唐会议后台/src/views/meeting/index.vue
  41. 49
      大唐会议后台/src/views/meetingDetails/index.vue
  42. BIN
      大唐会议后台/src/views/welcome.5e305008.png
  43. 5
      大唐会议后台/vue.config.js
  44. BIN
      大唐会议后台/大唐会议后台-22.zip

1
app

@ -0,0 +1 @@
Subproject commit ecb7c36653ad8a8c8fb4a6793a85303889a3f268

7648
package-lock.json

File diff suppressed because it is too large

5
package.json

@ -1,5 +0,0 @@
{
"dependencies": {
"vue-pdf": "^4.3.0"
}
}

216
大唐会议前台1/App.vue

@ -0,0 +1,216 @@
<<<<<<< HEAD
=======
<script>
import {
mapState,
mapMutations
} from 'vuex';
export default {
data() {
return {
isAudio: true,
};
},
methods: {
...mapMutations(['setTrainPath']),
},
mounted() {},
//
onLoad() {},
onLaunch() {},
};
</script>
<style lang="scss">
/*每个页面公共css */
@import '@/uni_modules/uview-ui/index.scss';
@import 'common/demo.scss';
uni-view,
p,
span {
font-size: 16px;
}
/deep/.u-modal{
background: #ffffff;
}
/deep/.u-modal__content__text span{
font-size: 20px;
}
.avatarobx {
top: 16px;
right: 16px;
position: fixed;
display: flex;
align-items: center;
color: #fff;
.name{
font-size: 18px;
}
.view-out {
margin-right: 10px;
// border-bottom:1px solid #fff;
}
.avatar {
border-radius: 6px;
width: 30px;
height: 30px;
margin-left: 18px;
}
.out {
width: 30px;
height: 30px
}
}
.view-backimg {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: -1;
.view-backimg-top {
height: 50vh;
background-image: url('./imgs/bg-top.png');
background-size: 100% 100%;
}
.view-backimg-bottom {
height: 50vh;
background-image: url('./imgs/left.png');
background-size: 100% 100%;
}
}
/deep/.u-toast__content__text--error,
/deep/.u-toast__content__text--success {
max-width: 500px !important;
}
.back{
width:40px;
position: fixed !important;
top: 16px;
left: 16px;
}
.logo {
width: 500px;
position: fixed !important;
top:16px;
left: 16px;
}
//
.statusGray {
color: #c0c4cc;
}
.statusGreen {
color: #10b884;
}
.statusRed {
color: red;
}
.view-none {
width: 100%;
font-size: 16px !important;
line-height: 50px;
color: #909399;
text-align: center;
}
/deep/.uni-pagination__num-tag {
width: 30px !important;
min-width: 30px !important;
height: 30px !important;
font-size: 16px !important;
}
.width-60 {
min-width: 60px !important;
}
.width-100 {
min-width: 100px !important;
}
.width-160 {
min-width: 160px !important;
}
.width-250 {
min-width: 250px !important;
}
.uni-select__input-box,
.uni-select {
height: 40px !important;
}
.uni-select {
font-size: 16px !important;
}
.uni-select__input-placeholder {
font-size: 16px !important;
}
.uni-input-input,
uni-input {
border-radius: 5px;
height: 38px !important;
font-size: 16px !important;
}
uni-input {
padding: 0 10px;
}
.uni-icons {
font-size: 24px !important;
}
.u-popup__content {
background-color: rgba(0, 0, 0, 0) !important;
}
.uni-input-placeholder {
font-size: 16px;
line-height: 40px;
}
.u-input--square {
height: 28px !important;
padding: 6px 9px !important;
}
.u-input__content__field-wrapper__field {
font-size: 16px !important;
}
uni-video {
width: 100% !important;
height: 100% !important;
}
.u-toast {
font-size: 30px !important;
}
//
.u-picker {
background: #fff;
}
.u-toolbar__wrapper__cancel,
.u-toolbar__wrapper__confirm,
.u-toolbar__title {
font-size: 26px !important;
}
</style>
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

9
大唐会议前台1/common/config.js

@ -0,0 +1,9 @@
<<<<<<< HEAD
=======
module.exports = {
// baseUrl: 'https://test.tall.wiki/datangMeeting/', // 测试
baseUrl: 'http://10.89.114.11:9001/datangMeeting/', // 大唐
versionsNum: '1.0.1.7',
versions: '测试版',
};
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

BIN
大唐会议前台1/imgs/arrow-left.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
大唐会议前台1/imgs/back.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
大唐会议前台1/imgs/bg-top.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

BIN
大唐会议前台1/imgs/left.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 KiB

BIN
大唐会议前台1/imgs/leftLogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
大唐会议前台1/imgs/out.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
大唐会议前台1/imgs/th.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

BIN
大唐会议前台1/imgs/tx.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

156
大唐会议前台1/manifest.json

@ -0,0 +1,156 @@
{
"name" : "神头发电会议系统",
"appid" : "__UNI__FBDBEC9",
"description" : "多平台快速开发的UI框架",
"versionName" : "1.0.0",
"versionCode" : 1,
"transformPx" : false,
"app-plus" : {
"optimization" : {
"subPackages" : true
},
"safearea" : {
"bottom" : {
"offset" : "none"
}
},
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"usingComponents" : true,
"nvueCompiler" : "uni-app",
"compilerVersion" : 3,
"modules" : {
"Webview-x5" : {},
"Barcode" : {},
"Camera" : {}
},
"distribute" : {
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
},
"ios" : {
"idfa" : false,
"dSYMs" : false
},
"sdkConfigs" : {
"ad" : {}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
}
},
"quickapp" : {},
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false,
"es6" : false,
"minified" : false,
"postcss" : false
},
"optimization" : {
"subPackages" : true
},
"usingComponents" : true,
"mergeVirtualHostAttributes" : true
},
"mp-alipay" : {
"usingComponents" : true,
"component2" : true
},
"mp-qq" : {
"optimization" : {
"subPackages" : true
},
"appid" : "15646153"
},
"mp-baidu" : {
"usingComponents" : true,
"appid" : ""
},
"mp-toutiao" : {
"usingComponents" : true,
"appid" : ""
},
"h5" : {
"template" : "template.h5.html",
"router" : {
"mode" : "history",
"base" : "/datang/meeting/client/"
},
"optimization" : {
"treeShaking" : {
"enable" : false
}
},
"title" : "神头发电会议系统",
"sdkConfigs" : {
"maps" : {
"qqmap" : {
"key" : ""
}
}
},
"domain" : "",
"devServer" : {
"https" : false
}
}
}

26
大唐会议前台1/pages.json

@ -0,0 +1,26 @@
<<<<<<< HEAD
=======
{
"pages": [
{
"path": "pages/index/index" //
},
{
"path": "pages/index/details" //
},
{
"path": "pages/index/pdf" // pdf
},
{
"path": "pages/user/login" //
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "神头发电会议系统",
"navigationBarBackgroundColor": "#FFFFFF",
"backgroundColor": "#FFFFFF",
"navigationStyle": "custom"
}
}
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

239
大唐会议前台1/pages/components/MeetingList.vue

@ -0,0 +1,239 @@
<<<<<<< HEAD
=======
<template>
<view>
<view class="view-li" v-for="(item, index) in infos" :key="index">
<view class="li-item" v-if="item.type == 'title'">
<view class="li-title">{{item.title}}</view>
</view>
<view class="li-item " v-if="item.type == 'file-pdf'">
<view class="li-pdf" @click="handlePdf(item)"> {{item.filePdfName}}
<span style="color:blue"> 预览</span>
</view>
</view>
<view class="li-item" v-if="item.type == 'richtext'">
<view class="li-text">{{item.richtext}}</view>
</view>
<view class="view-ul" v-if="item.infos && item.infos.length">
<MeetingList :detailsId='detailsId' :infos='item.infos'></MeetingList>
</view>
</view>
<u-popup :show="show" @close="handleClose" mode="center">
<view class="popup-close" @click='handleClose'>
<uni-icons class="popup-icons" type="closeempty" size="30"></uni-icons>
</view>
<view class="popup-box">
<view class="view-pdf">
<pdf v-if='show' ref="pdf" :page="pageNum" @progress="loadedRatio = $event"
@page-loaded="pageLoaded($event)" @num-pages="pageTotalNum=$event" @error="pdfError($event)"
@link-clicked="page = $event" :src="filePdfUrl">
</pdf>
<div class="tools">
<button :theme="'default'" type="submit" @click.stop="prePage" class="mr10">
上一页
</button>
<div class="page">{{pageNum}}/{{pageTotalNum}}</div>
<button :theme="'default'" type="submit" @click.stop="nextPage" class="mr10">
下一页
</button>
</div>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import pdf from 'vue-pdf'
export default {
name: 'MeetingList',
props: ['infos','detailsId'],
components: {
pdf
},
data() {
return {
show: false,
filePdfUrl: "",
pageNum: 1,
pageTotalNum: 1,
//
loadedRatio: 0,
curPageNum: 0,
pdfId: '',
};
},
onShow() {
console.log('infos', infos)
},
methods: {
//
handleClose() {
this.pdfId = ''
this.show = false
},
//
prePage() {
var page = this.pageNum
page = page > 1 ? page - 1 : this.pageTotalNum
this.pageNum = page
},
//
nextPage() {
var page = this.pageNum
page = page < this.pageTotalNum ? page + 1 : 1
this.pageNum = page
},
// e
pageLoaded(e) {
this.curPageNum = e
},
//
pdfError(error) {
console.error(error)
},
// pdf
handlePdf(_item) {
// this.filePdfUrl = _item.filePdfUrl
// this.show = true
uni.navigateTo({
url: `/pages/index/pdf?filePdfUrl=${_item.filePdfUrl}&detailsId=${this.detailsId}`,
});
},
},
//
onLoad() {},
};
</script>
<style lang="scss" scoped>
.popup-close {
position: fixed;
right: 20px;
top: 20px;
z-index: 9999;
/deep/.uni-icons {
font-size: 40px !important;
color: #fff !important;
}
}
/deep/.u-popup__content{
position: relative;
.tools {
position: absolute;
left:10px;
right:10px;
bottom:0px;
background:#fff;
padding-top:10px;
padding-bottom:10px;
}
}
.popup-box {
max-height: 80vh;
overflow: auto;
}
.view-gb {
max-width: 100px;
margin-left: 16px;
}
.view-li {
// padding-left: 10px;
}
.view-pdf {
width: 50vw;
padding: 16px 16px 50px 16px;
border: 1px solid #ededed;
background: #fff;
.tools {
display: flex;
uni-button {
font-size: 18px;
line-height: 44px;
height: 44px;
flex: 1
}
.page {
line-height: 44px;
height: 44px;
width: 100px;
text-align: center;
}
}
}
.pathsName {
color: #fff;
font-size: 12px;
}
.pdfBox .el-button {
background: rgba(255, 255, 255, 0);
border: none;
/* width: 30px; */
}
.pdfBox>>>.el-icon-arrow-left,
.pdfBox>>>.el-icon-arrow-right {
font-size: 18px;
color: #000;
}
.pdfBox .page {
margin: 0 10px;
}
.pdfBox .el-button-group {
width: 100%;
justify-content: center;
display: flex;
align-items: center;
padding-top: 20px;
}
.pdfBox {
padding-bottom: 20px;
margin-top: 20px;
background: #fff;
min-height: 300px;
}
.contLeft-pane>>>.el-form-item__label {
text-align: right;
margin-right: 10px !important;
padding: 0 !important;
}
.contLeft-pane>>>.el-form-item--medium .el-form-item__content {
flex: 1;
}
.li-item {
uni-view {
font-size: 20px;
line-height: 40px;
span{
font-size: 20px;
}
}
.li-title {
font-size: 20px;
font-weight: bold;
line-height: 30px;
}
}
</style>
<style></style>
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

169
大唐会议前台1/pages/index/details.vue

@ -0,0 +1,169 @@
<<<<<<< HEAD
=======
<template>
<view class="box">
<!-- <image class="back" src='../../imgs/back.png' mode="widthFix" @click="handleBack"></image> -->
<image class="logo" src='../../imgs/logo.png' alt="" mode="widthFix" ></image>
<view class="box-cent">
<view class="box-cent1">
<view class="view-box">
<view style="text-align: center;">
<span class="view-title"> {{listData.title}}</span>
</view>
<view class="view-ul">
<MeetingList :detailsId='detailsId' :infos='listData.infos'></MeetingList>
</view>
</view>
</view>
<u-modal v-if="show" :show="show" @cancel="show = false" :showCancelButton="true" content='是否确认退出登录?' @confirm="handleOut"></u-modal>
</view>
<!-- 底部背景图 -->
<view class="view-backimg">
<view class="view-backimg-top"></view>
<!-- <view class="view-backimg-bottom"></view> -->
</view>
<!-- 头像 - 头像 -->
<view class="avatarobx">
<view class="name">{{userName}}</view>
<image @click='handleBack' class="avatar" src='../../imgs/arrow-left.png' mode="widthFix"></image>
<image @click="show = true" class="avatar" src='../../imgs/out.png' mode="widthFix"></image>
</view>
</view>
</template>
<script>
import {
queryMeeting,
meetingDetails
} from "@/common/api";
import {
mapMutations
} from 'vuex';
import MeetingList from "../components/MeetingList.vue"
export default {
components: {
MeetingList
},
data() {
return {
listData: [],
data: [],
userName: uni.getStorageSync("userName"),
show: false,
detailsId:'',
};
},
created() {
let routes = getCurrentPages(); //
let curParam = routes[routes.length - 1].options; //
this.detailsId = curParam.id
console.log('curParam', this.detailsId)
this.getMeetingDetails(curParam.id) //
},
methods: {
// 退
handleOut(){
uni.clearStorage();
uni.reLaunch({
url: '/pages/user/login',
});
},
// logo
handleBack() {
uni.navigateTo({
url: `/pages/index/index`,
});
// uni.navigateBack({
// delta: 1
// });
},
//
handleItemClaick(_item) {
// enable false
if (!_item.enable) return
uni.navigateTo({
url: `/pages/index/details?id=${_item.id}`,
});
},
//
async getMeetingDetails(meetingId) {
const res = await meetingDetails({
param: {
meetingId,
}
});
const {
code,
data,
msg
} = res;
if (code === 200) {
this.listData = data
console.log(this.listData)
}
},
},
//
onLoad() {},
};
</script>
<style lang="scss" scoped>
/deep/ .u-modal__content{
text-align: center;
}
.avatar{
}
.view-box {
margin-top: 50px;
}
.view-ul {
text-align: left;
margin-bottom: 16px;
.view-li {
font-size: 18px;
line-height: 26px;
}
}
.view-title {
display: inline-block;
border: 1px solid #000;
padding: 0 14px;
margin-bottom: 30px;
line-height: 50px;
border-radius: 6px;
font-size: 20px;
font-weight: bold;
}
.box {
height: 100vh;
box-sizing: border-box;
padding: 20px 100px;
display: flex;
flex-direction: column;
.box-cent {
flex: 1;
margin-top: 70px;
position: relative;
}
.box-cent1 {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
}
}
</style>
<style></style>
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

172
大唐会议前台1/pages/index/index.vue

@ -0,0 +1,172 @@
<<<<<<< HEAD
=======
<template>
<view class="box">
<!-- <image class="back" src='../../imgs/back.png' mode="widthFix" @click='handleBack'></image> -->
<image class="logo" src='../../imgs/logo.png' mode="widthFix" ></image>
<view class="box-cent">
<view class="box-cent1">
<view class="view-box" v-for="(item, index) in listData" :key="index">
<view style="text-align: center;">
<span class="view-title"> {{item.dateTitle}}</span>
</view>
<view class="view-ul">
<view class="view-li" v-for="(row, rind) in item.meetingList" :key="rind"
>
<span @click="handleItemClaick(item,row)">{{rind + 1}}. {{row.title}}</span>
</view>
</view>
</view>
<view v-if="!listData.length" class="view-none"> 暂无会议 </view>
</view>
<u-modal v-if="show" :show="show" @cancel="show = false" :showCancelButton="true" content='是否确认退出登录?' @confirm="handleOut"></u-modal>
</view>
<!-- 底部背景图 -->
<view class="view-backimg">
<view class="view-backimg-top"></view>
<!-- <view class="view-backimg-bottom"></view> -->
</view>
<!-- 头像 - 头像 -->
<view class="avatarobx">
<view class="name">{{userName}}</view>
<!-- <image @click='handleBack' class="avatar" src='../../imgs/arrow-left.png' mode="widthFix"></image> -->
<image @click="show = true" class="avatar" src='../../imgs/out.png' mode="widthFix"></image>
</view>
</view>
</template>
<script>
import {
queryMeeting,
meetingDetails
} from "@/common/api";
import {
mapMutations
} from 'vuex';
export default {
data() {
return {
listData: [],
userName: uni.getStorageSync("userName"),
show: false
};
},
created() {
this.getQueryMeeting() //
},
onShow(){
this.userName = uni.getStorageSync("userName")
console.log('this.userName',this.userName)
},
methods: {
// logo
handleBack() {
uni.navigateTo({
url: `/pages/user/login`,
});
// uni.navigateBack({
// delta: 1
// });
},
// 退
handleOut(){
uni.clearStorage();
uni.reLaunch({
url: '/pages/user/login',
});
},
//
handleItemClaick(_item, _row) {
// enable false
if (!_item.enable) return
uni.navigateTo({
url: `/pages/index/details?id=${_row.id}`,
});
},
//
async getQueryMeeting() {
const res = await queryMeeting({
param: {}
});
const {
code,
data,
msg
} = res;
if (code === 200) {
this.listData = data
}
},
},
//
onLoad() {},
};
</script>
<style lang="scss" scoped>
/deep/ .u-modal__content{
text-align: center;
}
.view-box{
margin-top:50px ;
}
.view-none{
height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 40px !important;
}
.view-ul {
text-align: left;
margin-bottom: 16px;
.view-li {
span{
font-size: 20px;
line-height: 40px;
}
}
}
.view-title {
display: inline-block;
border: 1px solid #000;
padding: 0 14px;
margin-bottom: 30px;
line-height: 50px;
border-radius: 6px;
font-size: 20px;
font-weight: bold;
}
.box {
height: 100vh;
background-size: cover;
box-sizing: border-box;
padding: 20px 100px;
display: flex;
flex-direction: column;
.box-cent {
flex: 1;
margin-top: 70px;
position: relative;
}
.box-cent1 {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
}
}
</style>
<style></style>
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

302
大唐会议前台1/pages/index/pdf.vue

@ -0,0 +1,302 @@
<template>
<view class="box" style="position: relative;">
<!-- <image class="back" src='../../imgs/back.png' mode="widthFix" @click="handleBack"></image> -->
<image class="logo" src='../../imgs/logo.png' mode="widthFix" ></image>
<view class="box-cent">
<view class="box-cent1">
<view class="view-pdf">
<pdf ref="pdf" :page="pageNum" @progress="loadedRatio = $event" @page-loaded="pageLoaded($event)"
@num-pages="pageTotalNum=$event" @error="pdfError($event)" @link-clicked="page = $event"
:src="filePdfUrl">
</pdf>
</view>
</view>
<u-modal v-if="show" :show="show" @cancel="show = false" :showCancelButton="true" content='是否确认退出登录?' @confirm="handleOut"></u-modal>
</view>
<!-- 底部背景图 -->
<view class="view-backimg">
<view class="view-backimg-top"></view>
<!-- <view class="view-backimg-bottom"></view> -->
</view>
<div class="tools">
<view style="width:50vw;display: flex;margin: auto;">
<button :theme="'default'" type="submit" @click.stop="prePage" class="mr10">
上一页
</button>
<div class="page">{{pageNum}}/{{pageTotalNum}}</div>
<button :theme="'default'" type="submit" @click.stop="nextPage" class="mr10">
下一页
</button>
</view>
</div>
<!-- 头像 - 头像 -->
<view class="avatarobx">
<view class="name">{{userName}}</view>
<image @click='handleBack' class="avatar" src='../../imgs/arrow-left.png' mode="widthFix"></image>
<image @click="show = true" class="avatar" src='../../imgs/out.png' mode="widthFix"></image>
</view>
</view>
</template>
<script>
import pdf from 'vue-pdf'
export default {
name: 'MeetingList',
props: ['infos'],
components: {
pdf
},
data() {
return {
pageNum: 1,
pageTotalNum: 1,
//
loadedRatio: 0,
curPageNum: 0,
filePdfUrl: '',
userName: uni.getStorageSync("userName"),
show: false,
detailsId:'',
};
},
created() {
let routes = getCurrentPages(); //
let curParam = routes[routes.length - 1].options; //
this.detailsId = curParam.detailsId
console.log('this.detailsId ',this.detailsId)
this.filePdfUrl = curParam.filePdfUrl
},
methods: {
// logo
handleBack() {
uni.navigateTo({
url: `/pages/index/details?id=${this.detailsId}`,
});
// uni.navigateBack({
// delta: 1
// });
},
// 退
handleOut() {
uni.clearStorage();
uni.reLaunch({
url: '/pages/user/login',
});
},
// logo
handleLogo() {
uni.navigateTo({
url: `/pages/index/index`,
});
},
//
handleClose() {
this.pdfId = ''
this.show = false
},
//
prePage() {
var page = this.pageNum
page = page > 1 ? page - 1 : this.pageTotalNum
this.pageNum = page
},
//
nextPage() {
var page = this.pageNum
page = page < this.pageTotalNum ? page + 1 : 1
this.pageNum = page
},
// e
pageLoaded(e) {
this.curPageNum = e
},
//
pdfError(error) {
console.error(error)
},
},
//
onLoad() {},
};
</script>
<style lang="scss" scoped>
/deep/ .u-modal__content{
text-align: center;
}
.popup-close {
position: fixed;
right: 20px;
top: 20px;
z-index: 9999;
/deep/.uni-icons {
font-size: 40px !important;
color: #fff !important;
}
}
.view-gb {
max-width: 100px;
margin-left: 16px;
}
.view-li {
// padding-left: 10px;
}
.view-pdf {
width: 60vw;
margin: auto;
}
.tools {
display: flex;
align-items: center;
position: absolute;
bottom: 26px;
left:16px;
right:16px;
uni-button {
font-size: 18px;
line-height: 44px;
height: 44px;
flex: 1
}
.page {
line-height: 44px;
height: 44px;
width: 100px;
text-align: center;
}
}
.pathsName {
color: #fff;
font-size: 12px;
}
.pdfBox .el-button {
background: rgba(255, 255, 255, 0);
border: none;
/* width: 30px; */
}
.pdfBox>>>.el-icon-arrow-left,
.pdfBox>>>.el-icon-arrow-right {
font-size: 18px;
color: #000;
}
.pdfBox .page {
margin: 0 10px;
}
.pdfBox .el-button-group {
width: 100%;
justify-content: center;
display: flex;
align-items: center;
padding-top: 20px;
}
.pdfBox {
padding-bottom: 20px;
margin-top: 20px;
background: #fff;
min-height: 300px;
}
.contLeft-pane>>>.el-form-item__label {
text-align: right;
margin-right: 10px !important;
padding: 0 !important;
}
.contLeft-pane>>>.el-form-item--medium .el-form-item__content {
flex: 1;
}
.li-item {
uni-view {
font-size: 20px;
line-height: 40px;
span {
font-size: 20px;
}
}
.li-title {
font-size: 20px;
font-weight: bold;
line-height: 30px;
}
}
.view-box {
margin-top: 50px;
}
.view-none {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 40px !important;
}
.view-ul {
text-align: left;
margin-bottom: 16px;
.view-li {
span {
font-size: 20px;
line-height: 40px;
}
}
}
.view-title {
display: inline-block;
border: 1px solid #000;
padding: 0 14px;
margin-bottom: 30px;
line-height: 50px;
border-radius: 6px;
font-size: 20px;
font-weight: bold;
}
.box {
height: 100vh;
background-size: cover;
box-sizing: border-box;
padding: 20px 100px;
display: flex;
flex-direction: column;
.box-cent {
flex: 1;
margin-top: 70px;
position: relative;
}
.box-cent1 {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
}
}
</style>
<style></style>

303
大唐会议前台1/pages/index/pdf平铺.vue

@ -0,0 +1,303 @@
<template>
<view class="box" style="position: relative;">
<!-- <image class="back" src='../../imgs/back.png' mode="widthFix" @click="handleBack"></image> -->
<image class="logo" src='../../imgs/logo.png' mode="widthFix" ></image>
<view class="box-cent">
<view class="box-cent1">
<view class="view-pdf">
<pdf v-for="i in numPages" :key="i" :src="filePdfUrl" :page="i"></pdf>
</view>
</view>
<u-modal v-if="show" :show="show" @cancel="show = false" :showCancelButton="true" content='是否确认退出登录?' @confirm="handleOut"></u-modal>
</view>
<!-- 底部背景图 -->
<view class="view-backimg">
<view class="view-backimg-top"></view>
<!-- <view class="view-backimg-bottom"></view> -->
</view>
<!-- <div class="tools">
<view style="width:50vw;display: flex;margin: auto;">
<button :theme="'default'" type="submit" @click.stop="prePage" class="mr10">
上一页
</button>
<div class="page">{{pageNum}}/{{pageTotalNum}}</div>
<button :theme="'default'" type="submit" @click.stop="nextPage" class="mr10">
下一页
</button>
</view>
</div> -->
<!-- 头像 - 头像 -->
<view class="avatarobx">
<view class="name">{{userName}}</view>
<image @click='handleBack' class="avatar" src='../../imgs/arrow-left.png' mode="widthFix"></image>
<image @click="show = true" class="avatar" src='../../imgs/out.png' mode="widthFix"></image>
</view>
</view>
</template>
<script>
import pdf from 'vue-pdf'
export default {
name: 'MeetingList',
props: ['infos'],
components: {
pdf
},
data() {
return {
filePdfUrl: '',
userName: uni.getStorageSync("userName"),
detailsId:'',
numPages:'',
show:false
};
},
created() {
let routes = getCurrentPages(); //
let curParam = routes[routes.length - 1].options; //
this.detailsId = curParam.detailsId
this.filePdfUrl = curParam.filePdfUrl
this.getNumPages(this.filePdfUrl )
},
methods: {
getNumPages(url) {
this.pdfSrc=url
this.pdfSrc = pdf.createLoadingTask(this.pdfSrc)
this.pdfSrc.promise.then(pdf => {
this.numPages = pdf.numPages
console.log('this.numPages',this.numPages)
})
},
// logo
handleBack() {
uni.navigateTo({
url: `/pages/index/details?id=${this.detailsId}`,
});
// uni.navigateBack({
// delta: 1
// });
},
// 退
handleOut() {
uni.clearStorage();
uni.reLaunch({
url: '/pages/user/login',
});
},
// logo
handleLogo() {
uni.navigateTo({
url: `/pages/index/index`,
});
},
//
handleClose() {
this.pdfId = ''
this.show = false
},
//
prePage() {
var page = this.pageNum
page = page > 1 ? page - 1 : this.pageTotalNum
this.pageNum = page
},
//
nextPage() {
var page = this.pageNum
page = page < this.pageTotalNum ? page + 1 : 1
this.pageNum = page
},
// e
pageLoaded(e) {
this.curPageNum = e
},
//
pdfError(error) {
console.error(error)
},
},
//
onLoad() {},
};
</script>
<style lang="scss" scoped>
/deep/ .u-modal__content{
text-align: center;
}
.popup-close {
position: fixed;
right: 20px;
top: 20px;
z-index: 9999;
/deep/.uni-icons {
font-size: 40px !important;
color: #fff !important;
}
}
.view-gb {
max-width: 100px;
margin-left: 16px;
}
.view-li {
// padding-left: 10px;
}
.view-pdf {
width: 60vw;
margin: auto;
}
.tools {
display: flex;
align-items: center;
position: absolute;
bottom: 26px;
left:16px;
right:16px;
uni-button {
font-size: 18px;
line-height: 44px;
height: 44px;
flex: 1
}
.page {
line-height: 44px;
height: 44px;
width: 100px;
text-align: center;
}
}
.pathsName {
color: #fff;
font-size: 12px;
}
.pdfBox .el-button {
background: rgba(255, 255, 255, 0);
border: none;
/* width: 30px; */
}
.pdfBox>>>.el-icon-arrow-left,
.pdfBox>>>.el-icon-arrow-right {
font-size: 18px;
color: #000;
}
.pdfBox .page {
margin: 0 10px;
}
.pdfBox .el-button-group {
width: 100%;
justify-content: center;
display: flex;
align-items: center;
padding-top: 20px;
}
.pdfBox {
padding-bottom: 20px;
margin-top: 20px;
background: #fff;
min-height: 300px;
}
.contLeft-pane>>>.el-form-item__label {
text-align: right;
margin-right: 10px !important;
padding: 0 !important;
}
.contLeft-pane>>>.el-form-item--medium .el-form-item__content {
flex: 1;
}
.li-item {
uni-view {
font-size: 20px;
line-height: 40px;
span {
font-size: 20px;
}
}
.li-title {
font-size: 20px;
font-weight: bold;
line-height: 30px;
}
}
.view-box {
margin-top: 50px;
}
.view-none {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 40px !important;
}
.view-ul {
text-align: left;
margin-bottom: 16px;
.view-li {
span {
font-size: 20px;
line-height: 40px;
}
}
}
.view-title {
display: inline-block;
border: 1px solid #000;
padding: 0 14px;
margin-bottom: 30px;
line-height: 50px;
border-radius: 6px;
font-size: 20px;
font-weight: bold;
}
.box {
height: 100vh;
background-size: cover;
box-sizing: border-box;
padding: 20px 100px;
display: flex;
flex-direction: column;
.box-cent {
flex: 1;
margin-top: 70px;
position: relative;
}
.box-cent1 {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
}
}
</style>
<style></style>

BIN
大唐会议前台1/pages/user/leftLog.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
大唐会议前台1/pages/user/leftLogo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

402
大唐会议前台1/pages/user/login.vue

@ -0,0 +1,402 @@
<<<<<<< HEAD
=======
<template>
<div>
<div class="divbox">
<div class="div-left">
<image class="logo" src='../../imgs/logo.png' mode="widthFix"></image>
</div>
<div class="div-right">
<h1 class="h1-title">内部会议系统</h1>
<u-form :model="form" :rules="rules" ref="uForm" label-position="top" label-width="100"
class="view-form">
<u-form-item label="" prop="username">
<view class="form-item-box">
<u-input autocomplete="new-password" class="form-item-input" v-model="form.username"
placeholder="请输入用户名" />
</view>
</u-form-item>
<u-form-item label="" prop="password" class="form-item-pass" style="padding-bottom: 0">
<view class="form-item-box" style="display: flex; align-items: center">
<u-input :type="!passShow ? 'password' : ''" class="form-item-input"
autocomplete="new-password" v-model="form.password" placeholder="请输入密码" />
<image @click="passShow = !passShow" v-if="passShow" mode="aspectFit" class="form-item-img"
src="../../imgs/xyj.png" style="margin-right: 14px"></image>
<image @click="passShow = !passShow" v-else mode="aspectFit" class="form-item-img"
src="../../imgs/xyj1.png" style="margin-right: 14px"></image>
</view>
</u-form-item>
<u-form-item label="" prop="code">
<view style="width:100%; display: flex;">
<view class="form-item-box" style="flex:1">
<u-input autocomplete="off" class="form-item-input" v-model="form.code"
placeholder="请输入验证码" />
</view>
<view class="code-imagebox" @click="getCaptchaImage()">
<image class='code-image' :src="codeUrl" alt=""></image>
</view>
</view>
</u-form-item>
<view @click="show = true" style="text-align: right;"> 忘记密码</view>
</u-form>
<view class="log-but" @click="handleLogin"> 登录 </view>
</div>
</div>
<u-modal :show="show" :content='configData' @confirm="show = false"></u-modal>
<u-toast ref="uToast"></u-toast>
</div>
</template>
<script>
import {
mapMutations,
mapState
} from "vuex";
import {
login,
captchaImage,
config
} from "@/common/userApi";
export default {
name: "SignIn",
components: {},
data() {
return {
show:false,
codeUrl: '', //
passShow: false,
form: {
username: "",
password: "",
},
configData:'',
rules: {
username: [{
required: true,
message: "请输入用户名",
trigger: ["blur"],
}],
password: [{
required: true,
message: "请输入密码",
trigger: ["blur"],
}],
code: [{
required: true,
message: "请输入验证码",
trigger: ["blur"],
}],
},
};
},
computed: {
...mapState("ht", ["reportId"]),
},
created() {
this.getCaptchaImage() //
this.getConfig() //
this.keyEnter()
},
methods: {
...mapMutations(["setTrainPath"]),
//
keyEnter(){
document.onkeydown = e =>{
if(e.keyCode == 13){
this.handleLogin() //
}
}
},
//
async getConfig() {
const res = await config('sys.password.forget');
const {
code,
rows,
msg
} = res;
if (code === 200) {
this.configData = rows[0]?.configValue || ''
}
},
//
async getCaptchaImage() {
const res = await captchaImage();
const {
code,
data,
msg
} = res;
if (code === 200) {
this.codeUrl = "data:image/gif;base64," + res.img;
this.form.uuid = res.uuid
}
},
//
async handleLogin() {
this.$refs.uForm.validate().then(async (formRes) => {
const param = {
username: this.form.username,
password: this.form.password,
code: this.form.code, // 456
uuid: this.form.uuid,
};
const res = await login(param);
const {
code,
data,
msg
} = res;
if (code === 200) {
uni.setStorageSync("userToken", res.token);
uni.setStorageSync("userName", this.form.username);
uni.navigateTo({
url: "/pages/index/index",
});
//
var docElm = document.documentElement;
if (docElm.requestFullscreen) {
docElm.requestFullscreen();
} else if (docElm.mozRequestFullScreen) {
docElm.mozRequestFullScreen();
} else if (docElm.webkitRequestFullScreen) {
docElm.webkitRequestFullScreen();
} else if (elem.msRequestFullscreen) {
elem.msRequestFullscreen();
}
this.handleSuccess("登录成功");
} else {
this.handleError(msg || "登录失败");
}
})
},
//
handleError(_tips) {
this.$refs.uToast.show({
type: "error",
icon: false,
message: _tips,
});
},
//
handleSuccess(_tips) {
this.$refs.uToast.show({
type: "success",
icon: false,
message: _tips,
});
},
},
};
</script>
<style lang="scss" scoped>
.view-form {
width: 80%
}
.code-imagebox {
width: 100px;
margin-left: 12px;
.code-image {
width: 100px;
height: 48px;
}
}
.log-but {
width: 400px;
line-height: 48px;
background: #3d78ff;
border-radius: 4px;
font-size: 20px;
color: #ffffff;
text-align: center;
margin-top: 36px;
}
.checkbox-box {
display: flex;
}
.view-yd {
width: 440px;
}
/deep/.u-checkbox__icon-wrap--square {
width: 18px !important;
height: 18px !important;
}
.pawss {
display: flex;
justify-content: space-between;
color: #3d78ff;
.forget {
font-size: 14px !important;
}
}
/deep/ .u-checkbox-label--left span {
font-size: 14px !important;
}
.form-fg {
height: 30px;
}
.form-item-img {
width: 20px;
height: 30px;
}
.ipt-box {
width: 380px;
margin: 0 100px;
}
.code-wrap {
display: flex;
.code-field {
flex: 1;
}
.code-btn {
margin-left: 10px;
}
i {
position: absolute;
top: 30px;
right: 15px;
cursor: pointer;
}
}
.forgetPassword {
cursor: pointer;
color: rgba(0, 0, 0, 0.54);
}
.forgetPassword:hover {
text-decoration: underline;
color: rgba(0, 0, 0, 0.87);
}
</style>
<style scoped lang="scss">
.form-item-box {
width: 100%;
border-radius: 4px 4px 4px 4px;
border: 1px solid #dcdfe6;
height: 46px;
}
.form-item-input {
height: 46px !important;
border-radius: 23px;
padding: 0 14px !important;
color: #333333;
box-sizing: border-box;
border: none;
}
/deep/ .uni-input-input {
//font-size: 50px;
}
.form-item-input:placeholder {
font-size: 16px;
color: #000;
}
.form-item-codebut {
font-size: 12px;
color: #888888;
width: 100px;
text-align: center;
border-left: 1px solid #d8d8d8;
}
/deep/ .u-form-item__body__left__content__label {
width: 100px;
font-size: 22px;
color: #000000;
margin-bottom: 16px;
}
/deep/.u-input__content__field-wrapper__field {
height: 48px;
line-height: 48px;
font-size: 16px;
}
/deep/.ant-input {
font-size: 22px;
}
/deep/.ant-input-affix-wrapper .ant-input:not(:first-child) {
padding-left: 40px;
}
.h1-title {
text-align: center;
font-weight: bold;
font-size: 36px;
width: 100%;
margin-bottom: 20px;
}
.divbox {
display: flex;
background-image: url('../../imgs/left.png');
background-position: left bottom;
background-repeat: no-repeat;
background-size: 100% ;
.div-left {
position: relative;
flex: 1;
display: flex;
justify-content: center;
align-items: center;
.equipment {
position: absolute;
bottom: 4px;
color: #6fcd9d;
}
}
}
.divbox {
width: 100%;
height: 100vh;
display: flex;
.div-left {
flex: 2;
}
.div-right {
background:rgba(255, 255, 255, .6) ;
width: 500px;
text-align: left;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-content: center;
.p-note {
color: #10b884;
}
}
}
</style>
>>>>>>> 25ec9f751d39f07689d8b4df360b7c458d10409a

BIN
大唐会议前台1/static/quxia.4289b7cb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

8
大唐会议后台/.env.development

@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 大唐会议管理系统
VUE_APP_TITLE = 神头发电会议系统
# 开发环境配置
ENV = 'development'
@ -7,7 +7,9 @@ ENV = 'development'
# 大唐会议管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
VUE_APP_IMG_URL = 'https://test.tall.wiki/datangMeeting'
VUE_APP_API_QZURL = 'https://test.tall.wiki'
VUE_APP_IMG_URL = 'https://test.tall.wiki/'
VUE_APP_API_QZURL = 'https://test.tall.wiki/'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 访问路径
VUE_APP_PUBLIC_PATH = '/'

15
大唐会议后台/.env.production

@ -1,9 +1,14 @@
# 页面标题
VUE_APP_TITLE = 大唐会议管理系统
VUE_APP_TITLE = 神头发电会议系统
# 生产环境配置
ENV = 'production'
NODE_ENV = 'production'
# 大唐会议管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
VUE_APP_IMG_URL = 'https://test.tall.wiki/datangMeeting'
# 大唐
VUE_APP_BASE_API = 'http://10.89.114.11:9001/datangMeeting'
VUE_APP_IMG_URL = 'http://10.89.114.11:9001/'
VUE_APP_API_QZURL = 'http://10.89.114.11:9001/'
# 访问路径
VUE_APP_PUBLIC_PATH = '/datang/meeting/admin/'

21
大唐会议后台/.env.staging

@ -1,12 +1,17 @@
# 页面标题
VUE_APP_TITLE = 大唐会议管理系统
VUE_APP_TITLE = 神头发电会议系统
BABEL_ENV = production
# 生产环境配置
NODE_ENV = 'production'
# 测试
# VUE_APP_BASE_API = 'https://test.tall.wiki/datangMeeting'
# VUE_APP_IMG_URL = 'https://test.tall.wiki/'
# VUE_APP_API_QZURL = 'https://test.tall.wiki/'
NODE_ENV = production
# 大唐
VUE_APP_BASE_API = 'http://10.89.114.11:9001/datangMeeting'
VUE_APP_IMG_URL = 'http://10.89.114.11:9001/'
VUE_APP_API_QZURL = 'http://10.89.114.11:9001/'
# 测试环境配置
ENV = 'staging'
# 大唐会议管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'
# 访问路径
VUE_APP_PUBLIC_PATH = '/datang/meeting/admin/'

1
大唐会议后台/package.json

@ -57,6 +57,7 @@
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-meta": "2.4.0",
"vue-pdf": "^4.3.0",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",
"vuex": "3.6.0"

48
大唐会议后台/public/index.html

@ -1,14 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" type="image/x-icon" href="./quxia.4289b7cb.png">
<title>
<%= webpackConfig.name %>
</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,
body,
#app {
@ -16,6 +19,7 @@
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
@ -92,6 +96,7 @@
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
@ -105,6 +110,7 @@
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
@ -194,15 +200,17 @@
opacity: 0.5;
}
</style>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
</body>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
</body>
</html>

BIN
大唐会议后台/public/quxia.4289b7cb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

111
大唐会议后台/src/layout/components/Navbar.vue

@ -1,12 +1,21 @@
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<hamburger
id="hamburger-container"
:is-active="sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"
/>
<breadcrumb
id="breadcrumb-container"
class="breadcrumb-container"
v-if="!topNav"
/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
<div class="right-menu">
<template v-if="device!=='mobile'">
<!-- <template v-if="device !== 'mobile'">
<search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
@ -22,12 +31,14 @@
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</template> -->
</template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<el-dropdown
class="avatar-container right-menu-item hover-effect"
trigger="click"
>
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<img :src="avatar" class="user-avatar" />
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
@ -47,15 +58,15 @@
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import { mapGetters } from "vuex";
import Breadcrumb from "@/components/Breadcrumb";
import TopNav from "@/components/TopNav";
import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
export default {
components: {
@ -66,48 +77,46 @@ export default {
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc
RuoYiDoc,
},
computed: {
...mapGetters([
'sidebar',
'avatar',
'device'
]),
...mapGetters(["sidebar", "avatar", "device"]),
setting: {
get() {
return this.$store.state.settings.showSettings
return this.$store.state.settings.showSettings;
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
})
}
this.$store.dispatch("settings/changeSetting", {
key: "showSettings",
value: val,
});
},
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
}
return this.$store.state.settings.topNav;
},
},
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
this.$store.dispatch("app/toggleSideBar");
},
async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
this.$confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$store.dispatch("LogOut").then(() => {
location.href = process.env.VUE_APP_PUBLIC_PATH;
});
})
}).catch(() => {});
}
}
}
.catch(() => {});
},
},
};
</script>
<style lang="scss" scoped>
@ -116,18 +125,18 @@ export default {
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(0, 0, 0, .025)
background: rgba(0, 0, 0, 0.025);
}
}
@ -164,10 +173,10 @@ export default {
&.hover-effect {
cursor: pointer;
transition: background .3s;
transition: background 0.3s;
&:hover {
background: rgba(0, 0, 0, .025)
background: rgba(0, 0, 0, 0.025);
}
}
}

69
大唐会议后台/src/layout/components/Sidebar/Logo.vue

@ -1,45 +1,80 @@
<template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
<div
class="sidebar-logo-container"
:class="{ collapse: collapse }"
:style="{
backgroundColor:
sideTheme === 'theme-dark'
? variables.menuBackground
: variables.menuLightBackground,
}"
>
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
<router-link
v-if="collapse"
key="collapse"
class="sidebar-logo-link"
to="/"
>
<img v-if="logo" src="./logo.png" class="sidebar-logo" />
<h1
v-else
class="sidebar-title"
:style="{
color:
sideTheme === 'theme-dark'
? variables.logoTitleColor
: variables.logoLightTitleColor,
}"
>
{{ title }}
</h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
<img v-if="logo" src="./logo.png" class="sidebar-logo" />
<h1
class="sidebar-title"
:style="{
color:
sideTheme === 'theme-dark'
? variables.logoTitleColor
: variables.logoLightTitleColor,
}"
>
{{ title }}
</h1>
</router-link>
</transition>
</div>
</template>
<script>
import logoImg from '@/assets/logo/logo.png'
import variables from '@/assets/styles/variables.scss'
import logoImg from "@/assets/logo/logo.png";
import variables from "@/assets/styles/variables.scss";
export default {
name: 'SidebarLogo',
name: "SidebarLogo",
props: {
collapse: {
type: Boolean,
required: true
}
required: true,
},
},
computed: {
variables() {
return variables;
},
sideTheme() {
return this.$store.state.settings.sideTheme
}
return this.$store.state.settings.sideTheme;
},
},
data() {
return {
title: process.env.VUE_APP_TITLE,
logo: logoImg
}
}
}
logo: logoImg,
};
},
};
</script>
<style lang="scss" scoped>

BIN
大唐会议后台/src/layout/components/Sidebar/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

177
大唐会议后台/src/router/index.js

@ -1,10 +1,10 @@
import Vue from 'vue'
import Router from 'vue-router'
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router)
Vue.use(Router);
/* Layout */
import Layout from '@/layout'
import Layout from "@/layout";
/**
* Note: 路由配置项
@ -31,153 +31,154 @@ import Layout from '@/layout'
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
path: "/redirect",
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect')
}
]
path: "/redirect/:path(.*)",
component: () => import("@/views/redirect"),
},
],
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
path: "/login",
component: () => import("@/views/login"),
hidden: true,
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
path: "/register",
component: () => import("@/views/register"),
hidden: true,
},
{
path: '/404',
component: () => import('@/views/error/404'),
hidden: true
path: "/404",
component: () => import("@/views/error/404"),
hidden: true,
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
path: "/401",
component: () => import("@/views/error/401"),
hidden: true,
},
{
path: '',
path: "",
component: Layout,
redirect: 'index',
redirect: "index",
children: [
{
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]
path: "index",
component: () => import("@/views/index"),
name: "Index",
meta: { title: "首页", icon: "dashboard", affix: true },
},
],
},
{
path: '/user',
path: "/user",
component: Layout,
hidden: true,
redirect: 'noredirect',
redirect: "noredirect",
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: { title: '个人中心', icon: 'user' }
}
]
}
]
path: "profile",
component: () => import("@/views/system/user/profile/index"),
name: "Profile",
meta: { title: "个人中心", icon: "user" },
},
],
},
];
// 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [
{
path: '/system/user-auth',
path: "/system/user-auth",
component: Layout,
hidden: true,
permissions: ['system:user:edit'],
permissions: ["system:user:edit"],
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
name: 'AuthRole',
meta: { title: '分配角色', activeMenu: '/system/user' }
}
]
path: "role/:userId(\\d+)",
component: () => import("@/views/system/user/authRole"),
name: "AuthRole",
meta: { title: "分配角色", activeMenu: "/system/user" },
},
],
},
{
path: '/system/role-auth',
path: "/system/role-auth",
component: Layout,
hidden: true,
permissions: ['system:role:edit'],
permissions: ["system:role:edit"],
children: [
{
path: 'user/:roleId(\\d+)',
component: () => import('@/views/system/role/authUser'),
name: 'AuthUser',
meta: { title: '分配用户', activeMenu: '/system/role' }
}
]
path: "user/:roleId(\\d+)",
component: () => import("@/views/system/role/authUser"),
name: "AuthUser",
meta: { title: "分配用户", activeMenu: "/system/role" },
},
],
},
{
path: '/system/dict-data',
path: "/system/dict-data",
component: Layout,
hidden: true,
permissions: ['system:dict:list'],
permissions: ["system:dict:list"],
children: [
{
path: 'index/:dictId(\\d+)',
component: () => import('@/views/system/dict/data'),
name: 'Data',
meta: { title: '字典数据', activeMenu: '/system/dict' }
}
]
path: "index/:dictId(\\d+)",
component: () => import("@/views/system/dict/data"),
name: "Data",
meta: { title: "字典数据", activeMenu: "/system/dict" },
},
],
},
{
path: '/monitor/job-log',
path: "/monitor/job-log",
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
permissions: ["monitor:job:list"],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: { title: '调度日志', activeMenu: '/monitor/job' }
}
]
path: "index/:jobId(\\d+)",
component: () => import("@/views/monitor/job/log"),
name: "JobLog",
meta: { title: "调度日志", activeMenu: "/monitor/job" },
},
],
},
{
path: '/tool/gen-edit',
path: "/tool/gen-edit",
component: Layout,
hidden: true,
permissions: ['tool:gen:edit'],
permissions: ["tool:gen:edit"],
children: [
{
path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit',
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
}
]
}
]
path: "index/:tableId(\\d+)",
component: () => import("@/views/tool/gen/editTable"),
name: "GenEdit",
meta: { title: "修改生成配置", activeMenu: "/tool/gen" },
},
],
},
];
// 防止连续点击多次路由报错
let routerPush = Router.prototype.push;
let routerReplace = Router.prototype.replace;
// push
Router.prototype.push = function push(location) {
return routerPush.call(this, location).catch(err => err)
}
return routerPush.call(this, location).catch((err) => err);
};
// replace
Router.prototype.replace = function push(location) {
return routerReplace.call(this, location).catch(err => err)
}
return routerReplace.call(this, location).catch((err) => err);
};
export default new Router({
mode: 'history', // 去掉url中的#
mode: "history", // 去掉url中的#
base: process.env.VUE_APP_PUBLIC_PATH,
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})
routes: constantRoutes,
});

250
大唐会议后台/src/utils/request.js

@ -1,114 +1,148 @@
import axios from 'axios'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import axios from "axios";
import { Notification, MessageBox, Message, Loading } from "element-ui";
import store from "@/store";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时
timeout: 10000
})
timeout: 10000,
});
// request拦截器
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) {
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
}
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。')
return config;
// get请求映射params参数
if (config.method === "get" && config.params) {
let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = {
url: config.url,
data:
typeof config.data === "object"
? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(
`[${config.url}]: ` +
"请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
);
return config;
}
const sessionObj = cache.session.getJSON("sessionObj");
if (
sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else {
cache.session.setJSON('sessionObj', requestObj)
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (
s_data === requestObj.data &&
requestObj.time - s_time < interval &&
s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else {
cache.session.setJSON("sessionObj", requestObj);
}
}
}
return config;
},
(error) => {
console.log(error);
Promise.reject(error);
}
return config
}, error => {
console.log(error)
Promise.reject(error)
})
);
// 响应拦截器
service.interceptors.response.use(res => {
service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
const msg = errorCode[code] || res.data.msg || errorCode["default"];
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
if (
res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
location.href = '/index';
MessageBox.confirm(
"登录状态已过期,您可以继续留在该页面,或者重新登录",
"系统提示",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
isRelogin.show = false;
store.dispatch("LogOut").then(() => {
location.href = process.env.VUE_APP_PUBLIC_PATH;
});
})
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
.catch(() => {
isRelogin.show = false;
});
}
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 500) {
Message({ message: msg, type: 'error' })
return Promise.reject(new Error(msg))
Message({ message: msg, type: "error" });
return Promise.reject(new Error(msg));
} else if (code === 601) {
Message({ message: msg, type: 'warning' })
return Promise.reject('error')
Message({ message: msg, type: "warning" });
return Promise.reject("error");
} else if (code !== 200) {
Notification.error({ title: msg })
return Promise.reject('error')
Notification.error({ title: msg });
return Promise.reject("error");
} else {
return res.data
return res.data;
}
},
error => {
console.log('err' + error)
(error) => {
console.log("err" + error);
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
@ -117,36 +151,48 @@ service.interceptors.response.use(res => {
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({ message: message, type: 'error', duration: 5 * 1000 })
return Promise.reject(error)
Message({ message: message, type: "error", duration: 5 * 1000 });
return Promise.reject(error);
}
)
);
// 通用下载方法
export function download(url, params, filename, config) {
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
...config
}).then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data])
saveAs(blob, filename)
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
Message.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
Message.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
transformRequest: [
(params) => {
return tansParams(params);
},
],
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
...config,
})
.then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
Message.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
Message.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service
export default service;

80
大唐会议后台/src/views/components/MeetingList.vue

@ -2,21 +2,33 @@
<div>
<div class="div-li" v-for="(item, index) in infos" :key="index">
<div class="li-item" v-if="item.type == 'title'">
<div class="li-title">{{ item.title }}</div>
<div class="li-item-cz">
<div @click.stop="handleInfoAdd(item)">新增</div>
<div @click.stop="handleInfoUpd(item)">修改</div>
<div @click.stop="handleInfoDel(item, index)">删除</div>
<div class="li-title">
{{ item.title }}
<!-- <span style="display: inline-block"> -->
<span class="div-but" @click.stop="handleInfoAdd(item)">
<i class="el-icon-circle-plus-outline"></i> 新增子级
</span>
<span class="div-but" @click.stop="handleInfoUpd(item)">
<i class="el-icon-edit"></i> 修改
</span>
<span class="div-but" @click.stop="handleInfoDel(item, index)">
<i class="el-icon-remove-outline"></i> 删除
</span>
<!-- </span> -->
</div>
</div>
<div class="li-item" v-if="item.type == 'file-pdf'">
<div class="li-pdf" @click.stop="handlePdf(item)">
{{ item.filePdfName }}
<div class="li-item-cz">
<div @click.stop="handleInfoAdd(item)">新增</div>
<div @click.stop="handleInfoUpd(item)">修改</div>
<div @click.stop="handleInfoDel(item, index)">删除</div>
</div>
<span class="div-but" @click.stop="handleInfoAdd(item)">
<i class="el-icon-circle-plus-outline"></i> 新增子级
</span>
<span class="div-but" @click.stop="handleInfoUpd(item)">
<i class="el-icon-edit"></i> 修改
</span>
<span class="div-but" @click.stop="handleInfoDel(item, index)">
<i class="el-icon-remove-outline"></i> 删除
</span>
</div>
</div>
<div class="div-pdf" v-if="pdfId == item.id">
@ -48,19 +60,25 @@
>
</pdf>
</div>
<div class="li-item" v-if="item.type == 'richtext'">
<div class="li-text">{{ item.richtext }}</div>
<div class="li-item-cz">
<div @click.stop="handleInfoAdd(item)">新增</div>
<div @click.stop="handleInfoUpd(item)">修改</div>
<div @click.stop="handleInfoDel(item, index)">删除</div>
<div class="li-item li-item1" v-if="item.type == 'richtext'">
<div class="li-text">
{{ item.richtext }}
</div>
<div style="flex-shrink: 0; text-align: center">
<span class="div-but" @click.stop="handleInfoAdd(item)">
<i class="el-icon-circle-plus-outline"></i> 新增子级
</span>
<div>
<span class="div-but" @click.stop="handleInfoUpd(item)">
<i class="el-icon-edit"></i> 修改
</span>
<span class="div-but" @click.stop="handleInfoDel(item, index)">
<i class="el-icon-remove-outline"></i> 删除
</span>
</div>
</div>
</div>
<div
class="div-ul"
style="padding: 16px 0 10px 10px; border: 1px solid #000"
v-if="item.infos && item.infos.length"
>
<div class="div-ul" v-if="item.infos && item.infos.length">
<MeetingList :infos="item.infos"></MeetingList>
</div>
</div>
@ -230,8 +248,11 @@ export default {
.li-item {
display: flex;
justify-content: space-between;
background: pink;
align-items: center;
//justify-content: space-between;
font-size: 20px;
line-height: 40px;
//background: pink;
uni-div {
font-size: 18px;
@ -245,15 +266,24 @@ export default {
}
.li-pdf {
width: 100%;
display: flex;
justify-content: space-between;
// justify-content: space-between;
}
.li-item-cz {
flex-shrink: 0;
display: flex;
div {
padding: 0 10px;
}
}
.div-but {
color: #1890ff;
margin-left: 10px;
font-weight: 500;
cursor: pointer;
}
}
.li-item1 {
display: flex;
}
</style>
<style></style>

4
大唐会议后台/src/views/index.vue

@ -1,5 +1,7 @@
<template>
<div>首页</div>
<div style="padding: 16px">
<img src="./welcome.5e305008.png" style="" />
</div>
</template>
<script>

BIN
大唐会议后台/src/views/leftLogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

6
大唐会议后台/src/views/login.vue

@ -95,8 +95,8 @@ export default {
return {
codeUrl: "",
loginForm: {
username: "admin",
password: "admin123",
username: "",
password: "",
rememberMe: false,
code: "",
uuid: "",
@ -193,7 +193,7 @@ export default {
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.jpg");
background-image: url("./leftLogo.png");
background-size: cover;
}
.title {

17
大唐会议后台/src/views/meeting/index.vue

@ -15,7 +15,7 @@
clearable
/>
</el-form-item>
<el-form-item label="会议时间" prop="time">
<!-- <el-form-item label="会议时间" prop="time">
<el-date-picker
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
@ -46,8 +46,8 @@
:value="item.userId"
>
</el-option>
</el-select>
</el-form-item>
</el-select> -->
<!-- </el-form-item> -->
<el-form-item>
<el-button
type="primary"
@ -375,7 +375,14 @@ export default {
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams = {
pageNum: 1,
pageSize: 10,
param: {
title: "",
},
};
// this.resetForm("queryForm");
this.handleQuery();
},
//
@ -402,7 +409,7 @@ export default {
this.title = "会议详情";
this.$router.push({
path: "/meetingDetails/index",
query: { id: row.id },
query: { id: row.id, title: row.title },
});
},
submitForm1() {

49
大唐会议后台/src/views/meetingDetails/index.vue

@ -1,8 +1,21 @@
<template>
<div class="app-container" v-loading="loading">
<div class="div-box">
<span class="div-title"> {{ listData.title }}</span>
<div @click="handleAdd" style="text-align: right">新增</div>
<div style="text-align: center">
<span class="div-title"> {{ $route.query.title }}</span>
</div>
<div
v-if="listData.infos && listData.infos.length"
@click="handleAdd"
class="div-add1"
>
<i class="el-icon-circle-plus-outline"></i>
新增一级会议标题
</div>
<div v-else @click="handleAdd" class="div-add">
<i class="el-icon-circle-plus-outline"></i>
新增一级会议标题
</div>
<div class="div-ul">
<MeetingList
@handleRefresh="handleRefresh"
@ -122,6 +135,8 @@ export default {
};
},
created() {
console.log("process.env.VUE_APP_API_QZURL", process.env.VUE_APP_IMG_URL);
this.getList();
},
watch: {
@ -135,6 +150,7 @@ export default {
},
//
"$store.state.meetingItme"(newVal, oldVal) {
this.fileList = [];
if (newVal.type == "file-pdf") {
this.fileList = [
{
@ -268,4 +284,33 @@ export default {
font-size: 18px;
line-height: 26px;
}
.div-add1 {
width: 100%;
font-size: 20px;
color: #1890ff;
border: 2px dashed #1890ff;
text-align: center;
line-height: 50px;
margin-bottom: 16px;
}
.div-add {
width: 100%;
height: 300px;
color: #1890ff;
font-size: 30px;
line-height: 300px;
border: 2px dashed #1890ff;
text-align: center;
}
.div-title {
display: inline-block;
border: 1px solid #000;
padding: 0 14px;
margin-bottom: 16px;
line-height: 50px;
border-radius: 6px;
font-size: 20px;
font-weight: bold;
}
</style>

BIN
大唐会议后台/src/views/welcome.5e305008.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

5
大唐会议后台/vue.config.js

@ -18,7 +18,10 @@ module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
publicPath:
process.env.NODE_ENV === "production"
? process.env.VUE_APP_PUBLIC_PATH
: "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: "dist",
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)

BIN
大唐会议后台/大唐会议后台-22.zip

Binary file not shown.
Loading…
Cancel
Save