Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
Y
yn-science-front
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
徐俊
yn-science-front
Commits
b56a1391
Commit
b56a1391
authored
Dec 16, 2024
by
wangxl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
333
parent
59c21d3a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
412 additions
and
829 deletions
+412
-829
index.js
src/router/index.js
+2
-2
cache.js
src/store/modules/cache.js
+79
-0
Index.vue
src/views/audit/project/Index.vue
+0
-3
infoEdit.vue
src/views/basicSetting/person/components/infoEdit.vue
+4
-3
edit.vue
src/views/basicSetting/person/edit.vue
+71
-0
index.vue
src/views/basicSetting/person/index.vue
+145
-23
info.vue
src/views/basicSetting/person/info.vue
+0
-191
edit.vue
src/views/basicSetting/unit/edit.vue
+1
-1
expertEdit.vue
src/views/expert/components/expertEdit.vue
+28
-24
specSelect.vue
src/views/expert/components/specSelect.vue
+50
-51
index.vue
src/views/expert/index.vue
+20
-9
expertEdit.vue
src/views/report/expert/components/expertEdit.vue
+0
-209
expertImport.vue
src/views/report/expert/components/expertImport.vue
+0
-127
expertView.vue
src/views/report/expert/components/expertView.vue
+0
-106
specSelect.vue
src/views/report/expert/components/specSelect.vue
+0
-71
index.vue
src/views/report/expert/index.vue
+0
-0
Index.vue
src/views/report/project/Index.vue
+1
-1
projectEdit.vue
src/views/report/project/components/projectEdit.vue
+1
-0
Index.vue
src/views/statistic/project/Index.vue
+0
-3
antd.css
static/css/antd.css
+3
-3
common.less
static/css/common.less
+7
-2
No files found.
src/router/index.js
View file @
b56a1391
...
...
@@ -92,7 +92,7 @@ export const routes = [
meta
:
{
title
:
'个人设置'
,
icon
:
'el-icon-user'
},
hidden
:
false
,
children
:
[
{
path
:
'/person/info'
,
name
:
'个人设置'
,
component
:
()
=>
import
(
'@/views/basicSetting/person/in
fo
.vue'
),
meta
:
{
title
:
'个人设置'
,
icon
:
''
,
noCache
:
true
}
},
{
path
:
'/person/info'
,
name
:
'个人设置'
,
component
:
()
=>
import
(
'@/views/basicSetting/person/in
dex
.vue'
),
meta
:
{
title
:
'个人设置'
,
icon
:
''
,
noCache
:
true
}
},
]
},
{
...
...
@@ -233,7 +233,7 @@ export const routes = [
{
path
:
'/expert/expertBRegister'
,
name
:
'专家导入'
,
component
:
()
=>
import
(
'@/views/expert/components/expertImport.vue'
),
meta
:
{
title
:
'专家导入'
,
icon
:
''
,
noCache
:
true
}
},
{
path
:
'/expert/group'
,
name
:
'专家组管理'
,
component
:
()
=>
import
(
'@/views/expertGroup/expertBatch.vue'
),
meta
:
{
title
:
'专家组管理'
,
icon
:
''
,
noCache
:
true
}
},
{
path
:
'/expert/group/members'
,
name
:
'专家组成员管理'
,
component
:
()
=>
import
(
'@/views/expertGroup/expertGroupMembers.vue'
),
meta
:
{
title
:
'专家组成员管理'
,
icon
:
''
,
noCache
:
true
}
},
{
path
:
'/expert/report'
,
name
:
'专家推荐'
,
component
:
()
=>
import
(
'@/views/
report/
expert/index.vue'
),
meta
:
{
title
:
'专家推荐'
,
icon
:
''
,
noCache
:
true
}
},
{
path
:
'/expert/report'
,
name
:
'专家推荐'
,
component
:
()
=>
import
(
'@/views/expert/index.vue'
),
meta
:
{
title
:
'专家推荐'
,
icon
:
''
,
noCache
:
true
}
},
]
},
{
...
...
src/store/modules/cache.js
0 → 100644
View file @
b56a1391
import
Vue
from
'vue'
import
Api
from
'@/api/index.js'
const
state
=
{
dict
:
{},
queue
:
[]
}
const
mutations
=
{
SET_DICT
:
(
state
,
{
type
,
list
})
=>
{
// 设置值:注意得用Vue.set方法
Vue
.
set
(
state
.
dict
,
type
,
list
)
},
SET_QUEUE
:
(
state
,
type
)
=>
{
state
.
queue
.
push
(
type
)
},
DEL_QUEUE
:
(
state
,
type
)
=>
{
// 找到并删除
for
(
let
i
=
0
;
i
<
state
.
queue
.
length
;
i
++
)
{
const
item
=
state
.
queue
[
i
]
if
(
item
===
type
)
{
state
.
queue
.
splice
(
i
,
1
)
break
}
}
}
}
const
actions
=
{
getDict
:
(
state
)
=>
{
return
state
.
dict
},
getDictByType
:
(
state
)
=>
(
type
)
=>
{
/**
* 闭包特性。返回一个函数,该函数接收一个type参数。
* 同时由于闭包还持有state对象,故可以返回需要的值。
*/
return
state
.
dict
[
type
]
},
// 缓存字典内容
dict
({
commit
,
state
},
type
)
{
// 判断是否已经缓存过,缓存过后将不再获取数据
const
isExistence
=
state
.
queue
.
some
((
item
)
=>
{
return
item
===
'dict/'
+
type
})
// 没有缓存则请求数据
if
(
!
isExistence
)
{
// 在异步请求之前将该任务标记为已缓存(存入队列)
commit
(
'SET_QUEUE'
,
'dict/'
+
type
)
return
new
Promise
((
resolve
,
reject
)
=>
{
return
Api
.
getDict
(
type
)
.
then
((
res
)
=>
{
const
{
code
,
data
}
=
res
if
(
code
&&
code
!==
200
)
{
// 获取失败移除缓存队列
commit
(
'DEL_QUEUE'
,
'dict/'
+
type
)
reject
(
res
)
}
else
{
// 获取到的值存入字典
commit
(
'SET_DICT'
,
{
type
:
type
,
list
:
data
})
resolve
(
res
)
}
})
.
catch
((
error
)
=>
{
// 获取失败移除缓存队列
commit
(
'DEL_QUEUE'
,
'dict/'
+
type
)
reject
(
error
)
})
})
}
else
{
return
state
.
dict
[
type
]
}
}
}
export
default
{
namespaced
:
true
,
state
,
mutations
,
actions
}
\ No newline at end of file
src/views/audit/project/Index.vue
View file @
b56a1391
...
...
@@ -13,9 +13,6 @@
<a-form-item>
<a-input
placeholder=
"申报人"
v-model=
"searchForm.appPersonName"
:maxLength=
"50"
style=
"width: 150px"
/>
</a-form-item>
<a-form-item
prop=
"knowledgeId"
>
<para-multi-select
v-model=
"searchForm.knowledgeId"
@
parentChange=
"knowledgeChange"
:typeId=
"57"
/>
</a-form-item>
<a-form-item>
<a-button
type=
"primary"
size=
"default"
icon=
"search"
@
click=
"search"
>
搜索
</a-button>
<a-button
icon=
"reload"
style=
"margin-left: 10px"
@
click=
"reset"
class=
"bt-normal"
>
重置
</a-button>
...
...
src/views/basicSetting/person/components/infoEdit.vue
View file @
b56a1391
...
...
@@ -37,7 +37,8 @@
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
prop=
"spec"
>
<para-multi-select
:width=
"180"
v-model=
"formData.spec"
:typeId=
"57"
/>
<!--
<para-multi-select
:width=
"180"
v-model=
"formData.spec"
:typeId=
"57"
/>
-->
<cascader-select
v-model=
"formData.spec"
/>
</a-form-model-item>
</a-col>
</a-row>
...
...
@@ -103,12 +104,12 @@
<
script
>
import
{
isEmptyParams
,
checkEmail
,
checkPhone
,
checkIdentitytionId
,
personBirthday
,
personGender
}
from
"@/views/utils/common"
import
cascaderSelect
from
'@/views/components/common/cascaderSelect'
export
default
{
name
:
"infoEdit"
,
components
:
{
cascaderSelect
},
data
()
{
return
{
...
...
src/views/basicSetting/person/edit.vue
0 → 100644
View file @
b56a1391
<
template
>
<div
class=
"app-content"
style=
"height:480px;overflow:auto;"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<info-edit
:formData
.
sync=
"formData"
@
load=
"onLoad"
@
sub=
"save"
ref=
"infoEdit"
/>
<a-row>
<a-col
style=
"text-align: center;width:100%;margin-top: 12px;"
>
<a-button
type=
"primary"
style=
"width:80px;"
@
click=
"submit"
>
提交
</a-button>
</a-col>
</a-row>
</a-spin>
</div>
</
template
>
<
script
>
import
{
getType
,
getComplete
,
setComplete
}
from
'@/views/utils/auth'
import
infoEdit
from
'@/views/basicSetting/person/components/infoEdit'
export
default
{
name
:
"personInfoEdit2"
,
components
:
{
infoEdit
},
data
()
{
return
{
formData
:
{
id
:
null
,
personName
:
null
,
nation
:
null
,
title
:
null
,
spec
:
null
,
degree
:
null
,
duty
:
null
,
telephone
:
null
,
fax
:
null
,
email
:
null
,
address
:
null
,
},
loading
:
false
}
},
created
()
{
this
.
getAppPersonInfo
()
},
methods
:
{
getAppPersonInfo
()
{
this
.
loading
=
true
this
.
$api
.
person
.
getAppPersonInfo
().
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
formData
=
data
.
person
if
(
data
.
isComplete
)
{
setComplete
(
data
.
isComplete
)
this
.
$emit
(
'sub'
,
data
.
isComplete
)
}
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
},
submit
()
{
this
.
$refs
.
infoEdit
.
submit
()
},
onLoad
(
value
)
{
this
.
loading
=
value
},
save
(
value
)
{
this
.
$emit
(
'sub'
,
value
)
},
}
}
</
script
>
\ No newline at end of file
src/views/basicSetting/person/index.vue
View file @
b56a1391
<
template
>
<div
class=
"app-content"
style=
"height:480px;overflow:auto;"
>
<div
class=
"app-content"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<info-edit
:formData
.
sync=
"formData"
@
load=
"onLoad"
@
sub=
"save"
ref=
"infoEdit"
/>
<a-row>
<a-col
style=
"text-align: center;width:100%;margin-top: 12px;"
>
<a-button
type=
"primary"
style=
"width:80px;"
@
click=
"submit"
>
提交
</a-button>
</a-col>
</a-row>
<div
style=
"min-width:910px;width:100%;height: 100%;"
>
<div
class=
"card-left border-style"
>
<div
class=
"holder-photo"
><img
alt=
""
src=
"https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"
>
<div
class=
"holder-name"
>
<!--
<a
title=
"修改"
style=
"text-decoration:none;"
href=
"#"
>
[修改]
</a>
-->
</div>
</div>
<div
class=
"holder-info"
>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
邮 箱
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
email
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
手机号
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
mobile
}}
<!--
<a
title=
"修改"
style=
"text-decoration:none;"
href=
"#"
>
[修改]
</a>
-->
</a-col>
</a-row>
<a-divider
dashed
/>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
姓 名
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
personName
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
性 别
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
sex
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
生 日
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
birthday
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
证件号
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
certId
}}
</a-col>
</a-row>
</div>
</div>
<div
class=
"card-right border-style"
>
<a-tabs
:activeKey=
"tabsActive"
@
tabClick=
"tabclick"
>
<a-tab-pane
key=
"1"
tab=
"设置"
>
</a-tab-pane>
<a-tab-pane
key=
"2"
tab=
"消息"
force-render
>
</a-tab-pane>
</a-tabs>
<div
v-show=
"tabsActive!='1'"
>
<a-empty
/>
</div>
<div
v-show=
"tabsActive=='1'"
>
<info-edit
:formData
.
sync=
"formData"
@
load=
"onLoad"
ref=
"infoEdit"
/>
<a-row>
<a-col
style=
"text-align: center;width:100%;"
>
<a-button
type=
"primary"
style=
"width:80px;"
@
click=
"submit"
>
保存
</a-button>
</a-col>
</a-row>
</div>
</div>
</div>
</a-spin>
</div>
</
template
>
<
script
>
import
{
getType
,
getComplete
,
setComplete
}
from
'@/views/utils/auth'
import
infoEdit
from
'@/views/basicSetting/person/components/infoEdit'
import
moment
from
'moment'
export
default
{
name
:
"personInfoEdit"
,
name
:
'perInfoEdit'
,
components
:
{
infoEdit
},
data
()
{
return
{
tabsActive
:
'1'
,
personInfo
:
{
id
:
null
,
certId
:
null
,
personName
:
null
,
sex
:
null
,
birthday
:
null
,
nation
:
null
,
title
:
null
,
education
:
null
,
spec
:
null
,
mobile
:
null
,
email
:
null
,
},
formData
:
{
id
:
null
,
personName
:
null
,
...
...
@@ -40,18 +117,20 @@ export default {
}
},
created
()
{
this
.
get
AppPerson
Info
()
this
.
get
User
Info
()
},
methods
:
{
getAppPersonInfo
()
{
moment
,
tabclick
(
key
)
{
this
.
tabsActive
=
key
},
getUserInfo
()
{
this
.
loading
=
true
this
.
$api
.
person
.
get
AppPerson
Info
().
then
(({
data
=
{}
})
=>
{
this
.
$api
.
person
.
get
User
Info
().
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
formData
=
data
.
person
if
(
data
.
isComplete
)
{
setComplete
(
data
.
isComplete
)
this
.
$emit
(
'sub'
,
data
.
isComplete
)
}
this
.
personInfo
=
data
Object
.
assign
(
this
.
formData
,
data
)
this
.
personInfo
.
birthday
=
moment
(
this
.
personInfo
.
birthday
).
format
(
'YYYY-MM-DD'
)
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
...
...
@@ -61,10 +140,54 @@ export default {
},
onLoad
(
value
)
{
this
.
loading
=
value
this
.
personInfo
.
email
=
this
.
formData
.
email
},
save
(
value
)
{
this
.
$emit
(
'sub'
,
value
)
},
}
}
</
script
>
\ No newline at end of file
</
script
>
<
style
scoped
lang=
"less"
>
.app-content {
padding: 10px 8px 10px 8px;
min-width: 920px;
.border-style {
border-radius: 4px;
border: 1px solid #e6ebf5;
background-color: #ffffff;
overflow: hidden;
color: #303133;
-webkit-transition: 0.3s;
transition: 0.3s;
}
.card-left {
float: left;
width: 300px;
height: 600px;
margin-right: 6px;
.holder-photo {
margin: 20px 0px 10px 0px;
text-align: center;
}
.holder-photo > img {
width: 104px;
height: 104px;
margin-bottom: 10px;
}
.holder-info {
padding: 0px 10px 0px 10px;
.ant-row .ant-col {
padding: 3px 5px 3px 5px;
}
}
.title {
text-align: right;
}
}
.card-right {
float: left;
width: calc(100% - 320px);
min-width: 600px;
min-height: 200px;
padding: 0px 15px 15px 15px;
}
}
</
style
>
src/views/basicSetting/person/info.vue
deleted
100644 → 0
View file @
59c21d3a
<
template
>
<div
class=
"app-content"
>
<div
style=
"min-width:910px;width:100%;height: 100%;"
>
<div
class=
"card-left border-style"
>
<div
class=
"holder-photo"
><img
alt=
""
src=
"https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"
>
<div
class=
"holder-name"
>
<!--
<a
title=
"修改"
style=
"text-decoration:none;"
href=
"#"
>
[修改]
</a>
-->
</div>
</div>
<div
class=
"holder-info"
>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
邮 箱
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
email
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
手机号
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
mobile
}}
<!--
<a
title=
"修改"
style=
"text-decoration:none;"
href=
"#"
>
[修改]
</a>
-->
</a-col>
</a-row>
<a-divider
dashed
/>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
姓 名
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
personName
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
性 别
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
sex
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
生 日
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
birthday
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"6"
class=
"title"
>
证件号
</a-col>
<a-col
:span=
"18"
>
{{
personInfo
.
certId
}}
</a-col>
</a-row>
</div>
</div>
<div
class=
"card-right border-style"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<a-tabs
:activeKey=
"tabsActive"
@
tabClick=
"tabclick"
>
<a-tab-pane
key=
"1"
tab=
"设置"
>
</a-tab-pane>
<a-tab-pane
key=
"2"
tab=
"消息"
force-render
>
</a-tab-pane>
</a-tabs>
<div
v-show=
"tabsActive!='1'"
>
<a-empty
/>
</div>
<div
v-show=
"tabsActive=='1'"
>
<info-edit
:formData
.
sync=
"formData"
@
load=
"onLoad"
ref=
"infoEdit"
/>
<a-row>
<a-col
style=
"text-align: center;width:100%;"
>
<a-button
type=
"primary"
style=
"width:80px;"
@
click=
"submit"
>
保存
</a-button>
</a-col>
</a-row>
</div>
</a-spin>
</div>
</div>
</div>
</
template
>
<
script
>
import
infoEdit
from
'@/views/basicSetting/person/components/infoEdit'
import
moment
from
'moment'
export
default
{
name
:
'perInfoEdit'
,
components
:
{
infoEdit
},
data
()
{
return
{
tabsActive
:
'1'
,
personInfo
:
{
id
:
null
,
certId
:
null
,
personName
:
null
,
sex
:
null
,
birthday
:
null
,
nation
:
null
,
title
:
null
,
education
:
null
,
spec
:
null
,
mobile
:
null
,
email
:
null
,
},
formData
:
{
id
:
null
,
personName
:
null
,
nation
:
null
,
title
:
null
,
spec
:
null
,
degree
:
null
,
duty
:
null
,
telephone
:
null
,
fax
:
null
,
email
:
null
,
address
:
null
,
},
loading
:
false
}
},
created
()
{
this
.
getUserInfo
()
},
methods
:
{
moment
,
tabclick
(
key
)
{
this
.
tabsActive
=
key
},
getUserInfo
()
{
this
.
$api
.
person
.
getUserInfo
().
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
personInfo
=
data
Object
.
assign
(
this
.
formData
,
data
)
this
.
personInfo
.
birthday
=
moment
(
this
.
personInfo
.
birthday
).
format
(
'YYYY-MM-DD'
)
}
}).
catch
(()
=>
{
})
},
submit
()
{
this
.
$refs
.
infoEdit
.
submit
()
},
onLoad
(
value
)
{
this
.
loading
=
value
this
.
personInfo
.
email
=
this
.
formData
.
email
},
}
}
</
script
>
<
style
scoped
lang=
"less"
>
.app-content {
padding: 10px 8px 10px 8px;
min-width: 920px;
.border-style {
border-radius: 4px;
border: 1px solid #e6ebf5;
background-color: #ffffff;
overflow: hidden;
color: #303133;
-webkit-transition: 0.3s;
transition: 0.3s;
}
.card-left {
float: left;
width: 300px;
height: 600px;
margin-right: 6px;
.holder-photo {
margin: 20px 0px 10px 0px;
text-align: center;
}
.holder-photo > img {
width: 104px;
height: 104px;
margin-bottom: 10px;
}
.holder-info {
padding: 0px 10px 0px 10px;
.ant-row .ant-col {
padding: 3px 5px 3px 5px;
}
}
.title {
text-align: right;
}
}
.card-right {
float: left;
width: calc(100% - 320px);
min-width: 600px;
min-height: 200px;
padding: 0px 15px 15px 15px;
}
}
</
style
>
src/views/basicSetting/unit/edit.vue
View file @
b56a1391
...
...
@@ -17,7 +17,7 @@ import infoEdit from '@/views/basicSetting/unit/components/infoEdit'
import
{
getUnitComplete
,
setUnitComplete
}
from
'@/views/utils/auth'
export
default
{
name
:
"unit
Edit
"
,
name
:
"unit
InfoEdit2
"
,
components
:
{
infoEdit
},
...
...
src/views/expert/components/expertEdit.vue
View file @
b56a1391
<
template
>
<div
style=
"height:
420px
;overflow:auto;"
>
<div
style=
"height:
65vh
;overflow:auto;"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<a-form-model
ref=
"form"
:model=
"formData"
:rules=
"rules"
class=
"from-table"
>
<a-row>
...
...
@@ -13,6 +13,17 @@
<a-input
disabled=
"disabled"
style=
"margin-left:6px;width: 250px"
v-model=
"formData.certId"
v-if=
"!!formData.id"
/>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
手机号
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"mobile"
prop=
"mobile"
v-if=
"!!!formData.id"
>
<a-input
v-model=
"formData.mobile"
@
blur=
"() =>
{$refs.mobile.onFieldBlur();}" style="width: 250px" />
</a-form-model-item>
<a-input
disabled=
"disabled"
style=
"margin-left:6px;width:250px"
v-model=
"formData.mobile"
v-if=
"!!formData.id"
/>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
姓名
</div>
...
...
@@ -29,29 +40,18 @@
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"treeCode"
prop=
"treeCode"
>
<unit-tree-select
v-model=
"formData.treeCode"
:disable=
"false"
:unitType=
"2"
:width=
"200"
/>
<span
style=
"color: green;margin-left: 6px;"
>
※系统中单位选择此项
</span>
</a-form-model-item>
<unit-tree-select
v-model=
"formData.treeCode"
:disable=
"false"
:unitType=
"2"
:width=
"200"
/>
<span
style=
"color: green;margin-left: 6px;"
>
※系统中单位选择此项
</span>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-row
v-if=
"isShow"
>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div>
工作单位
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"workUnit"
prop=
"workUnit"
>
<a-input
v-model=
"formData.workUnit"
@
blur=
"() =>
{$refs.workUnit.onFieldBlur(); }" style="width: 200px" />
<span
style=
"color: green;margin-left: 6px;"
>
※非系统中单位填写此项
</span>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
手机号
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"mobile"
prop=
"mobile"
v-if=
"!!!formData.id"
>
<a-input
v-model=
"formData.mobile"
@
blur=
"() =>
{$refs.mobile.onFieldBlur();}" style="width: 250px" />
<a-input
v-model=
"formData.workUnit"
@
blur=
"() =>
{$refs.workUnit.onFieldBlur(); }" style="width: 200px" />
<span
style=
"color: green;margin-left: 6px;"
>
※非系统中单位填写此项
</span>
</a-form-model-item>
<a-input
disabled=
"disabled"
style=
"margin-left:6px;width:250px"
v-model=
"formData.mobile"
v-if=
"!!formData.id"
/>
</a-col>
</a-row>
<a-row>
...
...
@@ -59,19 +59,23 @@
<div
class=
"required"
>
职称
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"title"
prop=
"title"
:label-col=
"
{ span: 3 }" :wrapper-col="{ span: 21 }"
>
<a-form-model-item
ref=
"title"
prop=
"title"
>
<para-multi-select
v-model=
"formData.title"
:typeId=
"7"
/>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-row
type=
"flex"
>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
评审专业
</div>
<div
class=
"special-middle"
>
<div
class=
"required"
>
评审专业
</div>
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"auditSpecList"
prop=
"auditSpecList"
:label-col=
"
{ span: 3 }" :wrapper-col="{ span: 21 }">
<spec-select
v-model=
"formData.auditSpecList"
/>
</a-form-model-item>
<div
class=
"special-middle"
>
<a-form-model-item
ref=
"specList"
prop=
"specList"
>
<spec-select
:specList
.
sync=
"formData.specList"
/>
</a-form-model-item>
</div>
</a-col>
</a-row>
<a-row>
...
...
@@ -121,7 +125,7 @@ export default {
return
{
loading
:
true
,
isShow
:
false
,
formData
:
{
id
:
null
,
personName
:
null
,
sex
:
''
,
birthday
:
null
,
certId
:
null
,
mobile
:
null
,
remark
:
null
,
email
:
null
,
title
:
null
,
auditS
pecList
:
[],
treeCode
:
null
},
formData
:
{
id
:
null
,
personName
:
null
,
sex
:
''
,
birthday
:
null
,
certId
:
null
,
mobile
:
null
,
remark
:
null
,
email
:
null
,
title
:
null
,
s
pecList
:
[],
treeCode
:
null
},
rules
:
{
certId
:
[
{
required
:
true
,
message
:
'请输入证件号'
,
trigger
:
'blur'
},
...
...
@@ -159,7 +163,7 @@ export default {
personName
:
[{
required
:
true
,
message
:
'请输入姓名'
,
trigger
:
'blur'
}],
workUnit
:
[{
required
:
false
,
message
:
'请输入工作单位'
,
trigger
:
'blur'
}],
sex
:
[{
required
:
true
,
message
:
'请选择性别'
,
trigger
:
'change'
}],
auditS
pecList
:
[{
required
:
true
,
message
:
'请选择评审专业'
,
trigger
:
'change'
}],
s
pecList
:
[{
required
:
true
,
message
:
'请选择评审专业'
,
trigger
:
'change'
}],
title
:
[{
required
:
true
,
message
:
'请选择职称'
,
trigger
:
'change'
}],
treeCode
:
[{
required
:
false
,
message
:
'请选择单位'
,
trigger
:
'change'
}],
remark
:
[{
required
:
false
,
message
:
'请输入备注'
,
trigger
:
'blur'
}],
...
...
src/views/expert/components/specSelect.vue
View file @
b56a1391
<
template
>
<div
style=
"width:auto;display:inline-block !important; display:inline;"
>
<a-select
mode=
"tags"
v-model=
"selected"
style=
"width: 400px"
@
change=
"onChange"
showArrow
allowClear
>
<a-select-opt-group
v-for=
"item in selectArray"
:key=
"item.key"
>
<span
slot=
"label"
>
<a-icon
type=
"bars"
/>
{{
item
.
title
}}
</span>
<a-select-option
v-for=
"arr in item.children"
:key=
"arr.key"
:value=
"arr.key"
>
{{
arr
.
title
}}
</a-select-option>
</a-select-opt-group>
</a-select>
<div>
<a-row
v-for=
"(item, index) in specList"
:key=
"'specList'+index"
type=
"flex"
>
<a-col
:span=
"20"
>
<div
class=
"special-middle"
>
<div>
<a-form-model-item
:prop=
"'specList.' + index + '.specId'"
:rules=
"
{ required: true, message: '*', trigger: 'change',}">
<cascader-select
v-model=
"item.specId"
/>
</a-form-model-item>
</div>
</div>
</a-col>
<a-col
:span=
"2"
>
<div
class=
"special-middle"
>
<a-popconfirm
title=
"确定要删除吗?"
ok-text=
"确定"
cancel-text=
"取消"
@
confirm=
"removeArray(item)"
>
<a-button
type=
"link"
size=
"small"
>
[删除]
</a-button>
</a-popconfirm>
</div>
</a-col>
</a-row>
<a-row
type=
"flex"
>
<a-col
:span=
"24"
style=
"text-align: center;"
>
<div
class=
"special-middle"
>
<a-button
type=
"dashed"
style=
"width: 50%"
@
click=
"addArray"
>
<a-icon
type=
"plus"
/>
添加
</a-button>
</div>
</a-col>
</a-row>
</div>
</
template
>
<
script
>
// 用法
<
spec
-
select
v
-
model
=
"formData.projClass"
/>
const
Model
=
{}
import
cascaderSelect
from
'@/views/components/common/cascaderSelect'
export
default
{
name
:
"SpecSelect"
,
name
:
'specSelect'
,
components
:
{
cascaderSelect
},
data
()
{
return
{
selectArray
:
[],
selected
:
[],
loadState
:
false
,
};
}
},
props
:
{
value
:
null
,
width
:
{
type
:
Number
,
specList
:
{
type
:
Array
,
default
()
{
return
180
return
[]
}
}
}
,
},
created
()
{
this
.
load
(
this
.
value
)
},
methods
:
{
load
(
value
)
{
if
(
this
.
selectArray
.
length
>
0
)
{
this
.
selected
=
value
}
else
{
this
.
$api
.
parameter
.
getArrayListByType
({
typeId
:
56
}).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
selectArray
=
data
this
.
selected
=
value
}
}).
catch
(()
=>
{
})
}
},
onChange
()
{
if
(
this
.
selected
.
length
>
3
)
{
this
.
$message
.
error
(
'最多只能选三个专业'
)
this
.
selected
=
this
.
selected
.
splice
(
0
,
3
)
}
this
.
$emit
(
"input"
,
this
.
selected
);
this
.
$emit
(
"change"
);
addArray
()
{
//添加成员
this
.
specList
.
push
({
...
Model
})
},
},
watch
:
{
value
:
{
handler
(
value
)
{
if
(
!
this
.
loadState
)
{
this
.
load
(
value
)
this
.
loadState
=
true
}
removeArray
(
item
)
{
//移除成员
let
index
=
this
.
specList
.
indexOf
(
item
)
if
(
index
!==
-
1
)
{
this
.
specList
.
splice
(
index
,
1
)
}
},
},
}
;
}
</
script
>
src/views/expert/index.vue
View file @
b56a1391
...
...
@@ -8,8 +8,8 @@
<a-input
v-model=
"searchForm.certId"
placeholder=
"证件号"
:maxLength=
"100"
style=
"width: 150px"
/>
</a-form-item>
<a-form-item>
<a-select
v-model=
"searchForm.sex"
style=
"width: 1
3
0px"
>
<a-select-option
value=
""
>
--
请选择
性别--
</a-select-option>
<a-select
v-model=
"searchForm.sex"
style=
"width: 1
0
0px"
>
<a-select-option
value=
""
>
--性别--
</a-select-option>
<a-select-option
value=
"男"
>
男
</a-select-option>
<a-select-option
value=
"女"
>
女
</a-select-option>
</a-select>
...
...
@@ -20,9 +20,6 @@
<a-form-item>
<a-input
v-model=
"searchForm.username"
placeholder=
"用户名"
:maxLength=
"100"
style=
"width: 130px"
/>
</a-form-item>
<a-form-item>
<a-input
v-model=
"searchForm.remark"
placeholder=
"备注"
:maxLength=
"100"
style=
"width: 130px"
/>
</a-form-item>
<a-form-item>
<para-multi-select
v-model=
"searchForm.title"
@
parentChange=
"titleChange"
:title=
"'职称'"
:objType=
"'project'"
:typeId=
"7"
:width=
"150"
/>
</a-form-item>
...
...
@@ -47,20 +44,24 @@
<
template
slot=
"spec"
slot-scope=
"record"
>
<span
v-for=
"data in record.specList"
:key=
"data.id"
:color=
"'green'"
>
{{
data
.
specName
+
' '
}}
</span>
</
template
>
<
template
slot=
"reportState"
slot-scope=
"record"
>
<span
v-if=
"record.reportState===2"
>
已上报
</span>
<span
v-else
>
未上报
</span>
</
template
>
<
template
slot=
"stateSwitch"
slot-scope=
"record"
>
<a-switch
checked-children=
"启用"
un-checked-children=
"停用"
:checked=
"checkedState(record)"
@
change=
"switchChange($event,record)"
/>
</
template
>
<
template
slot=
"option"
slot-scope=
"record"
>
<a-button
type=
"link"
size=
"small"
@
click=
"recordClick(record,'edit')"
>
修改
</a-button>
<
!--
<a-button
type=
"link"
size=
"small"
@
click=
"recordClick(record,'reset')"
>
重置密码
</a-button>
-->
<
!--
<a-button
type=
"link"
size=
"small"
@
click=
"recordClick(record,'del')"
>
删除
</a-button>
--
>
<
a-button
type=
"link"
size=
"small"
@
click=
"recordClick(record,'reset')"
>
重置密码
</a-button>
<
a-button
type=
"link"
size=
"small"
@
click=
"recordClick(record,'del')"
>
删除
</a-button
>
</
template
>
</a-table>
<a-pagination
v-if=
"pagination.total > 0"
:total=
"pagination.total"
show-size-changer
show-quick-jumper
v-model=
"pagination.pageIndex"
:page-size=
"pagination.pageSize"
:page-size-options=
"pagination.pageSizeOptions"
@
showSizeChange=
"showSizeChange"
@
change=
"change"
:showTotal=
"() => `共 ${pagination.total} 条`"
/>
<a-modal
v-model=
"visibleView"
title=
"查看"
width=
"700px"
:dialog-style=
"{ top: '1
5
%' }"
:footer=
"null"
destroyOnClose
>
<a-modal
v-model=
"visibleView"
title=
"查看"
width=
"700px"
:dialog-style=
"{ top: '1
0
%' }"
:footer=
"null"
destroyOnClose
>
<expert-view
v-model=
"id"
></expert-view>
</a-modal>
<a-modal
v-model=
"visibleEdit"
title=
"添加/修改"
width=
"850px"
:dialog-style=
"{ top: '1
5
%' }"
:footer=
"null"
destroyOnClose
>
<a-modal
v-model=
"visibleEdit"
title=
"添加/修改"
width=
"850px"
:dialog-style=
"{ top: '1
0
%' }"
:footer=
"null"
destroyOnClose
>
<expert-edit
v-model=
"id"
@
close=
"closeWindow"
></expert-edit>
</a-modal>
<a-modal
v-model=
"visibleImport"
title=
"专家导入"
width=
"80%"
:dialog-style=
"{ top: '8%' }"
:footer=
"null"
destroyOnClose
>
...
...
@@ -93,6 +94,7 @@ export default {
{
title
:
'单位'
,
dataIndex
:
'unitName'
,
align
:
'center'
},
{
title
:
'用户名'
,
dataIndex
:
'username'
,
align
:
'center'
},
{
title
:
'密码'
,
dataIndex
:
'password'
,
align
:
'center'
},
{
title
:
'上报状态'
,
scopedSlots
:
{
customRender
:
'reportState'
},
align
:
'center'
},
{
title
:
'状态'
,
scopedSlots
:
{
customRender
:
'stateSwitch'
},
align
:
'center'
},
{
title
:
'操作'
,
scopedSlots
:
{
customRender
:
'option'
},
align
:
'center'
,
fixed
:
'right'
,
width
:
'180px'
,
},
],
...
...
@@ -195,6 +197,15 @@ export default {
else
if
(
type
===
'del'
)
{
this
.
deleteExpert
(
record
.
id
,
record
.
userRoleId
)
}
else
if
(
type
===
'report'
)
{
this
.
$api
.
expert
.
update
({
id
:
record
.
id
,
reportState
:
2
}).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
$message
.
success
(
'上报成功!'
)
this
.
getListByPage
()
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
}
},
resetPwd
(
record
)
{
let
self
=
this
...
...
src/views/report/expert/components/expertEdit.vue
deleted
100644 → 0
View file @
59c21d3a
<
template
>
<div
style=
"height:420px;overflow:auto;"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<a-form-model
ref=
"form"
:model=
"formData"
:rules=
"rules"
class=
"from-table"
>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
证件号
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"certId"
prop=
"certId"
v-if=
"!!!formData.id"
>
<a-input
v-model=
"formData.certId"
@
blur=
"() =>
{$refs.certId.onFieldBlur(); }" style="width: 250px" />
</a-form-model-item>
<a-input
disabled=
"disabled"
style=
"margin-left:6px;width: 250px"
v-model=
"formData.certId"
v-if=
"!!formData.id"
/>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
姓名
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"personName"
prop=
"personName"
>
<a-input
v-model=
"formData.personName"
@
blur=
"() =>
{$refs.personName.onFieldBlur(); }" style="width: 250px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
手机号
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"mobile"
prop=
"mobile"
v-if=
"!!!formData.id"
>
<a-input
v-model=
"formData.mobile"
@
blur=
"() =>
{$refs.mobile.onFieldBlur();}" style="width: 250px" />
</a-form-model-item>
<a-input
disabled=
"disabled"
style=
"margin-left:6px;width:250px"
v-model=
"formData.mobile"
v-if=
"!!formData.id"
/>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
职称
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"title"
prop=
"title"
:label-col=
"
{ span: 3 }" :wrapper-col="{ span: 21 }">
<para-multi-select
v-model=
"formData.title"
:typeId=
"7"
/>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
<div
class=
"required"
>
评审专业
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"auditSpecList"
prop=
"auditSpecList"
:label-col=
"
{ span: 3 }" :wrapper-col="{ span: 21 }">
<spec-select
v-model=
"formData.auditSpecList"
/>
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
style=
"padding-left:16px"
>
<div>
邮箱
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"email"
prop=
"email"
>
<a-input
v-model=
"formData.email"
@
blur=
"() =>
{$refs.email.onFieldBlur();}" style="width: 250px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
style=
"padding-left:16px"
>
<div>
备注
</div>
</a-col>
<a-col
:span=
"20"
>
<a-form-model-item
ref=
"email"
prop=
"remark"
>
<a-input
v-model=
"formData.remark"
@
blur=
"() =>
{$refs.remark.onFieldBlur();}" style="width: 250px" />
</a-form-model-item>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"24"
style=
"text-align:center;"
>
<a-button
type=
"primary"
style=
"margin-right: 50px"
@
click=
"submit"
>
提交
</a-button>
</a-col>
</a-row>
</a-form-model>
</a-spin>
</div>
</
template
>
<
script
>
import
{
isEmptyParams
,
checkEmail
,
checkPhone
,
checkIdentitytionId
,
personBirthday
,
personGender
}
from
"@/views/utils/common"
import
{
isIdentityId
}
from
'@/views/utils/validate'
import
moment
from
'moment'
import
specSelect
from
'@/views/expert/components/specSelect'
import
unitSelect
from
'@/views/components/common/unitSelect'
import
unitTreeSelect
from
'@/views/components/common/unitTreeSelect'
export
default
{
name
:
'expertEdit'
,
components
:
{
unitSelect
,
specSelect
,
unitTreeSelect
},
data
()
{
return
{
loading
:
true
,
isShow
:
false
,
formData
:
{
id
:
null
,
personName
:
null
,
sex
:
''
,
birthday
:
null
,
certId
:
null
,
mobile
:
null
,
remark
:
null
,
email
:
null
,
title
:
null
,
auditSpecList
:
[],
treeCode
:
null
},
rules
:
{
certId
:
[
{
required
:
true
,
message
:
'请输入证件号'
,
trigger
:
'blur'
},
{
validator
:
(
rule
,
value
,
callback
)
=>
{
if
(
value
==
''
||
value
==
undefined
)
{
callback
()
}
var
errorMsg
=
isIdentityId
(
value
);
if
(
errorMsg
!=
""
)
{
callback
(
new
Error
(
errorMsg
));
}
else
{
let
pars
=
{
certId
:
this
.
formData
.
certId
,
id
:
this
.
formData
.
id
}
this
.
$api
.
expert
.
expertIsExist
(
pars
).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
callback
(
new
Error
(
"专家已存在"
));
}
else
{
this
.
formData
.
sex
=
personGender
(
this
.
formData
.
certId
)
this
.
formData
.
birthday
=
personBirthday
(
this
.
formData
.
certId
)
+
' 00:00:00'
callback
()
}
})
}
}
}
],
mobile
:
[
{
required
:
true
,
message
:
'请输入手机号'
,
trigger
:
'blur'
},
{
required
:
true
,
validator
:
checkPhone
,
trigger
:
'blur'
}
],
email
:
[
{
required
:
false
,
message
:
'请输入邮箱'
,
trigger
:
'blur'
},
{
required
:
false
,
validator
:
checkEmail
,
trigger
:
'blur'
}
],
personName
:
[{
required
:
true
,
message
:
'请输入姓名'
,
trigger
:
'blur'
}],
// sex: [{ required: true, message: '请选择性别', trigger: 'change' }],
auditSpecList
:
[{
required
:
true
,
message
:
'请选择评审专业'
,
trigger
:
'change'
}],
title
:
[{
required
:
true
,
message
:
'请选择职称'
,
trigger
:
'change'
}],
// treeCode: [{ required: false, message: '请选择单位', trigger: 'change' }],
remark
:
[{
required
:
false
,
message
:
'请输入备注'
,
trigger
:
'blur'
}],
},
}
},
props
:
{
value
:
{
type
:
String
,
default
:
()
=>
{
return
null
}
},
},
created
()
{
let
user
=
JSON
.
parse
(
window
.
sessionStorage
.
getItem
(
'user'
))
if
(
user
&&
user
.
roles
)
{
if
(
user
.
roles
.
indexOf
(
"0"
)
!=
-
1
)
{
this
.
isShow
=
true
}
}
if
(
this
.
value
)
this
.
getExpertById
()
else
this
.
loading
=
false
},
methods
:
{
moment
,
getExpertById
()
{
this
.
$api
.
expert
.
getExpertById
({
id
:
this
.
value
}).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
formData
=
data
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
},
submit
()
{
this
.
$refs
.
form
.
validate
(
valid
=>
{
if
(
valid
)
{
this
.
loading
=
true
let
pars
=
isEmptyParams
(
this
.
formData
)
let
par
=
{
...
pars
}
if
(
!!!
this
.
formData
.
id
)
{
this
.
$api
.
expert
.
insert
(
par
).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
$message
.
success
(
'成功!'
)
this
.
$emit
(
'close'
,
'edit'
)
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
}
else
{
this
.
$api
.
expert
.
update
(
par
).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
$message
.
success
(
'成功!'
)
this
.
$emit
(
'close'
,
'edit'
)
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
}
}
else
{
return
false
}
})
},
}
}
</
script
>
\ No newline at end of file
src/views/report/expert/components/expertImport.vue
deleted
100644 → 0
View file @
59c21d3a
<
template
>
<div
class=
"app-content"
style=
"height:75vh;overflow: auto;"
>
<div
class=
"submit-btn upload-header"
>
<a
:href=
"url.downloadUrl"
download=
"ExpertInfo.xlsx"
>
<a-icon
type=
"download"
></a-icon>
<span
style=
"color:green;text-decoration:underline;"
>
模板下载
</span>
</a>
<FileUpload
@
beforeUpload=
"beforeUpload"
/>
<a-divider
style=
"height: 1px; background-color: #e8e8e8;"
/>
</div>
<a-divider
style=
"height: 1px; background-color: #e8e8e8;"
/>
<div
class=
"upload-table"
>
<a-table
:dataSource=
"tableData"
:columns=
"columns"
rowKey=
"index"
:pagination=
"false"
:loading=
"loading"
>
<template
slot=
"stateSwitch"
slot-scope=
"record"
>
<a-switch
checked-children=
"正常"
un-checked-children=
"注销"
:checked=
"checkedState(record)"
@
change=
"switchChange($event, record)"
/>
</
template
>
<
template
slot=
"option"
slot-scope=
"record"
>
<a-button
type=
"primary"
size=
"small"
@
click=
"recordClick(record, 'view')"
>
查看
</a-button>
<a-button
type=
"primary"
size=
"small"
@
click=
"recordClick(record, 'edit')"
>
修改
</a-button>
<a-button
type=
"primary"
size=
"small"
@
click=
"recordClick(record, 'reset')"
>
重置密码
</a-button>
</
template
>
</a-table>
</div>
<div
class=
"upload-bottom"
style=
"text-align:center;padding:6px 0"
>
<a-button
type=
"primary"
@
click=
"dataImport"
:disabled=
"disabled"
>
导入
</a-button>
</div>
</div>
</template>
<
script
>
import
{
isEmptyParams
,
readExcelFile
,
personGender
,
personBirthday
,
checkIdentitytionId
,
checkEmail
,
checkPhone
}
from
"@/views/utils/common"
import
moment
from
"moment"
export
default
{
name
:
"expertImport"
,
data
()
{
return
{
columns
:
[
{
title
:
"姓名"
,
dataIndex
:
"personName"
,
align
:
'center'
},
{
title
:
"证件号"
,
dataIndex
:
"certId"
,
align
:
'center'
},
// { title: "性别", dataIndex: "sex" },
// { title: "出生日期", dataIndex: 'birthday' },
{
title
:
"手机号"
,
dataIndex
:
"mobile"
,
align
:
'center'
},
{
title
:
"邮箱"
,
dataIndex
:
"email"
,
align
:
'center'
},
{
title
:
"职称"
,
dataIndex
:
"titleName"
,
align
:
'center'
},
{
title
:
"专业"
,
dataIndex
:
"specName"
,
align
:
'center'
},
{
title
:
'单位'
,
dataIndex
:
'unitName'
,
align
:
'center'
},
],
tableData
:
[],
disabled
:
true
,
loading
:
false
,
url
:
{
downloadUrl
:
'/downloadFile/ExpertInfo.xlsx'
,
}
};
},
created
()
{
},
methods
:
{
beforeUpload
(
file
)
{
this
.
tableData
=
[]
let
list
=
readExcelFile
(
file
,
0
)
let
certList
=
[]
let
mobileList
=
[]
let
exportList
=
[]
list
.
then
((
d
)
=>
{
//读取文件数据
d
.
forEach
(
e
=>
{
let
gender
=
personGender
(
e
.
证件号
)
let
birthday
=
personBirthday
(
e
.
证件号
)
+
' 00:00:00'
let
expert
=
{
personName
:
e
.
姓名
,
certId
:
e
.
证件号
,
sex
:
gender
,
birthday
:
moment
(
birthday
).
format
(
'YYYY-MM-DD HH:mm:ss'
),
mobile
:
e
.
手机号
,
email
:
e
.
邮箱
,
specName
:
e
.
专业
,
titleName
:
e
.
职称
,
unitName
:
e
.
单位
}
exportList
.
push
(
expert
)
certList
.
push
(
e
.
证件号
)
mobileList
.
push
(
e
.
手机号
)
})
let
uniqueMobileList
=
[...
new
Set
(
mobileList
)]
if
(
uniqueMobileList
.
length
!=
exportList
.
length
)
{
this
.
$message
.
error
(
'手机号出现重复!'
)
return
false
}
let
uniqueCertList
=
[...
new
Set
(
certList
)]
if
(
uniqueCertList
.
length
!=
exportList
.
length
)
{
this
.
$message
.
error
(
'证件号出现重复!'
)
return
false
}
if
(
exportList
.
length
>
0
)
{
this
.
tableData
=
exportList
this
.
disabled
=
false
}
})
return
false
},
dataImport
()
{
if
(
this
.
tableData
.
length
==
0
)
{
this
.
$message
.
error
(
'请选择Excel!'
)
return
}
let
pars
=
isEmptyParams
(
this
.
tableData
)
let
par
=
{
...
pars
}
this
.
$api
.
expert
.
expertImport
(
this
.
tableData
).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
$message
.
info
(
data
)
this
.
tableData
=
[]
}
})
}
},
};
</
script
>
<
style
scoped
lang=
"less"
>
.upload-header {
height: 30px;
}
.upload-table {
min-height: 150px;
max-height: calc(100% - 75px);
overflow-y: auto;
}
.upload-bottom {
height: 42px;
}
</
style
>
src/views/report/expert/components/expertView.vue
deleted
100644 → 0
View file @
59c21d3a
<
template
>
<div
class=
"from-table"
style=
"height:280px;overflow:auto;"
>
<a-spin
:spinning=
"loading"
style=
"width: 100%;height: 100%;"
>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
姓名:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
personName
}}
</a-col>
<a-col
:span=
"4"
class=
"bg-gray"
>
证件号:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
certId
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
性别:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
sex
}}
</a-col>
<a-col
:span=
"4"
class=
"bg-gray"
>
职称:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
titleName
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
联系电话:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
mobile
}}
</a-col>
<a-col
:span=
"4"
class=
"bg-gray"
>
邮箱:
</a-col>
<a-col
:span=
"8"
>
{{
expertInfo
.
email
}}
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
专业:
</a-col>
<a-col
:span=
"20"
>
<a-tag
v-for=
"data in expertInfo.specList"
:key=
"data.id"
:color=
"'green'"
>
{{
data
.
specName
}}
</a-tag>
</a-col>
</a-row>
<a-row>
<a-col
:span=
"4"
class=
"bg-gray"
>
工作单位:
</a-col>
<a-col
:span=
"20"
>
{{
expertInfo
.
workUnit
}}
</a-col>
</a-row>
</a-spin>
</div>
</
template
>
<
script
>
import
moment
from
'moment'
export
default
{
name
:
"expertView"
,
data
()
{
return
{
expertInfo
:
{
id
:
''
,
certId
:
''
,
sex
:
''
,
birthday
:
null
,
mobile
:
''
,
email
:
''
,
title
:
''
,
unitId
:
null
,
degree
:
null
,
spec
:
null
,
address
:
''
},
loading
:
true
}
},
props
:
{
value
:
{
type
:
String
,
default
:
()
=>
{
return
null
}
},
obj
:
{
type
:
Object
}
},
created
()
{
this
.
getExpertById
()
},
methods
:
{
moment
,
getExpertById
()
{
let
pars
=
{
id
:
this
.
value
}
this
.
$api
.
expert
.
getExpertById
(
pars
).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
expertInfo
=
data
}
this
.
loading
=
false
}).
catch
(()
=>
{
this
.
loading
=
false
})
}
}
}
</
script
>
\ No newline at end of file
src/views/report/expert/components/specSelect.vue
deleted
100644 → 0
View file @
59c21d3a
<
template
>
<div
style=
"width:auto;display:inline-block !important; display:inline;"
>
<a-select
mode=
"tags"
v-model=
"selected"
style=
"width: 400px"
@
change=
"onChange"
showArrow
allowClear
>
<a-select-opt-group
v-for=
"item in selectArray"
:key=
"item.key"
>
<span
slot=
"label"
>
<a-icon
type=
"bars"
/>
{{
item
.
title
}}
</span>
<a-select-option
v-for=
"arr in item.children"
:key=
"arr.key"
:value=
"arr.key"
>
{{
arr
.
title
}}
</a-select-option>
</a-select-opt-group>
</a-select>
</div>
</
template
>
<
script
>
// 用法
<
spec
-
select
v
-
model
=
"formData.projClass"
/>
export
default
{
name
:
"SpecSelect"
,
data
()
{
return
{
selectArray
:
[],
selected
:
[],
loadState
:
false
,
};
},
props
:
{
value
:
null
,
width
:
{
type
:
Number
,
default
()
{
return
180
}
}
},
created
()
{
this
.
load
(
this
.
value
)
},
methods
:
{
load
(
value
)
{
if
(
this
.
selectArray
.
length
>
0
)
{
this
.
selected
=
value
}
else
{
this
.
$api
.
parameter
.
getArrayListByType
({
typeId
:
56
}).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
selectArray
=
data
this
.
selected
=
value
}
}).
catch
(()
=>
{
})
}
},
onChange
()
{
if
(
this
.
selected
.
length
>
3
)
{
this
.
$message
.
error
(
'最多只能选三个专业'
)
this
.
selected
=
this
.
selected
.
splice
(
0
,
3
)
}
this
.
$emit
(
"input"
,
this
.
selected
);
this
.
$emit
(
"change"
);
},
},
watch
:
{
value
:
{
handler
(
value
)
{
if
(
!
this
.
loadState
)
{
this
.
load
(
value
)
this
.
loadState
=
true
}
}
},
},
};
</
script
>
src/views/report/expert/index.vue
deleted
100644 → 0
View file @
59c21d3a
This diff is collapsed.
Click to expand it.
src/views/report/project/Index.vue
View file @
b56a1391
...
...
@@ -75,7 +75,7 @@ import projectEditKey from "@/views/report/project/components/keyProject/project
import
projectView
from
'@/views/report/project/components/projectView'
import
previewFile
from
'@/views/components/common/previewFile'
import
knowledgeSelect
from
'@/views/components/common/knowledgeSelect'
import
personInfoEdit
from
'@/views/basicSetting/person/
index
'
import
personInfoEdit
from
'@/views/basicSetting/person/
edit
'
import
axios
from
'axios'
...
...
src/views/report/project/components/projectEdit.vue
View file @
b56a1391
...
...
@@ -644,6 +644,7 @@ const projectKPI = {
threeLevel
:
[],
kpiList
:
[],
};
import
cascaderSelect
from
'@/views/components/common/cascaderSelect'
export
default
{
name
:
'projectEdit'
,
...
...
src/views/statistic/project/Index.vue
View file @
b56a1391
...
...
@@ -23,9 +23,6 @@
<a-form-item>
<base-select
v-model=
"searchForm.projState"
:title=
"'项目状态'"
:type=
"1"
:isAll=
"true"
:width=
"160"
/>
</a-form-item>
<a-form-item>
<para-multi-select
v-model=
"searchForm.knowledgeId"
@
parentChange=
"parChange"
:title=
"'学科'"
:objType=
"'project'"
:typeId=
"57"
:width=
"150"
/>
</a-form-item>
<a-form-item>
<a-button
type=
"primary"
icon=
"search"
@
click=
"search"
>
搜索
</a-button>
<a-button
icon=
"reload"
style=
"margin-left: 10px"
@
click=
"reset"
class=
"bt-normal"
>
重置
</a-button>
...
...
static/css/antd.css
View file @
b56a1391
...
...
@@ -3136,9 +3136,9 @@ html {
}
.ant-select-dropdown-menu-item-group-title
{
height
:
32px
;
/* height: 32px; */
padding
:
0
12px
;
color
:
rgba
(
0
,
0
,
0
,
0.45
);
/* color: rgba(0, 0, 0, 0.45); */
font-size
:
12px
;
line-height
:
32px
;
}
...
...
@@ -3155,7 +3155,7 @@ html {
overflow
:
hidden
;
color
:
rgba
(
0
,
0
,
0
,
0.65
);
font-weight
:
normal
;
font-size
:
1
4
px
;
font-size
:
1
3
px
;
line-height
:
22px
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
...
...
static/css/common.less
View file @
b56a1391
...
...
@@ -658,4 +658,9 @@
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
}
\ No newline at end of file
}
.spac_comp {
.spac-comp-title {
color: rgba(0, 0, 0, 0.65);
}
}
\ 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