xing 2 years ago
commit 5fed074839
  1. 26
      .eslintrc.js
  2. 21
      .gitignore
  3. 20
      index.html
  4. 17076
      package-lock.json
  5. 82
      package.json
  6. 38
      src/App.vue
  7. 4
      src/api/server/config.ts
  8. 59
      src/api/server/interceptors.ts
  9. 139
      src/api/server/request.ts
  10. 94
      src/api/server/type.ts
  11. 7
      src/api/user.ts
  12. 8
      src/env.d.ts
  13. 13
      src/main.ts
  14. 72
      src/manifest.json
  15. 27
      src/pages.json
  16. 37
      src/pages/index/index.vue
  17. 33
      src/pages/login/index.vue
  18. 6
      src/shime-uni.d.ts
  19. 65
      src/static/tailwindcss.js
  20. 21
      src/store/index.ts
  21. 18
      src/store/user/index.ts
  22. 77
      src/uni.scss
  23. 44
      tsconfig.json
  24. 9
      types/global.d.ts
  25. 11
      types/user.d.ts
  26. 12
      vite.config.ts
  27. 5343
      yarn.lock

@ -0,0 +1,26 @@
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": [
"plugin:vue/essential",
"standard"
],
"parserOptions": {
"ecmaVersion": "latest",
"parser": "@typescript-eslint/parser",
"sourceType": "module"
},
"plugins": [
"vue",
"@typescript-eslint"
],
"rules": {},
"globals": {
"uni": true,
"UniApp": true,
"wx": true,
"ICloud": true
},
}

21
.gitignore vendored

@ -0,0 +1,21 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
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>

17076
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,82 @@
{
"name": "uni-preset-vue",
"version": "0.0.0",
"scripts": {
"dev:app": "uni -p app",
"dev:app-android": "uni -p app-android",
"dev:app-ios": "uni -p app-ios",
"dev:custom": "uni -p",
"dev:h5": "uni",
"dev:h5:ssr": "uni --ssr",
"dev:mp-alipay": "uni -p mp-alipay",
"dev:mp-baidu": "uni -p mp-baidu",
"dev:mp-jd": "uni -p mp-jd",
"dev:mp-kuaishou": "uni -p mp-kuaishou",
"dev:mp-lark": "uni -p mp-lark",
"dev:mp-qq": "uni -p mp-qq",
"dev:mp-toutiao": "uni -p mp-toutiao",
"dev:mp-weixin": "uni -p mp-weixin",
"dev:quickapp-webview": "uni -p quickapp-webview",
"dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
"dev:quickapp-webview-union": "uni -p quickapp-webview-union",
"build:app": "uni build -p app",
"build:app-android": "uni build -p app-android",
"build:app-ios": "uni build -p app-ios",
"build:custom": "uni build -p",
"build:h5": "uni build",
"build:h5:ssr": "uni build --ssr",
"build:mp-alipay": "uni build -p mp-alipay",
"build:mp-baidu": "uni build -p mp-baidu",
"build:mp-jd": "uni build -p mp-jd",
"build:mp-kuaishou": "uni build -p mp-kuaishou",
"build:mp-lark": "uni build -p mp-lark",
"build:mp-qq": "uni build -p mp-qq",
"build:mp-toutiao": "uni build -p mp-toutiao",
"build:mp-weixin": "uni build -p mp-weixin",
"build:quickapp-webview": "uni build -p quickapp-webview",
"build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
"build:quickapp-webview-union": "uni build -p quickapp-webview-union",
"type-check": "vue-tsc --noEmit"
},
"dependencies": {
"@dcloudio/uni-app": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-app-plus": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-components": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-h5": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-alipay": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-baidu": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-jd": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-kuaishou": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-lark": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-qq": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-toutiao": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-mp-weixin": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-quickapp-webview": "3.0.0-alpha-3070720230316001",
"@types/node": "^20.1.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"pinia": "^2.0.35",
"pinia-plugin-persistedstate": "^3.1.0",
"vue": "^3.2.45"
},
"devDependencies": {
"@dcloudio/types": "^3.3.2",
"@dcloudio/uni-automator": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-cli-shared": "3.0.0-alpha-3070720230316001",
"@dcloudio/uni-stacktracey": "3.0.0-alpha-3070720230316001",
"@dcloudio/vite-plugin-uni": "3.0.0-alpha-3070720230316001",
"@typescript-eslint/eslint-plugin": "^5.59.2",
"@typescript-eslint/parser": "^5.59.2",
"@vue/tsconfig": "^0.1.3",
"autoprefixer": "^10.4.14",
"eslint": "^8.40.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-n": "^15.7.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-vue": "^9.11.1",
"typescript": "^4.9.4",
"vite": "4.0.4",
"vue-tsc": "^1.0.24"
}
}

@ -0,0 +1,38 @@
<script setup lang="ts">
import {onLaunch, onShow} from "@dcloudio/uni-app";
import {reactive} from "vue";
const globalData = reactive<Partial<SystemInfo>>({
statusBarHeight: 0, //
navHeight: 0, //
navigationBarHeight: 0, // ()
safeAreaTop: 0, //
safeAreaBottom: 0, //
})
onLaunch(() => {
let SysInfo = uni.getSystemInfoSync()
globalData.statusBarHeight = SysInfo.statusBarHeight
globalData.safeAreaTop = SysInfo.safeArea?.top
globalData.safeAreaBottom = SysInfo.safeAreaInsets?.bottom
});
onShow(() => {
console.log("App Show");
});
</script>
<style lang="less">
.text-one {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.text-two {
word-break: break-all;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
</style>

@ -0,0 +1,4 @@
export default {
baseURL: 'https://api.yaojiankang.top/',
duration: 3000
}

@ -0,0 +1,59 @@
import MinRequest from './request'
import requestConfig from "./config";
import type {RequestConfig} from "@/api/server/type";
import {ERROR_STATUS, NETWORK_ERROR_CODE} from "@/api/server/type";
const minRequest = new MinRequest()
// 设置默认配置
minRequest.setConfig((config: RequestConfig) => {
config.baseURL = requestConfig.baseURL
return config
})
// 请求拦截器
minRequest.interceptors.request((request) => {
let token = uni.getStorageSync('token')
if (!token && request.token) {
uni.navigateTo({url: '/pages/login/index'}).then()
}
request.header['x-session-key'] = token
return request
})
minRequest.interceptors.success(async (result) => {
if (result.statusCode !== 200 || !result?.data?.success) {
if (result.data?.problems) {
Object.entries(result.data.problems).forEach(([key, value]) => {
uni.showToast({title: "错误:" + value?.[0]?.message, icon: 'none', duration: requestConfig.duration})
})
return false
}
const error: any = {
code: result.statusCode,
message: result.data.message || ERROR_STATUS[result.statusCode],
}
if (!window.onabort) {
error.code = NETWORK_ERROR_CODE
error.message = ERROR_STATUS[NETWORK_ERROR_CODE]
}
await uni.showToast({title: "错误:" + error.message, icon: 'none', duration: requestConfig.duration})
return false
}
return result.data.data
})
minRequest.interceptors.fail((result) => {
uni.showToast({title: "错误" + result.errMsg, icon: 'none', duration: requestConfig.duration}).then()
return false
})
export default minRequest

@ -0,0 +1,139 @@
import type {
GeneralCallbackResult,
RequestConfig,
RequestFunction,
RequestSuccessFunction
} from "@/api/server/type";
const config = Symbol('config')
const isCompleteURL = Symbol('isCompleteURL')
const requestBefore = Symbol('requestBefore')
const requestSuccess = Symbol('requestSuccess')
const requestFail = Symbol('requestFail')
class MinRequest {
[config]: RequestConfig = {
baseURL: '',
header: {
'Content-Type': 'application/json;charset=UTF-8',
},
method: 'GET',
dataType: 'json',
responseType: 'text'
} as RequestConfig
interceptors = {
request: (func: RequestFunction) => {
if (func) {
MinRequest[requestBefore] = func
} else {
MinRequest[requestBefore] = (request) => request
}
},
fail: (func: (result: GeneralCallbackResult) => false) => {
if (func) {
MinRequest[requestFail] = func
} else {
MinRequest[requestFail] = (response: GeneralCallbackResult) => false
}
},
success: (func: RequestSuccessFunction<any>) => {
if (func) {
MinRequest[requestSuccess] = func
} else {
MinRequest[requestSuccess] = (response: UniNamespace.RequestSuccessCallbackResult) => null
}
}
}
static install: (Vue) => void;
/** 请求前 */
static [requestBefore](config: RequestConfig) {
return config
}
/** 请求失败 */
static [requestFail](response: UniNamespace.GeneralCallbackResult): false {
return false
}
/** 请求成功 */
static [requestSuccess]<T = unknown>(response: UniNamespace.RequestSuccessCallbackResult): T {
return null
}
/** url验证 */
static [isCompleteURL](url: string) {
return /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
}
setConfig(func: (config: RequestConfig) => RequestConfig) {
this[config] = func(this[config])
}
request<T = unknown>(options = {} as RequestConfig): Promise<T> {
options.baseURL = options.baseURL || this[config].baseURL
options.dataType = options.dataType || this[config].dataType
options.url = MinRequest[isCompleteURL](options.url) ? options.url : (options.baseURL + options.url)
options.header = {...options.header, ...this[config].header}
options.method = options.method || this[config].method
options = {...options, ...MinRequest[requestBefore](options)}
return new Promise((resolve, reject) => {
options.success = function (res) {
resolve(MinRequest[requestSuccess]<T>(res))
}
options.fail = function (err) {
reject(MinRequest[requestFail](err))
}
uni.request(options)
})
}
get<T = unknown>(url, data?: Record<string, unknown>, options = {} as RequestConfig): Promise<T> {
options.url = url
options.data = data
options.method = 'GET'
return this.request<T>(options)
}
post<T>(url, data?: Record<string, unknown>, options = {} as RequestConfig): Promise<T> {
options.url = url
options.data = data
options.method = 'POST'
return this.request<T>(options)
}
del<T>(url, data?: Record<string, unknown>, options = {} as RequestConfig): Promise<T> {
options.url = url
options.data = data
options.method = 'DELETE'
return this.request<T>(options)
}
put<T>(url, data?: Record<string, unknown>, options = {} as RequestConfig): Promise<T> {
options.url = url
options.data = data
options.method = 'PUT'
return this.request<T>(options)
}
}
MinRequest.install = function (Vue) {
Vue.mixin({
beforeCreate: function () {
if (this.$options.minRequest) {
Vue._minRequest = this.$options.minRequest
}
}
})
Object.defineProperty(Vue.prototype, '$minApi', {
get: function () {
return Vue._minRequest.apis
}
})
}
export default MinRequest

@ -0,0 +1,94 @@
/** 请求超时时间 */
export const REQUEST_TIMEOUT = 6 * 1000
/** 默认的请求错误code */
export const DEFAULT_REQUEST_ERROR_CODE = 'DEFAULT'
/** 默认的请求错误文本 */
export const DEFAULT_REQUEST_ERROR_MSG = '请求错误~'
/** 请求超时的错误code(为固定值:ECONNABORTED) */
export const REQUEST_TIMEOUT_CODE = 'ECONNABORTED'
/** 请求超时的错误文本 */
export const REQUEST_TIMEOUT_MSG = '请求超时~'
/** 网络不可用的code */
export const NETWORK_ERROR_CODE = 'NETWORK_ERROR'
/** 网络不可用的错误文本 */
export const NETWORK_ERROR_MSG = '网络不可用~'
/** 响应的数据错误的code */
export const RESPONSE_ERROR_CODE = 'INVALID_DATA'
/** 响应的数据错误文本 */
export const RESPONSE_ERROR_MSG = '服务器响应异常~'
/** 越界请求接口的错误code */
export const API_OVERSTEP_CODE = 'OVERSTEP'
/** 越界请求接口的错误文本 */
export const API_OVERSTEP_MSG = '请求越界~'
export const ERROR_STATUS: Record<number | string, string> = {
'400': '400: 请求出现语法错误~',
'401': '401: 用户未授权~',
'-102': '-102: token失效~',
'403': '403: 服务器拒绝访问~',
'404': '404: 请求的资源不存在~',
'405': '405: 请求方法未允许~',
'429': '您请求太频繁了,请休息一会~',
'408': '408: 网络请求超时~',
'500': '500: 服务器内部错误~',
'501': '501: 服务器未实现请求功能~',
'502': '502: 错误网关~',
'503': '503: 服务不可用~',
'504': '504: 网关超时~',
'505': '505: http版本不支持该请求~',
[DEFAULT_REQUEST_ERROR_CODE]: DEFAULT_REQUEST_ERROR_MSG,
[NETWORK_ERROR_CODE]: NETWORK_ERROR_MSG,
[REQUEST_TIMEOUT_CODE]: REQUEST_TIMEOUT_MSG,
[RESPONSE_ERROR_CODE]: RESPONSE_ERROR_MSG,
[API_OVERSTEP_CODE]: API_OVERSTEP_MSG,
}
export type ErrorStatus = keyof typeof ERROR_STATUS
export type RequestConfig = UniNamespace.RequestOptions & {
baseURL: string
token: string
}
/** 请求拦截前回调 */
export type RequestFunction = (config: RequestConfig) => RequestConfig
interface ProblemsData {
code: number,
message: string
}
interface ProblemsObject {
[key: string]: ProblemsData[]
}
/** 服务请求错误 */
interface ErrorResult {
code: ErrorStatus
message: string
problems?: ProblemsObject
success: false
}
export type GeneralCallbackResult = UniNamespace.GeneralCallbackResult & {
data: ErrorResult
}
/** 服务器请求成功 */
export interface SuccessResult<T = unknown> {
data: T
message: string
problems?: ProblemsObject
success: true
}
export type RequestSuccessCallbackResult<T = unknown> = UniNamespace.RequestSuccessCallbackResult & {
data: SuccessResult<T>
}
/** 请求成功 */
export type RequestSuccessFunction<T> = (result: RequestSuccessCallbackResult) => T

@ -0,0 +1,7 @@
import minRequest from "@/api/server/interceptors";
export default {
login(data: UserType.Login) {
return minRequest.get('/municipal-manager/auth/staff-login', data)
}
}

8
src/env.d.ts vendored

@ -0,0 +1,8 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import { DefineComponent } from 'vue'
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
const component: DefineComponent<{}, {}, any>
export default component
}

@ -0,0 +1,13 @@
import {createSSRApp} from "vue";
import App from "./App.vue";
import {pinia} from '@/store'
import './static/tailwindcss'
export function createApp() {
const app = createSSRApp(App);
app.use(pinia)
return {
app,
};
}

@ -0,0 +1,72 @@
{
"name" : "",
"appid" : "",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"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 */
"ios" : {},
/* SDK */
"sdkConfigs" : {}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics": {
"enable": false
},
"vueVersion" : "3"
}

