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. 12
      大唐会议后台/public/index.html
  30. BIN
      大唐会议后台/public/quxia.4289b7cb.png
  31. 107
      大唐会议后台/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. 186
      大唐会议后台/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' ENV = 'development'
@ -7,7 +7,9 @@ ENV = 'development'
# 大唐会议管理系统/开发环境 # 大唐会议管理系统/开发环境
VUE_APP_BASE_API = '/dev-api' VUE_APP_BASE_API = '/dev-api'
VUE_APP_IMG_URL = 'https://test.tall.wiki/datangMeeting' 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_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_PUBLIC_PATH = '/datang/meeting/admin/'
# 大唐会议管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'

1
大唐会议后台/package.json

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

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

@ -1,12 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" type="image/x-icon" href="./quxia.4289b7cb.png">
<title><%= webpackConfig.name %></title> <title>
<%= webpackConfig.name %>
</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style> <style>
html, html,
@ -16,6 +19,7 @@
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
} }
.chromeframe { .chromeframe {
margin: 0.2em 0; margin: 0.2em 0;
background: #ccc; background: #ccc;
@ -92,6 +96,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -105,6 +110,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -195,6 +201,7 @@
} }
</style> </style>
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<div id="loader-wrapper"> <div id="loader-wrapper">
@ -205,4 +212,5 @@
</div> </div>
</div> </div>
</body> </body>
</html> </html>

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

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

@ -1,12 +1,21 @@
<template> <template>
<div class="navbar"> <div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <hamburger
id="hamburger-container"
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/> :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" /> <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
<div class="right-menu"> <div class="right-menu">
<template v-if="device!=='mobile'"> <!-- <template v-if="device !== 'mobile'">
<search id="header-search" class="right-menu-item" /> <search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <el-tooltip content="源码地址" effect="dark" placement="bottom">
@ -22,12 +31,14 @@
<el-tooltip content="布局大小" effect="dark" placement="bottom"> <el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" /> <size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
</template> -->
</template> <el-dropdown
class="avatar-container right-menu-item hover-effect"
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> trigger="click"
>
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<img :src="avatar" class="user-avatar"> <img :src="avatar" class="user-avatar" />
<i class="el-icon-caret-bottom" /> <i class="el-icon-caret-bottom" />
</div> </div>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
@ -47,15 +58,15 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from "vuex";
import Breadcrumb from '@/components/Breadcrumb' import Breadcrumb from "@/components/Breadcrumb";
import TopNav from '@/components/TopNav' import TopNav from "@/components/TopNav";
import Hamburger from '@/components/Hamburger' import Hamburger from "@/components/Hamburger";
import Screenfull from '@/components/Screenfull' import Screenfull from "@/components/Screenfull";
import SizeSelect from '@/components/SizeSelect' import SizeSelect from "@/components/SizeSelect";
import Search from '@/components/HeaderSearch' import Search from "@/components/HeaderSearch";
import RuoYiGit from '@/components/RuoYi/Git' import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from '@/components/RuoYi/Doc' import RuoYiDoc from "@/components/RuoYi/Doc";
export default { export default {
components: { components: {
@ -66,48 +77,46 @@ export default {
SizeSelect, SizeSelect,
Search, Search,
RuoYiGit, RuoYiGit,
RuoYiDoc RuoYiDoc,
}, },
computed: { computed: {
...mapGetters([ ...mapGetters(["sidebar", "avatar", "device"]),
'sidebar',
'avatar',
'device'
]),
setting: { setting: {
get() { get() {
return this.$store.state.settings.showSettings return this.$store.state.settings.showSettings;
}, },
set(val) { set(val) {
this.$store.dispatch('settings/changeSetting', { this.$store.dispatch("settings/changeSetting", {
key: 'showSettings', key: "showSettings",
value: val value: val,
}) });
} },
}, },
topNav: { topNav: {
get() { get() {
return this.$store.state.settings.topNav return this.$store.state.settings.topNav;
} },
} },
}, },
methods: { methods: {
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch("app/toggleSideBar");
}, },
async logout() { async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', { this.$confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: '确定', confirmButtonText: "确定",
cancelButtonText: '取消', cancelButtonText: "取消",
type: 'warning' type: "warning",
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
}) })
}).catch(() => {}); .then(() => {
} this.$store.dispatch("LogOut").then(() => {
} location.href = process.env.VUE_APP_PUBLIC_PATH;
} });
})
.catch(() => {});
},
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -116,18 +125,18 @@ export default {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
background: #fff; 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 { .hamburger-container {
line-height: 46px; line-height: 46px;
height: 100%; height: 100%;
float: left; float: left;
cursor: pointer; cursor: pointer;
transition: background .3s; transition: background 0.3s;
-webkit-tap-highlight-color: transparent; -webkit-tap-highlight-color: transparent;
&:hover { &:hover {
background: rgba(0, 0, 0, .025) background: rgba(0, 0, 0, 0.025);
} }
} }
@ -164,10 +173,10 @@ export default {
&.hover-effect { &.hover-effect {
cursor: pointer; cursor: pointer;
transition: background .3s; transition: background 0.3s;
&:hover { &: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> <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"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <router-link
<img v-if="logo" :src="logo" class="sidebar-logo" /> v-if="collapse"
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> 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>
<router-link v-else key="expand" class="sidebar-logo-link" to="/"> <router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" /> <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> <h1
class="sidebar-title"
:style="{
color:
sideTheme === 'theme-dark'
? variables.logoTitleColor
: variables.logoLightTitleColor,
}"
>
{{ title }}
</h1>
</router-link> </router-link>
</transition> </transition>
</div> </div>
</template> </template>
<script> <script>
import logoImg from '@/assets/logo/logo.png' import logoImg from "@/assets/logo/logo.png";
import variables from '@/assets/styles/variables.scss' import variables from "@/assets/styles/variables.scss";
export default { export default {
name: 'SidebarLogo', name: "SidebarLogo",
props: { props: {
collapse: { collapse: {
type: Boolean, type: Boolean,
required: true required: true,
} },
}, },
computed: { computed: {
variables() { variables() {
return variables; return variables;
}, },
sideTheme() { sideTheme() {
return this.$store.state.settings.sideTheme return this.$store.state.settings.sideTheme;
} },
}, },
data() { data() {
return { return {
title: process.env.VUE_APP_TITLE, title: process.env.VUE_APP_TITLE,
logo: logoImg logo: logoImg,
} };
} },
} };
</script> </script>
<style lang="scss" scoped> <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 Vue from "vue";
import Router from 'vue-router' import Router from "vue-router";
Vue.use(Router) Vue.use(Router);
/* Layout */ /* Layout */
import Layout from '@/layout' import Layout from "@/layout";
/** /**
* Note: 路由配置项 * Note: 路由配置项
@ -31,153 +31,154 @@ import Layout from '@/layout'
// 公共路由 // 公共路由
export const constantRoutes = [ export const constantRoutes = [
{ {
path: '/redirect', path: "/redirect",
component: Layout, component: Layout,
hidden: true, hidden: true,
children: [ children: [
{ {
path: '/redirect/:path(.*)', path: "/redirect/:path(.*)",
component: () => import('@/views/redirect') component: () => import("@/views/redirect"),
} },
] ],
}, },
{ {
path: '/login', path: "/login",
component: () => import('@/views/login'), component: () => import("@/views/login"),
hidden: true hidden: true,
}, },
{ {
path: '/register', path: "/register",
component: () => import('@/views/register'), component: () => import("@/views/register"),
hidden: true hidden: true,
}, },
{ {
path: '/404', path: "/404",
component: () => import('@/views/error/404'), component: () => import("@/views/error/404"),
hidden: true hidden: true,
}, },
{ {
path: '/401', path: "/401",
component: () => import('@/views/error/401'), component: () => import("@/views/error/401"),
hidden: true hidden: true,
}, },
{ {
path: '', path: "",
component: Layout, component: Layout,
redirect: 'index', redirect: "index",
children: [ children: [
{ {
path: 'index', path: "index",
component: () => import('@/views/index'), component: () => import("@/views/index"),
name: 'Index', name: "Index",
meta: { title: '首页', icon: 'dashboard', affix: true } meta: { title: "首页", icon: "dashboard", affix: true },
} },
] ],
}, },
{ {
path: '/user', path: "/user",
component: Layout, component: Layout,
hidden: true, hidden: true,
redirect: 'noredirect', redirect: "noredirect",
children: [ children: [
{ {
path: 'profile', path: "profile",
component: () => import('@/views/system/user/profile/index'), component: () => import("@/views/system/user/profile/index"),
name: 'Profile', name: "Profile",
meta: { title: '个人中心', icon: 'user' } meta: { title: "个人中心", icon: "user" },
} },
] ],
} },
] ];
// 动态路由,基于用户权限动态去加载 // 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [ export const dynamicRoutes = [
{ {
path: '/system/user-auth', path: "/system/user-auth",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:user:edit'], permissions: ["system:user:edit"],
children: [ children: [
{ {
path: 'role/:userId(\\d+)', path: "role/:userId(\\d+)",
component: () => import('@/views/system/user/authRole'), component: () => import("@/views/system/user/authRole"),
name: 'AuthRole', name: "AuthRole",
meta: { title: '分配角色', activeMenu: '/system/user' } meta: { title: "分配角色", activeMenu: "/system/user" },
} },
] ],
}, },
{ {
path: '/system/role-auth', path: "/system/role-auth",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:role:edit'], permissions: ["system:role:edit"],
children: [ children: [
{ {
path: 'user/:roleId(\\d+)', path: "user/:roleId(\\d+)",
component: () => import('@/views/system/role/authUser'), component: () => import("@/views/system/role/authUser"),
name: 'AuthUser', name: "AuthUser",
meta: { title: '分配用户', activeMenu: '/system/role' } meta: { title: "分配用户", activeMenu: "/system/role" },
} },
] ],
}, },
{ {
path: '/system/dict-data', path: "/system/dict-data",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:dict:list'], permissions: ["system:dict:list"],
children: [ children: [
{ {
path: 'index/:dictId(\\d+)', path: "index/:dictId(\\d+)",
component: () => import('@/views/system/dict/data'), component: () => import("@/views/system/dict/data"),
name: 'Data', name: "Data",
meta: { title: '字典数据', activeMenu: '/system/dict' } meta: { title: "字典数据", activeMenu: "/system/dict" },
} },
] ],
}, },
{ {
path: '/monitor/job-log', path: "/monitor/job-log",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['monitor:job:list'], permissions: ["monitor:job:list"],
children: [ children: [
{ {
path: 'index/:jobId(\\d+)', path: "index/:jobId(\\d+)",
component: () => import('@/views/monitor/job/log'), component: () => import("@/views/monitor/job/log"),
name: 'JobLog', name: "JobLog",
meta: { title: '调度日志', activeMenu: '/monitor/job' } meta: { title: "调度日志", activeMenu: "/monitor/job" },
} },
] ],
}, },
{ {
path: '/tool/gen-edit', path: "/tool/gen-edit",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['tool:gen:edit'], permissions: ["tool:gen:edit"],
children: [ children: [
{ {
path: 'index/:tableId(\\d+)', path: "index/:tableId(\\d+)",
component: () => import('@/views/tool/gen/editTable'), component: () => import("@/views/tool/gen/editTable"),
name: 'GenEdit', name: "GenEdit",
meta: { title: '修改生成配置', activeMenu: '/tool/gen' } meta: { title: "修改生成配置", activeMenu: "/tool/gen" },
} },
] ],
} },
] ];
// 防止连续点击多次路由报错 // 防止连续点击多次路由报错
let routerPush = Router.prototype.push; let routerPush = Router.prototype.push;
let routerReplace = Router.prototype.replace; let routerReplace = Router.prototype.replace;
// push // push
Router.prototype.push = function push(location) { Router.prototype.push = function push(location) {
return routerPush.call(this, location).catch(err => err) return routerPush.call(this, location).catch((err) => err);
} };
// replace // replace
Router.prototype.replace = function push(location) { 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({ export default new Router({
mode: 'history', // 去掉url中的# mode: "history", // 去掉url中的#
base: process.env.VUE_APP_PUBLIC_PATH,
scrollBehavior: () => ({ y: 0 }), scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes routes: constantRoutes,
}) });

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

@ -1,114 +1,148 @@
import axios from 'axios' import axios from "axios";
import { Notification, MessageBox, Message, Loading } from 'element-ui' import { Notification, MessageBox, Message, Loading } from "element-ui";
import store from '@/store' import store from "@/store";
import { getToken } from '@/utils/auth' import { getToken } from "@/utils/auth";
import errorCode from '@/utils/errorCode' import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi"; import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from '@/plugins/cache' import cache from "@/plugins/cache";
import { saveAs } from 'file-saver' import { saveAs } from "file-saver";
let downloadLoadingInstance; let downloadLoadingInstance;
// 是否显示重新登录 // 是否显示重新登录
export let isRelogin = { show: false }; 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实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分 // axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API, baseURL: process.env.VUE_APP_BASE_API,
// 超时 // 超时
timeout: 10000 timeout: 10000,
}) });
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(
(config) => {
// 是否需要设置 token // 是否需要设置 token
const isToken = (config.headers || {}).isToken === false const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交 // 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) { if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
} }
// get请求映射params参数 // get请求映射params参数
if (config.method === 'get' && config.params) { if (config.method === "get" && config.params) {
let url = config.url + '?' + tansParams(config.params); let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1); url = url.slice(0, -1);
config.params = {}; config.params = {};
config.url = url; config.url = url;
} }
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = { const requestObj = {
url: config.url, url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, data:
time: new Date().getTime() typeof config.data === "object"
} ? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小 const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) { if (requestSize >= limitSize) {
console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') console.warn(
`[${config.url}]: ` +
"请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
);
return config; return config;
} }
const sessionObj = cache.session.getJSON('sessionObj') const sessionObj = cache.session.getJSON("sessionObj");
if (sessionObj === undefined || sessionObj === null || sessionObj === '') { if (
cache.session.setJSON('sessionObj', requestObj) sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else { } else {
const s_url = sessionObj.url; // 请求地址 const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据 const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间 const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { if (
const message = '数据正在处理,请勿重复提交'; s_data === requestObj.data &&
console.warn(`[${s_url}]: ` + message) requestObj.time - s_time < interval &&
return Promise.reject(new Error(message)) s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else { } else {
cache.session.setJSON('sessionObj', requestObj) cache.session.setJSON("sessionObj", requestObj);
} }
} }
} }
return config return config;
}, error => { },
console.log(error) (error) => {
Promise.reject(error) console.log(error);
}) Promise.reject(error);
}
);
// 响应拦截器 // 响应拦截器
service.interceptors.response.use(res => { service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态 // 未设置状态码则默认成功状态
const code = res.data.code || 200; 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') { if (
return res.data res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
} }
if (code === 401) { if (code === 401) {
if (!isRelogin.show) { if (!isRelogin.show) {
isRelogin.show = true; isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { MessageBox.confirm(
"登录状态已过期,您可以继续留在该页面,或者重新登录",
"系统提示",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
isRelogin.show = false; isRelogin.show = false;
store.dispatch('LogOut').then(() => { store.dispatch("LogOut").then(() => {
location.href = '/index'; location.href = process.env.VUE_APP_PUBLIC_PATH;
});
}) })
}).catch(() => { .catch(() => {
isRelogin.show = false; isRelogin.show = false;
}); });
} }
return Promise.reject('无效的会话,或者会话已过期,请重新登录。') return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 500) { } else if (code === 500) {
Message({ message: msg, type: 'error' }) Message({ message: msg, type: "error" });
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg));
} else if (code === 601) { } else if (code === 601) {
Message({ message: msg, type: 'warning' }) Message({ message: msg, type: "warning" });
return Promise.reject('error') return Promise.reject("error");
} else if (code !== 200) { } else if (code !== 200) {
Notification.error({ title: msg }) Notification.error({ title: msg });
return Promise.reject('error') return Promise.reject("error");
} else { } else {
return res.data return res.data;
} }
}, },
error => { (error) => {
console.log('err' + error) console.log("err" + error);
let { message } = error; let { message } = error;
if (message == "Network Error") { if (message == "Network Error") {
message = "后端接口连接异常"; message = "后端接口连接异常";
@ -117,36 +151,48 @@ service.interceptors.response.use(res => {
} else if (message.includes("Request failed with status code")) { } else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
Message({ message: message, type: 'error', duration: 5 * 1000 }) Message({ message: message, type: "error", duration: 5 * 1000 });
return Promise.reject(error) return Promise.reject(error);
} }
) );
// 通用下载方法 // 通用下载方法
export function download(url, params, filename, config) { export function download(url, params, filename, config) {
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) downloadLoadingInstance = Loading.service({
return service.post(url, params, { text: "正在下载数据,请稍候",
transformRequest: [(params) => { return tansParams(params) }], spinner: "el-icon-loading",
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, background: "rgba(0, 0, 0, 0.7)",
responseType: 'blob', });
...config return service
}).then(async (data) => { .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); const isBlob = blobValidate(data);
if (isBlob) { if (isBlob) {
const blob = new Blob([data]) const blob = new Blob([data]);
saveAs(blob, filename) saveAs(blob, filename);
} else { } else {
const resText = await data.text(); const resText = await data.text();
const rspObj = JSON.parse(resText); const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
Message.error(errMsg); Message.error(errMsg);
} }
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
Message.error('下载文件出现错误,请联系管理员!')
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>
<div class="div-li" v-for="(item, index) in infos" :key="index"> <div class="div-li" v-for="(item, index) in infos" :key="index">
<div class="li-item" v-if="item.type == 'title'"> <div class="li-item" v-if="item.type == 'title'">
<div class="li-title">{{ item.title }}</div> <div class="li-title">
<div class="li-item-cz"> {{ item.title }}
<div @click.stop="handleInfoAdd(item)">新增</div> <!-- <span style="display: inline-block"> -->
<div @click.stop="handleInfoUpd(item)">修改</div> <span class="div-but" @click.stop="handleInfoAdd(item)">
<div @click.stop="handleInfoDel(item, index)">删除</div> <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> </div>
<div class="li-item" v-if="item.type == 'file-pdf'"> <div class="li-item" v-if="item.type == 'file-pdf'">
<div class="li-pdf" @click.stop="handlePdf(item)"> <div class="li-pdf" @click.stop="handlePdf(item)">
{{ item.filePdfName }} {{ item.filePdfName }}
<div class="li-item-cz"> <span class="div-but" @click.stop="handleInfoAdd(item)">
<div @click.stop="handleInfoAdd(item)">新增</div> <i class="el-icon-circle-plus-outline"></i> 新增子级
<div @click.stop="handleInfoUpd(item)">修改</div> </span>
<div @click.stop="handleInfoDel(item, index)">删除</div> <span class="div-but" @click.stop="handleInfoUpd(item)">
</div> <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>
<div class="div-pdf" v-if="pdfId == item.id"> <div class="div-pdf" v-if="pdfId == item.id">
@ -48,19 +60,25 @@
> >
</pdf> </pdf>
</div> </div>
<div class="li-item" v-if="item.type == 'richtext'"> <div class="li-item li-item1" v-if="item.type == 'richtext'">
<div class="li-text">{{ item.richtext }}</div> <div class="li-text">
<div class="li-item-cz"> {{ item.richtext }}
<div @click.stop="handleInfoAdd(item)">新增</div>
<div @click.stop="handleInfoUpd(item)">修改</div>
<div @click.stop="handleInfoDel(item, index)">删除</div>
</div> </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" </div>
style="padding: 16px 0 10px 10px; border: 1px solid #000" <div class="div-ul" v-if="item.infos && item.infos.length">
v-if="item.infos && item.infos.length"
>
<MeetingList :infos="item.infos"></MeetingList> <MeetingList :infos="item.infos"></MeetingList>
</div> </div>
</div> </div>
@ -230,8 +248,11 @@ export default {
.li-item { .li-item {
display: flex; display: flex;
justify-content: space-between; align-items: center;
background: pink; //justify-content: space-between;
font-size: 20px;
line-height: 40px;
//background: pink;
uni-div { uni-div {
font-size: 18px; font-size: 18px;
@ -245,15 +266,24 @@ export default {
} }
.li-pdf { .li-pdf {
width: 100%; width: 100%;
display: flex; // justify-content: space-between;
justify-content: space-between;
} }
.li-item-cz { .li-item-cz {
flex-shrink: 0;
display: flex; display: flex;
div { div {
padding: 0 10px; padding: 0 10px;
} }
} }
.div-but {
color: #1890ff;
margin-left: 10px;
font-weight: 500;
cursor: pointer;
}
}
.li-item1 {
display: flex;
} }
</style> </style>
<style></style> <style></style>

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

@ -1,5 +1,7 @@
<template> <template>
<div>首页</div> <div style="padding: 16px">
<img src="./welcome.5e305008.png" style="" />
</div>
</template> </template>
<script> <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 { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "", uuid: "",
@ -193,7 +193,7 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%; height: 100%;
background-image: url("../assets/images/login-background.jpg"); background-image: url("./leftLogo.png");
background-size: cover; background-size: cover;
} }
.title { .title {

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

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

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

@ -1,8 +1,21 @@
<template> <template>
<div class="app-container" v-loading="loading"> <div class="app-container" v-loading="loading">
<div class="div-box"> <div class="div-box">
<span class="div-title"> {{ listData.title }}</span> <div style="text-align: center">
<div @click="handleAdd" style="text-align: right">新增</div> <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"> <div class="div-ul">
<MeetingList <MeetingList
@handleRefresh="handleRefresh" @handleRefresh="handleRefresh"
@ -122,6 +135,8 @@ export default {
}; };
}, },
created() { created() {
console.log("process.env.VUE_APP_API_QZURL", process.env.VUE_APP_IMG_URL);
this.getList(); this.getList();
}, },
watch: { watch: {
@ -135,6 +150,7 @@ export default {
}, },
// //
"$store.state.meetingItme"(newVal, oldVal) { "$store.state.meetingItme"(newVal, oldVal) {
this.fileList = [];
if (newVal.type == "file-pdf") { if (newVal.type == "file-pdf") {
this.fileList = [ this.fileList = [
{ {
@ -268,4 +284,33 @@ export default {
font-size: 18px; font-size: 18px;
line-height: 26px; 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> </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。 // 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 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) // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: "dist", outputDir: "dist",
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)

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

Binary file not shown.
Loading…
Cancel
Save