Browse Source

router-用户管理

dev
xuhuajiao 3 years ago
parent
commit
8fb3e4b3cc
  1. 16
      src/api/login.js
  2. 9
      src/api/system/role.js
  3. 9
      src/api/system/user.js
  4. 1
      src/router/index.js
  5. 14
      src/router/routers.js
  6. 11
      src/store/modules/user.js
  7. 98
      src/views/content/material/index.vue
  8. 674
      src/views/content/material/materialList/index.vue
  9. 139
      src/views/content/publish/historyList/index.vue
  10. 65
      src/views/content/publish/index.vue
  11. 224
      src/views/content/publish/publishList/index.vue
  12. 530
      src/views/content/publish/urgentMessage/index.vue
  13. 713
      src/views/content/theme/index.vue
  14. 530
      src/views/device/config/index.vue
  15. 363
      src/views/device/list/index.vue
  16. 6
      src/views/login.vue
  17. 31
      src/views/system/user/index.vue
  18. 399
      src/views/user/menu1.vue

16
src/api/login.js

@ -1,8 +1,9 @@
import request from '@/utils/request'
// 登录
export function login(username, password, phone, code, uuid, rememberMe) {
return request({
url: 'auth/login',
url: 'api/auth/login',
method: 'post',
data: {
username,
@ -16,7 +17,7 @@ export function login(username, password, phone, code, uuid, rememberMe) {
}
export function getMsg(phone) {
return request({
url: 'auth/msg',
url: 'api/auth/msg',
method: 'post',
data: {
phone
@ -26,7 +27,7 @@ export function getMsg(phone) {
export function setPassword(phone, new_pass, code, uuid) {
return request({
url: 'auth/password',
url: 'api/auth/password',
method: 'post',
data: {
phone,
@ -37,23 +38,26 @@ export function setPassword(phone, new_pass, code, uuid) {
})
}
// 获取用户信息
export function getInfo() {
return request({
url: 'auth/info',
url: 'api/auth/info',
method: 'get'
})
}
// 获取验证码 - 登录
export function getCodeImg() {
return request({
url: 'auth/code',
url: 'api/auth/code',
method: 'get'
})
}
// 登出
export function logout() {
return request({
url: 'auth/logout',
url: 'api/auth/logout',
method: 'delete'
})
}

9
src/api/system/role.js

@ -1,5 +1,14 @@
import request from '@/utils/request'
// 获取角色列表
export function FetchDropDownList(parameter) {
return request({
url: 'api/roles/dropdown/list',
method: 'get',
params: parameter
})
}
// 获取所有的Role
export function getAll() {
return request({

9
src/api/system/user.js

@ -1,6 +1,15 @@
import request from '@/utils/request'
import { encrypt } from '@/utils/rsaEncrypt'
// 获取用户列表
export function FetchUserList(parameter) {
return request({
url: 'api/users/list',
method: 'get',
params: parameter
})
}
export function add(data) {
return request({
url: 'api/users',

1
src/router/index.js

@ -30,7 +30,6 @@ router.beforeEach((to, from, next) => {
// 动态路由,拉取菜单
loadMenus(next, to)
}).catch(() => {
console.log('logOut')
store.dispatch('LogOut').then(() => {
location.reload() // 为了重新实例化vue-router对象 避免bug
})

14
src/router/routers.js

@ -57,6 +57,20 @@ export const constantRouterMap = [
noCache: true
}
}]
},
{
path: '/user',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'menu1',
component: (resolve) => require(['@/views/user/menu1'], resolve),
name: '',
meta: { title: '' }
}
]
}
// {
// path: '/system',

11
src/store/modules/user.js

@ -31,8 +31,6 @@ const user = {
const rememberMe = userInfo.rememberMe
return new Promise((resolve, reject) => {
login(userInfo.username, userInfo.password, userInfo.phone, userInfo.code, userInfo.uuid, userInfo.rememberMe).then(res => {
console.log('store')
console.log(res)
setToken(res.data.token, rememberMe)
commit('SET_TOKEN', res.data.token)
setUserInfo(res.data.user, commit)
@ -40,7 +38,6 @@ const user = {
commit('SET_LOAD_MENUS', true)
resolve()
}).catch(error => {
console.log('store2')
reject(error)
})
})
@ -49,7 +46,7 @@ const user = {
SetPassword({ commit }, userInfo) {
return new Promise((resolve, reject) => {
setPassword(userInfo.phone, userInfo.new_pass, userInfo.code, userInfo.uuid).then(res => {
setUserInfo(res.data.user, commit)
setUserInfo(res.data, commit)
resolve(res)
}).catch(error => {
reject(error)
@ -59,9 +56,10 @@ const user = {
// 获取用户信息
GetInfo({ commit }, userInfo) {
return new Promise((resolve, reject) => {
getInfo(userInfo.phone).then(res => {
const token = getToken()
getInfo(token).then(res => {
console.log(res)
setUserInfo(res.data.user, commit)
setUserInfo(res.data, commit)
resolve(res)
}).catch(error => {
reject(error)
@ -96,6 +94,7 @@ export const logOut = (commit) => {
}
export const setUserInfo = (res, commit) => {
console.log(res)
// 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
if (res.roles.length === 0) {
commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])

98
src/views/content/material/index.vue

@ -0,0 +1,98 @@
<template>
<div class="app-container">
<div class="content_warp">
<el-tabs v-model="activeIndex" @tab-click="handleClick">
<el-tab-pane label="全部" name="0" />
<el-tab-pane name="1">
<span slot="label">
图片<i class="emrgencyCount">{{ imgNum }}</i>
</span>
</el-tab-pane>
<el-tab-pane name="2">
<span slot="label">
视频<i class="emrgencyCount">{{ videoNum }}</i>
</span>
</el-tab-pane>
<el-tab-pane name="3">
<span slot="label">
音频<i class="emrgencyCount">{{ audioNum }}</i>
</span>
</el-tab-pane>
</el-tabs>
<MaterialList ref="MaterialList" :is-multi-selected="isMultiSelected" :mulit-text="mulitText" :active-index="activeIndex" @changedMultiSelected="changedMultiSelected" />
</div>
<div class="material_btn">
<el-button round type="primary" @click="handleUpload">上传列表</el-button>
<el-button round @click="multiSelectBtn">{{ mulitText }}</el-button>
</div>
</div>
</template>
<script>
import MaterialList from './materialList/index'
export default {
name: 'MaterialContent',
components: { MaterialList },
data() {
return {
activeIndex: 0 || '0',
isMultiSelected: false,
mulitText: '多选',
audioNum: 0,
imgNum: 0,
videoNum: 0
}
},
mounted: function() {
setTimeout(() => {
this.audioNum = this.$refs.MaterialList.audioNum
this.imgNum = this.$refs.MaterialList.imgNum
this.videoNum = this.$refs.MaterialList.videoNum
}, 1000)
},
methods: {
handleClick(tab) {
this.activeIndex = tab.index
switch (this.activeIndex) {
case '0':
this.$refs.MaterialList.tabType = null
break
case '1':
this.$refs.MaterialList.tabType = 0
break
case '2':
this.$refs.MaterialList.tabType = 1
break
case '3':
this.$refs.MaterialList.tabType = 2
break
}
this.$refs.MaterialList.getMaterialList()
},
handleUpload() {
this.$refs.MaterialList.UploadList()
},
multiSelectBtn() {
this.isMultiSelected = !this.isMultiSelected
this.mulitText = this.isMultiSelected ? '取消' : '多选'
},
//
changedMultiSelected() {
if (this.isMultiSelected) {
this.isMultiSelected = false
this.mulitText = '多选'
}
}
}
}
</script>
<style lang="scss" scoped>
.app-container {
position: relative;
padding: 6px 0 20px 0;
}
.emrgencyCount{
padding: 0 4px;
}
</style>

674
src/views/content/material/materialList/index.vue

@ -0,0 +1,674 @@
<template>
<div>
<div v-if="isToFolder" class="material_crumbs">
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item><a href="/content">素材库</a></el-breadcrumb-item>
<el-breadcrumb-item>{{ currentFolder }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="material_content">
<!-- 上传 / 创建文件夹 -->
<div class="material_item cont_upload">
<Upload ref="uploadMaterial" :is-theme="isTheme" @saveMaterial="saveMaterial" />
<el-button v-if="!isToFolder && tabType == null" class="mkdir_btn" round type="primary" @click="handleMkdir(0)">创建文件夹</el-button>
<el-button v-if="isToFolder" class="return_btn" round type="primary"><a href="/content">返回</a></el-button>
</div>
<!-- 文件夹list -->
<div v-for="(item,index) in materialFolders" :key="item.id" :class="['material_item', 'folder', { 'item_multi': folderChecked == index }]" @click.stop="editFolder(item,index)" @dblclick="floderDbClick(item,index)">
<div class="icon_bg">
<svg v-if="!item.imgPath" class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
<img v-else :src="item.imgPath" />
</div>
<p class="file_name">{{ item.name }}</p>
<span v-if="folderChecked == index" class="checked_btn"></span>
</div>
<!-- 素材库list -->
<div v-for="(item, index) in materialList" :key="'list-'+index" :class="['material_item', 'item_cont', { 'item_multi': selectedListId.includes(item.material_id) }]">
<div v-if="item.img_path || item.material_type == 1" class="img_box">
<img :src="item.img_path" :onerror="defaultImg" alt />
</div>
<div v-if="!item.img_path && item.material_type == 2" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ item.deposit_url | getFileFormat }}</span>
<span v-if="item.material_type !== '0'" class="item_time">{{ item.duration | getSeconds }}</span>
</div>
<div class="file_name">{{ item.material_name }}</div>
<span v-if="isMultiSelected" class="checked_btn" @click="selectedItem(item)"></span>
</div>
</div>
<!-- 创建文件夹layer / 编辑 -->
<div class="publish_layer">
<el-dialog :title="layerTitle" :close-on-click-modal="false" :show-close="false" :visible.sync="mkdirVisible" width="616px">
<el-form ref="folderForm" :inline="true" :model="folderForm" size="small" label-width="100px">
<el-form-item
:label="labelTxt"
prop="name"
:rules="[
{ required: true, message: '请输入名称', trigger: 'blur' }
]"
>
<el-input v-model="folderForm.name" style="width: 336px" />
</el-form-item>
<el-form-item v-if="formatType != 0" label="封面">
<UploadCover ref="childUpload" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button v-if="!isEditMaterial" type="primary" round @click="submitForm('folderForm')"> </el-button>
<el-button v-else type="primary" round @click="saveMaterial"> </el-button>
<el-button round @click="resetForm()"> </el-button>
</div>
</el-dialog>
</div>
<!-- 多选操作 -->
<div v-if="selectedListId.length != 0 || folderChecked != -1" class="multi_handle">
<div v-if="!isEditFolder && folderChecked == -1 && isMultiSelected">
<el-button type="button" class="mulit_btn" @click="publishHandle(0)">即时发布</el-button>
<el-button type="button" class="mulit_btn" @click="publishHandle(1)">定时发布</el-button>
<el-button type="button" class="mulit_btn" :disabled="selectedListId.length > 1" @click="editContent()">编辑</el-button>
<el-button type="button" class="mulit_btn">下载</el-button>
<el-button type="button" class="mulit_btn" @click="moveingTo()">移动</el-button>
<el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMyMaterial">删除</el-button>
</div>
<div v-else>
<el-button type="button" class="mulit_btn" @click="handleMkdir(1)">编辑</el-button>
<el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMaterialFolder">删除</el-button>
</div>
</div>
<!-- 移动至layer -->
<div class="wjj_layer">
<el-dialog title="移动至" :close-on-click-modal="false" :show-close="false" :visible.sync="movingVisible" width="576px" height="384px">
<div class="wjj_list">
<div v-for="(item, index) in folderList" :key="index" :class="['wjj_item', { 'wjj_item_active': folderListChecked == index }]" @click="wjjSelected(item,index)">
<svg class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
<p class="wjj_name">{{ item.name }}</p>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="moveFile">确定</el-button>
<el-button round @click="movingVisible=false">取消</el-button>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import { getMaterialList, saveMaterialFolder, deleteMaterialFolder, saveMaterial, deleteMyMaterial, moveMyMaterial } from '@/api/material/material'
import Upload from '../../../components/upload'
import UploadCover from '../../../components/upload_cover'
import { getSeconds, getFileFormat } from '@/utils/index.js'
export default {
name: 'Material',
components: { Upload, UploadCover },
filters: {
getSeconds(s) {
return getSeconds(s)
},
getFileFormat(s) {
return getFileFormat(s)
}
},
props: {
isMultiSelected: {
type: Boolean,
required: true
},
activeIndex: {
type: String,
required: true
}
},
data() {
return {
isTheme: false,
orga_id: '133221333123111', // ID
rootFolderId: null, // ID
thisFoldId: null, // ID
folderList: [], // list
materialFolders: [], // list
folderForm: { // form
fid: '',
id: '',
img_path: '',
name: '',
orga_id: ''
},
isEditFolder: false, //
mkdirVisible: false, // layer
folderChecked: -1, //
materialList: [], // list
isEditMaterial: false, //
formatType: null, // 0 img 1 video 2 audio
materialId: null, // id
materialImgPath: '', //
materialDuration: 0, //
materialName: '', //
uploadFileUrl: null, //
selectedMaterial: [], //
selectedListId: [], // material_id
selectInFolderid: [], // id -- in_folder_id
layerTitle: '创建文件夹', // /title
labelTxt: '文件夹名称',
isToFolder: false, //
currentFolder: '', //
currentFolderId: null,
movingVisible: false,
uploadListData: [ //
],
folderListChecked: -1,
tabType: null,
audioNum: 0,
imgNum: 0,
videoNum: 0
}
},
computed: {
defaultImg() {
return 'this.src="' + require('@/assets/images/menu_bg_02.png') + '"'
}
},
watch: {
isMultiSelected(newName, oldName) {
console.log('newName', newName)
if (newName === false) {
this.selectedListId = []
}
},
activeIndex(newName, oldName) {
this.tabIndex = newName
this.$nextTick(() => {
switch (this.tabIndex) {
case '0':
this.$refs.uploadMaterial.isActiveType = null
break
case '1':
this.formatType = 1
this.$refs.uploadMaterial.isActiveType = 0
break
case '2':
this.formatType = 2
this.$refs.uploadMaterial.isActiveType = 1
break
case '3':
this.formatType = 2
this.$refs.uploadMaterial.isActiveType = 2
break
}
})
},
'$route.query.folderTag'(Val) {
console.log(Val)
}
},
created() {
// console.log(localStorage.getItem('materialTabIndex'))
},
mounted: function() {
console.log(this.$route.query.folderTag)
this.getMaterialList()
document.addEventListener('click', this.hiddenFolderActiveClick)
},
methods: {
// list
getMaterialList() {
let params
if (this.$route.query.folderTag) {
console.log('文件夹内')
this.isToFolder = true
this.currentFolder = localStorage.getItem('currentFolder')
this.currentFolderId = localStorage.getItem('currentFolderId')
params = {
'folder_id': this.currentFolderId,
'material_name': null,
'material_type': this.tabType,
'material_type_not': null,
'orga_id': this.orga_id
}
} else {
console.log('文件夹外')
this.isToFolder = false
localStorage.removeItem('currentFolder')
localStorage.removeItem('currentFolderId')
params = {
'folder_id': null,
'material_name': null,
'material_type': this.tabType,
'material_type_not': null,
'orga_id': this.orga_id
}
}
getMaterialList(params).then(res => {
if (!this.$route.query.folderTag) {
localStorage.setItem('rootFolderId', res.data.thisFoldId)
}
this.materialFolders = res.data.materialFolders
this.materialList = res.data.pageThemeVO
this.audioNum = res.data.audioNum
this.imgNum = res.data.imgNum
this.videoNum = res.data.videoNum
// data
this.thisFoldId = res.data.thisFoldId
})
},
// /
handleMkdir(mkdirType) {
this.mkdirVisible = true
this.folderForm.fid = this.thisFoldId
this.folderForm.orga_id = this.orga_id
if (mkdirType === 0) {
this.$nextTick(() => {
this.$refs.childUpload.imageUrl = ''
this.folderForm.img_path = ''
this.folderForm.name = ''
})
delete this.folderForm.id
} else {
this.$nextTick(() => {
this.$refs.childUpload.imageUrl = this.folderForm.img_path
})
}
},
//
floderDbClick(item, index) {
this.isEditMaterial = false
this.$router.replace(
{
path: '/content', query: { folderTag: 1 }
}
)
this.currentFolder = item.name
this.currentFolderId = item.id
localStorage.setItem('currentFolder', this.currentFolder)
localStorage.setItem('currentFolderId', this.currentFolderId)
this.getMaterialList()
this.selectedListId = []
this.folderChecked = -1
this.isEditFolder = false
},
//
hiddenFolderActiveClick() {
this.folderChecked = -1
this.isEditFolder = false
},
//
editFolder(item, index) {
this.isEditMaterial = false
this.selectedListId = []
//
this.$emit('changedMultiSelected')
if (index != this.folderChecked) {
this.folderChecked = index
this.isEditFolder = true
this.folderForm = {
fid: item.fid,
id: item.id,
name: item.name,
img_path: item.imgPath,
orga_id: item.orgaId
}
} else {
this.folderChecked = -1
this.isEditFolder = false
}
},
//
deleteMaterialFolder() {
this.$confirm('此操作将永久删除该文件夹, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
id: this.folderForm.id
}
deleteMaterialFolder(params).then(res => {
if (res.code === 200) {
this.$message({
message: '删除文件夹成功',
type: 'success'
})
this.getMaterialList()
this.folderChecked = -1
this.isEditFolder = false
}
})
}).catch(() => {
this.$message({
message: '已取消删除',
type: 'info'
})
})
},
// - /
submitForm(formName) {
this.folderForm.img_path = this.$refs.childUpload.imageUrl
this.$refs[formName].validate((valid) => {
if (valid) {
saveMaterialFolder(this.folderForm).then(res => {
if (res.code === 200) {
this.$message({
message: '创建文件夹成功',
duration: 2000,
type: 'success'
})
this.mkdirVisible = false
this.getMaterialList()
} else {
this.$message({
message: '创建文件夹失败',
duration: 2000,
type: 'warning'
})
}
})
} else {
console.log('error submit!!')
return false
}
})
},
//
resetForm() {
// folderForm
// Object.assign(this.$data.folderForm, this.$options.data.call(this).folderForm)
this.mkdirVisible = false
},
// - to /
publishHandle(index) {
localStorage.removeItem('selectedMaterial')
localStorage.removeItem('releaseId')
localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
//
const resultAudio = []
this.selectedMaterial.map(item => {
if (item.material_type == 2) {
resultAudio.push(item)
}
})
if (resultAudio.length > 1) {
this.$message.error('音频类型的文件只可选择1个')
return
}
this.$router.push(
{
path: '/release', query: { tag: index }
}
)
},
// -
editContent() {
this.mkdirVisible = true
this.labelTxt = '文件名称'
this.isEditMaterial = true
if (this.formatType == 1) {
this.layerTitle = '视频编辑'
} else if (this.formatType == 2) {
this.layerTitle = '音频编辑'
} else {
this.layerTitle = '图片编辑'
}
const checkedMaterial = this.materialList.filter(item => {
return item.material_id == this.selectedListId[0]
})
this.materialId = checkedMaterial[0].material_id
this.folderForm.name = checkedMaterial[0].material_name
this.materialDuration = checkedMaterial[0].duration
this.uploadFileUrl = checkedMaterial[0].deposit_url
this.materialImgPath = checkedMaterial[0].img_path
},
//
saveMaterial() {
if (!this.isEditMaterial) {
console.log(this.$refs.uploadMaterial.fileSize)
const formatType = this.$refs.uploadMaterial.formatType
this.uploadFileUrl = this.$refs.uploadMaterial.uploadFileUrl
//
const duration = this.$refs.uploadMaterial.duration
this.materialName = this.$refs.uploadMaterial.fileNames
switch (formatType) {
case 'image':
this.formatType = 0
this.materialImgPath = this.uploadFileUrl
this.materialDuration = 0
break
case 'video':
this.formatType = 1
this.materialDuration = duration
break
case 'audio':
this.formatType = 2
this.materialDuration = duration
break
}
} else {
this.materialName = this.folderForm.name
this.$nextTick(() => {
if (this.$refs.childUpload) {
this.materialImgPath = this.$refs.childUpload.imageUrl
}
})
}
setTimeout(() => {
const params = {
'class_ids': [
// id
],
'deposit_url': this.uploadFileUrl, //
'device_direction': 1, // 1. 2.,
'duration': this.materialDuration, // s
'material_id': this.materialId,
'folder_id': this.thisFoldId, // id
'img_path': this.materialImgPath, // id
'material_name': this.materialName, //
'material_type': this.formatType, //
'file_size': this.$refs.uploadMaterial.fileSize, //
'orga_id': this.orga_id, // id
'store_type': 1 // 1. 2.
}
console.log(params)
if (!this.isEditMaterial) {
//
delete params.material_id
}
saveMaterial(params).then(res => {
if (res.code === 200) {
this.$message({
message: '上传素材成功',
type: 'success'
})
this.mkdirVisible = false
this.getMaterialList()
this.materialImgPath = ''
}
})
}, 200)
},
// -
selectedItem(item) {
const id = item.material_id
const inFolderId = item.in_folder_id
const type = item.material_type
const arr = this.selectedListId
if (arr.includes(id)) {
const index = arr.indexOf(id)
if (index > -1) {
arr.splice(index, 1)
this.selectInFolderid.splice(index, 1)
this.selectedMaterial.splice(index, 1)
}
} else {
this.selectedListId.push(id)
this.selectInFolderid.push(inFolderId)
this.selectedMaterial.push(item)
this.formatType = type
}
},
// -
deleteMyMaterial() {
this.$confirm('此操作将永久删除该素材, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
ids: this.selectedListId
}
deleteMyMaterial(params).then(res => {
if (res.code === 200) {
this.$message({
message: '删除素材成功',
type: 'success'
})
this.getMaterialList()
this.selectedListId = []
}
})
}).catch(() => {
this.$message({
message: '已取消删除',
type: 'info'
})
})
},
UploadList() {
this.uploadListVisible = true
},
// -btn
moveingTo(index) {
this.folderList = []
if (this.materialFolders.length > 0) {
this.folderList = this.materialFolders.slice(0, this.materialFolders.length)
}
this.rootFolderId = localStorage.getItem('rootFolderId')
const returnFolder = {
id: this.rootFolderId,
name: '返回上一级'
}
this.folderList.unshift(returnFolder)
this.movingVisible = true
},
// list -
wjjSelected(item, index) {
this.folderListChecked = index
this.thisFoldId = item.id
},
// -
moveFile() {
if (this.materialFolders.length > 0) {
if (this.thisFoldId == this.rootFolderId) {
this.$message({
message: '不能讲文件移动到自身目录下哦~',
type: 'error'
})
return
}
} else {
this.thisFoldId = this.rootFolderId
}
const params = {
'folder_id': this.thisFoldId,
'ids': this.selectInFolderid,
'material_ids': this.selectedListId
}
moveMyMaterial(params).then(res => {
if (res.code === 200) {
this.$message({
message: '移动成功',
type: 'success'
})
this.movingVisible = false
this.getMaterialList()
this.selectedListId = []
}
})
},
format(percentage) {
return percentage === 100 ? '100%' : `${percentage}%`
},
start() {
const that = this
that.$nextTick(() => {
that.progressLoading = true
that.percentage = 0
that.timeStart = setInterval(() => {
if (that.percentage < 100) {
that.percentage += 1
}
}, 100)
})
},
//
end() {
this.loading_txt = '继续'
// const that = this
// that.percentage = 100
clearInterval(this.timeStart)
// setTimeout(() => {
// that.progressLoading = false
// }, 300)
}
}
}
</script>
<style lang="scss" scoped>
.material_crumbs {
padding: 0 24px 15px 24px;
margin-top: -20px;
::v-deep .el-breadcrumb {
font-size: 12px;
color: #999999;
}
}
.material_content {
display: flex;
flex-wrap: wrap;
margin-left: 24px;
.material_item {
position: relative;
width: 174px;
height: 182px;
border-radius: 4px;
margin: 0 20px 20px 0;
overflow: hidden;
}
.item_cont {
border-color: #dcdde3;
img {
width: 100%;
height: 148px;
}
.radio_img {
width: 100%;
height: 148px;
}
}
}
.upload_layer {
::v-deep .el-dialog__body {
padding: 0 20px 30px 20px;
}
}
::v-deep .el-table {
.el-button {
padding: 0 10px;
height: 24px;
&.upload_delt {
background-color: #f76b6b;
}
}
}
.multi_handle {
div {
display: flex;
}
}
</style>

139
src/views/content/publish/historyList/index.vue

@ -0,0 +1,139 @@
<template>
<div class="list_warp">
<el-row :gutter="15">
<el-col>
<el-table ref="table" :data="publishHistoryList" :header-cell-style="{ background: '#3a8aeb', color: '#fff' }" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="发布名称" align="center" prop="relaase_name" />
<el-table-column label="发布内容" align="center" prop="content">
<template slot-scope="scope">
<div>
<img width="100px" size="medium" :src="scope.row.release_first_img" />
</div>
</template>
</el-table-column>
<el-table-column label="发布时间" align="center" prop="date">
<template slot-scope="scope">
<div v-if="scope.row.release_type==0">{{ scope.row.release_start }}</div>
<div v-else>{{ scope.row.release_start+" "+scope.row.release_end }}</div>
</template>
</el-table-column>
<el-table-column label="发布周期" align="center" prop="cycle">
<template slot-scope="scope">
{{ scope.row.release_cycle==0?(''):((scope.row.release_cycle==1?'每天':'每周'+scope.row.release_weekly)) }}
</template>
</el-table-column>
<el-table-column label="发布类型" align="center" prop="type">
<template slot-scope="scope">
<div>{{ scope.row.release_type==1 ? '定时发布' : '即时发布' }}</div>
</template>
</el-table-column>
<el-table-column label="发布人" align="center" prop="nick_name" />
<el-table-column label="状态" align="center" prop="enabled">
<template slot-scope="scope">
<div :class="{ stop_txt: scope.row.is_state }">
{{ scope.row.is_state==0 ? '':(scope.row.is_state==1? '停止':'发布中') }}
</div>
</template>
</el-table-column>
<el-table-column prop="release_device" align="center" label="发布设备">
<template slot-scope="scope">
<div>
{{ scope.row.release_device == 2 ? "" : "全部设备" }}
</div>
<div>
<el-tag v-for="tag in scope.row.binding_device" :key="tag">{{ tag }}</el-tag>
</div>
</template>
</el-table-column>
</el-table>
<!-- 分页器 -->
<el-pagination style="margin-top: 20px;" background :current-page="page" :total="total" :page-size="size" :pager-count="5" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getPublishHistory" @size-change="handleSizeChange" />
</el-col>
</el-row>
</div>
</template>
<script>
import { parseTime, setWeekly } from '@/utils/index.js'
import { reqPublishHistory } from '@/api/publish/publishHistory'
export default {
name: 'HistoryList',
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
data() {
return {
orga_id: '133221333123111',
page: 1,
size: 10,
//
total: 0,
//
publishHistoryList: [],
selectedList: []
}
},
mounted() {
this.getPublishHistory()
},
methods: {
//
getPublishHistory(pager = 1) {
this.page = pager
const params = {
release_name: '',
orga_id: this.orga_id,
page: this.page,
size: this.size
}
reqPublishHistory(params).then(res => {
if (res.code == 200) {
this.publishHistoryList = res.data.content
this.total = res.data.totalElements
this.publishHistoryList.forEach(item => {
item.release_start = parseTime(item.release_start).split('00:00:00')[0]
item.release_end = parseTime(item.release_end).split('00:00:00')[0]
if (item.binding_device) {
item.binding_device = item.binding_device.split(',')
}
if (item.release_weekly) {
item.release_weekly = setWeekly(item.release_weekly)
} else {
item.release_weekly = ''
}
})
console.log(this.publishHistoryList)
}
})
},
handleSelectionChange(val) {
this.selectedList = val
if (val.length > 0) {
this.clearBtnDisabled = false
} else {
this.clearBtnDisabled = true
}
console.log(val)
},
//
handleSizeChange(size) {
//
this.size = size
this.getPublishHistory()
}
}
}
</script>
<style lang="scss" scoped>
.list_warp {
padding: 0 24px;
.stop_txt {
color: #3a8aeb;
}
}
</style>

65
src/views/content/publish/index.vue

@ -0,0 +1,65 @@
<template>
<div class="app-container">
<div class="content_warp">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="发布列表" name="first">
<PublistList />
</el-tab-pane>
<el-tab-pane label="发布历史" name="second">
<HistoryList />
</el-tab-pane>
<el-tab-pane label="紧急通知" name="third">
<UrgentMessage ref="message" />
</el-tab-pane>
</el-tabs>
</div>
<div v-if="activeName !== 'third'" class="home_publish_btn">
<el-button round class="el_button_red" @click="publishHandle(0)">即时发布</el-button>
<el-button round type="primary" @click="publishHandle(1)">定时发布</el-button>
</div>
<div v-else class="home_publish_btn">
<el-button type="primary" round @click="addMessage">紧急发布</el-button>
</div>
</div>
</template>
<script>
import PublistList from './publishList/index'
import HistoryList from './historyList/index'
import UrgentMessage from './urgentMessage/index'
export default {
name: 'PublishContent',
components: { PublistList, HistoryList, UrgentMessage },
data() {
return {
activeName: 'first',
mulitText: '多选'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
},
publishHandle(index) {
localStorage.removeItem('selectedMaterial')
localStorage.removeItem('releaseId')
this.$router.push(
{
path: '/release', query: { tag: index }
}
)
},
//
addMessage() {
this.$refs.message.addFormData()
}
}
}
</script>
<style lang="scss" scoped>
.app-container {
position: relative;
padding: 6px 0 20px 0;
}
</style>

224
src/views/content/publish/publishList/index.vue

@ -0,0 +1,224 @@
<template>
<div class="list_warp">
<el-row :gutter="15">
<el-col>
<el-table ref="table" :data="publishList" :header-cell-style="{ background: '#3a8aeb', color: '#fff' }" class="publish_table">
<el-table-column type="selection" width="55" />
<el-table-column label="发布名称" align="center" prop="relaase_name" />
<el-table-column label="发布内容" align="center" prop="content">
<template slot-scope="scope">
<div v-if="scope.row.release_first_img">
<img width="48px" height="63px" size="medium" :src="scope.row.release_first_img" />
</div>
</template>
</el-table-column>
<el-table-column label="发布时间" align="center" prop="date" width="200px">
<template slot-scope="scope">
<div v-if="scope.row.release_type==0">{{ scope.row.release_start }}</div>
<div v-else-if="scope.row.release_cycle==2">{{ scope.row.release_start+" 至 "+scope.row.release_end +'每周'+ scope.row.release_weekly }}</div>
<div v-else>{{ scope.row.release_start+" "+scope.row.release_end +'每天' }}</div>
</template>
</el-table-column>
<el-table-column label="发布类型" align="center" prop="type">
<template slot-scope="scope">
<div>{{ scope.row.release_type==1 ? "定时发布" : "即时发布" }}</div>
</template>
</el-table-column>
<el-table-column label="发布人" align="center" prop="nick_name" />
<el-table-column label="状态" align="center" prop="is_state">
<template slot-scope="scope">
<div :class="{ stop_txt: scope.row.is_state == 2 }">
{{ scope.row.is_state == 2 ? '停止' : (scope.row.stateTxt ? '发布中' : '未发布') }}
</div>
</template>
</el-table-column>
<el-table-column prop="release_device" align="center" label="发布设备" width="300px">
<template slot-scope="scope">
<div>
{{ scope.row.release_device == 2 ? "" : "全部设备" }}
<div class="tag_list">
<el-tag v-for="tag in scope.row.binding_device" :key="tag" type="primary">{{ tag }}</el-tag>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="220px" align="center" fixed="right">
<template slot-scope="scope">
<el-button type="primary" :class="['top_btn', { top_btn_active: scope.row.is_topping }]" @click="isTophandle(scope.row)">{{ scope.row.is_topping ? "取消" : "置顶" }}</el-button>
<el-button type="primary" class="edit_btn" @click="editRelease(scope.row)">编辑</el-button>
<el-button type="primary" :class="['start_btn', { stop_btn: scope.row.is_state==1 }]" @click="isStopHandle(scope.row)">{{ scope.row.is_state==1 ? "停止" : "恢复" }}</el-button>
<el-button type="info" class="delt_btn" @click="deltHandle(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
<!-- 分页器 -->
<el-pagination style="margin-top: 20px;" background :current-page="page" :total="total" :page-size="size" :pager-count="5" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getPublishList" @size-change="handleSizeChange" />
</div>
</template>
<script>
import { parseTime, setWeekly, getNowFormatDate } from '@/utils/index.js'
import { FetchGetReleaseList, FetchUpdateReleaseState, FetchDeleteRelease, FetchToppingRelease } from '@/api/release/release'
export default {
name: 'PublishList',
data() {
return {
orga_id: '133221333123111',
page: 1,
size: 10,
total: 0,
stateTxt: null,
publishList: [] // list
}
},
mounted() {
this.getPublishList()
},
methods: {
//
getPublishList(pager = 1) {
this.page = pager
const params = {
release_name: '',
orga_id: this.orga_id,
page: this.page,
size: this.size
}
FetchGetReleaseList(params).then(res => {
if (res.code == 200) {
this.publishList = res.data.content
this.total = res.data.totalElements
this.publishList.forEach(item => {
item.release_start = parseTime(item.release_start).split('00:00:00')[0]
item.release_end = parseTime(item.release_end).split('00:00:00')[0]
if (item.binding_device) {
item.binding_device = item.binding_device.split(',')
}
if (item.release_weekly) {
item.release_weekly = setWeekly(item.release_weekly)
} else {
item.release_weekly = ''
}
//
const todayDate = getNowFormatDate()
item.stateTxt = this.dateCompare(item.release_start, todayDate)
})
} else {
this.$message.error(res.msg)
}
})
},
//
handleSizeChange(size) {
//
this.size = size
this.getPublishList()
},
//
isTophandle(row) {
const params = {
id: row.release_id,
is_topping: !row.is_topping
}
FetchToppingRelease(params).then(res => {
if (res.code == 200) {
this.$message.success(res.msg)
this.getPublishList()
} else {
this.$message.error(res.msg)
}
})
},
//
editRelease(row) {
localStorage.setItem('releaseId', JSON.stringify(row.release_id))
this.$router.push(
{
path: '/release', query: { tag: row.release_type }
}
)
},
//
isStopHandle(row) {
row.is_state = row.is_state == 1 ? 2 : 1
const params = {
id: row.release_id,
state: row.is_state
}
FetchUpdateReleaseState(params).then(res => {
if (res.code == 200) {
this.$message.success(res.msg)
this.getPublishList(this.page)
} else {
this.$message.error(res.msg)
}
})
},
//
deltHandle(row) {
this.$confirm('此操作将永久删除该列表, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
id: row.release_id,
is_del: true
}
FetchDeleteRelease(params).then(res => {
if (res.code == 200) {
this.$message.success(res.msg)
this.getPublishList(this.page)
} else {
this.$message.error(res.msg)
}
})
}).catch(() => {
this.$message({
message: '已取消删除',
type: 'info'
})
})
},
// -
dateCompare(str1, str2) {
const arr = str1.split('-')
const startDate = new Date(arr[0], arr[1], arr[2])
const startTimes = startDate.getTime()
const arr2 = str2.split('-')
const currentDate = new Date(arr2[0], arr2[1], arr2[2])
const currentTimes = currentDate.getTime()
if (startTimes > currentTimes) {
return false
} else {
return true
}
}
}
}
</script>
<style lang="scss" scoped>
.list_warp {
padding: 0 24px;
.stop_txt {
color: #3a8aeb;
}
}
.publish_table {
.tag_list {
// text-align: left;
.el-tag {
height: 26px;
line-height: 26px;
margin: 5px 10px 5px 0;
background: #cbe3ff;
color: #3a8aeb;
border: none;
}
}
}
</style>

530
src/views/content/publish/urgentMessage/index.vue

@ -0,0 +1,530 @@
<template>
<div class="list_warp">
<el-row :gutter="15">
<el-col>
<!-- v-loading="crud.loading" -->
<el-table ref="table" :data="urgentMessage" :header-cell-style="{ background: '#3a8aeb', color: '#fff' }" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<!-- prop="name" -->
<el-table-column label="序号" type="index" align="center" width="50" />
<el-table-column label="发布内容" align="center" prop="context" width="400">
<template slot-scope="{ row }">
<div>{{ row.context }}</div>
</template>
</el-table-column>
<el-table-column label="通知时间" align="center" prop="create_time">
<template slot-scope="{ row }">
<div>{{ row.create_time | parseTime }}</div>
</template>
</el-table-column>
<el-table-column label="发布人" align="center" prop="creater_name" />
<el-table-column label="状态" align="center" prop="is_state">
<template slot-scope="{ row }">
<div :class="{ stop_txt: row.is_state }">
{{ row.is_state == 1 ? "发布中" : "停止" }}
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="120px" align="center" fixed="right">
<template slot-scope="scope">
<el-button type="primary" class="edit_btn" @click="editFormData(scope.row)">编辑</el-button>
<el-button type="primary" :class="['start_btn', { stop_btn: scope.row.is_state == 1 }]" @click="isStopHandle(scope.$index, scope.row)">{{ scope.row.is_state == 1 ? "停止" : "恢复" }}</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
<!-- 分页器 -->
<el-pagination style="margin-top: 20px;" background :current-page="queryInfo.page" :total="total" :page-size="queryInfo.size" :pager-count="5" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getUrgentMessage" @size-change="handleSizeChange" />
<!-- 编辑紧急通知 -->
<div class="publish_layer">
<el-dialog :title="form.notice_id==null? '紧急发布':'编辑'" :close-on-click-modal="false" :show-close="false" :visible.sync="messageVisible" width="872px">
<el-form ref="form" :model="form" size="small" label-width="100px">
<el-form-item
label="文本颜色"
prop="context_color"
:rules="[
{ required: true, message: '请选择文本颜色', trigger: '' },
]"
>
<colorPicker v-model="form.context_color" class="txt_color" @change="headleChangeColor" />
<el-input v-show="false" v-model="form.context_color" />
</el-form-item>
<el-form-item
label="文本内容"
prop="context"
:rules="[
{ required: true, message: '请输入文本内容', trigger: 'blur' },
]"
>
<el-input v-model="form.context" type="textarea" rows="6" style="width: 674px" />
</el-form-item>
<el-form-item
label="文本大小"
prop="context_size_name"
:rules="[
{ required: true, message: '请选择文本大小', trigger: 'change' },
]"
>
<el-select v-model="form.context_size_name" size="small" class="filter-item" @change="selectSize">
<el-option v-for="item in sizeData" :key="item.key" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item
label="文本位置"
prop="context_position_name"
:rules="[
{ required: true, message: '请选择文本位置', trigger: 'change' },
]"
>
<el-select v-model="form.context_position_name" size="small" value-key="name" class="filter-item" @change="selectPosition">
<el-option v-for="item in positionData" :key="item.key" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item
label="滚动速度"
prop="context_speed_name"
:rules="[
{ required: true, message: '请选择滚动速度', trigger: 'change' },
]"
>
<el-select v-model="form.context_speed_name" size="small" class="filter-item" @change="selectSpeed">
<el-option v-for="item in speedData" :key="item.key" :label="item.name" :value="item" />
</el-select>
</el-form-item>
<el-form-item
label="选择设备"
prop="notice_device"
:rules="[
{ required: true, message: '请选择设备', trigger: 'change' },
]"
>
<el-radio-group v-model="form.notice_device" @change="clearCheckbox()">
<el-radio :label="1" value="all">所有设备</el-radio>
<el-radio :label="2" value="other">部分设备<i v-if="form.notice_device === 2" class="radio_tip" @click="addDeviceTag()">添加</i></el-radio>
</el-radio-group>
</el-form-item>
<div v-if="form.notice_device == 1" class="select_all_tip">
所有设备都将被发送
</div>
<div v-if="deviceTags.length > 0 && form.notice_device == 2" class="select_other">
<el-row>
<el-col :span="10" class="other_tip">以下设备都将被发送<span>总计{{ deviceTags.length }}个设备</span></el-col>
<el-col :span="4">
<el-button round class="delt_btn" @click="clearDevice()">清空</el-button>
</el-col>
</el-row>
<el-tag v-for="tag in deviceTags" :key="tag.device_id" closable :disable-transitions="true" :hit="false" context_color="#cbe3ff" @close="handleClose(tag)">
{{ tag.device_name }}
</el-tag>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<!-- :loading="crud.status.cu === 2"
@click="crud.submitCU"-->
<el-button type="primary" round @click="submit">保存</el-button>
<el-button round @click="closeDialog">关闭</el-button>
</div>
</el-dialog>
</div>
<!-- 添加发布的设备 -->
<div class="add_device_layer">
<el-dialog title="请选择设备" :close-on-click-modal="false" :visible.sync="selectDeviceVisible" width="400px">
<el-tag v-for="tag in deviceList" :key="tag.device_id" :disable-transitions="true" :hit="false" color="#cbe3ff" class="all_tags" @click="tagHandle(tag)">
{{ tag.device_name }}
</el-tag>
</el-dialog>
</div>
</div>
</template>
<script>
import { parseTime } from '@/utils/index.js'
import { ReqDeviceList } from '@/api/device/deviceList.js'
import {
reqUrgentMessage,
reqQueryMessage,
reqEditMessage,
reqChangeMessage
} from '@/api/publish/urgentMessage'
export default {
name: 'UrgentMessage',
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
data() {
return {
isAddEdit: false,
form: {
context_color: '#ff0000', //
context: '', //
context_position: null, //
context_position_name: null,
context_speed_name: null,
context_speed: null, //
context_size_name: null,
context_size: null, //
// create_by:'', //
notice_device: null,
notice_devices: [],
notice_id: '', // id
orga_id: '133221333123111'
},
queryInfo: {
notice_name: '',
orga_id: '133221333123111',
page: 1,
size: 10
},
total: 0,
messageVisible: false,
selectDeviceVisible: false,
sizeData: [
{ key: 0, name: 16 },
{ key: 1, name: 22 },
{ key: 2, name: 24 },
{ key: 3, name: 30 }
],
positionData: [
{ key: 1, name: '顶部' },
{ key: 2, name: '中间' },
{ key: 3, name: '底部' }
],
speedData: [
{ key: 0, name: '1s' },
{ key: 1, name: '2s' },
{ key: 2, name: '3s' }
],
selectedList: [],
//
deviceList: [],
// newArr:[],
deviceTags: [],
//
urgentMessage: []
}
},
mounted() {
this.getUrgentMessage()
this.getDevice()
},
methods: {
//
getUrgentMessage(pager = 1) {
this.queryInfo.page = pager
const params = this.queryInfo
reqUrgentMessage(params).then((res) => {
if (res.code == 200) {
this.urgentMessage = res.data.content
this.total = res.data.totalElements
// console.log(this.urgentMessage);
}
})
},
//
getDevice() {
const params = this.queryInfo
ReqDeviceList(params).then((res) => {
if (res.code == 200) {
this.deviceList = res.data.content
} else {
return this.$message.error('获取设备列表失败!')
}
})
},
// is_state1 2
// row.is_state == 1 ? "" : ""
isStopHandle(index, row) {
console.log(row)
// console.log(index)
if (row.is_state == 1) {
row.is_state = 2
} else {
row.is_state = 1
}
const params = {
id: row.notice_id,
state: row.is_state
}
reqChangeMessage(params).then(res => {
// console.log(res)
if (res.code == 200) {
if (params.state == 1) {
this.$message({
type: 'success',
message: '已发布成功!'
})
} else {
this.$message({
type: 'success',
message: '已停止!'
})
}
} else {
return this.$message.error('失败了~~~~')
}
})
},
//
editFormData(row) {
this.messageVisible = true
// id
const params = {
notice_id: row.notice_id
}
reqQueryMessage(params).then((res) => {
if (res.code == 200) {
this.form.notice_device = res.data.notice.noticeDevice
this.deviceTags = res.data.noticeDeviceDetailsVO
this.form.context_color = res.data.notice.contextColor
this.form.context = res.data.notice.context
this.form.context_speed = res.data.notice.contextSpeed
this.form.context_position = res.data.notice.contextPosition
this.form.context_size = res.data.notice.contextSize
this.form.notice_id = row.notice_id
//
if (this.form.context_position == 1) {
this.form.context_position_name = '顶部'
} else if (this.form.context_position == 2) {
this.form.context_position_name = '中部'
} else {
this.form.context_position_name = '底部'
}
//
if (this.form.context_speed == 0) {
this.form.context_speed_name = '1s'
} else if (this.form.context_speed == 1) {
this.form.context_speed_name = '2s'
} else {
this.form.context_speed_name = '3s'
}
//
if (this.form.context_size == 0) {
this.form.context_size_name = '16'
} else if (this.form.context_size == 1) {
this.form.context_size_name = '22'
} else if (this.form.context_size == 2) {
this.form.context_size_name = '24'
} else {
this.form.context_size_name = '30'
}
}
})
},
//
addFormData() {
this.messageVisible = true
this.$nextTick(() => {
this.form.notice_id = null
})
},
//
submit() {
this.$refs.form.validate((valid) => {
console.log(this.deviceTags)
console.log(this.form.notice_devices)
if (this.form.notice_device == 2) {
if (this.deviceTags.length != 0) {
this.deviceTags.forEach(item => {
this.form.notice_devices.push({ deviceId: item.device_id })
})
} else {
this.$message.error('请添加设备!')
return
}
}
//
if (valid) {
const params = {
context: this.form.context,
context_color: this.form.context_color,
context_position: this.form.context_position,
context_size: this.form.context_size,
context_speed: this.form.context_speed,
notice_device: this.form.notice_device,
notice_devices: this.form.notice_devices,
notice_id: this.form.notice_id,
orga_id: '133221333123111'
}
console.log(params)
reqEditMessage(params).then((res) => {
if (res.code == 200) {
this.$message({
type: 'success',
message: this.form.notice_id
? '修改紧急通知成功'
: '添加紧急通知成功'
})
this.messageVisible = false
this.$refs.form.resetFields()
this.getUrgentMessage(this.queryInfo.page)
}
})
}
})
},
//
clearCheckbox() {
if (this.form.notice_device == 1) {
this.form.notice_devices = []
}
},
//
handleSelectionChange(val) {
this.selectedList = val
// if (val.length > 0) {
// this.clearBtnDisabled = false;
// } else {
// this.clearBtnDisabled = true;
// }
},
//
headleChangeColor() {
this.form.context_size
},
//
selectSize(selVal) {
this.form.context_size = selVal.key
this.form.context_size_name = selVal.name
},
//
selectPosition(selVal) {
console.log(selVal)
this.form.context_position = selVal.key
this.form.context_position_name = selVal.name
},
//
selectSpeed(selVal) {
this.form.context_speed = selVal.key
this.form.context_speed_name = selVal.name
},
//
addDeviceTag() {
this.selectDeviceVisible = true
},
//
tagHandle(tag) {
//
if (this.deviceTags.length == 0) {
this.deviceTags.push(tag)
} else {
const current =
this.deviceTags &&
this.deviceTags.some((item) => item.device_id == tag.device_id)
if (!current) {
this.deviceTags.push(tag)
} else {
this.$message('请勿添加重复的设备!')
}
}
},
//
handleClose(tag) {
this.deviceTags.splice(this.deviceTags.indexOf(tag), 1)
},
//
clearDevice() {
this.deviceTags = []
this.form.notice_devices = []
},
//
closeDialog() {
this.messageVisible = false
this.$refs.form.resetFields()
},
//
handleSizeChange(size) {
//
this.queryInfo.size = size
this.getUrgentMessage()
}
}
}
</script>
<style lang="scss" scoped>
.list_warp {
padding: 0 24px;
.stop_txt {
color: #3a8aeb;
}
}
.txt_color {
margin-top: 12px;
}
::v-deep .el-radio-group {
display: block;
.el-radio {
position: relative;
line-height: 40px;
.radio_tip {
position: absolute;
right: -45px;
top: 0;
display: block;
width: 42px;
height: 21px;
line-height: 21px;
font-size: 12px;
text-align: center;
color: #fff;
background: url(~@/assets/images/an-tj.png) no-repeat;
background-size: 42px 21px;
}
}
}
.select_all_tip {
width: 336px;
height: 32px;
line-height: 32px;
margin: -20px 0 0 100px;
padding: 0 14px;
font-size: 12px;
color: #999;
background: #fff;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.14);
}
.select_other {
width: 600px;
margin: -20px 0 0 100px;
padding: 18px 23px;
background: #f8f8f8;
border: 1px solid #dcdde3;
border-radius: 4px;
.other_tip {
line-height: 24px;
span {
display: inline-block;
margin-left: 20px;
}
}
.el-button {
padding: 5px 8px;
border: none !important;
}
.delt_btn {
color: #fff;
background-color: #ee5747 !important;
}
}
.el-tag--small {
height: 28px;
line-height: 26px;
padding: 0 24px;
margin: 18px 16px 0 0;
font-size: 14px;
// color: #3a8aeb;
::v-deep .el-icon-close {
font-size: 16px;
}
}
.add_device_layer {
::v-deep .el-dialog__body {
padding: 0 20px 30px 20px;
}
}
</style>

713
src/views/content/theme/index.vue

@ -0,0 +1,713 @@
<template>
<div class="app-container theme_main">
<!-- 右上角btn -->
<div class="home_publish_btn">
<el-button round class="el_button_green" @click="addEditClassify(0)">新增</el-button>
<el-button round type="primary" @click="addEditClassify(1)">编辑</el-button>
<el-button round class="el_button_red" @click="uploadTheme()">上传</el-button>
</div>
<div style="position:relative">
<!-- 主题库list -->
<ThemeGalleryList
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="showItemInfo"
:tab-item="tabItem"
:is-my-album="isMyAlbum"
@pf="parent"
@changedMultiSelected="changedMultiSelected"
/>
<MyAlbum v-show="isMyAlbum" ref="MyAlbum" :is-multi-selected="isMultiSelected" />
<div class="material_btn">
<el-button round type="primary" @click="uploadHistoryVisible=true">上传历史</el-button>
<el-button round @click="multiSelectBtn">{{ mulitText }}</el-button>
</div>
</div>
<!-- 平台技术人员-新增/编辑分类 -->
<div class="upload_layer">
<el-dialog append-to-body :show-close="false" :visible.sync="addDialogVisible" :close-on-click-modal="false" :title="layerTitle" width="620px">
<el-form ref="classifyForm" inline :model="classifyForm" size="small" label-width="80px">
<el-form-item
v-if="isAddEdit==0"
label="类别名称"
prop="class_name"
:rules="[
{ required: true, message: '请输入类别名称', trigger: 'blur' }
]"
>
<el-input v-model="classifyForm.class_name" style="width: 360px;" />
</el-form-item>
<el-form-item
v-else
label="类别名称"
prop="class_name"
:rules="[
{ required: true, message: '请选择类别名称', trigger: 'change' }
]"
>
<el-select v-model="classifyForm.class_name" placeholder="请选择" value-key="class_name" style="width: 360px;" @change="selectName">
<el-option v-for="item in tabItem" :key="item.id" :label="item.class_name" :value="item" />
</el-select>
</el-form-item>
<el-form-item
label="所属机构"
prop="searchClassify"
>
<el-select v-model="searchClassify" multiple placeholder="请选择" style="width: 360px;" @change="changeSelect">
<el-option
v-for="item in organOptions"
:key="item.value"
:label="item.label"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="submitForm('classifyForm')"> </el-button>
<el-button round @click="resetForm('classifyForm')"> </el-button>
</div>
</el-dialog>
</div>
<!-- 平台技术人员-上传 -->
<el-dialog append-to-body :show-close="false" :visible.sync="uploadDialogVisible" :close-on-click-modal="false" :title="uploadTitle" class="upload_layer">
<el-form ref="uploadForm" :model="uploadForm" size="small" label-width="80px">
<el-form-item label="类别名称" prop="selectClassifyList">
<el-checkbox-group v-model="selectClassifyList">
<el-checkbox v-for="item in tabItem" :key="item.id" :label="item.id" :value="item.id">{{ item.class_name }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="设备方向" prop="device_direction">
<el-radio-group v-model="uploadForm.device_direction">
<el-radio :label="1" value="1">横屏</el-radio>
<el-radio :label="2" value="2">竖屏</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="isUploadThemeType == 1" prop="material_name" label="文件名称">
<el-input v-model="uploadForm.material_name" style="width:336px" />
</el-form-item>
<el-form-item class="upload_source" label="上传内容" prop="deposit_url">
<div v-if="formatType != -1" class="source_cont">
<img v-if="formatType==0" :src="uploadForm.deposit_url" alt="" width="150" />
<video v-if="formatType==1" :src="uploadForm.deposit_url" controls width="200"></video>
<audio v-if="formatType==2" :src="uploadForm.deposit_url" controls></audio>
<!-- <p>文件名{{ fileNames }}</p> -->
</div>
<Upload ref="uploadMaterial" :is-theme="isTheme" @saveMaterial="saveMaterial" />
</el-form-item>
<el-form-item v-if="formatType != 0" label="添加封面" prop="img_path">
<UploadCover ref="childUpload" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="uploadSubmit()"> </el-button>
<el-button round @click="resetForm('uploadForm')"> </el-button>
</div>
</el-dialog>
<!-- 上传历史layer -->
<div class="upload_layer">
<el-dialog title="上传历史" :close-on-click-modal="false" :visible.sync="uploadHistoryVisible" width="1100px">
<!-- 上传历史 - 搜索 -->
<el-form ref="form" :model="queryForm" label-width="80px" class="query_history">
<el-form-item label="文件名称">
<el-input v-model="queryForm.name" style="width:200px" @keyup.enter.native="getThemeHistoryList(pager = 1)" @blur="getThemeHistoryList(pager = 1)" />
</el-form-item>
<el-form-item label="时间">
<el-date-picker v-model="queryForm.date" type="daterange" value-format="yyyy-MM-dd" range-separator="" start-placeholder="开始日期" end-placeholder="结束日期" @change="getThemeHistoryList(pager = 1)" @blur="getThemeHistoryList(pager = 1)" />
</el-form-item>
</el-form>
<!-- 上传历史 - table-list -->
<el-table :data="uploadHistoryListData" :header-cell-style="{ color: '#333' }">
<el-table-column align="center" prop="material_name" label="文件名称" />
<el-table-column align="center" prop="cover" label="发布内容">
<template slot-scope="scope">
<div v-if="scope.row.img_path">
<img width="48px" height="64px" size="medium" :src="scope.row.img_path" />
</div>
</template>
</el-table-column>
<el-table-column align="center" prop="classes" label="类别名称" width="180">
<template slot-scope="scope">
<div class="tag_list">
<el-tag v-for="tag in scope.row.classes.split(',')" :key="tag" type="primary">{{ tag }}</el-tag>
</div>
</template>
</el-table-column>
<el-table-column align="center" prop="device_direction" label="设备方向">
<template slot-scope="scope">
{{ scope.row.device_direction==2 ? "竖屏" : "横屏" }}
</template>
</el-table-column>
<!-- <el-table-column align="center" prop="agency" label="所属机构" /> -->
<el-table-column align="center" prop="create_time" label="上传时间" width="150">
<template slot-scope="{row}">
<div>{{ row.create_time | parseTime }}</div>
</template>
</el-table-column>
<el-table-column align="center" prop="create_by" label="发布人" />
<el-table-column align="center" prop="handle" label="操作">
<template slot-scope="scope">
<el-button type="primary" round class="edit_btn" @click="editUploadTheme(scope.row)">编辑</el-button>
<el-button type="primary" round :class="['start_btn', { stop_btn: scope.row.is_state == 1 }]" @click="isStopHandle(scope.row)">{{ scope.row.is_state == 1 ? "停用" : "恢复" }}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页器 -->
<el-pagination style="margin-top: 20px;" background :current-page="page" :total="total" :page-size="size" :pager-count="5" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getThemeHistoryList" @size-change="handleSizeChange" />
</el-dialog>
</div>
</div>
</template>
<script>
import { FetchAddOrEdit, FetchThemeHistoryList, FetchUpdateThemeState, FetchFindThemeClassDetails } from '@/api/theme/theme.js'
import { saveMaterial } from '@/api/material/material'
import ThemeGalleryList from '../../components/ThemeGalleryList'
import MyAlbum from '../../components/MyAlbum'
import Upload from '../../components/upload'
import UploadCover from '../../components/upload_cover'
import { parseTime } from '@/utils/index.js'
export default {
name: 'ThemeGallery',
components: { ThemeGalleryList, MyAlbum, UploadCover, Upload },
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
data() {
return {
isMyAlbum: false,
isTheme: true,
orga_id: '133221333123111', // ID
addDialogVisible: false, // -
layerTitle: '新增',
isAddEdit: 0, //
classifyForm: { // form
class_name: '',
is_all: false,
id: '',
orga_ids: []
},
tabItem: [], // data
isAllSelect: [],
searchClassify: [], //
oldSearchClassify: [],
organOptions: [ // list-data
{
label: '全部',
value: 'ALL_SELECT',
id: 'ALL_SELECT'
},
{
label: '武汉图书馆',
value: '01',
id: '133221333123111'
}
],
mulitText: '多选', // list -
isMultiSelected: false,
showItemInfo: true, //
uploadDialogVisible: false, // -
uploadHistoryVisible: false, // -
uploadTitle: '上传', // -
isUploadThemeType: 0, // -
uploadForm: { //
class_ids: [
// id
],
deposit_url: null, //
device_direction: null, // 1. 2.,
duration: null, // s
material_id: null,
folder_id: null, // id
img_path: null, // id
material_name: null, //
material_type: null, //
file_size: null, //
orga_id: null, // id
store_type: null // 1. 2.
},
fileNames: '',
formatType: -1,
materialImgPath: null,
materialDuration: null,
selectClassifyList: [],
queryForm: { // list -
name: '',
date: []
},
uploadHistoryListData: [], // list
isEditTheme: false,
page: 1,
size: 10,
total: 0,
selectContVisible: true
}
},
watch: {
},
mounted() {
// list
this.getThemeHistoryList()
},
methods: {
parent() {
this.isMyAlbum = this.$refs.ThemeGalleryList.themeItemActive == 2
console.log(this.$refs.ThemeGalleryList.themeItemActive)
this.$refs.MyAlbum.selectInFolderid = []
this.$refs.MyAlbum.getMyAlbum()
},
// /
changeSelect(val) {
const allValues = []
//
for (const item of this.organOptions) {
allValues.push(item.id)
}
//
const oldVal = this.oldSearchClassify.length === 1 ? this.oldSearchClassify[0] : []
//
if (val.includes('ALL_SELECT')) this.searchClassify = allValues
//
if (oldVal.includes('ALL_SELECT') && !val.includes('ALL_SELECT')) this.searchClassify = []
//
//
if (oldVal.includes('ALL_SELECT') && val.includes('ALL_SELECT')) {
const index = val.indexOf('ALL_SELECT')
val.splice(index, 1) //
this.searchClassify = val
}
//
if (!oldVal.includes('ALL_SELECT') && !val.includes('ALL_SELECT')) {
if (val.length === allValues.length - 1) this.searchClassify = ['ALL_SELECT'].concat(val)
}
//
this.oldSearchClassify[0] = this.searchClassify
},
// -
selectName(vId) {
this.classifyForm.id = vId.id
this.classifyForm.class_name = vId.class_name
},
// - /
addEditClassify(index) {
this.addDialogVisible = true
if (index == 1) {
this.layerTitle = '编辑'
this.isAddEdit = 1
this.tabItem = this.$refs.ThemeGalleryList.tabItem
this.activeIndex = this.$refs.ThemeGalleryList.activeIndex
this.classifyForm.class_name = this.tabItem[this.activeIndex].class_name
this.classifyForm.id = this.tabItem[this.activeIndex].id
//
this.isAllSelect = []
for (const item of this.organOptions) {
this.isAllSelect.push(item.id)
}
const params = {
theme_class_id: this.classifyForm.id
}
FetchFindThemeClassDetails(params).then(res => {
if (res.code == 200) {
if (res.data.is_all) {
this.searchClassify = this.isAllSelect
} else {
this.searchClassify.push(res.data.orgs)
}
}
})
} else {
this.layerTitle = '新增'
this.isAddEdit = 0
this.classifyForm.id = null
this.classifyForm.class_name = ''
}
},
// / - -
submitForm(formName) {
this.classifyForm.is_all = !!this.searchClassify.includes('ALL_SELECT')
this.classifyForm.orga_ids = this.searchClassify.includes('ALL_SELECT') ? [] : this.searchClassify
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.searchClassify.length == 0) {
this.$message.error('请选择所属机构!')
return false
}
FetchAddOrEdit(this.classifyForm).then(res => {
if (res.code == 200) {
this.$message({
type: 'success',
message: this.classifyForm.id ? '编辑成功' : '新增成功'
})
this.addDialogVisible = false
this.searchClassify = []
this.$refs.ThemeGalleryList.getThemeClassList()
}
})
} else {
console.log('error submit!!')
return false
}
})
},
// - btn
resetForm(formName) {
this.addDialogVisible = false
this.uploadDialogVisible = false
this.searchClassify = []
//
this.selectClassifyList = []
this.uploadForm.device_direction = 0
this.uploadForm.deposit_url = null
this.formatType = -1
this.uploadForm.material_type = null
this.uploadForm.img_path = null
this.materialImgPath = null
this.$nextTick(() => {
if (this.$refs.uploadMaterial) {
this.$refs.uploadMaterial.filePercent = 0
}
if (this.$refs.childUpload) {
this.$refs.childUpload.imageUrl = null
}
})
this.$refs[formName].resetFields()
},
// list - btn
multiSelectBtn() {
this.isMultiSelected = !this.isMultiSelected
if (this.isMultiSelected) {
this.mulitText = '取消'
} else {
this.mulitText = '多选'
}
},
// -
uploadTheme() {
this.isEditTheme = false
this.$nextTick(() => {
this.tabItem = this.$refs.ThemeGalleryList.tabItem
})
this.uploadDialogVisible = true
this.isUploadThemeType = 0
this.uploadTitle = '新增'
this.uploadForm.device_direction = 0
},
// -
editUploadTheme(row) {
this.isEditTheme = true
this.uploadDialogVisible = true
this.isUploadThemeType = 1
this.uploadTitle = '编辑'
this.$nextTick(() => {
this.tabItem = this.$refs.ThemeGalleryList.tabItem
const classifyListName = row.classes.split(',')
if (classifyListName) {
this.selectClassifyList = []
this.tabItem.filter(item => {
if (classifyListName.indexOf(item.class_name) != -1) {
this.selectClassifyList.push(item.id)
}
})
}
})
this.uploadForm.device_direction = row.device_direction
this.uploadForm.material_name = row.material_name
this.fileNames = row.material_name
this.uploadForm.deposit_url = row.deposit_url
this.formatType = row.material_type
if (this.formatType != 0) {
this.$nextTick(() => {
if (this.$refs.childUpload) {
this.$refs.childUpload.imageUrl = row.img_path
}
})
} else {
this.uploadForm.img_path = row.deposit_url
}
this.uploadForm.material_type = this.formatType
this.uploadForm.duration = row.duration
this.uploadForm.file_size = row.file_size
this.uploadForm.material_id = row.material_id
},
// - info
saveMaterial() {
const formatType = this.$refs.uploadMaterial.formatType
const uploadFileUrl = this.$refs.uploadMaterial.uploadFileUrl
//
const duration = this.$refs.uploadMaterial.duration
switch (formatType) {
case 'image':
this.formatType = 0
this.materialImgPath = uploadFileUrl
this.materialDuration = 0
break
case 'video':
this.formatType = 1
this.materialDuration = duration
this.materialImgPath = null
break
case 'audio':
this.formatType = 2
this.materialDuration = duration
this.materialImgPath = null
break
}
this.uploadForm.deposit_url = uploadFileUrl
this.fileNames = this.$refs.uploadMaterial.fileNames
this.uploadForm.material_name = this.$refs.uploadMaterial.fileNames
this.uploadForm.material_type = this.formatType
this.uploadForm.file_size = this.$refs.uploadMaterial.fileSize
this.uploadForm.img_path = this.materialImgPath
this.uploadForm.duration = this.materialDuration
},
// - btn
uploadSubmit(formName) {
if (this.isEditTheme) {
this.$nextTick(() => {
if (this.$refs.childUpload) {
this.uploadForm.img_path = this.$refs.childUpload.imageUrl
}
})
}
this.uploadForm.class_ids = this.selectClassifyList
if (this.uploadForm.class_ids.length == 0) {
this.$message.error('请选择类别名称')
return
} else if (!this.uploadForm.device_direction) {
this.$message.error('请选择设备方向')
return
} else if (!this.uploadForm.deposit_url) {
this.$message.error('请上传资源内容')
return
} else if (!this.uploadForm.material_name) {
this.$message.error('请输入文件名称')
return
}
// this.uploadForm.orga_id = this.orga_id
this.uploadForm.store_type = 2
setTimeout(() => {
saveMaterial(this.uploadForm).then(res => {
if (res.code === 200) {
this.$message({
message: '上传素材成功',
type: 'success'
})
this.uploadDialogVisible = false
this.getThemeHistoryList()
this.$refs.ThemeGalleryList.getThemeGallery()
//
this.selectClassifyList = []
this.uploadForm.device_direction = 0
this.uploadForm.deposit_url = null
this.formatType = -1
this.uploadForm.material_type = null
this.uploadForm.img_path = null
this.materialImgPath = null
this.$nextTick(() => {
if (this.$refs.uploadMaterial) {
this.$refs.uploadMaterial.filePercent = 0
}
if (this.$refs.childUpload) {
this.$refs.childUpload.imageUrl = null
}
})
this.$refs.uploadForm.resetFields()
} else {
this.$message.error(res.msg)
}
})
}, 200)
},
// list -
getThemeHistoryList(pager = 1) {
this.page = pager
let start_time = ''
let end_time = ''
if (this.queryForm.date) {
start_time = this.queryForm.date[0]
end_time = this.queryForm.date[1]
} else {
start_time = end_time = null
}
const params = {
theme_name: this.queryForm.name,
theme_class: null,
device_direction: null,
orga_id: null,
start_time: start_time,
end_time: end_time,
folder_id: null,
page: this.page,
size: this.size
}
FetchThemeHistoryList(params).then(res => {
if (res.code === 200) {
this.uploadHistoryListData = res.data.content
this.total = res.data.totalElements
} else {
this.$message.error(res.msg)
}
})
},
//
handleSizeChange(size) {
//
this.size = size
this.getThemeHistoryList()
},
// -/
isStopHandle(row) {
row.is_state = row.is_state == 1 ? 2 : 1
const params = {
id: row.material_id,
state: row.is_state
}
FetchUpdateThemeState(params).then(res => {
if (res.code == 200) {
this.$message.success(res.msg)
this.getThemeHistoryList()
} else {
this.$message.error(res.msg)
}
})
},
//
changedMultiSelected() {
if (this.isMultiSelected) {
this.isMultiSelected = false
this.mulitText = '多选'
}
}
}
}
</script>
<style lang="scss" scoped>
.theme_main {
position: relative;
padding: 0;
background: none;
::v-deep .el-tabs {
height: 55px;
padding: 0 24px;
margin-bottom: 24px;
line-height: 55px;
background: #fff;
}
::v-deep .el-tabs__nav-wrap::after {
display: none;
}
::v-deep .el-tabs__active-bar {
display: none;
}
::v-deep .theme_item_tab {
margin-bottom: 0;
.el-tabs__header {
margin-bottom: 0;
border-bottom: 1px solid #eee;
}
}
::v-deep .theme_img {
align-content: flex-start;
height: calc(100vh - 246px);
padding: 18px 24px 0 24px;
overflow-y: auto;
background: #fff;
}
.material_btn {
top: 93px;
}
}
.upload_layer {
.query_history {
display: flex;
margin-top: -16px;
}
::v-deep .el-dialog__body {
.el-form-item__label {
height: 30px;
line-height: 30px;
}
.el-input__inner {
height: 30px;
line-height: 30px;
}
.el-range-separator {
line-height: 26px;
}
.el-checkbox__label {
line-height: 30px;
}
}
}
.upload_source {
::v-deep .el-form-item__content{
display: flex;
}
.source_cont{
margin-right: 20px;
p{
font-size: 12px;
padding: 0 10px;
line-height: 32px;
}
}
video{
display: block;
}
audio{
display: block;
}
img{
display: block;
}
}
::v-deep .components_upload{
display: flex;
flex-direction: column;
justify-content: center;
align-content: center;
text-align: center;
width: 128px;
height: 120px;
font-size: 14px;
border: 1px dashed #dcdde3;
background: #f2f7ff;
border-radius: 6px;
.cont_upload_btn{
display: block;
width: 100px;
height: 34px;
font-size: 14px;
left: 50%;
top: 14px;
margin-left: -50px;
}
#upFile{
margin: 0 auto;
}
.start_upload{
display: block;
width: 100px;
height: 34px;
color: #fff;
text-align: center;
border: none;
background: linear-gradient(to right, #fc8c6f, #fa544e);
border-radius: 34px;
margin: 10px auto;
}
}
.tag_list{
::v-deep .el-tag{
margin: 0 5px 5px 0;
}
}
</style>

530
src/views/device/config/index.vue

@ -0,0 +1,530 @@
<template>
<div class="app-container">
<!-- 搜索栏 -->
<div class="head-container">
<el-row type="flex">
<el-col :span="20" class="col_flex">
<div class="form_item">
<span>设备ID:</span>
<el-input v-model="queryInfo.device_id" clearable size="small" placeholder="请输入设备ID" style="width: 200px" class="filter-item" @keyup.enter.native="getStartUpList" @blur="getStartUpList" />
</div>
<div class="form_item">
<span>设备名称</span>
<el-input v-model="queryInfo.device_name" clearable size="small" placeholder="请输入设备名称" style="width: 200px" class="filter-item" @keyup.enter.native="getStartUpList" @blur="getStartUpList" />
</div>
</el-col>
<el-col class="page_add" :span="4">
<el-button class="table_add clear_btn" plain :disabled="clearBtnDisabled" @click="removeStartUp(sels)">清空</el-button>
</el-col>
</el-row>
</div>
<!-- 配置开关机列表 -->
<el-row :gutter="15">
<el-col>
<el-table style="width: 100%;" :data="startUpList" :header-cell-style="{ background: '#3a8aeb', color: '#fff' }" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column prop="device_id" label="设备ID" align="center" />
<el-table-column prop="device_account" label="设备账号" align="center" width="150" />
<el-table-column prop="device_name" label="设备名称" align="center" />
<el-table-column label="设备方向" align="center">
<template slot-scope="{row}">
<div>{{ row.device_direction==1? '竖屏' : '横屏' }}</div>
</template>
</el-table-column>
<el-table-column prop="period" label="配置周期" align="center" width="300">
<template slot-scope="{row}">
<div v-show="row.open_setting">{{ row.open_setting==1? '每天 - 开机 '+row.open_time :'每周'+setWeekly(row.open_weekly)+'开机'+row.open_time }}</div>
<div v-show="row.open_setting">{{ row.close_setting==1?'每天 - 关机'+row.close_time :'每周'+setWeekly(row.close_weekly)+'关机'+row.close_time }}</div>
</template>
</el-table-column>
<el-table-column label="启动画面" align="center">
<template slot-scope="{row}">
<el-image v-show="row.startup_screen" class="cover_img" :src="row.startup_screen" />
</template>
</el-table-column>
<el-table-column prop="update_time" label="创建时间" align="center" width="200">
<template slot-scope="{row}">
<div>{{ row.update_time | parseTime }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="120">
<template slot-scope="scope">
<el-button type="primary" class="edit_btn" @click="editFormData(scope.row)">编辑</el-button>
<el-button type="info" class="record_btn">记录</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top: 20px;" background :current-page="queryInfo.page" :total="total" :page-size="queryInfo.size" :pager-count="7" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getStartUpList" @size-change="handleSizeChange" />
</el-col>
</el-row>
<!-- 编辑设备 -->
<div class="layer device_layer">
<el-dialog title="编辑" :close-on-click-modal="false" :show-close="false" :visible.sync="addFromVisible" width="880px">
<el-form ref="form" :model="form">
<div class="setting_item">
<h4>开机时间</h4>
<div class="setting_cont">
<span>设置时间</span>
<div>
<el-form-item
prop="open_setting"
:rules="[
{ required: true, message: '请选择开机时间', trigger: 'change' },
]"
:class="{'no_margin': form.open_setting === 2}"
>
<el-radio-group v-model="form.open_setting" @change="clearCheckbox()">
<el-radio :label="1" value="everyday">每天</el-radio>
<el-radio :label="2" value="weekly">每周</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.open_setting === 2"
:class="{'weekly_margin': form.open_setting === 2}"
prop="open_weekly"
:rules="[
{ required: true, message: '请选择每周开机时间', trigger: 'change' },
]"
>
<el-checkbox-group v-model="selectOpenWeekly">
<el-checkbox v-for="item in weeklyList" :key="item.id" :label="item.id" :value="item.id" name="type">{{ item.name }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item
prop="open_time"
:rules="[
{type: 'string', required: true, message: '请选择具体开机时间', trigger: 'change' },
]"
>
<el-time-picker
v-model="form.open_time"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59'
}"
placeholder="任意时间点"
value-format="HH:mm:ss"
/>
</el-form-item>
</div>
</div>
</div>
<div class="setting_item">
<h4>关机时间</h4>
<div class="setting_cont">
<span>设置时间</span>
<div>
<el-form-item
prop="close_setting"
:rules="[
{required: true, message: '请选择关机时间', trigger: 'change' },
]"
:class="{'no_margin': form.close_setting === 2}"
>
<el-radio-group v-model="form.close_setting" @change="clearCheckbox()">
<el-radio :label="1" value="everyday">每天</el-radio>
<el-radio :label="2" value="weekly">每周</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.close_setting === 2"
:class="{'weekly_margin': form.close_setting === 2}"
prop="close_weekly"
:rules="[
{ required: true, message: '请选择每周关机时间', trigger: 'change' },
]"
>
<el-checkbox-group v-model="selectCloseweekly">
<el-checkbox v-for="item in weeklyList" :key="item.id" :label="item.id" :value="item.id" name="type">{{ item.name }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item
prop="close_time"
:rules="[
{type: 'string', required: true, message: '请选择具体关机时间', trigger: 'change' },
]"
>
<el-time-picker
v-model="form.close_time"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59'
}"
placeholder="任意时间点"
value-format="HH:mm:ss"
/>
</el-form-item>
</div>
</div>
</div>
<div class="setting_item">
<h4>设备方向</h4>
<div class="setting_cont">
<span>设备方向</span>
<el-form-item
prop="device_direction_name"
:rules="[
{ required: true, message: '请选择具体设备方向', trigger: 'change' },
]"
>
<el-select v-model="form.device_direction_name" size="small" class="filter-item" value-key="name" @change="selectDirection">
<el-option v-for="item in deviceData" :key="item.key" :label="item.name" :value="item" />
</el-select>
</el-form-item>
</div>
</div>
<div class="setting_item">
<h4>启动画面</h4>
<!-- action="https://jsonplaceholder.typicode.com/posts/" -->
<div class="setting_cont upload_img">
<el-form-item prop="startup_screen">
<UploadCover ref="childUpload" />
</el-form-item>
</div>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="submitForm('form')"> </el-button>
<el-button round @click="resetForm('form')"> </el-button>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import UploadCover from '../../components/upload_cover.vue'
import { reqStartUpList, reqEditStartUp, reqClearStartUp } from '@/api/device/startUpList.js'
import { parseTime } from '@/utils/index.js'
export default {
name: 'DeviceConfig',
components: { UploadCover },
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
data() {
return {
query: {
blurry: ''
},
//
queryInfo: {
device_id: '',
device_name: '',
is_state: '',
page: 1,
size: 10
},
total: 0,
//
startUpList: [],
form: {
device_direction: null,
device_direction_name: null,
device_id: '',
open_setting: null, //
close_setting: null, //
open_time: '', //
close_time: '', //
startup_screen: '', //
open_weekly: [],
close_weekly: []
},
selectOpenWeekly: [], //
selectCloseweekly: [], //
addFromVisible: false,
//
sels: [],
clearBtnDisabled: true,
deviceData: [{ key: '1', name: '竖屏' }, { key: '2', name: '横屏' }],
weeklyList: [
{
id: '0',
name: '周日'
},
{
id: '1',
name: '周一'
},
{
id: '2',
name: '周二'
},
{
id: '3',
name: '周三'
},
{
id: '4',
name: '周四'
},
{
id: '5',
name: '周五'
},
{
id: '6',
name: '周六'
}
]
}
},
computed: {
//
setWeekly() {
const a = {
0: '日',
1: '一',
2: '二',
3: '三',
4: '四',
5: '五',
6: '六'
}
return function(str) {
if (str) {
return str.split(',').map(i => a[i]).join('/')
}
}
}
},
watch: {},
mounted() {
this.getStartUpList()
},
methods: {
//
getStartUpList() {
// this.queryInfo.page = pager
const params = this.queryInfo
reqStartUpList(params).then(res => {
if (res.code == 200) {
this.startUpList = res.data.content
this.total = res.data.totalElements
this.queryInfo.size = res.data.size
} else {
return this.$message.error('获取设备列表失败!')
}
})
},
//
editFormData(row) {
this.addFromVisible = true
this.form.device_id = row.device_id
this.form.open_setting = row.open_setting
this.form.close_setting = row.close_setting
this.form.open_time = row.open_time
this.form.close_time = row.close_time
this.form.startup_screen = row.startup_screen
this.form.open_weekly = row.open_weekly
if (row.open_weekly) {
this.selectOpenWeekly = row.open_weekly.split(',')
}
this.form.close_weekly = row.close_weekly
if (row.close_weekly) {
this.selectCloseweekly = row.close_weekly.split(',')
}
this.form.device_direction_name = row.device_direction == 1 ? '竖屏' : '横屏'
this.form.device_direction = row.device_direction
this.$nextTick(() => {
this.$refs.childUpload.imageUrl = this.form.startup_screen
})
},
// /
clearCheckbox() {
if (this.form.open_setting === 1) {
this.open_weekly = []
this.form.open_weekly = null
}
if (this.form.close_setting === 1) {
this.close_weekly = []
this.form.close_weekly = null
}
},
//
selectDirection(selVal) {
console.log(selVal)
this.form.device_direction = selVal.key
this.form.device_direction_name = selVal.name
},
//
resetForm(formName) {
this.addFromVisible = false
this.$refs[formName].resetFields()
},
//
submitForm(formName) {
this.form.startup_screen = this.$refs.childUpload.imageUrl
if (this.form.open_setting === 2) {
this.form.open_weekly = this.selectOpenWeekly.join(',')
}
if (this.form.close_setting === 2) {
this.form.close_weekly = this.selectCloseweekly.join(',')
}
this.$refs[formName].validate(valid => {
if (valid) {
const params = {
close_setting: this.form.close_setting,
close_time: this.form.close_time,
close_weekly: this.form.close_weekly,
device_id: this.form.device_id,
open_setting: this.form.open_setting,
open_time: this.form.open_time,
open_weekly: this.form.open_weekly,
device_direction: this.form.device_direction,
startup_screen: this.form.startup_screen
}
console.log(params)
reqEditStartUp(params).then(res => {
if (res.code == 200) {
this.$message({
type: 'success',
message: '修改设备成功'
})
this.addFromVisible = false
this.getStartUpList(this.queryInfo.page)
}
})
} else {
console.log('error submit!!')
return false
}
})
},
// - btn
//
handleSelectionChange(sels) {
this.sels = sels
if (sels.length > 0) {
this.clearBtnDisabled = false
} else {
this.clearBtnDisabled = true
}
},
//
removeStartUp(rows) {
const ids = []
rows.forEach(item => {
ids.push(item.device_id)
})
// console.log(ids)
this.$confirm('确定要清空选中的配置周期和启动画面吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
ids
}
reqClearStartUp(params).then(res => {
console.log(res)
if (res.code == 200) {
this.$message({
message: '清空成功',
type: 'success'
})
this.getStartUpList(this.startUpList.length > 1 ? this.queryInfo.page : this.queryInfo.page - 1)
}
}).catch(() => {
this.$message({
message: '清空失败',
type: 'info'
})
})
})
},
//
handleSizeChange(size) {
//
this.queryInfo.size = size
this.getStartUpList()
}
}
}
</script>
<style lang="scss" scoped>
.setting_btn {
margin-right: 10px;
}
.clear_btn {
color: #3a8aeb;
border-color: #3a8aeb;
}
.cover_img {
width: 65px;
}
.device_layer {
::v-deep .el-dialog__body {
padding: 0 20px;
}
.setting_item {
padding-top: 24px;
color: #333;
h4 {
font-size: 16px;
margin-bottom: 10px;
}
.setting_cont {
display: flex;
span {
display: block;
width: 80px;
line-height: 32px;
}
.no_margin {
margin: 0;
}
.weekly_margin {
margin-bottom: 6px;
::v-deep .el-form-item__error {
top: 70%;
}
}
::v-deep .el-form-item--small.el-form-item:last-child {
margin: 0;
}
::v-deep .el-radio-group {
display: block;
// line-height: 32px;
.el-radio {
line-height: 32px;
}
}
}
.upload_img {
padding-left: 82px;
}
}
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

363
src/views/device/list/index.vue

@ -0,0 +1,363 @@
<template>
<div class="app-container">
<!-- 搜索栏 -->
<div class="head-container">
<el-row type="flex">
<el-col :span="20" class="col_flex">
<div class="form_item">
<span>状态</span>
<el-select v-model="query.state" size="small" class="filter-item" style="width: 120px">
<el-option v-for="item in stateData" :key="item.key" :label="item.name" :value="item.key" />
</el-select>
</div>
<div class="form_item">
<span>设备ID</span>
<el-input v-model="queryInfo.device_id" clearable size="small" placeholder="请输入设备ID" style="width: 200px" class="filter-item" @clear="getDevice" @blur="queryDevice(queryInfo.device_id)" @keyup.enter.native="queryDevice(queryInfo.device_id)" />
</div>
<div class="form_item">
<span>设备名称</span>
<el-input v-model="queryInfo.device_name" clearable size="small" placeholder="请输入设备名称" style="width: 200px" class="filter-item" @clear="getDevice" @blur="getDevice" @keyup.enter.native="getDevice" />
</div>
</el-col>
<el-col class="page_add" :span="4">
<el-button class="table_add clear_btn" plain disabled>清空</el-button>
</el-col>
</el-row>
</div>
<!-- table :data="deviceList"-->
<el-row :gutter="15">
<el-col>
<el-table style="width: 100%;" :data="deviceList" :header-cell-style="{ background: '#3a8aeb', color: '#fff' }">
<el-table-column type="selection" width="55" />
<el-table-column prop="device_id" label="设备ID" align="center" />
<el-table-column prop="device_account" label="设备账号" align="center" />
<el-table-column prop="device_name" label="设备名称" align="center" />
<el-table-column label="设备方向" align="center">
<template slot-scope="{row}">
<div>{{ row.device_direction==1? '竖屏' : '横屏' }}</div>
</template>
</el-table-column>
<el-table-column prop="organ_name" label="所属机构" align="center" /> >
<el-table-column prop="isDel" label="设备状态" align="center">
<template slot-scope="scope">
<div>{{ scope.row.isDel ? '在线' : '离线' }}</div>
</template>
</el-table-column>
<el-table-column prop="content" label="发布内容" align="center">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handleClick(scope.row)">查看</el-button>
</template>
</el-table-column>
<el-table-column prop="update_time" label="创建时间" align="center" width="160">
<template slot-scope="{row}">
<div>{{ row.update_time | parseTime }}</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="160">
<template slot-scope="scope">
<el-button type="primary" class="edit_btn" @click="editFormData(scope.row)">编辑</el-button>
<el-button type="danger" class="record_btn" @click="recordData(scope.$index, scope.row)">记录</el-button>
<el-button type="danger" @click="removeDevice(scope.row)">解绑</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
<el-pagination style="margin-top: 20px;" background :current-page="queryInfo.page" :total="total" :page-size="queryInfo.size" :pager-count="7" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getDevice" @size-change="handleSizeChange" />
<!-- 编辑设备 -->
<div class="layer">
<el-dialog :title="dialogTitle" :close-on-click-modal="false" :show-close="false" :visible.sync="addFromVisible" width="576px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="设备账号" prop="account">
<el-input v-model="form.account" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="设备方向" prop="orientation_name">
<el-select v-model="form.orientation_name" size="small" class="filter-item" @change="selectDirection">
<el-option v-for="item in deviceData" :key="item.key" :label="item.name" :value="item" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="submitForm('form')"> </el-button>
<el-button round @click="addFromVisible = false"> </el-button>
</div>
</el-dialog>
</div>
<div class="publish_layer">
<el-dialog title="发布内容" :close-on-click-modal="false" :visible.sync="contentVisible" width="970px" height="590px">
<div class="content_warp">
<div v-for="(items,index) in contentDevice" :key="index" class="release_list">
<h4>发布名称 {{ items.relaase_name }} </h4>
<p style="margin-bottom: 10px"> 发布时间 {{ items.release_start.split("00:00:00")[0] }} </p>
<div class="device_cont_list">
<!-- <div v-if="items.bgm_main != null && items.bgm_name != null" class="material_item item_cont">
<div class="radio_img"></div>
<div class="file_name">{{ items.bgm_name }}</div>
</div> -->
<div v-for="(item, i) in items.show_materials" :key="'list-'+i" class="material_item item_cont">
<div class="img_box">
<img v-if="item.img_path || item.material_type == 1" :src="item.img_path" alt />
</div>
<div v-if="!item.img_path && item.material_type == 2" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ item.deposit_url | getFileFormat }}</span>
<!-- <span v-if="item.material_type !== '0'" class="item_time">{{ item.duration | getSeconds }}</span> -->
</div>
<div class="file_name">{{ item.material_name }}</div>
<div v-if="item.bgm_name && item.material_type == 0" class="bgm_name">背景音乐:{{ item.bgm_name }}</div>
</div>
</div>
</div>
</div>
</el-dialog>
</div>
<!-- 记录 -->
<el-dialog append-to-body :close-on-click-modal="false" :visible.sync="recordVisible" title="记录" class="record_layer" width="750px">
<el-table :data="recordData">
<el-table-column property="name" label="操作人" />
<el-table-column property="permissionType" label="角色权限" />
<el-table-column property="account" label="登录账号" />
<el-table-column property="type" label="操作类型" />
<el-table-column property="date" label="操作时间" />
</el-table>
</el-dialog>
</div>
</template>
<script>
import { ReqDeviceEdit, ReqDeviceList, ReqQueryDevice, ReqRemoveDevice, FetchFindReleaseDetailsByDeviceId } from '@/api/device/deviceList.js'
import { parseTime, getSeconds, getFileFormat } from '@/utils/index.js'
export default {
name: 'Device',
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
},
getSeconds(s) {
return getSeconds(s)
},
getFileFormat(s) {
return getFileFormat(s)
}
},
data() {
return {
queryInfo: {
device_id: '',
device_name: '',
is_state: '',
page: 1,
size: 10
},
total: 0,
// device_id:'',
dialogTitle: '',
//
addFromVisible: false,
contentVisible: false,
contentDevice: [],
recordVisible: false,
//
deviceList: [],
stateData: [{ key: '0', name: '全部' }, { key: '1', name: '在线' }, { key: '2', name: '离线' }],
deviceData: [{ key: '1', name: '竖屏' }, { key: '2', name: '横屏' }],
query: {
state: null
},
//
form: {
account: null,
name: null,
orientation_name: null,
orientation: null,
device_id: '',
orga_id: '1310000'
},
rules: {
name: [{ required: true, message: '请输入设备名称', trigger: 'blur' }, { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }],
orientation: [{ required: true, message: '请选择设备方向', trigger: 'change' }]
}
}
},
watch: {},
mounted() {
this.getDevice()
},
methods: {
//
getDevice() {
// this.queryInfo.page = pager
const params = this.queryInfo
ReqDeviceList(params).then(res => {
console.log(res)
if (res.code == 200) {
this.deviceList = res.data.content
this.total = res.data.totalElements
this.queryInfo.size = res.data.size
} else {
return this.$message.error('获取设备列表失败!')
}
})
},
//
editFormData(row) {
this.addFromVisible = true
this.form.account = row.device_account
this.form.name = row.device_name
this.form.orientation_name = row.device_direction == 1 ? '竖屏' : '横屏'
this.form.orientation = row.device_direction
this.form.device_id = row.device_id
},
//
selectDirection(selVal) {
console.log(selVal)
this.form.orientation = selVal.key
this.form.orientation_name = selVal.name
},
//
removeDevice(row) {
// console.log(row.device_id)
this.$confirm(`你确定解绑${row.device_name}?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
id: row.device_id
}
ReqRemoveDevice(params).then(res => {
if (res.code === 200) {
this.$message({
message: '解绑成功',
type: 'success'
})
//
this.getDevice(this.deviceList.length > 1 ? this.queryInfo.page : this.queryInfo.page - 1)
}
})
}).catch(() => {
this.$message({
message: '已取消解绑',
type: 'info'
})
})
},
recordData(index, row) {
this.recordVisible = true
},
//
handleClick(row) {
console.log(row)
this.contentVisible = true
const params = {
device_id: row.device_id
}
FetchFindReleaseDetailsByDeviceId(params).then(res => {
if (res.code === 200) {
console.log(res)
this.contentDevice = res.data
}
})
},
//
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
const params = {
account: this.form.account,
device_name: this.form.name,
device_direction: this.form.orientation,
device_id: this.form.device_id,
orga_id: '13000'
}
console.log(params)
ReqDeviceEdit(params).then(res => {
if (res.code == 200) {
this.$message({
type: 'success',
message: '修改设备成功'
})
}
this.addFromVisible = false
this.getDevice(this.queryInfo.page)
})
} else {
console.log('error submit!!')
return false
}
})
},
//
queryDevice(id) {
const params = {
device_id: id
}
ReqQueryDevice(params).then(res => {
console.log(res)
if (res.code == 200) {
this.getDevice()
}
})
},
//
handleSizeChange(size) {
//
this.queryInfo.size = size
this.getDevice()
}
}
}
</script>
<style lang="scss" scoped>
.clear_btn {
color: #3a8aeb;
border-color: #3a8aeb;
}
.publish_layer {
::v-deep .el-dialog__body {
padding: 0 20px 30px 20px;
height: 590px;
overflow-y: auto;
}
}
.content_warp {
padding-top: 16px;
h4 {
margin: 6px 0 16px 0;
font-size: 16px;
color: #333;
}
}
.release_list{
margin-bottom: 40px;
}
.device_cont_list{
display: flex;
flex-wrap: wrap;
.item_cont{
overflow: inherit;
}
.bgm_name{
font-size: 12px;
padding: 10px 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
text-overflow: ellipsis;
-moz-user-select: none; /*火狐*/
-webkit-user-select: none; /*webkit浏览器*/
-ms-user-select: none; /*IE10*/
-khtml-user-select: none; /*早期浏览器*/
user-select: none;
}
}
</style>

6
src/views/login.vue

@ -81,13 +81,14 @@ export default {
callback()
}
}
// 15902734788
return {
Background: Background,
codeUrl: '',
cookiePass: '',
loginForm: {
username: '15902734788',
phone: '15902734788',
username: '',
phone: '',
password: '',
rememberMe: false,
code: '',
@ -148,6 +149,7 @@ export default {
this.$router.push(`/forgetPassword`)
},
handleLogin() {
this.loginForm.username = this.loginForm.phone
this.$refs.loginForm.validate(valid => {
const user = {
username: this.loginForm.username,

31
src/views/system/user/index.vue

@ -1,5 +1,6 @@
<template>
<div class="app-container">
fff
<!--工具栏-->
<div class="head-container">
<el-row type="flex">
@ -8,7 +9,7 @@
<div class="form_item">
<span>角色名称</span>
<el-input
v-model="query.blurry"
v-model="blurry"
clearable
size="small"
placeholder="角色名称"
@ -20,7 +21,7 @@
<div class="form_item">
<span>管理员名称</span>
<el-input
v-model="query.blurry"
v-model="blurry"
clearable
size="small"
placeholder="管理员名称"
@ -188,28 +189,28 @@
</template>
<script>
import crudUser from '@/api/system/user'
// import crudUser from '@/api/system/user'
import { isvalidPhone } from '@/utils/validate'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
// import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
// import crudOperation from '@crud/CRUD.operation'
// import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import { mapGetters } from 'vuex'
const defaultForm = {
id: null,
account: null,
nickName: '',
roles: null,
enabled: ''
}
// const defaultForm = {
// id: null,
// account: null,
// nickName: '',
// roles: null,
// enabled: ''
// }
export default {
name: 'User',
components: { rrOperation, pagination },
cruds() {
return CRUD({ title: '用户', url: 'api/users', crudMethod: { ...crudUser }})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
// cruds() {
// return CRUD({ title: '', url: 'api/users', crudMethod: { ...crudUser }})
// },
// mixins: [presenter(), header(), form(defaultForm), crud()],
//
data() {
//

399
src/views/user/menu1.vue

@ -0,0 +1,399 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<el-row type="flex">
<el-col :span="20" class="col_flex">
<!-- 搜索 -->
<div class="form_item">
<span>角色名称</span>
<el-input
v-model="query.role_name"
clearable
size="small"
placeholder="角色名称"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="getUserList(page,query.role_name)"
@clear="getUserList(page,query.role_name)"
/>
</div>
<div class="form_item">
<span>管理员名称</span>
<el-input
v-model="query.nickName"
clearable
size="small"
placeholder="管理员名称"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="getUserList(page,query.nickName)"
@clear="getUserList(page,query.nickName)"
/>
</div>
</el-col>
<el-col class="page_add" :span="4">
<el-button class="table_add" type="primary" round @click="addDialogVisible = true">新增</el-button>
</el-col>
</el-row>
</div>
<!--新增用户-->
<el-dialog
append-to-body
:close-on-click-modal="false"
:show-close="false"
:visible.sync="addDialogVisible"
title="新增"
width="576px"
>
<el-form ref="form" :inline="true" :model="form" size="small" label-width="100px">
<el-form-item
label="手机号"
prop="account"
:rules="[
{ required: true, message: '请输入手机号', trigger: 'blur' }
]"
>
<el-input v-model="form.account" style="width: 336px" />
</el-form-item>
<el-form-item
label="管理员名称"
prop="nickName"
:rules="[
{ required: true, message: '请输入管理员名称', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
]"
>
<el-input v-model="form.nickName" style="width: 336px" />
</el-form-item>
<el-form-item
label="管理员角色"
prop="roles"
:rules="[
{ required: true, message: '请选择管理员角色', trigger: 'change' }
]"
>
<el-select v-model="form.roles" placeholder="请选择管理员角色" style="width: 336px">
<el-option label="机构超级管理员" value="1" />
<el-option label="普通用户" value="2" />
</el-select>
</el-form-item>
<el-form-item
label="管理员状态"
prop="enabled"
:rules="[
{ required: true, trigger: 'change', message: '请选择管理员状态' }
]"
>
<el-select v-model="form.enabled" placeholder="请选择管理员状态" style="width: 336px">
<el-option label="启用" value="1" />
<el-option label="关闭" value="0" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round>保存</el-button>
<el-button round @click="addDialogVisible=false">关闭</el-button>
</div>
</el-dialog>
<!-- 编辑用户 -->
<el-dialog
append-to-body
:close-on-click-modal="false"
:show-close="false"
:visible.sync="editDialogVisible"
title="编辑"
width="576px"
>
<el-form
ref="form"
:inline="true"
:model="editForm"
:rules="rules"
size="small"
label-width="100px"
>
<el-form-item label="管理员名称" prop="nickName">
<el-input v-model="editForm.nickName" style="width: 336px" />
</el-form-item>
<el-form-item label="管理员角色" prop="roles">
<el-input v-model="editForm.roles" disabled style="width: 336px" />
</el-form-item>
<el-form-item label="机构名称" prop="orgName">
<el-input v-model="editForm.orgName" disabled style="width: 336px" />
</el-form-item>
<el-form-item label="更改手机号" prop="phone">
<el-input v-model.number="editForm.phone" style="width: 336px" />
</el-form-item>
<el-form-item label="验证码" prop="code" class="auth_code">
<el-input v-model.number="editForm.code" style="width: 336px" />
<div class="login-code">
<span @click="countdown()">{{ verification }}</span>
</div>
</el-form-item>
<el-form-item label="登录密码" prop="password">
<el-input v-model="editForm.password" style="width: 336px" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round>保存</el-button>
<el-button round @click="editDialogVisible=false">关闭</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-row :gutter="15">
<el-col>
<el-table
ref="table"
:data="userList"
:header-cell-style="{ background: '#3a8aeb', color: '#fff' }"
style="width: 100%;"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="username" width="135" align="center" label="登录账号" />
<el-table-column prop="nickName" align="center" label="管理员名称" />
<el-table-column prop="roles" align="center" label="管理角色">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.roles" :key="index">
<div>{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="org" align="center" label="机构名称">
<template slot-scope="scope">
<div>{{ scope.row.org ? scope.row.org.name : '' }}</div>
</template>
</el-table-column>
<el-table-column prop="phone" align="center" label="手机号码" />
<el-table-column label="状态" align="center" prop="enabled">
<template slot-scope="scope">
<div>{{ scope.row.enabled ? '启用' : '关闭' }}</div>
</template>
</el-table-column>
<el-table-column prop="createTime" width="155" align="center" label="创建日期">
<template slot-scope="{row}">
<div>{{ row.createTime | parseTime }}</div>
</template>
</el-table-column>
<!-- v-if="checkPer(['admin','user:edit','user:del'])" -->
<el-table-column label="操作" width="120" align="center" fixed="right">
<template slot-scope="scope">
<!-- <udOperation
:data="scope.row"
:permission="permission"
:disabled-dle="scope.row.id === user.id"
/>-->
<el-button
type="primary"
class="edit_btn"
@click="editFormData(scope.$index, scope.row)"
>编辑</el-button>
<el-button type="danger" class="delt_btn">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination style="margin-top: 20px;" background :current-page="page" :total="total" :page-size="size" :pager-count="5" :page-sizes="[3, 5, 10]" layout="prev, pager, next, jumper,->,sizes,total" @current-change="getUserList" @size-change="handleSizeChange" />
</el-col>
</el-row>
</div>
</template>
<script>
import { FetchUserList } from '@/api/system/user'
import { FetchDropDownList } from '@/api/system/role'
import { isvalidPhone } from '@/utils/validate'
import { parseTime } from '@/utils/index.js'
import { mapGetters } from 'vuex'
export default {
name: 'User',
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
components: { },
//
data() {
//
const validPhone = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入电话号码'))
} else if (!isvalidPhone(value)) {
callback(new Error('请输入正确的11位手机号码'))
} else {
callback()
}
}
return {
userList: [],
total: 0,
page: 0,
size: 10,
addDialogVisible: false,
editDialogVisible: false,
query: {
role_name: '',
nickName: ''
},
form: {
account: null,
nickName: '',
roles: null,
enabled: ''
},
editForm: {
nickName: '',
roles: '',
orgName: '',
phone: '',
code: '',
password: ''
},
disabledSendCode: false,
verification: '获取验证码',
countNum: 60,
height: document.documentElement.clientHeight - 180 + 'px;',
permission: {
add: ['admin', 'user:add'],
edit: ['admin', 'user:edit'],
del: ['admin', 'user:del']
},
rules: {
nickName: [
{ required: true, message: '请输入管理员名称', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
],
phone: [
{ required: true, trigger: 'blur', validator: validPhone }
],
code: [
{ required: true, trigger: 'blur', message: '请输入验证码' }
],
password: [
{ required: true, trigger: 'blur', message: '请输入密码' }
]
}
}
},
computed: {
...mapGetters([
'user'
])
},
mounted: function() {
this.getUserList()
},
methods: {
//
getUserList(pager = 0, name) {
this.page = pager
const param = {
page: this.page,
size: this.size,
blurry: name
}
FetchUserList(param).then(res => {
if (res.code == 200) {
this.userList = res.data.content
this.total = res.data.totalElements
this.size = res.data.size
} else {
return this.$message.error('获取用户列表数据失败!')
}
})
},
//
handleSizeChange(size) {
//
this.size = size
this.getUserList()
},
getDropdownList() {
const param = {
}
FetchDropDownList(param).then(res => {
if (res.code == 200) {
this.userList = res.data.content
this.total = res.data.totalElements
this.size = res.data.size
} else {
return this.$message.error('获取角色下拉列表数据失败!')
}
})
},
//
editFormData(index, row) {
this.editDialogVisible = true
this.editForm.nickName = row.nickName
if (row.roles) {
row.roles.forEach(item => {
this.editForm.roles = item.name
})
}
if (row.org) {
this.editForm.orgName = row.org.name
}
this.editForm.phone = row.phone
this.editForm.enabled = row.enabled
},
//
getAuthCode() {
// const param = {
// phone: this.editForm.phone
// }
// proxy.$http
// .post(proxy.$API.SENDMSGCODE,
// param
// )
// .then(res => {
// if (res.type == 200) {
// this.countdown()
// } else {
// console.log(res.content)
// }
// })
// .catch(res => {
// console.log(res)
// })
},
countdown() {
if (this.disabledSendCode) {
return
}
if (!/^1\d{10}$/.test(this.editForm.phone)) {
this.$message.error('手机号错误,请重新输入')
return
}
this.getAuthCode()
this.disabledSendCode = true
// this.isSendAuth = true
this.countNum = 60
const timer = setInterval(() => {
this.verification = this.countNum + '重新获取'
this.countNum -= 1
if (this.countNum < 1) {
clearInterval(timer)
this.verification = '重新获取'
this.disabledSendCode = false
// this.isSendAuth = false
console.log('倒计时结束')
}
}, 1000)
},
checkboxT(row, rowIndex) {
return row.id !== this.user.id
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.el-dialog__header {
background-color: #f1f1f1;
}
.edit_code {
margin-left: 20px;
}
</style>
Loading…
Cancel
Save