Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
iBiz-Vue-R7-Res
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
iBiz-R7前端标准模板
iBiz-Vue-R7-Res
提交
a8c2a67a
提交
a8c2a67a
编写于
11月 02, 2022
作者:
tony001
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update:更新
上级
131cf455
变更
5
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
248 行增加
和
254 行删除
+248
-254
app-standard-container.less
...tainer/app-standard-container/app-standard-container.less
+1
-2
app-login-third.vue
.../layout-element/login/app-login-third/app-login-third.vue
+2
-251
panel-container.ts
src/model/panel-detail/panel-container.ts
+9
-0
panel-detail.ts
src/model/panel-detail/panel-detail.ts
+202
-0
util.ts
src/utils/util/util.ts
+34
-1
未找到文件。
src/components/layout-element/container/app-standard-container/app-standard-container.less
浏览文件 @
a8c2a67a
.app-standard-container{
width: 100%;
height: 100%;
display: block;
}
\ No newline at end of file
src/components/layout-element/login/app-login-third/app-login-third.vue
浏览文件 @
a8c2a67a
...
...
@@ -14,10 +14,6 @@
<
script
lang=
"ts"
>
import
{
Component
,
Vue
}
from
"vue-property-decorator"
;
import
qs
from
"qs"
;
// import * as dd from "dingtalk-jsapi";
import
axios
from
"axios"
;
import
{
Util
}
from
"@/utils"
;
@
Component
({})
export
default
class
AppThirdLogin
extends
Vue
{
/**
...
...
@@ -46,33 +42,7 @@ export default class AppThirdLogin extends Vue {
* @memberof AppThirdLogin
*/
async
dingTalkHandleClick
()
{
let
result
:
any
=
await
this
.
dingtalkLogin
();
if
(
result
)
{
if
(
result
.
state
&&
Object
.
is
(
result
.
state
,
"SUCCESS"
))
{
const
data
=
result
.
data
;
// 截取地址,拼接需要部分组成新地址
const
baseUrl
=
this
.
getNeedLocation
();
// 1.钉钉开放平台提供的appId
const
appId
=
data
.
appid
;
// 2.钉钉扫码后回调地址,需要UrlEncode转码
const
redirect_uri
=
baseUrl
+
"assets/third/dingdingRedirect.html?id="
+
data
.
appid
;
const
redirect_uri_encode
=
encodeURIComponent
(
redirect_uri
);
// 3.钉钉扫码url
const
url
=
"https://oapi.dingtalk.com/connect/qrconnect?response_type=code"
+
"&appid="
+
appId
+
"&redirect_uri="
+
redirect_uri_encode
+
"&scope=snsapi_login"
+
"&state=STATE"
;
// 4.跳转钉钉扫码
window
.
location
.
href
=
url
;
}
else
if
(
result
.
message
)
{
throw
new
Error
(
result
.
message
);
}
}
}
/**
...
...
@@ -81,226 +51,7 @@ export default class AppThirdLogin extends Vue {
* @memberof AppThirdLogin
*/
async
wxWorkHandleClick
()
{
let
result
:
any
=
await
this
.
wxWorkLogin
();
if
(
result
)
{
if
(
result
.
state
&&
Object
.
is
(
result
.
state
,
"SUCCESS"
))
{
const
data
=
result
.
data
;
// 截取地址,拼接需要部分组成新地址
const
baseUrl
=
this
.
getNeedLocation
();
// 1.微信平台提供的appId
const
appId
=
data
.
corp_id
;
const
agentId
=
data
.
agentid
;
// 2.微信扫码后回调地址,需要UrlEncode转码
const
redirect_uri
=
baseUrl
+
"assets/third/wxWorkRedirect.html?id="
+
data
.
appid
;
const
redirect_uri_encode
=
encodeURIComponent
(
redirect_uri
);
// 3.微信扫码url
const
url
=
"https://open.work.weixin.qq.com/wwopen/sso/qrConnect?state=STATE"
+
"&appid="
+
appId
+
"&agentid="
+
agentId
+
"&redirect_uri="
+
redirect_uri_encode
;
// 4.跳转微信扫码
window
.
location
.
href
=
url
;
}
else
if
(
result
.
message
)
{
throw
new
Error
(
result
.
message
);
}
}
}
/**
* 截取地址
*
* @memberof AppThirdLogin
*/
private
getNeedLocation
()
{
// 截取地址,拼接需要部分组成新地址
const
scheme
=
window
.
location
.
protocol
;
const
host
=
window
.
location
.
host
;
let
baseUrl
:
any
=
scheme
+
"//"
+
host
;
const
port
=
window
.
location
.
port
;
if
(
port
)
{
if
(
port
==
"80"
||
port
==
"443"
)
{
baseUrl
+=
"/"
;
}
else
{
baseUrl
+=
":"
+
port
+
"/"
;
}
}
else
{
baseUrl
+=
"/"
;
}
return
baseUrl
;
}
/**
* 钉钉授权登录
*
* @memberof AppThirdService
*/
public
dingtalkLogin
():
Promise
<
any
>
{
return
new
Promise
((
resolve
)
=>
{
// 请求头
const
headers
=
{};
const
tempViewParam
=
Util
.
getDcSystemIdViewParam
();
if
(
tempViewParam
&&
tempViewParam
.
srfdcsystem
)
{
Object
.
assign
(
headers
,
{
srfdcsystem
:
tempViewParam
.
srfdcsystem
});
}
const
get
:
Promise
<
any
>
=
this
.
getData
(
"/uaa/open/dingtalk/appid"
,
{},
false
,
headers
);
get
.
then
((
response
:
any
)
=>
{
if
(
response
&&
response
.
status
===
200
)
{
const
data
=
response
.
data
;
if
(
data
&&
data
.
appid
)
{
resolve
({
state
:
"SUCCESS"
,
data
:
data
});
}
else
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败,
${
data
.
detail
}
`
,
});
}
}
}).
catch
((
error
:
any
)
=>
{
const
data
=
error
.
data
;
if
(
data
&&
data
.
detail
)
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败,
${
data
.
detail
}
`
,
});
}
else
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败`
});
}
});
});
}
/**
* 企业微信授权登录
*
* @memberof AppThirdService
*/
public
wxWorkLogin
():
Promise
<
any
>
{
return
new
Promise
((
resolve
)
=>
{
// 请求头
const
headers
=
{};
const
tempViewParam
=
Util
.
getDcSystemIdViewParam
();
if
(
tempViewParam
&&
tempViewParam
.
srfdcsystem
)
{
Object
.
assign
(
headers
,
{
srfdcsystem
:
tempViewParam
.
srfdcsystem
});
}
const
get
:
Promise
<
any
>
=
this
.
getData
(
"/uaa/open/wxwork/appid"
,
{},
false
,
headers
);
get
.
then
((
response
:
any
)
=>
{
if
(
response
&&
response
.
status
===
200
)
{
const
data
=
response
.
data
;
if
(
data
&&
(
data
.
corp_id
||
data
.
appid
))
{
resolve
({
state
:
"SUCCESS"
,
data
:
data
});
}
else
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败,
${
data
.
detail
}
`
,
});
}
}
}).
catch
((
error
:
any
)
=>
{
const
data
=
error
.
data
;
if
(
data
&&
data
.
detail
)
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败,
${
data
.
detail
}
`
,
});
}
else
{
resolve
({
state
:
"ERROR"
,
message
:
`获取网站应用appid失败`
});
}
});
});
}
/**
* 钉钉内部免登
*
* @memberof AppThirdService
*/
public
embedDingTalkLogin
(
Environment
:
any
):
Promise
<
any
>
{
return
new
Promise
((
resolve
)
=>
{
// 请求头
const
headers
=
{};
const
tempViewParam
=
Util
.
getDcSystemIdViewParam
();
if
(
tempViewParam
&&
tempViewParam
.
srfdcsystem
)
{
Object
.
assign
(
headers
,
{
srfdcsystem
:
tempViewParam
.
srfdcsystem
});
}
const
param
=
Util
.
handleViewParam
(
window
.
location
.
href
);
if
(
param
.
corpId
)
{
let
corpId
:
string
=
param
.
corpId
;
if
(
corpId
.
indexOf
(
"#"
)
>
-
1
)
{
corpId
=
corpId
.
split
(
"#"
)[
0
];
}
// dd.runtime.permission
// .requestAuthCode({ corpId })
// .then((res: any) => {
// if (res && res.code) {
// this.getData(`/uaa/open/dingtalk/auth/${res.code}`, {}, false, headers).then((res: any) => {
// if (res.status == 200 && (res.data.token || res.data.user)) {
// resolve({ state: "SUCCESS", data: res.data });
// } else {
// resolve({ state: "ERROR", message: `${res.data.message}` });
// }
// });
// } else {
// resolve({ state: "ERROR", message: `钉钉用户信息获取失败` });
// }
// })
// .catch((error: any) => {
// resolve({ state: "ERROR", message: `钉钉用户信息获取失败` });
// });
}
else
{
resolve
({
state
:
"ERROR"
,
message
:
`获取企业ID失败`
});
}
});
}
/**
* 获取数据
*
* @memberof AppThirdService
*/
public
getData
(
url
:
string
,
params
:
any
=
{},
isloading
?:
boolean
,
headers
:
any
=
{})
{
params
=
this
.
handleRequestData
(
params
);
if
(
params
.
srfparentdata
)
{
Object
.
assign
(
params
,
params
.
srfparentdata
);
delete
params
.
srfparentdata
;
}
if
(
Object
.
keys
(
params
).
length
>
0
)
{
let
tempParam
:
any
=
{};
Object
.
keys
(
params
).
forEach
((
item
:
any
)
=>
{
if
(
params
[
item
]
||
Object
.
is
(
params
[
item
],
0
))
{
tempParam
[
item
]
=
params
[
item
];
}
});
if
(
Object
.
keys
(
tempParam
).
length
>
0
)
{
url
+=
`?
${
qs
.
stringify
(
tempParam
)}
`
;
}
}
return
new
Promise
((
resolve
:
any
,
reject
:
any
)
=>
{
axios
.
get
(
url
,
{
headers
:
headers
}).
then
((
response
:
any
)
=>
{
resolve
(
response
);
});
});
}
/**
* 处理请求数据
*
* @memberof AppThirdService
*/
public
handleRequestData
(
data
:
any
)
{
if
(
data
.
srfsessionkey
)
{
delete
data
.
srfsessionkey
;
}
if
(
data
.
srfsessionid
)
{
delete
data
.
srfsessionid
;
}
if
(
data
.
srfparentdemapname
)
{
delete
data
.
srfparentdemapname
;
}
return
data
;
}
}
</
script
>
...
...
src/model/panel-detail/panel-container.ts
浏览文件 @
a8c2a67a
...
...
@@ -17,6 +17,14 @@ export class PanelContainerModel extends PanelDetailModel {
*/
public
details
:
string
[]
=
[];
/**
* 标题关闭模式
*
* @type {number}
* @memberof PanelContainerModel
*/
public
titleBarCloseMode
:
number
=
0
;
/**
* Creates an instance of PanelContainerModel.
* @param {*} [opts={}]
...
...
@@ -25,6 +33,7 @@ export class PanelContainerModel extends PanelDetailModel {
public
constructor
(
opts
:
any
=
{})
{
super
(
opts
);
this
.
details
=
opts
.
details
;
this
.
titleBarCloseMode
=
opts
.
titleBarCloseMode
;
}
...
...
src/model/panel-detail/panel-detail.ts
浏览文件 @
a8c2a67a
import
{
Util
}
from
"@/utils"
;
/**
* 面板成员模型
*
...
...
@@ -150,6 +152,30 @@ export class PanelDetailModel {
*/
public
flexGrow
:
number
=
0
;
/**
* flex布局参数
*
* @type {*}
* @memberof PanelDetailModel
*/
public
flexParams
:
any
=
{};
/**
* 是否显示标题
*
* @type {boolean}
* @memberof PanelDetailModel
*/
public
isShowCaption
:
boolean
=
false
;
/**
* 界面样式表
*
* @type {string}
* @memberof PanelDetailModel
*/
public
sysCss
:
string
=
''
/**
* Creates an instance of PanelDetailModel.
* PanelDetailModel 实例
...
...
@@ -176,6 +202,182 @@ export class PanelDetailModel {
this
.
hAlignSelf
=
opts
.
hAlignSelf
;
this
.
vAlignSelf
=
opts
.
vAlignSelf
;
this
.
flexGrow
=
opts
.
flexGrow
;
this
.
flexParams
=
opts
.
flexParams
;
this
.
isShowCaption
=
opts
.
isShowCaption
;
this
.
sysCss
=
opts
.
sysCss
;
}
/**
* 获取元素样式(元素,包含内容盒子 大小/边距/内容 的样式)
*
* @memberof PanelDetailModel
*/
public
getElementStyle
()
{
const
elementStyle
=
{};
Object
.
assign
(
elementStyle
,
this
.
getBoxSizeStyle
());
Object
.
assign
(
elementStyle
,
this
.
getBoxSpacingStyle
());
Object
.
assign
(
elementStyle
,
this
.
getBoxContentStyle
());
return
elementStyle
;
}
/**
* 获取盒子间隔样式(元素)
*
* @memberof PanelDetailModel
*/
public
getBoxSpacingStyle
()
{
const
boxStyle
=
{};
// 上方间隔模式
if
(
this
.
spacingTop
)
{
Object
.
assign
(
boxStyle
,
Util
.
getItemSpacingStyle
(
this
.
spacingTop
,
'top'
));
}
// 下方间隔模式
if
(
this
.
spacingBottom
)
{
Object
.
assign
(
boxStyle
,
Util
.
getItemSpacingStyle
(
this
.
spacingBottom
,
'bottom'
));
}
// 左侧间隔模式
if
(
this
.
spacingLeft
)
{
Object
.
assign
(
boxStyle
,
Util
.
getItemSpacingStyle
(
this
.
spacingLeft
,
'left'
));
}
// 右侧间隔模式
if
(
this
.
spacingRight
)
{
Object
.
assign
(
boxStyle
,
Util
.
getItemSpacingStyle
(
this
.
spacingRight
,
'right'
));
}
return
boxStyle
;
}
/**
* 获取盒子大小样式(元素)
*
* @memberof PanelDetailModel
*/
public
getBoxSizeStyle
()
{
const
boxStyle
=
{};
if
(
this
.
widthMode
||
this
.
layoutWidth
)
{
Object
.
assign
(
boxStyle
,
Util
.
getBoxSize
(
"WIDTH"
,
this
.
widthMode
,
this
.
layoutWidth
));
}
if
(
this
.
heightMode
||
this
.
layoutHeight
)
{
Object
.
assign
(
boxStyle
,
Util
.
getBoxSize
(
"HEIGHT"
,
this
.
heightMode
,
this
.
layoutHeight
));
}
return
boxStyle
;
}
/**
* 获取盒子内容样式(元素,包含内容换行模式,内容水平对齐,内容垂直对齐)
*
* @memberof PanelDetailModel
*/
public
getBoxContentStyle
()
{
const
boxStyle
=
{};
return
boxStyle
;
}
/**
* 获取盒子边框样式(元素)
*
* @memberof PanelDetailModel
*/
public
getBoxBorderStyle
()
{
const
boxStyle
=
{};
return
boxStyle
;
}
/**
* 获取布局样式(布局,包含约束内容布局的样式,包含内容的对齐方式)
*
* @return {*}
* @memberof PanelDetailModel
*/
public
getLayoutStyle
()
{
const
layoutStyle
=
{};
Object
.
assign
(
layoutStyle
,
this
.
getBoxSelfAlignStyle
());
Object
.
assign
(
layoutStyle
,
this
.
getBoxLayOutStyle
());
return
layoutStyle
;
}
/**
* 获取自身对齐模式(布局)
*
* @memberof PanelDetailModel
*/
public
getBoxSelfAlignStyle
()
{
const
boxStyle
=
{};
// 自身对齐方式
if
(
this
.
vAlignSelf
||
this
.
hAlignSelf
)
{
Object
.
assign
(
boxStyle
,
{
'display'
:
'flex'
});
// 自身垂直对齐模式
switch
(
this
.
vAlignSelf
)
{
case
'TOP'
:
Object
.
assign
(
boxStyle
,
{
'align-items'
:
'flex-start'
});
break
;
case
'MIDDLE'
:
Object
.
assign
(
boxStyle
,
{
'align-items'
:
'center'
});
break
;
case
'BOTTOM'
:
Object
.
assign
(
boxStyle
,
{
'align-items'
:
'flex-end'
});
break
;
default
:
break
;
}
// 自身水平对齐模式
switch
(
this
.
hAlignSelf
)
{
case
'LEFT'
:
Object
.
assign
(
boxStyle
,
{
'justify-content'
:
'flex-start'
});
break
;
case
'CENTER'
:
Object
.
assign
(
boxStyle
,
{
'justify-content'
:
'center'
});
break
;
case
'RIGHT'
:
Object
.
assign
(
boxStyle
,
{
'justify-content'
:
'flex-end'
});
break
;
case
'JUSTIFY'
:
Object
.
assign
(
boxStyle
,
{
'justify-content'
:
'space-between'
});
break
;
default
:
break
;
}
}
return
boxStyle
;
}
/**
* 获取盒子布局样式(布局)
*
* @memberof PanelDetailModel
*/
public
getBoxLayOutStyle
()
{
const
boxStyle
=
{};
// 识别FLEX
if
(
this
.
layout
==
'FLEX'
)
{
Object
.
assign
(
boxStyle
,
{
'display'
:
'flex'
,
'flex-grow'
:
this
.
flexGrow
?
this
.
flexGrow
:
0
});
}
// 识别flex布局方向,横轴对齐,纵轴对齐
if
(
this
.
flexParams
.
align
||
this
.
flexParams
.
dir
||
this
.
flexParams
.
vAlign
)
{
Object
.
assign
(
boxStyle
,
{
'display'
:
'flex'
});
if
(
this
.
flexParams
.
dir
)
{
Object
.
assign
(
boxStyle
,
{
'flex-direction'
:
this
.
flexParams
.
dir
});
}
if
(
this
.
flexParams
.
align
)
{
Object
.
assign
(
boxStyle
,
{
'justify-content'
:
this
.
flexParams
.
align
});
}
if
(
this
.
flexParams
.
vAlign
)
{
Object
.
assign
(
boxStyle
,
{
'align-items'
:
this
.
flexParams
.
vAlign
});
}
}
// 识别SIMPLEFLEX
if
(
this
.
layout
==
'SIMPLEFLEX'
)
{
if
(
this
.
flexGrow
)
{
Object
.
assign
(
boxStyle
,
{
'width'
:
`
${(
100
/
12
)
*
this
.
flexGrow
}
%`
,
'height'
:
'100%'
});
}
else
{
// 简单FLEX布局自适应
Object
.
assign
(
boxStyle
,
{
'flex-grow'
:
1
,
'min-width'
:
`
${(
100
/
12
)}
%`
,
'height'
:
'100%'
});
}
}
// 识别边缘布局
if
(
this
.
layout
==
'BORDER'
)
{
Object
.
assign
(
boxStyle
,
{
'display'
:
'flex'
});
}
return
boxStyle
;
}
}
\ No newline at end of file
src/utils/util/util.ts
浏览文件 @
a8c2a67a
...
...
@@ -472,9 +472,12 @@ export class Util {
* @returns
*/
public
static
getBoxSize
(
mode
:
"WIDTH"
|
"HEIGHT"
,
style
:
string
,
value
:
number
)
{
if
(
!
mode
||
!
style
)
{
if
(
!
mode
)
{
return
{};
}
if
(
!
style
){
style
=
'PX'
;
}
if
(
style
===
"FULL"
)
{
return
{
[
mode
.
toLowerCase
()]:
"100%"
};
}
else
{
...
...
@@ -488,4 +491,34 @@ export class Util {
}
}
}
/**
* 获取项间隔样式
*
* @param {string} spacingType
* @param {string} direction
* @return {*}
*/
public
static
getItemSpacingStyle
(
spacingType
:
string
,
direction
:
string
)
{
switch
(
spacingType
)
{
case
'OUTERNONE'
:
return
{
[
`margin-
${
direction
}
`
]:
'0px'
};
case
'OUTERSMALL'
:
return
{
[
`margin-
${
direction
}
`
]:
'8px'
};
case
'OUTERMEDIUM'
:
return
{
[
`margin-
${
direction
}
`
]:
'16px'
};
case
'OUTERLARGE'
:
return
{
[
`margin-
${
direction
}
`
]:
'24px'
};
case
'INNERNONE'
:
return
{
[
`padding-
${
direction
}
`
]:
'0px'
};
case
'INNERSMALL'
:
return
{
[
`padding-
${
direction
}
`
]:
'8px'
};
case
'INNERMEDIUM'
:
return
{
[
`padding-
${
direction
}
`
]:
'16px'
};
case
'INNERLARGE'
:
return
{
[
`padding-
${
direction
}
`
]:
'24px'
};
default
:
return
{};
}
}
}
\ No newline at end of file
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录