旅游推荐管理系统

代码位置:旅游管理系统: 根据若依模版的一个旅游管理系统 - Gitee.com
分支dev

项目介绍

项目目的

随着社会的高速发展,人们生活水平的不断提高,以及工作节奏的加快,旅游逐渐成为一个热门的话题,因为其形式的多样,涉及的面比较广,成为人们放松压力,调节情绪的首要选择。 传统的旅游信息管理是采用人力的自然管理和纸制记录。在查询,更新时都是由人一条一条的记录,这样不仅需要大量的人力还需要大量的办公用品。这必然造成对人力和物力的浪费,而且由于工作量大并且繁琐,就会带来效率方面的低下,而这些就会无形地使利润下滑。 在这样的背景下,一套旅游推荐管理系统应运而生,它可以帮助人们更快更好的找到旅游相对应的各种信息,既可以节省人力物力又可以节省财力。同时,旅游推荐管理系统也可以促进旅游行业的发展,吸引更多游客到达不同的旅游目的地,促进旅游业的多元化发展,减轻旅游热点地区的压力,推动整体旅游业的健康发展。 旅游推荐管理系统可以收集并分析用户行为数据和反馈信息,洞察用户行为模式和市场趋势,为旅游决策提供数据支持和参考,持续优化旅游推荐服务。

项目意义

1.提升旅游体验

通过系统化地收集各种旅游相关信息,例如:旅游线路、景点信息、地方美食等,用户能更快更全的了解所有旅游信息,从而提升旅游体验。
2.促进旅游业发展

通过旅游推荐系统,用户可以全面的了解旅游信息,更好的促进用户想旅游的心情,因而促进旅游业的发展。

3.数据积累与分析

通过系统后台对各种数据的积累,再加以分析,可以洞察用户的行为模式和偏好趋势,为旅游决策提供数据支持和参考。

4.提升服务品质

通过系统对用户的反馈进行实时监测和分析,旅游从业者可以及时发现和解决问题,提升服务品质,增强用户满意度,提升口碑。

5.优化资源配置

不再是传统旅游信息的纸质展示,而是数据保存,系统可以更好的帮助从业者提高资源利用效率,降低成本。

项目功能模块

使用的技术

1.若依(Ruoyi)框架
若依(Ruoyi)框架是一款基于Spring Boot框架开发的管理系统快速开发平台,提供了丰富的功能模块和插件支持,帮助开发人员快速搭建各类企业级管理系统。 Ruoyi框架具有灵活的权限控制、代码生成器、多数据源支持等特性,使得开发人员能够高效地完成项目开发工作,提升开发效率和代码质量。

2.Vue.js
Vue.js是一款流行的开源JavaScript框架,用于构建用户界面和单页面应用程序(SPA)。Vue.js采用轻量级的方式处理数据绑定和DOM操作,同时提供了简洁明了的API和响应式的数据绑定机制,使得开发者能够快速构建交互式的Web应用程序。Vue.js特点包括易学易用、高效灵活、组件化开发、虚拟DOM等,被广泛应用于前端开发中,并得到了社区和开发者的积极支持和推崇。。
3..Ajax

Ajax(Asynchronous JavaScript and XML)是一种用于在Web应用程序中实现异步数据传输的技术。借助Ajax,Web页面可以在不刷新整个页面的情况下与服务器进行数据交换,从而实现动态更新页面内容的效果。Ajax利用XMLHttpRequest对象在后台与服务器进行数据交换,通过在后台异步传输数据,可以在页面加载过程中向服务器发送请求并获取响应,从而提升用户体验和页面的交互性。Ajax技术的出现极大地改变了Web开发的方式,使得Web应用程序能够更加动态、实时地与用户进行交互。

4.springboot

Spring Boot是一个用于构建基于Spring框架的快速、简单的应用程序的开源框架。它旨在简化Spring应用程序的搭建过程,提供了开箱即用的配置和功能,让开发者可以更专注于业务逻辑的开发,而不需要花费过多精力在配置上。Spring Boot提供了自动化的配置,集成了大量常用的框架和库,支持快速开发Web应用、RESTful服务、批处理应用等。同时,Spring Boot还提供了内嵌的Servlet容器,方便应用程序的部署和运行。总的来说,Spring Boot简化了Spring应用程序的开发和部署过程,降低了开发者的学习成本,使得开发人员能够更高效地构建和部署应用程序。

项目结构

riyi-admin中存放着springboot启动类,controller存放着前后台控制层,resource存放着springboot配置文件,static存放着前台资源

riyi-system,domain存放着实体类,mapper存放着dao层类,service存放着服务层接口与服务层实现类,mapper存放着数据库xml文件

riyi-system中存放着后台vue文件,api存放着ajax.js文件,assets存放着静态资源,components存放着组件,router存放着路由js文件,store存放着vuex存放的信息,utils存放着工具,views存放着界面.

代码分析

后台首页报表

<div id="lineInfo" :style="{ width: '560px', height: '400px' }"></div>

先创建一个容器

通常来说,需要在 HTML 中先定义一个 <div> 节点,并且通过 CSS 使得该节点具有宽度和高度。

import * as echarts from 'echarts';

导入Apache ECharts
Apache ECharts(原名百度ECharts)是一个由百度开源的可视化图表库,用于在Web应用程序中创建各种交互式的图表和数据可视化展示。ECharts提供了丰富多彩的图表类型,包括折线图、柱状图、饼图、散点图等,同时支持数据的多维度展示和控制。ECharts具有良好的交互性能,支持图表的拖拽、缩放、联动等操作,使得用户能够更直观、更深入地理解数据。ECharts还提供了丰富的配置选项和API,方便开发者根据需求定制和调整图表的外观和行为。由于其功能强大、易用性高,Apache ECharts已经成为Web开发中常用的数据可视化工具之一,被广泛应用于各种Web应用程序中。

let attrInfo = echarts.init(document.getElementById('attrInfo'));
let lineInfo = echarts.init(document.getElementById('lineInfo'));
let lineInfo1 = echarts.init(document.getElementById('lineInfo1'));
let newsInfo = echarts.init(document.getElementById('newsInfo'));

初始化ECharts

attrInfo.setOption({
              title: {
                  text: '景点浏览量和票价统计',
                  left: 'center',
                  top: 0,
                  textStyle: {
                      color: '#555555'
                  }
              },
              //鼠标悬停显示X轴和相对应的值
              tooltip: {
                  trigger: 'axis',
                  axisPointer: {
                      type: 'shadow'
                  }
              },
              legend: {
                  top:20,
              },
              grid:{
                  left: '3%',
                  right: '4%',
                containLabel:true
              },
              xAxis:{
                  data:that.attrName,
              },
              yAxis:{
                  type:"value"
              },
              series:[
                  {
                    name:'浏览量',
                    type:'bar',
                    data:that.attrViews
                  },
                  {
                      name:'票价',
                      type:'bar',
                      data:that.attrFare
                  },
              ]
          });

设置图表
ECharts 配置语法 | 菜鸟教程 (runoob.com)


订单

后台

IndentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IndentMapper">

    <resultMap id="IndentResult" type="Indent">
        <id property="iid" column="iid"/>
        <result property="lineid" column="lineid"/>
        <result property="number" column="number"/>
        <result property="userId" column="user_id"/>
        <result property="sid" column="sid"/>
        <result property="addtime" column="addtime"/>
        <association property="line" column="lineid" javaType="Line" resultMap="LineResult"/>
        <association property="user" column="user_id" javaType="SysUser" resultMap="SysUserResult"/>
    </resultMap>

    <resultMap type="Line" id="LineResult">
        <result property="lineid"    column="lineid"    />
        <result property="lid"    column="lid"    />
        <result property="lname"    column="lname"    />
        <result property="picture"    column="picture"    />
        <result property="start"    column="start"    />
        <result property="via"    column="via"    />
        <result property="end"    column="end"    />
        <result property="lprice"    column="lprice"    />
        <result property="pageviews"    column="pageviews"    />
        <result property="item"    column="item"    />
        <result property="introduction"    column="introduction"    />
        <result property="addtime"    column="addtime"    />
    </resultMap>

    <resultMap type="SysUser" id="SysUserResult">
        <id     property="userId"       column="user_id"      />
        <result property="deptId"       column="dept_id"      />
        <result property="userName"     column="user_name"    />
        <result property="nickName"     column="nick_name"    />
        <result property="email"        column="email"        />
        <result property="phonenumber"  column="phonenumber"  />
        <result property="sex"          column="sex"          />
        <result property="avatar"       column="avatar"       />
        <result property="password"     column="password"     />
        <result property="status"       column="status"       />
        <result property="delFlag"      column="del_flag"     />
        <result property="loginIp"      column="login_ip"     />
        <result property="loginDate"    column="login_date"   />
        <result property="createBy"     column="create_by"    />
        <result property="createTime"   column="create_time"  />
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="remark"       column="remark"       />
    </resultMap>

    <sql id="selectIndentVo">
        select * from indent i
        left join line l
        on l.lineid=i.lineid
        left  join sys_user su
        on su.user_id=i.user_id
    </sql>

    <select id="selectIndentList" parameterType="com.ruoyi.system.domain.vo.IndentVo" resultMap="IndentResult">
        <include refid="selectIndentVo"/>
        <where>
            <if test="start != null and start != ''"> and l.start = #{start}</if>
            <if test="end != null and end != ''"> and  l.end = #{end}</if>
            <if test="number != null  and number != ''"> and number like concat('%', #{number}, '%')</if>
            <if test="username != null  and username != ''"> and su.user_name = #{username}</if>
            <if test="sid != null and sid != ''"> and sid = #{sid}</if>
            <if test="addtime != null "> and addtime = #{addtime}</if>
        </where>
    </select>

    <select id="selectIndentByIid" parameterType="Integer" resultMap="IndentResult">
        <include refid="selectIndentVo"/>
        where iid = #{iid}
    </select>
    <select id="selectIndentListBySid" resultType="com.ruoyi.system.domain.Indent">
        <include refid="selectIndentVo"/>
        where sid = #{sid}
    </select>


    <insert id="insertIndent" parameterType="Indent" useGeneratedKeys="true" keyProperty="iid">
        insert into indent
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="iid != null">iid,</if>
            <if test="lineid != null">lineid,</if>
            <if test="number != null and number != ''">number,</if>
            <if test="userId != null">user_id,</if>
            <if test="sid != null">sid,</if>
            <if test="addtime != null">addtime,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="iid != null">#{iid},</if>
            <if test="lineid != null">#{lineid},</if>
            <if test="number != null and number != ''">#{number},</if>
            <if test="userId != null">#{userId},</if>
            <if test="sid != null">#{sid},</if>
            <if test="addtime != null">#{addtime},</if>
        </trim>
    </insert>

    <update id="updateIndent" parameterType="Indent">
        update indent
        <trim prefix="SET" suffixOverrides=",">
            <if test="iid != null"> and iid = #{iid}</if>
            <if test="lineid != null"> and lineid = #{lineid}</if>
            <if test="number != null  and number != ''"> and number = #{number}</if>
            <if test="time != null and time != ''"> and time = #{time}</if>
            <if test="userId != null"> and user_id = #{userId}</if>
            <if test="sid != null "> and sid = #{sid}</if>
            <if test="addtime != null "> and addtime = #{addtime}</if>
        </trim>
        where iid = #{iid}
    </update>

    <delete id="deleteIndentByIid" parameterType="Integer">
        delete from indent where iid = #{iid}
    </delete>

    <delete id="deleteIndentByIids" parameterType="String">
        delete from indent where iid in
        <foreach item="iid" collection="array" open="(" separator="," close=")">
            #{iid}
        </foreach>
    </delete>
</mapper>

订单表通过lineid连接旅游路线表,通过userId连接用户表

 IndentMapper.class
 

package com.ruoyi.system.mapper;

import com.ruoyi.system.domain.Indent;
import com.ruoyi.system.domain.vo.IndentVo;

import java.util.List;

/**
 * 订单Mapper接口
 * @author ruoyi
 * @date 2024-04-19
 */
public interface IndentMapper
{
    /**
     * 查询订单
     * @param iid 订单主键
     * @return 订单
     */
    public Indent selectIndentByIid(Integer iid);

    /**
     * 查询订单列表
     * @param indentVo 订单
     * @return 订单集合
     */
    public List<Indent> selectIndentList(IndentVo indentVo);

    /**
     * 根据状态查询订单列表
     * @param indent 订单
     * @return 订单集合
     */
    public List<Indent> selectIndentListBySid(Indent indent);

    /**
     * 新增订单
     * @param indent 订单
     * @return 结果
     */
    public int insertIndent(Indent indent);

    /**
     * 修改订单
     * @param indent 订单
     * @return 结果
     */
    public int updateIndent(Indent indent);

    /**
     * 删除订单
     * @param iid 订单主键
     * @return 结果
     */
    public int deleteIndentByIid(Integer iid);

    /**
     * 批量删除订单
     * @param iids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteIndentByIids(Integer[] iids);
}

  IIndentService.class

package com.ruoyi.system.service;

import com.ruoyi.system.domain.Indent;
import com.ruoyi.system.domain.Line;
import com.ruoyi.system.domain.vo.IndentVo;

import java.util.List;

/**
 * 订单Service接口
 * 
 * @author ruoyi
 * @date 2024-04-19
 */
public interface IIndentService
{
    /**
     * 查询订单
     * @param iid 订单id
     * @return 订单
     */
    public Indent selectIndentByIid(Integer iid);

    /**
     * 查询景点信息列表
     * @return 订单集合
     */
    public List<Indent> selectIndentList(IndentVo indentVo);

    /**
     * 新增订单
     * @param indent 订单
     * @return 结果
     */
    public int insertIndent(Indent indent);

    /**
     * 修改订单
     * @param indent 订单
     * @return 结果
     */
    public int updateIndent(Indent indent);

    /**
     * 批量删除订单
     * @param iids 需要删除的订单主键集合
     * @return 结果
     */
    public int deleteIndent(Integer[] iids);

    /**
     * 删除订单
     * @param iid 订单主键
     * @return 结果
     */
    public int deleteIndent(Integer iid);
}

  IndentServiceImpl.class

package com.ruoyi.system.service.impl;

import com.ruoyi.system.domain.Indent;
import com.ruoyi.system.domain.vo.IndentVo;
import com.ruoyi.system.mapper.IndentMapper;
import com.ruoyi.system.service.IIndentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author hua
 * @version 1.0
 * @title IndentServiceImpl
 * @description 订单业务层处理
 * @create 2024/4/22 9:58
 */
@Service
public class IndentServiceImpl implements IIndentService {
    @Autowired
    private IndentMapper indentMapper;
    
    /**
     * 查询订单
     * @param iid 订单id
     * @return 订单
     */
    @Override
    public Indent selectIndentByIid(Integer iid) {
        return indentMapper.selectIndentByIid(iid);
    }

    /**
     * 查询景点信息列表
     * @return 订单集合
     */
    @Override
    public List<Indent> selectIndentList(IndentVo indentVo) {
        return indentMapper.selectIndentList(indentVo);
    }

    /**
     * 新增订单
     * @param indent 订单
     * @return 结果
     */
    @Override
    public int insertIndent(Indent indent) {
        return indentMapper.insertIndent(indent);
    }

    /**
     * 修改订单
     * @param indent 订单
     * @return 结果
     */
    @Override
    public int updateIndent(Indent indent) {
        return indentMapper.updateIndent(indent);
    }

    /**
     * 批量删除订单
     * @param iids 需要删除的订单主键集合
     * @return 结果
     */
    @Override
    public int deleteIndent(Integer[] iids) {
        return indentMapper.deleteIndentByIids(iids);
    }

    /**
     * 删除订单
     * @param iid 订单主键
     * @return 结果
     */
    @Override
    public int deleteIndent(Integer iid) {
        return indentMapper.deleteIndentByIid(iid);
    }
}

  IndentController.class

package com.ruoyi.web.controller.system;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.Indent;
import com.ruoyi.system.domain.vo.IndentVo;
import com.ruoyi.system.service.IIndentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 订单Controller
 * 
 * @author ruoyi
 * @date 2024-04-19
 */
@RestController
@RequestMapping("/indents/indent")
public class IndentController extends BaseController
{
    @Autowired
    private IIndentService iIndentService;

    /**
     * 查询订单列表
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:list')")
    @GetMapping("/list")
    public TableDataInfo list(IndentVo indentVo)
    {
        startPage();
        List<Indent> list = iIndentService.selectIndentList(indentVo);
        return getDataTable(list);
    }

    /**
     * 导出订单列表
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:export')")
    @Log(title = "订单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, IndentVo indentVo)
    {
        List<Indent> list = iIndentService.selectIndentList(indentVo);
        ExcelUtil<Indent> util = new ExcelUtil<Indent>(Indent.class);
        util.exportExcel(response, list, "订单数据");
    }

    /**
     * 获取订单详细信息
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:query')")
    @GetMapping(value = "/{iid}")
    public AjaxResult getInfo(@PathVariable("iid") Integer iid)
    {
        return success(iIndentService.selectIndentByIid(iid));
    }

    /**
     * 新增订单
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:add')")
    @Log(title = "订单", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody Indent indent)
    {
        return toAjax(iIndentService.insertIndent(indent));
    }

    /**
     * 修改订单
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:edit')")
    @Log(title = "订单", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody Indent indent)
    {
        return toAjax(iIndentService.updateIndent(indent));
    }

    /**
     * 删除订单
     */
    @PreAuthorize("@ss.hasPermi('indents:indent:remove')")
    @Log(title = "订单", businessType = BusinessType.DELETE)
	@DeleteMapping("/{iids}")
    public AjaxResult remove(@PathVariable Integer[] iids)
    {
        return toAjax(iIndentService.deleteIndent(iids));
    }
}

getDataTable(list) 将查询结果封装成 TableDataInfo 对象后返回,方法使用mvc模式,控制层调用服务层,服务层调用mapper层,mapper层调用数据库xml文件完成后台数据交互.

package com.ruoyi.common.core.page;

import java.io.Serializable;
import java.util.List;

/**
 * 表格分页数据对象
 * 
 * @author ruoyi
 */
public class TableDataInfo implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** 总记录数 */
    private long total;

    /** 列表数据 */
    private List<?> rows;

    /** 消息状态码 */
    private int code;

    /** 消息内容 */
    private String msg;

    /**
     * 表格数据对象
     */
    public TableDataInfo()
    {
    }

    /**
     * 分页
     * 
     * @param list 列表数据
     * @param total 总记录数
     */
    public TableDataInfo(List<?> list, int total)
    {
        this.rows = list;
        this.total = total;
    }

    public long getTotal()
    {
        return total;
    }

    public void setTotal(long total)
    {
        this.total = total;
    }

    public List<?> getRows()
    {
        return rows;
    }

    public void setRows(List<?> rows)
    {
        this.rows = rows;
    }

    public int getCode()
    {
        return code;
    }

    public void setCode(int code)
    {
        this.code = code;
    }

    public String getMsg()
    {
        return msg;
    }

    public void setMsg(String msg)
    {
        this.msg = msg;
    }
}

@PreAuthorize 是 Spring Security 框架中用来进行方法级别安全控制的注解。它用于在方法执行之前检查调用者是否有合适的权限。你可以在服务层的方法上添加 @PreAuthorize 注解,以限制只有特定角色或权限的用户才能调用该方法。@PreAuthorize 支持使用 Spring Expression Language (SpEL) 来编写更加复杂的权限判断逻辑。你还可以把 @PreAuthorize 与其他 Spring 安全注解结合使用,以实现更强大和灵活的安全控制。

  @PreAuthorize("@ss.hasPermi('indents:indent:list')")

return success(iIndentService.selectIndentByIid(iid));:此行表示方法将通过 success 方法封装服务层返回的数据,并最终返回一个 AjaxResult 对象。
 

package com.ruoyi.common.core.domain;

import java.util.HashMap;
import java.util.Objects;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.utils.StringUtils;

/**
 * 操作消息提醒
 * 
 * @author ruoyi
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;

    /** 状态码 */
    public static final String CODE_TAG = "code";

    /** 返回内容 */
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    public static final String DATA_TAG = "data";

    /**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */
    public AjaxResult()
    {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data))
        {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * 返回成功消息
     * 
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     * 
     * @return 成功消息
     */
    public static AjaxResult success(Object data)
    {
        return AjaxResult.success("操作成功", data);
    }

    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        return AjaxResult.success(msg, null);
    }

    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult warn(String msg)
    {
        return AjaxResult.warn(msg, null);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult warn(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.WARN, msg, data);
    }

    /**
     * 返回错误消息
     * 
     * @return 错误消息
     */
    public static AjaxResult error()
    {
        return AjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @return 错误消息
     */
    public static AjaxResult error(String msg)
    {
        return AjaxResult.error(msg, null);
    }

    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 错误消息
     */
    public static AjaxResult error(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }

    /**
     * 返回错误消息
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @return 错误消息
     */
    public static AjaxResult error(int code, String msg)
    {
        return new AjaxResult(code, msg, null);
    }

    /**
     * 是否为成功消息
     *
     * @return 结果
     */
    public boolean isSuccess()
    {
        return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));
    }

    /**
     * 是否为警告消息
     *
     * @return 结果
     */
    public boolean isWarn()
    {
        return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
    }

    /**
     * 是否为错误消息
     *
     * @return 结果
     */
    public boolean isError()
    {
        return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));
    }

    /**
     * 方便链式调用
     *
     * @param key 键
     * @param value 值
     * @return 数据对象
     */
    @Override
    public AjaxResult put(String key, Object value)
    {
        super.put(key, value);
        return this;
    }
}

前台

indent.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>我的订单</title>
    <link rel="stylesheet" type="text/css" href="css/reset.css" />
    <link rel="stylesheet" type="text/css" href="css/index.css" />
    <link rel="stylesheet" type="text/css" href="css/swiper.min.css" />
    <link rel="stylesheet" type="text/css" href="css/iconfont.css" />
    <link rel="stylesheet" type="text/css" href="css/serve.css" />
    <link rel="stylesheet" type="text/css" href="css/animate.min.css" />
    <script src="js/jquery-3.2.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        $(function () {
            var token = localStorage.getItem("token")
            $.ajax({
                url: "/html/IndentList",
                type: "get",
                dataType: "json",
                data:{userId:localStorage.getItem("userId")},

                success: function (result) {
                    if(token!=null&&token!="") {
                        $("#userName").html("欢迎您: " + localStorage.getItem("userName"));
                        $("#email").html(localStorage.getItem("email"));
                        console.log(result);
                        var html="";
                        result.rows.forEach(item =>{
                            html+="<div style=\"border: #d9d9d9 1px solid; margin-top: 30px;color: #3e3e3e;\">\n" +
                                "    <div style=\"padding: 10px; display: flex;background: #f6f6f6;height: 20px\">\n" +
                                "        <input type=\"checkbox\" value=\"index1\">\n" +
                                "        <div style=\"margin-left: 5px;display: flex\">订单号:<a\n" +
                                "                style=\"color: #4ad1e5;margin-left: 5px;\">"+item.number+"</a></div>\n" +
                                "        <div style=\"margin-left: 20px\">预订日期: "+item.addtime+"</div>\n" +
                                "        <a style=\"margin-left: 20px;color: #4ad1e5\" " +
                                "href= \"javascript:void(0)\" onclick= \"deleteIndent(" + item.iid + ")\">删除订单</a>\n" +
                                "    </div>\n" +
                                "    <div style=\"margin-left: 30px; display: flex;justify-content: space-between\">\n" +
                                "        <div style=\"margin-left: 10px\">\n" +
                                "            <h2 style=\"margin: 5px; font-weight:bold\">"+item.line.lname+"</h2>\n" +
                                "            <div style=\"margin: 5px\">使用人: "+item.user.nickName+"</div>\n" +
                                "        </div>";
                            if (item.sid==="已支付") {
                                html += "<div style=\" margin: 10px\">\n" +
                                    "            <div style=\"color: #61611d;\"><h2>已支付</h2></div>\n" +
                                    "            <div style=\"font-weight:bold;font-size: 20px;margin-top: 10px\">"+item.line.lprice+"</div>\n" +
                                    "        </div>\n" +
                                    "    </div>\n" +
                                    "    <div style=\"display: flex; justify-content: flex-end\">\n" +
                                    "        <div style='width: 100px;height: 30px; font-size: 18px;\n" +
                                    "        text-align: center;border-radius: 4px;\n" +
                                    "        background: #07cb07; margin: 10px;\n" +
                                    "        border: 2px #07cb07;' onclick='setSid(\"已完成\","+item.iid+")'>确定\n" +
                                    "        </div>\n" +
                                    "        <div style='width: 100px;height: 30px;font-size: 18px;\n" +
                                    "        text-align: center;border-radius: 4px;\n" +
                                    "        background: #e01313; margin: 10px;\n" +
                                    "        border: 2px #e01313;' onclick='setSid(\"未支付\","+item.iid+")'>退款\n" +
                                    "        </div>\n" +
                                    "    </div>\n" +
                                    "</div>" +
                                    "            <br/>";
                            }
                            if(item.sid==="未支付"){
                                html +=
                                    "<div style=\" margin: 10px\">\n" +
                                    "            <div style=\"color: #e01313;\"><h2>未支付</h2></div>\n" +
                                    "            <div style=\"font-weight:bold;font-size: 20px;margin-top: 10px\">$1200</div>\n" +
                                    "        </div>\n" +
                                    "    </div>\n" +
                                    "    <div style=\"display: flex; justify-content: flex-end\">\n" +
                                    "        <div style='width: 100px;height: 30px; font-size: 18px;\n" +
                                    "        text-align: center;border-radius: 4px;\n" +
                                    "        background: #61611d; margin: 10px;color: #ffffff;\n" +
                                    "        border: 2px #61611d;'  onclick='setSid(\"已支付\","+item.iid+")'>去支付\n" +
                                    "        </div>" +
                                    "    </div>\n" +
                                    "</div>"+
                                    "<br/>";
                            }
                            if(item.sid==="已完成"){
                                html += "<div style=\" margin: 10px\">\n" +
                                    "            <div style=\"color: #07cb07;\"><h2>已完成</h2></div>\n" +
                                    "            <div style=\"font-weight:bold;font-size: 20px;margin-top: 10px\">$1200</div>\n" +
                                    "        </div>\n" +
                                    "    </div>" +
                                    "    </div>\n" +
                                    "</div>" +
                                    "<br/>";
                            }
                        })
                        $("#IndentList").html(html);
                    }else {
                        location.href = "login.html";
                    }
                }
            });
        });
        function setSid(num,iid){
            $.ajax({
                url: "/html/updateIndent",
                data: {sid:num,id:iid},
                type: "put",
                dataType: "json",
                success: function (result) {
                    location.reload();
                }
            });
        }
        function deleteIndent(iid) {
            $.ajax({
                url: "/html/deteleIndent",
                data: {id:iid},
                type: "detele",
                dataType: "json",
                success: function (result) {
                    location.reload();
                }
            });
        }
        function logOut(){
            window.localStorage.clear();
            location.href="login.html";
        }
    </script>
</head>

<body>
<!--头部-->
<div class="headr">
    <div class="headTop">
        <div class="container">
            <div class="head-z">
                <div class="logo-z fl">
                    <a href="index.html"><img src="./img/index/1484553384812.png" /></a>
                </div>
                <div class="phone-z fr">
                    <p>
                        <i class="iconfont icon-dianhuatianchong"></i>
                        <span id="userName"></span><br />
                        <a href="personal.html" id="email"></a>
                        <a href="javascript:void(0)" onclick="logOut()">退出登录</a>
                    </p>
                </div>
                <div class="clear"></div>
            </div>
        </div>
    </div>
    <div id="headnav" class="">
        <div class="container">
            <div id="head" class="head">
                <ul>
                    <li>
                        <a href="index.html" onclick="showname()">
                            <span>首页</span>
                        </a>
                    </li>
                    <li >
                        <a href="line.html" onclick="showname()">
                            <span>旅游线路</span>
                        </a>
                    </li>
                    <li>
                        <a href="attractions.html" onclick="showname()">
                            <span>景点信息</span>
                        </a>
                    </li>
                    <li>
                        <a href="food.html" onclick="showname()">
                            <span>地方美食</span>
                        </a>
                    </li>
                    <li>
                        <a href="news.html" onclick="showname()">
                            <span>新闻</span>
                        </a>
                    </li>
                    <li>
                        <a href="personal.html" onclick="showname()">
                            <span>个人中心</span>
                        </a>
                    </li>
                    <li>
                        <a href="indent.html" onclick="showname()">
                            <span>我的订单</span>
                        </a>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</div>

<!--小导航栏-->
<div class="p-nav">
    <div class="container">
        <div class="pro-menu">
            <ul>
                <li>
                    <a class="active">全部</a>
                </li>
                <li class="short-line">|</li>
                <li>
                    <a>未支付</a>
                </li>
                <li class="short-line">|</li>
                <li>
                    <a>已支付</a>
                </li>
                <li class="short-line">|</li>
                <li>
                    <a>已完成</a>
                </li>
            </ul>
        </div>
        <div id="IndentList">
            <div style="border: #d9d9d9 1px solid; margin-top: 30px;color: #3e3e3e">
                <div style="padding: 10px; display: flex;background: #f6f6f6">
                    <input type="checkbox" value="index1">
                    <div style="margin-left: 5px;display: flex"><p>订单号:</p><a style="color: #4ad1e5;margin-left: 5px;">25928596871</a></div>
                    <div style="margin-left: 20px">预订日期: 2023-08-20</div>
                    <a style="margin-left: 20px;color: #4ad1e5">删除订单</a>
                </div>
                <div style="margin-left: 30px; display: flex;justify-content: space-between">
                    <div style="margin-left: 10px">
                        <h2 style="margin: 5px; font-weight:bold">宁乡-顺风车</h2>
                        <div style="margin: 5px">途径地: </div>
                        <div style="margin: 5px">使用人: </div>
                    </div>
                    <div style=" margin: 10px">
                        <div style="color: green;"><h2>已完成</h2></div>
                        <div style="font-weight:bold;font-size: 20px;margin-top: 10px">$24.4</div>
                    </div>
                </div>
            </div>
            <br/>
        </div>
    </div>
</div>
<!--侧边栏,微信、微博、手机、返回顶部-->
<a href="#">
    <div class="little-ico weixin">
        <i class="iconfont icon-goutong"></i>
    </div>
</a>
<a href="#">
    <div class="little-ico weibo">
        <i class="iconfont icon-sinaweibo"></i>
    </div>
</a>
<a href="#">
    <div class="little-ico shouji">
        <i class="iconfont icon-shouji"></i>
    </div>
</a>
<a id="to-top" href="#">
    <div class="to-top">
        <i class="iconfont icon-top"></i>
    </div>
</a>
<!--二维码-->
<div id="bg_black" class="back-cover nosee">
    <div class="weixin-ma">
        <img src="img/index/1438424052624.jpg" />
        <p>微信扫一扫</p>
    </div>
</div>
<script src="js/jquery-3.2.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/swiper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/index.js" type="text/javascript" charset="utf-8"></script>
<script src="js/Validform_v5.3.2_min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/wow.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $(".p-nav .pro-menu a").click(function() {
            $(this).parent("li").siblings("li").children("a").removeClass("active");
            $(this).addClass("active");
        })
    })
</script>
</body>

</html>

使用localStorage获取用户的token和userId。
通过AJAX请求/html/IndentList接口,获取订单列表。
如果用户已登录,显示欢迎信息和邮箱,并且填充订单列表。
如果用户未登录,重定向到登录页面。
setSid(num,iid):更新订单的状态(如设置为“已支付”或“已完成”)。
deleteIndent(iid):删除订单。
logOut():清除localStorage中的用户信息并重定向到登录页面。
点击导航栏中的“全部”、“未支付”、“已支付”、“已完成”选项时,添加active类使选定项高亮。

index.vue

<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="起点" prop="start">
        <el-input v-model="queryParams.start" placeholder="请输入起点" clearable @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="终点" prop="end">
        <el-input v-model="queryParams.end" placeholder="请输入终点" clearable @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="订单号" prop="number">
        <el-input v-model="queryParams.number" placeholder="请输入订单号" clearable @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="预订人" prop="username">
        <el-input v-model="queryParams.username" placeholder="请输入预订人" clearable @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="添加时间" prop="addtime">
        <el-date-picker clearable v-model="queryParams.addtime" type="date" value-format="yyyy-MM-dd"
          placeholder="请选择添加时间">
        </el-date-picker>
      </el-form-item>
      <el-form-item label="状态" prop="sid">
        <el-select v-model="queryParams.sid" placeholder="请选择状态">
          <el-option v-for="item in sidOptions" :key="item.key" :value="item.value" />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
          v-hasPermi="['system:indent:add']">新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
          v-hasPermi="['system:indent:edit']">修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
          v-hasPermi="['system:indent:remove']">删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
          v-hasPermi="['system:indent:export']">导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <el-table v-loading="loading" :data="indentList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="订单id" align="center" prop="iid" />
      <el-table-column label="订单号" align="center" prop="number" />
      <el-table-column label="线路编号" align="center" prop="line.lid" />
      <el-table-column label="线路名称" align="center" prop="line.lname" />
      <el-table-column label="价格" align="center" prop="line.lprice" />

      <el-table-column label="预订人姓名" align="center" prop="user.userName" />
      <el-table-column label="联系方式" align="center" prop="user.phonenumber" />
      <el-table-column label="状态" align="center" prop="sid" />
      <el-table-column label="添加时间" align="center" prop="addtime" width="180">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.addtime, '{y}-{m}-{d}') }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
            v-hasPermi="['system:indent:edit']">修改</el-button>
          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
            v-hasPermi="['system:indent:remove']">删除</el-button>
          <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"
            v-hasPermi="['system:indent:getLine', 'system:indent:getUser']">
            <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item command="getLine" v-hasPermi="['system:indent:list']">查看旅游线路</el-dropdown-item>
              <el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check"
                v-hasPermi="['system:indent:list']">分配角色</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </template>
      </el-table-column>
    </el-table>

    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
      @pagination="getList" />

    <!-- 添加或修改预定对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form.lineid" :rules="rules" label-width="80px">
        <el-form-item label="订单号" prop="lineid">
          <el-select v-model="form.lineid" placeholder="请选择">
            <el-option v-for="item in lines" key="item.lineid" :label="item.lname" :value="item.lineid">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="订单号" prop="number">
          <el-input v-model="form.number" placeholder="请输入订单号" />
        </el-form-item>
        <el-form-item label="预订人" prop="userId">
          <el-select v-model="form.userId" placeholder="请选择">
            <el-option v-for="item in users" key="item.userId" :label="item.userName" :value="item.userId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="状态" prop="sid">
          <el-select v-model="form.sid" placeholder="请选择状态">
            <el-option v-for="item in sidOptions" key="item.key" :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="添加时间" prop="addtime">
          <el-date-picker clearable v-model="form.addtime" type="date" value-format="yyyy-MM-dd" placeholder="请选择添加时间">
          </el-date-picker>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { addIndent, delIndent, getIndent, listIndent, updateIndent } from "@/api/indents/indent";
import { listLine } from "@/api/routing/line";
import { listUser } from "@/api/system/user";
export default {
  name: "Indent",
  data() {
    return {
      // 遮罩层
      loading: true,
      lines: [],
      users: [],
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 预定表格数据
      indentList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      sidOptions: [{ key: 1, value: "已支付" }, { key: 0, value: "未支付" }, { key: 2, value: "已完成" }],
      // 查询参数2
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        lineid: null,
        lid: null,
        lname: null,
        start: null,
        end: null,
        lprice: null,
        number: null,
        time: null,
        uname: null,
        tel: null,
        sid: null,
        username: null,
        addtime: null
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
        // lineid: [
        //   { required: true, message: "订单号不能为空", trigger: "blur" }
        // ],
        // number: [
        //   { required: true, message: "线路编号不能为空", trigger: "change" }
        // ],
        // sid: [
        //   { required: true, message: "状态不能为空", trigger: "change" }
        // ],
        // userId: [
        //   { required: true, message: "预订人姓名不能为空", trigger: "change" }
        // ],
        // addtime: [
        //   { required: true, message: "添加时间不能为空", trigger: "blur" }
        // ]
      }
    };
  },
  created() {
    this.getLines();
    this.getList();
    this.getUser();
  },
  methods: {
    /** 查询预定列表 */
    getList() {
      this.loading = true;
      listIndent(this.queryParams).then(response => {
        console.log(response)
        this.indentList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    getLines() {
      listLine().then(response => {
        console.log(response)
        this.lines = response.rows;
      })
    },
    getUser() {
      listUser().then(response => {
        console.log(response)
        this.users = response.rows;
      })
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        iid: null,
        lineid: null,
        lid: null,
        lname: null,
        start: null,
        via: null,
        end: null,
        lprice: null,
        number: null,
        time: null,
        uname: null,
        tel: null,
        sid: null,
        rmark: null,
        username: null,
        addtime: null
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.iid)
      this.single = selection.length !== 1
      this.multiple = !selection.length
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加预定";
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      const iid = row.iid || this.ids
      getIndent(iid).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改预定";
      });
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.iid != null) {
            updateIndent(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addIndent(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const iids = row.iid || this.ids;
      this.$modal.confirm('是否确认删除预定编号为"' + iids + '"的数据项?').then(function () {
        return delIndent(iids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => { });
    },
    /** 导出按钮操作 */
    handleExport() {
      this.download('system/indent/export', {
        ...this.queryParams
      }, `indent_${new Date().getTime()}.xlsx`)
    },
    handleCommand(command, row) {
      switch (command) {
        case "getLine":
          this.getLine(row.lineid);
          break;
        case "getUser":
          this.getUser(row.userId);
          break;
        default:
          break;
      }
    },
    /** 分配角色操作 */
    getLine: function (id) {
      console.log(id);
      const userId = id;
      this.$router.push("/system/index/getLine/" + userId);
    },
  },
  computed: {
  }
};
</script>

总结

在这次的小组项目中,我们都收获颇多,组内积极讨论,互相帮助。 最开始,我们组开会讨论系统的大致方向,确定项目的题目,严格按照计划的时间进行。在制定项目计划时,大家积极讨论,提出各自的意见,选择自己要完成任务模块,最后确定了项目初期的功能模块。 在开发过程中,我们首先会完成基本的功能和展示效果,再在这个基础上,我们不断地优化用户界面和交互设计,力求提供直观、便捷的用户体验。开发过程中,我们也肯定或多或少遇到了相同或不同的问题,我们首先都是尝试自己解决,当自己无法解决当前问题时,会去求助组内成员,大家集思广益,一起解决问题,在这一点上,我觉得我们组做的很好,大部分的问题我们都可以自己内部解决。 项目的成功实施充分证明了团队合作的重要性。我们通过有效的沟通和协调,每个人都分工明确,每个团队成员都能在各自的岗位上发挥最大的效能。 总的来说,这个项目不仅提升了我们的技术水平,也增强了我们的团队合作和问题解决能力,为今后的项目实施和职业发展奠定了坚实的基础。

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

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

相关文章

Android version与 SDK API level对应表

1.Android 版本: 截至目前主要是从android1 到 android15 Android版本对应的SDK API版本就比较多了。下面是一份来自官网的对照表&#xff0c;在此把它牢记下来: 2.如果需要查看具体信息&#xff0c;请访问API Levels | Android versions, SDK/API levels, version codes, co…

一文掌握Go性能分析、采样分析、链路追踪分析、生成火焰图、打点对比分析、压力测试分析、生成网页报告web查看

一文掌握Go性能分析、采样分析、链路追踪分析、生成火焰图、打点对比分析、压力测试分析、生成网页报告web查看。 Go性能分析 1. 准备工作 1.1 下载go-wrk 这个是用来进行http接口压测的, 官网地址&#xff1a;https://github.com/tsliwowicz/go-wrk 七牛云下载 使用 go-wr…

springboot vue 开源 会员收银系统 (5) 分类及商品模块开发

前言 完整版演示 前面我们对会员系统 门店模块开发的开发 完成了门店的基础管理 并与会员相关联 下面我们将开发门店的分类及商品管理 我们分析以下几个重点 分类可以随时禁用不用单独下架某个商品便于管理商品添加应该有图片上传商品设置会员价和散客价便于营销商品应该参与…

【工具分享】Annabelle勒索病毒解密工具

前言 Annabelle勒索病毒灵感来自恐怖电影系列 Annabelle。除了文件加密功能外&#xff0c;Annabelle 勒索软件还会试图禁用防火墙&#xff0c;强制停止一系列正在运行程序&#xff0c;通过连接的 USB 驱动器进行传播。 特征 勒索内容&#xff1a; Annabelle 使用 AES256 CBC 加…

喜讯!宝兰德斩获2024数字中国创新大赛·信创赛道全国总决赛三等奖

5月24日&#xff0c;由国家发展和改革委员会、国家数据局、国家互联网信息办公室、科学技术部、国务院国有资产监督管理委员会和福建省人民政府共同主办的2024数字中国创新大赛信创赛道全国总决赛颁奖典礼暨闭幕式大会在福州海峡国际会展中心圆满落幕。依托专业技术研发能力及丰…

IP地址在广告行业中的重要地位

新时代&#xff0c;广告已经成为了企业推广产品的必要手段&#xff0c;而企业想要广告效果好&#xff0c;就要做到精准投放营销广告&#xff0c;将“花钱”的广告精准送到产品的受众用户面前&#xff0c;让收益大于花销&#xff0c;而归根究底就是广告转化率与回报率是否达到预…

SwiftUI中TabView的基本用法及外观样式设置

TabView提供了一个交互式界面&#xff0c;允许用户在其内部的子界面间自由的切换&#xff0c;TabView有两种显示模式&#xff0c;一个是DefaultTabViewStyle&#xff0c;另一个是PageTabViewStyle&#xff0c;本文将对DefaultTabViewStyle这种类型的基本使用和外观样式设置进行…

Android消息机制回顾(Handler、Looper、MessageQueue源码解析)

回顾&#xff1a; Android消息机制 Android消息机制主要指的是Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作机制。 介绍 通过Handler 消息机制来解决线程之间通信问题&#xff0c;或者用来切换线程。特别是在更新UI界面时&#xff0c;确保了线程间的数…

Swift使用JSONDecoder处理json数据,实现json序列化和反序列化

Json数据处理是开发中不可获取的一项技能&#xff0c;如果你不会处理json数据&#xff0c;那你离失业就不远了&#xff0c;所以学完了swift基础教程&#xff0c;还是先老老实实学习一下json处理吧&#xff0c;有了这项技能&#xff0c;你才可以继续下一个网络请求阶段的开发&am…

C++第二十弹---深入理解STL中vector的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…

类和对象(上)【有关类的全面学习】【this指针的学习】

类和对象&#xff08;上&#xff09; 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C语言注重过程&#xff1a; C是基于面向对象的&#xff0c;关注的是对象&#xff0…

如何获取某个城市或区域的人口分布数据?

人口分布数据在多个领域都扮演着至关重要的角色。这些数据不仅反映了一个国家或地区的人口分布状况&#xff0c;而且为政策制定者、企业决策者和研究者提供了宝贵的信息。那么&#xff0c;我们如何获取这些重要的人口分布数据呢&#xff1f; 政府统计部门是最主要的来源。各国政…

绝缘鞋计量校准周期多长时间合适?校验检测方法是什么?

绝缘鞋的计量校准&#xff0c;通常是应用在电学相关领域&#xff0c;因此也是属于计量校准机构中的电学室管辖的范围&#xff0c;而绝缘鞋为了安全防护&#xff0c;也是采用了绝缘材料&#xff0c;其标准要求耐电压至少在15KV以下&#xff0c;可应用于工频&#xff08;50到60F&…

git 检查用户是否是gitlab用户

背景: 公司代码要从老的git库迁到新的git库&#xff0c;老git库上部分提交用户在新git库上没有&#xff0c;解决方法: 让gitlab不再检查提交用户是否是gitlab用户。具体操作: 去掉下面的勾选&#xff0c;保存配置即可。

天气的雪碧图标(晴天,雨天,雪天,阴天,雾天,多云等)(2024-05-27)

天气的预览图标&#xff0c;可以自行下载&#xff0c;或者在资源中下载高清的

Matlab进阶绘图第57期—带填充纹理的横向柱状图

带填充纹理的横向柱状图是通过在原始横向柱状图的基础上添加不同的纹理得到的&#xff0c;可以很好地解决由于颜色区分不足而导致的对象识别困难问题。 由于Matlab中未提供纹理填充选项&#xff0c;因此需要大家自行设法解决。 本文使用Kesh Ikuma制作的hatchfill2工具&#…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…