tijiao 分类变成接口

This commit is contained in:
2025-06-05 09:16:41 +08:00
parent e35f9f69c2
commit 071276e284
10 changed files with 157 additions and 255 deletions

View File

@@ -7,6 +7,7 @@
<router-view v-if="!$route.meta.keepAlive"></router-view> -->
</div>
</template>
<style>
@import "./assets/css/main.css";
@import "./assets/css/color-dark.css";

View File

@@ -1,7 +1,9 @@
import Vue from 'vue';
import katex from 'katex';
import JSZip from 'jszip';
import mammoth from "mammoth";
import api from '../../api/index.js';
import Common from '@/components/common/common'
import Tiff from 'tiff.js';
var mediaUrl = Common.mediaUrl + 'articleImage/';
@@ -67,187 +69,25 @@ function findExtentElement(blipElement) {
}
export default {
getJournalTypeName(value) {
var list = this.journalTypeList();
list = [...list,
{ name: 'EVIDENCE-BASED MEDICINE', value: 'EM' }, // ✅ 补充项
{ name: 'PROTOCOL', value: 'PT' }, // ✅ 补充项
]
var list = JSON.parse(localStorage.getItem('journalTypeDataAll'));
const type = list.find(item => item.value === value);
return type ? type.name : 'OTHERS';
},
journalTypeList() {
var journal_type = [
{ name: 'ARTICLE', value: 'A' },
{ name: 'REVIEW', value: 'B' },
{ name: 'CASE REPORT', value: 'C' },
{ name: 'RESEARCH PROPOSAL', value: 'P' },
{ name: 'NEWS', value: 'N' },
{ name: 'COMMENT', value: 'T' },
{ name: 'CORRECTION', value: 'CT' },
{ name: 'HYPOTHESIS', value: 'HT' },
{ name: 'PREFACE', value: 'PF' },
{ name: 'EDITORIAL', value: 'ET' },
{ name: 'REPORT', value: 'RP' },
{ name: 'LETTER', value: 'LR' },
{ name: 'EMPIRICAL FORMULA', value: 'EF' },
journalTypeList(type) {
var journal_type = JSON.parse(localStorage.getItem('journalTypeData'));
{ name: 'EXPERT CONSENSUS', value: 'EC' },
{ name: 'LETTER TO EDITOR', value: 'LTE' },
{ name: 'QUESTIONNAIRE INVESTIGATION', value: 'QI' },
{ name: 'CASE SERIES', value: 'CS' },
{ name: 'RETRACTION', value: 'RT' },
{ name: 'MINI REVIEW', value: 'MR' },
{ name: 'OTHERS', value: 'O' }
];
return journal_type;
},
opMedicalList() {
var opMedical = [{
label: 'None',
value: ''
},
{
label: 'ARTICLE',
value: 'Article'
},
{
label: 'REVIEW',
value: 'Review'
},
{
label: 'CASE REPORT',
value: 'Case report'
},
{
label: 'RESEARCH PROPOSAL',
value: 'Research proposal'
},
{
label: 'NEWS',
value: 'News'
},
{
label: 'COMMENT',
value: 'Comment'
},
{
label: 'CORRECTION',
value: 'Correction'
},
{
label: 'HYPOTHESIS',
value: 'Hypothesis'
},
{
label: 'PREFACE',
value: 'Preface'
},
{
label: 'EDITORIAL',
value: 'Editorial'
},
{
label: 'REPORT',
value: 'Report'
},
{
label: 'LETTER',
value: 'Letter'
},
{
label: 'EMPIRICAL FORMULA',
value: 'Empirical formula'
},
{
label: 'EVIDENCE-BASED MEDICINE',
value: 'Evidence-based medicine'
},
{
label: 'EXPERT CONSENSUS',
value: 'Expert consensus'
},
{
label: 'LETTER TO EDITOR',
value: 'Letter to editor'
},
{
label: 'QUESTIONNAIRE INVESTIGATION',
value: 'Questionnaire investigation'
},
{
label: 'PROTOCOL',
value: 'Protocol'
},
{
label: 'CASE SERIES',
value: 'Case Series'
},
{
label: 'RETRACTION',
value: 'Retraction'
},
{
label: 'MINI REVIEW',
value: 'Mini Review'
},
{
label: '内经难经',
value: '内经难经'
},
{
label: '伤寒金匮',
value: '伤寒金匮'
},
{
label: '神农本草经',
value: '神农本草经'
},
{
label: '温病研究',
value: '温病研究'
},
{
label: '唐宋方药',
value: '唐宋方药'
},
{
label: '金元各家',
value: '金元各家'
},
{
label: '明清经典',
value: '明清经典'
},
{
label: '中西汇通',
value: '中西汇通'
},
{
label: '太湖选粹',
value: '太湖选粹'
},
{
label: '针灸推拿',
value: '针灸推拿'
},
{
label: '名医名方',
value: '名医名方'
},
{
label: '新冠肺炎',
value: '新冠肺炎'
},
{
label: '书评',
value: '书评'
}
]
var opMedical =JSON.parse(localStorage.getItem('opMedicalListData'))
return opMedical;
},
@@ -316,6 +156,7 @@ export default {
const mediaFile = rels[embedId];
if (mediaFile) {
imageInfoMap[mediaFile] = { width, height };
console.log('imageInfoMap at line 158:', imageInfoMap)
}
}
}
@@ -347,24 +188,32 @@ export default {
// html = html.replace(/<img[^>]+src="data:image\/x-emf[^"]*"[^>]*>/gi, '');
// 替换图片标签中的宽高
const imgTags = html.match(/<img[^>]*src="data:image\/[^"]+image(\d+)\.(png|jpg|jpeg)[^"]*"[^>]*>/gi);
const imgTags = html.match(/<img[^>]*src="data:image\/(png|jpg|jpeg);base64,[^"]*"/gi);
console.log('imgTags at line 190:', imgTags);
if (imgTags) {
imgTags.forEach((imgTag) => {
// 提取 "image数字.png" 或 "image数字.jpg" 这样的文件名
const match = imgTag.match(/image(\d+)\.(png|jpg|jpeg)/);
if (match) {
// 构造文件名,例如 "media/image1.png"
const filename = `media/image${match[1]}.${match[2]}`;
const info = imageInfoMap[filename];
const info = imageInfoMap[filename]; // 从 imageInfoMap 中查找宽高信息
console.log('info at line 196:', info); // 查看是否找到了相关图片信息
if (info) {
// 如果找到了图片的信息,就添加宽度和高度到 <img> 标签
const newImgTag = imgTag.replace(
/<img/,
`<img width="${info.width}" height="${info.height}"`
);
html = html.replace(imgTag, newImgTag);
html = html.replace(imgTag, newImgTag); // 替换原始的 <img> 标签
}
}
});
}
// 提取合法表格
const tableContent = html.match(/<table[\s\S]*?<\/table>/g);
const validTables = tableContent

View File

@@ -178,6 +178,9 @@ export default {
localStorage.removeItem('U_name');
localStorage.removeItem('U_status');
localStorage.removeItem('ms_journal_alias');
localStorage.removeItem('journalTypeData');
localStorage.removeItem('journalTypeDataAll');
localStorage.removeItem('opMedicalListData');
this.$router.push('/login');
}
},

View File

@@ -166,6 +166,9 @@ export default {
localStorage.removeItem('U_name');
localStorage.removeItem('U_status');
localStorage.removeItem('ms_journal_alias');
localStorage.removeItem('journalTypeData');
localStorage.removeItem('journalTypeDataAll');
localStorage.removeItem('opMedicalListData');
this.$router.push('/login');
}
},

