no message

main
LX 2023-09-20 13:52:21 +08:00
commit fd10983400
4 changed files with 1398 additions and 0 deletions

View File

@ -0,0 +1,174 @@
                                          Table 隐藏列自动保存
页面中配置crudOperation :tableKey='tableKey'
```
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
<crudOperation :permission="permission" :tableKey='tableKey' />
```
在data 中添加 tabkeKey
```
data() {
return {
queryTypeOptions: [
{ key: 'code', display_name: '代码' },
{ key: 'name', display_name: '名称' },
{ key: 'enabled', display_name: '状态' },
{ key: 'heat', display_name: '热度' }
],
permission: {
add: ['admin', 'area:add'],
edit: ['admin', 'area:edit'],
del: ['admin', 'area:del']
},
tableKey:'api/area',
rules: {
code: [
{ required: true, message: '库区编号不能为空', trigger: 'blur' }
]
}
}
}
```
全部代码
```
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<label class="el-form-item-label">编号</label>
<el-input v-model="query.code" clearable placeholder="编号" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<label class="el-form-item-label">名称</label>
<el-input v-model="query.name" clearable placeholder="名称" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<label class="el-form-item-label">状态</label>
<el-input v-model="query.enabled" clearable placeholder="状态" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<label class="el-form-item-label">热度</label>
<el-input v-model="query.heat" clearable placeholder="热度" style="width: 185px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<rrOperation :crud="crud" />
</div>
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
<crudOperation :permission="permission" :tableKey='tableKey' />
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="库区编号" prop="code">
<el-input v-model="form.code" style="width: 370px;" />
</el-form-item>
<el-form-item label="库区名称" prop="name">
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<el-form-item label="描述">
<el-input v-model="form.description" style="width: 370px;" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="55" />
<el-table-column prop="code" label="库区编号" />
<el-table-column prop="name" label="库区名称" />
<el-table-column prop="description" label="描述" />
<el-table-column prop="enabled" label="启用">
<template slot-scope="scope">
<el-switch
v-model="scope.row.enabled"
active-color="#409EFF"
inactive-color="#F56C6C"
@change="changeEnabled(scope.row, scope.row.enabled)"
/>
</template>
</el-table-column>
<el-table-column prop="createBy" label="创建人" />
<el-table-column prop="createTime" label="创建时间" />
</el-table>
<!--分页组件-->
<div style="position:absolute;right: 0">
<pagination />
</div>
</div>
</div>
</template>
<script>
import crudArea from '@/api/area'
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 { inject } from "vue";
const defaultForm = { id: null,enabled: 1,code: null,name: null,description: null}
export default {
name: 'Area',
// eslint-disable-next-line vue/no-unused-components
components: { pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['base_staus'],
cruds() {
return CRUD({ title: '库区', url: 'api/area', idField: 'id', sort: 'id,desc', crudMethod: { ...crudArea }})
},
data() {
return {
queryTypeOptions: [
{ key: 'code', display_name: '代码' },
{ key: 'name', display_name: '名称' },
{ key: 'enabled', display_name: '状态' },
{ key: 'heat', display_name: '热度' }
],
permission: {
add: ['admin', 'area:add'],
edit: ['admin', 'area:edit'],
del: ['admin', 'area:del']
},
tableKey:'api/area',
rules: {
code: [
{ required: true, message: '库区编号不能为空', trigger: 'blur' }
]
}
}
}, mounted() {
//初始化数据
},
methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
// 改变状态
changeEnabled(data, val) {
this.$confirm('此操作将 "' + this.dict.label.base_staus[val] + '" ' + data.code + ', 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
crudArea.edit(data).then(res => {
this.crud.notify(this.dict.label.base_staus[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
}).catch(() => {
data.enabled = !data.enabled
})
}).catch(() => {
data.enabled = !data.enabled
})
}
}
}
</script>
<style scoped>
</style>
```

View File

