旅游推荐管理系统

代码位置:旅游管理系统: 根据若依模版的一个旅游管理系统 - 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>

总结

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

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值