v1.2.0 bug修复

This commit is contained in:
yaoqin 2025-08-15 17:33:35 +08:00
parent e50db2f719
commit 88ae7714b5
30 changed files with 463 additions and 370 deletions

View File

@ -9,7 +9,6 @@
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
"@dreysolano/prerender-spa-plugin": "^1.0.3",
"@stomp/stompjs": "^7.1.1", "@stomp/stompjs": "^7.1.1",
"@tinymce/tinymce-vue": "^6.2.0", "@tinymce/tinymce-vue": "^6.2.0",
"amfe-flexible": "^2.2.1", "amfe-flexible": "^2.2.1",
@ -35,15 +34,12 @@
"@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0", "@vue/cli-service": "~5.0.0",
"compression-webpack-plugin": "^6.1.1",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3", "eslint-plugin-vue": "^8.0.3",
"less": "^4.2.0", "less": "^4.2.0",
"less-loader": "^12.2.0", "less-loader": "^12.2.0",
"sass": "^1.79.1", "sass": "^1.79.1",
"sass-loader": "^12.6.0", "sass-loader": "^12.6.0",
"sitemap-webpack-plugin": "^1.1.1", "vue-template-compiler": "^2.6.14"
"vue-template-compiler": "^2.6.14",
"webpack-merge": "^6.0.1"
} }
} }

View File

@ -194,7 +194,7 @@ export const AccessMiningPool_en = {
estimatedTimeDgbs:"≈ 10 minutes", estimatedTimeDgbs:"≈ 10 minutes",
estimatedTimeDgbq:"≈ 10 minutes", estimatedTimeDgbq:"≈ 10 minutes",
estimatedTimeDgbo:"≈ 10 minutes", estimatedTimeDgbo:"≈ 10 minutes",
estimatedTimeMona:"≈ 25 hours", estimatedTimeMona:"≈ 2.5 hours",
estimatedTimeAlph:" 500 minutes", estimatedTimeAlph:" 500 minutes",
estimatedTimeEnx:"", estimatedTimeEnx:"",
describeNexa:"For example, if a 1,000,000 NEXA reward was earned on 1-1, that reward will be paid out approximately 7 days later (1-8), depending on actual block heights", describeNexa:"For example, if a 1,000,000 NEXA reward was earned on 1-1, that reward will be paid out approximately 7 days later (1-8), depending on actual block heights",

View File

@ -150,7 +150,22 @@ export const backendSystem_zh = {
selectCurrency:"选择币种", selectCurrency:"选择币种",
pleaseSelectCurrency2:"添加挖矿教程,请选择币种", pleaseSelectCurrency2:"添加挖矿教程,请选择币种",
pleaseInputTitle:"请输入标题", pleaseInputTitle:"请输入标题",
searchResult:"搜索结果",
returnSearch:"返回搜索",
keyword:"关键词",
find:"找到",
relatedResults:"条相关结果",
documentIcon:"文档图标",
preview:"预览",
noResult:"未找到相关结果",
keyword2:"关键词",
noMatch:"没有找到匹配的文档",
resetSearch:"重新搜索",
类型:"类型",
创建时间:"创建时间",
创建者:"创建者",
} }
} }
@ -307,7 +322,20 @@ export const backendSystem_en = {
pleaseSelectCurrency2:"Please select a currency when adding mining tutorials", pleaseSelectCurrency2:"Please select a currency when adding mining tutorials",
pleaseInputContent2:"Please input content", pleaseInputContent2:"Please input content",
pleaseInputTitle:"Please input title", pleaseInputTitle:"Please input title",
searchResult:"Search Result",
returnSearch:"Return Search",
keyword:"Keyword",
find:"Find",
relatedResults:"Items",
documentIcon:"Document Icon",
preview:"Preview",
noResult:"No Related Results",
keyword2:"Keyword",
noMatch:"No Matching Document",
resetSearch:"Reset Search",
类型:"Type",
创建时间:"Create Time",
创建者:"Create User",
} }
} }

View File

@ -42,6 +42,19 @@ Vue.prototype.$isMobile = isNarrowScreen
/**
* 全局处理未捕获的 Promise 拒绝仅限网络类错误
* 防止错误遮罩层把页面完全遮挡不影响其他错误的默认行为
*/
window.addEventListener('unhandledrejection', (event) => {
const reason = event && event.reason;
const message = typeof reason === 'string' ? reason : (reason && reason.message);
if (message && (message === 'Network Error' || message.includes('timeout'))) {
event.preventDefault();
console.warn('[unhandledrejection] blocked network error:', message);
}
});
// 在路由守卫中设置 // 在路由守卫中设置
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
// 从路由中获取语言参数 // 从路由中获取语言参数

View File

