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