Vue3+Elementplus物流订单信息跟踪管理

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

一.功能要求

某电商公司为了方便客服查看用户的订单信息,需开发一个物流订单跟踪体系。要求本体系实现以下功能:
1.启动步伐后进入主界面,显示全部订单信息,效果图所示:

2单击【新增】,可以或许添加订单信息。

【确定】 表格新增一个订单信息
3.【查看】可以或许查看选中行订单详情。
4.【编辑】可以或许修改选中行订单信息。
5.【删除】可以或许删除选中的订单信息。
二.实现的步调

①打开命令提示符,切换到D:\vue目次,在该目次下执行如下命令,创建项目。
yarn create vite OrderInfo  --template vue
项目创建完成后,执行如下命令进入项目目次,启动项目。
cd OrderInfo
yarn
yarn  dev
项目启动后,可以使用URL地点http://127.0.0.1:5173/进行访问。
②使用VS Code编辑器打开D:\vue\OrderInfo目次。
③ 将src\style.css文件中的样式代码全部删除,从而避免项目创建时自带的样式代码影响本案例的实现效果。
④ 安装elementplus
     npm install element-plus --save
    安装sass
    npm install sass --save-dev
⑤在项目中新建index.vue文件,具体代码如下。
  1. <template>
  2.   <div class="box">
  3.     <el-button class="new_btn" type="primary" @click="handleNew">新增</el-button>
  4.     <el-table :data="orderInfo" border style="width: 110%">
  5.       <el-table-column prop="id" label="编号" />
  6.         <el-table-column prop="name" label="商品名称" />
  7.         <el-table-column prop="price" label="价格" />
  8.         <el-table-column prop="orderID" label="所属订单号" />
  9.         <el-table-column prop="descinfo" label="描述" />
  10.       <el-table-column fixed="right" label="操作">
  11.         <template #default="{ row }">
  12.           <el-button type="text" size="small" @click="handleDetail(row)">查看</el-button>
  13.           <el-button type="text" size="small" @click="handleEdit(row)">编辑</el-button>
  14.           <el-button type="text" size="small" @click="handleDel(row)" >删除</el-button >
  15.         </template>
  16.       </el-table-column>
  17.     </el-table>
  18.     <!-- 新建/编辑弹框 -->
  19.     <Dialog
  20.       v-if="dialogShow"
  21.       v-model:dialogShow="dialogShow"
  22.       :rowInfo="rowInfo"
  23.       :title="title"
  24.       :arrayNum="orderInfo.length"
  25.       @addRow="addRow"
  26.       @editRow="editRow"
  27.     />
  28.     <!-- 详情弹窗 -->
  29.     <Detail v-if="detailShow" :rowInfo="rowInfo" @closeDetail="closeDetail" />
  30.   </div>
  31. </template>
  32. <script>
  33. import { reactive, ref, toRefs } from "vue";
  34. import { ElMessageBox } from "element-plus";
  35. import Dialog from "./dialog.vue";
  36. import Detail from "./detail.vue";
  37. export default {
  38.   components: { Dialog, Detail },
  39.   setup() {
  40.     const data = reactive({
  41.       dialogShow: false, // 新增/编辑弹框
  42.       detailShow: false, // 详情弹窗
  43.       rowInfo: {}, // 新增/编辑的数据
  44.       title: "", // 是新建还是修改
  45.       orderInfo: [
  46.         {
  47.           id: 1,
  48.           name: "iphones Max",
  49.           price: 8999,
  50.           orderID:5325781,
  51.           descinfo:"白云的订单",
  52.         },
  53.         {
  54.           id: 2,
  55.             name: "小米10",
  56.             price: 3655,
  57.             orderID:5325782,
  58.             descinfo: "星星的订单",
  59.         },
  60.         {
  61.             id:3,
  62.             name: "华为荣耀",
  63.             price: 6655,
  64.             orderID:5325783,
  65.             descinfo: "月亮的订单",
  66.           },
  67.       ],
  68.     });
  69.     const method = reactive({
  70.       handleNew() {
  71.         data.title = "新增";
  72.         data.rowInfo = {};
  73.         data.dialogShow = true;
  74.       },
  75.       handleDetail(val) {
  76.         data.detailShow = true;
  77.         data.rowInfo = val;
  78.       },
  79.       handleEdit(val) {
  80.         data.title = "修改";
  81.         data.dialogShow = true;
  82.         data.rowInfo = val;
  83.       },
  84.       handleDel(val) {
  85.         ElMessageBox.confirm("你确定删除这个学生的信息吗?", "提示", {
  86.           confirmButtonText: "确认",
  87.           cancelButtonText: "取消",
  88.           type: "warning",
  89.         })
  90.           .then(() => {
  91.             method.handleSure(val);
  92.           })
  93.           .catch(() => {
  94.             // catch error
  95.           });
  96.       },
  97.       handleSure(val) {
  98.         this.dialogVisible = false;
  99.         const index = data.orderInfo.findIndex((item) => item.id === val.id);
  100.         data.orderInfo.splice(index, 1);
  101.       },
  102.       // 添加行
  103.       addRow(val) {
  104.         data.orderInfo.push(val);
  105.       },
  106.       // 编辑行
  107.       editRow(val) {
  108.         let index = data.orderInfo.findIndex(
  109.           (item, index) => item.id === val.id
  110.         );
  111.         data.orderInfo.splice(index, 1, val);
  112.       },
  113.       // 关闭详情弹窗
  114.       closeDetail() {
  115.         data.detailShow = false;
  116.       },
  117.     });
  118.     return { ...toRefs(data), ...method };
  119.   },
  120. };
  121. </script>
  122. <style lang="scss" scoped>
  123. .box {
  124.   padding: 20px;
  125.   margin:20px;
  126.   .new_btn {
  127.     margin-bottom: 10px;
  128.   }
  129.   ::v-deep .el-table__cell {
  130.     text-align: center;
  131.   }
  132. }
  133. </style>
复制代码
⑥在项目中新建dialog.vue文件,具体代码如下。
  1. <template>
  2.     <el-dialog :model-value="true" :title="title" @close="handleClose">
  3.       <el-form
  4.         ref="ruleFormRef"
  5.         :model="formData"
  6.         :rules="rules"
  7.         label-width="120px"
  8.         class="demo-ruleForm"
  9.         :size="formSize"
  10.       >
  11.         <el-form-item label="商品名称:" prop="name">
  12.           <el-input v-model="formData.name"></el-input>
  13.         </el-form-item>
  14.         <el-form-item label="价格:" prop="price">
  15.           <el-input v-model="formData.price"></el-input>
  16.         </el-form-item>
  17.         <el-form-item label="所属订单号:" prop="orderID">
  18.           <el-input v-model="formData.orderID"></el-input>
  19.         </el-form-item>
  20.         <el-form-item label="描述:" prop="descinfo">
  21.           <el-input v-model="formData.descinfo"></el-input>
  22.         </el-form-item>
  23.         <el-form-item>
  24.           <el-button type="primary" @click="submitForm()">确定</el-button>
  25.           <el-button @click="resetForm()">重置</el-button>
  26.         </el-form-item>
  27.       </el-form>
  28.     </el-dialog>
  29.   </template> 
  30.   <script>
  31.   import { reactive, toRefs,  onMounted} from "vue";
  32.   export default {
  33.     props: {
  34.       title: {
  35.         type: String,
  36.         default: "",
  37.       },
  38.       dialogShow: {
  39.         type: Boolean,
  40.         default: false,
  41.       },
  42.       rowInfo: {
  43.         type: Object,
  44.         default() {
  45.           return {};
  46.         },
  47.       },
  48.       arrayNum: {
  49.         type: Number,
  50.         default: 0,
  51.       },
  52.     },
  53.     setup(props, { emit }) {
  54.       const data = reactive({
  55.         dialogFlag: false,
  56.         formData: {},
  57.       });
  58.       const method = reactive({
  59.         // 关闭弹窗
  60.         handleClose() {
  61.           emit("update:dialogShow", false);
  62.         },
  63.         // 重置
  64.         resetForm() {
  65.           data.formData = Object.assign({}, props.rowInfo);
  66.         },
  67.         // 提交表单内容
  68.         submitForm() {
  69.           method.handleClose();
  70.           if (props.rowInfo.name) {
  71.             // 修改
  72.             emit("editRow", data.formData);
  73.           } else {
  74.             // 新增
  75.             data.formData["id"] = props.arrayNum + 1;
  76.             emit("addRow", data.formData);
  77.           }
  78.         },
  79.       });
  80.       onMounted(() => {
  81.         data.formData = Object.assign({}, props.rowInfo);
  82.         data.dialogFlag = props.rowInfo;
  83.       });
  84.       return { ...toRefs(data), ...method };
  85.     },
  86.   };
  87.   </script>
  88.   <style lang="scss" scoped>
  89.   </style>
复制代码
⑦ 在项目中新建detail.vue文件,具体代码如下。
  1. <template>
  2.     <el-dialog :model-value="true" title="详情" @close="handleClose">
  3.       <p>
  4.         <label for="name">商品名称:</label>
  5.         <span id="name"> {
  6.   
  7.   { orderInfo.name }} </span>
  8.       </p>
  9.       <p>
  10.         <label for="price">价格:</label>
  11.         <span id="price"> {
  12.   
  13.   { orderInfo.price }} </span>
  14.       </p>
  15.       <p>
  16.         <label for="orderID">所属订单号:</label>
  17.         <span id="orderID"> {
  18.   
  19.   { orderInfo.orderID }} </span>
  20.       </p>
  21.       <p>
  22.         <label for="descinfo">描述:</label>
  23.         <span id="descinfo"> {
  24.   
  25.   { orderInfo.descinfo }} </span>
  26.       </p>
  27.     </el-dialog>
  28.   </template> 
  29.   <script>
  30.   import { computed, toRefs } from "vue";
  31.   export default {
  32.     props: {
  33.       rowInfo: {
  34.         type: Object,
  35.         default() {
  36.           return {};
  37.         },
  38.       },
  39.     },
  40.     emit: ["closeDetail"],
  41.     setup(props, { emit }) {
  42.       const data = {
  43.         orderInfo: computed(() => props.rowInfo).value,
  44.       };
  45.       const method = {
  46.         handleClose() {
  47.           emit("closeDetail");
  48.         },
  49.       };
  50.       return { ...toRefs(data), ...method };
  51.     },
  52.   };
  53.   </script>
  54.   <style lang="less" scoped>
  55.   </style>
复制代码
⑧修改main.js,具体代码如下:

    1. import { createApp } from "vue"
    2. // 导入 ElementPlus 和 样式文件
    3. import ElementPlus from "element-plus"
    4. import "element-plus/dist/index.css"
    5. import App from "./index.vue"
    6. const app = createApp(App)
    7. // 使用 ElementPlus
    8. app.use(ElementPlus)
    9. app.mount("#app")
    复制代码
三、运行项目

yarn dev



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表