View File

@@ -166,8 +166,8 @@
},
},
mounted(){
this.journal_type = this.$commonJS.journalTypeList()
async mounted(){
this.journal_type =await this.$commonJS.journalTypeList()
// console.log(this.journal_type, this.journal_type1)
}
};

View File

@@ -1335,9 +1335,9 @@ export default {
deep: true
}
},
created() {
this.journal_type=this.$commonJS.journalTypeList()
async created() {
this.journal_type = await this.$commonJS.journalTypeList();
console.log('this.journal_type at line 1340:', this.journal_type);
this.initSelect();
this.getAutData();
if (this.stagingID != undefined) {
@@ -2232,7 +2232,7 @@ export default {
reader.onload = function (e) {
that.$commonJS.extractWordTablesToArrays(File.raw, function (wordTables) {
console.log('tablesHtml at line 61:', wordTables);
return
return;
that.addWordTablesList(wordTables);
});
};

View File

@@ -32,7 +32,7 @@
<articleListB v-if="activeIndex == '2'" :journals="journals[1]" @changeEvent="changeEvent"></articleListB>
<articleListC v-if="activeIndex == '3'" :journals="journals[0]"></articleListC>
<articleListD v-if="activeIndex == '4'" ></articleListD>
<articleListE v-if="activeIndex == '5'" :journals="journals[2]"></articleListE>
<articleListE v-if="activeIndex == '5'" :journals="journals[0]"></articleListE>
<articleListF v-if="activeIndex == '6'" ></articleListF>
</div>
</div>
@@ -79,7 +79,7 @@ export default {
[1, 2, 4].forEach(async (e, i) => {
this.$set(this.journals, i, await this.initselect(e)); // 使用 Vue.set 确保数据是响应式的
console.log('this.journals at line 80:', this.journals)
// console.log('this.journals at line 80:', this.journals)
});
},
async initselect(e) {

View File

@@ -404,7 +404,7 @@ export default {
custom_colors: false,
color_map: ['0082AA', 'TMR Blue'],
plugins: 'texttransform kityformula-editor noneditable', // 启用 forecolor 和 code 插件
plugins: 'texttransform noneditable table', // 启用 forecolor 和 code 插件
// plugins: 'forecolor code paste table image mathType searchreplace raw', // 启用 forecolor 和 code 插件
end_container_on_empty_block: true,
content_css: 'default', // 加载 TinyMCE 默认样式表

View File

@@ -13,7 +13,7 @@
:value="updatedHtml"
:typesettingType="typesettingType"
class="paste-area text-container"
:toolbar="['bold italic|customBlue removeBlue|kityformula-editor|LateX |myuppercase myuppercasea Line|subscript superscript|table tabledelete| searchreplace |clearButton']"
:toolbar="['bold italic|customBlue removeBlue|LateX |myuppercase myuppercasea Line|subscript superscript|table | searchreplace |clearButton']"
style="
/* white-space: pre-line; */
line-height: 12px;

View File

@@ -13,26 +13,26 @@ import 'babel-polyfill';
import api from './api/index.js';
import Common from './components/common/common'
Vue.prototype.$validateString = function (str) {
return /^[a-zA-Z\s\u00C0-\u00FF\u0100-\u017F-]+$/.test(str);
return /^[a-zA-Z\s\u00C0-\u00FF\u0100-\u017F-]+$/.test(str);
}
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']], // 行内公式
displayMath: [['$$', '$$'], ['\\[', '\\]']], // 块级公式
},
svg: { fontCache: 'global' }
};
// 监听 DOM 变化,并自动渲染公式
Vue.prototype.$renderMath = function () {
if (window.MathJax && window.MathJax.typeset) {
setTimeout(() => {
window.MathJax.typeset();
}, 100); // 延迟防止 Vue 还未完全渲染
} else {
console.warn('MathJax 未正确加载');
}
};
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']], // 行内公式
displayMath: [['$$', '$$'], ['\\[', '\\]']], // 块级公式
},
svg: { fontCache: 'global' }
};
// 监听 DOM 变化,并自动渲染公式
Vue.prototype.$renderMath = function () {
if (window.MathJax && window.MathJax.typeset) {
setTimeout(() => {
window.MathJax.typeset();
}, 100); // 延迟防止 Vue 还未完全渲染
} else {
console.warn('MathJax 未正确加载');
}
};
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
@@ -47,28 +47,71 @@ import 'quill/dist/quill.bubble.css'
// 注册富文本编辑器组件为全局组件
Vue.use(VueQuillEditor)
async function loadJournalType() {
const localData = localStorage.getItem('journalType'); // 尝试从 localStorage 获取数据
// 如果 localStorage 中没有数据,则调用 API 获取并存储
if (!localData) {
try {
await api
.post('api/Articletype/getArticleType', {})
.then((res) => {
console.log('res at line 61:', res)
if (res.status == 1) {
localStorage.setItem('journalTypeData', JSON.stringify(res.data.base)); // 将数据存储到 localStorage
localStorage.setItem('journalTypeDataAll', JSON.stringify([...res.data.base, ...res.data.supplement])); // 将数据存储到 localStorage
}
})
await api
.post('api/Articletype/getMedicalType', {})
.then((res) => {
console.log('res at line 61:', res)
if (res.status == 1) {
localStorage.setItem('opMedicalListData', JSON.stringify(res.data)); // 将数据存储到 localStorage
}
})
} catch (error) {
console.error('Failed to fetch journal types:', error);
}
} else {
console.log('Journal types loaded from localStorage:', JSON.parse(localData));
}
}
// 启动应用时调用一次函数来加载 journalType 数据
// 时间过滤器
// 定义时间过滤器(不含时分秒)
Vue.filter('formatDate', function (originVal) {
const dt = new Date(originVal * 1000)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
const d = (dt.getDate() + '').padStart(2, '0')
const hh = (dt.getHours() + '').padStart(2, '0')
const mm = (dt.getMinutes() + '').padStart(2, '0')
const ss = (dt.getSeconds() + '').padStart(2, '0')
return `${y}-${m}-${d}`
const dt = new Date(originVal * 1000)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
const d = (dt.getDate() + '').padStart(2, '0')
const hh = (dt.getHours() + '').padStart(2, '0')
const mm = (dt.getMinutes() + '').padStart(2, '0')
const ss = (dt.getSeconds() + '').padStart(2, '0')
return `${y}-${m}-${d}`
})
// 含时分秒
Vue.filter('formatDatehms', function (originVal) {
const dt = new Date(originVal * 1000)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
const d = (dt.getDate() + '').padStart(2, '0')
const hh = (dt.getHours() + '').padStart(2, '0')
const mm = (dt.getMinutes() + '').padStart(2, '0')
const ss = (dt.getSeconds() + '').padStart(2, '0')
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
const dt = new Date(originVal * 1000)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
const d = (dt.getDate() + '').padStart(2, '0')
const hh = (dt.getHours() + '').padStart(2, '0')
const mm = (dt.getMinutes() + '').padStart(2, '0')
const ss = (dt.getSeconds() + '').padStart(2, '0')
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
})
// 引入wps文档编辑
import mammoth from "mammoth";
@@ -78,7 +121,7 @@ Vue.prototype.$commonJS = commonJS
Vue.prototype.Common = Common;
// import { getJournalTypeName } from '@/common/js/commonJS.js';
Vue.filter('jtName', function(value) {
Vue.filter('jtName', function (value) {
return commonJS.getJournalTypeName(value);
});
// 使用 ES Module
@@ -125,50 +168,53 @@ import commonDragWord from '@/components/page/components/table/dragWord.vue'
Vue.component('common-drag-word', commonDragWord);
Vue.use(VueI18n);
Vue.use(ElementUI, {
size: 'small',
locale
size: 'small',
locale
});
const i18n = new VueI18n({
locale: localStorage.getItem('langs') || 'en',
messages
locale: localStorage.getItem('langs') || 'en',
messages
});
//使用钩子函数对路由进行权限跳转
router.beforeEach((to, from, next) => {
document.title = `${to.meta.title} | Traditional Medicine Research`;
const role = localStorage.getItem('U_name');
const userrole = localStorage.getItem('U_status');
if (!role && to.path != '/register' && to.path !== '/submission' && to.path !== '/verification' && to.path !== '/orcidLink' && to.path !== '/img' && to.path !== '/reviewer' && to.path !== '/thanks' && to.path !== '/login' && to.path !== '/refuse' && to.path !== '/managing' && to.path.search(/retrieve/i) < 0) {
next('/login');
// } else if (to.meta.permission) {
// // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
// // role === 'admin' ? next() : next('/403');
// if(userrole == to.meta.permission){
// next();
// }else{
// next('/403');
// }
loadJournalType();
document.title = `${to.meta.title} | Traditional Medicine Research`;
const role = localStorage.getItem('U_name');
const userrole = localStorage.getItem('U_status');
if (!role && to.path != '/register' && to.path !== '/submission' && to.path !== '/verification' && to.path !== '/orcidLink' && to.path !== '/img' && to.path !== '/reviewer' && to.path !== '/thanks' && to.path !== '/login' && to.path !== '/refuse' && to.path !== '/managing' && to.path.search(/retrieve/i) < 0) {
next('/login');
// } else if (to.meta.permission) {
// // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
// // role === 'admin' ? next() : next('/403');
// if(userrole == to.meta.permission){
// next();
// }else{
// next('/403');
// }
} else {
//审稿人导航
// if(to.path=='/reviewerArticleList'&&userrole!='reviewer'){
// next('/authorApplyReviewer');
// }
// 简单的判断IE10及以下不进入富文本编辑器该组件不兼容
if (navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor') {
Vue.prototype.$alert('vue-quill-editor组件不兼容IE10及以下浏览器请使用更高版本的浏览器查看', '浏览器不兼容通知', {
confirmButtonText: '确定'
});
} else {
//审稿人导航
// if(to.path=='/reviewerArticleList'&&userrole!='reviewer'){
// next('/authorApplyReviewer');
// }
// 简单的判断IE10及以下不进入富文本编辑器该组件不兼容
if (navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor') {
Vue.prototype.$alert('vue-quill-editor组件不兼容IE10及以下浏览器请使用更高版本的浏览器查看', '浏览器不兼容通知', {
confirmButtonText: '确定'
});
} else {
next();
}
next();
}
}
});
new Vue({
router,
i18n,
render: h => h(App),
mounted() {
this.$renderMath(); // 页面加载后自动渲染
}
router,
i18n,
render: h => h(App),
mounted() {
this.$renderMath(); // 页面加载后自动渲染
}
}).$mount('#app');