1
0
mirror of https://github.com/fumiama/paper-manager.git synced 2026-06-05 07:50:23 +08:00

implement chkdup & optimize file

This commit is contained in:
源文雨
2023-05-04 19:58:44 +08:00
parent e9c4b9975f
commit f5c5d0d526
11 changed files with 197 additions and 29 deletions

View File

@@ -31,7 +31,7 @@ type filelist struct {
Per uint `json:"percent"`
}
func getFileList(count int, istemp bool) ([]filelist, error) {
func getFileList(count int, istemp *bool) ([]filelist, error) {
lst, err := global.FileDB.ListUploadedFile(istemp)
if err != nil && err != sql.ErrNullResult {
return nil, err
@@ -149,7 +149,12 @@ func init() {
writeresult(w, codeError, nil, errInvalidToken.Error(), typeError)
return
}
istemp := r.URL.Query().Get("permanent") != "true"
istemp := (*bool)(nil)
permanent := r.URL.Query().Get("permanent")
if permanent != "" {
b := permanent != "true"
istemp = &b
}
count := -1
var err error
countstr := r.URL.Query().Get("count")

View File

@@ -83,11 +83,14 @@ func (f *FileDatabase) SaveFileToTemp(uploader int, file io.Reader, name string)
}
// ListUploadedFile will select all file that HasntAnalyzed && IsTemp or !HasntAnalyzed && !IsTemp
func (f *FileDatabase) ListUploadedFile(istemp bool) (lst []*List, err error) {
func (f *FileDatabase) ListUploadedFile(istemp *bool) (lst []*List, err error) {
q := ""
if istemp {
switch {
case istemp == nil:
q = "ORDER BY UpTime DESC"
case *istemp:
q = "WHERE IsTemp ORDER BY UpTime DESC"
} else {
default:
q = "WHERE (HasntAnalyzed AND IsTemp) OR (NOT HasntAnalyzed AND NOT IsTemp) ORDER BY UpTime DESC"
}
f.mu.RLock()

View File

@@ -23,10 +23,23 @@ enum Api {
/**
* @description: Get file list
*/
export const getFileList = (permanent: boolean, count?: number) => {
export const getFileList = (permanent?: boolean, count?: number) => {
return defHttp.get<getFileListModel>({ url: Api.GetFileList, params: { count, permanent } })
}
/**
* @description: Get file options
*/
export const getFileOptions = async () => {
const data = await defHttp.get<getFileListModel>({
url: Api.GetFileList,
})
return data.map((item) => ({
label: item.description,
value: item.id.toString(),
}))
}
/**
* @description: Get file info
*/

View File

@@ -1,4 +1,6 @@
export default {
name: '试卷查重',
templist: '临时试卷库',
file: '查重报告',
dup: '开始查重',
}

View File

@@ -9,7 +9,11 @@ const menu: MenuModule = {
children: [
{
path: 'index',
name: t('routes.templist.name'),
name: t('routes.templist.templist'),
},
{
path: 'chkdup',
name: t('routes.templist.dup'),
},
],
},

View File

@@ -8,7 +8,6 @@ const templist: AppRouteModule = {
component: LAYOUT,
redirect: '/templist/index',
meta: {
hideChildrenInMenu: true,
icon: 'ion:ios-analytics',
title: t('routes.templist.name'),
orderNo: 30,
@@ -19,9 +18,17 @@ const templist: AppRouteModule = {
name: 'TempListPage',
component: () => import('/@/views/page/templist/index.vue'),
meta: {
title: t('routes.templist.name'),
icon: 'ion:file-tray-full-outline',
hideMenu: true,
title: t('routes.templist.templist'),
icon: 'ion:albums-outline',
},
},
{
path: 'chkdup',
name: 'CheckDupPage',
component: () => import('/@/views/page/chkdup/index.vue'),
meta: {
title: t('routes.templist.dup'),
icon: 'ion:podium-sharp',
},
},
{

View File

@@ -0,0 +1,24 @@
import { FormSchema } from '/@/components/Form'
export const schemas: FormSchema[] = [
{
field: 'f1',
component: 'Input',
label: '试卷名',
slot: 'localSearch',
required: true,
},
]
export const taskSchemas: FormSchema[] = [
{
field: 't1',
component: 'RangePicker',
label: '查询年限范围',
required: true,
componentProps: {
format: 'YYYY',
placeholder: ['起始年份', '结束年份'],
showTime: { format: 'YYYY' },
},
},
]

View File

@@ -0,0 +1,101 @@
<template>
<PageWrapper
class="high-form"
:title="t('routes.templist.dup')"
content="设定好待查重试卷和查重年限后,即可生成查重报告。"
>
<a-card title="待查重试卷" :bordered="false">
<BasicForm @register="register">
<template #localSearch="{ model, field }">
<ApiSelect
:api="getFileOptions"
showSearch
v-model:value="model[field]"
optionFilterProp="label"
resultField="value"
labelField="label"
valueField="value"
:params="searchParams"
@search="onSearch"
/>
</template>
</BasicForm>
</a-card>
<a-card title="查重限定条件" :bordered="false" class="!mt-5">
<BasicForm @register="registerTask" />
</a-card>
<a-card title="查重报告" :bordered="false" class="!mt-5">
<p> aaaaa </p>
</a-card>
<template #rightFooter>
<a-button type="primary" @click="submitAll"> 提交 </a-button>
</template>
</PageWrapper>
</template>
<script lang="ts">
import { BasicForm, useForm, ApiSelect } from '/@/components/Form'
import { defineComponent, ref, unref, computed } from 'vue'
import { useDebounceFn } from '@vueuse/core'
import { PageWrapper } from '/@/components/Page'
import { schemas, taskSchemas } from './data'
import { Card } from 'ant-design-vue'
import { useI18n } from '/@/hooks/web/useI18n'
import { getFileOptions } from '/@/api/page'
export default defineComponent({
name: 'FormHightPage',
components: { ApiSelect, BasicForm, PageWrapper, [Card.name]: Card },
setup() {
const { t } = useI18n()
const keyword = ref<string>('')
const searchParams = computed<Recordable>(() => {
return { keyword: unref(keyword) }
})
const [register, { validate }] = useForm({
layout: 'vertical',
baseColProps: {
span: 24,
},
schemas: schemas,
showActionButtonGroup: false,
})
const [registerTask, { validate: validateTaskForm }] = useForm({
layout: 'vertical',
baseColProps: {
span: 6,
},
schemas: taskSchemas,
showActionButtonGroup: false,
})
async function submitAll() {
try {
const [values, taskValues] = await Promise.all([validate(), validateTaskForm()])
console.log('form data:', values, taskValues)
} catch (error) {}
}
function onSearch(value: string) {
keyword.value = value
}
return {
t,
register,
registerTask,
submitAll,
getFileOptions,
searchParams,
onSearch: useDebounceFn(onSearch, 300),
}
},
})
</script>
<style lang="less" scoped>
.high-form {
padding-bottom: 48px;
}
</style>

View File

@@ -5,10 +5,16 @@
下载试卷 ({{ docxSizeRef.toFixed(2) }}MB)
</a-button>
</template>
<div ref="chartRef" :style="{ height, width }"></div>
<div class="docxWrap" :style="{ width }">
<div ref="docxRef"></div>
</div>
<a-card title="分析报告" :bordered="false">
<div ref="chartRef" :style="{ height, width }"></div>
</a-card>
<a-card title="原卷预览" :bordered="false" class="!mt-5">
<div class="docxWrap" :style="{ width }">
<div ref="docxRef"></div>
</div>
</a-card>
</PageWrapper>
</template>
<script lang="ts">
@@ -17,6 +23,7 @@
import { PageWrapper } from '/@/components/Page'
import { useECharts } from '/@/hooks/web/useECharts'
import { renderAsync } from 'docx-preview'
import { Card } from 'ant-design-vue'
import { downloadFile, getFileStatus, getFileBlob } from '/@/api/page'
import { useMessage } from '/@/hooks/web/useMessage'
import { useGo } from '/@/hooks/web/usePage'
@@ -56,7 +63,7 @@
export default defineComponent({
name: 'PaperAnalyzeTab',
components: { PageWrapper },
components: { PageWrapper, [Card.name]: Card },
props: {
width: {
type: String as PropType<string>,
@@ -133,7 +140,7 @@
},
},
{
text: '重复率: ' + ret.rate.toFixed(2) + '%, 前十如下',
text: '全库重复率: ' + ret.rate.toFixed(2) + '%, 前十如下',
left: '40%',
top: '1%',
textStyle: {

View File

@@ -1,15 +1,18 @@
<template>
<PageWrapper :class="prefixCls" :title="t('routes.templist.name')">
<PageWrapper :class="prefixCls" :title="t('routes.templist.templist')">
<template #headerContent>
<BasicUpload
name="paper"
v-if="hasPermission([RoleEnum.SUPER, RoleEnum.FILE_MANAGER])"
:maxSize="64"
:maxNumber="16"
:api="uploadApi"
@change="onChange"
:accept="['application/vnd.openxmlformats-officedocument.wordprocessingml.document']"
/>
<div>
<p> 此处用来临时上传存放待查重试卷备用 </p>
<BasicUpload
name="paper"
v-if="hasPermission([RoleEnum.SUPER, RoleEnum.FILE_MANAGER])"
:maxSize="64"
:maxNumber="16"
:api="uploadApi"
@change="onChange"
:accept="['application/vnd.openxmlformats-officedocument.wordprocessingml.document']"
/>
</div>
</template>
<div :class="`${prefixCls}__top`">
<a-row :gutter="12">

View File

@@ -10,7 +10,6 @@ import (
"github.com/sirupsen/logrus"
"github.com/fumiama/paper-manager/backend"
"github.com/fumiama/paper-manager/frontend"
)
func line() int {
@@ -34,7 +33,7 @@ func main() {
http.HandleFunc("/file/", backend.FileHandler)
http.HandleFunc("/paper/", backend.PaperHandler)
http.HandleFunc("/upload", backend.UploadHandler)
http.Handle("/", frontend.StaticHandler)
//http.Handle("/", frontend.StaticHandler)
logrus.Infoln("[http.Serve] start at", l.Addr())
logrus.Errorln("[http.Serve]", http.Serve(l, nil))