lots of change
This commit is contained in:
+3
-34
@@ -3,11 +3,11 @@ package backend
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/disintegration/imaging"
|
||||
@@ -168,7 +168,7 @@ func (a *App) UploadImage(data []byte, filename string) Response {
|
||||
}
|
||||
|
||||
ext := filepath.Ext(filename)
|
||||
newFilename := fmt.Sprintf("%d%s", time.Now().UnixMilli(), ext)
|
||||
newFilename := strconv.FormatInt(time.Now().UnixMilli(), 10) + ext
|
||||
filePath := filepath.Join(uploadsDir, newFilename)
|
||||
|
||||
err = os.WriteFile(filePath, data, 0644)
|
||||
@@ -181,26 +181,6 @@ func (a *App) UploadImage(data []byte, filename string) Response {
|
||||
return Response{Code: 0, Message: "success", Data: newFilename}
|
||||
}
|
||||
|
||||
func (a *App) GetImage(filename string) Response {
|
||||
filePath := filepath.Join(publicImagePath, filename)
|
||||
|
||||
data, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return Response{Code: 1, Message: "failed", Data: err.Error()}
|
||||
}
|
||||
|
||||
ext := filepath.Ext(filename)
|
||||
mimeType := "image/jpeg"
|
||||
if ext == ".png" {
|
||||
mimeType = "image/png"
|
||||
}
|
||||
|
||||
base64Data := base64.StdEncoding.EncodeToString(data)
|
||||
dataURL := "data:image/" + mimeType + ";base64," + base64Data
|
||||
|
||||
return Response{Code: 0, Message: "success", Data: dataURL}
|
||||
}
|
||||
|
||||
func (a *App) GetHistory(page int, pageSize int) Response {
|
||||
db, err := a.GormDB()
|
||||
if err != nil {
|
||||
@@ -230,10 +210,6 @@ func (a *App) Detect(filename string) Response {
|
||||
return Response{Code: 1, Message: err.Error()}
|
||||
}
|
||||
|
||||
/**
|
||||
这里调用模型
|
||||
**/
|
||||
|
||||
filePath := filepath.Join(publicImagePath, filename)
|
||||
imgData, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
@@ -251,13 +227,6 @@ func (a *App) Detect(filename string) Response {
|
||||
return Response{Code: 1, Message: "model inference failed: " + err.Error()}
|
||||
}
|
||||
|
||||
println("confidence", confidence)
|
||||
println("detectRet", detectRet)
|
||||
|
||||
/**
|
||||
结束
|
||||
**/
|
||||
|
||||
var breed Breed
|
||||
err = db.Table("breeds_test").Where("code = ?", detectRet).First(&breed).Error
|
||||
if err != nil {
|
||||
@@ -277,7 +246,7 @@ func (a *App) Detect(filename string) Response {
|
||||
Code: breed.Code,
|
||||
Name: breed.Name,
|
||||
Brief: breed.Brief,
|
||||
ConfidenceLevel: 0.98,
|
||||
ConfidenceLevel: confidence,
|
||||
}
|
||||
|
||||
return Response{Code: 0, Message: "success", Data: detectData}
|
||||
|
||||
+1
-1
@@ -50,6 +50,6 @@ type (
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
Brief string `json:"brief"`
|
||||
ConfidenceLevel float32 `json:"confidence_level"`
|
||||
ConfidenceLevel float64 `json:"confidence_level"`
|
||||
}
|
||||
)
|
||||
|
||||
@@ -20,7 +20,7 @@ def test():
|
||||
dataset_dir = os.path.join(core_dir, "dataset", mode, "test")
|
||||
|
||||
# 【修改3】加载ONNX模型,替代原来的PyTorch模型加载
|
||||
session = ort.InferenceSession(os.path.join(model_dir, "resnet18_epoch_50_bak2.onnx"), providers=providers)
|
||||
session = ort.InferenceSession(os.path.join(model_dir, "resnet_epoch_100.onnx"), providers=providers)
|
||||
|
||||
# 获取输入名称(用于后续推理时指定输入)
|
||||
input_name = session.get_inputs()[0].name
|
||||
|
||||
@@ -21,7 +21,7 @@ def test():
|
||||
print("model_dir", model_dir)
|
||||
|
||||
net = resnet()
|
||||
net.load_state_dict(torch.load(os.path.join(model_dir, "resnet_epoch_50.pth"), weights_only=True))
|
||||
net.load_state_dict(torch.load(os.path.join(model_dir, "resnet_epoch_99.pth"), weights_only=True))
|
||||
|
||||
print("111")
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useState, useEffect } from 'preact/hooks'
|
||||
import Pagination from './Pagination'
|
||||
import Modal from './Modal'
|
||||
import ImagePreview from './ImagePreview'
|
||||
import { message } from '../utils/toast'
|
||||
import type { HistoryItem } from '../preact'
|
||||
|
||||
@@ -22,6 +21,7 @@ const History = () => {
|
||||
const pageSize = 5
|
||||
const [total, setTotal] = useState<number>(50)
|
||||
const [historyList, setHistoryList] = useState<HistoryItem[]>([])
|
||||
const [currentItem, setCurrentItem] = useState<HistoryItem>()
|
||||
const [showDelete, setShowDelete] = useState<boolean>(false)
|
||||
const [currentId, setCurrentId] = useState<number | null>(null)
|
||||
const [showClear, setShowClear] = useState<boolean>(false)
|
||||
@@ -49,6 +49,10 @@ const History = () => {
|
||||
fetchData(page)
|
||||
}
|
||||
|
||||
const handleShowItem = (item: HistoryItem) => setCurrentItem(item)
|
||||
|
||||
const handleItemClose = () => setCurrentItem(undefined)
|
||||
|
||||
const handleShowDelete = (id: number) => {
|
||||
setCurrentId(id)
|
||||
setShowDelete(true)
|
||||
@@ -60,6 +64,7 @@ const History = () => {
|
||||
message.error('currentId为空')
|
||||
return
|
||||
}
|
||||
// dfdfdf
|
||||
const result = await (window as any).go.backend.App.DeleteOneHistory(currentId)
|
||||
if (result.code === 0) {
|
||||
message.success('删除成功')
|
||||
@@ -104,7 +109,7 @@ const History = () => {
|
||||
{historyList.map((item: HistoryItem) =>
|
||||
<div key={item.id} class="history-card">
|
||||
<div class="card-left">
|
||||
<ImagePreview filename={item.img} />
|
||||
<img src={`/images/${item.img}`} onClick={() => handleShowItem(item)} />
|
||||
</div>
|
||||
<div class="card-right">
|
||||
<div class="right-top">
|
||||
@@ -142,6 +147,9 @@ const History = () => {
|
||||
<Modal open={showClear} title="信息" onClick={handleClearOk} onClose={handleClearClose}>
|
||||
<p>确定要删除全部记录?</p>
|
||||
</Modal>
|
||||
<Modal open={!!currentItem} title={currentItem?.name || ''} onClose={handleItemClose}>
|
||||
<p>{currentItem?.brief || ''}</p>
|
||||
</Modal>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
import { useState, useEffect } from 'preact/hooks'
|
||||
|
||||
interface Props {
|
||||
filename: string
|
||||
class?: string
|
||||
id?: string
|
||||
}
|
||||
|
||||
const ImagePreview = ({ filename, ...props }: Props) => {
|
||||
const [src, setSrc] = useState<string>('')
|
||||
|
||||
useEffect(() => {
|
||||
const loadImage = async () => {
|
||||
const result = await (window as any).go.backend.App.GetImage(filename)
|
||||
if (result.code === 0) {
|
||||
setSrc(result.data)
|
||||
}
|
||||
}
|
||||
loadImage()
|
||||
}, [filename])
|
||||
|
||||
if (!src) return <div {...props} />
|
||||
|
||||
return <img src={src} {...props} />
|
||||
}
|
||||
|
||||
export default ImagePreview
|
||||
@@ -1,6 +1,5 @@
|
||||
import { useState, useRef } from 'preact/hooks'
|
||||
import type { DetectResult } from '../preact'
|
||||
import ImagePreview from './ImagePreview'
|
||||
import { message } from '../utils/toast'
|
||||
|
||||
const Main = () => {
|
||||
@@ -65,6 +64,7 @@ const Main = () => {
|
||||
file.name
|
||||
)
|
||||
if (result.code === 0) {
|
||||
console.log("rrr", result)
|
||||
setFileSrc(result.data)
|
||||
setStep(1)
|
||||
} else if (result.code === 1) {
|
||||
@@ -97,7 +97,6 @@ const Main = () => {
|
||||
setDetectResult(result.data)
|
||||
setStep(3)
|
||||
} else if (result.code === 1) {
|
||||
console.log("result.message", result.message)
|
||||
message.error(result.message)
|
||||
}
|
||||
}, 1000)
|
||||
@@ -109,6 +108,8 @@ const Main = () => {
|
||||
resetUpload()
|
||||
}
|
||||
|
||||
console.log("fff", fileSrc)
|
||||
|
||||
return (
|
||||
<main class="app-main">
|
||||
<div class="main-container">
|
||||
@@ -134,7 +135,7 @@ const Main = () => {
|
||||
>
|
||||
{fileSrc.length > 0 && step == 1 ?
|
||||
<div id="previewContent">
|
||||
<ImagePreview filename={fileSrc} id="previewImage" />
|
||||
<img src={`/images/${fileSrc}`} />
|
||||
<button onClick={handleRemovePhoto}>
|
||||
❌ 移除照片
|
||||
</button>
|
||||
@@ -193,7 +194,7 @@ const Main = () => {
|
||||
<h2>完成!</h2>
|
||||
</div>
|
||||
<div class="result-main">
|
||||
<ImagePreview filename={fileSrc} />
|
||||
<img src={`/images/${fileSrc}`} />
|
||||
<div class="result-word">
|
||||
<div>
|
||||
<h3>{detectResult?.name}</h3>
|
||||
|
||||
@@ -27,8 +27,8 @@ const Modal = ({ open, title, onClick, onClose, children }: ModalProps) => {
|
||||
</div>
|
||||
{children}
|
||||
<div class="bottom">
|
||||
<button onClick={handleClose}>取消</button>
|
||||
<button onClick={handleConfirm}>确定</button>
|
||||
<button class="close" onClick={handleClose}>取消</button>
|
||||
{onClick ? <button class="confirm" onClick={handleConfirm}>确定</button> : null}
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-mask" onClick={handleMaskClick}></div>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useState, useEffect } from 'preact/hooks'
|
||||
import type { PaginationProps } from '../preact'
|
||||
|
||||
|
||||
const Pagination = ({
|
||||
total,
|
||||
onChange,
|
||||
|
||||
@@ -199,7 +199,7 @@ a
|
||||
border-radius: 1.5rem
|
||||
border-width: 2px
|
||||
border-style: dashed
|
||||
border-color: #e2e8f0
|
||||
border-color: #bdc3cb
|
||||
text-align: center
|
||||
cursor: pointer
|
||||
|
||||
@@ -305,7 +305,6 @@ a
|
||||
display: flex
|
||||
align-items: center
|
||||
justify-content: center
|
||||
// height: 2.25rem
|
||||
gap: 0.75rem
|
||||
margin: 0.5rem 0 1.5rem 0
|
||||
|
||||
@@ -474,12 +473,12 @@ a
|
||||
font-size: 0.875rem
|
||||
border-radius: 0.25rem
|
||||
|
||||
&:first-child
|
||||
> button.close
|
||||
color: var(--text)
|
||||
border: 1px solid #c9c9c9
|
||||
background-color: none
|
||||
|
||||
&:last-child
|
||||
> button.confirm
|
||||
color: white
|
||||
background-color: var(--primary)
|
||||
|
||||
|
||||
Vendored
-2
@@ -11,8 +11,6 @@ export function Detect(arg1:string):Promise<backend.Response>;
|
||||
|
||||
export function GetHistory(arg1:number,arg2:number):Promise<backend.Response>;
|
||||
|
||||
export function GetImage(arg1:string):Promise<backend.Response>;
|
||||
|
||||
export function GormDB():Promise<gorm.DB>;
|
||||
|
||||
export function UploadImage(arg1:Array<number>,arg2:string):Promise<backend.Response>;
|
||||
|
||||
@@ -18,10 +18,6 @@ export function GetHistory(arg1, arg2) {
|
||||
return window['go']['backend']['App']['GetHistory'](arg1, arg2);
|
||||
}
|
||||
|
||||
export function GetImage(arg1) {
|
||||
return window['go']['backend']['App']['GetImage'](arg1);
|
||||
}
|
||||
|
||||
export function GormDB() {
|
||||
return window['go']['backend']['App']['GormDB']();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user