【新增】封装提示框
This commit is contained in:
145
src/main/resources/static/assets/js/message.js
Normal file
145
src/main/resources/static/assets/js/message.js
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
if (!window.Vue) {
|
||||||
|
const vueScript = document.createElement('script');
|
||||||
|
vueScript.src = 'https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.prod.js';
|
||||||
|
document.head.appendChild(vueScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!document.querySelector('link[href*="bootstrap-icons"]')) {
|
||||||
|
const iconLink = document.createElement('link');
|
||||||
|
iconLink.rel = 'stylesheet';
|
||||||
|
iconLink.href = 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css';
|
||||||
|
document.head.appendChild(iconLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
const style = document.createElement('style');
|
||||||
|
style.textContent = `
|
||||||
|
.h5-message-container {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
z-index: 9999;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.h5-message {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 14px 24px;
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
||||||
|
animation: h5MsgShow 0.4s ease-out forwards;
|
||||||
|
}
|
||||||
|
.h5-message.success { background-color: rgba(40, 167, 69, 0.95); }
|
||||||
|
.h5-message.error { background-color: rgba(220, 53, 69, 0.95); }
|
||||||
|
.h5-message.warning { background-color: rgba(255, 193, 7, 0.95); color: #333; }
|
||||||
|
.h5-message.info { background-color: rgba(13, 110, 253, 0.95); }
|
||||||
|
.h5-message-icon {
|
||||||
|
margin-right: 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
@keyframes h5MsgShow {
|
||||||
|
from { opacity: 0; transform: translate(-50%, -50%) scale(0.9); }
|
||||||
|
to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
|
||||||
|
}
|
||||||
|
.h5-message.hide { animation: h5MsgHide 0.4s ease-in forwards; }
|
||||||
|
@keyframes h5MsgHide {
|
||||||
|
from { opacity: 1; transform: translate(-50%, -50%) scale(1); }
|
||||||
|
to { opacity: 0; transform: translate(-50%, -50%) scale(0.9); }
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
document.head.appendChild(style);
|
||||||
|
|
||||||
|
const messageTemplate = `
|
||||||
|
<div class="h5-message" :class="[type, { hide: !visible }]">
|
||||||
|
<i class="h5-message-icon" :class="iconClass"></i>
|
||||||
|
<span>{{ message }}</span>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
const messageInstances = [];
|
||||||
|
function showMessage(options) {
|
||||||
|
if (typeof options === 'string') {
|
||||||
|
options = { message: options };
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
message: '',
|
||||||
|
type: 'info',
|
||||||
|
duration: 3000,
|
||||||
|
...options,
|
||||||
|
duration: Math.max(1000, options.duration || 3000)
|
||||||
|
};
|
||||||
|
|
||||||
|
const checkVueLoaded = setInterval(() => {
|
||||||
|
if (window.Vue) {
|
||||||
|
clearInterval(checkVueLoaded);
|
||||||
|
|
||||||
|
const container = document.createElement('div');
|
||||||
|
container.className = 'h5-message-container';
|
||||||
|
document.body.appendChild(container);
|
||||||
|
const app = Vue.createApp({
|
||||||
|
template: messageTemplate,
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
message: config.message,
|
||||||
|
type: config.type,
|
||||||
|
visible: true
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
iconClass() {
|
||||||
|
const icons = {
|
||||||
|
success: 'bi bi-check-circle',
|
||||||
|
error: 'bi bi-exclamation-circle',
|
||||||
|
warning: 'bi bi-exclamation-triangle',
|
||||||
|
info: 'bi bi-info-circle'
|
||||||
|
};
|
||||||
|
return icons[this.type] || icons.info;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const showTimer = setTimeout(() => {
|
||||||
|
this.visible = false;
|
||||||
|
const hideTimer = setTimeout(() => {
|
||||||
|
|
||||||
|
const index = messageInstances.indexOf(app);
|
||||||
|
if (index > -1) {
|
||||||
|
messageInstances.splice(index, 1);
|
||||||
|
}
|
||||||
|
app.unmount(container);
|
||||||
|
document.body.removeChild(container);
|
||||||
|
clearTimeout(hideTimer);
|
||||||
|
}, 400);
|
||||||
|
|
||||||
|
clearTimeout(showTimer);
|
||||||
|
}, config.duration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const instance = app.mount(container);
|
||||||
|
messageInstances.push(instance);
|
||||||
|
}
|
||||||
|
}, 50);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
clearInterval(checkVueLoaded);
|
||||||
|
if (!window.Vue) {
|
||||||
|
alert(config.message);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
window.$message = showMessage;
|
||||||
|
|
||||||
|
['success', 'error', 'warning', 'info'].forEach(type => {
|
||||||
|
window.$message[type] = (message, duration) => {
|
||||||
|
window.$message({
|
||||||
|
message,
|
||||||
|
type,
|
||||||
|
// 确保时长有效(用户未传则用默认3秒)
|
||||||
|
duration: duration ? Math.max(1000, duration) : 500
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user