theme.vue 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <template>
  2. <div class="theme-pages">
  3. <div class="content-container" v-html="renderedHtml"></div>
  4. </div>
  5. </template>
  6. <script setup lang="ts">
  7. const route = useRoute();
  8. const id = ref<any>(null);
  9. const base64String = ref<any>('');
  10. const renderedHtml = ref<any>('');
  11. const initData = () => {
  12. id.value = route.query.id;
  13. if (id.value == 1) {
  14. base64String.value =
  15. 'PHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxpbWcgc3JjPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNDg5MjQxMDIuanBnIiBhbHQ9IuWbvueJhyIgZGF0YS1ocmVmPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNDg5MjQxMDIuanBnIiBzdHlsZT0iIj48aW1nIHNyYz0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzUyNDIxNTM1LmpwZyIgYWx0PSLlm77niYciIGRhdGEtaHJlZj0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzUyNDIxNTM1LmpwZyIgc3R5bGU9IiI+PGltZyBzcmM9Imh0dHBzOi8veXVueWluZy55b2UzNjUuY29tOjgwNDUvUGhvdG9zLzEzMzkxMzI4MTM1Njk1NTYxOS5qcGciIGFsdD0i5Zu+54mHIiBkYXRhLWhyZWY9Imh0dHBzOi8veXVueWluZy55b2UzNjUuY29tOjgwNDUvUGhvdG9zLzEzMzkxMzI4MTM1Njk1NTYxOS5qcGciIHN0eWxlPSIiPjxpbWcgc3JjPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNTk4Nzc2MDMuanBnIiBhbHQ9IuWbvueJhyIgZGF0YS1ocmVmPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNTk4Nzc2MDMuanBnIiBzdHlsZT0iIj48aW1nIHNyYz0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzYyNzc5Nzc2LmpwZyIgYWx0PSLlm77niYciIGRhdGEtaHJlZj0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzYyNzc5Nzc2LmpwZyIgc3R5bGU9IiI+PGltZyBzcmM9Imh0dHBzOi8veXVueWluZy55b2UzNjUuY29tOjgwNDUvUGhvdG9zLzEzMzkxMzI4MTM2NTk5MzE1MS5qcGciIGFsdD0i5Zu+54mHIiBkYXRhLWhyZWY9Imh0dHBzOi8veXVueWluZy55b2UzNjUuY29tOjgwNDUvUGhvdG9zLzEzMzkxMzI4MTM2NTk5MzE1MS5qcGciIHN0eWxlPSIiPjxpbWcgc3JjPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNjkyOTkyNzcuanBnIiBhbHQ9IuWbvueJhyIgZGF0YS1ocmVmPSJodHRwczovL3l1bnlpbmcueW9lMzY1LmNvbTo4MDQ1L1Bob3Rvcy8xMzM5MTMyODEzNjkyOTkyNzcuanBnIiBzdHlsZT0iIj48aW1nIHNyYz0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzczMzM5MDc5LmpwZyIgYWx0PSLlm77niYciIGRhdGEtaHJlZj0iaHR0cHM6Ly95dW55aW5nLnlvZTM2NS5jb206ODA0NS9QaG90b3MvMTMzOTEzMjgxMzczMzM5MDc5LmpwZyIgc3R5bGU9IiI+PC9wPg==';
  16. }
  17. const htmlString = decodeBase64ToUtf8(base64String.value);
  18. renderedHtml.value = htmlString;
  19. };
  20. // 核心解码函数 (处理 UTF-8 中文不乱码)
  21. const decodeBase64ToUtf8 = (base64) => {
  22. try {
  23. // 1. atob 解码为二进制字符串
  24. const binaryString = window.atob(base64);
  25. // 2. 将二进制字符串转换为 UTF-8
  26. const bytes = new Uint8Array(binaryString.length);
  27. for (let i = 0; i < binaryString.length; i++) {
  28. bytes[i] = binaryString.charCodeAt(i);
  29. }
  30. // 3. 使用 TextDecoder 解码为正常字符串
  31. return new TextDecoder('utf-8').decode(bytes);
  32. } catch (e) {
  33. console.error('解码失败', e);
  34. return '';
  35. }
  36. };
  37. onMounted(() => {
  38. initData();
  39. });
  40. watch(route, () => {
  41. initData();
  42. });
  43. </script>
  44. <style lang="scss" scoped>
  45. .theme-pages {
  46. width: 100%;
  47. .content-container :deep(img) {
  48. display: block;
  49. margin: 0 auto;
  50. width: 100%;
  51. }
  52. }
  53. </style>