Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
T
TrainSys
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
苏州培训方案
TrainSys
提交
fe47d326
提交
fe47d326
编写于
4月 14, 2023
作者:
ibizdev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lxm1993 发布系统代码 [TrainSys,网页端]
上级
939cbfdf
变更
17
展开全部
显示空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
657 行增加
和
249 行删除
+657
-249
package.json
app_Web/package.json
+6
-6
pnpm-lock.yaml
app_Web/pnpm-lock.yaml
+37
-37
bg.png
app_Web/public/assets/img/user-login/bg.png
+0
-0
jcy.svg
app_Web/public/assets/img/user-login/jcy.svg
+14
-0
jh.png
app_Web/public/assets/img/user-login/jh.png
+0
-0
psd.svg
app_Web/public/assets/img/user-login/psd.svg
+16
-0
right.png
app_Web/public/assets/img/user-login/right.png
+0
-0
usn.svg
app_Web/public/assets/img/user-login/usn.svg
+17
-0
app-register.ts
app_Web/src/app-register.ts
+9
-0
app-login-view.tsx
...c/components/login-view/app-login-view/app-login-view.tsx
+167
-0
kq-login-view.scss
...rc/components/login-view/kq-login-view/kq-login-view.scss
+125
-0
kq-login-view.tsx
...src/components/login-view/kq-login-view/kq-login-view.tsx
+180
-0
grid-view.tsx
app_Web/src/components/views/grid-view/grid-view.tsx
+1
-0
tab-exp-view.scss
app_Web/src/components/views/tab-exp-view/tab-exp-view.scss
+3
-2
grid-control.tsx
app_Web/src/components/widgets/grid-control/grid-control.tsx
+55
-18
login-view.tsx
app_Web/src/views/login-view/login-view.tsx
+3
-162
yarn.lock
app_Web/yarn.lock
+24
-24
未找到文件。
app_Web/package.json
浏览文件 @
fe47d326
...
@@ -13,13 +13,13 @@
...
@@ -13,13 +13,13 @@
"dependencies"
:
{
"dependencies"
:
{
"@floating-ui/dom"
:
"^1.0.11"
,
"@floating-ui/dom"
:
"^1.0.11"
,
"@ibiz-template/command"
:
"^0.0.1-beta.50"
,
"@ibiz-template/command"
:
"^0.0.1-beta.50"
,
"@ibiz-template/controller"
:
"^0.0.1-beta.6
1
"
,
"@ibiz-template/controller"
:
"^0.0.1-beta.6
2
"
,
"@ibiz-template/core"
:
"^0.0.1-beta.
57
"
,
"@ibiz-template/core"
:
"^0.0.1-beta.
62
"
,
"@ibiz-template/model"
:
"^0.0.1-beta.6
1
"
,
"@ibiz-template/model"
:
"^0.0.1-beta.6
2
"
,
"@ibiz-template/runtime"
:
"^0.0.1-beta.6
1
"
,
"@ibiz-template/runtime"
:
"^0.0.1-beta.6
2
"
,
"@ibiz-template/service"
:
"^0.0.1-beta.6
1
"
,
"@ibiz-template/service"
:
"^0.0.1-beta.6
2
"
,
"@ibiz-template/theme"
:
"^0.0.1-beta.59"
,
"@ibiz-template/theme"
:
"^0.0.1-beta.59"
,
"@ibiz-template/vue-util"
:
"^0.0.1-beta.6
1
"
,
"@ibiz-template/vue-util"
:
"^0.0.1-beta.6
2
"
,
"@ibiz/dynamic-model-api"
:
"^2.1.17"
,
"@ibiz/dynamic-model-api"
:
"^2.1.17"
,
"@riophae/vue-treeselect"
:
"^0.4.0"
,
"@riophae/vue-treeselect"
:
"^0.4.0"
,
"dayjs"
:
"^1.11.7"
,
"dayjs"
:
"^1.11.7"
,
...
...
app_Web/pnpm-lock.yaml
浏览文件 @
fe47d326
此差异已折叠。
点击以展开。
app_Web/public/assets/img/user-login/bg.png
0 → 100644
浏览文件 @
fe47d326
765.0 KB
app_Web/public/assets/img/user-login/jcy.svg
0 → 100644
浏览文件 @
fe47d326
<?xml version="1.0" encoding="UTF-8"?>
<svg
width=
"18px"
height=
"18px"
viewBox=
"0 0 18 18"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
>
<title>
检察院
</title>
<g
id=
"Page-1"
stroke=
"none"
stroke-width=
"1"
fill=
"none"
fill-rule=
"evenodd"
>
<g
id=
"登录"
transform=
"translate(-380.000000, -403.000000)"
fill-rule=
"nonzero"
>
<g
id=
"编组-4"
transform=
"translate(380.000000, 401.000000)"
>
<g
id=
"检察院"
transform=
"translate(0.000000, 2.000000)"
>
<rect
id=
"Rectangle"
fill=
"#000000"
opacity=
"0"
x=
"0"
y=
"0"
width=
"18"
height=
"18"
></rect>
<path
d=
"M15.7148438,8.12109375 C16.2580078,8.12109375 16.4847656,7.42324219 16.0435547,7.1015625 L9.33046875,2.21835937 C9.13373237,2.07421898 8.86626763,2.07421898 8.66953125,2.21835937 L1.95644531,7.1015625 C1.51523438,7.42148438 1.74199219,8.12109375 2.28691406,8.12109375 L3.375,8.12109375 L3.375,14.6953125 L2.109375,14.6953125 C2.03203125,14.6953125 1.96875,14.7585938 1.96875,14.8359375 L1.96875,15.75 C1.96875,15.8273438 2.03203125,15.890625 2.109375,15.890625 L15.890625,15.890625 C15.9679688,15.890625 16.03125,15.8273438 16.03125,15.75 L16.03125,14.8359375 C16.03125,14.7585938 15.9679688,14.6953125 15.890625,14.6953125 L14.625,14.6953125 L14.625,8.12109375 L15.7148438,8.12109375 Z M6.69726562,14.6953125 L4.640625,14.6953125 L4.640625,8.12109375 L6.69726562,8.12109375 L6.69726562,14.6953125 Z M10.0195312,14.6953125 L7.96289062,14.6953125 L7.96289062,8.12109375 L10.0195312,8.12109375 L10.0195312,14.6953125 Z M13.359375,14.6953125 L11.2851562,14.6953125 L11.2851562,8.12109375 L13.359375,8.12109375 L13.359375,14.6953125 Z"
id=
"Shape"
fill=
"#B8B8B8"
></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
app_Web/public/assets/img/user-login/jh.png
0 → 100644
浏览文件 @
fe47d326
34.1 KB
app_Web/public/assets/img/user-login/psd.svg
0 → 100644
浏览文件 @
fe47d326
<?xml version="1.0" encoding="UTF-8"?>
<svg
width=
"13px"
height=
"17px"
viewBox=
"0 0 13 17"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
>
<title>
密码
</title>
<g
id=
"Page-1"
stroke=
"none"
stroke-width=
"1"
fill=
"none"
fill-rule=
"evenodd"
>
<g
id=
"登录"
transform=
"translate(-383.000000, -627.000000)"
fill=
"#B8B8B8"
fill-rule=
"nonzero"
>
<g
id=
"编组-4"
transform=
"translate(380.000000, 401.000000)"
>
<g
id=
"编组-2"
transform=
"translate(0.000000, 224.000000)"
>
<g
id=
"密码"
transform=
"translate(0.000000, 2.000000)"
>
<rect
id=
"矩形"
opacity=
"0"
x=
"0"
y=
"0"
width=
"18"
height=
"18"
></rect>
<path
d=
"M13.5162,7.43076 L6.54012,7.43076 C6.66,6.41988 5.78988,2.31012 9.0036,2.21004 C12.05928,2.09412 11.58372,5.96016 11.58372,5.96016 L13.08024,5.97024 C13.08024,5.97024 13.51512,0.79524 9.0036,0.77004 C4.07988,1.01988 5.23512,6.63012 5.085,7.43076 C5.11992,7.43076 5.16528,7.43076 5.21316,7.43076 C4.23072,7.43076 3.43404,8.2278 3.43404,9.20988 L3.43404,15.14052 C3.43404,16.12296 4.23108,16.91964 5.21316,16.91964 L13.5162,16.91964 C14.49864,16.91964 15.29532,16.1226 15.29532,15.14052 L15.29532,9.20988 C15.29532,8.2278 14.49828,7.43076 13.5162,7.43076 Z M9.9576,12.60396 L9.9576,13.95468 C9.9576,14.2812 9.6912,14.5476 9.36468,14.5476 C9.03816,14.5476 8.77176,14.2812 8.77176,13.95468 L8.77176,12.60396 C8.4186,12.3984 8.17884,12.02004 8.17884,11.58228 C8.17884,10.92708 8.70984,10.39608 9.36504,10.39608 C10.02024,10.39608 10.55124,10.92708 10.55124,11.58228 C10.55088,12.02004 10.31112,12.3984 9.9576,12.60396 Z"
id=
"形状"
></path>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
app_Web/public/assets/img/user-login/right.png
0 → 100644
浏览文件 @
fe47d326
445.8 KB
app_Web/public/assets/img/user-login/usn.svg
0 → 100644
浏览文件 @
fe47d326
<?xml version="1.0" encoding="UTF-8"?>
<svg
width=
"14px"
height=
"16px"
viewBox=
"0 0 14 16"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
>
<title>
用户名
</title>
<g
id=
"Page-1"
stroke=
"none"
stroke-width=
"1"
fill=
"none"
fill-rule=
"evenodd"
>
<g
id=
"登录"
transform=
"translate(-382.000000, -516.000000)"
fill=
"#B8B8B8"
fill-rule=
"nonzero"
>
<g
id=
"编组-4"
transform=
"translate(380.000000, 401.000000)"
>
<g
id=
"编组-2"
transform=
"translate(0.000000, 112.000000)"
>
<g
id=
"用户名"
transform=
"translate(0.000000, 2.000000)"
>
<rect
id=
"矩形"
opacity=
"0"
x=
"0"
y=
"0"
width=
"18"
height=
"18"
></rect>
<path
d=
"M12.501,4.698 C12.501,6.624 11.565,9.513 9,9.513 C6.435,9.513 5.499,6.624 5.499,4.698 C5.499,2.772 7.065,1.215 9,1.215 C10.935,1.215 12.501,2.772 12.501,4.698 Z"
id=
"路径"
></path>
<path
d=
"M15.39,15.147 C15.39,16.803 12.528,16.7850081 9,16.7850081 C5.472,16.7850081 2.61,16.803 2.61,15.147 C2.61,12.762 4.635,10.764 7.38,10.188 C7.731,10.134 7.947,9.423 7.731,9.234 C7.947,8.937 8.775,8.487 8.991,8.487 C9.225,8.487 10.026,8.91 10.251,9.243 C10.053,9.531 10.251,10.125 10.611,10.188 C13.365,10.764 15.39,12.762 15.39,15.147 L15.39,15.147 Z"
id=
"路径"
></path>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
app_Web/src/app-register.ts
浏览文件 @
fe47d326
...
@@ -221,5 +221,14 @@ export const AppRegister = {
...
@@ -221,5 +221,14 @@ export const AppRegister = {
v
.
component
(
'IBizGridRadio'
,
IBizGridRadio
);
v
.
component
(
'IBizGridRadio'
,
IBizGridRadio
);
v
.
component
(
'IBizGridPicker'
,
IBizGridPicker
);
v
.
component
(
'IBizGridPicker'
,
IBizGridPicker
);
v
.
component
(
'ExpViewBase'
,
ExpViewBase
);
v
.
component
(
'ExpViewBase'
,
ExpViewBase
);
// 注册登录视图组件
v
.
component
(
'AppLoginView'
,
()
=>
import
(
'./components/login-view/app-login-view/app-login-view'
),
);
v
.
component
(
'KqLoginView'
,
()
=>
import
(
'./components/login-view/kq-login-view/kq-login-view'
),
);
},
},
};
};
app_Web/src/components/login-view/app-login-view/app-login-view.tsx
0 → 100644
浏览文件 @
fe47d326
import
{
CoreConst
}
from
'@ibiz-template/core'
;
import
{
defineComponent
,
getCurrentInstance
,
onMounted
,
reactive
,
ref
,
}
from
'vue'
;
import
{
clearCookie
,
setCookie
}
from
'qx-util'
;
import
{
useNamespace
,
useRoute
}
from
'@ibiz-template/vue-util'
;
import
router
from
'@/router'
;
import
'@ibiz-template/theme/style/components/views/login-view/login-view.scss'
;
interface
LoginData
{
username
:
string
;
password
:
string
;
}
const
rules
=
{
username
:
[
{
required
:
true
,
message
:
'请输入账号'
,
trigger
:
'blur'
,
},
],
password
:
[
{
required
:
true
,
message
:
'请输入密码'
,
trigger
:
'blur'
,
},
{
type
:
'string'
,
min
:
6
,
message
:
'密码长度不能少于6位'
,
trigger
:
'blur'
,
},
],
};
export
default
defineComponent
({
setup
()
{
const
ns
=
useNamespace
(
'login-view'
);
const
loginData
=
reactive
<
LoginData
>
({
username
:
''
,
password
:
''
,
});
const
formRef
=
ref
<
IData
|
null
>
(
null
);
const
instance
=
getCurrentInstance
()
!
;
const
route
=
useRoute
(
instance
.
proxy
);
const
ru
=
(
route
.
query
.
ru
as
string
)
||
'/'
;
ibiz
.
appData
=
undefined
;
ibiz
.
orgData
=
undefined
;
onMounted
(()
=>
{
setTimeout
(()
=>
{
const
el
=
document
.
querySelector
(
'.app-loading-x'
)
as
HTMLDivElement
;
if
(
el
)
{
el
.
style
.
display
=
'none'
;
}
},
300
);
});
const
loading
=
ref
(
false
);
const
onClick
=
()
=>
{
formRef
.
value
!
.
validate
(
async
(
valid
:
boolean
)
=>
{
if
(
valid
)
{
try
{
loading
.
value
=
true
;
clearCookie
(
CoreConst
.
TOKEN
,
true
);
const
res
=
await
ibiz
.
auth
.
v7login
(
loginData
.
username
,
loginData
.
password
,
);
if
(
res
.
ok
)
{
const
{
data
}
=
res
;
if
(
data
&&
data
.
token
)
{
setCookie
(
CoreConst
.
TOKEN
,
data
.
token
,
0
,
true
);
const
expiredDate
=
new
Date
().
getTime
()
+
(
data
.
expirein
||
7199
)
*
1000
;
setCookie
(
CoreConst
.
TOKEN_EXPIRES
,
`
${
expiredDate
}
`
,
0
,
true
);
router
.
push
({
path
:
ru
});
return
;
}
}
ibiz
.
notification
.
error
({
title
:
res
.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
catch
(
error
)
{
ibiz
.
notification
.
error
({
title
:
(
error
as
IData
).
response
?.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
}
});
};
return
()
=>
(
<
div
class=
{
ns
.
b
()
}
>
<
div
class=
{
ns
.
b
(
'box'
)
}
>
<
header
class=
{
ns
.
b
(
'box-header'
)
}
>
<
img
src=
'./assets/img/login-header.png'
/>
</
header
>
<
main
class=
{
ns
.
b
(
'box-main'
)
}
>
<
img
class=
{
ns
.
be
(
'box-main'
,
'avatar'
)
}
src=
'./assets/img/login-avatar.png'
/>
<
div
class=
{
ns
.
b
(
'box-main-content'
)
}
>
<
i
-
form
ref=
{
formRef
}
props=
{
{
model
:
loginData
,
rules
}
}
>
<
i
-
form
-
item
prop=
'username'
>
<
i
-
input
type=
'text'
value=
{
loginData
.
username
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
username
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入账号'
size=
'large'
>
<
i
-
icon
type=
'md-person'
slot=
'prefix'
></
i
-
icon
>
</
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
prop=
'password'
>
<
i
-
input
type=
'password'
value=
{
loginData
.
password
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
password
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入密码'
size=
'large'
password
>
<
i
-
icon
type=
'ios-unlock'
slot=
'prefix'
></
i
-
icon
>
</
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
>
<
i
-
button
shape=
'circle'
loading=
{
loading
.
value
}
long
on
-
click=
{
onClick
}
>
登录
</
i
-
button
>
</
i
-
form
-
item
>
</
i
-
form
>
</
div
>
</
main
>
</
div
>
</
div
>
);
},
});
app_Web/src/components/login-view/kq-login-view/kq-login-view.scss
0 → 100644
浏览文件 @
fe47d326
.ibiz-kq-login-view
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
width
:
100vw
;
height
:
100vh
;
background-image
:
url('/assets/img/user-login/bg.png')
;
background-repeat
:
no-repeat
;
background-size
:
100%
100%
;
.ibiz-kq-login-view-box
{
display
:
flex
;
width
:
68%
;
height
:
76%
;
.ibiz-kq-login-view-box-left
{
width
:
50%
;
height
:
100%
;
padding
:
8%
6%
;
background-color
:
#fff
;
border-radius
:
16px
0
0
16px
;
.ibiz-kq-login-view-box-left-top
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
margin-bottom
:
12%
;
.ibiz-kq-login-view-box-left-top-jh
{
display
:
inline-block
;
width
:
78px
;
height
:
78px
;
margin-right
:
13px
;
}
.ibiz-kq-login-view-box-left-top-text
{
font-family
:
MicrosoftYaHei-Bold
,
MicrosoftYaHei
,
sans-serif
;
font-size
:
32px
;
font-weight
:
bold
;
color
:
#0080cc
;
text-align
:
center
;
letter-spacing
:
4px
;
}
}
.ibiz-kq-login-view-main-content
{
.ivu-form-item
{
.ivu-form-item-content
{
.ibiz-kq-login-view-form-label
{
display
:
flex
;
align-items
:
center
;
margin-bottom
:
10px
;
.ibiz-kq-login-view-form-label-text
{
display
:
inline-block
;
margin-left
:
5px
;
font-family
:
PingFangSC-Regular
,
'PingFang SC'
,
sans-serif
;
font-size
:
20px
;
font-weight
:
400
;
color
:
#666
;
}
}
.ivu-input
{
height
:
56px
;
padding
:
17px
18px
;
background
:
#fafafa
;
border-radius
:
4px
;
box-shadow
:
inset
0
0
2px
0
rgb
(
0
0
0
/
50%
);
&
:
:
placeholder
{
font-family
:
PingFangSC-Regular
,
'PingFang SC'
,
sans-serif
;
font-size
:
20px
;
color
:
#999
;
}
}
.ivu-input-suffix
i
{
line-height
:
56px
;
}
}
}
.ibiz-kq-login-view-buttons
{
margin-top
:
61px
;
.ivu-form-item-content
{
display
:
flex
;
justify-content
:
space-between
;
.ivu-btn
{
width
:
48%
;
height
:
48px
;
font-family
:
PingFangSC-Semibold
,
'PingFang SC'
,
sans-serif
;
font-size
:
20px
;
font-weight
:
600
;
letter-spacing
:
6px
;
border-radius
:
4px
;
&
:nth-child
(
1
)
{
color
:
#fff
;
background-color
:
#0080cc
;
}
&
:nth-child
(
2
)
{
color
:
#666
;
background-color
:
#fafafa
;
}
}
}
}
}
}
.ibiz-kq-login-view-box-right
{
width
:
50%
;
height
:
100%
;
>
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
app_Web/src/components/login-view/kq-login-view/kq-login-view.tsx
0 → 100644
浏览文件 @
fe47d326
import
{
CoreConst
}
from
'@ibiz-template/core'
;
import
{
defineComponent
,
getCurrentInstance
,
onMounted
,
reactive
,
ref
,
}
from
'vue'
;
import
{
clearCookie
,
setCookie
}
from
'qx-util'
;
import
{
useNamespace
,
useRoute
,
useRouter
}
from
'@ibiz-template/vue-util'
;
import
'./kq-login-view.scss'
;
interface
LoginData
{
username
:
string
;
password
:
string
;
}
const
rules
=
{
username
:
[
{
required
:
true
,
message
:
'请输入账号'
,
trigger
:
'blur'
,
},
],
password
:
[
{
required
:
true
,
message
:
'请输入密码'
,
trigger
:
'blur'
,
},
{
type
:
'string'
,
min
:
6
,
message
:
'密码长度不能少于6位'
,
trigger
:
'blur'
,
},
],
};
export
default
defineComponent
({
setup
()
{
const
ns
=
useNamespace
(
'kq-login-view'
);
const
loginData
=
reactive
<
LoginData
>
({
username
:
''
,
password
:
''
,
});
const
formRef
=
ref
<
IData
|
null
>
(
null
);
const
instance
=
getCurrentInstance
()
!
;
const
route
=
useRoute
(
instance
.
proxy
);
const
router
=
useRouter
(
instance
.
proxy
);
const
ru
=
(
route
.
query
.
ru
as
string
)
||
'/'
;
ibiz
.
appData
=
undefined
;
ibiz
.
orgData
=
undefined
;
onMounted
(()
=>
{
setTimeout
(()
=>
{
const
el
=
document
.
querySelector
(
'.app-loading-x'
)
as
HTMLDivElement
;
if
(
el
)
{
el
.
style
.
display
=
'none'
;
}
},
300
);
});
const
loading
=
ref
(
false
);
const
onClick
=
()
=>
{
formRef
.
value
!
.
validate
(
async
(
valid
:
boolean
)
=>
{
if
(
valid
)
{
try
{
loading
.
value
=
true
;
clearCookie
(
CoreConst
.
TOKEN
,
true
);
const
res
=
await
ibiz
.
auth
.
v7login
(
loginData
.
username
,
loginData
.
password
,
);
if
(
res
.
ok
)
{
const
{
data
}
=
res
;
if
(
data
&&
data
.
token
)
{
setCookie
(
CoreConst
.
TOKEN
,
data
.
token
,
0
,
true
);
const
expiredDate
=
new
Date
().
getTime
()
+
(
data
.
expirein
||
7199
)
*
1000
;
setCookie
(
CoreConst
.
TOKEN_EXPIRES
,
`
${
expiredDate
}
`
,
0
,
true
);
router
.
push
({
path
:
ru
});
return
;
}
}
ibiz
.
notification
.
error
({
title
:
res
.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
catch
(
error
)
{
ibiz
.
notification
.
error
({
title
:
(
error
as
IData
).
response
?.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
}
});
};
const
onResetClick
=
()
=>
{
loginData
.
username
=
''
;
loginData
.
password
=
''
;
};
return
()
=>
(
<
div
class=
{
ns
.
b
()
}
>
<
div
class=
{
ns
.
b
(
'box'
)
}
>
<
div
class=
{
ns
.
b
(
'box-left'
)
}
>
<
div
class=
{
ns
.
b
(
'box-left-top'
)
}
>
<
img
class=
{
ns
.
b
(
'box-left-top-jh'
)
}
src=
'./assets/img/user-login/jh.png'
/>
<
div
class=
{
ns
.
b
(
'box-left-top-text'
)
}
>
<
div
>
江苏省检察机关
</
div
>
<
div
>
一体化考勤管理平台
</
div
>
</
div
>
</
div
>
<
div
class=
{
ns
.
b
(
'main-content'
)
}
>
<
i
-
form
ref=
{
formRef
}
props=
{
{
model
:
loginData
,
rules
}
}
>
<
i
-
form
-
item
prop=
'username'
>
<
div
class=
{
ns
.
b
(
'form-label'
)
}
>
<
img
src=
'./assets/img/user-login/usn.svg'
/>
<
span
class=
{
ns
.
b
(
'form-label-text'
)
}
>
用户名
</
span
>
</
div
>
<
i
-
input
type=
'text'
value=
{
loginData
.
username
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
username
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入用户名'
size=
'large'
></
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
prop=
'password'
>
<
div
class=
{
ns
.
b
(
'form-label'
)
}
>
<
img
src=
'./assets/img/user-login/psd.svg'
/>
<
span
class=
{
ns
.
b
(
'form-label-text'
)
}
>
密码
</
span
>
</
div
>
<
i
-
input
type=
'password'
value=
{
loginData
.
password
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
password
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入密码'
size=
'large'
password
></
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
class=
{
ns
.
b
(
'buttons'
)
}
>
<
i
-
button
loading=
{
loading
.
value
}
long
on
-
click=
{
onClick
}
>
登录
</
i
-
button
>
<
i
-
button
long
on
-
click=
{
onResetClick
}
>
重置
</
i
-
button
>
</
i
-
form
-
item
>
</
i
-
form
>
</
div
>
</
div
>
<
div
class=
{
ns
.
b
(
'box-right'
)
}
>
<
img
src=
'./assets/img/user-login/right.png'
/>
</
div
>
</
div
>
</
div
>
);
},
});
app_Web/src/components/views/grid-view/grid-view.tsx
浏览文件 @
fe47d326
...
@@ -34,6 +34,7 @@ export const GridView = defineComponent({
...
@@ -34,6 +34,7 @@ export const GridView = defineComponent({
modelData
:
grid
,
modelData
:
grid
,
context
:
this
.
c
.
context
,
context
:
this
.
c
.
context
,
params
:
this
.
c
.
params
,
params
:
this
.
c
.
params
,
modal
:
this
.
modal
,
'grid-row-active-mode'
:
this
.
c
.
model
.
gridRowActiveMode
,
'grid-row-active-mode'
:
this
.
c
.
model
.
gridRowActiveMode
,
},
},
on
:
{
on
:
{
...
...
app_Web/src/components/views/tab-exp-view/tab-exp-view.scss
浏览文件 @
fe47d326
...
@@ -10,7 +10,7 @@
...
@@ -10,7 +10,7 @@
height
:
100%
;
height
:
100%
;
// 分页margin-bottom清除
// 分页margin-bottom清除
>
.ivu-tabs-bar
{
>
.ivu-tabs-bar
{
margin-bottom
:
0
;
margin-bottom
:
0
;
}
}
...
@@ -26,7 +26,7 @@
...
@@ -26,7 +26,7 @@
}
}
}
}
@include
e
(
tab
){
@include
e
(
tab
)
{
z-index
:
1
;
z-index
:
1
;
}
}
...
@@ -52,6 +52,7 @@
...
@@ -52,6 +52,7 @@
position
:
absolute
;
position
:
absolute
;
top
:
-50px
;
top
:
-50px
;
right
:
0
;
right
:
0
;
z-index
:
500
;
border
:
0
;
border
:
0
;
.
#{
bem
(
'view-layout-header-content'
,
'caption'
)
}
{
.
#{
bem
(
'view-layout-header-content'
,
'caption'
)
}
{
display
:
none
;
display
:
none
;
...
...
app_Web/src/components/widgets/grid-control/grid-control.tsx
浏览文件 @
fe47d326
...
@@ -4,11 +4,13 @@ import {
...
@@ -4,11 +4,13 @@ import {
defineComponent
,
defineComponent
,
getCurrentInstance
,
getCurrentInstance
,
h
,
h
,
on
M
ounted
,
on
Unm
ounted
,
PropType
,
PropType
,
Ref
,
Ref
,
ref
,
ref
,
watch
,
}
from
'vue'
;
}
from
'vue'
;
import
{
IModal
}
from
'@ibiz-template/runtime'
;
import
{
AppGridPagination
}
from
'@/components/common'
;
import
{
AppGridPagination
}
from
'@/components/common'
;
import
{
import
{
useAppGridPagination
,
useAppGridPagination
,
...
@@ -31,6 +33,7 @@ export const GridControl = defineComponent({
...
@@ -31,6 +33,7 @@ export const GridControl = defineComponent({
* @type {(number | 0 | 1 | 2)}
* @type {(number | 0 | 1 | 2)}
*/
*/
gridRowActiveMode
:
{
type
:
Number
,
default
:
2
},
gridRowActiveMode
:
{
type
:
Number
,
default
:
2
},
modal
:
{
type
:
Object
as
PropType
<
IModal
>
},
},
},
setup
(
props
)
{
setup
(
props
)
{
const
{
proxy
}
=
getCurrentInstance
()
!
;
const
{
proxy
}
=
getCurrentInstance
()
!
;
...
@@ -63,17 +66,27 @@ export const GridControl = defineComponent({
...
@@ -63,17 +66,27 @@ export const GridControl = defineComponent({
onRowClick
(
data
);
onRowClick
(
data
);
};
};
// 给到iView table组件的高度
const
tableHeight
=
ref
(
0
);
const
tableHeight
=
ref
(
0
);
// 表格外层div的引用
const
gridRef
:
Ref
<
HTMLElement
|
null
>
=
ref
(
null
);
const
gridRef
:
Ref
<
HTMLElement
|
null
>
=
ref
(
null
);
// 表格分页组件的引用
const
girdPaginationRef
:
Ref
<
InstanceType
<
const
girdPaginationRef
:
Ref
<
InstanceType
<
typeof
AppGridPagination
typeof
AppGridPagination
>
|
null
>
=
ref
(
null
);
>
|
null
>
=
ref
(
null
);
onMounted
(()
=>
{
// 浏览器ResizeObserver对象
setTimeout
(()
=>
{
let
resizeObserver
:
ResizeObserver
|
null
=
null
;
// 计算表格高度(固定头部)
if
(
gridRef
.
value
)
{
// 上次监听到的表格外层div高度,一旦发生变化就重新计算
let
lastGridHeight
=
0
;
// 计算表格高度(用于固定头部)
const
calcGridHeight
=
()
=>
{
// 不是嵌入视图里的表格才去算高度
if
(
gridRef
.
value
&&
props
.
modal
?.
mode
!==
'EMBED'
)
{
if
(
c
.
model
.
source
.
enablePagingBar
&&
girdPaginationRef
.
value
)
{
if
(
c
.
model
.
source
.
enablePagingBar
&&
girdPaginationRef
.
value
)
{
const
gridPage
=
girdPaginationRef
.
value
.
$el
as
HTMLElement
;
const
gridPage
=
girdPaginationRef
.
value
.
$el
as
HTMLElement
;
const
gridPageHeight
=
const
gridPageHeight
=
...
@@ -88,8 +101,32 @@ export const GridControl = defineComponent({
...
@@ -88,8 +101,32 @@ export const GridControl = defineComponent({
if
(
c
.
model
.
source
.
height
>
0
)
{
if
(
c
.
model
.
source
.
height
>
0
)
{
tableHeight
.
value
=
c
.
model
.
source
.
height
;
tableHeight
.
value
=
c
.
model
.
source
.
height
;
}
}
},
0
);
};
watch
(
gridRef
,
(
newVal
,
oldVal
)
=>
{
if
(
newVal
&&
newVal
!==
oldVal
)
{
calcGridHeight
();
if
(
window
.
ResizeObserver
&&
gridRef
.
value
)
{
resizeObserver
=
new
ResizeObserver
(
entries
=>
{
// 处理组件高度变化
const
height
=
entries
[
0
].
contentRect
.
height
;
if
(
height
!==
lastGridHeight
)
{
calcGridHeight
();
lastGridHeight
=
height
;
}
});
});
resizeObserver
.
observe
(
gridRef
.
value
);
}
}
});
onUnmounted
(()
=>
{
// 在组件销毁前取消 ResizeObserver 的观察
if
(
resizeObserver
)
{
resizeObserver
.
disconnect
();
}
});
return
{
return
{
c
,
c
,
ns
,
ns
,
...
...
app_Web/src/views/login-view/login-view.tsx
浏览文件 @
fe47d326
import
{
CoreConst
}
from
'@ibiz-template/core'
;
import
{
defineComponent
,
h
}
from
'vue'
;
import
{
defineComponent
,
getCurrentInstance
,
onMounted
,
reactive
,
ref
,
}
from
'vue'
;
import
{
clearCookie
,
setCookie
}
from
'qx-util'
;
import
{
useNamespace
,
useRoute
}
from
'@ibiz-template/vue-util'
;
import
router
from
'@/router'
;
import
'@ibiz-template/theme/style/components/views/login-view/login-view.scss'
;
interface
LoginData
{
username
:
string
;
password
:
string
;
}
const
rules
=
{
username
:
[
{
required
:
true
,
message
:
'请输入账号'
,
trigger
:
'blur'
,
},
],
password
:
[
{
required
:
true
,
message
:
'请输入密码'
,
trigger
:
'blur'
,
},
{
type
:
'string'
,
min
:
6
,
message
:
'密码长度不能少于6位'
,
trigger
:
'blur'
,
},
],
};
export
default
defineComponent
({
export
default
defineComponent
({
setup
()
{
setup
()
{
const
ns
=
useNamespace
(
'login-view'
);
const
loginViewName
=
ibiz
.
env
.
loginViewName
;
return
()
=>
h
(
loginViewName
);
const
loginData
=
reactive
<
LoginData
>
({
username
:
''
,
password
:
''
,
});
const
formRef
=
ref
<
IData
|
null
>
(
null
);
const
instance
=
getCurrentInstance
()
!
;
const
route
=
useRoute
(
instance
.
proxy
);
const
ru
=
(
route
.
query
.
ru
as
string
)
||
'/'
;
ibiz
.
appData
=
undefined
;
ibiz
.
orgData
=
undefined
;
onMounted
(()
=>
{
setTimeout
(()
=>
{
const
el
=
document
.
querySelector
(
'.app-loading-x'
)
as
HTMLDivElement
;
if
(
el
)
{
el
.
style
.
display
=
'none'
;
}
},
300
);
});
const
loading
=
ref
(
false
);
const
onClick
=
()
=>
{
formRef
.
value
!
.
validate
(
async
(
valid
:
boolean
)
=>
{
if
(
valid
)
{
try
{
loading
.
value
=
true
;
clearCookie
(
CoreConst
.
TOKEN
,
true
);
const
res
=
await
ibiz
.
auth
.
v7login
(
loginData
.
username
,
loginData
.
password
,
);
if
(
res
.
ok
)
{
const
{
data
}
=
res
;
if
(
data
&&
data
.
token
)
{
setCookie
(
CoreConst
.
TOKEN
,
data
.
token
,
0
,
true
);
const
expiredDate
=
new
Date
().
getTime
()
+
(
data
.
expirein
||
7199
)
*
1000
;
setCookie
(
CoreConst
.
TOKEN_EXPIRES
,
`
${
expiredDate
}
`
,
0
,
true
);
router
.
push
({
path
:
ru
});
return
;
}
}
ibiz
.
notification
.
error
({
title
:
res
.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
catch
(
error
)
{
ibiz
.
notification
.
error
({
title
:
(
error
as
IData
).
response
?.
data
?.
message
||
'登录失败'
,
});
loading
.
value
=
false
;
}
}
});
};
return
()
=>
(
<
div
class=
{
ns
.
b
()
}
>
<
div
class=
{
ns
.
b
(
'box'
)
}
>
<
header
class=
{
ns
.
b
(
'box-header'
)
}
>
<
img
src=
'./assets/img/login-header.png'
/>
</
header
>
<
main
class=
{
ns
.
b
(
'box-main'
)
}
>
<
img
class=
{
ns
.
be
(
'box-main'
,
'avatar'
)
}
src=
'./assets/img/login-avatar.png'
/>
<
div
class=
{
ns
.
b
(
'box-main-content'
)
}
>
<
i
-
form
ref=
{
formRef
}
props=
{
{
model
:
loginData
,
rules
}
}
>
<
i
-
form
-
item
prop=
'username'
>
<
i
-
input
type=
'text'
value=
{
loginData
.
username
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
username
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入账号'
size=
'large'
>
<
i
-
icon
type=
'md-person'
slot=
'prefix'
></
i
-
icon
>
</
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
prop=
'password'
>
<
i
-
input
type=
'password'
value=
{
loginData
.
password
}
on
-
on
-
change=
{
(
evt
:
InputEvent
)
=>
{
const
{
value
}
=
evt
.
target
as
HTMLInputElement
;
loginData
.
password
=
value
;
}
}
on
-
on
-
enter=
{
onClick
}
placeholder=
'请输入密码'
size=
'large'
password
>
<
i
-
icon
type=
'ios-unlock'
slot=
'prefix'
></
i
-
icon
>
</
i
-
input
>
</
i
-
form
-
item
>
<
i
-
form
-
item
>
<
i
-
button
shape=
'circle'
loading=
{
loading
.
value
}
long
on
-
click=
{
onClick
}
>
登录
</
i
-
button
>
</
i
-
form
-
item
>
</
i
-
form
>
</
div
>
</
main
>
</
div
>
</
div
>
);
},
},
});
});
app_Web/yarn.lock
浏览文件 @
fe47d326
...
@@ -651,54 +651,54 @@
...
@@ -651,54 +651,54 @@
dependencies:
dependencies:
qx-util "^0.4.8"
qx-util "^0.4.8"
"@ibiz-template/controller@^0.0.1-beta.6
1
":
"@ibiz-template/controller@^0.0.1-beta.6
2
":
version "0.0.1-beta.6
1
"
version "0.0.1-beta.6
2
"
resolved "http://npm.zhr.icu/@ibiz-template/controller/-/controller-0.0.1-beta.6
1.tgz#218bb084285710746c1bf884472a5d13d24987df
"
resolved "http://npm.zhr.icu/@ibiz-template/controller/-/controller-0.0.1-beta.6
2.tgz#0ff31c730bde4ec66083bab908b34dca0ae8eaf5
"
integrity sha512-
5r6CcBOrtKIIT3auCfNRyyASkl+9JwwLxz5GaTwPJJvL7wogkp1KyCCgZPkRZmh9QJALx1yythJExZ6up9fJ6g
==
integrity sha512-
hxKkXvSfpEPP2UDeECXhhQMCQlIkAIeNNPuzXHw7kUnzxSGBK/RcGr7AJnD7a2rqpYXsfNLItw1Op6GKKtzo4Q
==
dependencies:
dependencies:
async-validator "^4.2.5"
async-validator "^4.2.5"
dayjs "^1.11.5"
dayjs "^1.11.5"
"@ibiz-template/core@^0.0.1-beta.
57
":
"@ibiz-template/core@^0.0.1-beta.
62
":
version "0.0.1-beta.
57
"
version "0.0.1-beta.
62
"
resolved "http://npm.zhr.icu/@ibiz-template/core/-/core-0.0.1-beta.
57.tgz#cbaee1af6542e780d7a69418a2510e1b137ac965
"
resolved "http://npm.zhr.icu/@ibiz-template/core/-/core-0.0.1-beta.
62.tgz#b423f286a8e6ad80f9213a8ac09a0497e34ee156
"
integrity sha512-
Xc5sVNolk4JIXZj8+okztyMMNBvAsOayjzT0FWH5ENtWnv9TQ2uYUMO2QySl/AtBNablUrCJKOROEDf+lqIbK
Q==
integrity sha512-
N6S0wvXg/Yf1vbHlxAX6MayiFy0tiHql8UUxvm30JVoC/dXVS0qNoCWohIdnoo3oSEEn2JzdcJju890nVrZ+S
Q==
dependencies:
dependencies:
axios "^1.2.1"
axios "^1.2.1"
loglevel "^1.8.0"
loglevel "^1.8.0"
pluralize "^8.0.0"
pluralize "^8.0.0"
qs "^6.11.0"
qs "^6.11.0"
"@ibiz-template/model@^0.0.1-beta.6
1
":
"@ibiz-template/model@^0.0.1-beta.6
2
":
version "0.0.1-beta.6
1
"
version "0.0.1-beta.6
2
"
resolved "http://npm.zhr.icu/@ibiz-template/model/-/model-0.0.1-beta.6
1.tgz#ecb104a815da2afafe561e42f649e6c610e1cc03
"
resolved "http://npm.zhr.icu/@ibiz-template/model/-/model-0.0.1-beta.6
2.tgz#4310aa2a9386bee4631cb2be5560124cf3284571
"
integrity sha512-
w64mPMTvL9S3PJ0f5zJgWD8cvUMoW6az10wxpPa/o133wyAj5y6sOKauK3ajcyyXMHq3pYfNppC/1/ehxH1V7g
==
integrity sha512-
jPSiJHnu8EnOYi/1eA9H81pZrw30wxxme4DoELffHxAhOwpIeZGHQGmhquN+DQI8vBglP15ir7ebmGWXmApTLQ
==
dependencies:
dependencies:
"@ibiz/dynamic-model-api" "^2.1.17"
"@ibiz/dynamic-model-api" "^2.1.17"
pluralize "^8.0.0"
pluralize "^8.0.0"
"@ibiz-template/runtime@^0.0.1-beta.6
1
":
"@ibiz-template/runtime@^0.0.1-beta.6
2
":
version "0.0.1-beta.6
1
"
version "0.0.1-beta.6
2
"
resolved "http://npm.zhr.icu/@ibiz-template/runtime/-/runtime-0.0.1-beta.6
1.tgz#32857481d736136877b1a4a49206c377ee9556ff
"
resolved "http://npm.zhr.icu/@ibiz-template/runtime/-/runtime-0.0.1-beta.6
2.tgz#de328e976b769f04184b2893bc6b5417b59b0276
"
integrity sha512-
UKv1lGjJy0trwl9LGdYVNFXHJQy/SUg/AwQeKc/IWdOXcnBZebPqQ6DuI41U4hEtHXQ0TIV1O1n2jpa8Zwku7
A==
integrity sha512-
rnyXctQJyWoj8cktPVIxzoNsG+TSakk2G06Mb7R0qlY+YkhamwaA4ADAFHHX4QD2d/1YlQlkI7WCWMIUwiSep
A==
dependencies:
dependencies:
"@ibiz-template/command" "^0.0.1-beta.50"
"@ibiz-template/command" "^0.0.1-beta.50"
qs "^6.11.0"
qs "^6.11.0"
"@ibiz-template/service@^0.0.1-beta.6
1
":
"@ibiz-template/service@^0.0.1-beta.6
2
":
version "0.0.1-beta.6
1
"
version "0.0.1-beta.6
2
"
resolved "http://npm.zhr.icu/@ibiz-template/service/-/service-0.0.1-beta.6
1.tgz#61735063bf3e90e874a54e99c0f475f5ea3c6cbc
"
resolved "http://npm.zhr.icu/@ibiz-template/service/-/service-0.0.1-beta.6
2.tgz#638b11f762a6038dd082e47571a8433da71fd759
"
integrity sha512-
CE/L1XTdxnd2EeYowHIihJXzavkNB9QqeNDkg9yAPGurOjEiBwjCL+G13M3xd6ZoVnG4yafQrr5rvzU5x5HMqA
==
integrity sha512-
Ip/WCav6f4MfIOrzCvHSAv6JgBJT/XYyl4MnCGB/2jKzcNsojZwvjatQNmIZAI9YLL6Gx1A1+SbD2C9Qp2pv3g
==
"@ibiz-template/theme@^0.0.1-beta.59":
"@ibiz-template/theme@^0.0.1-beta.59":
version "0.0.1-beta.59"
version "0.0.1-beta.59"
resolved "http://npm.zhr.icu/@ibiz-template/theme/-/theme-0.0.1-beta.59.tgz#f724e1a97f4ca6caee6c1f32751750b3fcd3583f"
resolved "http://npm.zhr.icu/@ibiz-template/theme/-/theme-0.0.1-beta.59.tgz#f724e1a97f4ca6caee6c1f32751750b3fcd3583f"
integrity sha512-XfBMhlL+Fh4jFZL9Zc05Sev2wtrwlSLURYYL8i22yzQgxa28zUZU2v+bFGelvgaF78v7L5hoUs0ysDnBPN2GKg==
integrity sha512-XfBMhlL+Fh4jFZL9Zc05Sev2wtrwlSLURYYL8i22yzQgxa28zUZU2v+bFGelvgaF78v7L5hoUs0ysDnBPN2GKg==
"@ibiz-template/vue-util@^0.0.1-beta.6
1
":
"@ibiz-template/vue-util@^0.0.1-beta.6
2
":
version "0.0.1-beta.6
1
"
version "0.0.1-beta.6
2
"
resolved "http://npm.zhr.icu/@ibiz-template/vue-util/-/vue-util-0.0.1-beta.6
1.tgz#28680a3361c499b107de776a1edec2f6662d493c
"
resolved "http://npm.zhr.icu/@ibiz-template/vue-util/-/vue-util-0.0.1-beta.6
2.tgz#3cab64ab2ea46ddf1c8313ae5e995ba46ed5d313
"
integrity sha512-
Kko5OQo/P8MvZ2CgRcwtW/yb8r5NTdP5cxrDZOmE5gDELdH/Uvp9daEMTs8EY1bZGctJO9F8hNae8gyhabyq3w
==
integrity sha512-
Jjqad5jkcfllyU0AGJosCiC6YmX7c0Zp8AKTLEbQwHxu5gn6aSKavDdBPMUZJznlPX3ixNYajSS6loCG7xRVJA
==
"@ibiz/dynamic-model-api@^2.1.17":
"@ibiz/dynamic-model-api@^2.1.17":
version "2.1.17"
version "2.1.17"
...
...
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录