Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
so-manage-ui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
smart-operation
so-manage-ui
Commits
b02fb229
Commit
b02fb229
authored
Jun 21, 2023
by
张耀
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' into zy
parents
a1e5f8ff
aa58d260
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1599 additions
and
886 deletions
+1599
-886
src/assets/css/index.css
src/assets/css/index.css
+739
-672
src/bg-ui/bg-code-editor.vue
src/bg-ui/bg-code-editor.vue
+20
-4
src/bg-ui/bg-form-gap.vue
src/bg-ui/bg-form-gap.vue
+2
-2
src/page/main/auto-maintenance/task-manage/add/base-info.vue
src/page/main/auto-maintenance/task-manage/add/base-info.vue
+57
-0
src/page/main/auto-maintenance/task-manage/add/finish.vue
src/page/main/auto-maintenance/task-manage/add/finish.vue
+49
-0
src/page/main/auto-maintenance/task-manage/add/index.vue
src/page/main/auto-maintenance/task-manage/add/index.vue
+166
-0
src/page/main/auto-maintenance/task-manage/add/use-content.vue
...age/main/auto-maintenance/task-manage/add/use-content.vue
+69
-0
src/page/main/auto-maintenance/task-manage/index.vue
src/page/main/auto-maintenance/task-manage/index.vue
+6
-18
src/page/main/forewarning/list/index.vue
src/page/main/forewarning/list/index.vue
+140
-89
src/page/main/forewarning/list/user-input-table.vue
src/page/main/forewarning/list/user-input-table.vue
+269
-0
src/router/index.js
src/router/index.js
+82
-101
No files found.
src/assets/css/index.css
View file @
b02fb229
This diff is collapsed.
Click to expand it.
src/bg-ui/bg-code-editor.vue
View file @
b02fb229
...
@@ -3,14 +3,14 @@
...
@@ -3,14 +3,14 @@
v-model:value=
"states.content"
v-model:value=
"states.content"
class=
"vue-ace-editor"
class=
"vue-ace-editor"
:class=
"
{ 'vue-ace-editor-disable': props.disabled }"
:class=
"
{ 'vue-ace-editor-disable': props.disabled }"
@input="codeChange"
:lang="props.lang"
:lang="props.lang"
:theme="props.theme"
:theme="props.theme"
:options="{
:options="{
useWorker: true,
useWorker: true,
readOnly: props.disabled,
readOnly: props.disabled,
wrap: true,
wrap: true,
}" />
}"
@input="codeChange" />
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
reactive
,
toRefs
,
watch
,
onMounted
}
from
"
vue
"
;
import
{
reactive
,
toRefs
,
watch
,
onMounted
}
from
"
vue
"
;
...
@@ -85,6 +85,7 @@ const codeChange = () => {
...
@@ -85,6 +85,7 @@ const codeChange = () => {
onMounted
(()
=>
{
onMounted
(()
=>
{
let
obj
=
""
;
let
obj
=
""
;
// console.log(typeof JSON.parse(this.datas));
try
{
try
{
if
(
typeof
JSON
.
parse
(
props
.
modelValue
)
==
"
object
"
)
{
if
(
typeof
JSON
.
parse
(
props
.
modelValue
)
==
"
object
"
)
{
obj
=
JSON
.
stringify
(
JSON
.
parse
(
props
.
modelValue
),
null
,
"
\t
"
);
obj
=
JSON
.
stringify
(
JSON
.
parse
(
props
.
modelValue
),
null
,
"
\t
"
);
...
@@ -128,9 +129,10 @@ const { content } = toRefs(states);
...
@@ -128,9 +129,10 @@ const { content } = toRefs(states);
width
:
0
;
width
:
0
;
}
}
.vue-ace-editor
:deep
()
.ace_scroller
{
.vue-ace-editor
:deep
()
.ace_scroller
{
background-color
:
#
1a1a1a
;
background-color
:
#
fff
;
color
:
#
fff
;
color
:
#
495266
;
caret-color
:
#fff
;
caret-color
:
#fff
;
right
:
0
!important
;
}
}
/* 光标颜色 */
/* 光标颜色 */
.vue-ace-editor
:deep
()
.ace_cursor
{
.vue-ace-editor
:deep
()
.ace_cursor
{
...
@@ -138,6 +140,20 @@ const { content } = toRefs(states);
...
@@ -138,6 +140,20 @@ const { content } = toRefs(states);
}
}
.vue-ace-editor-disable
:deep
()
.ace_scrollbar-v
{
.vue-ace-editor-disable
:deep
()
.ace_scrollbar-v
{
width
:
6px
!important
;
width
:
6px
!important
;
right
:
2px
;
}
.vue-ace-editor-disable
:deep
()
.ace_scrollbar
::-webkit-scrollbar
{
height
:
6px
;
width
:
6px
;
}
.vue-ace-editor-disable
:deep
()
.ace_scrollbar
::-webkit-scrollbar-track
{
background-color
:
#f7f7f9
;
/* Matches ace monokai */
border-radius
:
3px
;
}
.vue-ace-editor-disable
:deep
()
.ace_scrollbar
::-webkit-scrollbar-thumb
{
background-color
:
#c1c7d7
;
border-radius
:
3px
;
}
}
.vue-ace-editor-disable
:deep
()
.ace_gutter
{
.vue-ace-editor-disable
:deep
()
.ace_gutter
{
background-color
:
#202531
;
background-color
:
#202531
;
...
...
src/bg-ui/bg-form-gap.vue
View file @
b02fb229
...
@@ -34,10 +34,10 @@ const props = defineProps({
...
@@ -34,10 +34,10 @@ const props = defineProps({
background-color
:
#3759be
;
background-color
:
#3759be
;
border-radius
:
2px
;
border-radius
:
2px
;
}
}
/*
.gap-title::after {
.gap-title
::after
{
content
:
""
;
content
:
""
;
display
:
inline-block
;
display
:
inline-block
;
flex
:
1
;
flex
:
1
;
border-top
:
1px
dashed
#dadee7
;
border-top
:
1px
dashed
#dadee7
;
}
*/
}
</
style
>
</
style
>
src/page/main/auto-maintenance/task-manage/add/base-info.vue
0 → 100644
View file @
b02fb229
<
template
>
<div>
<el-form
ref=
"ruleFormRef"
:model=
"state.ruleForm"
:rules=
"state.rules"
label-position=
"top"
label-width=
"120px"
>
<el-form-item
label=
"任务名称"
prop=
"name"
>
<el-input
v-model=
"state.ruleForm.name"
maxlength=
"20"
placeholder=
"请输入任务名称"
show-word-limit
/>
</el-form-item>
<el-form-item
label=
"任务描述"
prop=
"desc"
>
<el-input
v-model=
"state.ruleForm.desc"
type=
"textarea"
maxlength=
"200"
placeholder=
"请输入任务描述"
:autosize=
"
{
minRows: 4,
}"
show-word-limit />
</el-form-item>
</el-form>
</div>
</
template
>
<
script
setup
>
import
{
reactive
,
ref
,
onBeforeMount
,
toRefs
}
from
"
vue
"
;
import
{
useRouter
,
useRoute
}
from
"
vue-router
"
;
import
{
ElMessage
}
from
"
element-plus
"
;
const
router
=
useRouter
();
const
route
=
useRoute
();
const
props
=
defineProps
({
data
:
{
type
:
Object
,
default
:
()
=>
{},
},
});
const
state
=
reactive
({
ruleForm
:
{
name
:
props
.
data
?.
name
,
desc
:
props
.
data
?.
desc
,
},
rules
:
{
name
:
[
{
required
:
true
,
message
:
"
请输入任务名称
"
,
trigger
:
"
blur
"
},
{
max
:
20
,
message
:
"
最大长度20
"
,
trigger
:
"
blur
"
},
],
desc
:
[{
max
:
200
,
message
:
"
最大长度200
"
,
trigger
:
"
blur
"
}],
},
});
const
save
=
()
=>
{};
defineExpose
({
save
,
});
</
script
>
<
style
scoped
></
style
>
src/page/main/auto-maintenance/task-manage/add/finish.vue
0 → 100644
View file @
b02fb229
<
template
>
<div
class=
"step-container"
>
<div
class=
"step-base"
>
<img
src=
"@/assets/imgs/img_data-complete.png"
/>
<p
class=
"tips"
>
新增成功
</p>
<div
class=
"apaas_button btns"
>
<el-button
type=
"default"
@
click=
"goStepOne"
>
返回列表
</el-button>
<el-button
type=
"primary"
@
click=
"putawayAction"
>
继续新增
</el-button>
</div>
</div>
</div>
</
template
>
<
script
setup
>
import
{
reactive
,
ref
,
onBeforeMount
,
toRefs
}
from
"
vue
"
;
import
{
useRouter
,
useRoute
}
from
"
vue-router
"
;
import
{
ElMessage
}
from
"
element-plus
"
;
const
router
=
useRouter
();
const
route
=
useRoute
();
const
state
=
reactive
({
data
:
1
});
const
{
data
}
=
toRefs
(
state
);
</
script
>
<
style
scoped
>
.step-container
{
position
:
relative
;
height
:
100%
;
}
.step-base
{
position
:
absolute
;
top
:
50%
;
left
:
50%
;
transform
:
translate
(
-50%
,
-50%
);
width
:
300px
;
}
.tips
{
margin
:
60px
0
;
text-align
:
center
;
font-size
:
18px
;
color
:
#202531
;
font-weight
:
600
;
}
.btns
{
width
:
208px
;
margin
:
0
auto
;
display
:
flex
;
justify-content
:
space-around
;
}
</
style
>
src/page/main/auto-maintenance/task-manage/add/index.vue
0 → 100644
View file @
b02fb229
<
template
>
<div
class=
"detail_container"
>
<bg-breadcrumb></bg-breadcrumb>
<div
class=
"main_container"
>
<div
class=
"content_process"
>
<div>
<el-steps
:active=
"step"
>
<el-step
title=
""
:class=
"
{ process_complete: step > 1 }">
<template
#icon
>
<span
class=
"process_desc"
>
<span
class=
"icon_box"
v-if=
"step > 0"
><bg-icon
class=
"step_icon"
icon=
"#bg-ic-file-editing"
></bg-icon
></span>
<span
class=
"circle"
v-else
></span>
基本信息
</span>
</
template
>
</el-step>
<el-step
title=
""
:class=
"{ process_complete: step > 2 }"
>
<
template
#icon
>
<span
class=
"process_desc"
>
<span
class=
"icon_box"
v-if=
"step > 1"
><bg-icon
class=
"step_icon"
icon=
"#bg-ic-file-lock"
></bg-icon
></span>
<span
class=
"circle"
v-else
></span>
执行内容
</span>
</
template
>
</el-step>
<el-step
title=
""
>
<
template
#icon
>
<span
class=
"process_desc"
>
<span
class=
"icon_box"
v-if=
"step > 2"
><bg-icon
class=
"step_icon"
icon=
"#bg-ic-file-success"
></bg-icon
></span>
<span
class=
"circle"
v-else
></span>
完成
</span>
</
template
>
</el-step>
</el-steps>
</div>
</div>
<div
class=
"content_main log_content_nor"
:style=
"step == 3 ? { height: 'calc(100vh - 234px)' } : {}"
>
<base-info
v-show=
"step == 1"
></base-info>
<use-content
v-show=
"step == 2"
></use-content>
<finish
v-show=
"step == 3"
></finish>
</div>
<div
class=
"content_foot apaas_button"
v-if=
"step == 1 || step == 2"
>
<el-button
type=
"default"
@
click=
"cancel"
>
取消
</el-button>
<el-button
type=
"default"
v-if=
"step == 2"
@
click=
"confirm(-1)"
>
上一步
</el-button>
<el-button
type=
"primary"
v-if=
"step == 1"
@
click=
"confirm(1)"
>
下一步
</el-button>
<el-button
type=
"primary"
v-if=
"step == 2"
@
click=
"confirm(1)"
>
保存
</el-button>
<el-button
type=
"success"
v-if=
"step == 2"
@
click=
"useScript"
>
立即执行
</el-button>
</div>
</div>
</div>
</template>
<
script
setup
>
import
{
reactive
,
ref
,
onBeforeMount
,
toRefs
}
from
"
vue
"
;
import
{
useRouter
,
useRoute
}
from
"
vue-router
"
;
import
{
ElMessage
}
from
"
element-plus
"
;
import
axios
from
"
@/request/http.js
"
;
import
bgBreadcrumb
from
"
@/components/bg-breadcrumb.vue
"
;
import
baseInfo
from
"
./base-info.vue
"
;
import
useContent
from
"
./use-content.vue
"
;
import
finish
from
"
./finish.vue
"
;
const
router
=
useRouter
();
const
route
=
useRoute
();
const
step
=
ref
(
1
);
const
state
=
reactive
({
data
:
1
});
const
cancel
=
()
=>
{
router
.
back
();
};
const
confirm
=
(
val
)
=>
{
step
.
value
=
step
.
value
+
val
;
};
const
useScript
=
()
=>
{};
</
script
>
<
style
scoped
>
.content_process
{
border-bottom
:
1px
solid
#e6e9ef
;
padding
:
38px
16%
;
}
.content_main
{
height
:
calc
(
100vh
-
287px
);
padding
:
30px
;
overflow-x
:
hidden
;
overflow-y
:
scroll
;
box-sizing
:
border-box
;
}
.content_foot
{
border-top
:
1px
solid
#e6e9ef
;
padding
:
16px
16px
0
16px
;
display
:
flex
;
justify-content
:
flex-end
;
}
.process_desc
{
background-color
:
#fff
;
display
:
inline-block
;
position
:
absolute
;
padding
:
0
5px
;
font-size
:
18px
;
color
:
#202531
;
font-weight
:
bold
;
}
.process_desc
img
{
height
:
25px
;
width
:
25px
;
vertical-align
:
middle
;
}
.process_end
{
height
:
100%
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.process_end
div
{
text-align
:
center
;
}
.step_icon
{
color
:
#fff
;
font-weight
:
600
;
position
:
absolute
;
top
:
50%
;
left
:
50%
;
transform
:
translate
(
-50%
,
-50%
);
}
.icon_box
{
display
:
inline-block
;
background-color
:
#2b4695
;
width
:
48px
;
height
:
48px
;
border-radius
:
99px
;
position
:
relative
;
border
:
3px
solid
#b0bee8
;
vertical-align
:
middle
;
}
.circle
{
display
:
inline-block
;
background-color
:
#a9b1c7
;
width
:
24px
;
height
:
24px
;
border-radius
:
50%
;
position
:
relative
;
border
:
6px
solid
#e6e9ef
;
vertical-align
:
middle
;
}
.content_process
:deep
(
.el-step.is-horizontal
.el-step__line
)
{
height
:
4px
;
}
.content_process
:deep
(
.el-step__head.is-finish
.el-step__line
)
{
background
:
linear-gradient
(
to
right
,
#2b4695
50%
,
#e6e9ef
50%
);
}
.process_complete
:deep
(
.el-step__head.is-finish
.el-step__line
)
{
background
:
linear-gradient
(
to
right
,
#2b4695
100%
,
#e6e9ef
0%
);
}
</
style
>
src/page/main/auto-maintenance/task-manage/add/use-content.vue
0 → 100644
View file @
b02fb229
<
template
>
<div>
<bg-form-gap
title=
"执行脚本"
></bg-form-gap>
<bg-inner-tabs
v-model=
"state.useType"
:data=
"state.useData"
></bg-inner-tabs>
<div
style=
"height: 493px; margin-bottom: 23px"
v-show=
"state.useType == 0"
>
<bg-code-editor
v-model=
"state.useText"
></bg-code-editor>
</div>
<div
v-show=
"state.useType == 1"
class=
"file-box"
>
<p>
上传文件
</p>
<bg-upload
v-model=
"state.doc_file"
custom-tips
:file-types=
"['yaml', 'yml']"
:file-max-size=
"20"
:limit=
"1"
>
<span>
将文件拖到此处,或 点击上传
</span><br
/>
<span>
支持上传一个后缀为.yaml或.yml的文件
</span><br
/>
<span>
文件大小不超过20M
</span>
</bg-upload>
</div>
<bg-form-gap
title=
"执行主机"
></bg-form-gap>
<el-form
ref=
"ruleFormRef"
:model=
"state.ruleForm"
:rules=
"state.rules"
label-position=
"top"
label-width=
"120px"
>
<el-form-item
label=
"主机分组名称"
prop=
"name"
style=
"width: 1100px"
>
<el-select
v-model=
"state.ruleForm.name"
style=
"width: 1020px"
clearable
placeholder=
"请选择"
>
<el-option
v-for=
"item in state.options"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
<span
class=
"add-pc can_click_text"
>
去创建
</span>
</el-form-item>
</el-form>
</div>
</
template
>
<
script
setup
>
import
{
reactive
,
ref
,
onBeforeMount
,
toRefs
}
from
"
vue
"
;
import
{
useRouter
,
useRoute
}
from
"
vue-router
"
;
import
{
ElMessage
}
from
"
element-plus
"
;
const
router
=
useRouter
();
const
route
=
useRoute
();
const
state
=
reactive
({
useType
:
0
,
useData
:
[
"
文本执行
"
,
"
文件执行
"
],
useText
:
""
,
doc_file
:
[],
ruleForm
:
{
name
:
""
,
},
rules
:
{
name
:
[{
required
:
true
,
message
:
"
请选择主机分组
"
,
trigger
:
"
change
"
}],
},
options
:
[
{
label
:
"
12
"
,
value
:
"
qwqw
"
,
},
],
});
</
script
>
<
style
lang=
"scss"
scoped
>
.add-pc
{
font-size
:
14px
;
margin-left
:
10px
;
}
.file-box
{
margin-top
:
20px
;
margin-bottom
:
20px
;
p
{
color
:
#202531
;
font-size
:
14px
;
margin-bottom
:
10px
;
}
}
</
style
>
src/page/main/auto-maintenance/task-manage/index.vue
View file @
b02fb229
...
@@ -153,6 +153,10 @@ import { ElMessage } from "element-plus";
...
@@ -153,6 +153,10 @@ import { ElMessage } from "element-plus";
import
axios
from
"
@/request/http.js
"
;
import
axios
from
"
@/request/http.js
"
;
import
{
Search
}
from
"
@element-plus/icons-vue
"
;
import
{
Search
}
from
"
@element-plus/icons-vue
"
;
import
bgBreadcrumb
from
"
@/components/bg-breadcrumb.vue
"
;
import
bgBreadcrumb
from
"
@/components/bg-breadcrumb.vue
"
;
import
{
useRouter
,
useRoute
}
from
"
vue-router
"
;
const
router
=
useRouter
();
const
route
=
useRoute
();
const
bgForm
=
ref
(
null
);
const
bgForm
=
ref
(
null
);
const
dataTable
=
ref
(
null
);
const
dataTable
=
ref
(
null
);
const
headers
=
[
const
headers
=
[
...
@@ -343,24 +347,8 @@ const changeSize = (size) => {
...
@@ -343,24 +347,8 @@ const changeSize = (size) => {
};
// 改变每页条数
};
// 改变每页条数
const
register
=
()
=>
{
const
register
=
()
=>
{
state
.
formData
=
{
router
.
push
(
`/auto-maintenance/task-manage/add`
);
name
:
""
,
};
describe
:
""
,
state
:
1
,
p_dict_id
:
state
.
fatherRow
?
state
.
fatherRow
.
dict_id
:
""
,
};
if
(
state
.
bgForm
)
{
nextTick
().
then
(()
=>
{
state
.
bgForm
.
validate
((
valid
)
=>
{
if
(
!
valid
)
{
state
.
bgForm
.
clearValidate
();
}
});
});
}
state
.
addType
=
1
;
state
.
addDialog
=
true
;
};
// 新增字典按钮
onBeforeMount
(()
=>
{
onBeforeMount
(()
=>
{
getTypeList
();
getTypeList
();
...
...
src/page/main/forewarning/list/index.vue
View file @
b02fb229
...
@@ -123,75 +123,59 @@
...
@@ -123,75 +123,59 @@
</div>
</div>
</div>
</div>
<!-- todo: 推送提醒 -->
<!-- todo: 推送提醒 -->
<!-- <el-dialog
<el-dialog
title=
"推送提醒"
v-model=
"pushDialog"
width=
"780px"
:before-close=
"cancelPushDialog"
>
class="dialog_box"
<div
class=
"warning_info"
>
:title="addType == 1 ? '新增' : '编辑'"
<bg-icon
v-model="addDialog"
style=
"font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: middle"
width="758px">
icon=
"#bg-ic-s-circle-tips"
></bg-icon
<el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form">
>
该推送为临时推送,可调整推送人员,仅本次有效!如固定通知人员,则前往【预警规则设置】调整预警内容
<el-form-item label="名称" prop="name">
</div>
<el-input
<el-form
ref=
"pushForm"
:model=
"pushFormData"
:rules=
"pushRules"
label-width=
"120px"
class=
"bg_form"
>
v-model.trim="formData.name"
<el-form-item
label=
"预警工单推送"
prop=
"method"
style=
"margin-bottom: 24px"
>
show-word-limit
<el-checkbox-group
v-model=
"pushFormData.method"
>
:maxlength="
<el-checkbox
:label=
"1"
>
钉钉
</el-checkbox>
nodeClassifyId == 'eb9c7d70-c123-42b7-8e61-dde1b022b669'
<el-checkbox
:label=
"2"
>
短信
</el-checkbox>
? 6
</el-checkbox-group>
: nodeClassifyId == 'efd9ec3b-7f18-49e2-9d88-bcca022243bb'
? 4
: nodeClassifyId == '949a1138-4995-464e-97a9-424d097eb271'
? 2
: 20
"
placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述" prop="describe">
<el-input
v-model="formData.describe"
type="textarea"
:autosize="{ minRows: 5 }"
show-word-limit
maxlength="200"
resize="vertical"
placeholder="请输入描述"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="state" style="margin-bottom: 0px">
<el-switch
class="bg-switch-ele"
v-model="formData.state"
:active-value="1"
:inactive-value="0"
inline-prompt
active-text="是"
inactive-text="否" />
</el-form-item>
</el-form-item>
</el-form>
</el-form>
<user-input-table
v-if=
"userTableFlag"
ref=
"userTable"
:data=
"userData"
@
change=
"changeData"
/>
<
template
v-slot:footer
>
<
template
v-slot:footer
>
<div
class=
"apaas_button"
>
<div
class=
"apaas_button"
>
<el-button type="default" @click="
addDialog = false">取
消</el-button>
<el-button
type=
"default"
@
click=
"
cancelPushDialog"
>
取
消
</el-button>
<el-button type="primary" @click="
addConfirm">保 存
</el-button>
<el-button
type=
"primary"
@
click=
"
pushConfirm"
>
确定
</el-button>
</div>
</div>
</
template
>
</
template
>
</el-dialog>
-->
</el-dialog>
<!--
todo:
关闭提醒 -->
<!-- 关闭提醒 -->
<
!-- <
el-dialog
<el-dialog
class=
"dialog_box"
class=
"dialog_box"
title="
提示
"
title=
"
关闭预警
"
v-model="
dialogDelete
"
v-model=
"
closeWarningDialog
"
width=
"400px"
width=
"400px"
:before-close="
:before-close=
"cancelCloseWarningDialog"
>
() => {
<el-form
ref=
"closeForm"
:model=
"closeFormData"
:rules=
"closeRules"
label-width=
"80px"
class=
"bg_form"
>
dialogDelete = false;
<el-form-item
label=
"关闭备注"
prop=
"close_notes"
>
}
<el-input
">
v-model=
"closeFormData.close_notes"
<div>确定要删除此字典值吗?</div>
type=
"textarea"
:autosize=
"{ minRows: 2 }"
show-word-limit
maxlength=
"30"
resize=
"vertical"
placeholder=
"请输入内容"
></el-input>
</el-form-item>
<el-form-item
label=
""
prop=
"close_remind"
style=
"margin-bottom: 0px"
>
<el-checkbox
v-model=
"closeFormData.close_remind"
label=
"三天内将不再推送该预警信息"
/>
</el-form-item>
</el-form>
<
template
v-slot:footer
>
<
template
v-slot:footer
>
<div
class=
"apaas_button"
>
<div
class=
"apaas_button"
>
<el-button type="default" @click="
dialogDelete = false">取
消</el-button>
<el-button
type=
"default"
@
click=
"
cancelCloseWarningDialog"
>
取
消
</el-button>
<el-button type="primary" @click="
deleteData">确
定</el-button>
<el-button
type=
"primary"
@
click=
"
confirmClose"
>
确
定
</el-button>
</div>
</div>
</
template
>
</
template
>
</el-dialog>
-->
</el-dialog>
</div>
</div>
</template>
</template>
...
@@ -201,11 +185,14 @@ import { ElMessage } from "element-plus";
...
@@ -201,11 +185,14 @@ import { ElMessage } from "element-plus";
import
axios
from
"
@/request/http.js
"
;
import
axios
from
"
@/request/http.js
"
;
import
{
Search
}
from
"
@element-plus/icons-vue
"
;
import
{
Search
}
from
"
@element-plus/icons-vue
"
;
import
bgBreadcrumb
from
"
@/components/bg-breadcrumb.vue
"
;
import
bgBreadcrumb
from
"
@/components/bg-breadcrumb.vue
"
;
import
userInputTable
from
"
./user-input-table.vue
"
;
const
bgForm
=
ref
(
null
);
const
bgForm
=
ref
(
null
);
const
dataTable
=
ref
(
null
);
const
dataTable
=
ref
(
null
);
const
closeForm
=
ref
(
null
);
const
userTable
=
ref
(
null
);
const
pushForm
=
ref
(
null
);
const
state
=
reactive
({
const
state
=
reactive
({
bgForm
,
warningTypes
:
[
warningTypes
:
[
{
{
name
:
"
全部
"
,
name
:
"
全部
"
,
...
@@ -338,25 +325,28 @@ const state = reactive({
...
@@ -338,25 +325,28 @@ const state = reactive({
limit
:
10
,
limit
:
10
,
},
// 表格筛选项
},
// 表格筛选项
actionRow
:
null
,
// 当前操作的数据
actionRow
:
null
,
// 当前操作的数据
dialogDelete
:
false
,
// 删除弹窗
closeWarningDialog
:
false
,
// 删除弹窗
addType
:
0
,
//
closeFormData
:
{
addDialog
:
false
,
close_notes
:
""
,
formData
:
{
close_remind
:
false
,
name
:
""
,
},
describe
:
""
,
closeRules
:
{
state
:
1
,
close_notes
:
[{
required
:
true
,
message
:
"
请输入关闭备注
"
,
trigger
:
"
blur
"
}],
p_dict_id
:
""
,
},
pushDialog
:
false
,
userData
:
[],
pushFormData
:
{
method
:
[],
},
},
rules
:
{
pushRules
:
{
name
:
[{
required
:
true
,
message
:
"
请输入名称
"
,
trigger
:
"
blur
"
}],
method
:
[{
type
:
"
array
"
,
required
:
true
,
message
:
"
请最少选择一种推送方式
"
,
trigger
:
"
change
"
}],
describe
:
[
{
required
:
true
,
message
:
"
请输入描述
"
,
trigger
:
"
blur
"
},
{
max
:
200
,
message
:
"
描述最大为200字
"
,
trigger
:
"
blur
"
},
],
state
:
[{
required
:
true
,
message
:
"
请选择是否启用
"
,
trigger
:
"
change
"
}],
},
},
});
});
const
userTableFlag
=
computed
(()
=>
{
return
!!
state
.
pushDialog
;
});
const
selectRows
=
(
data
)
=>
{
const
selectRows
=
(
data
)
=>
{
state
.
selected
=
data
.
selection
;
state
.
selected
=
data
.
selection
;
};
};
...
@@ -424,7 +414,7 @@ const getTableRows = () => {
...
@@ -424,7 +414,7 @@ const getTableRows = () => {
notice_people_num
:
2
,
notice_people_num
:
2
,
push_times
:
2
,
push_times
:
2
,
last_push_time
:
"
2020-01-01 00:00:00
"
,
last_push_time
:
"
2020-01-01 00:00:00
"
,
state
:
1
,
state
:
0
,
},
},
{
{
id
:
2
,
id
:
2
,
...
@@ -474,19 +464,87 @@ const batchPush = () => {
...
@@ -474,19 +464,87 @@ const batchPush = () => {
const
pushWarning
=
(
row
)
=>
{
const
pushWarning
=
(
row
)
=>
{
state
.
actionRow
=
row
;
state
.
actionRow
=
row
;
console
.
log
(
"
推送提醒
"
);
console
.
log
(
"
推送提醒
"
);
state
.
userData
=
[
{
account
:
1
,
name
:
"
张一
"
,
mobile
:
"
13111111111
"
,
},
{
account
:
2
,
name
:
"
张二二
"
,
mobile
:
"
13222222222
"
,
},
{
account
:
4
,
name
:
"
张四三
"
,
mobile
:
"
13443434344
"
,
},
];
state
.
pushDialog
=
true
;
};
// 推送提醒
};
// 推送提醒
const
changeData
=
(
data
)
=>
{
state
.
userData
=
data
.
data
;
};
const
cancelPushDialog
=
()
=>
{
pushForm
.
value
.
resetFields
();
state
.
pushDialog
=
false
;
};
// 预警推送弹窗取消按钮:重置表单
const
pushConfirm
=
()
=>
{
pushForm
.
value
.
validate
((
valid
)
=>
{
if
(
valid
)
{
console
.
log
(
state
.
actionRow
.
id
,
state
.
userData
);
console
.
log
(
state
.
pushFormData
);
cancelPushDialog
();
}
});
};
const
closeWarning
=
(
row
)
=>
{
const
closeWarning
=
(
row
)
=>
{
state
.
actionRow
=
row
;
state
.
actionRow
=
row
;
state
.
closeWarningDialog
=
true
;
console
.
log
(
"
关闭预警
"
);
console
.
log
(
"
关闭预警
"
);
};
// 关闭预警
};
// 关闭预警
const
cancelCloseWarningDialog
=
()
=>
{
closeForm
.
value
.
resetFields
();
state
.
closeWarningDialog
=
false
;
};
// 关闭预警弹窗取消按钮:重置表单
const
confirmClose
=
()
=>
{
closeForm
.
value
.
validate
((
valid
)
=>
{
if
(
valid
)
{
console
.
log
(
state
.
actionRow
.
id
);
console
.
log
(
state
.
closeFormData
);
cancelCloseWarningDialog
();
}
});
};
// 关闭预警弹窗确定按钮:提交表单
onBeforeMount
(()
=>
{
onBeforeMount
(()
=>
{
getTableRows
();
getTableRows
();
});
});
const
{
headers
,
tableRows
,
tableTotal
,
filter
,
warningTypes
,
warningTargets
,
riskLevels
,
stateOptions
}
=
const
{
toRefs
(
state
);
headers
,
tableRows
,
tableTotal
,
filter
,
warningTypes
,
warningTargets
,
riskLevels
,
stateOptions
,
closeWarningDialog
,
closeFormData
,
closeRules
,
pushDialog
,
userData
,
pushFormData
,
pushRules
,
}
=
toRefs
(
state
);
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
@@ -548,7 +606,7 @@ const { headers, tableRows, tableTotal, filter, warningTypes, warningTargets, ri
...
@@ -548,7 +606,7 @@ const { headers, tableRows, tableTotal, filter, warningTypes, warningTargets, ri
width
:
100%
;
width
:
100%
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
.el-form-item
{
.el-form-item
{
margin-bottom
:
24
px
;
margin-bottom
:
16
px
;
:deep
()
.el-form-item__label
{
:deep
()
.el-form-item__label
{
line-height
:
36px
;
line-height
:
36px
;
height
:
36px
;
height
:
36px
;
...
@@ -557,26 +615,19 @@ const { headers, tableRows, tableTotal, filter, warningTypes, warningTargets, ri
...
@@ -557,26 +615,19 @@ const { headers, tableRows, tableTotal, filter, warningTypes, warningTargets, ri
width
:
100%
;
width
:
100%
;
.el-textarea
{
.el-textarea
{
:deep
()
.el-input__count
{
:deep
()
.el-input__count
{
bottom
:
-1
6px
;
bottom
:
6px
;
right
:
4px
;
right
:
4px
;
font-family
:
Roboto-Regular
;
font-family
:
Roboto-Regular
;
color
:
#a9b1c7
;
color
:
#a9b1c7
;
}
}
}
}
.bg-switch-ele
{
width
:
52px
;
height
:
24px
;
:deep
()
.el-switch__core
{
width
:
100%
;
height
:
24px
;
.el-switch__inner
,
.el-switch__action
{
top
:
3px
;
}
}
}
}
}
}
}
}
}
:deep
()
.dialog_box
{
.el-dialog__body
{
padding-bottom
:
0
;
}
}
}
}
</
style
>
</
style
>
src/page/main/forewarning/list/user-input-table.vue
0 → 100644
View file @
b02fb229
<
template
>
<el-form
ref=
"ruleFormRef"
class=
"ruleForm"
:model=
"tableRows"
:size=
"formSize"
:rules=
"formRules"
>
<bg-table-pro
showIndex
:headers=
"headers"
:data=
"tableRows"
ref=
"input-table"
:border=
"true"
:stripe=
"false"
>
<template
v-slot:account=
"
{ row, index }">
<el-form-item
:prop=
"`[$
{index}].account`" :rules="formRules.account" style="width: 100%">
<el-select
v-model=
"row.account"
placeholder=
"请选择帐号"
style=
"width: 100%"
@
change=
"changeAccount(row)"
:disabled=
"disabled"
>
<el-option
v-for=
"(item, index) in userLists"
:key=
"'userItem' + index"
:disabled=
"item.disabled"
:label=
"item.account"
:value=
"item.id"
>
</el-option>
</el-select>
</el-form-item>
</
template
>
<
template
v-slot:name=
"{ row, index }"
>
<el-form-item
:prop=
"`[$
{index}].name`" :rules="formRules.name" style="width: 100%">
<el-input
@
change=
"changeName"
placeholder=
"请输入姓名"
:disabled=
"disabled"
v-model.trim=
"row.name"
/>
</el-form-item>
</
template
>
<
template
v-slot:mobile=
"{ row, index }"
>
<el-form-item
:prop=
"`[$
{index}].mobile`" :rules="formRules.mobile" style="width: 100%">
<el-input
@
change=
"changeMobile"
placeholder=
"请输入联系方式"
:disabled=
"disabled"
v-model.trim=
"row.mobile"
/>
</el-form-item>
</
template
>
<
template
v-slot:action=
"{ row, index }"
>
<bg-table-btn
:disabled=
"disabled || !canAdd"
:click=
"
() =>
{
addParam(index);
}
"
>增加
</bg-table-btn
>
<bg-table-btn
:disabled=
"disabled"
:click=
"
() =>
{
removeParam(row, index);
}
">
删除
</bg-table-btn>
</
template
>
</bg-table-pro>
</el-form>
</template>
<
script
setup
>
import
{
reactive
,
toRefs
,
onBeforeMount
,
onMounted
,
ref
,
getCurrentInstance
,
watch
,
computed
}
from
"
vue
"
;
import
{
v4
as
uuidv4
}
from
"
uuid
"
;
import
{
validatePhone
}
from
"
@/services/rules.js
"
;
const
props
=
defineProps
({
data
:
{
type
:
Array
,
default
:
()
=>
[],
},
disabled
:
{
type
:
Boolean
,
default
:
false
,
},
});
const
emit
=
defineEmits
([
"
change
"
]);
const
formSize
=
ref
(
"
default
"
);
const
ruleFormRef
=
ref
(
null
);
const
formRules
=
reactive
({
name
:
[
{
required
:
true
,
message
:
"
请输入键
"
,
trigger
:
"
blur
"
,
},
{
max
:
50
,
message
:
"
最多50个字符
"
,
trigger
:
"
blur
"
,
},
],
account
:
[
{
required
:
true
,
message
:
"
请选择帐号
"
,
trigger
:
"
change
"
,
},
],
mobile
:
[
{
required
:
true
,
message
:
"
请输入联系方式
"
,
trigger
:
"
blur
"
,
},
{
validator
:
validatePhone
,
trigger
:
"
blur
"
},
],
});
const
headers
=
reactive
([
{
label
:
"
帐号
"
,
prop
:
"
account
"
,
required
:
true
,
},
{
label
:
"
姓名
"
,
prop
:
"
name
"
,
required
:
true
,
},
{
label
:
"
联系方式
"
,
prop
:
"
mobile
"
,
required
:
true
,
},
{
label
:
"
操作
"
,
prop
:
"
action
"
,
width
:
120
,
},
]);
const
state
=
reactive
({
tableRows
:
[],
userLists
:
[
{
account
:
"
admin
"
,
id
:
1
,
name
:
"
张一
"
,
mobile
:
"
13111111111
"
,
},
{
account
:
"
ys-admin
"
,
id
:
2
,
name
:
"
张二
"
,
mobile
:
"
13222222222
"
,
},
{
account
:
"
yf-user
"
,
id
:
3
,
name
:
"
张三
"
,
mobile
:
"
13333333333
"
,
},
{
account
:
"
putong
"
,
id
:
4
,
name
:
"
张四
"
,
mobile
:
"
13444444444
"
,
},
],
});
watch
(
()
=>
state
.
tableRows
,
(
n
,
o
)
=>
{
let
list
=
state
.
tableRows
.
map
((
e
)
=>
{
return
e
.
account
;
});
state
.
userLists
.
forEach
((
e
)
=>
{
if
(
list
.
indexOf
(
e
.
id
)
>
-
1
)
{
e
.
disabled
=
true
;
}
else
{
e
.
disabled
=
false
;
}
});
},
{
deep
:
true
,
}
);
const
canAdd
=
computed
(()
=>
{
return
state
.
tableRows
.
length
>=
5
?
false
:
true
;
});
// 最多五条数据,控制下新增按钮的禁用
onBeforeMount
(()
=>
{
initTable
();
});
var
initTable
=
()
=>
{
if
(
props
.
data
&&
props
.
data
.
length
>=
1
)
{
state
.
tableRows
=
props
.
data
;
}
else
{
state
.
tableRows
=
[];
addParam
(
0
);
}
};
var
createRow
=
()
=>
{
return
{
id
:
uuidv4
(),
account
:
""
,
name
:
""
,
mobile
:
""
,
};
};
var
addParam
=
(
index
)
=>
{
state
.
tableRows
.
splice
(
index
+
1
,
0
,
createRow
());
};
var
removeParam
=
(
row
,
index
)
=>
{
state
.
tableRows
.
splice
(
index
,
1
);
if
(
state
.
tableRows
.
length
===
0
)
{
addParam
(
0
);
}
};
const
changeAccount
=
(
row
)
=>
{
state
.
userLists
.
forEach
((
e
)
=>
{
if
(
e
.
id
==
row
.
account
)
{
row
.
name
=
e
.
name
;
row
.
mobile
=
e
.
mobile
;
}
});
emit
(
"
change
"
,
{
type
:
"
account
"
,
data
:
state
.
tableRows
,
});
};
const
changeName
=
()
=>
{
emit
(
"
change
"
,
{
type
:
"
name
"
,
data
:
state
.
tableRows
,
});
};
const
changeMobile
=
()
=>
{
emit
(
"
change
"
,
{
type
:
"
mobile
"
,
data
:
state
.
tableRows
,
});
};
var
getInputData
=
()
=>
{
let
lastData
=
[];
let
tempObj
=
{};
state
.
tableRows
.
forEach
((
e
)
=>
{
tempObj
[
e
.
name
]
=
e
;
});
for
(
const
key
in
tempObj
)
{
if
(
key
&&
tempObj
[
key
].
value
)
{
lastData
.
push
(
tempObj
[
key
]);
}
}
return
lastData
;
};
const
{
tableRows
,
userLists
}
=
toRefs
(
state
);
//暴露获取数据方法
defineExpose
({
getInputData
,
initTable
,
});
</
script
>
<
style
scoped
></
style
>
src/router/index.js
View file @
b02fb229
...
@@ -3,98 +3,84 @@
...
@@ -3,98 +3,84 @@
import
{
createRouter
,
createWebHashHistory
}
from
"
vue-router
"
;
import
{
createRouter
,
createWebHashHistory
}
from
"
vue-router
"
;
import
store
from
"
../store
"
;
import
store
from
"
../store
"
;
//写入初始必须有的路由
//写入初始必须有的路由
//或者隐藏式路由,不会表现在菜单上,但是需要存在的路由
//或者隐藏式路由,不会表现在菜单上,但是需要存在的路由
const
routes
=
[{
const
routes
=
[
path
:
"
/login
"
,
{
name
:
"
login
"
,
path
:
"
/login
"
,
show
:
true
,
name
:
"
login
"
,
component
:
()
=>
show
:
true
,
import
(
"
../page/login/index.vue
"
),
component
:
()
=>
import
(
"
../page/login/index.vue
"
),
},
},
{
{
path
:
"
/register
"
,
path
:
"
/register
"
,
name
:
"
register
"
,
name
:
"
register
"
,
show
:
true
,
show
:
true
,
component
:
()
=>
component
:
()
=>
import
(
"
../page/register/index.vue
"
),
import
(
"
../page/register/index.vue
"
),
},
},
{
{
path
:
"
/
"
,
path
:
"
/password
"
,
name
:
"
index
"
,
name
:
"
password
"
,
component
:
()
=>
import
(
"
../page/welcom.vue
"
),
show
:
true
,
},
component
:
()
=>
{
import
(
"
../page/password/index.vue
"
),
path
:
"
/404
"
,
},
show
:
true
,
{
component
:
()
=>
import
(
"
../page/404.vue
"
),
path
:
"
/
"
,
},
name
:
"
index
"
,
component
:
()
=>
import
(
"
../page/welcom.vue
"
),
},
{
path
:
"
/404
"
,
show
:
true
,
component
:
()
=>
import
(
"
../page/404.vue
"
),
},
];
];
//重新创建router
//重新创建router
function
newRouterFunc
()
{
function
newRouterFunc
()
{
return
createRouter
({
return
createRouter
({
history
:
createWebHashHistory
(),
history
:
createWebHashHistory
(),
routes
,
routes
,
});
});
}
}
const
router
=
newRouterFunc
();
const
router
=
newRouterFunc
();
function
inWhiteList
(
toPath
)
{
function
inWhiteList
(
toPath
)
{
//配置白名单
//配置白名单
const
whiteList
=
[
'
/login
'
]
const
whiteList
=
[
"
/login
"
];
const
path
=
whiteList
.
find
((
value
)
=>
{
const
path
=
whiteList
.
find
((
value
)
=>
{
// 使用正则匹配
// 使用正则匹配
const
reg
=
new
RegExp
(
'
^
'
+
value
)
const
reg
=
new
RegExp
(
"
^
"
+
value
);
return
reg
.
test
(
toPath
)
return
reg
.
test
(
toPath
);
})
});
return
!!
path
return
!!
path
;
}
}
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
const
userInfo
=
store
.
state
.
userInfo
;
const
userInfo
=
store
.
state
.
userInfo
//已登录不可跳转登陆页
//已登录不可跳转登陆页
if
(
userInfo
&&
to
.
path
==
"
/login
"
)
{
if
(
userInfo
&&
to
.
path
==
'
/login
'
)
{
next
({
path
:
from
.
path
});
next
({
path
:
from
.
path
})
}
}
// 检查to.path是否存在于免登陆白名单
// 检查to.path是否存在于免登陆白名单
if
(
inWhiteList
(
to
.
path
))
{
if
(
inWhiteList
(
to
.
path
))
{
next
();
next
()
}
else
{
}
else
{
// 判断是否已经登录,未登录则重定向到首页或其他页面(通过query传参记录原来的路径)
// 判断是否已经登录,未登录则重定向到首页或其他页面(通过query传参记录原来的路径)
// 根据配置判断是否跳转第三方登录,跳转第三方登录则不跳login
// 根据配置判断是否跳转第三方登录,跳转第三方登录则不跳login
// axios封装中也需要对是否登录过期进行判断,如果登录过期,则跳转登录页,具体跳转地址根据配置来·
// axios封装中也需要对是否登录过期进行判断,如果登录过期,则跳转登录页,具体跳转地址根据配置来·
// if (!userInfo) {
// if (!userInfo) {
// next({
// next({
// path: '/login',
// path: '/login',
// })
// })
// } else {
// } else {
// }
}
// }
}
//判读是否匹配,否则跳转404
if
(
to
.
matched
.
length
!==
0
)
{
//判读是否匹配,否则跳转404
next
();
if
(
to
.
matched
.
length
!==
0
)
{
}
else
{
next
()
return
next
({
path
:
"
/404
"
});
}
else
{
}
return
next
({
path
:
'
/404
'
})
});
}
})
// 在路由完成初始导航时调用,如果有异步操作放置到这里
// 在路由完成初始导航时调用,如果有异步操作放置到这里
// 请求相应的角色和菜单
// 请求相应的角色和菜单
...
@@ -102,38 +88,33 @@ router.beforeEach((to, from, next) => {
...
@@ -102,38 +88,33 @@ router.beforeEach((to, from, next) => {
// generateRoutes()
// generateRoutes()
// })
// })
function
addRoute
(
router
,
routers
)
{
function
addRoute
(
router
,
routers
)
{
routers
.
forEach
(
e
=>
{
routers
.
forEach
((
e
)
=>
{
router
.
addRoute
(
e
)
router
.
addRoute
(
e
);
if
(
e
.
children
&&
e
.
children
.
length
)
{
if
(
e
.
children
&&
e
.
children
.
length
)
{
addRoute
(
router
,
e
.
children
)
addRoute
(
router
,
e
.
children
);
}
}
});
});
}
}
export
function
generateRoutes
()
{
export
function
generateRoutes
()
{
const
_asyncRoutes
=
store
.
state
.
route
const
_asyncRoutes
=
store
.
state
.
route
;
if
(
_asyncRoutes
)
{
//动态添加路由
addRoute
(
router
,
_asyncRoutes
)
}
router
.
addRoute
({
if
(
_asyncRoutes
)
{
path
:
'
/:pathMatch(.*)
'
,
//动态添加路由
redirect
:
'
/404
'
})
addRoute
(
router
,
_asyncRoutes
);
}
router
.
addRoute
({
path
:
"
/:pathMatch(.*)
"
,
redirect
:
"
/404
"
,
});
}
}
//新创建一个router替代之前的router,并把matcher方法替换成新的router的matcher
//新创建一个router替代之前的router,并把matcher方法替换成新的router的matcher
export
function
resetRouter
()
{
export
function
resetRouter
()
{
const
newRouter
=
newRouterFunc
()
const
newRouter
=
newRouterFunc
();
router
.
matcher
=
newRouter
.
matcher
router
.
matcher
=
newRouter
.
matcher
;
}
}
export
default
router
;
export
default
router
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment