@coze-arch/cli 0.0.1-alpha.a3fb1a → 0.0.1-alpha.c49cb2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__templates__/expo/.cozeproj/scripts/deploy_build.sh +4 -3
- package/lib/__templates__/expo/.cozeproj/scripts/deploy_run.sh +8 -40
- package/lib/__templates__/expo/_npmrc +1 -1
- package/lib/__templates__/expo/client/contexts/AuthContext.tsx +14 -107
- package/lib/__templates__/expo/client/screens/home/index.tsx +1 -4
- package/lib/__templates__/expo/client/screens/home/styles.ts +1 -273
- package/lib/__templates__/expo/client/utils/index.ts +1 -2
- package/lib/__templates__/expo/package.json +1 -1
- package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
- package/lib/__templates__/expo/src/index.ts +2 -2
- package/lib/__templates__/expo/template.config.js +1 -1
- package/lib/__templates__/nextjs/_npmrc +1 -1
- package/lib/__templates__/nextjs/package.json +1 -4
- package/lib/__templates__/nextjs/pnpm-lock.yaml +5 -1025
- package/lib/__templates__/nextjs/scripts/dev.sh +1 -1
- package/lib/__templates__/nextjs/src/app/layout.tsx +18 -22
- package/lib/__templates__/nextjs/template.config.js +1 -1
- package/lib/__templates__/templates.json +7 -0
- package/lib/__templates__/vite/_npmrc +1 -1
- package/lib/__templates__/vite/template.config.js +11 -2
- package/lib/__templates__/vite/vite.config.ts +3 -3
- package/lib/cli.js +385 -242
- package/package.json +1 -2
- package/lib/__templates__/nextjs/.babelrc +0 -15
- package/lib/__templates__/nextjs/server.mjs +0 -50
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
if [ -z "${BASH_VERSION:-}" ]; then exec /usr/bin/env bash "$0" "$@"; fi
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
ROOT_DIR="$(pwd)"
|
|
5
|
+
PREVIEW_DIR="${COZE_PREVIEW_DIR:-$ROOT_DIR}"
|
|
5
6
|
LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
|
|
6
7
|
LOG_FILE="$LOG_DIR/app.log"
|
|
7
8
|
mkdir -p "$LOG_DIR"
|
|
@@ -61,9 +62,9 @@ fs.closeSync(fd);
|
|
|
61
62
|
write_log "INFO" "==================== 开始构建 ===================="
|
|
62
63
|
|
|
63
64
|
write_log "INFO" "检查根目录 pre_install.py"
|
|
64
|
-
if [ -f "$
|
|
65
|
-
write_log "INFO" "执行:python $
|
|
66
|
-
python "$
|
|
65
|
+
if [ -f "$PREVIEW_DIR/pre_install.py" ]; then
|
|
66
|
+
write_log "INFO" "执行:python $PREVIEW_DIR/pre_install.py"
|
|
67
|
+
python "$PREVIEW_DIR/pre_install.py" || write_log "ERROR" "pre_install.py 执行失败"
|
|
67
68
|
fi
|
|
68
69
|
|
|
69
70
|
write_log "INFO" "开始执行构建脚本(build_dev.sh)..."
|
|
@@ -4,7 +4,7 @@ LOG_FILE="$LOG_DIR/app.log"
|
|
|
4
4
|
mkdir -p "$LOG_DIR"
|
|
5
5
|
|
|
6
6
|
# ==================== 配置项 ====================
|
|
7
|
-
#
|
|
7
|
+
# Server 服务配置
|
|
8
8
|
SERVER_HOST="0.0.0.0"
|
|
9
9
|
SERVER_PORT="9091"
|
|
10
10
|
# Expo 项目配置
|
|
@@ -175,39 +175,15 @@ mkdir -p logs
|
|
|
175
175
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
176
176
|
ensure_port EXPO_PORT "$EXPO_PORT"
|
|
177
177
|
|
|
178
|
-
# ====================
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if [ -n "${COZE_WORKLOAD_IDENTITY_API_KEY:-}" ]; then
|
|
185
|
-
export OPENAI_API_KEY="$COZE_WORKLOAD_IDENTITY_API_KEY"
|
|
186
|
-
fi
|
|
187
|
-
if [ -n "${OPENAI_API_KEY:-}" ]; then
|
|
188
|
-
export ARK_API_KEY="$OPENAI_API_KEY"
|
|
189
|
-
fi
|
|
190
|
-
|
|
191
|
-
if [ -n "${COZE_INTEGRATION_BASE_URL:-}" ]; then
|
|
192
|
-
_base="${COZE_INTEGRATION_BASE_URL%/}"
|
|
193
|
-
export default_llm_base_url="${_base}/api/v3"
|
|
178
|
+
# ==================== 启动 Server 服务 ====================
|
|
179
|
+
write_log "INFO" "检查 Nginx 端口 (5000)..."
|
|
180
|
+
if is_port_free 5000; then
|
|
181
|
+
write_log "INFO" "端口 5000 未被占用,正在启动 Nginx..."
|
|
182
|
+
service nginx start
|
|
194
183
|
else
|
|
195
|
-
|
|
196
|
-
fi
|
|
197
|
-
|
|
198
|
-
if [ -n "${PGDATABASE_URL:-}" ]; then
|
|
199
|
-
_pg="${PGDATABASE_URL}"
|
|
200
|
-
case "${_pg}" in
|
|
201
|
-
postgresql://*)
|
|
202
|
-
_pg="postgresql+asyncpg://${_pg#postgresql://}"
|
|
203
|
-
;;
|
|
204
|
-
esac
|
|
205
|
-
_pg="${_pg%%\?*}"
|
|
206
|
-
export DATABASE_URL="${_pg}"
|
|
184
|
+
write_log "INFO" "端口 5000 已被占用,跳过 Nginx 启动"
|
|
207
185
|
fi
|
|
208
186
|
|
|
209
|
-
# ------------环境变量----------------------
|
|
210
|
-
|
|
211
187
|
write_log "INFO" "==================== 启动 server 服务 ===================="
|
|
212
188
|
write_log "INFO" "正在执行:npm run server"
|
|
213
189
|
PORT="$SERVER_PORT" nohup npm run server > logs/app.log 2>&1 &
|
|
@@ -227,7 +203,7 @@ if detect_expo_fetch_failed 8; then
|
|
|
227
203
|
: > logs/expo.log
|
|
228
204
|
EXPO_PID=$(start_expo 1)
|
|
229
205
|
fi
|
|
230
|
-
# 输出以下环境变量,确保 Expo 项目能正确连接到
|
|
206
|
+
# 输出以下环境变量,确保 Expo 项目能正确连接到 Server 服务
|
|
231
207
|
write_log "INFO" "Expo 环境变量配置:"
|
|
232
208
|
write_log "INFO" "EXPO_PUBLIC_BACKEND_BASE_URL=${EXPO_PUBLIC_BACKEND_BASE_URL}"
|
|
233
209
|
write_log "INFO" "EXPO_PACKAGER_PROXY_URL=${EXPO_PACKAGER_PROXY_URL}"
|
|
@@ -260,12 +236,4 @@ if [ -f "$ROOT_DIR/post_run.py" ]; then
|
|
|
260
236
|
write_log "INFO" "启动检查结束"
|
|
261
237
|
fi
|
|
262
238
|
|
|
263
|
-
write_log "INFO" "检查 Nginx 端口 (5000)..."
|
|
264
|
-
if is_port_free 5000; then
|
|
265
|
-
write_log "INFO" "端口 5000 未被占用,正在启动 Nginx..."
|
|
266
|
-
service nginx start
|
|
267
|
-
else
|
|
268
|
-
write_log "INFO" "端口 5000 已被占用,跳过 Nginx 启动"
|
|
269
|
-
fi
|
|
270
|
-
|
|
271
239
|
write_log "INFO" "==================== 服务启动完成 ===================="
|
|
@@ -4,19 +4,15 @@
|
|
|
4
4
|
*
|
|
5
5
|
* 基于固定的 API 接口实现,可复用到其他项目
|
|
6
6
|
* 其他项目使用时,只需修改 @api 的导入路径指向项目的 api 模块
|
|
7
|
+
*
|
|
8
|
+
* 注意:
|
|
9
|
+
* - 如果需要登录/鉴权场景,请扩展本文件,完善 login/logout、token 管理、用户信息获取与刷新等逻辑
|
|
10
|
+
* - 将示例中的占位实现替换为项目实际的接口调用与状态管理
|
|
7
11
|
*/
|
|
8
|
-
import React, {
|
|
9
|
-
createContext,
|
|
10
|
-
useContext,
|
|
11
|
-
useState,
|
|
12
|
-
useEffect,
|
|
13
|
-
ReactNode,
|
|
14
|
-
} from "react";
|
|
15
|
-
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
16
|
-
//import { UserOut, UsersService, AuthenticationService } from "@api";
|
|
12
|
+
import React, { createContext, useContext, ReactNode } from "react";
|
|
17
13
|
|
|
18
14
|
interface UserOut {
|
|
19
|
-
|
|
15
|
+
|
|
20
16
|
}
|
|
21
17
|
|
|
22
18
|
interface AuthContextType {
|
|
@@ -31,105 +27,16 @@ interface AuthContextType {
|
|
|
31
27
|
|
|
32
28
|
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
|
33
29
|
|
|
34
|
-
export const AuthProvider: React.FC<{ children: ReactNode }> = ({
|
|
35
|
-
children,
|
|
36
|
-
}) => {
|
|
37
|
-
const [user, setUser] = useState<UserOut | null>(null);
|
|
38
|
-
const [token, setToken] = useState<string | null>(null);
|
|
39
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
loadAuthData();
|
|
43
|
-
}, []);
|
|
44
|
-
|
|
45
|
-
const loadAuthData = async () => {
|
|
46
|
-
try {
|
|
47
|
-
const results = await AsyncStorage.multiGet(["access_token", "user_data"]);
|
|
48
|
-
const storedToken = results?.[0]?.[1] ?? null;
|
|
49
|
-
const storedUser = results?.[1]?.[1] ?? null;
|
|
50
|
-
|
|
51
|
-
if (!storedToken) {
|
|
52
|
-
setToken(null);
|
|
53
|
-
setUser(null);
|
|
54
|
-
await AsyncStorage.multiRemove(["access_token", "user_data"]);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (storedToken && storedUser) {
|
|
59
|
-
setToken(storedToken);
|
|
60
|
-
setUser(JSON.parse(storedUser));
|
|
61
|
-
} else if (storedToken && !storedUser) {
|
|
62
|
-
// 若仅有 token,主动拉取当前用户信息
|
|
63
|
-
setToken(storedToken);
|
|
64
|
-
try {
|
|
65
|
-
// const me = await UsersService.getCurrentUserApiV1UsersMeGet();
|
|
66
|
-
//if (me?.success && me.data) {
|
|
67
|
-
// setUser(me.data);
|
|
68
|
-
// await AsyncStorage.setItem("user_data", JSON.stringify(me.data));
|
|
69
|
-
//}
|
|
70
|
-
} catch (e) {
|
|
71
|
-
// 拉取失败则保持未登录状态
|
|
72
|
-
console.error("Failed to fetch current user with stored token:", e);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
console.error("Failed to load auth data:", error);
|
|
77
|
-
} finally {
|
|
78
|
-
setIsLoading(false);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const login = async (newToken: string) => {
|
|
83
|
-
try {
|
|
84
|
-
setToken(newToken);
|
|
85
|
-
// 统一写入 access_token,供 OpenAPI 读取并自动携带
|
|
86
|
-
await AsyncStorage.setItem("access_token", newToken);
|
|
87
|
-
// 登录后拉取当前用户并缓存
|
|
88
|
-
try {
|
|
89
|
-
const me = await UsersService.getCurrentUserApiV1UsersMeGet();
|
|
90
|
-
if (me?.success && me.data) {
|
|
91
|
-
setUser(me.data);
|
|
92
|
-
await AsyncStorage.setItem("user_data", JSON.stringify(me.data));
|
|
93
|
-
}
|
|
94
|
-
} catch (e) {
|
|
95
|
-
console.error("Fetch current user after login failed:", e);
|
|
96
|
-
}
|
|
97
|
-
} catch (error) {
|
|
98
|
-
console.error("Login failed:", error);
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
const logout = async () => {
|
|
104
|
-
try {
|
|
105
|
-
// await AuthenticationService.logoutApiV1AuthLogoutPost(true);
|
|
106
|
-
} catch(error) {
|
|
107
|
-
console.warn('Logout failed:', error);
|
|
108
|
-
}
|
|
109
|
-
// remove token
|
|
110
|
-
setToken(null);
|
|
111
|
-
setUser(null);
|
|
112
|
-
await AsyncStorage.multiRemove(["auth_token", "access_token", "user_data"]);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const updateUser = (userData: Partial<UserOut>) => {
|
|
116
|
-
if (user) {
|
|
117
|
-
const updatedUser = { ...user, ...userData };
|
|
118
|
-
setUser(updatedUser);
|
|
119
|
-
AsyncStorage.setItem("user_data", JSON.stringify(updatedUser));
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
|
|
30
|
+
export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
|
|
123
31
|
const value: AuthContextType = {
|
|
124
|
-
user,
|
|
125
|
-
token,
|
|
126
|
-
isAuthenticated:
|
|
127
|
-
isLoading,
|
|
128
|
-
login,
|
|
129
|
-
logout,
|
|
130
|
-
updateUser,
|
|
32
|
+
user: null,
|
|
33
|
+
token: null,
|
|
34
|
+
isAuthenticated: false,
|
|
35
|
+
isLoading: false,
|
|
36
|
+
login: async (token: string) => {},
|
|
37
|
+
logout: async () => {},
|
|
38
|
+
updateUser: () => {},
|
|
131
39
|
};
|
|
132
|
-
|
|
133
40
|
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
|
|
134
41
|
};
|
|
135
42
|
|
|
@@ -3,10 +3,7 @@ import {
|
|
|
3
3
|
View,
|
|
4
4
|
Text,
|
|
5
5
|
ScrollView,
|
|
6
|
-
TouchableOpacity,
|
|
7
6
|
RefreshControl,
|
|
8
|
-
Image,
|
|
9
|
-
ActivityIndicator,
|
|
10
7
|
} from 'react-native';
|
|
11
8
|
import { useRouter, useFocusEffect } from 'expo-router';
|
|
12
9
|
import { FontAwesome6 } from '@expo/vector-icons';
|
|
@@ -15,7 +12,7 @@ import { useTheme } from "@/hooks/useTheme";
|
|
|
15
12
|
|
|
16
13
|
import { Screen } from '@/components/Screen';
|
|
17
14
|
|
|
18
|
-
import styles from './styles';
|
|
15
|
+
import { styles } from './styles';
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
export default function HomeScreen() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet, Platform } from 'react-native';
|
|
2
2
|
|
|
3
|
-
const styles = StyleSheet.create({
|
|
3
|
+
export const styles = StyleSheet.create({
|
|
4
4
|
loadingContainer: {
|
|
5
5
|
flex: 1,
|
|
6
6
|
justifyContent: 'center',
|
|
@@ -22,18 +22,6 @@ const styles = StyleSheet.create({
|
|
|
22
22
|
fontSize: 16,
|
|
23
23
|
color: '#64748B',
|
|
24
24
|
},
|
|
25
|
-
retryButton: {
|
|
26
|
-
marginTop: 20,
|
|
27
|
-
paddingHorizontal: 24,
|
|
28
|
-
paddingVertical: 12,
|
|
29
|
-
backgroundColor: '#2563EB',
|
|
30
|
-
borderRadius: 8,
|
|
31
|
-
},
|
|
32
|
-
retryButtonText: {
|
|
33
|
-
color: '#FFFFFF',
|
|
34
|
-
fontSize: 14,
|
|
35
|
-
fontWeight: '600',
|
|
36
|
-
},
|
|
37
25
|
header: {
|
|
38
26
|
flexDirection: 'row',
|
|
39
27
|
justifyContent: 'space-between',
|
|
@@ -44,11 +32,6 @@ const styles = StyleSheet.create({
|
|
|
44
32
|
// borderBottomWidth: 1,
|
|
45
33
|
borderBottomColor: '#E2E8F0',
|
|
46
34
|
},
|
|
47
|
-
headerLeft: {
|
|
48
|
-
flexDirection: 'row',
|
|
49
|
-
alignItems: 'center',
|
|
50
|
-
gap: 10,
|
|
51
|
-
},
|
|
52
35
|
logoContainer: {
|
|
53
36
|
width: 32,
|
|
54
37
|
height: 32,
|
|
@@ -74,259 +57,4 @@ const styles = StyleSheet.create({
|
|
|
74
57
|
color: '#1E293B',
|
|
75
58
|
letterSpacing: -0.5,
|
|
76
59
|
},
|
|
77
|
-
userMenuContainer: {
|
|
78
|
-
flexDirection: 'row',
|
|
79
|
-
alignItems: 'center',
|
|
80
|
-
gap: 10,
|
|
81
|
-
paddingLeft: 16,
|
|
82
|
-
borderLeftWidth: 1,
|
|
83
|
-
borderLeftColor: '#E2E8F0',
|
|
84
|
-
},
|
|
85
|
-
userInfo: {
|
|
86
|
-
alignItems: 'flex-end',
|
|
87
|
-
},
|
|
88
|
-
userName: {
|
|
89
|
-
fontSize: 14,
|
|
90
|
-
fontWeight: '500',
|
|
91
|
-
color: '#1E293B',
|
|
92
|
-
},
|
|
93
|
-
userRole: {
|
|
94
|
-
fontSize: 12,
|
|
95
|
-
color: '#64748B',
|
|
96
|
-
},
|
|
97
|
-
avatar: {
|
|
98
|
-
width: 36,
|
|
99
|
-
height: 36,
|
|
100
|
-
borderRadius: 18,
|
|
101
|
-
borderWidth: 2,
|
|
102
|
-
borderColor: '#FFFFFF',
|
|
103
|
-
...Platform.select({
|
|
104
|
-
ios: {
|
|
105
|
-
shadowColor: '#000',
|
|
106
|
-
shadowOffset: { width: 0, height: 1 },
|
|
107
|
-
shadowOpacity: 0.1,
|
|
108
|
-
shadowRadius: 2,
|
|
109
|
-
},
|
|
110
|
-
android: {
|
|
111
|
-
elevation: 2,
|
|
112
|
-
},
|
|
113
|
-
}),
|
|
114
|
-
},
|
|
115
|
-
avatarPlaceholder: {
|
|
116
|
-
width: 36,
|
|
117
|
-
height: 36,
|
|
118
|
-
borderRadius: 18,
|
|
119
|
-
justifyContent: 'center',
|
|
120
|
-
alignItems: 'center',
|
|
121
|
-
borderWidth: 2,
|
|
122
|
-
borderColor: '#FFFFFF',
|
|
123
|
-
backgroundColor: '#3B82F6',
|
|
124
|
-
...Platform.select({
|
|
125
|
-
ios: {
|
|
126
|
-
shadowColor: '#000',
|
|
127
|
-
shadowOffset: { width: 0, height: 1 },
|
|
128
|
-
shadowOpacity: 0.1,
|
|
129
|
-
shadowRadius: 2,
|
|
130
|
-
},
|
|
131
|
-
android: {
|
|
132
|
-
elevation: 2,
|
|
133
|
-
},
|
|
134
|
-
}),
|
|
135
|
-
},
|
|
136
|
-
avatarInitial: {
|
|
137
|
-
fontSize: 14,
|
|
138
|
-
fontWeight: '700',
|
|
139
|
-
color: '#FFFFFF',
|
|
140
|
-
},
|
|
141
|
-
content: {
|
|
142
|
-
paddingHorizontal: 16,
|
|
143
|
-
paddingTop: 24,
|
|
144
|
-
},
|
|
145
|
-
welcomeSection: {
|
|
146
|
-
marginBottom: 24,
|
|
147
|
-
},
|
|
148
|
-
welcomeTitle: {
|
|
149
|
-
fontSize: 22,
|
|
150
|
-
fontWeight: '700',
|
|
151
|
-
color: '#1E293B',
|
|
152
|
-
marginBottom: 4,
|
|
153
|
-
},
|
|
154
|
-
welcomeSubtitle: {
|
|
155
|
-
fontSize: 14,
|
|
156
|
-
color: '#64748B',
|
|
157
|
-
},
|
|
158
|
-
statsGrid: {
|
|
159
|
-
flexDirection: 'row',
|
|
160
|
-
gap: 12,
|
|
161
|
-
marginBottom: 24,
|
|
162
|
-
},
|
|
163
|
-
statCard: {
|
|
164
|
-
flex: 1,
|
|
165
|
-
backgroundColor: '#FFFFFF',
|
|
166
|
-
borderRadius: 12,
|
|
167
|
-
padding: 16,
|
|
168
|
-
...Platform.select({
|
|
169
|
-
ios: {
|
|
170
|
-
shadowColor: '#000',
|
|
171
|
-
shadowOffset: { width: 0, height: 1 },
|
|
172
|
-
shadowOpacity: 0.05,
|
|
173
|
-
shadowRadius: 3,
|
|
174
|
-
},
|
|
175
|
-
android: {
|
|
176
|
-
elevation: 2,
|
|
177
|
-
},
|
|
178
|
-
}),
|
|
179
|
-
},
|
|
180
|
-
statCardHeader: {
|
|
181
|
-
flexDirection: 'row',
|
|
182
|
-
justifyContent: 'space-between',
|
|
183
|
-
alignItems: 'flex-start',
|
|
184
|
-
marginBottom: 12,
|
|
185
|
-
},
|
|
186
|
-
statIconContainer: {
|
|
187
|
-
width: 40,
|
|
188
|
-
height: 40,
|
|
189
|
-
borderRadius: 10,
|
|
190
|
-
justifyContent: 'center',
|
|
191
|
-
alignItems: 'center',
|
|
192
|
-
},
|
|
193
|
-
statIconBlue: {
|
|
194
|
-
backgroundColor: '#EFF6FF',
|
|
195
|
-
},
|
|
196
|
-
statIconRed: {
|
|
197
|
-
backgroundColor: '#FEF2F2',
|
|
198
|
-
},
|
|
199
|
-
statIconGreen: {
|
|
200
|
-
backgroundColor: '#ECFDF5',
|
|
201
|
-
},
|
|
202
|
-
attentionBadge: {
|
|
203
|
-
backgroundColor: '#FEF2F2',
|
|
204
|
-
paddingHorizontal: 6,
|
|
205
|
-
paddingVertical: 2,
|
|
206
|
-
borderRadius: 10,
|
|
207
|
-
},
|
|
208
|
-
attentionBadgeText: {
|
|
209
|
-
fontSize: 10,
|
|
210
|
-
fontWeight: '500',
|
|
211
|
-
color: '#EF4444',
|
|
212
|
-
},
|
|
213
|
-
rateBadge: {
|
|
214
|
-
backgroundColor: '#ECFDF5',
|
|
215
|
-
paddingHorizontal: 6,
|
|
216
|
-
paddingVertical: 2,
|
|
217
|
-
borderRadius: 10,
|
|
218
|
-
},
|
|
219
|
-
rateBadgeText: {
|
|
220
|
-
fontSize: 10,
|
|
221
|
-
fontWeight: '500',
|
|
222
|
-
color: '#10B981',
|
|
223
|
-
},
|
|
224
|
-
statValue: {
|
|
225
|
-
fontSize: 28,
|
|
226
|
-
fontWeight: '700',
|
|
227
|
-
color: '#1E293B',
|
|
228
|
-
marginBottom: 2,
|
|
229
|
-
},
|
|
230
|
-
statLabel: {
|
|
231
|
-
fontSize: 13,
|
|
232
|
-
color: '#64748B',
|
|
233
|
-
},
|
|
234
|
-
shortcutsSection: {
|
|
235
|
-
gap: 12,
|
|
236
|
-
marginBottom: 24,
|
|
237
|
-
},
|
|
238
|
-
shortcutCard: {
|
|
239
|
-
flexDirection: 'row',
|
|
240
|
-
justifyContent: 'space-between',
|
|
241
|
-
alignItems: 'center',
|
|
242
|
-
backgroundColor: '#FFFFFF',
|
|
243
|
-
borderRadius: 12,
|
|
244
|
-
padding: 16,
|
|
245
|
-
...Platform.select({
|
|
246
|
-
ios: {
|
|
247
|
-
shadowColor: '#000',
|
|
248
|
-
shadowOffset: { width: 0, height: 1 },
|
|
249
|
-
shadowOpacity: 0.05,
|
|
250
|
-
shadowRadius: 3,
|
|
251
|
-
},
|
|
252
|
-
android: {
|
|
253
|
-
elevation: 2,
|
|
254
|
-
},
|
|
255
|
-
}),
|
|
256
|
-
},
|
|
257
|
-
shortcutContent: {
|
|
258
|
-
flex: 1,
|
|
259
|
-
marginRight: 16,
|
|
260
|
-
},
|
|
261
|
-
shortcutTitle: {
|
|
262
|
-
fontSize: 16,
|
|
263
|
-
fontWeight: '600',
|
|
264
|
-
color: '#1E293B',
|
|
265
|
-
marginBottom: 6,
|
|
266
|
-
},
|
|
267
|
-
shortcutDescription: {
|
|
268
|
-
fontSize: 13,
|
|
269
|
-
color: '#64748B',
|
|
270
|
-
marginBottom: 10,
|
|
271
|
-
lineHeight: 18,
|
|
272
|
-
},
|
|
273
|
-
shortcutAction: {
|
|
274
|
-
flexDirection: 'row',
|
|
275
|
-
alignItems: 'center',
|
|
276
|
-
gap: 6,
|
|
277
|
-
},
|
|
278
|
-
shortcutActionText: {
|
|
279
|
-
fontSize: 13,
|
|
280
|
-
fontWeight: '500',
|
|
281
|
-
color: '#2563EB',
|
|
282
|
-
},
|
|
283
|
-
shortcutIconContainer: {
|
|
284
|
-
width: 56,
|
|
285
|
-
height: 56,
|
|
286
|
-
borderRadius: 28,
|
|
287
|
-
justifyContent: 'center',
|
|
288
|
-
alignItems: 'center',
|
|
289
|
-
},
|
|
290
|
-
shortcutIconBlue: {
|
|
291
|
-
backgroundColor: '#EFF6FF',
|
|
292
|
-
},
|
|
293
|
-
shortcutIconGreen: {
|
|
294
|
-
backgroundColor: '#ECFDF5',
|
|
295
|
-
},
|
|
296
|
-
bannerContainer: {
|
|
297
|
-
height: 160,
|
|
298
|
-
borderRadius: 12,
|
|
299
|
-
overflow: 'hidden',
|
|
300
|
-
backgroundColor: '#1E3A8A',
|
|
301
|
-
},
|
|
302
|
-
bannerOverlay: {
|
|
303
|
-
flex: 1,
|
|
304
|
-
justifyContent: 'center',
|
|
305
|
-
paddingHorizontal: 20,
|
|
306
|
-
},
|
|
307
|
-
bannerTitle: {
|
|
308
|
-
fontSize: 18,
|
|
309
|
-
fontWeight: '700',
|
|
310
|
-
color: '#FFFFFF',
|
|
311
|
-
marginBottom: 6,
|
|
312
|
-
},
|
|
313
|
-
bannerSubtitle: {
|
|
314
|
-
fontSize: 13,
|
|
315
|
-
color: '#BFDBFE',
|
|
316
|
-
marginBottom: 16,
|
|
317
|
-
},
|
|
318
|
-
bannerButton: {
|
|
319
|
-
alignSelf: 'flex-start',
|
|
320
|
-
backgroundColor: '#FFFFFF',
|
|
321
|
-
paddingHorizontal: 20,
|
|
322
|
-
paddingVertical: 10,
|
|
323
|
-
borderRadius: 8,
|
|
324
|
-
},
|
|
325
|
-
bannerButtonText: {
|
|
326
|
-
fontSize: 13,
|
|
327
|
-
fontWeight: '500',
|
|
328
|
-
color: '#2563EB',
|
|
329
|
-
},
|
|
330
60
|
});
|
|
331
|
-
|
|
332
|
-
export default styles;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// import { OpenAPI } from '@api'; // 如果使用 openapi 客户端,请取消注释并确保安装
|
|
2
1
|
import dayjs from 'dayjs';
|
|
3
2
|
import utc from 'dayjs/plugin/utc';
|
|
4
3
|
dayjs.extend(utc);
|
|
@@ -26,7 +25,7 @@ export const buildAssetUrl = (url?: string | null, w?: number, h?: number): stri
|
|
|
26
25
|
// 3. 构造参数,保留原有 Query (如有)
|
|
27
26
|
const separator = abs.includes('?') ? '&' : '?';
|
|
28
27
|
const query = [
|
|
29
|
-
w ? `w=${Math.floor(w)}` : '',
|
|
28
|
+
w ? `w=${Math.floor(w)}` : '',
|
|
30
29
|
h ? `h=${Math.floor(h)}` : ''
|
|
31
30
|
].filter(Boolean).join('&');
|
|
32
31
|
return `${abs}${separator}${query}`;
|
|
@@ -51,8 +51,8 @@ importers:
|
|
|
51
51
|
specifier: ^3.7.0
|
|
52
52
|
version: 3.7.0
|
|
53
53
|
coze-coding-dev-sdk:
|
|
54
|
-
specifier: 0.5.
|
|
55
|
-
version: 0.5.
|
|
54
|
+
specifier: ^0.5.2
|
|
55
|
+
version: 0.5.4(@types/pg@8.16.0)(openai@6.15.0(ws@8.18.3)(zod@4.3.2))(ws@8.18.3)
|
|
56
56
|
dayjs:
|
|
57
57
|
specifier: ^1.11.19
|
|
58
58
|
version: 1.11.19
|
|
@@ -3137,8 +3137,8 @@ packages:
|
|
|
3137
3137
|
resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
|
|
3138
3138
|
engines: {node: '>=10'}
|
|
3139
3139
|
|
|
3140
|
-
coze-coding-dev-sdk@0.5.
|
|
3141
|
-
resolution: {integrity: sha512-
|
|
3140
|
+
coze-coding-dev-sdk@0.5.4:
|
|
3141
|
+
resolution: {integrity: sha512-nIH2hMFlO2PSnqdslFzOITK+2FhR64caoYFuzy2ma+ceu0o2Spe7tLYLIsyUc42Prr5gXqk4MZESQqpXD34ZwQ==}
|
|
3142
3142
|
engines: {node: '>=18.0.0'}
|
|
3143
3143
|
hasBin: true
|
|
3144
3144
|
|
|
@@ -10312,7 +10312,7 @@ snapshots:
|
|
|
10312
10312
|
path-type: 4.0.0
|
|
10313
10313
|
yaml: 1.10.2
|
|
10314
10314
|
|
|
10315
|
-
coze-coding-dev-sdk@0.5.
|
|
10315
|
+
coze-coding-dev-sdk@0.5.4(@types/pg@8.16.0)(openai@6.15.0(ws@8.18.3)(zod@4.3.2))(ws@8.18.3):
|
|
10316
10316
|
dependencies:
|
|
10317
10317
|
'@aws-sdk/client-s3': 3.958.0
|
|
10318
10318
|
'@aws-sdk/lib-storage': 3.958.0(@aws-sdk/client-s3@3.958.0)
|
|
@@ -3,8 +3,8 @@ import express from "express";
|
|
|
3
3
|
const app = express();
|
|
4
4
|
const port = process.env.PORT || 9091;
|
|
5
5
|
|
|
6
|
-
app.get('/api/
|
|
7
|
-
res.status(200).json({ message: '
|
|
6
|
+
app.get('/api/v1/ping', (req, res) => {
|
|
7
|
+
res.status(200).json({ message: 'connected' });
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
app.listen(port, () => {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"class-variance-authority": "^0.7.1",
|
|
43
43
|
"clsx": "^2.1.1",
|
|
44
44
|
"cmdk": "^1.1.1",
|
|
45
|
-
"coze-coding-dev-sdk": "0.5.
|
|
45
|
+
"coze-coding-dev-sdk": "^0.5.2",
|
|
46
46
|
"date-fns": "^4.1.0",
|
|
47
47
|
"drizzle-kit": "^0.31.8",
|
|
48
48
|
"drizzle-orm": "^0.45.1",
|
|
@@ -66,8 +66,6 @@
|
|
|
66
66
|
"zod": "^4.3.5"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@react-dev-inspector/babel-plugin": "^2.0.1",
|
|
70
|
-
"@react-dev-inspector/middleware": "^2.0.1",
|
|
71
69
|
"@tailwindcss/postcss": "^4",
|
|
72
70
|
"@types/node": "^20",
|
|
73
71
|
"@types/pg": "^8.16.0",
|
|
@@ -76,7 +74,6 @@
|
|
|
76
74
|
"eslint": "^9",
|
|
77
75
|
"eslint-config-next": "16.1.1",
|
|
78
76
|
"only-allow": "^1.2.2",
|
|
79
|
-
"react-dev-inspector": "^2.0.1",
|
|
80
77
|
"shadcn": "latest",
|
|
81
78
|
"tailwindcss": "^4",
|
|
82
79
|
"typescript": "^5"
|