@ -0,0 +1,27 @@
{
"easycom": {
"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
},
"pages": [
{
"path": "pages/login/index",
"style": {
"navigationBarTitleText": "登录",
"navigationStyle": "custom"
}
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "销售记录",
"navigationStyle": "custom"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}

@ -0,0 +1,37 @@
<template>
<view class="content">
</view>
</template>
<script setup lang="ts">
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

@ -0,0 +1,33 @@
<template>
<div class="p-4 pt-32">
<input class="pt-10 pb-10 text-base border-b-2 border-gray-100"
type="number"
placeholder="请输入手机号"
v-model="params.phone_number">
<view class="flex items-center pt-10 pb-5 justify-between border-b-2 border-gray-100">
<input type="number"
class="text-base"
placeholder="请输入验证码"
v-model="params.code">
<a plain class="text-blue-600">获取验证码</a>
</view>
<button class="bg-blue-600 text-white mt-20 font-sans">登录</button>
</div>
</template>
<script lang="ts" setup>
import {onMounted, reactive} from "vue";
import api from "@/api/user";
const params = reactive({
code: "",
phone_number: ""
})
onMounted(async () => {
const res = await api.login({})
console.log(res)
})
</script>

@ -0,0 +1,6 @@
export {}
declare module "vue" {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {}
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,21 @@
import useStore from './user/index'
import {createPinia} from "pinia";
import {createPersistedState} from "pinia-plugin-persistedstate";
export const pinia = createPinia().use(
createPersistedState({
storage: {
getItem(key: string): string | null {
return uni.getStorageSync(key)
},
setItem(key: string, value: string) {
uni.setStorageSync(key, value)
}
}
})
)
export {
useStore,
}

@ -0,0 +1,18 @@
import {defineStore} from 'pinia'
export default defineStore('global', {
persist: {
key: 'pinia',
paths: ['user']
},
state: (): StateType => ({
user: undefined
}),
actions: {
setData<T extends keyof StateType>({key, value}: { key: T, value: any }) {
this[key] = value
}
}
})

@ -0,0 +1,77 @@
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场https://ext.dcloud.net.cn上很多三方插件均使用了这些样式变量
* 如果你是插件开发者建议你使用scss预处理并在插件代码中直接使用这些变量无需 import 这个文件方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者插件使用者你可以通过修改这些变量来定制自己的插件主题实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理你也可以直接在你的 scss 代码中使用如下变量同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color: #333; // 基本色
$uni-text-color-inverse: #fff; // 反色
$uni-text-color-grey: #999; // 辅助灰色如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable: #c0c0c0;
/* 背景颜色 */
$uni-bg-color: #fff;
$uni-bg-color-grey: #f8f8f8;
$uni-bg-color-hover: #f1f1f1; // 点击状态颜色
$uni-bg-color-mask: rgba(0, 0, 0, 0.4); // 遮罩颜色
/* 边框颜色 */
$uni-border-color: #c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm: 12px;
$uni-font-size-base: 14px;
$uni-font-size-lg: 16;
/* 图片尺寸 */
$uni-img-size-sm: 20px;
$uni-img-size-base: 26px;
$uni-img-size-lg: 40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2c405a; // 文章标题颜色
$uni-font-size-title: 20px;
$uni-color-subtitle: #555; // 二级标题颜色
$uni-font-size-subtitle: 18px;
$uni-color-paragraph: #3f536e; // 文章段落颜色
$uni-font-size-paragraph: 15px;

@ -0,0 +1,44 @@
{
"extends": "@vue/tsconfig/tsconfig.json",
"compilerOptions": {
"target": "ES2020",
"module": "ES2020",
"strict": true,
"jsx": "preserve",
"moduleResolution": "node",
"experimentalDecorators": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowJs": true,
"outDir": ".",
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"useDefineForClassFields": true,
"sourceMap": true,
"baseUrl": ".",
"paths": {
"@/*": [
"./src/*"
]
},
"lib": [
"esnext",
"es2020",
"dom"
],
"types": [
"@dcloudio/types"
]
},
"include": [
"types/**/*.d.ts",
"src/**/*.ts",
"src/**/*.d.ts",
"src/**/*.tsx",
"src/**/*.vue",
"src/**/*.js"
],
"exclude": [
"node_modules"
]
}

9
types/global.d.ts vendored

@ -0,0 +1,9 @@
interface SystemInfo {
statusBarHeight: number,
navHeight: number
navigationBarHeight: number
safeAreaTop: number,
safeAreaBottom: number
}

11
types/user.d.ts vendored

@ -0,0 +1,11 @@
interface StateType {
user?: any
}
namespace UserType {
export interface Login {
mobile: string
business: string
[key: string]: string
}
}

@ -0,0 +1,12 @@
import {defineConfig} from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import path from 'path'
export default defineConfig({
plugins: [uni()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
});

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save