@ -0,0 +1,524 @@
对页面 新增 修改 删除等按钮进行隐藏,添加自定义按钮
```
cruds() {
return CRUD({
title: '出库明细',
url: 'api/pickDetail',
idField: 'id',
sort: 'id,desc',
crudMethod: {...crudPickDetail},
optShow: {
add: true,
edit: false,
del: false,
reset: true,
download: true
}
})
}
```
添加自定义按钮
[:disabled="show_fp” ]()为显示状态
[@click="allocate(crud.selections)"]() 为点击时间 [crud.selections]() 选中的数据
```
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="show_fp"
@click="allocate(crud.selections)"
>
分配
</el-button>
```
```
data() {
return {
show_fp: true,
show_jh: true,
show_cancelfp:true,
radio3: '全部',
items: [],
permission: {
add: ['admin', 'pickDetail:add'],
edit: ['admin', 'pickDetail:edit'],
del: ['admin', 'pickDetail:del']
},
rules: {
item: [
{required: true, message: '物料必填', trigger: 'blur'}
]
},
queryTypeOptions: [
{key: 'itemCode', display_name: '物料编码'},
{key: 'itemName', display_name: '物料名称'},
{key: 'po', display_name: '任务号'},
{key: 'status', display_name: '状态'}
]
}
}
```
```
allocate(datas) {
this.$confirm(`选中的${datas.length}条数据分配确认?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const ids = [];
for (let i = 0; i < datas.length; i++) {
ids.push(datas[i].id)
}
crudPickDetail.allocate(ids).then(res => {
DonMessage.success('分配成功!')
this.crud.toQuery();
}).catch(() => {
})
}).catch(() => {
this.$refs.table.clearSelection()
DonMessage.info('取消成功!')
});
}
```
修改选择框选中事件 [@selection-change="selectionChangeHandlerTwo"]()
```
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small"
style="width: 100%;"
height="58vh"
@selection-change="selectionChangeHandlerTwo">
```
根据选择的数据进行判断,新加的按钮是否可用
```
selectionChangeHandlerTwo(val) {
this.crud.selections = val
if (this.crud.selections.length > 1 || this.crud.selections.length == 0) {
this.show_jh = true;
this.show_fp = true;
this.show_cancelfp=true;
}
//分配
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty > this.crud.selections[0].allocatedQty) {
this.show_jh = true;
this.show_fp = false;
}
//取消分配
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty == this.crud.selections[0].allocatedQty&&this.crud.selections[0].pickedQty==0) {
this.show_jh = true;
this.show_fp = true;
this.show_cancelfp=false;
}
//拣货
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty == this.crud.selections[0].allocatedQty) {
this.show_jh = false;
this.show_fp = true;
}
}
```
完整代码,请查看 /views/business-data/asnDetial/index
```
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<!-- 查询操作-->
<el-form ref="form" :inline="true" :model="form" label-width="70px">
<el-form-item label="物料编码">
<el-input v-model="query.itemCode" clearable placeholder="请输入物料编码" style="width: 140px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"/>
</el-form-item>
<el-form-item label="物料名称">
<el-input v-model="query.itemName" clearable placeholder="请输入物料名称" style="width: 140px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"/>
</el-form-item>
<el-form-item label="任务号">
<el-input v-model="query.po" clearable placeholder="请输入任务号" style="width: 140px;" class="filter-item"
@keyup.enter.native="crud.toQuery"/>
</el-form-item>
<rrOperation :crud="crud"/>
</el-form>
<div class="statusButton" style="border-bottom: solid lightgray 1px;">
<el-radio-group v-model="radio3" @change="clickChange" size="small">
<el-radio-button label="全部"> 全部</el-radio-button>
<el-radio-button label="打开"> 打开</el-radio-button>
<el-radio-button label="已分配">已分配</el-radio-button>
<el-radio-button label="拣货完成"> 拣货完成</el-radio-button>
</el-radio-group>
</div>
<!-- 业务操作-->
<crudOperation :permission="permission">
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="show_fp"
@click="allocate(crud.selections)"
>
分配
</el-button>
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-edit"
size="mini"
:loading="crud.delAllLoading"
:disabled="show_cancelfp"
@click="cancelAllocate(crud.selections)"
>
取消分配
</el-button>
<el-button
slot="right"
class="filter-item"
type="danger"
icon="el-icon-edit"
size="mini"
:loading="crud.delAllLoading"
:disabled="show_jh"
@click="getPickTask(crud.selections[0].id)"
>
拣货确认
</el-button>
</crudOperation>
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small"
style="width: 100%;"
height="58vh"
@selection-change="selectionChangeHandlerTwo">
<el-table-column type="selection" width="50"/>
<el-table-column
prop="date"
align="center"
label="序号"
:resizable="false"
type="index"
width="50"
/>
<el-table-column prop="po" label="任务号"/>
<el-table-column :show-overflow-tooltip="true" prop="itemName" label="物料编码">
<template slot-scope="scope">
<div>{{ scope.row.item.code }}</div>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="itemCode" label="物料名称">
<template slot-scope="scope">
<div>{{ scope.row.item.name }}</div>
</template>
</el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ dict.label.pick_status[scope.row.status] }}
</template>
</el-table-column>
<el-table-column prop="orderQty" label="订单数量"/>
<el-table-column prop="allocatedQty" label="分配数量"/>
<el-table-column prop="pickedQty" label="拣货数量"/>
<el-table-column prop="remark" label="备注"/>
<el-table-column prop="createBy" label="创建人"/>
<el-table-column prop="createTime" width="150px" label="创建时间"/>
<el-table-column v-if="checkPer(['admin','pickDetail:edit','pickDetail:del'])" label="操作" width="150px"
align="center">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
/>
</template>
</el-table-column>
</el-table>
<!--拣货确认界面-->
<PickTask ref="pickTask"/>
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0"
:title="crud.status.title" width="500px">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="物料" prop="item">
<el-select v-model="form.item" @focus="getItem" filterable placeholder="请选择物料" value-key="id"
style="width: 370px;">
<el-option
v-for="item in items"
:key="item.id"
:label="item.code"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="订单数量">
<el-input v-model="form.orderQty" style="width: 370px;"/>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" :rows="3" type="textarea" style="width: 370px;"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<!--分页组件-->
<pagination/>
</div>
</div>
</template>
<script>
import crudPickDetail, {cancelAllocate} from '@/api/pickDetail'
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 {getItems} from "@/api/item"
import DonMessage from "@/utils/message";
import PickTask from "@/views/business-data/pickDetail/pickTicketTask.vue"
const defaultForm = {
id: null,
pickId: null,
item: null,
lineNo: null,
po: null,
status: 'OPEN',
orderQty: 0,
allocatedQty: 0,
pickedQty: 0,
shippedQty: 0,
weight: 0,
volume: 0,
remark: null,
propC1: null,
propC2: null,
propC3: null,
propC4: null,
propC5: null,
propC6: null,
propD1: null,
propD2: null,
deptId: null,
sourceName: null,
sourceId: null,
createBy: null,
updateBy: null,
createTime: null,
updateTime: null
}
export default {
name: 'PickDetail',
components: {PickTask, pagination, crudOperation, rrOperation, udOperation},
mixins: [presenter(), header(), form(defaultForm), crud()],
dicts: ['pick_status'],
cruds() {
return CRUD({
title: '出库明细',
url: 'api/pickDetail',
idField: 'id',
sort: 'id,desc',
crudMethod: {...crudPickDetail},
optShow: {
add: true,
edit: false,
del: false,
reset: true,
download: true
}
})
},
data() {
return {
show_fp: true,
show_jh: true,
show_cancelfp:true,
radio3: '全部',
items: [],
permission: {
add: ['admin', 'pickDetail:add'],
edit: ['admin', 'pickDetail:edit'],
del: ['admin', 'pickDetail:del']
},
rules: {
item: [
{required: true, message: '物料必填', trigger: 'blur'}
]
},
queryTypeOptions: [
{key: 'itemCode', display_name: '物料编码'},
{key: 'itemName', display_name: '物料名称'},
{key: 'po', display_name: '任务号'},
{key: 'status', display_name: '状态'}
]
}
},
mounted() {
},
methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
getItem() {
getItems({}).then(res => {
this.items = res.content.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
selectionChangeHandlerTwo(val) {
this.crud.selections = val
if (this.crud.selections.length > 1 || this.crud.selections.length == 0) {
this.show_jh = true;
this.show_fp = true;
this.show_cancelfp=true;
}
//分配
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty > this.crud.selections[0].allocatedQty) {
this.show_jh = true;
this.show_fp = false;
}
//取消分配
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty == this.crud.selections[0].allocatedQty&&this.crud.selections[0].pickedQty==0) {
this.show_jh = true;
this.show_fp = true;
this.show_cancelfp=false;
}
//拣货
if (this.crud.selections.length == 1 && this.crud.selections[0].orderQty == this.crud.selections[0].allocatedQty) {
this.show_jh = false;
this.show_fp = true;
}
},
allocate(datas) {
this.$confirm(`选中的${datas.length}条数据分配确认?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const ids = [];
for (let i = 0; i < datas.length; i++) {
ids.push(datas[i].id)
}
crudPickDetail.allocate(ids).then(res => {
DonMessage.success('分配成功!')
this.crud.toQuery();
}).catch(() => {
})
}).catch(() => {
this.$refs.table.clearSelection()
DonMessage.info('取消成功!')
});
},
cancelAllocate(datas){
this.$confirm(`选中的${datas.length}条数据取消分配确认?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const ids = [];
for (let i = 0; i < datas.length; i++) {
ids.push(datas[i].id)
}
crudPickDetail.cancelAllocate(ids).then(res => {
DonMessage.success('取消分配成功!')
this.crud.toQuery();
}).catch(() => {
})
}).catch(() => {
this.$refs.table.clearSelection()
DonMessage.info('取消成功!')
});
},
getPickTask(id) {
this.$refs.pickTask.dialog = true
this.$refs.pickTask.queryPickTask(id)
},
shuaxin() {
this.crud.toQuery();
},
clickChange(lab) {
if (lab === "全部") {
this.crud.resetQuery();
this.crud.toQuery();
}else if(lab === "打开"){
this.query.status = 'OPEN'
this.crud.toQuery();
}else if(lab === "已分配"){
this.query.status = 'ALLOCATE'
this.crud.toQuery();
}else if(lab === "拣货完成"){
this.query.status = 'PICK_ALL'
this.crud.toQuery();
}
}
}
}
</script>
<style scoped>
</style>
```

View File

@ -0,0 +1,419 @@
# 大屏开发文档
demo下载地址 http://47.100.54.81:3000/LiuXue/Youchain_DaPinDemo.git
[Examples - Apache ECharts](https://echarts.apache.org/examples/zh/index.html)
关键代码地址:/src/router/index.js    /src/router/router.js
router.js
你需要像login 页面一样给新页面添加访问路径并配置标题浏览器顶部显示以及vue的路径
```
import Vue from 'vue'
import Router from 'vue-router'
import Layout from '../layout/index'
Vue.use(Router)
export const constantRouterMap = [
{ path: '/login',
meta: { title: '登录', noCache: true },
component: (resolve) => require(['@/views/login'], resolve),
hidden: true
},
{ path: '/home',
meta: { title: '登录', noCache: true },
component: (resolve) => require(['@/views/home'], resolve),
hidden: true
},
{ path: '/test',
meta: { title: '测试', noCache: true },
component: (resolve) => require(['@/views/app-dashboard/index'], resolve),
hidden: true
},
{ path: '/test2',
meta: { title: '测试2', noCache: true },
component: (resolve) => require(['@/views/zhongwei-daping/index'], resolve),
hidden: true
},
{
path: '/404',
component: (resolve) => require(['@/views/features/404'], resolve),
hidden: true
},
{
path: '/401',
component: (resolve) => require(['@/views/features/401'], resolve),
hidden: true
},
{
path: '/redirect',
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path*',
component: (resolve) => require(['@/views/features/redirect'], resolve)
}
]
},
{
path: '/',
component: Layout,
redirect: '/dashboard',
children: [
{
path: 'dashboard',
component: (resolve) => require(['@/views/home'], resolve),
name: 'Dashboard',
meta: { title: '首页', icon: 'index', affix: true, noCache: true }
}
]
},
{
path: '/user',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'center',
component: (resolve) => require(['@/views/system/user/center'], resolve),
name: '个人中心',
meta: { title: '个人中心' }
}
]
}
]
export default new Router({
// mode: 'hash',
mode: 'history',
scrollBehavior: () => ({ y: 0 }),
routes: constantRouterMap
})
```
index.js
whiteList 为白名单列表,你需要把 访问路径添加到白名单
import router from './routers'
import store from '@/store'
import Config from '@/settings'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css'// progress bar style
import { buildMenus } from '@/api/system/menu'
import { filterAsyncRouter } from '@/store/modules/permission'
NProgress.configure({ showSpinner: false })// NProgress Configuration
const whiteList = ['/login', '/401', '/404', '/home', '/test', '/test2']// no redirect whitelist
router.beforeEach((to, from, next) => {
if (to.meta.title) {
document.title = to.meta.title + ' - ' + Config.title
}
if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
next()
} else {
next(`/login`) // 否则全部重定向到登录页
NProgress.done()
}
})
export const loadMenus = (next, to) => {
buildMenus().then(res => {
const sdata = JSON.parse(JSON.stringify(res))
const rdata = JSON.parse(JSON.stringify(res))
const sidebarRoutes = filterAsyncRouter(sdata)
const rewriteRoutes = filterAsyncRouter(rdata, false, true)
rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
store.dispatch('GenerateRoutes', rewriteRoutes).then(() => { // 存储路由
router.addRoutes(rewriteRoutes) // 动态添加可访问路由表
next({ ...to, replace: true })
})
store.dispatch('SetSidebarRouters', sidebarRoutes)
})
}
router.afterEach(() => {
NProgress.done() // finish progress bar
})
/src/view/zhongwei-daping/index.vue
使用el-row 对页面进行布局
.mian-container / background-image 为背景图片
.divmao    单块背景模糊
        backdrop-filter 模糊像素,越大越模糊
        background      背景色,最后两位是透明度
        box-shadow     边缘阴影
![](C:\Users\15267\AppData\Roaming\marktext\images\2023-08-31-10-38-26-image.png)
```
<template>
<div class="mian-container">
<el-row style="height: 20px">
<el-col :span="24"><div style="height: 100px;background: #f4516c00" /></el-col>
</el-row>
<el-row style="height: 100%">
<el-col :span="8" style="height: 95%">
<el-row class="divmao" style="height: 30%; margin: 5px;">
<RadarChart />
</el-row>
<el-row class="divmao" style="height: 30%; margin: 5px;">
<RadarChart />
</el-row>
<el-row class="divmao" style="height: 40%; margin: 5px;">
<RadarChart />
</el-row>
</el-col>
<el-col :span="8" style="height: 95%">
<el-row class="divmao" style="height: 100%; margin: 5px 5px 5px 5px;">
<BarChart />
</el-row>
</el-col>
<el-col :span="8" style="height: 95%">
<el-row class="divmao" style="height: 30%; margin: 5px ;">
<RightChart1 />
</el-row>
<el-row class="divmao" style="height: 30%; margin: 5px;">
<RadarChart />
</el-row>
<el-row class="divmao" style="height: 40%; margin: 5px;">
<RadarChart />
</el-row>
</el-col>
</el-row>
</div>
</template>
<script>
import RadarChart from './RadarChart.vue'
import BarChart from '@/views/zhongwei-daping/BarChart.vue'
import RightChart1 from '@/views/zhongwei-daping/RightChart1.vue'
export default {
name: 'DataView',
components: {
BarChart,
RightChart1,
// eslint-disable-next-line vue/no-unused-components
RadarChart
},
data() {
return {}
}
}
</script>
<style>
.mian-container{
height: 100%;
width: 100%;
background-image: url('./img/bg2.png');
display: flex;
background-size:cover;
flex-direction: column;
}
.divmao{
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
backdrop-filter: blur(1px);
background: #ffffff10;
color: #fff;
box-shadow: 0 0 30px 10px rgba(0, 0, 0, .3);
}
</style>
```
    页面添加雷达图
    import RadarChart from './RadarChart.vue'
    在components 中引用
```
 export default {
name: 'DataView',
components: {
BarChart,
RightChart1,
// eslint-disable-next-line vue/no-unused-components
RadarChart
},
data() {
return {}
}
}
```
    直接在 EL 中添加
```
<el-row class="divmao" style="height: 30%; margin: 5px ;">
    <RightChart1 />
</el-row>
```
/src/zhongwei-daping/RadarChatr    雷达图
静态数据
```
<template>
<div :class="className" :style="{height:height,width:width}" />
</template>
<script>
import echarts from 'echarts' // echarts theme
import { debounce } from '@/utils'
require('echarts/theme/macarons')
const animationDuration = 3000
export default {
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '200px'
}
},
data() {
return {
chart: null
}
},
mounted() {
this.initChart()
this.__resizeHandler = debounce(() => {
if (this.chart) {
this.chart.resize()
}
}, 100)
window.addEventListener('resize', this.__resizeHandler)
},
beforeDestroy() {
if (!this.chart) {
return
}
window.removeEventListener('resize', this.__resizeHandler)
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
this.chart.setOption({
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
radar: {
radius: '66%',
center: ['50%', '42%'],
splitNumber: 8,
splitArea: {
areaStyle: {
color: 'rgba(127,95,132,.3)',
opacity: 1,
shadowBlur: 45,
shadowColor: 'rgba(0,0,0,.5)',
shadowOffsetX: 0,
shadowOffsetY: 15
}
},
indicator: [
{ name: 'Sales', max: 10000 },
{ name: 'Administration', max: 20000 },
{ name: 'Information Techology', max: 20000 },
{ name: 'Customer Support', max: 20000 },
{ name: 'Development', max: 20000 },
{ name: 'Marketing', max: 20000 }
]
},
legend: {
left: 'center',
bottom: '10',
data: ['Allocated Budget', 'Expected Spending', 'Actual Spending']
},
series: [{
type: 'radar',
symbolSize: 0,
areaStyle: {
normal: {
shadowBlur: 13,
shadowColor: 'rgba(0,0,0,.2)',
shadowOffsetX: 0,
shadowOffsetY: 10,
opacity: 1
}
},
data: [
{
value: [5000, 7000, 12000, 11000, 15000, 14000],
name: 'Allocated Budget'
},
{
value: [4000, 9000, 15000, 15000, 13000, 11000],
name: 'Expected Spending'
},
{
value: [5500, 11000, 12000, 15000, 12000, 12000],
name: 'Actual Spending'
}
],
animationDuration: animationDuration
}]
})
}
}
}
</script>
```
             动态数据的话修改 initChart()部分为
```
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
crudSysAppUpdate.get().then(res => {
this.chart.setOption(res)
})
}
}
```

View File

@ -0,0 +1,281 @@
ubuntu 部署项目
安装桌面
```
1.sudo apt-get update
2.sudo apt-get install ubuntu-desktop
```
安装远程工具
```markup
sudo apt-get install xrdp
```
然后用win+R 键输入mstsc进入下面远程桌面连接输入之前的IP
![](https://www.guyuehome.com/Uploads/Editor/202210/20201216141326387.png)
同样的输入账号和密码,就可以进入了,这个看起来就舒服多了。
![](https://www.guyuehome.com/Uploads/Editor/202210/20201216141339557.png)
## 步骤1安装 MySQL
在 Ubuntu 上通过以下步骤安装 MySQL 服务器及客户端:
```shell
sudo apt-get update
sudo apt-get install mysql-server mysql-client
```
安装过程中,您可能会被要求设置 root 用户的密码。如果没有出现该对话框,请继续执行下面的步骤。
## 步骤2修改用户密码
要修改 root 用户的密码,请按照以下步骤操作:
1. 打开终端,并以 root 用户身份登录到 MySQL shell
```shell
sudo mysql -u root
```
2. 输入 root 密码以登录到 MySQL shell。
3. 在 MySQL shell 中,执行以下命令来更改 root 用户的密码(将 `new_password` 替换为您要设置的新密码):
```sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
```
4. 退出 MySQL shell
```sql
EXIT;
```
## 步骤3配置 MySQL 允许远程连接
要允许来自其他主机的连接,请按照以下步骤进行配置:
1. 编辑 MySQL 配置文件:
```shell
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
```
2. 找到 `bind-address` 行并注释掉(在行前添加 `#` 符号),以允许来自任何 IP 地址的连接。
3. 保存并关闭文件。
4. 重新启动 MySQL 服务器:
```shell
sudo systemctl restart mysql
```
## 步骤4修改配置,使其可以被navicat连接
1. 打开终端,并以 root 用户身份登录到 MySQL shell
```shell
sudo mysql -u root -p
```
选择数据库
```php
use mysql;
```
更新root用户host字段 让所有ip都可以连接
```bash
update user set host = '%' where user = 'root';
```
刷新修改
```undefined
FLUSH PRIVILEGES;
```
## 步骤5连接 MySQL 数据库
现在我们可以使用 Navicat 连接到 MySQL 数据库:
1. 打开 Navicat 工具,并点击 "连接"Connect按钮。
2. 在新建连接窗口中,输入以下信息:
- 连接名Connection Name自定义名称。
- 主机名或 IP 地址HostMySQL 服务器的 IP 地址或主机名。
- 端口号Port默认为 3306。
- 用户名Usernameroot 或您创建的其他用户。
- 密码Password之前设置的密码。
3. 点击 "测试连接"Test Connection按钮以验证连接是否成功。
4. 如果连接测试通过,点击 "连接"Connect按钮以建立与 MySQL 数据库的连接。
恭喜!您已经成功安装了 MySQL 并使用 Navicat 连接到 MySQL 数据库。现在您可以开始管理和操作数据库了。
请注意,在执行上述步骤时,请根据实际情况调整参数和配置信息,确保正确设置密码和允许远程连接。
### 卸载MySQL [在Ubuntu中删除mysql_ubuntu卸载mysql_ccbbaaap的博客-CSDN博客](https://blog.csdn.net/ccbbaaap/article/details/130657186)
# # Reids 安装
一、安装
1.1 更新仓库(非必须)
```
sudo apt update
```
1.2 使用 apt 从官方 Ubuntu 存储库来安装 Redis
```
sudo apt-get install redis-server
```
二、设置密码
2.1 打开Redis配置文件redis.conf
```
sudo vi /etc/redis/redis.conf
```
2.2 找到# requirepass foobared这一行将注释符号#去掉将后面修改成自己的密码例如设置密码为123abc
```
requirepass 123abc
```
三、开启远程访问
默认情况下Redis服务器不允许远程访问只允许本机访问所以我们需要设置打开远程访问的功能。
1、打开Redis服务器的配置文件redis.conf
```
sudo vi /etc/redis/redis.conf
```
2、使用注释符号#注释bind 127.0.0.1这行
#注释bind
#bind 127.0.0.1
四、Redis服务控制命令
```
/etc/init.d/redis-server start #启动
/etc/init.d/redis-server stop #关闭
/etc/init.d/redis-server restart #重启
```
vim 搜索 / 加搜索关键词
# nginx 安装
```
apt-get install nginx
```
其他命令
```
查看版本
nginx -v
启动nginx
service nginx start
查看运行状态
service nginx status
重启nginx
service nginx restart
sudo systemctl restart nginx
```
安装后的文件目录
```
/usr/sbin/nginx主程序
/etc/nginx存放配置文件
/usr/share/nginx存放静态文件
/var/log/nginx存放日志
```
# 安装JDK1.8
```
sudo apt install openjdk-8-jre-headless
java -version
```
# 后端启动
```
nohup java -jar eladmin-system-2.6.jar --spring.profiles.active=prod > nohup.out 2>&1 &o
```
## 后端停止
```
PID=$(ps -ef | grep eladmin-system-2.6.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
echo Application is already stopped
else
echo kill -9 $PID
kill -9 $PID
fi
```
# **查看日志脚本**
```
tail -f nohup.out
```
# 前端部署nginx 配置
在http{} 中添加server
```
server{
listen 8091;
server_name 101.35.240.82;
root /home/ubuntu/dist;
location / {
try_files $uri $uri/ @router;
index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
}
```
![](C:\Users\15267\AppData\Roaming\marktext\images\2023-09-19-16-48-12-image.png)
```
listen 为端口号
server_name 域名/当前服务器外网IP;
root /home/wwwroot/eladmin/dist; #dist上传的路径
```