uni-app初识-项目文件+前端封装API接口

2025-09-28

喵喵CRM的后端已经完全的接口化,之前在Django里面用的模板也都被我删除了,后续重新上线的话就需要自己搭前端的网页了。

我们这儿选用uni-app,主要是之前做小程序的时候稍微看过一些,另外考虑到前端不是主要方向,遂就先用uni-app来做了,未来有机会,我们在用别的。

不过因为之前做小程序时没有记录,现在回头再看已经开始抓瞎了。而且当时做就是个前端页面,所以很多地方还要重新开始了解。此文做一个简单的记录。

项目文件说明

编辑器HBuilderX,新建一个项目,默认模板,大概能看到如下项目文件:

pages文件夹下是页面,index下的index.uvue就是个初始的页面文件。

static文件夹是一些静态资源的保存地方,这儿初始存了一个uni-app的logo。

App.vue是应用配置,用来配置App全局样式以及监听应用生命周期,主要涉及基础的应用启动、退出、全局字体等等。这儿为了便于理解和直观感受,可以简单做个启动的代码,这样我们运行程序的时候就会弹出一个“应用启动啦!!”的小提示框。

		onLaunch: function () {
			console.log('App Launch')
			uni.showToast({
				title: '应用启动啦!!',
				icon: 'none'
			})
		},

index.html是H5 平台运行时的入口 HTML 文件,相当于给个浏览器的壳子。初步理解:没啥用……

main.uts 是启动逻辑入口,用于初始化应用、挂载 App.uvue。初步理解:没啥用……

manifest.json是项目配置,应该是项目打包时候会用到一些说明啥的。初步理解:没啥用……

pages.json页面路由表,这个比较熟悉,应该就是页面的目录配置啥的。

uni.scss全局样式变量,类似于一个专门的样式变量管理文件。

前端封装API接口

新建个common文件夹,下面新建俩文件api.js和request.js。

request.js封装请求方法,简单理解就是让我们后面调用接口时候可以简化一些通用的操作,比如根路径或者认证啥的。

// common/request.js
const BASE_URL = "http://127.0.0.1:8000"; // Django DRF接口地址

function request(url, method = "GET", data = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        uni.request({
            url: BASE_URL + url,
            method: method,
            data: data,
            header: {
                "Content-Type": "application/json",headers
            },
            success: (res) => {
                if (res.statusCode === 200) {
                    resolve(res.data);
                } else {
                    reject(res);
                }
            },
            fail: (err) => {
                reject(err);
            }
        });
    });
}

export default request;

api就是接口,这儿先放上简单的注册、登录、登出接口。

// common/api.js
import request from './request.js';

// 用户登录
export function login(data) {
    return request("/login/", "POST", data);
}

// 用户注册
export function register(data) {
    return request("/register/", "POST", data);
}

// 用户登出
export function logout(data) {
    return request("/logout/", "POST", data);
}

让GPT基于我们接口,做个最简单的界面,index.uvue。

<template>
  <view class="container">
    <view class="title">用户测试</view>

    <!-- 登录 -->
    <view class="form">
      <input v-model="loginForm.username" placeholder="用户名" />
      <input v-model="loginForm.password" placeholder="密码" password />
      <button @click="handleLogin">登录</button>
    </view>

    <!-- 注册 -->
    <view class="form">
      <input v-model="registerForm.username" placeholder="注册用户名" />
      <input v-model="registerForm.password" placeholder="注册密码" password />
      <button @click="handleRegister">注册</button>
    </view>

    <!-- 登出 -->
    <view class="form">
      <button @click="handleLogout">登出</button>
    </view>

    <view class="result">
      {{ message }}
    </view>
  </view>
</template>

<script>
import { login, register, logout } from "@/common/api.js";

export default {
  data() {
    return {
      loginForm: {
		  username:"",
		  password:""
      },
      registerForm: {
        username:"",
        password:""
      },
      message:""
    };
  },
  methods: {
    async handleLogin() {
      try {
        const res = await login(this.loginForm);
        this.message = "登录成功:" + JSON.stringify(res);
      } catch (e) {
        this.message = "登录失败:" + JSON.stringify(e);
      }
    },
    async handleRegister() {
      try {
        const res = await register(this.registerForm);
        this.message = "注册成功:" + JSON.stringify(res);
      } catch (e) {
        this.message = "注册失败:" + JSON.stringify(e);
      }
    },
    async handleLogout() {
      try {
        const res = await logout();
        this.message = "登出成功:" + JSON.stringify(res);
      } catch (e) {
        this.message = "登出失败:" + JSON.stringify(e);
      }
    }
  }
};
</script>

<style>
.container {
  padding: 30rpx;
}
.title {
  font-size: 40rpx;
  margin-bottom: 30rpx;
}
.form {
  margin-bottom: 40rpx;
}
input {
  border: 1px solid #ccc;
  margin: 10rpx 0;
  padding: 20rpx;
  border-radius: 8rpx;
}
button {
  background-color: #007aff;
  color: #fff;
  padding: 20rpx;
  border-radius: 8rpx;
}
.result {
  margin-top: 40rpx;
  font-size: 28rpx;
  color: #333;
}
</style>

运行测试一下,没啥问题。


← 返回