Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
safe-campus-bbs
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
万成波
safe-campus-bbs
Commits
3b33817d
Commit
3b33817d
authored
Oct 28, 2025
by
万成波
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
后台企微登录
parent
d66c6978
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
291 additions
and
161 deletions
+291
-161
safe-campus-admin/src/main/resources/application-jxfz.yml
safe-campus-admin/src/main/resources/application-jxfz.yml
+1
-1
safe-campus-bbs-ui/src/api/login.js
safe-campus-bbs-ui/src/api/login.js
+13
-1
safe-campus-bbs-ui/src/permission.js
safe-campus-bbs-ui/src/permission.js
+1
-1
safe-campus-bbs-ui/src/router/index.js
safe-campus-bbs-ui/src/router/index.js
+6
-1
safe-campus-bbs-ui/src/store/modules/user.js
safe-campus-bbs-ui/src/store/modules/user.js
+81
-58
safe-campus-bbs-ui/src/utils/request.js
safe-campus-bbs-ui/src/utils/request.js
+155
-98
safe-campus-bbs-ui/src/views/wechatlogin.vue
safe-campus-bbs-ui/src/views/wechatlogin.vue
+33
-0
safe-campus-bbs-ui/vue.config.js
safe-campus-bbs-ui/vue.config.js
+1
-1
No files found.
safe-campus-admin/src/main/resources/application-jxfz.yml
View file @
3b33817d
...
...
@@ -95,7 +95,7 @@ spring:
# 企业微信配置
wx
:
cp
:
pc-redirect-url
:
https://wecom.jift.edu.cn/bbs/pc
pc-redirect-url
:
https://wecom.jift.edu.cn/bbs/pc
/wechatlogin
mobile-redirect-url
:
https://wecom.jift.edu.cn/bbs/h5/pages/login/login
corp-id
:
wxd2a84aa7529d3801
app-configs
:
...
...
safe-campus-bbs-ui/src/api/login.js
View file @
3b33817d
...
...
@@ -57,3 +57,15 @@ export function getCodeImg() {
timeout
:
20000
})
}
// 企业
export
function
loginByWechatWork
(
data
)
{
return
request
({
url
:
'
/pc/code/login
'
,
headers
:
{
isToken
:
false
},
method
:
'
post
'
,
data
:
data
})
}
safe-campus-bbs-ui/src/permission.js
View file @
3b33817d
...
...
@@ -8,7 +8,7 @@ import { isRelogin } from '@/utils/request'
NProgress
.
configure
({
showSpinner
:
false
})
const
whiteList
=
[
'
/login
'
,
'
/register
'
]
const
whiteList
=
[
'
/login
'
,
'
/register
'
,
'
/wechatlogin
'
]
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
NProgress
.
start
()
...
...
safe-campus-bbs-ui/src/router/index.js
View file @
3b33817d
...
...
@@ -46,6 +46,11 @@ export const constantRoutes = [
component
:
()
=>
import
(
'
@/views/login
'
),
hidden
:
true
},
{
path
:
'
/wechatlogin
'
,
component
:
()
=>
import
(
'
@/views/wechatlogin
'
),
hidden
:
true
},
{
path
:
'
/register
'
,
component
:
()
=>
import
(
'
@/views/register
'
),
...
...
@@ -177,7 +182,7 @@ Router.prototype.replace = function push(location) {
}
export
default
new
Router
({
base
:
'
/bbspc
'
,
base
:
'
/bbs
/
pc
'
,
mode
:
'
history
'
,
// 去掉url中的#
scrollBehavior
:
()
=>
({
y
:
0
}),
routes
:
constantRoutes
...
...
safe-campus-bbs-ui/src/store/modules/user.js
View file @
3b33817d
import
{
login
,
logout
,
getInfo
}
from
'
@/api/login
'
import
{
getToken
,
setToken
,
removeToken
}
from
'
@/utils/auth
'
import
{
login
,
logout
,
getInfo
,
loginByWechatWork
}
from
"
@/api/login
"
;
import
{
getToken
,
setToken
,
removeToken
}
from
"
@/utils/auth
"
;
const
user
=
{
state
:
{
token
:
getToken
(),
name
:
''
,
avatar
:
''
,
name
:
""
,
avatar
:
""
,
roles
:
[],
permissions
:
[]
permissions
:
[]
,
},
mutations
:
{
SET_TOKEN
:
(
state
,
token
)
=>
{
state
.
token
=
token
state
.
token
=
token
;
},
SET_NAME
:
(
state
,
name
)
=>
{
state
.
name
=
name
state
.
name
=
name
;
},
SET_AVATAR
:
(
state
,
avatar
)
=>
{
state
.
avatar
=
avatar
state
.
avatar
=
avatar
;
},
SET_ROLES
:
(
state
,
roles
)
=>
{
state
.
roles
=
roles
state
.
roles
=
roles
;
},
SET_PERMISSIONS
:
(
state
,
permissions
)
=>
{
state
.
permissions
=
permissions
}
state
.
permissions
=
permissions
;
}
,
},
actions
:
{
getWechatLogin
({
commit
},
code
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
loginByWechatWork
({
code
})
.
then
((
res
)
=>
{
setToken
(
res
.
data
);
commit
(
"
SET_TOKEN
"
,
res
.
data
);
resolve
(
res
);
})
.
catch
((
error
)
=>
{
reject
(
error
);
});
});
},
// 登录
Login
({
commit
},
userInfo
)
{
const
username
=
userInfo
.
username
.
trim
()
const
password
=
userInfo
.
password
const
code
=
userInfo
.
code
const
uuid
=
userInfo
.
uuid
const
username
=
userInfo
.
username
.
trim
()
;
const
password
=
userInfo
.
password
;
const
code
=
userInfo
.
code
;
const
uuid
=
userInfo
.
uuid
;
return
new
Promise
((
resolve
,
reject
)
=>
{
login
(
username
,
password
,
code
,
uuid
).
then
(
res
=>
{
setToken
(
res
.
token
)
commit
(
'
SET_TOKEN
'
,
res
.
token
)
resolve
()
}).
catch
(
error
=>
{
reject
(
error
)
})
login
(
username
,
password
,
code
,
uuid
)
.
then
((
res
)
=>
{
setToken
(
res
.
token
);
commit
(
"
SET_TOKEN
"
,
res
.
token
);
resolve
();
})
.
catch
((
error
)
=>
{
reject
(
error
);
});
});
},
// 获取用户信息
GetInfo
({
commit
,
state
})
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getInfo
().
then
(
res
=>
{
const
user
=
res
.
user
const
avatar
=
(
user
.
avatar
==
""
||
user
.
avatar
==
null
)
?
require
(
"
@/assets/images/profile.jpg
"
)
:
process
.
env
.
VUE_APP_BASE_API
+
user
.
avatar
;
if
(
res
.
roles
&&
res
.
roles
.
length
>
0
)
{
// 验证返回的roles是否是一个非空数组
commit
(
'
SET_ROLES
'
,
res
.
roles
)
commit
(
'
SET_PERMISSIONS
'
,
res
.
permissions
)
getInfo
()
.
then
((
res
)
=>
{
const
user
=
res
.
user
;
const
avatar
=
user
.
avatar
==
""
||
user
.
avatar
==
null
?
require
(
"
@/assets/images/profile.jpg
"
)
:
process
.
env
.
VUE_APP_BASE_API
+
user
.
avatar
;
if
(
res
.
roles
&&
res
.
roles
.
length
>
0
)
{
// 验证返回的roles是否是一个非空数组
commit
(
"
SET_ROLES
"
,
res
.
roles
);
commit
(
"
SET_PERMISSIONS
"
,
res
.
permissions
);
}
else
{
commit
(
'
SET_ROLES
'
,
[
'
ROLE_DEFAULT
'
])
commit
(
"
SET_ROLES
"
,
[
"
ROLE_DEFAULT
"
]);
}
commit
(
'
SET_NAME
'
,
user
.
userName
)
commit
(
'
SET_AVATAR
'
,
avatar
)
resolve
(
res
)
}).
catch
(
error
=>
{
reject
(
error
)
})
commit
(
"
SET_NAME
"
,
user
.
userName
);
commit
(
"
SET_AVATAR
"
,
avatar
);
resolve
(
res
);
})
.
catch
((
error
)
=>
{
reject
(
error
);
});
});
},
// 退出系统
LogOut
({
commit
,
state
})
{
return
new
Promise
((
resolve
,
reject
)
=>
{
logout
(
state
.
token
).
then
(()
=>
{
commit
(
'
SET_TOKEN
'
,
''
)
commit
(
'
SET_ROLES
'
,
[])
commit
(
'
SET_PERMISSIONS
'
,
[])
removeToken
()
resolve
()
}).
catch
(
error
=>
{
reject
(
error
)
})
logout
(
state
.
token
)
.
then
(()
=>
{
commit
(
"
SET_TOKEN
"
,
""
);
commit
(
"
SET_ROLES
"
,
[]);
commit
(
"
SET_PERMISSIONS
"
,
[]);
removeToken
();
resolve
();
})
.
catch
((
error
)
=>
{
reject
(
error
);
});
});
},
// 前端 登出
FedLogOut
({
commit
})
{
return
new
Promise
(
resolve
=>
{
commit
(
'
SET_TOKEN
'
,
''
)
removeToken
()
resolve
()
})
}
}
}
return
new
Promise
(
(
resolve
)
=>
{
commit
(
"
SET_TOKEN
"
,
""
);
removeToken
()
;
resolve
()
;
})
;
}
,
}
,
}
;
export
default
user
export
default
user
;
safe-campus-bbs-ui/src/utils/request.js
View file @
3b33817d
import
axios
from
'
axios
'
import
{
Notification
,
MessageBox
,
Message
,
Loading
}
from
'
element-ui
'
import
store
from
'
@/store
'
import
{
getToken
}
from
'
@/utils/auth
'
import
errorCode
from
'
@/utils/errorCode
'
import
axios
from
"
axios
"
;
import
{
Notification
,
MessageBox
,
Message
,
Loading
}
from
"
element-ui
"
;
import
store
from
"
@/store
"
;
import
{
getToken
}
from
"
@/utils/auth
"
;
import
errorCode
from
"
@/utils/errorCode
"
;
import
{
tansParams
,
blobValidate
}
from
"
@/utils/ruoyi
"
;
import
cache
from
'
@/plugins/cache
'
import
{
saveAs
}
from
'
file-saver
'
import
cache
from
"
@/plugins/cache
"
;
import
{
saveAs
}
from
"
file-saver
"
;
let
downloadLoadingInstance
;
// 是否显示重新登录
export
let
isRelogin
=
{
show
:
false
};
axios
.
defaults
.
headers
[
'
Content-Type
'
]
=
'
application/json;charset=utf-8
'
axios
.
defaults
.
headers
[
"
Content-Type
"
]
=
"
application/json;charset=utf-8
"
;
// 创建axios实例
const
service
=
axios
.
create
({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL
:
process
.
env
.
VUE_APP_BASE_API
,
// 超时
timeout
:
30000
})
timeout
:
30000
,
});
// 判断是否为企业微信环境
const
isWeComEnv
=
()
=>
{
// 企业微信环境的userAgent特征
const
userAgent
=
window
.
navigator
.
userAgent
.
toLowerCase
();
return
(
userAgent
.
includes
(
"
wxwork
"
)
||
(
userAgent
.
includes
(
"
micromessenger
"
)
&&
userAgent
.
includes
(
"
wxwork
"
))
);
};
// request拦截器
service
.
interceptors
.
request
.
use
(
config
=>
{
service
.
interceptors
.
request
.
use
(
(
config
)
=>
{
// 是否需要设置 token
const
isToken
=
(
config
.
headers
||
{}).
isToken
===
false
const
isToken
=
(
config
.
headers
||
{}).
isToken
===
false
;
// 是否需要防止数据重复提交
const
isRepeatSubmit
=
(
config
.
headers
||
{}).
repeatSubmit
===
false
const
isRepeatSubmit
=
(
config
.
headers
||
{}).
repeatSubmit
===
false
;
if
(
getToken
()
&&
!
isToken
)
{
config
.
headers
[
'
Authorization
'
]
=
'
Bearer
'
+
getToken
()
// 让每个请求携带自定义token 请根据实际情况自行修改
config
.
headers
[
"
Authorization
"
]
=
"
Bearer
"
+
getToken
();
// 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if
(
config
.
method
===
'
get
'
&&
config
.
params
)
{
let
url
=
config
.
url
+
'
?
'
+
tansParams
(
config
.
params
);
if
(
config
.
method
===
"
get
"
&&
config
.
params
)
{
let
url
=
config
.
url
+
"
?
"
+
tansParams
(
config
.
params
);
url
=
url
.
slice
(
0
,
-
1
);
config
.
params
=
{};
config
.
url
=
url
;
}
if
(
!
isRepeatSubmit
&&
(
config
.
method
===
'
post
'
||
config
.
method
===
'
put
'
))
{
if
(
!
isRepeatSubmit
&&
(
config
.
method
===
"
post
"
||
config
.
method
===
"
put
"
)
)
{
const
requestObj
=
{
url
:
config
.
url
,
data
:
typeof
config
.
data
===
'
object
'
?
JSON
.
stringify
(
config
.
data
)
:
config
.
data
,
time
:
new
Date
().
getTime
()
}
const
sessionObj
=
cache
.
session
.
getJSON
(
'
sessionObj
'
)
if
(
sessionObj
===
undefined
||
sessionObj
===
null
||
sessionObj
===
''
)
{
cache
.
session
.
setJSON
(
'
sessionObj
'
,
requestObj
)
data
:
typeof
config
.
data
===
"
object
"
?
JSON
.
stringify
(
config
.
data
)
:
config
.
data
,
time
:
new
Date
().
getTime
(),
};
const
sessionObj
=
cache
.
session
.
getJSON
(
"
sessionObj
"
);
if
(
sessionObj
===
undefined
||
sessionObj
===
null
||
sessionObj
===
""
)
{
cache
.
session
.
setJSON
(
"
sessionObj
"
,
requestObj
);
}
else
{
const
s_url
=
sessionObj
.
url
;
// 请求地址
const
s_data
=
sessionObj
.
data
;
// 请求数据
const
s_time
=
sessionObj
.
time
;
// 请求时间
const
interval
=
1000
;
// 间隔时间(ms),小于此时间视为重复提交
if
(
s_data
===
requestObj
.
data
&&
requestObj
.
time
-
s_time
<
interval
&&
s_url
===
requestObj
.
url
)
{
const
message
=
'
数据正在处理,请勿重复提交
'
;
console
.
warn
(
`[
${
s_url
}
]: `
+
message
)
return
Promise
.
reject
(
new
Error
(
message
))
if
(
s_data
===
requestObj
.
data
&&
requestObj
.
time
-
s_time
<
interval
&&
s_url
===
requestObj
.
url
)
{
const
message
=
"
数据正在处理,请勿重复提交
"
;
console
.
warn
(
`[
${
s_url
}
]: `
+
message
);
return
Promise
.
reject
(
new
Error
(
message
));
}
else
{
cache
.
session
.
setJSON
(
'
sessionObj
'
,
requestObj
)
cache
.
session
.
setJSON
(
"
sessionObj
"
,
requestObj
);
}
}
}
return
config
;
},
(
error
)
=>
{
console
.
log
(
error
);
Promise
.
reject
(
error
);
}
return
config
},
error
=>
{
console
.
log
(
error
)
Promise
.
reject
(
error
)
})
);
// 响应拦截器
service
.
interceptors
.
response
.
use
(
res
=>
{
service
.
interceptors
.
response
.
use
(
(
res
)
=>
{
// 未设置状态码则默认成功状态
const
code
=
res
.
data
.
code
||
200
;
// 获取错误信息
const
msg
=
errorCode
[
code
]
||
res
.
data
.
msg
||
errorCode
[
'
default
'
]
const
msg
=
errorCode
[
code
]
||
res
.
data
.
msg
||
errorCode
[
"
default
"
];
// 二进制数据则直接返回
if
(
res
.
request
.
responseType
===
'
blob
'
||
res
.
request
.
responseType
===
'
arraybuffer
'
)
{
return
res
.
data
if
(
res
.
request
.
responseType
===
"
blob
"
||
res
.
request
.
responseType
===
"
arraybuffer
"
)
{
return
res
.
data
;
}
if
(
code
===
401
)
{
if
(
!
isRelogin
.
show
)
{
if
(
isWeComEnv
())
{
console
.
log
(
res
.
data
.
data
);
if
(
res
.
data
.
data
&&
res
.
data
.
data
.
indexOf
(
"
http
"
)
===
0
)
{
window
.
location
=
res
.
data
.
data
;
}
}
else
if
(
!
isRelogin
.
show
)
{
isRelogin
.
show
=
true
;
MessageBox
.
confirm
(
'
登录状态已过期,您可以继续留在该页面,或者重新登录
'
,
'
系统提示
'
,
{
confirmButtonText
:
'
重新登录
'
,
cancelButtonText
:
'
取消
'
,
type
:
'
warning
'
}).
then
(()
=>
{
MessageBox
.
confirm
(
"
登录状态已过期,您可以继续留在该页面,或者重新登录
"
,
"
系统提示
"
,
{
confirmButtonText
:
"
重新登录
"
,
cancelButtonText
:
"
取消
"
,
type
:
"
warning
"
,
}
)
.
then
(()
=>
{
isRelogin
.
show
=
false
;
store
.
dispatch
(
'
LogOut
'
).
then
(()
=>
{
location
.
href
=
'
/index
'
;
store
.
dispatch
(
"
LogOut
"
).
then
(()
=>
{
location
.
href
=
"
/index
"
;
});
})
})
.
catch
(()
=>
{
.
catch
(()
=>
{
isRelogin
.
show
=
false
;
});
}
return
Promise
.
reject
(
'
无效的会话,或者会话已过期,请重新登录。
'
)
return
Promise
.
reject
(
"
无效的会话,或者会话已过期,请重新登录。
"
);
}
else
if
(
code
===
500
)
{
Message
({
message
:
msg
,
type
:
'
error
'
})
return
Promise
.
reject
(
new
Error
(
msg
))
Message
({
message
:
msg
,
type
:
"
error
"
});
return
Promise
.
reject
(
new
Error
(
msg
))
;
}
else
if
(
code
===
601
)
{
Message
({
message
:
msg
,
type
:
'
warning
'
})
return
Promise
.
reject
(
'
error
'
)
Message
({
message
:
msg
,
type
:
"
warning
"
});
return
Promise
.
reject
(
"
error
"
);
}
else
if
(
code
!==
200
)
{
Notification
.
error
({
title
:
msg
})
return
Promise
.
reject
(
'
error
'
)
Notification
.
error
({
title
:
msg
})
;
return
Promise
.
reject
(
"
error
"
);
}
else
{
return
res
.
data
return
res
.
data
;
}
},
error
=>
{
console
.
log
(
'
err
'
+
error
)
(
error
)
=>
{
console
.
log
(
"
err
"
+
error
);
let
{
message
}
=
error
;
if
(
message
==
"
Network Error
"
)
{
message
=
"
后端接口连接异常
"
;
...
...
@@ -111,36 +156,48 @@ service.interceptors.response.use(res => {
}
else
if
(
message
.
includes
(
"
Request failed with status code
"
))
{
message
=
"
系统接口
"
+
message
.
substr
(
message
.
length
-
3
)
+
"
异常
"
;
}
Message
({
message
:
message
,
type
:
'
error
'
,
duration
:
5
*
1000
})
return
Promise
.
reject
(
error
)
Message
({
message
:
message
,
type
:
"
error
"
,
duration
:
5
*
1000
});
return
Promise
.
reject
(
error
)
;
}
)
)
;
// 通用下载方法
export
function
download
(
url
,
params
,
filename
,
config
)
{
downloadLoadingInstance
=
Loading
.
service
({
text
:
"
正在下载数据,请稍候
"
,
spinner
:
"
el-icon-loading
"
,
background
:
"
rgba(0, 0, 0, 0.7)
"
,
})
return
service
.
post
(
url
,
params
,
{
transformRequest
:
[(
params
)
=>
{
return
tansParams
(
params
)
}],
headers
:
{
'
Content-Type
'
:
'
application/x-www-form-urlencoded
'
},
responseType
:
'
blob
'
,
...
config
}).
then
(
async
(
data
)
=>
{
downloadLoadingInstance
=
Loading
.
service
({
text
:
"
正在下载数据,请稍候
"
,
spinner
:
"
el-icon-loading
"
,
background
:
"
rgba(0, 0, 0, 0.7)
"
,
});
return
service
.
post
(
url
,
params
,
{
transformRequest
:
[
(
params
)
=>
{
return
tansParams
(
params
);
},
],
headers
:
{
"
Content-Type
"
:
"
application/x-www-form-urlencoded
"
},
responseType
:
"
blob
"
,
...
config
,
})
.
then
(
async
(
data
)
=>
{
const
isBlob
=
blobValidate
(
data
);
if
(
isBlob
)
{
const
blob
=
new
Blob
([
data
])
saveAs
(
blob
,
filename
)
const
blob
=
new
Blob
([
data
]);
saveAs
(
blob
,
filename
);
}
else
{
const
resText
=
await
data
.
text
();
const
rspObj
=
JSON
.
parse
(
resText
);
const
errMsg
=
errorCode
[
rspObj
.
code
]
||
rspObj
.
msg
||
errorCode
[
'
default
'
]
const
errMsg
=
errorCode
[
rspObj
.
code
]
||
rspObj
.
msg
||
errorCode
[
"
default
"
];
Message
.
error
(
errMsg
);
}
downloadLoadingInstance
.
close
();
}).
catch
((
r
)
=>
{
console
.
error
(
r
)
Message
.
error
(
'
下载文件出现错误,请联系管理员!
'
)
downloadLoadingInstance
.
close
();
})
.
catch
((
r
)
=>
{
console
.
error
(
r
);
Message
.
error
(
"
下载文件出现错误,请联系管理员!
"
);
downloadLoadingInstance
.
close
();
});
}
export
default
service
export
default
service
;
safe-campus-bbs-ui/src/views/wechatlogin.vue
0 → 100644
View file @
3b33817d
<
template
>
<div>
</div>
</
template
>
<
script
>
import
{
mapActions
}
from
'
vuex
'
export
default
{
mounted
()
{
if
(
this
.
isWeComEnv
())
{
// 企业微信环境处理
const
code
=
this
.
$route
.
query
.
code
this
.
getWechatLogin
(
code
).
then
(()
=>
{
this
.
$router
.
replace
(
'
/
'
)
})
}
else
{
// 非企业微信环境,跳转到普通登录页
this
.
$router
.
replace
(
'
/login
'
)
}
},
methods
:
{
// 判断是否为企业微信环境
isWeComEnv
()
{
// return true
const
userAgent
=
window
.
navigator
.
userAgent
.
toLowerCase
()
return
userAgent
.
includes
(
'
wxwork
'
)
||
(
userAgent
.
includes
(
'
micromessenger
'
)
&&
userAgent
.
includes
(
'
wxwork
'
))
},
// 映射 Vuex 中的 getWechatLogin 方法
...
mapActions
([
'
getWechatLogin
'
])
}
}
</
script
>
safe-campus-bbs-ui/vue.config.js
View file @
3b33817d
...
...
@@ -18,7 +18,7 @@ module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath
:
process
.
env
.
NODE_ENV
===
"
production
"
?
"
/bbspc
"
:
"
/
"
,
publicPath
:
process
.
env
.
NODE_ENV
===
"
production
"
?
"
/bbs
/
pc
"
:
"
/
"
,
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir
:
'
dist
'
,
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
...
...
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