feat(qianduan): 重构前端结构并添加新功能
- 新增分类创建功能 - 新增笔记创建功能 - 优化笔记列表展示 - 改进笔记预览界面 - 添加删除笔记功能 - 重构菜单选择逻辑 - 优化文件上传处理 - 更新Markdown编辑器配置
This commit is contained in:
10
biji-qianduan/src/utils/URIComponent.js
Normal file
10
biji-qianduan/src/utils/URIComponent.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* 处理参数的其他处理逻辑,如编码、格式化等
|
||||
* @param data
|
||||
* @returns {string}
|
||||
*/
|
||||
const handleCopy =(data) =>{
|
||||
return encodeURIComponent( data)
|
||||
};
|
||||
|
||||
export default handleCopy;
|
||||
32
biji-qianduan/src/utils/axios.js
Normal file
32
biji-qianduan/src/utils/axios.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import axios from 'axios'
|
||||
|
||||
const instance = axios.create({
|
||||
baseURL: import.meta.env.VITE_API_BASE_URL,
|
||||
// 开发环境使用withCredentials,生产环境关闭
|
||||
withCredentials: import.meta.env.DEV,
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
|
||||
// 请求拦截器
|
||||
instance.interceptors.request.use(
|
||||
config => {
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// 响应拦截器
|
||||
instance.interceptors.response.use(
|
||||
response => {
|
||||
return response.data
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
export default instance
|
||||
11
biji-qianduan/src/utils/deviceDetector.js
Normal file
11
biji-qianduan/src/utils/deviceDetector.js
Normal file
@@ -0,0 +1,11 @@
|
||||
/**
|
||||
* 设备检测工具
|
||||
*/
|
||||
export function detectDeviceType() {
|
||||
// 基础检测(User Agent)
|
||||
const ua = navigator.userAgent;
|
||||
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);
|
||||
|
||||
|
||||
return isMobile ? 'mobile' : 'desktop';
|
||||
}
|
||||
55
biji-qianduan/src/utils/handleCopy.js
Normal file
55
biji-qianduan/src/utils/handleCopy.js
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* 处理复制
|
||||
* @param data
|
||||
* @param message
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
const handleCopy = async (data, message) => {
|
||||
// 检查是否在安全上下文中 (HTTPS 或 localhost)
|
||||
const isSecureContext = window.isSecureContext || location.protocol === 'https:';
|
||||
|
||||
if (isSecureContext) {
|
||||
try {
|
||||
// 使用现代剪贴板 API
|
||||
await navigator.clipboard.writeText(data);
|
||||
message.success('已复制到剪贴板');
|
||||
} catch (err) {
|
||||
message.error('现代剪贴板API错误:', err);
|
||||
useFallbackCopy(data, message);
|
||||
}
|
||||
} else {
|
||||
// 非安全上下文直接使用回退方法
|
||||
useFallbackCopy(data, message);
|
||||
}
|
||||
}
|
||||
|
||||
// 回退复制方法
|
||||
function useFallbackCopy(data, message) {
|
||||
try {
|
||||
const textarea = document.createElement('textarea');
|
||||
textarea.value = data;
|
||||
|
||||
// 设置样式确保元素在视口外但可交互
|
||||
textarea.style.position = 'fixed';
|
||||
textarea.style.top = '0';
|
||||
textarea.style.left = '0';
|
||||
textarea.style.opacity = '0';
|
||||
textarea.style.pointerEvents = 'none';
|
||||
|
||||
document.body.appendChild(textarea);
|
||||
textarea.select();
|
||||
|
||||
// 尝试执行复制
|
||||
const success = document.execCommand('copy');
|
||||
document.body.removeChild(textarea);
|
||||
|
||||
if (success) {
|
||||
message.success('已复制');
|
||||
} else {
|
||||
throw new Error('回退复制方法失败');
|
||||
}
|
||||
} catch (err) {
|
||||
message.error('复制失败,请手动复制内容');
|
||||
}
|
||||
}
|
||||
export default handleCopy
|
||||
Reference in New Issue
Block a user