Skip to content

Sn0wm1an/base_weixin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

安装手册

下载下来以后需要

 cnpm i

直接运行会报错,因为教程用的是老的sass版本,新1.8版本会报错,因此要把sass降低到1.7版本

 cnpm install [email protected]

文件夹说明

目前一共有7大文件夹

image-20241101162006525

1. api文件夹

封装的api请求被放在主目录下的utils/request.js里,url配置在主目录下的config.js里,暴露出了dev对象可以取用。

我们在main.js中把api注册成了全局变量

import api from "@/api/index.js";    
// 配置全局api
app.config.globalProperties.$api = api;

/api/index.js负责拿到所有文件夹下的所有文件

// 拿到所有api
const modulesFiles = import.meta.glob("./*/*.*", { eager: true });
const modules = {};
for (const key in modulesFiles) {
    const moduleName = key.replace(/(.*\/)*([^.]+).*/gi, "$2");
    const value = modulesFiles[key];
    if (value.default) {
        // 兼容js
        modules[moduleName] = value.default;
    } else {
        // 兼容ts
        modules[moduleName] = value;
    }
}
//console.log(666, modules);
export default modules;

/api/test/test.js展示了如何定义接口

import request from '@/utils/request';
const BASE_API = '/api/test';
export default {
    time() {
        return request({
            url: BASE_API + '/time',
            method: 'get',
        });
    },
};

在别的文件下这样调用,先取用当前的Instance给proxy,然后再调用$api全局变量,然后/api/index.js会扫描所有的文件名称,扫描到test.js,则加上test,调用test.js里的time函数。

因为大多数的api请求是需要异步的,所以加上async和await

<script setup>
	const { proxy } = getCurrentInstance();

	async function test() {
		let res = await proxy.$api.test.time();
		console.log(res);
	}
</script>

2. utils文件夹

封装了所有的request的Promise请求,所有api配置的连接和内容都会通过这个文件发送给后端。

传递字段说明:

code:业务编号,把每一个端口编上号,如果有错误则报此代码。如果code==0,则报错 msg:如果code=0,则报msg里面的错误 data:业务数据,如果code不等于0时,则

code 业务编号,把每一个端口编上号,如果有错误则报此代码。如果code==0,则报错,如果code=-1则证明token过期
msg 如果code=0,则报msg里面的错误
data 业务数据,如果code不等于0时,则前端处理data中的数据

代码在:https://github.com/OurKAMTeam/uni-vue-vite-yiDianShi/blob/main/src/utils/request.js

简单说明:

    const { code, msg } = res.data
    if(code==-1){
      //重新登录
      logout();
            // uni.switchTab({
            //   url: '/pages/mine/index',
            // });
      uni.showToast({
            icon: "none",
            duration: 3000,
            title: "请先授权登录!",
        });
            return;
    }else if (code == 0) {
      //展示报错
      uni.showToast({
            icon: "none",
            duration: 3000,
            title: msg,
        });
            return reject(msg);
    }else{
            // 正常处理数据
            return resolve(res.data.data);
    }

3. store文件夹

和api差不多,store/index.js也同样被定义成了全局变量,不过在注册时调用了Pinia组件,并且在小程序的应用上需要特殊的注册,注册代码在main.js

	pinia.use(
	        createPersistedState({
	            storage: {
	                setItem: (key, value) => {
	                    uni.setStorageSync(key, value);
	                },
	                getItem: (key) => {
	                    return uni.getStorageSync(key);
	                }
	            },
	            auto: true, // 启用所有Store默认持久化
	        })
	    );
    app.use(pinia);
    app.config.globalProperties.$store = store;

同样store也有一个index.js负责拿到文件夹下所有的接口

// 拿到modules下的所有文件
const modulesFiles  = import.meta.glob('./modules/*.*', { eager: true });
const modules = {};
for (const key in modulesFiles) {
    const moduleName = key.replace(/(.*\/)*([^.]+).*/gi, '$2');
    const value = modulesFiles[key];
    modules[moduleName] = value;
    // console.log(modules);
}

export default modules;

如何定义函数呢,在store/modules/test.js里定义了一个基本函数 函数可以记录count的值,可以对count的值进行++

import { defineStore } from 'pinia';

export const useTestStore = defineStore('test', {
    state: () => {
        return {
            count: 0
        };
    },
    actions: {
        add() {
            this.count++;
        }
    },
    persist: true, // 启用持久化
});

如何调用,在pages/index/index.vue下定义了一个例子

定义了count作为变量,变量绑定了proxy.$store.test.useTestStore(),并且把这个变量转化成了可变变量Ref,在点击发生时调用add函数,数字自增

<template>
		<text>{{count}}</text>
		<button @click="$store.test.useTestStore().add();">click</button>
</template>

<script setup>
	const { proxy } = getCurrentInstance();
	let {count} = toRefs(proxy.$store.test.useTestStore())
</script>

4. static图片文件夹

把图片放在里面,下周进行切图,也可以自行切图,每个界面建一个文件夹,尽量不要用中文名的图片名称

5. styles总体布局的变量文件

使用scss语言编程,不要忘记要从css转换一下

6. pages文件

所有的文件都被定义在了pages里面,每增加一个页面在pages.json也要注册

7. 登录逻辑整理

img

以上是微信官方给出的登录逻辑https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

登录页面写在了pages/login/login.vue,(测试阶段目前注释掉了,直接点击就能登录)

逻辑写在了store/modules/user.js的login()函数和getUserInfo()函数。

8. 页面跳转说明

因为不适用nvue写的,所以用不了navigation标签。因为router太麻烦了,网上看支持uni的router评价很不好,特别的难用,所以使用uni.的api跳转,具体的手册在下面↓

https://uniapp.dcloud.net.cn/api/router.html#redirectto

主要安装包及其依赖说明: sass1.8会报错,以后再改,先按照老写法写,unplugin-auto-import是自动引入ref的插件

// 基础项目
cnpx degit dcloudio/uni-preset-vue#vite small-app
cnpm install [email protected] node-sass sass-loader@10 -D
cnpm i -D unplugin-auto-import

"pinia": "^2.0.36",
"pinia-plugin-persistedstate": "^4.1.2",
"sass": "^1.77.6",
"uview-plus": "^3.3.37",
"vue": "^3.4.21",

// 后面是报错后安装的依赖
"clipboard": "^2.0.11",
"dayjs": "^1.11.13",
"deep-pick-omit": "^1.2.1",
"destr": "^2.0.3",

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors