Commit 3e37df57 by chunhong.mu

feat(qqqf-mp): 初始化小程序

parent 3a798993
VITE_API_BASE_URL=https://dev-api.example.com
VITE_ENV=development
VITE_API_BASE_URL=https://api.example.com
VITE_ENV=production
VITE_API_BASE_URL=https://staging-api.example.com
VITE_ENV=staging
VITE_API_BASE_URL=https://test-api.example.com
VITE_ENV=test
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport =
"CSS" in window &&
typeof CSS.supports === "function" &&
(CSS.supports("top: env(safe-area-inset-top)") || CSS.supports("top: constant(safe-area-inset-top)"))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ", viewport-fit=cover" : "") +
'" />',
)
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
{
"name": "qqqf-mp",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "uni -p mp-weixin",
"dev:h5": "uni",
"dev:mp-alipay": "uni -p mp-alipay",
"dev:mp-baidu": "uni -p mp-baidu",
"dev:mp-toutiao": "uni -p mp-toutiao",
"dev:mp-weixin": "uni -p mp-weixin",
"dev:test": "uni -p mp-weixin --mode test",
"dev:staging": "uni -p mp-weixin --mode staging",
"dev:production": "uni -p mp-weixin --mode production",
"build": "uni build -p mp-weixin",
"build:h5": "uni build",
"build:mp-alipay": "uni build -p mp-alipay",
"build:mp-weixin": "uni build -p mp-weixin",
"build:test": "uni build -p mp-weixin --mode test",
"build:staging": "uni build -p mp-weixin --mode staging",
"build:production": "uni build -p mp-weixin --mode production",
"type-check": "vue-tsc --noEmit"
},
"dependencies": {
"@common/sdk": "workspace:*",
"@common/utils": "workspace:*",
"@dcloudio/uni-app": "3.0.0-4070520250711001",
"@dcloudio/uni-components": "3.0.0-4070520250711001",
"@dcloudio/uni-h5": "3.0.0-4070520250711001",
"@dcloudio/uni-mp-weixin": "3.0.0-4070520250711001",
"pinia": "^3.0.1",
"pinia-plugin-persistedstate": "^4.2.0",
"vue": "^3.4.21"
},
"devDependencies": {
"@dcloudio/types": "^3.4.8",
"@dcloudio/uni-cli-shared": "3.0.0-4070520250711001",
"@dcloudio/vite-plugin-uni": "3.0.0-4070520250711001",
"@types/node": "^22.13.9",
"@vue/runtime-core": "^3.4.21",
"@vue/tsconfig": "^0.7.0",
"miniprogram-api-typings": "^4.0.7",
"sass": "^1.85.1",
"typescript": "^5.5.4",
"vite": "5.2.8",
"vue-tsc": "^2.2.8"
}
}
<template>
<view class="app-container">
<slot />
</view>
</template>
<script setup lang="ts">
import { onLaunch } from "@dcloudio/uni-app"
onLaunch(() => {
console.log("App Launch")
})
</script>
<style lang="scss">
.app-container {
width: 100%;
min-height: 100vh;
background-color: #f5f7fa;
}
</style>
import { sdk } from "./http"
export interface HomeData {
title: string
description: string
bannerUrl: string
}
/** 获取首页数据 */
export async function fetchHomeData() {
return await sdk.core
.domainService("qqqf", "api", "getHomeData")
.request("get", {})
.then((r: any) => {
return r as HomeData
})
.catch((err: any) => {
console.log(`err: ${err}`)
return {
title: "默认标题",
description: "默认描述",
bannerUrl: "",
} as HomeData
})
}
import { SdkCore } from "@common/sdk"
import { config } from "@/config"
class Sdk extends SdkCore {
constructor() {
super(config)
}
}
const sdk = new Sdk()
export { sdk }
import type { SdkConfig } from "@common/sdk"
export enum Environment {
Dev = "dev",
Pro = "pro",
Test = "test",
Stage = "stage",
}
export const config: SdkConfig = {
uniplatApi: import.meta.env.VITE_API_BASE_URL || "https://api.example.com",
rootEntrance: "qqqf-mp",
logEnv: import.meta.env.VITE_ENV || "development",
clientId: "qqqf-mp-client",
domainService: {
subProjectName: "qqqf",
serviceName: "api",
},
}
export const noNeedAuthPages = [
"pages/home/index",
]
export class CoreEnvir {
private static currentEnv: Environment | null = null
static getCurrent(): Environment {
if (this.currentEnv) return this.currentEnv
const envMode = import.meta.env.VITE_ENV
if (
envMode &&
Object.values(Environment).includes(envMode as Environment)
) {
this.currentEnv = envMode as Environment
return this.currentEnv
}
return import.meta.env.MODE === "development"
? Environment.Dev
: Environment.Pro
}
static switch(env: Environment) {
this.currentEnv = env
}
static isDev() {
return this.getCurrent() === Environment.Dev
}
static isPro() {
return !this.isDev() && !import.meta.env.VITE_ENV
}
}
/// <reference types="@dcloudio/types" />
declare module "*.vue" {
import type { DefineComponent } from "vue"
const component: DefineComponent<{}, {}, any>
export default component
}
interface ImportMetaEnv {
readonly VITE_API_BASE_URL: string
readonly VITE_ENV: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
import { createPinia } from "pinia"
import { createSSRApp } from "vue"
import App from "@/App.vue"
console.log("env", import.meta.env)
export function createApp() {
const app = createSSRApp(App)
const pinia = createPinia()
app.use(pinia)
return { app }
}
{
"name": "qqqf-mp",
"appid": "",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
"app-plus": {
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules": {},
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
"ios": {},
"sdkConfigs": {}
}
},
"quickapp": {},
"mp-weixin": {
"appid": "",
"setting": {
"urlCheck": false
},
"usingComponents": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"h5": {
"unipush": {
"enable": false
}
}
}
{
"pages": [
{
"path": "pages/home/index",
"style": {
"navigationBarTitleText": "首页"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#ffffff"
}
}
<template>
<view class="home-page">
<view class="header">
<text class="title">欢迎来到 QQQF</text>
</view>
<view class="content">
<view class="card">
<text class="card-title">SDK 请求测试</text>
<view class="btn" @click="handleFetchData">
<text class="btn-text">点击发起请求</text>
</view>
<view v-if="loading" class="loading">
<text class="loading-text">加载中...</text>
</view>
<view v-if="homeData" class="result">
<text class="result-title">请求结果:</text>
<text class="result-text">{{ homeData.title }}</text>
<text class="result-desc">{{ homeData.description }}</text>
</view>
<view v-if="errorMsg" class="error">
<text class="error-text">{{ errorMsg }}</text>
</view>
</view>
<view class="card">
<text class="card-title">环境信息</text>
<text class="info-text">API 地址: {{ apiBaseUrl }}</text>
<text class="info-text">环境: {{ env }}</text>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { ref } from "vue"
import { fetchHomeData, type HomeData } from "@/api/home"
const homeData = ref<HomeData | null>(null)
const loading = ref(false)
const errorMsg = ref("")
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL || "未配置"
const env = import.meta.env.VITE_ENV || "development"
async function handleFetchData() {
loading.value = true
errorMsg.value = ""
homeData.value = null
try {
const res = await fetchHomeData()
homeData.value = res
} catch (error: any) {
errorMsg.value = error?.message || "请求失败,请检查网络或 SDK 配置"
console.error("fetchHomeData error:", error)
} finally {
loading.value = false
}
}
</script>
<style lang="scss" scoped>
.home-page {
min-height: 100vh;
background-color: #f5f7fa;
padding: 24rpx;
}
.header {
padding: 40rpx 0;
text-align: center;
}
.title {
font-size: 40rpx;
font-weight: bold;
color: #333;
}
.content {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.card {
background-color: #fff;
border-radius: 16rpx;
padding: 32rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
}
.card-title {
font-size: 32rpx;
font-weight: 600;
color: #333;
margin-bottom: 24rpx;
display: block;
}
.btn {
background-color: #409eff;
border-radius: 8rpx;
padding: 20rpx 0;
text-align: center;
margin-bottom: 24rpx;
}
.btn-text {
color: #fff;
font-size: 28rpx;
}
.loading {
text-align: center;
padding: 20rpx 0;
}
.loading-text {
color: #999;
font-size: 26rpx;
}
.result {
padding: 20rpx 0;
border-top: 1rpx solid #eee;
}
.result-title {
font-size: 28rpx;
color: #666;
margin-bottom: 12rpx;
display: block;
}
.result-text {
font-size: 30rpx;
font-weight: 600;
color: #333;
display: block;
margin-bottom: 8rpx;
}
.result-desc {
font-size: 26rpx;
color: #999;
display: block;
}
.error {
padding: 20rpx 0;
border-top: 1rpx solid #fee;
}
.error-text {
color: #f56c6c;
font-size: 26rpx;
display: block;
}
.info-text {
font-size: 26rpx;
color: #666;
display: block;
margin-bottom: 8rpx;
}
</style>
{
"extends": "@vue/tsconfig/tsconfig.json",
"compilerOptions": {
"lib": ["esnext", "dom"],
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"types": ["@dcloudio/types"],
"sourceMap": true,
"verbatimModuleSyntax": false
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}
import uni from "@dcloudio/vite-plugin-uni"
import { defineConfig } from "vite"
export default defineConfig({
plugins: [uni()],
publicDir: false,
resolve: {
alias: {
"@": "/src",
},
},
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment