Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
workflow-ui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
workflow-ui
Commits
f6714003
Commit
f6714003
authored
May 23, 2025
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改部分字段
parent
5fd4a704
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
194 additions
and
142 deletions
+194
-142
admin/package.json
admin/package.json
+1
-1
admin/src/assets/utils/ajax.js
admin/src/assets/utils/ajax.js
+94
-56
admin/src/views/login/authentication.vue
admin/src/views/login/authentication.vue
+13
-12
admin/src/views/login/login.vue
admin/src/views/login/login.vue
+76
-58
admin/src/views/login/updatePwd.vue
admin/src/views/login/updatePwd.vue
+5
-5
admin/vue.config.js
admin/vue.config.js
+1
-1
admin/yarn.lock
admin/yarn.lock
+4
-9
No files found.
admin/package.json
View file @
f6714003
...
@@ -13,7 +13,7 @@
...
@@ -13,7 +13,7 @@
"@xunlei/vue-context-menu"
:
"^1.0.2"
,
"@xunlei/vue-context-menu"
:
"^1.0.2"
,
"axios"
:
"^0.18.0"
,
"axios"
:
"^0.18.0"
,
"clipboard"
:
"2.0.6"
,
"clipboard"
:
"2.0.6"
,
"core-js"
:
"3
.8.1
"
,
"core-js"
:
"3"
,
"echarts"
:
"^4.3.0"
,
"echarts"
:
"^4.3.0"
,
"element-react"
:
"^1.4.34"
,
"element-react"
:
"^1.4.34"
,
"element-ui"
:
"^2.15.5"
,
"element-ui"
:
"^2.15.5"
,
...
...
admin/src/assets/utils/ajax.js
View file @
f6714003
import
axios
from
'
axios
'
;
import
axios
from
"
axios
"
;
import
Qs
from
'
qs
'
;
import
Vue
from
'
vue
'
const
JSONbig
=
require
(
'
json-bigint
'
)({
"
storeAsString
"
:
true
});
import
ElementUI
from
'
element-ui
'
import
cookie
from
'
./cookie
'
;
import
'
element-ui/lib/theme-chalk/index.css
'
import
httpErrorHandler
from
'
./httpErrorHandler
'
;
import
Qs
from
"
qs
"
;
const
JSONbig
=
require
(
"
json-bigint
"
)({
storeAsString
:
true
});
import
cookie
from
"
./cookie
"
;
import
httpErrorHandler
from
"
./httpErrorHandler
"
;
// loading框设置局部刷新,且所有请求完成后关闭loading框
let
loading
let
needLoadingRequestCount
=
0
// 声明一个对象用于存储请求个数
function
startLoading
()
{
loading
=
Vue
.
prototype
.
$loading
({
lock
:
true
,
customClass
:
'
createLoading
'
,
// 局部class名称
text
:
'
服务加载中...
'
,
background
:
'
rgba(0,0,0,0.5)
'
,
target
:
document
.
querySelector
(
'
.loading-area
'
)
// 设置加载动画区域
})
}
function
endLoading
()
{
loading
.
close
()
}
function
showFullScreenLoading
()
{
if
(
needLoadingRequestCount
===
0
)
{
startLoading
()
}
needLoadingRequestCount
++
}
function
hideFullScreenLoading
()
{
if
(
needLoadingRequestCount
<=
0
)
return
needLoadingRequestCount
--
if
(
needLoadingRequestCount
===
0
)
{
endLoading
()
}
}
const
instance
=
axios
.
create
({
const
instance
=
axios
.
create
({
baseURL
:
'
/m
'
,
baseURL
:
"
/m
"
,
//baseURL: process.env.VUE_APP_BASE_API,
headers
:
{
headers
:
{
post
:
{
post
:
{
'
Content-Type
'
:
'
application/x-www-form-urlencoded;charset=UTF-8
'
,
"
Content-Type
"
:
"
application/json;charset=UTF-8
"
,
'
dataType
'
:
'
json
'
,
dataType
:
"
json
"
,
}
}
,
},
},
transformResponse
:
[
data
=>
{
transformResponse
:
[
try
{
(
data
)
=>
{
JSON
.
parse
(
data
);
try
{
return
JSONbig
.
parse
(
data
);
JSON
.
parse
(
data
);
}
catch
(
error
)
{
return
JSONbig
.
parse
(
data
);
return
data
;
}
catch
(
error
)
{
}
return
data
;
}],
}
},
],
});
});
/**
* 请求拦截器
*/
instance
.
interceptors
.
request
.
use
(
(
config
)
=>
{
config
.
headers
.
Authorization
=
window
.
sessionStorage
.
getItem
(
"
token
"
)
||
""
;
if
(
config
.
isLoading
==
true
)
{
// 如果配置了isLoading: false,则不显示loading
showFullScreenLoading
()
}
instance
.
interceptors
.
request
.
use
(
config
=>
{
return
config
;
},
//config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
(
err
)
=>
{
hideFullScreenLoading
()
config
.
data
=
Qs
.
stringify
(
config
.
data
,
{
arrayFormat
:
'
indices
'
,
allowDots
:
true
});
return
Promise
.
reject
(
err
);
//brackets
}
// 也可以在这里给请求添加token之类的字段
);
// config.headers['Content-Type'] = 'application/json;charset=UTF-8'
/**
// config.headers.timestamp = Math.floor(new Date().getTime() / 1000)
* 响应拦截器
// config.headers.token = sessionStorage.getItem('token') || ''
*/
instance
.
interceptors
.
response
.
use
((
response
)
=>
{
console
.
log
(
"
request config
"
,
config
);
hideFullScreenLoading
()
// 响应成功关闭loading
return
config
;
},
err
=>
{
return
Promise
.
reject
(
err
);
});
instance
.
interceptors
.
response
.
use
(
response
=>
{
return
response
.
data
;
return
response
.
data
},
httpErrorHandler
);
},
httpErrorHandler
);
/**
/**
* 封装后的axios post方法
* 封装后的axios post方法
...
@@ -56,9 +93,9 @@ instance.interceptors.response.use(response=>{
...
@@ -56,9 +93,9 @@ instance.interceptors.response.use(response=>{
*/
*/
export
function
post
(
url
,
option
,
config
=
{})
{
export
function
post
(
url
,
option
,
config
=
{})
{
const
data
=
Object
.
assign
({},
option
,
{
const
data
=
Object
.
assign
({},
option
,
{
__mortals_token__
:
cookie
.
getItem
(
'
__mortals_token__
'
),
//
__mortals_token__: cookie.getItem('__mortals_token__'),
})
})
;
return
instance
.
post
(
url
,
data
,
config
)
return
instance
.
post
(
url
,
data
,
config
)
;
}
}
/**
/**
...
@@ -71,25 +108,24 @@ export function post(url, option, config = {}) {
...
@@ -71,25 +108,24 @@ export function post(url, option, config = {}) {
*/
*/
export
function
get
(
url
,
option
,
config
=
{})
{
export
function
get
(
url
,
option
,
config
=
{})
{
const
data
=
Object
.
assign
({},
option
,
{
const
data
=
Object
.
assign
({},
option
,
{
__mortals_token__
:
cookie
.
getItem
(
'
__mortals_token__
'
),
//
__mortals_token__: cookie.getItem('__mortals_token__'),
})
})
;
return
instance
.
get
(
url
,
{
params
:
data
},
config
)
return
instance
.
get
(
url
,
{
params
:
data
},
config
)
;
}
}
// 文件上传
// 文件上传
const
uploadInstance
=
axios
.
create
({
const
uploadInstance
=
axios
.
create
({
baseURL
:
'
/m
'
,
baseURL
:
"
/m
"
,
headers
:
{
headers
:
{
post
:
{
post
:
{
'
Content-Type
'
:
'
multipart/form-data
'
,
"
Content-Type
"
:
"
multipart/form-data
"
,
}
}
,
}
}
,
});
});
uploadInstance
.
interceptors
.
response
.
use
(
response
=>
{
uploadInstance
.
interceptors
.
response
.
use
(
(
response
)
=>
{
return
response
.
data
return
response
.
data
;
},
httpErrorHandler
);
},
httpErrorHandler
);
/**
/**
* 封装后的axios upload方法
* 封装后的axios upload方法
...
@@ -101,8 +137,10 @@ uploadInstance.interceptors.response.use(response=>{
...
@@ -101,8 +137,10 @@ uploadInstance.interceptors.response.use(response=>{
*/
*/
export
function
upload
(
url
,
option
,
config
=
{})
{
export
function
upload
(
url
,
option
,
config
=
{})
{
let
formdata
=
new
FormData
();
let
formdata
=
new
FormData
();
Object
.
keys
(
option
).
forEach
(
key
=>
{
Object
.
keys
(
option
).
forEach
(
(
key
)
=>
{
formdata
.
append
(
key
,
option
[
key
])
formdata
.
append
(
key
,
option
[
key
])
;
})
})
;
return
uploadInstance
.
post
(
url
,
formdata
,
config
)
return
uploadInstance
.
post
(
url
,
formdata
,
config
)
;
}
}
admin/src/views/login/authentication.vue
View file @
f6714003
...
@@ -6,40 +6,41 @@
...
@@ -6,40 +6,41 @@
<
script
>
<
script
>
export
default
{
export
default
{
name
:
'
authentication
'
,
name
:
"
authentication
"
,
created
()
{
created
()
{
this
.
login
();
this
.
login
();
},
},
methods
:
{
methods
:
{
login
()
{
login
()
{
this
.
$post
(
'
/login/index
'
).
then
(
this
.
loginSuccess
).
catch
(
this
.
loginFail
)
this
.
$post
(
"
/login/index
"
).
then
(
this
.
loginSuccess
).
catch
(
this
.
loginFail
);
},
},
loginSuccess
({
data
})
{
loginSuccess
({
data
})
{
this
.
$store
.
commit
(
'
setUserData
'
,
data
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
this
.
$router
.
replace
({
this
.
$router
.
replace
({
path
:
this
.
redirect
,
path
:
this
.
redirect
,
});
});
},
},
loginFail
(
error
)
{
loginFail
(
error
)
{
this
.
$message
.
error
(
error
.
message
||
'
请登录
'
);
this
.
$message
.
error
(
error
.
message
||
"
请登录
"
);
// console.log("
<<
"
, process.env.VUE_APP_BASE_API);
this.$router.replace({
this.$router.replace({
path: '/login',
path: '/login',
query: {
query: {
redirect: this.redirect,
redirect: this.redirect,
}
}
});
});
}
}
,
},
},
computed: {
computed: {
isLogin() {
isLogin() {
return
this
.
$store
.
state
.
isLogin
return this.$store.state.isLogin
;
}
}
,
},
},
data() {
data() {
return {
return {
redirect: this.$route.query.redirect,
redirect: this.$route.query.redirect,
loading: true,
loading: true,
}
}
;
}
}
,
}
}
;
</
script
>
</
script
>
admin/src/views/login/login.vue
View file @
f6714003
...
@@ -3,129 +3,147 @@
...
@@ -3,129 +3,147 @@
<
template
>
<
template
>
<div
class=
"page page-login flex flex-v"
>
<div
class=
"page page-login flex flex-v"
>
<div
class=
"form-wrap flex flex-1"
>
<div
class=
"form-wrap flex flex-1"
>
<el-form
@
submit.prevent=
'onSubmit'
ref=
"form"
:model=
"form"
label-width=
"80px"
size=
"small"
>
<el-form
<h1>
工作流管理平台
</h1>
@
submit.prevent=
"onSubmit"
ref=
"form"
:model=
"form"
label-width=
"80px"
size=
"small"
>
<h1>
{{
sysName
?
sysName
:
systemName
}}
</h1>
<el-form-item
label=
"用户名"
>
<el-form-item
label=
"用户名"
>
<el-input
v-model=
"form.loginName"
></el-input>
<el-input
v-model=
"form.loginName"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"密码"
>
<el-form-item
label=
"密码"
>
<el-input
v-model=
"form.password"
type=
'password'
></el-input>
<el-input
v-model=
"form.password"
type=
"password"
></el-input>
</el-form-item>
<el-form-item
label=
"验证码"
>
<el-input
v-model=
"form.securityCode"
>
<img
slot=
"append"
width=
'60'
height=
"30"
:src=
'securityCodeUrl'
@
click=
'refreshCode'
/>
</el-input>
</el-form-item>
</el-form-item>
<el-form-item
size=
"large"
>
<el-form-item
size=
"large"
>
<el-button
type=
"primary"
native-type=
'submit'
:loading=
'loading'
@
click=
'onSubmit'
>
登录
</el-button>
<el-button
type=
"primary"
class=
"addclass"
native-type=
"submit"
:loading=
"loading"
@
click=
"onSubmit"
>
登录
</el-button
>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
<div
class=
"footer"
>
<div
class=
"footer"
>
登陆
©
<a
href=
""
>
信宏翔网络科技有限公司
</a>
出品
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
import
{
mapMutations
,
mapState
}
from
"
vuex
"
;
import
{
createSocket
}
from
'
@/assets/utils/websocket
'
const
securityCodeUrl
=
'
/m/securitycode/createCode?v=
'
;
export
default
{
export
default
{
name
:
'
login
'
,
name
:
"
login
"
,
data
()
{
return
{
systemName
:
process
.
env
.
VUE_APP_sysName
,
originData
:
[],
loading
:
false
,
form
:
{
loginName
:
"
admin
"
,
password
:
"
admin
"
,
},
};
},
computed
:
{
...
mapState
([
"
sysName
"
]),
},
created
()
{
created
()
{
this
.
refreshCode
();
this
.
getInfo
();
},
},
methods
:
{
methods
:
{
...
mapMutations
([
"
SET_sysName
"
,
"
SET_sysLogo
"
]),
// 获取token和站点信息
getInfo
()
{
let
{
sysName
,
sysLogo
,
siteid
}
=
this
.
$route
.
query
;
if
(
siteid
&&
sysName
&&
sysLogo
)
{
sessionStorage
.
setItem
(
"
siteid
"
,
siteid
);
this
.
SET_sysName
(
sysName
);
this
.
SET_sysLogo
(
sysLogo
);
}
},
login
()
{
login
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
this
.
$post
(
'
/login/login
'
,
this
.
form
).
then
(
this
.
loginSuccess
).
catch
(
this
.
loginFail
)
this
.
$post
(
"
/login/login
"
,
this
.
form
)
.
then
(
this
.
loginSuccess
)
.
catch
(
this
.
loginFail
);
},
},
loginSuccess
({
data
})
{
loginSuccess
({
data
})
{
this
.
$store
.
commit
(
'
setUserData
'
,
data
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
let
{
token
}
=
data
;
this
.
$router
.
replace
({
sessionStorage
.
setItem
(
"
token
"
,
token
);
path
:
this
.
redirect
,
this
.
$router
.
push
(
"
/index
"
);
});
//成功 创建websocket连接 process.env.VUE_WEBSOCKET_BASE_API +
// createSocket("ws://"+process.env.VUE_APP_BASE_API +"/ws?accessToken="+data.id)
//成功 创建websocket连接
// createSocket('ws://127.0.0.1:17011/m/ws?accessToken='+data.id)
},
},
loginFail
(
error
)
{
loginFail
(
error
)
{
this
.
loading
=
false
;
this
.
loading
=
false
;
this
.
refreshCode
();
//
this.refreshCode();
this
.
$message
.
error
(
error
.
message
);
this
.
$message
.
error
(
error
.
message
);
},
},
refreshCode
()
{
//
refreshCode() {
this
.
form
.
securityCode
=
''
;
//
this.form.securityCode = '';
this
.
securityCodeUrl
=
securityCodeUrl
+
Math
.
random
();
//
this.securityCodeUrl = securityCodeUrl + Math.random();
},
//
},
onSubmit
(
e
)
{
onSubmit
(
e
)
{
e
.
preventDefault
();
e
.
preventDefault
();
if
(
!
this
.
form
.
loginName
.
length
)
{
if
(
!
this
.
form
.
loginName
.
length
)
{
return
this
.
$message
.
warning
(
'
请输入用户名
'
)
return
this
.
$message
.
warning
(
"
请输入用户名
"
);
}
}
if
(
!
this
.
form
.
password
.
length
){
if
(
!
this
.
form
.
password
.
length
)
{
return
this
.
$message
.
warning
(
'
请输入密码
'
)
return
this
.
$message
.
warning
(
"
请输入密码
"
);
}
if
(
!
this
.
form
.
securityCode
.
length
){
return
this
.
$message
.
warning
(
'
请输入验证码
'
)
}
}
this
.
login
();
this
.
login
();
},
},
},
},
data
()
{
};
return
{
loading
:
false
,
redirect
:
this
.
$route
.
query
.
redirect
||
'
/
'
,
securityCodeUrl
:
securityCodeUrl
,
form
:
{
loginName
:
''
,
password
:
''
,
securityCode
:
''
,
}
}
}
}
</
script
>
</
script
>
<
style
lang=
"less"
>
<
style
lang=
"less"
>
.el-divider--horizontal {
margin: 5px 0;
background: 0 0;
border-top: 2px solid #e8eaec;
}
.page-login {
.page-login {
background-image: linear-gradient(45deg, #333, #111);
background-image: linear-gradient(45deg, #333, #111);
background-size: 40px 40px;
background-size: 40px 40px;
margin: 0;
margin: 0;
height: 100%;
height: 100%;
.el-form{
.el-form
{
margin: auto;
margin: auto;
width: 400px;
width: 400px;
padding: 25px 25px 0 0;
padding: 25px 25px 0 0;
background: #fff;
background: #fff;
h1{
h1
{
text-align: center;
text-align: center;
font-size: 20px;
font-size: 20px;
font-weight: 500;
font-weight: 500;
margin-bottom: 20px;
margin-bottom: 20px;
}
}
button{
button
{
margin-top: 10px;
margin-top: 10px;
width: 240px;
width: 240px;
}
}
.el-input-group__append{
.el-input-group__append
{
padding: 0;
padding: 0;
font-size: 0;
font-size: 0;
}
}
}
}
.footer{
.footer
{
height: 80px;
height: 80px;
font-size: 12px;
font-size: 12px;
color: #999;
color: #999;
text-align: center;
text-align: center;
line-height: 80px;
line-height: 80px;
a{
a
{
color: #999;
color: #999;
}
}
}
}
...
...
admin/src/views/login/updatePwd.vue
View file @
f6714003
<
template
>
<
template
>
<layout-form>
<layout-form>
<
Breadcrumb
slot=
'breadcrumb'
:list=
'breadcrumbList'
></Breadcrumb
>
<
!--
<Breadcrumb
slot=
'breadcrumb'
:list=
'breadcrumbList'
></Breadcrumb>
--
>
<el-form
:model=
"extendFormData"
:rules=
"rules"
ref=
"form"
label-width=
"100px"
size=
'small'
>
<el-form
:model=
"extendFormData"
:rules=
"rules"
ref=
"form"
label-width=
"100px"
size=
'small'
>
<el-row><Field
label=
"旧密码"
prop=
"oldPwd"
v-model=
"extendFormData.oldPwd"
type=
'password'
/></el-row>
<el-row><Field
label=
"旧密码"
prop=
"oldPwd"
v-model=
"extendFormData.oldPwd"
type=
'password'
/></el-row>
<el-row>
<el-row>
...
@@ -41,10 +41,10 @@ export default {
...
@@ -41,10 +41,10 @@ export default {
urls
:
{
urls
:
{
saveUrl
:
'
/login/updatePwd
'
,
saveUrl
:
'
/login/updatePwd
'
,
},
},
breadcrumbList
:
[
//
breadcrumbList: [
{
name
:
'
系统管理
'
,},
//
{name: '系统管理',},
{
name
:
'
修改密码
'
,},
//
{name: '修改密码',},
],
//
],
rules
:
{
rules
:
{
oldPwd
:
[
oldPwd
:
[
{
required
:
true
,
message
:
'
请输入旧密码
'
,
trigger
:
'
blur
'
},
{
required
:
true
,
message
:
'
请输入旧密码
'
,
trigger
:
'
blur
'
},
...
...
admin/vue.config.js
View file @
f6714003
...
@@ -16,7 +16,7 @@ module.exports = {
...
@@ -16,7 +16,7 @@ module.exports = {
hot
:
true
,
//自动保存
hot
:
true
,
//自动保存
proxy
:
{
proxy
:
{
'
/m
'
:
{
'
/m
'
:
{
target
:
'
http://1
27.0.0.1
:18011
'
,
target
:
'
http://1
92.168.0.250
:18011
'
,
changeOrigin
:
true
,
changeOrigin
:
true
,
secure
:
false
secure
:
false
}
}
...
...
admin/yarn.lock
View file @
f6714003
...
@@ -3022,21 +3022,16 @@ core-js-compat@^3.40.0, core-js-compat@^3.6.5:
...
@@ -3022,21 +3022,16 @@ core-js-compat@^3.40.0, core-js-compat@^3.6.5:
dependencies:
dependencies:
browserslist "^4.24.4"
browserslist "^4.24.4"
core-js@3
.8.1
:
core-js@3
, core-js@^3.6.5
:
version "3.
8.1
"
version "3.
42.0
"
resolved "https://registry.npmmirror.com/core-js/-/core-js-3.
8.1.tgz#f51523668ac8a294d1285c3b9db44025fda66d4
7"
resolved "https://registry.npmmirror.com/core-js/-/core-js-3.
42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe3
7"
integrity sha512-
9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+ob
g==
integrity sha512-
Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0
g==
core-js@^2.4.0:
core-js@^2.4.0:
version "2.6.12"
version "2.6.12"
resolved "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
resolved "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.6.5:
version "3.42.0"
resolved "https://registry.npmmirror.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37"
integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==
core-util-is@1.0.2:
core-util-is@1.0.2:
version "1.0.2"
version "1.0.2"
resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
...
...
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