fix: 删除部分会引发类型错误的无用代码
This commit is contained in:
@@ -108,7 +108,7 @@ RUN mkdir -p /var/run/sshd && \
|
|||||||
RUN code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans \
|
RUN code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans \
|
||||||
&& code-server --install-extension bierner.markdown-mermaid \
|
&& code-server --install-extension bierner.markdown-mermaid \
|
||||||
&& code-server --install-extension ms-python.python \
|
&& code-server --install-extension ms-python.python \
|
||||||
&& code-server --install-extension rooveterinaryinc.roo-cline \
|
&& code-server --install-extension saoudrizwan.claude-dev \
|
||||||
&& code-server --install-extension dbaeumer.vscode-eslint \
|
&& code-server --install-extension dbaeumer.vscode-eslint \
|
||||||
&& code-server --install-extension prisma.prisma \
|
&& code-server --install-extension prisma.prisma \
|
||||||
&& code-server --install-extension ecmel.vscode-html-css \
|
&& code-server --install-extension ecmel.vscode-html-css \
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "hair-keeper",
|
"name": "hair-keeper",
|
||||||
"version": "0.1.0",
|
"version": "1.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev -p 3000 --turbo",
|
"dev": "next dev -p 3000 --turbo",
|
||||||
"dev:attach": "DEV_TERMINAL=nextdev;tmux new-session -A -s $DEV_TERMINAL\\; send-keys \"pnpm run dev\" ^M",
|
"dev:attach": "DEV_TERMINAL=nextdev;tmux new-session -A -s $DEV_TERMINAL\\; send-keys \"pnpm run dev\" ^M",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start -p 3000",
|
"start": "next start -p 3000",
|
||||||
"lint": "eslint",
|
"lint": "next lint && tsc --noEmit",
|
||||||
"db:seed": "tsx prisma/seed.ts",
|
"db:seed": "tsx prisma/seed.ts",
|
||||||
"build:analyze": "ANALYZE=true next build"
|
"build:analyze": "ANALYZE=true next build"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# 此脚本用来一键部署到生产服务器
|
# 此脚本用来一键部署到生产服务器
|
||||||
# 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm和pm2来运行容器
|
# 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm、tsx、pm2来运行容器
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# 配置
|
# 配置
|
||||||
@@ -46,10 +46,6 @@ cd ${REMOTE_DIR}
|
|||||||
echo "📥 安装依赖..."
|
echo "📥 安装依赖..."
|
||||||
pnpm install --prod
|
pnpm install --prod
|
||||||
|
|
||||||
# 等待数据库启动
|
|
||||||
echo "⏳ 等待数据库启动..."
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
# 运行数据库迁移
|
# 运行数据库迁移
|
||||||
echo "🗄️ 运行数据库迁移..."
|
echo "🗄️ 运行数据库迁移..."
|
||||||
npx prisma migrate deploy
|
npx prisma migrate deploy
|
||||||
|
|||||||
@@ -1,122 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import type { Column } from "@tanstack/react-table";
|
|
||||||
import * as React from "react";
|
|
||||||
|
|
||||||
import { Input } from "@/components/ui/input";
|
|
||||||
import { cn } from "@/lib/utils";
|
|
||||||
import type { ExtendedColumnFilter } from "@/types/data-table";
|
|
||||||
|
|
||||||
interface DataTableRangeFilterProps<TData> extends React.ComponentProps<"div"> {
|
|
||||||
filter: ExtendedColumnFilter<TData>;
|
|
||||||
column: Column<TData>;
|
|
||||||
inputId: string;
|
|
||||||
onFilterUpdate: (
|
|
||||||
filterId: string,
|
|
||||||
updates: Partial<Omit<ExtendedColumnFilter<TData>, "filterId">>,
|
|
||||||
) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function DataTableRangeFilter<TData>({
|
|
||||||
filter,
|
|
||||||
column,
|
|
||||||
inputId,
|
|
||||||
onFilterUpdate,
|
|
||||||
className,
|
|
||||||
...props
|
|
||||||
}: DataTableRangeFilterProps<TData>) {
|
|
||||||
const meta = column.columnDef.meta;
|
|
||||||
|
|
||||||
const [min, max] = React.useMemo(() => {
|
|
||||||
const range = column.columnDef.meta?.filter?.range;
|
|
||||||
if (range) return range;
|
|
||||||
|
|
||||||
const values = column.getFacetedMinMaxValues();
|
|
||||||
if (!values) return [0, 100];
|
|
||||||
|
|
||||||
return [values[0], values[1]];
|
|
||||||
}, [column]);
|
|
||||||
|
|
||||||
const formatValue = React.useCallback(
|
|
||||||
(value: string | number | undefined) => {
|
|
||||||
if (value === undefined || value === "") return "";
|
|
||||||
const numValue = Number(value);
|
|
||||||
return Number.isNaN(numValue)
|
|
||||||
? ""
|
|
||||||
: numValue.toLocaleString(undefined, {
|
|
||||||
maximumFractionDigits: 0,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
const value = React.useMemo(() => {
|
|
||||||
if (Array.isArray(filter.value)) return filter.value.map(formatValue);
|
|
||||||
return [formatValue(filter.value), ""];
|
|
||||||
}, [filter.value, formatValue]);
|
|
||||||
|
|
||||||
const onRangeValueChange = React.useCallback(
|
|
||||||
(value: string, isMin?: boolean) => {
|
|
||||||
const numValue = Number(value);
|
|
||||||
const currentValues = Array.isArray(filter.value)
|
|
||||||
? filter.value
|
|
||||||
: ["", ""];
|
|
||||||
const otherValue = isMin
|
|
||||||
? (currentValues[1] ?? "")
|
|
||||||
: (currentValues[0] ?? "");
|
|
||||||
|
|
||||||
if (
|
|
||||||
value === "" ||
|
|
||||||
(!Number.isNaN(numValue) &&
|
|
||||||
(isMin
|
|
||||||
? numValue >= min && numValue <= (Number(otherValue) || max)
|
|
||||||
: numValue <= max && numValue >= (Number(otherValue) || min)))
|
|
||||||
) {
|
|
||||||
onFilterUpdate(filter.filterId, {
|
|
||||||
value: isMin ? [value, otherValue] : [otherValue, value],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[filter.filterId, filter.value, min, max, onFilterUpdate],
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
data-slot="range"
|
|
||||||
className={cn("flex w-full items-center gap-2", className)}
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<Input
|
|
||||||
id={`${inputId}-min`}
|
|
||||||
type="number"
|
|
||||||
aria-label={`${meta?.label} minimum value`}
|
|
||||||
aria-valuemin={min}
|
|
||||||
aria-valuemax={max}
|
|
||||||
data-slot="range-min"
|
|
||||||
inputMode="numeric"
|
|
||||||
placeholder={min.toString()}
|
|
||||||
min={min}
|
|
||||||
max={max}
|
|
||||||
className="h-8 w-full rounded"
|
|
||||||
defaultValue={value[0]}
|
|
||||||
onChange={(event) => onRangeValueChange(event.target.value, true)}
|
|
||||||
/>
|
|
||||||
<span className="sr-only shrink-0 text-muted-foreground">to</span>
|
|
||||||
<Input
|
|
||||||
id={`${inputId}-max`}
|
|
||||||
type="number"
|
|
||||||
aria-label={`${meta?.label} maximum value`}
|
|
||||||
aria-valuemin={min}
|
|
||||||
aria-valuemax={max}
|
|
||||||
data-slot="range-max"
|
|
||||||
inputMode="numeric"
|
|
||||||
placeholder={max.toString()}
|
|
||||||
min={min}
|
|
||||||
max={max}
|
|
||||||
className="h-8 w-full rounded"
|
|
||||||
defaultValue={value[1]}
|
|
||||||
onChange={(event) => onRangeValueChange(event.target.value)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -225,26 +225,7 @@ export function createDownloadProcedure(config: DownloadConfig) {
|
|||||||
* 提供文件上传相关的接口,使用工厂函数创建特定业务的上传接口
|
* 提供文件上传相关的接口,使用工厂函数创建特定业务的上传接口
|
||||||
*/
|
*/
|
||||||
export const uploadRouter = createTRPCRouter({
|
export const uploadRouter = createTRPCRouter({
|
||||||
// 供给照片批量上传接口
|
|
||||||
supplyPhotos: createBatchUploadProcedure({
|
|
||||||
category: 'transfer/supply',
|
|
||||||
maxSize: 1 * 1024 * 1024, // 1MB
|
|
||||||
allowedContentType: 'image/*',
|
|
||||||
expirySeconds: 3600,
|
|
||||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
|
||||||
}),
|
|
||||||
supplyPdfs: createBatchUploadProcedure({
|
|
||||||
category: 'transfer/supply',
|
|
||||||
maxSize: 1 * 1024 * 1024, // 1MB
|
|
||||||
allowedContentType: 'application/pdf',
|
|
||||||
expirySeconds: 3600,
|
|
||||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
|
||||||
}),
|
|
||||||
// 已上传的供给照片下载
|
|
||||||
downloadSupplyPhotos: createDownloadProcedure({
|
|
||||||
expirySeconds: 3600,
|
|
||||||
permission: Permissions.TRANSFER_SUPPLY_CREATE,
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export type SingleUploadProcedureInput = inferProcedureInput<ReturnType<typeof createSingleUploadProcedure>>; // createSingleUploadProcedure 创建的接口调用参数
|
export type SingleUploadProcedureInput = inferProcedureInput<ReturnType<typeof createSingleUploadProcedure>>; // createSingleUploadProcedure 创建的接口调用参数
|
||||||
|
|||||||
Reference in New Issue
Block a user