@ -30,6 +30,12 @@ export function getAllValidPaths() {
'/BKWorkDetails', '/BKWorkDetails',
'/dataDisplay', '/dataDisplay',
'/alerts', '/alerts',
'/helpCenter',
'/commonProblem',
'/announcementDetails',
'/searchResult',
'/announcements',
'/announcementDetails',
// 个人中心子页面 // 个人中心子页面
'/personalCenter', '/personalCenter',

View File

@ -1,4 +1,10 @@
import { documentsList,findDataInfo} from '../../api/documentManagement' import { documentsList,findDataInfo} from '../../api/documentManagement'
/**
* 本地存储选中的问题ID的键名
* @type {string}
*/
const SELECTED_PROBLEM_ID_KEY = 'announcementDetails:selectedId'
export default { export default {
data() { data() {
return { return {
@ -34,11 +40,11 @@ export default {
}; };
}, },
mounted() { mounted() {
this.DetailsParams.id = this.$route.query.id; // this.DetailsParams.id = this.$route.query.id;
console.log(this.$route.query.id,"this.DetailsParams.id"); // console.log(this.$route.query.id,"this.DetailsParams.id");
if (this.DetailsParams.id) { // if (this.DetailsParams.id) {
this.fetchProblemDetails(this.DetailsParams) // this.fetchProblemDetails(this.DetailsParams)
} // }
this.fetchProblemsList(this.listParams) this.fetchProblemsList(this.listParams)
}, },
methods: { methods: {
@ -47,8 +53,33 @@ export default {
const res = await documentsList(params) const res = await documentsList(params)
if(res && res.code === 200){ if(res && res.code === 200){
this.problems = res.rows; this.problems = res.rows;
// this.DetailsParams.id = this.problems[0].id; // 优先级URL 参数 > 本地存储 > 列表首项
// this.fetchProblemDetails(this.DetailsParams) const routeId = this.$route && this.$route.query && this.$route.query.id ? String(this.$route.query.id) : ''
const savedId = this.getSavedSelectedId()
let resolvedId = routeId || savedId || ''
if (!resolvedId && this.problems && this.problems.length > 0) {
resolvedId = String(this.problems[0].id)
}
// 如果存在但不在当前列表中,则回退到首项
if (resolvedId) {
const existsInList = (this.problems || []).some(item => String(item.id) === String(resolvedId))
if (!existsInList && this.problems && this.problems.length > 0) {
resolvedId = String(this.problems[0].id)
}
}
this.DetailsParams.id = resolvedId
// 同步到URL与本地存储
this.persistSelectedId(this.DetailsParams.id)
this.updateRouteQueryId(this.DetailsParams.id)
if (this.DetailsParams.id) {
this.fetchProblemDetails(this.DetailsParams)
}
} }
this.setLoading('problemLoading', false); this.setLoading('problemLoading', false);
}, },
@ -71,9 +102,65 @@ export default {
* @param {number} id 问题ID * @param {number} id 问题ID
*/ */
handleClick(id) { handleClick(id) {
// 更新当前选中ID
this.DetailsParams.id = id; this.DetailsParams.id = id
// 持久化并同步URL
this.persistSelectedId(this.DetailsParams.id)
this.updateRouteQueryId(this.DetailsParams.id)
// 获取详情
this.fetchProblemDetails(this.DetailsParams) this.fetchProblemDetails(this.DetailsParams)
}, },
/**
* 将选中的问题ID持久化到本地存储
* @param {string|number} id 问题ID
* @returns {void}
*/
persistSelectedId(id) {
try {
window.localStorage.setItem(SELECTED_PROBLEM_ID_KEY, String(id))
} catch (error) {
// 上报或静默处理本地存储异常
console.error('persistSelectedId error', error)
}
},
/**
* 读取本地存储中保存的选中问题ID
* @returns {string}
*/
getSavedSelectedId() {
try {
return window.localStorage.getItem(SELECTED_PROBLEM_ID_KEY) || ''
} catch (error) {
console.error('getSavedSelectedId error', error)
return ''
}
},
/**
* 使用 replace 同步更新当前路由的查询参数中的 id
* 避免产生新的历史记录条目
* @param {string|number} id 问题ID
* @returns {void}
*/
updateRouteQueryId(id) {
try {
if (!this.$route) return
const targetId = String(id)
const currentId = this.$route && this.$route.query && this.$route.query.id ? String(this.$route.query.id) : ''
if (currentId === targetId) return
const nextQuery = { ...(this.$route.query || {}), id: targetId }
if (this.$router && typeof this.$router.replace === 'function') {
const maybePromise = this.$router.replace({ query: nextQuery })
if (maybePromise && typeof maybePromise.catch === 'function') {
maybePromise.catch(() => {})
}
}
} catch (error) {
console.error('updateRouteQueryId error', error)
}
},
}, },
}; };

View File

@ -164,6 +164,12 @@ export default {
return return
} }
// 验证每个路径是否以/开头
const invalidPaths = pathArray.filter(path => !path.startsWith('/'));
if (invalidPaths.length > 0) {
this.$message.error(`路径必须以 / 开头: ${invalidPaths.join(', ')}`);
return
}
if (this.addParams.buttonContent) { if (this.addParams.buttonContent) {
// 兼容中英文逗号分割 // 兼容中英文逗号分割
@ -187,14 +193,6 @@ export default {
} }
// 验证每个路径是否有效
const invalidPaths = pathArray.filter(path => !isValidPath(path));
if (invalidPaths.length > 0) {
const suggestions = getPathSuggestions(invalidPaths[0]);
this.$message.error(`${this.$t("backendSystem.invalidPath")}: ${invalidPaths.join(', ')}${this.$t("backendSystem.invalidPathSuggestions")}: ${suggestions.slice(0, 3).join(', ')}`);
return
}
// 验证通过,保持字符串格式传给后端(不转换为数组) // 验证通过,保持字符串格式传给后端(不转换为数组)
// this.addParams.buttonPath 保持原始字符串格式 // this.addParams.buttonPath 保持原始字符串格式
} }
@ -254,14 +252,12 @@ export default {
return return
} }
// 验证每个路径是否有效 // 验证每个路径是否以/开头
const invalidPaths = pathArray.filter(path => !isValidPath(path)); const invalidPaths = pathArray.filter(path => !path.startsWith('/'));
if (invalidPaths.length > 0) { if (invalidPaths.length > 0) {
const suggestions = getPathSuggestions(invalidPaths[0]); this.$message.error(`路径必须以 / 开头: ${invalidPaths.join(', ')}`);
this.$message.error(`${this.$t("backendSystem.invalidPath")}: ${invalidPaths.join(', ')}${this.$t("backendSystem.invalidPathSuggestions")}: ${suggestions.slice(0, 3).join(', ')}`);
return return
} }
} }
} else { } else {
this.$message.warning(this.$t("backendSystem.pleaseInputButtonContentAndPath")) this.$message.warning(this.$t("backendSystem.pleaseInputButtonContentAndPath"))
@ -363,23 +359,19 @@ export default {
* @returns {Array} 路径建议列表 * @returns {Array} 路径建议列表
*/ */
getValidPathSuggestions() { getValidPathSuggestions() {
return getPathSuggestions('').slice(0, 8); // 返回前8个常用路径 // 移除路径建议,返回空数组
return [];
}, },
/** /**
* 显示路径使用帮助 * 显示路径使用帮助
*/ */
showPathHelp() { showPathHelp() {
const suggestions = this.getValidPathSuggestions();
const helpMessage = ` const helpMessage = `
常用路径示例
${suggestions.slice(0, 10).join('\n')}
路径规则 路径规则
多个路径用逗号分隔 多个路径用逗号分隔
路径必须以 / 开头 路径格式自由不做严格验证
支持动态路由参数 支持任意路径格式
不要包含域名只写路径部分
`; `;
this.$alert(helpMessage, '路径格式说明', { this.$alert(helpMessage, '路径格式说明', {
@ -399,7 +391,7 @@ export default {
return []; return [];
} }
return buttonContent return buttonContent
.split(',') .split(/[,]/)
.map(btn => btn.trim()) .map(btn => btn.trim())
.filter(btn => btn); .filter(btn => btn);
}, },
@ -414,7 +406,7 @@ export default {
return []; return [];
} }
return buttonPath return buttonPath
.split(',') .split(/[,]/)
.map(path => path.trim()) .map(path => path.trim())
.filter(path => path); .filter(path => path);
}, },

View File

@ -1,4 +1,10 @@
import { documentsList,findDataInfo} from '../../api/documentManagement' import { documentsList,findDataInfo} from '../../api/documentManagement'
/**
* 本地存储选中的问题ID的键名常见问题页
* @type {string}
*/
const SELECTED_PROBLEM_ID_KEY = 'commonProblem:selectedId'
export default { export default {
data() { data() {
return { return {
@ -46,14 +52,29 @@ export default {
const res = await documentsList(params) const res = await documentsList(params)
if(res && res.code === 200){ if(res && res.code === 200){
this.problems = res.rows; this.problems = res.rows;
if (this.$route.query.id) { // 优先级URL 参数 > 本地存储 > 列表首项
this.DetailsParams.id = this.$route.query.id const routeId = this.$route && this.$route.query && this.$route.query.id ? String(this.$route.query.id) : ''
const savedId = this.getSavedSelectedId()
}else if(this.problems.length > 0){ let resolvedId = routeId || savedId || ''
this.DetailsParams.id = this.problems[0].id;
} if (!resolvedId && this.problems && this.problems.length > 0) {
this.fetchProblemDetails(this.DetailsParams) resolvedId = String(this.problems[0].id)
}
if (resolvedId) {
const existsInList = (this.problems || []).some(item => String(item.id) === String(resolvedId))
if (!existsInList && this.problems && this.problems.length > 0) {
resolvedId = String(this.problems[0].id)
}
}
this.DetailsParams.id = resolvedId
this.persistSelectedId(this.DetailsParams.id)
this.updateRouteQueryId(this.DetailsParams.id)
if (this.DetailsParams.id) {
this.fetchProblemDetails(this.DetailsParams)
}
} }
this.setLoading('problemLoading', false); this.setLoading('problemLoading', false);
}, },
@ -76,9 +97,61 @@ export default {
* @param {number} id 问题ID * @param {number} id 问题ID
*/ */
handleClick(id) { handleClick(id) {
this.DetailsParams.id = id; this.DetailsParams.id = id;
this.persistSelectedId(this.DetailsParams.id)
this.updateRouteQueryId(this.DetailsParams.id)
this.fetchProblemDetails(this.DetailsParams) this.fetchProblemDetails(this.DetailsParams)
}, },
/**
* 将选中的问题ID持久化到本地存储
* @param {string|number} id 问题ID
* @returns {void}
*/
persistSelectedId(id) {
try {
window.localStorage.setItem(SELECTED_PROBLEM_ID_KEY, String(id))
} catch (error) {
console.error('persistSelectedId error', error)
}
},
/**
* 读取本地存储中保存的选中问题ID
* @returns {string}
*/
getSavedSelectedId() {
try {
return window.localStorage.getItem(SELECTED_PROBLEM_ID_KEY) || ''
} catch (error) {
console.error('getSavedSelectedId error', error)
return ''
}
},
/**
* 使用 replace 同步更新当前路由的查询参数中的 id
* 避免产生新的历史记录条目
* @param {string|number} id 问题ID
* @returns {void}
*/
updateRouteQueryId(id) {
try {
if (!this.$route) return
const targetId = String(id)
const currentId = this.$route && this.$route.query && this.$route.query.id ? String(this.$route.query.id) : ''
if (currentId === targetId) return
const nextQuery = { ...(this.$route.query || {}), id: targetId }
if (this.$router && typeof this.$router.replace === 'function') {
const maybePromise = this.$router.replace({ query: nextQuery })
if (maybePromise && typeof maybePromise.catch === 'function') {
maybePromise.catch(() => {})
}
}
} catch (error) {
console.error('updateRouteQueryId error', error)
}
},
}, },
}; };

View File

@ -380,7 +380,7 @@ export default Vue.extend({
this.$message.success(this.$t("backendSystem.updateSuccess")); this.$message.success(this.$t("backendSystem.updateSuccess"));
// 稿 // 稿
const LOCAL_STORAGE_KEY = "editor_draft_add"; const LOCAL_STORAGE_KEY = "editor_draft_add";
localStorage.removeItem(LOCAL_STORAGE_KEY); sessionStorage.removeItem(LOCAL_STORAGE_KEY);
this.$router.push({ path: `/${this.$i18n.locale}/documentManagement` }); this.$router.push({ path: `/${this.$i18n.locale}/documentManagement` });
for (const key in this.addParams) { for (const key in this.addParams) {
this.addParams[key] = ""; this.addParams[key] = "";
@ -409,7 +409,7 @@ export default Vue.extend({
}, },
handelAddDocument() { handelAddDocument() {
this.addParams.title = this.addParams.title.trim();
// //
if (this.editor) { if (this.editor) {
this.addParams.content = this.editor.txt.html(); this.addParams.content = this.editor.txt.html();
@ -426,6 +426,17 @@ export default Vue.extend({
}); });
return; return;
} }
if (!this.addParams.title) {
this.$message({
message:
this.$t("backendSystem.pleaseInputTitle") ||
"请输入标题",
type: "warning",
duration: 4000,
showClose: true,
});
return;
}
console.log(this.addParams.type,this.typeArray, "this.addParams.type"); console.log(this.addParams.type,this.typeArray, "this.addParams.type");
if (!this.addParams.type ) { if (!this.addParams.type ) {
@ -449,18 +460,9 @@ export default Vue.extend({
}); });
return; return;
} }
if (!this.addParams.title) {
this.$message({
message:
this.$t("backendSystem.pleaseInputTitle") ||
"请输入标题",
type: "warning",
duration: 4000,
showClose: true,
});
return;
}
if (this.addParams.type == "1" && !this.screenCurrency) { if (this.addParams.type == "1" && !this.screenCurrency) {
this.$message({ this.$message({
@ -598,7 +600,7 @@ export default Vue.extend({
}; };
const LOCAL_STORAGE_KEY = "editor_draft_add"; const LOCAL_STORAGE_KEY = "editor_draft_add";
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(saveData)); sessionStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(saveData));
this.lastSaveTime = saveData.timestamp; this.lastSaveTime = saveData.timestamp;
this.isSaving = false; this.isSaving = false;
} catch (error) { } catch (error) {
@ -610,7 +612,7 @@ export default Vue.extend({
loadFromLocalStorage() { loadFromLocalStorage() {
try { try {
const LOCAL_STORAGE_KEY = "editor_draft_add"; const LOCAL_STORAGE_KEY = "editor_draft_add";
const savedData = localStorage.getItem(LOCAL_STORAGE_KEY); const savedData = sessionStorage.getItem(LOCAL_STORAGE_KEY);
if (savedData) { if (savedData) {
const data = JSON.parse(savedData); const data = JSON.parse(savedData);
console.log(data, "data"); console.log(data, "data");
@ -621,7 +623,7 @@ export default Vue.extend({
if (isExpired) { if (isExpired) {
console.log("本地数据已过期,清除缓存"); console.log("本地数据已过期,清除缓存");
localStorage.removeItem(LOCAL_STORAGE_KEY); sessionStorage.removeItem(LOCAL_STORAGE_KEY);
return; return;
} }
@ -632,10 +634,11 @@ export default Vue.extend({
this.addParams.title = data.title || ""; this.addParams.title = data.title || "";
this.addParams.content = data.content || ""; this.addParams.content = data.content || "";
this.addParams.type = data.type || "1"; this.addParams.type = data.type || "";
this.addParams.imageUrl = data.imageUrl || ""; this.addParams.imageUrl = data.imageUrl || "";
this.lastSaveTime = data.timestamp || ""; this.lastSaveTime = data.timestamp || "";
console.log(data.type,this.typeArray, "data.type"); console.log(data.type,this.typeArray, "data.type");
this.typeArray = [data.type];
// //
if (this.editor) { if (this.editor) {
this.editor.txt.html(data.content || ""); this.editor.txt.html(data.content || "");
@ -651,7 +654,7 @@ export default Vue.extend({
clearDraft() { clearDraft() {
const LOCAL_STORAGE_KEY = "editor_draft_add"; const LOCAL_STORAGE_KEY = "editor_draft_add";
localStorage.removeItem(LOCAL_STORAGE_KEY); sessionStorage.removeItem(LOCAL_STORAGE_KEY);
this.lastSaveTime = ""; this.lastSaveTime = "";
this.isSaving = false; this.isSaving = false;
}, },
@ -779,7 +782,7 @@ export default Vue.extend({
} }
// 稿 // 稿
const LOCAL_STORAGE_KEY = "editor_draft_add"; const LOCAL_STORAGE_KEY = "editor_draft_add";
localStorage.removeItem(LOCAL_STORAGE_KEY); sessionStorage.removeItem(LOCAL_STORAGE_KEY);
this.$message.success( this.$message.success(
this.$t("backendSystem.contentReset") || "内容已重置" this.$t("backendSystem.contentReset") || "内容已重置"
); );

View File

@ -63,7 +63,7 @@ export default {
{//公告中心 {//公告中心
value:"3", value:"3",
label:"backendSystem.announcementCenter", label:"backendSystem.announcementCenter",
articleUrl:"announcementDetails" articleUrl:"announcements"
}, },
{//其他 {//其他
value:"0", value:"0",

View File

@ -375,7 +375,7 @@ export default Vue.extend({
if (this.editor) { if (this.editor) {
this.addParams.content = this.editor.txt.html(); this.addParams.content = this.editor.txt.html();
} }
console.log(this.addParams.content, "this.addParams.content"); this.addParams.title = this.addParams.title.trim();
if (!this.addParams.content.trim()) { if (!this.addParams.content.trim()) {
this.$message({ this.$message({
message: message:
@ -610,10 +610,10 @@ export default Vue.extend({
this.addParams.title = data.title || ""; this.addParams.title = data.title || "";
this.addParams.content = data.content || ""; this.addParams.content = data.content || "";
this.addParams.type = data.type || "1"; this.addParams.type = data.type || "";
this.addParams.imageUrl = data.imageUrl || ""; this.addParams.imageUrl = data.imageUrl || "";
this.lastSaveTime = data.timestamp || ""; this.lastSaveTime = data.timestamp || "";
this.typeArray = [data.type];
// //
if (this.editor) { if (this.editor) {
this.editor.txt.html(data.content || ""); this.editor.txt.html(data.content || "");

View File

@ -69,32 +69,47 @@ export default{
pageSize:10 pageSize:10
}, },
TypeList:[ TypeList:[
{ {//挖矿教程
value:"1", value:"1",
label:"挖矿教程" label:"backendSystem.miningTutorial",
articleUrl:"AccessMiningPool"
}, },
{ {//常见问题
value:"2", value:"2",
label:"常见问题" label:"backendSystem.commonProblems",
articleUrl:"commonProblem"
}, },
{ {//公告中心
value:"3", value:"3",
label:"公告中心" label:"backendSystem.announcementCenter",
articleUrl:"announcements"
}, },
{ {//其他
value:"0", value:"0",
label:"其他" label:"backendSystem.other",
}, articleUrl:"",
children:[{
] value:"1",
label:"home.serviceTerms",
articleUrl:"serviceTerms"
},{
value:"2",
label:"home.rate",
articleUrl:"rate"
},{
value:"3",
label:"home.APIfile",
articleUrl:"apiFile"
}
]
}
],
} }
}, },
mounted(){ mounted(){
try { this.$addStorageEvent(1, "TypeList", JSON.stringify(this.TypeList));
this.TypeList = JSON.parse(localStorage.getItem('TypeList'))
} catch (error) {
console.log(error);
}
this.fetchActivityList(this.activeParams) this.fetchActivityList(this.activeParams)
}, },
methods: { methods: {

View File

@ -2,11 +2,11 @@
<div class="help-center"> <div class="help-center">
<!-- 顶部蓝色渐变背景区域 --> <!-- 顶部蓝色渐变背景区域 -->
<div class="top-section"> <div class="top-section">
<div class="filter-icon"> <!-- <div class="filter-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 7H21L15 13V19L9 15V13L3 7Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 7H21L15 13V19L9 15V13L3 7Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg> </svg>
</div> </div> -->
<!-- 搜索框 --> <!-- 搜索框 -->
<div class="search-container"> <div class="search-container">

View File

@ -1546,6 +1546,7 @@ export default {
this.showCalculator = false this.showCalculator = false
}, },
changeSelection(scope) { changeSelection(scope) {
let brand = scope let brand = scope
for (let index in this.currencyList) { for (let index in this.currencyList) {
@ -1584,6 +1585,32 @@ export default {
this.$router.push(cleanPath); this.$router.push(cleanPath);
} }
},
handelJumpBroadcast(url){
if (url === '/AccessMiningPool') {
const coin = this.currencyList.find(item => item.value === this.params.coin);
if (!coin) return;
// let jumpName = coin.path.charAt(0).toUpperCase() + coin.path.slice(1) //name跳转 首字母大写
let url = `/${this.lang}/AccessMiningPool`
// 使用 name 进行导航,避免重复的路由参数
this.$router.push({
name:'AccessMiningPool',
params: {
coin: this.params.coin,
imgUrl: this.currencyPath
},
replace: false // 保留历史记录,允许回退
});
} else {
this.$router.push(`/${this.lang}${url}`)
}
}, },
handelCalculation() { handelCalculation() {
this.calculateIncome() this.calculateIncome()

View File

@ -69,7 +69,7 @@
:title="buttonText" :title="buttonText"
:key="`button-${item.id}-${buttonIndex}`" :key="`button-${item.id}-${buttonIndex}`"
class="view" class="view"
@click.stop="handelJump(item.buttonPath[buttonIndex])" @click.stop="handelJumpBroadcast(item.buttonPath[buttonIndex])"
> >
{{ buttonText || $t(`home.view`) }} {{ buttonText || $t(`home.view`) }}
</span> </span>
@ -506,7 +506,7 @@
:title="buttonText" :title="buttonText"
:key="`button-${item.id}-${buttonIndex}`" :key="`button-${item.id}-${buttonIndex}`"
class="view" class="view"
@click.stop="handelJump(item.buttonPath[buttonIndex])" @click.stop="handelJumpBroadcast(item.buttonPath[buttonIndex])"
> >
{{ buttonText || $t(`home.view`) }} {{ buttonText || $t(`home.view`) }}
</span> </span>
@ -1485,6 +1485,9 @@ export default {
margin-left: 8px; margin-left: 8px;
color: #6e3edb; color: #6e3edb;
// background: palegoldenrod; // background: palegoldenrod;
text-transform: uppercase ;
} }
.view:hover { .view:hover {
color: #000; color: #000;
@ -1553,6 +1556,7 @@ export default {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
text-transform: capitalize;
&:hover { &:hover {
@ -2074,6 +2078,8 @@ export default {
margin-left: 8px; margin-left: 8px;
color: #6e3edb; color: #6e3edb;
// background: palegoldenrod; // background: palegoldenrod;
text-transform: capitalize;
} }
.view:hover { .view:hover {
color: #000; color: #000;
@ -2142,6 +2148,7 @@ export default {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
text-transform: capitalize;
&:hover { &:hover {
@ -2769,7 +2776,7 @@ export default {
} }
span { span {
margin-top: 10px; margin-top: 10px;
text-transform: uppercase; text-transform: capitalize;
} }
} }
.computationalPower { .computationalPower {
@ -3403,7 +3410,7 @@ export default {
// } // }
// span { // span {
// text-transform: uppercase; // text-transform: capitalize;
// // margin-top: 5px; // // margin-top: 5px;
// // background: gold; // // background: gold;
// width: 90%; // width: 90%;
@ -3474,6 +3481,8 @@ export default {
margin-left: 8px; margin-left: 8px;
color: #6e3edb; color: #6e3edb;
// background: palegoldenrod; // background: palegoldenrod;
text-transform: capitalize;
} }
.view:hover { .view:hover {
color: #000; color: #000;
@ -3555,6 +3564,8 @@ i {
margin-left: 8px; margin-left: 8px;
color: #6e3edb; color: #6e3edb;
// background: palegoldenrod; // background: palegoldenrod;
text-transform: capitalize;
} }
.view:hover { .view:hover {
color: #000; color: #000;
@ -3589,6 +3600,7 @@ i {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
text-transform: capitalize;
&:hover { &:hover {

View File

@ -109,6 +109,8 @@ export default {
* 获取文档类型名称 * 获取文档类型名称
*/ */
getDocumentTypeName(type) { getDocumentTypeName(type) {
console.log(type,"typ俯瞰风景分开发饭饭登记费记得发e",this.documentTypes);
try { try {
let label = this.documentTypes.find(item => item.value == type)?.label let label = this.documentTypes.find(item => item.value == type)?.label
return this.$t(label) return this.$t(label)

View File

@ -4,15 +4,15 @@
<div class="result-header"> <div class="result-header">
<div class="header-container"> <div class="header-container">
<div class="header-left"> <div class="header-left">
<h1 class="page-title">搜索结果</h1> <h1 class="page-title">{{ $t(`backendSystem.searchResult`) || `搜索结果` }} </h1>
<p class="search-info" v-if="searchResults.length > 0"> <p class="search-info" v-if="searchResults.length > 0">
关键词 "<strong>{{ searchKeyword }}</strong>" 找到 <strong>{{ totalCount }}</strong> 条相关结果 {{ $t(`backendSystem.keyword`) || `关键词` }} "<strong>{{ searchKeyword }}</strong>" {{ $t(`backendSystem.find`) || `找到` }} <strong>{{ totalCount }}</strong> {{ $t(`backendSystem.relatedResults`) || `条相关结果` }}
</p> </p>
</div> </div>
<div class="header-right"> <div class="header-right">
<el-button type="primary" @click="goBack"> <el-button type="primary" @click="goBack">
<i class="el-icon-arrow-left"></i> <i class="el-icon-arrow-left"></i>
返回搜索 {{ $t(`backendSystem.returnSearch`) || `返回搜索` }}
</el-button> </el-button>
</div> </div>
</div> </div>
@ -73,7 +73,7 @@
@click.stop="handlePreview(item)" @click.stop="handlePreview(item)"
> >
<i class="el-icon-view"></i> <i class="el-icon-view"></i>
预览 {{ $t(`backendSystem.preview`) || `预览` }}
</el-button> </el-button>
</div> </div>
@ -85,9 +85,9 @@
<div class="no-result-icon"> <div class="no-result-icon">
<i class="el-icon-search"></i> <i class="el-icon-search"></i>
</div> </div>
<h3>未找到相关结果</h3> <h3>{{ $t(`backendSystem.noResult`) || `未找到相关结果` }}</h3>
<p>关键词 "<strong>{{ searchKeyword }}</strong>" 没有找到匹配的文档</p> <p>{{ $t(`backendSystem.keyword`) || `关键词` }} "<strong>{{ searchKeyword }}</strong>" {{ $t(`backendSystem.noMatch`) || `没有找到匹配的文档` }}</p>
<el-button type="primary" @click="goBack">重新搜索</el-button> <el-button type="primary" @click="goBack">{{ $t(`backendSystem.resetSearch`) || `重新搜索` }}</el-button>
</div> </div>
<!-- 分页组件 --> <!-- 分页组件 -->
@ -107,7 +107,7 @@
<!-- 预览对话框 --> <!-- 预览对话框 -->
<el-dialog <el-dialog
title="文档预览" :title="$t(`backendSystem.documentPreview`) || `文档预览`"
:visible.sync="previewVisible" :visible.sync="previewVisible"
width="80%" width="80%"
:before-close="handlePreviewClose" :before-close="handlePreviewClose"
@ -116,9 +116,9 @@
<div class="preview-content" v-if="previewData"> <div class="preview-content" v-if="previewData">
<h2>{{ previewData.title }}</h2> <h2>{{ previewData.title }}</h2>
<div class="preview-meta"> <div class="preview-meta">
<span>类型{{ getDocumentTypeName(previewData.type) }}</span> <span>{{ $t(`backendSystem.type`) || `类型` }}{{ getDocumentTypeName(previewData.type) }}</span>
<span>创建时间{{ formatDate(previewData.createTime) }}</span> <span>{{ $t(`backendSystem.createTime`) || `创建时间` }}{{ formatDate(previewData.createTime) }}</span>
<span>创建者{{ previewData.createUser }}</span> <span>{{ $t(`backendSystem.createUser`) || `创建者` }}{{ previewData.createUser }}</span>
</div> </div>
<div class="preview-body" v-html="previewData.content"></div> <div class="preview-body" v-html="previewData.content"></div>
</div> </div>

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/chunk-vendors-c9ff040c.57bd8c18.js></script><script defer src=/js/app-42f9d7e6.a2ad6942.js></script><script defer src=/js/app-d87c119a.9b7e8112.js></script><script defer src=/js/app-5c551db8.6078f6e3.js></script><script defer src=/js/app-b4c4f6ec.c346427f.js></script><script defer src=/js/app-45954fd3.88a2b2bc.js></script><script defer src=/js/app-ca0caf25.ba8086a4.js></script><script defer src=/js/app-cfd820c8.9d119032.js></script><script defer src=/js/app-f035d474.a2a8f5af.js></script><script defer src=/js/app-7023e5b0.fc505df9.js></script><script defer src=/js/app-113c6c50.0117a862.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-42f9d7e6.3510b1e0.css rel=stylesheet><link href=/css/app-d87c119a.8d130cfb.css rel=stylesheet><link href=/css/app-b4c4f6ec.d99a94fb.css rel=stylesheet><link href=/css/app-45954fd3.bdb4aecd.css rel=stylesheet><link href=/css/app-ca0caf25.a1364666.css rel=stylesheet><link href=/css/app-cfd820c8.2f7622f2.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-7023e5b0.b2dd9d63.css rel=stylesheet><link href=/css/app-113c6c50.36a20683.css rel=stylesheet></head><body><div id=app></div></body></html> <!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><script defer=defer src=/js/chunk-vendors-c0d76f48.f34181ba.js></script><script defer=defer src=/js/chunk-vendors-bc050c32.8062ab74.js></script><script defer=defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer=defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer=defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer=defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer=defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer=defer src=/js/chunk-vendors-377fed06.0e89b4b7.js></script><script defer=defer src=/js/chunk-vendors-c9ff040c.57bd8c18.js></script><script defer=defer src=/js/app-42f9d7e6.2094f944.js></script><script defer=defer src=/js/app-5c551db8.47473daa.js></script><script defer=defer src=/js/app-45954fd3.021a00eb.js></script><script defer=defer src=/js/app-ca0caf25.6463d629.js></script><script defer=defer src=/js/app-f035d474.a2a8f5af.js></script><script defer=defer src=/js/app-113c6c50.f9ecb579.js></script><link href=/css/chunk-vendors-bc050c32.6f97509c.css rel=stylesheet><link href=/css/app-189e7968.08b6b890.css rel=stylesheet></head><body><div id=app></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,278 +1,53 @@
const { defineConfig } = require('@vue/cli-service'); const { defineConfig } = require('@vue/cli-service');
const path = require('path');
const PrerenderSPAPlugin = require('@dreysolano/prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
const SitemapWebpackPlugin = require('sitemap-webpack-plugin').default;
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = defineConfig({ module.exports = defineConfig({
transpileDependencies: true, transpileDependencies: true,
devServer: { // 生产环境不生成source map
hot: true, // 启用HMR productionSourceMap: false,
liveReload: true, // 启用实时重载
client: { configureWebpack: {
overlay: false // 禁用错误遮罩层 optimization: {
splitChunks: {
chunks: 'all',
minSize: 100000, // 增加最小分块大小到100KB
maxSize: 500000, // 增加最大分块大小到500KB
cacheGroups: {
vendors: {
name: 'chunk-vendors',
test: /[\\/]node_modules[\\/]/,
priority: -10,
chunks: 'initial'
},
common: {
name: 'chunk-common',
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
}
}
} }
}, },
configureWebpack: config => {
const baseConfig = {
cache: {
type: 'filesystem', // 使用文件系统缓存 加快二次构建速度 减少重复编译
buildDependencies: {
config: [__filename]
},
// 添加缓存配置
cacheDirectory: path.resolve(__dirname, 'node_modules/.cache/webpack'),
name: process.env.NODE_ENV // 区分环境
},
optimization: {
moduleIds: 'deterministic',
splitChunks: { // 代码分割配置文件系统缓存比内存缓存更持久 可以在多次构建之间复用编译结果
chunks: 'all',
minSize: 30000, // 最小分块大小
maxSize: 300000, // 最大分块大小 避免单个文件过大
cacheGroups: { // 缓存组配置
vendors: { // 第三方库分组
name: 'chunk-vendors',
test: /[\\/]node_modules[\\/]/,
priority: -10,
chunks: 'initial'
},
common: { // 公共模块分组
name: 'chunk-common',
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
},
}
},
plugins: [ //压缩静态资源 减少传输体积 提升加载速度
new CompressionPlugin({
test: /\.(js|css|html|svg)$/,
threshold: 10240,
minRatio: 0.8
})
]
};
if (process.env.NODE_ENV === 'production') {
// 优化预渲染插件配置
const prerenderPlugin = new PrerenderSPAPlugin({
staticDir: path.join(__dirname, 'dist'),
// 只预渲染最重要的路由
routes: ['/zh', '/en','/en/dataDisplay', '/zh/dataDisplay','/zh/rate', '/en/rate','/zh/ServiceTerms', '/en/ServiceTerms','/zh/apiFile', '/en/apiFile'],
renderer: new Renderer({
renderAfterTime: 1000, // 增加等待时间,确保内容加载完成
maxConcurrentRoutes:2, // 降低并发数,避免资源竞争
timeout: 10000, // 增加超时时间
headless: true,
}),
});
const zhSitemapPlugin = new SitemapWebpackPlugin({
base: 'https://m2pool.com/zh',
paths: [
{
path: '/zh',
changefreq: 'daily',
lastmod: new Date().toISOString()
},
{
path: '/zh/dataDisplay',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/ServiceTerms',
changefreq: 'monthly',
lastmod: new Date().toISOString()
},
{
path: '/zh/apiFile',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/rate',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/nexaAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/grsAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/monaAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/dgbsAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/dgbqAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/dgboAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/zh/AccessMiningPool/rxdAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
],
options: {
filename: 'sitemap-zh.xml',
lastmod: true,
changefreq: 'weekly',
priority: 0.7
}
});
const enSitemapPlugin = new SitemapWebpackPlugin({
base: 'https://m2pool.com/en',
paths: [
{
path: '/en',
priority: 1.0,
changefreq: 'daily',
lastmod: new Date().toISOString()
},
{
path: '/en/dataDisplay',
priority: 0.8,
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/ServiceTerms',
priority: 0.6,
changefreq: 'monthly',
lastmod: new Date().toISOString()
},
{
path: '/en/apiFile',
priority: 0.7,
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/rate',
priority: 0.8,
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/nexaAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/grsAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/monaAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/dgbsAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/dgbqAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/dgboAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
{
path: '/en/AccessMiningPool/rxdAccess',
changefreq: 'weekly',
lastmod: new Date().toISOString()
},
],
options: {
filename: 'sitemap-en.xml',
lastmod: true,
changefreq: 'weekly',
priority: 0.7
}
});
baseConfig.plugins.push(zhSitemapPlugin);
baseConfig.plugins.push(enSitemapPlugin);
baseConfig.plugins.push(prerenderPlugin);
}
return baseConfig;
},
chainWebpack: config => { chainWebpack: config => {
// HTML压缩配置 // 移除 prefetch 插件,减少不必要的预加载
config.plugins.delete('prefetch');
// 简化HTML压缩
config.plugin('html').tap(args => { config.plugin('html').tap(args => {
args[0].minify = { args[0].minify = {
removeComments: true, // 删除 HTML 注释减小文件体积 removeComments: true,
collapseWhitespace: true, // 压缩空白字符 删除多余的空格和换行 collapseWhitespace: true,
removeAttributeQuotes: true, // 删除属性的引号 removeAttributeQuotes: true
collapseBooleanAttributes: true, // 简化布尔属性
removeScriptTypeAttributes: true // 删除默认的 script type 属性type="text/javascript"
};
// META 标签配置
args[0].meta = {
// 移动端视口配置
viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no',
'format-detection': 'telephone=no',// 禁用电话号码自动识别
'apple-mobile-web-app-capable': 'yes' // 支持添加到 iOS 主屏幕
}; };
return args; return args;
}); });
// 移除 prefetch 插件
//禁用 Vue CLI 默认的预取功能 prefetch 会在主资源加载完后,
// 自动下载所有其他路由的资源对于大型应用,可能会预加载过多不必要的资源
config.plugins.delete('prefetch')
}, },
//生产环境不生成 source map 文件源码映射信息 减小打包体积 提高网站安全性
productionSourceMap: false,
css: { css: {
extract: true, //组件中的 CSS 提取至独立的 CSS 文件中 支持并行加载,减少页面阻塞 extract: true,
sourceMap: false,// CSS 不启用 source maps 减少构建文件大小 sourceMap: false
loaderOptions: {
css: {}
}
} }
}); });