第3章 基础项目的搭建

news/2024/5/3 14:27:34/文章来源:https://blog.csdn.net/huitiaowudeyu/article/details/126816179

3.1 后端项目搭建

3.1.1 gitee下载脚手架

下载地址:https://gitee.com/77jubao2015/springbootdemo

打开浏览器输入以上地址,点击下载即可,如图所示:

在这里插入图片描述

3.1.2 把脚手架导入到idea开发工具

步骤01 把下载后的脚手架放到指定位置并解压,把解压后的文件夹名称改为pig_feet_rice即可,如图所示:
在这里插入图片描述

步骤02 打开IDEA开发选择Open,选择项目存放的路径,然后点击OK即可,如图所示:

在这里插入图片描述

步骤03 修改项目的名称为pig_feet_rice,如图所示:

在这里插入图片描述

步骤04 修改pom.xml文件

主要修改项目名称、Spring Boot版本号、JDK版本号等信息,代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.xueden</groupId><artifactId>pig_feet_rice</artifactId><version>1.0.0</version><name>pig_feet_rice</name><description>springboot+Vue3 整合开发猪脚饭微信小程序</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Mysql依赖包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!-- druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version></dependency><!--监控sql日志--><dependency><groupId>org.bgee.log4jdbc-log4j2</groupId><artifactId>log4jdbc-log4j2-jdbc4.1</artifactId><version>1.16</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.5</version></dependency></dependencies><build><finalName>xuedenpay1.0</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.5</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

3.1.3 修改配置文件application.yml

这里我们主要是修改数据源即可,如图所示:
在这里插入图片描述

代码如下所示:

server:port: 8081#配置数据源
spring:datasource:druid:db-type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpyurl: jdbc:log4jdbc:mysql://127.0.0.1:3306/pig_feet_rice?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=falseusername: rootpassword: root# 初始化配置initial-size: 3# 最小连接数min-idle: 3# 最大连接数max-active: 15# 获取连接超时时间max-wait: 5000# 连接有效性检测时间time-between-eviction-runs-millis: 90000# 最大空闲时间min-evictable-idle-time-millis: 1800000test-while-idle: truetest-on-borrow: falsetest-on-return: falsevalidation-query: select 1# 配置监控统计拦截的filtersfilters: statstat-view-servlet:url-pattern: /druid/*reset-enable: falseweb-stat-filter:url-pattern: /*exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"#配置jpajpa:hibernate:# 生产环境设置成 none,避免程序运行时自动更新数据库结构ddl-auto: update

修改为自己本地电脑的数据库即可

3.1.4 修改启动类为PigFeetRiceApplication

如图所示:
在这里插入图片描述

3.2 前端项目搭建

3.2.1 从gitee下载前端demo

地址:https://gitee.com/77jubao2015/wxpaydemo

再浏览器打开上面的地址,点击下载即可,如图所示:

在这里插入图片描述

3.2.2 把项目导入到webstorm开发工具

步骤01 下载后直接解压,并把项目名称改为pig_feet_rice_web,如图所示:

在这里插入图片描述

步骤02 打开WebStorm 选择open,然后选择指定的项目即可,如图所示:

在这里插入图片描述

步骤03 修改标题

在src->store->modules->app.tsw文件下修改标题,如图所示:

在这里插入图片描述

改为如下所示:

在这里插入图片描述

3.2.3 在终端输入命令yarn install安装依赖

yarn install

如图所示

在这里插入图片描述

3.2.4 启动项目

选择左边npm,如图所示:

在这里插入图片描述

点击serve即可,如图所示:

在这里插入图片描述

3.3 系统后台登录功能实现

3.3.1 创建实体类Admin

在 cn.xueden.domain 包目录下新建一个 Admin实体类,代码如下所示:

package cn.xueden.domain;import cn.xueden.base.BaseEntity;
import lombok.Data;import javax.persistence.*;
/**功能描述:系统管理员实体类* @author 梁志杰* @Date:2022/5/5* @Description:cn.xueden* @version:1.0*/
@Data
@Entity
@Table(name = "p_sys_admin")
@org.hibernate.annotations.Table(appliesTo = "p_sys_admin",comment="系统管理员信息表")
public class Admin extends BaseEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Integer id;@Column(name = "login_name")private String loginName;@Column(name = "password", length = 50)private String password;@Column(name = "status", nullable = false)private Integer status;}

在 cn.xueden.base 包目录下新建一个 BaseEntity实体类,代码如下所示:

package cn.xueden.base;import cn.xueden.annotation.EnableXuedenCreateBy;
import cn.xueden.annotation.EnableXuedenUpdateBy;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Timestamp;/**功能描述:公共Entity* @Author:梁志杰* @Date:2022/4/1* @Description:cn.xueden.base* @version:1.0*/
@Getter
@Setter
@MappedSuperclass
public class BaseEntity implements Serializable {/*** 创建时间*/@Column(name = "create_time",nullable = false)@CreationTimestampprivate Timestamp createTime;/*** 创建者ID*/@Column(name = "create_by")@EnableXuedenCreateByprivate Long createBy;/*** 更新时间*/@Column(name = "update_time")@UpdateTimestampprivate Timestamp updateTime;/*** 更新者ID*/@Column(name = "update_by")@EnableXuedenUpdateByprivate Long updateBy;/*** 备注*/@Column(name = "remarks")private String remarks;public @interface Update {}@Overridepublic String toString() {ToStringBuilder builder = new ToStringBuilder(this);Field[] fields = this.getClass().getDeclaredFields();try {for (Field f : fields) {f.setAccessible(true);builder.append(f.getName(), f.get(this)).append("\n");}} catch (Exception e) {builder.append("toString builder encounter an error");}return builder.toString();}
}

3.3.2 创建持久层接口AdminRepository

在 cn.xueden.repository 包目录下新建一个 AdminRepository接口,代码如下所示:

package cn.xueden.repository;import cn.xueden.domain.Admin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**系统管理员信息持久层* @author 梁志杰* @Date:2022/5/5* @Description:cn.xueden.repository* @version:1.0*/
public interface AdminRepository extends JpaRepository<Admin, Long>, JpaSpecificationExecutor<Admin> {
}

3.3.3 创建业务接口IAdminService

在 cn.xueden.service包目录下新建一个 IAdminService接口,代码如下所示:

package cn.xueden.service;/**功能描述:系统管理员业务接口* @author:梁志杰* @date:2022/5/5* @description:cn.xueden.service* @version:1.0*/
public interface IAdminService {
}

3.3.4 创建业务接口实现类AdminServiceImpl

在 cn.xueden.service.impl包目录下新建一个 AdminServiceImpl接口实现类,代码如下所示:

package cn.xueden.service.impl;import cn.xueden.repository.AdminRepository;
import cn.xueden.service.IAdminService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/**功能描述:系统管理员业务接口实现类* @author:梁志杰* @date:2022/5/5* @description:cn.xueden.service.impl* @version:1.0*/
@Service
@Transactional(readOnly = true)
public class AdminServiceImpl implements IAdminService {private final AdminRepository adminRepository;public AdminServiceImpl(AdminRepository adminRepository) {this.adminRepository = adminRepository;}
}

3.3.5 创建登录前端控制器LoginController

在一个名为controller的包新建一个LoginController类,代码如下所示:

package cn.xueden.controller;import cn.xueden.service.IAdminService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/**功能描述:系统后台登录前端控制器* @author:梁志杰* @date:2022/5/5* @description:cn.xueden.controller* @version:1.0*/
@RestController
@RequestMapping("login")
public class LoginController {private final IAdminService adminService;public LoginController(IAdminService adminService) {this.adminService = adminService;}
}

3.3.6 新建一个登陆方法login

在LoginController类下新增一个登陆方法,代码如下所示:

  /*** 登录方法* @param admin* @return*/@PostMappingpublic BaseResult login(@RequestBody Admin admin,HttpServletRequest request){Admin dbAdmin = adminService.login(admin);if(dbAdmin==null){return BaseResult.fail("登录失败,账号不存在");}else if(!dbAdmin.getPassword().equals(admin.getPassword())){return BaseResult.fail("登录失败,密码不正确");}else if(dbAdmin.getStatus()==0){return BaseResult.fail("登录失败,账号被封禁");}// 生成tokenString token = HutoolJWTUtil.createToken(dbAdmin);request.getServletContext().setAttribute("token",token);return BaseResult.success("登录成功",token);}

3.3.7 在IAdminService接口下新增一个登陆方法login

代码如下所示:

  /*** 登录* @param admin* @return*/Admin login(Admin admin);

3.3.8 在AdminServiceImpl实现类下新建一个login方法

代码如下所示:

 /*** 登录* @param admin* @return*/@Overridepublic Admin login(Admin admin) {Admin dbAdmin = adminRepository.findByLoginName(admin.getLoginName());return dbAdmin;}

3.3.9 在AdminRepository接口下新建一个findByLoginName方法

代码如下所示:

 /*** 根据登录名查找管理员信息* @param loginName* @return*/Admin findByLoginName(String loginName);

3.3.10 新建一个JWT工具类HutoolJWTUtil

代码如下所示:

package cn.xueden.utils;import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;
import cn.xueden.domain.Admin;import java.util.HashMap;
import java.util.Map;/*** @author:梁志杰* @date:2022/5/6* @description:cn.xueden.utils* @version:1.0*/
public class HutoolJWTUtil {/*** 生成token* @param admin* @return*/public static String createToken(Admin admin){DateTime now = DateTime.now();DateTime newTime = now.offsetNew(DateField.MINUTE, 120);Map<String,Object> payload = new HashMap<String,Object>();//签发时间payload.put(JWTPayload.ISSUED_AT, now);//过期时间payload.put(JWTPayload.EXPIRES_AT, newTime);//生效时间payload.put(JWTPayload.NOT_BEFORE, now);//载荷payload.put("loginName", admin.getLoginName());payload.put("aid", admin.getId());String key = "www.xueden.cn";String token = JWTUtil.createToken(payload, key.getBytes());return token;}/*** 校验token* @param token* @return*/public static boolean JwtVerify(String token){String key = "www.xueden.cn";JWT jwt = JWTUtil.parseToken(token);boolean verifyKey = jwt.setKey(key.getBytes()).verify();System.out.println(verifyKey);boolean verifyTime = jwt.validate(0);System.out.println(verifyTime);if(verifyKey&&verifyTime){return true;}return false;}/*** 解析token* @param token* @return*/public static Long parseToken(String token){final JWT jwt = JWTUtil.parseToken(token);return Long.parseLong(jwt.getPayload("aid").toString());}
}

3.3.11 修改login目录下的index.vue文件

如图所示:

在这里插入图片描述

代码如下所示:

<template><div class="login-wrap" @keydown.enter="login"><div class="login-con"><el-card class="box-card"><template #header><span class="login--header">登录</span></template><el-formref="loginForm":model="form":rules="rules"class="login-form"><el-form-item prop="loginName"><el-inputv-model="form.loginName"placeholder="请输入账号"class="form--input"><template #prefix><span class="svg-container"><svg-icon icon-class="user" /></span></template></el-input></el-form-item><el-form-item prop="password"><el-inputv-model="form.password"show-password:minlength="3":maxlength="18"placeholder="请输入密码"class="form--input"><template #prefix><span class="svg-container"><svg-icon icon-class="password" /></span></template></el-input></el-form-item><el-form-item><el-button:loading="loading"type="primary"class="login--button"@click="login">登录</el-button></el-form-item></el-form></el-card></div></div>
</template><script lang="ts">
import { defineComponent, ref, unref, reactive, watch } from 'vue'
import { useRouter } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import { permissionStore } from '@/store/modules/permission'
import { appStore } from '@/store/modules/app'
import wsCache from '@/cache'
import { ElNotification } from 'element-plus'
import { loginApi } from './api'
import { Message } from '_c/Message'interface FormModule {loginName: string,password: string
}
interface RulesModule {loginName: any[],password: any[]
}export default defineComponent({name: 'Login',setup() {const { push, addRoute, currentRoute } = useRouter()const loginForm = ref<HTMLElement | null>(null)const loading = ref<boolean>(false)const redirect = ref<string>('')watch(() => {return currentRoute.value}, (route) => {redirect.value = (route.query && route.query.redirect) as string}, {immediate: true})const form = reactive<FormModule>({loginName: '',password: ''})const rules = reactive<RulesModule>({loginName: [{ required: true, message: '请输入账号' }],password: [{ required: true, message: '请输入密码' }]})async function login(): Promise<void> {const formWrap = unref(loginForm) as anyif (!formWrap) returnloading.value = truetry {formWrap.validate(async(valid: boolean) => {if (valid) {const formData = unref(form)const res = await loginApi({data: formData})if (res.status !== 200) {Message.error(res.message)return false}wsCache.set(appStore.userInfo, form)permissionStore.GenerateRoutes().then(() => {permissionStore.addRouters.forEach(async(route: RouteRecordRaw) => {await addRoute(route.name!, route) // 动态添加可访问路由表})permissionStore.SetIsAddRouters(true)push({ path: redirect.value || '/' })})} else {console.log('error submit!!')return false}})} catch (err) {console.log(err)} finally {loading.value = false}}return {loginForm,loading, redirect, form, rules,login}}
})
</script><style lang="less" scoped>
.login-wrap {width: 100%;height: 100%;background-image: url('~@/assets/img/login-bg.jpg');background-size: cover;background-position: center;position: relative;.box-card {width: 400px;.login--header {font-size: 24px;font-weight: 600;}.svg-container {color: #889aa4;vertical-align: middle;width: 30px;display: inline-block;}.form--input {width: 100%;@{deep}(.el-input__inner) {padding-left: 40px;}}.login--button {width: 100%;}}.login-con {position: absolute;right: 160px;top: 50%;transform: translateY(-60%);}
}
</style>

3.3.12 在login目录下新建一个api.ts文件

如图所示:

在这里插入图片描述

代码如下所示:

import { fetch } from '@/axios-config/axios'// 参数接口
interface PropsData {params?: any,data?: any
}
// 提交表单接口函数
export const loginApi = ({ data }: PropsData): any => {return fetch({ url: 'login', method: 'post', data })
}

3.3.13 修改UserInfo目录下的index.vue文件

如图所示:

在这里插入图片描述

代码如下所示:

<template><el-dropdown class="avatar-container" trigger="hover"><div id="user-container"><div class="avatar-wrapper"><img src="logo.png" class="user-avatar"><span class="name-item">{{ userInfo.loginName }}</span></div></div><template #dropdown><el-dropdown-menu><el-dropdown-item key="1"><span style="display: block;" @click="toHome">首页</span></el-dropdown-item><el-dropdown-item key="2"><span style="display: block;" @click="loginOut">退出登录</span></el-dropdown-item></el-dropdown-menu></template></el-dropdown>
</template><script lang="ts">
import { defineComponent, reactive, computed } from 'vue'
import { resetRouter } from '@/router'
import wsCache from '@/cache'
import { useRouter } from 'vue-router'
import { tagsViewStore } from '@/store/modules/tagsView'
import { appStore } from '@/store/modules/app'export default defineComponent({name: 'UserInfo',setup() {const { replace, push } = useRouter()async function loginOut(): Promise<void> {wsCache.clear()// wsCache.delete(appStore.userToken)await resetRouter() // 重置静态路由表await tagsViewStore.delAllViews() // 删除所有的tags标签页replace('/login')}const userInfo = wsCache.get(appStore.userInfo)console.info('userInfo:-----------',userInfo)function toHome() {push('/')}return {loginOut,toHome,userInfo}}
})
</script><style lang="less" scoped>
.avatar-container {margin-right: 30px;padding: 0 10px;.avatar-wrapper {display: flex;align-items: center;height: 100%;cursor: pointer;.user-avatar {width: 30px;height: 30px;border-radius: 10px;}.name-item {font-size: 14px;font-weight: 600;display: inline-block;margin-left: 5px;}}
}
</style>

3.3.14 拦截器功能实现

步骤01 新建一个interceptor包,并在此包下自定义拦截器类AdminInterceptor

代码如下所示:

package cn.xueden.interceptor;import cn.xueden.exception.BadRequestException;import cn.xueden.utils.HutoolJWTUtil;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;/**拦截器* @author:梁志杰* @date:2022/5/6* @description:cn.xueden.interceptor* @version:1.0*/public class AdminInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "*");response.setHeader("Access-Control-Max-Age", "86400");response.setHeader("Access-Control-Allow-Headers", "*");if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {System.out.println("OPTIONS请求,放行");return true;}//获取tokenString token = request.getHeader("Authorization");//判断用户是否登录if (null==token){throw new BadRequestException(HttpStatus.UNAUTHORIZED,"请先登录");}String tokenServletContext = (String)request.getServletContext().getAttribute("token");// 判断用户登录是否过期if (null==tokenServletContext){throw new BadRequestException(HttpStatus.UNAUTHORIZED,"登录已过期,请重新登录");}// 校验tokenboolean tokenStatus = HutoolJWTUtil.JwtVerify(token);if(!tokenStatus){throw new BadRequestException(HttpStatus.UNAUTHORIZED,"登录信息已过期,请重新登录");}return true;}
}

步骤02 修改ConfigurerAdapter配置类,重写addInterceptors方法,代码如下所示:

 @Overridepublic void addInterceptors(InterceptorRegistry registry) {//addPathPatterns拦截的路径String[] addPathPatterns = {"/**"};//excludePathPatterns排除的路径String[] excludePathPatterns = {"/login","/wxapi/**","/uploadFile/**"};//创建用户拦截器对象并指定其拦截的路径和排除的路径registry.addInterceptor(new AdminInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);}

3.4 微信小程序项目搭建

3.4.1 新建猪脚饭微信小程序项目

步骤01 打开微信开发者工具,选择新建项目,如图所示:

在这里插入图片描述

步骤02 依次新建目录images->nav,把相关图片复制到nav目录下,如图所示:

在这里插入图片描述

步骤03 在目录images新建一个icon目录,把相关图片复制到此目录,如图所示:

在这里插入图片描述

3.4.2 新建一个名为category菜单页

打开app.json文件,在pages属性下添加如下代码即可:

"pages": ["pages/index/index","pages/category/category"],

3.4.3 新建一个名为index的购物车页面

打开app.json文件,在pages属性下添加如下代码即可:、

 "pages": ["pages/index/index","pages/category/category","pages/shop-cart/index"],

3.4.4 新增一个名为index的我的页面

打开app.json文件,在pages属性下添加如下代码即可:

 "pages": ["pages/index/index","pages/category/category","pages/shop-cart/index","pages/my/index"],

3.4.5 添加tabBar属性

打开app.json文件,添加tabBar属性,同时添加如下代码:

 "tabBar": {"color": "#6e6d6b","selectedColor": "#e64340","borderStyle": "white","backgroundColor": "#f6f0e3","list": [{"pagePath": "pages/index/index","iconPath": "images/nav/home-off.png","selectedIconPath": "images/nav/home-on.png","text": "首页"},{"pagePath": "pages/category/category","iconPath": "images/nav/ic_catefory_normal.png","selectedIconPath": "images/nav/ic_catefory_pressed.png","text": "菜单"},{"pagePath": "pages/shop-cart/index","iconPath": "images/nav/cart-off.png","selectedIconPath": "images/nav/cart-on.png","text": "购物车"},{"pagePath": "pages/my/index","iconPath": "images/nav/my-off.png","selectedIconPath": "images/nav/my-on.png","text": "我的"}]},

3.4.6 编写调用后台接口的工具包

新建一个名为wxapi的目录,并在此目录下新建一个名为main.js的文件,代码如下所示:

const API_BASE_URL = 'http://localhost:8081/wxapi'const request = (url,method,data) => {let _url = API_BASE_URL+'/'+urlretrun new Promise((resolve, reject) => {wx.request({url: _url,method: method,data: data,header: {'Content-Type': 'application/x-www-form-urlencoded'},success(res) {resolve(res.data)},fail(error){reject(error)},complete(aaa){// 加载完成}})})
}/*** 小程序的promise没有finally方法,自己扩展下*/
Promise.prototype.finally = function (callback) {var Promise = this.constructor;return this.then(function (value) {Promise.resolve(callback()).then(function () {return value;});},function (reason) {Promise.resolve(callback()).then(function () {throw reason;});});}module.exports = {request
}

3.4.7 在根目录添加一个名为config.js的文件

代码如下所示:

module.exports = {version: "0.0.1",note: '图片url',imgUrl: "http://192.168.0.5:8081/uploadFile"}

3.4.8 整合weui组件库

开发文档地址:https://wechat-miniprogram.github.io/weui/docs/

步骤01 下载weui组件库,地址是:https://github.com/Tencent/weui-wxss

在这里插入图片描述

步骤02 新建一个weui目录,并把下载好的组件解压复制到此目录下,如图所示:

在这里插入图片描述

步骤03 修改app.wxss文件,代码如下所示:

@import 'weui/weui.wxss';
.page {background-color: #f6f0e3;min-height: 100vh;box-sizing: border-box;
}
.wxParse-img {display: block !important;
}
.space {height:20rpx;background-color: #F2f2f2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6824.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库基本概念

目录 一、数据库概念 1、数据库的组成 &#xff08;数据为行&#xff0c;字段为列&#xff09; 2、数据库的管理系统&#xff08;DBMS) 二、数据库系统发展史 1、第一代数据库&#xff08;人工管理&#xff09; 2、第二代数据库&#xff08;文件管理&#xff09; 3、第三…

大学SQLServer2012 安装流程+启动+登录+用户的操作

这里写目录标题第一步下载解压的文件第二步骤安装软件第三步执行安装选项执行安装选项1执行安装选项2执行安装选项3 同意条款执行安装选项4配置检测执行安装选项5 下载需求组件执行安装选项6 上面安装完成后执行安装选项需求---关闭防火墙执行安装选项7--重新检测执行安装选项8…

SpringMVC基础:AJAX发送请求

AJAX请求 前面我们讲解了如何向浏览器发送一个JSON格式的数据&#xff0c;那么我们现在来看看如何向服务器请求数据。 Ajax即Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff0c;它的目标就是实现页面中的数据动态更新&#xff0c;而不是…

微服务--数据一致性

本篇文章讲解微服务数据一致性相关的知识 一、案例 在使用微服务时&#xff0c;存在跨多个服务更新数据库数据的情况。那么这就会出现一个问题&#xff0c;比如我们有三个服务&#xff08;如下图&#xff09;&#xff0c;正常情况下&#xff0c;当一个请求进来时&#xff0c;…

【软件与系统安全笔记】五、内存破坏防御

【软件与系统安全】五、内存破坏防御 这是《【软件与系统安全】笔记与期末复习》系列中的一篇 虽然对缓冲区溢出的认知已超过 40 年之久, 但缓冲区溢出仍未被消除。部分原因在于存在大量的利用选项&#xff1a; 多样的目标: 不仅仅可以利用返回地址, 实际上可以利用任意代码地…

JDK1.8中的Stream流源码中的常用方法全面解析附代码演示及源码展示

文章目录&#x1f4a8;更多相关知识&#x1f447;&#x1f342;allMatch&#x1f31f;代码演示&#x1f342;anyMatch&#x1f31f;代码演示&#x1f342;noneMatch&#x1f31f;代码演示&#x1f342;findFirst&#x1f31f;代码演示&#x1f342;findAny&#x1f31f;代码演示…

【愚公系列】2022年09月 微信小程序-WebGL纹理材质的使用

文章目录前言一、webgl的使用1.立体图形的绘制二、相关包源码三、总结前言 WebGL&#xff08;全写Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScrip…

[含毕业设计论文+PPT+源码等]ssm培训机构管理系统+Java后台管理系统|前后分离VUE

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 微信小程序项目介绍 资料获取 微信小程序项目介绍 计算机毕业设计java毕设项目之微信小程序ssm培训机构管理系统小程序后台管理系统_哔哩哔哩_bilibili计算机毕业设计java毕设项目之微信…

基于Springboot健身会员俱乐部管理系统设计

开发技术&#xff1a; Idea Springboot Mysql 功能描述&#xff1a; 1 系统管理员模块的具体需求如下&#xff1a; &#xff08;1&#xff09;会员管理:系统管理员在本系统中拥有对会员进行管理的功能。包括会员的注册、个人信息的修改、会员的删除、变更和查询&#xff0c…

Linux——权限

目录 Linux权限的概念 Linux权限管理 文件访问者的分类 文件类型和访问权限 文件类型 基本权限 文件权限值的表示方法 文件访问权限的相关设置方法 目录的权限 粘滞位 关于权限的总结 Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、…

k8s 集群 使用yaml部署Tomcat方法

使用ymal部署Tomcat6 命令中&#xff0c;通过–dry-run选项&#xff0c;并不会真正的执⾏这条命令。 –dry-run‘none’: Must be “none”, “server”, or “client”. If client strategy, only print the object thatwould be sent, without sending it. If server strate…

计算机毕业设计之java+springboot基于vue的农机电招平台

计算机毕业设计之javaspringboot基于vue的农机电招平台 项目介绍 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操…

车企竞相“入股”元宇宙,美格智能着力打造制胜秘诀

2021年&#xff0c;元宇宙一夜爆红&#xff0c;引发社会各界关注。在“元宇宙”概念爆发初期&#xff0c;这个新概念下的产业与生态还是一片草莽。直到2021年底&#xff0c;在全社会的“元宇宙热”之下&#xff0c;各大企业才正式开启对元宇宙的竞相追逐&#xff0c;展开了元宇…

基于SSH的高校竞赛报名系统设计与实现

目录 1 需求分析 1 2 概要设计 1 &#xff08;1&#xff09;数据结构 1 &#xff08;2&#xff09; 模块划分 2 &#xff08;3&#xff09; 总体框架 2 &#xff08;4&#xff09;数据库设计&#xff1a; 2 ER图 2 数据库表结构&#xff1a; 3 3 详细设计 4 4 调试分析 6 5 测试…

TreeMap和LinkedHashMap

TreeMap 总体特点&#xff1a;&#xff08;主要是跟linkedHashMap比较&#xff09; 底层是基于红黑树实现&#xff0c;是个有序集合&#xff0c;按照key的compareTo方法或在构造时传入的Comparator比较器进行排序。这里需要注意如果在构造 时没有传入Comparator&#xff0c;那…

猿创征文|瑞吉外卖——移动端_地址管理

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 专栏&#xff1a;瑞吉外卖 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;人会想很多事&#xff0c;而且多半是痛苦的&#xff0c;时光如水&#xff0c;我们无法阻止…

02-Vue li环境搭建

一、Vue cli 介绍 什么是vue-cli vue-cli是由vue官方发布的快速构建vue单页面的脚手架 为什么要用vue-cli构建项目 用vue-cli可以实现webpack的快速打包 &#xff0c;打包。 代码重用 兼容ES6 ;jQuery语言&#xff1a;ES5 兼容nodeJS 只有 一个单界面。index.html.在vue组…

maven常用插件详解

1. 简介 我们都知道Maven本质上是一个插件框架&#xff0c;它的核心并不执行任何具体的构建任务&#xff0c;所有这些任务都交给插件来完成&#xff0c;例如编译源代码是由maven- compiler-plugin完成的。进一步说&#xff0c;每个任务对应了一个插件目标&#xff08;goal&…

自己动手写编译器:汤普森构造法

上节我们描述了正则表达式的规则&#xff0c;有过一些编程经验的同学或许都用过正则表达式功能&#xff0c;通常使用它来检验特定格式的字符串&#xff0c;例如检验输入的邮箱是否合法等。当然大多数时候我们只要“调用”即可&#xff0c;但对于要做编译器而言&#xff0c;我们…

【java web】自己捣鼓的班级随机点名(html+servlet)

随机点名1. 代码2. 展示3. 配置4. 运行流程本文出土原因&#xff0c;写在前面&#xff1a; 因为老师让我们搞一个web的小东西&#xff0c;做个简历啥的&#xff0c;但是我感觉没啥意思&#xff0c;上周上课学了servlet&#xff0c;然后老师点名也是随机点名的&#xff0c;所以说…