【原创】Vue项目中各种功能的实现-程序员宅基地

技术标签: ViewUI  移动开发  javascript  

已完成:

  • 后台的管理功能:

这里用的组件是 element-UI  ====> NavMenu  

◆首先是排版 :  

  1 <div class="manage-page fillcontain">
  2     <el-row style="height: 100%;">
  3       <el-col :span="width" style="height: 100%;background-color: #324057;overflow-y:scroll">
  4         <el-menu :default-active="defaultPath" ref='homeMenu' :default-openeds='arr' style="min-height: 100%;" text-color="#ffffff" unique-opened router @select='selectRouter' @close='closeMenu'>
  5           <el-submenu index="1">
  6             <template slot="title">
  7               <i class="el-icon-star-on"></i>
  8               <span>实时管理</span>
  9               <span class="red-dots dot-little" v-show="applyNum>0 || btext.bool || storageSpace"></span>
 10             </template>
 11             <el-submenu index="1-1">
 12               <template slot="title">
 13                 <i class="el-icon-bell"></i>
 14                 <span>实时</span>
 15               </template>
 16               <el-menu-item index="/realTimeStatus">实时状况</el-menu-item>
 17               <el-menu-item index="/baseData">基础数据</el-menu-item>
 18               <el-menu-item index="/GPURealTime">GPU实时统计</el-menu-item>
 19             </el-submenu>
 20             <el-submenu index="1-2" v-if="is_administrator">
 21               <template slot="title">
 22                 <i class="el-icon-time"></i>
 23                 <span>主机部署</span>
 24               </template>
 25               <el-menu-item index="/hostScan">主机扫描</el-menu-item>
 26             </el-submenu>
 27             <el-submenu index="1-3">
 28               <template slot="title">
 29                 <i class="el-icon-plus"></i>
 30                 <span>设备管理</span>
 31                 <span class="red-dots dot-little" v-show="btext.bool || storageSpace"></span>
 32               </template>
 33               <el-menu-item index="/deviceList">设备列表</el-menu-item>
 34               <el-menu-item index="/hostList">主机列表
 35                 <span class="red-dots " v-show="btext.bool">{
     {btext.num}}</span>
 36               </el-menu-item>
 37               <el-menu-item index="/modelList">模板列表</el-menu-item>
 38               <el-menu-item index="/spaceList">存储空间列表
 39                 <span class="red-dots" v-show="storageSpace>0">{
     {storageSpace}}</span>
 40               </el-menu-item>
 41               <el-menu-item index="/priceList">价格列表</el-menu-item>
 42               <el-menu-item index="/networkAgent">网络代理列表</el-menu-item>
 43             </el-submenu>
 44             <el-submenu index="1-4">
 45               <template slot="title">
 46                 <i class="el-icon-goods"></i>
 47                 <span>市场管理</span>
 48                 <span class="red-dots dot-little" v-show="workerOrderApply>0"></span>
 49               </template>
 50               <el-menu-item index="/serviceList">服务列表</el-menu-item>
 51               <el-menu-item index="/workOrderList">工单列表
 52                 <span class="red-dots" v-show="workerOrderApply>0">{
     {workerOrderApply}}</span>
 53               </el-menu-item>
 54               <el-menu-item index="/createWorkOrder">创建工单</el-menu-item>
 55               <el-menu-item index="/AISoundCode">AI 源码列表</el-menu-item>
 56             </el-submenu>
 57             <el-submenu index="1-5">
 58               <template slot="title">
 59                 <i class="el-icon-printer"></i>
 60                 <span>财务管理</span>
 61                 <span class="red-dots dot-little" v-show="billingApply>0"></span>
 62               </template>
 63               <el-menu-item index="/invoiceProcessing">发票管理
 64                 <span class="red-dots" v-show="billingApply>0">{
     {billingApply}}</span>
 65               </el-menu-item>
 66               <el-menu-item index="/rechargeInfo">收入管理</el-menu-item>
 67               <el-menu-item index="/expenditure">支出管理</el-menu-item>
 68               <el-menu-item index="/systemPresented">系统赠送</el-menu-item>
 69             </el-submenu>
 70             <el-submenu index="1-6">
 71               <template slot="title">
 72                 <i class="el-icon-user-solid"></i>
 73                 <span>用户管理</span>
 74               </template>
 75               <el-menu-item index="/userInfo">用户列表</el-menu-item>
 76               <el-menu-item index="/wxUserList">微信用户列表</el-menu-item>
 77             </el-submenu>
 78             <el-submenu index="1-7">
 79               <template slot="title">
 80                 <i class="el-icon-share"></i>
 81                 <span>推广管理</span>
 82                 <span class="red-dots dot-little" v-show="(ambassadorApply>0 || withdrawApply>0)"></span>
 83               </template>
 84               <el-menu-item index="/recommendApply">推广申请
 85                 <span class="red-dots" v-show="ambassadorApply>0">{
     {ambassadorApply}}</span>
 86               </el-menu-item>
 87               <el-menu-item index="/withdrawApply">提现申请
 88                 <span class="red-dots" v-show="withdrawApply>0">{
     {withdrawApply}}</span>
 89               </el-menu-item>
 90               <el-menu-item index="/recommendList">推广信息列表</el-menu-item>
 91             </el-submenu>
 92             <el-submenu index="1-8">
 93               <template slot="title">
 94                 <i class="el-icon-edit"></i>
 95                 <span>活动管理</span>
 96               </template>
 97               <el-menu-item index="/discountList">折扣列表</el-menu-item>
 98               <el-menu-item index="/activityList">活动列表</el-menu-item>
 99             </el-submenu>
100             <el-submenu index="1-9">
101               <template slot="title">
102                 <i class="el-icon-news"></i>
103                 <span>公告管理</span>
104               </template>
105               <el-menu-item index="/notice">公告列表</el-menu-item>
106             </el-submenu>
107             <el-submenu index="1-10" v-if="is_administrator">
108               <template slot="title">
109                 <i class="el-icon-setting"></i>
110                 <span>权限管理</span>
111               </template>
112               <el-menu-item index="/userRole">角色列表</el-menu-item>
113               <el-menu-item index="/permission">权限列表</el-menu-item>
114               <el-menu-item index="/role">角色管理</el-menu-item>
115             </el-submenu>
116           </el-submenu>
117           <el-submenu index="2">
118             <template slot="title">
119               <i class="el-icon-document"></i>
120               <span>统计分析</span>
121             </template>
122             <el-submenu index="2-1">
123               <template slot="title">
124                 <i class="el-icon-document"></i>
125                 <span>设备使用情况</span>
126               </template>
127               <el-menu-item index="/equipData">GPU 租用总量总计</el-menu-item>
128               <el-menu-item index="/GPUAvailability">GPU 利用率统计</el-menu-item>
129               <el-menu-item index="/GPUUsed">GPU 使用分时统计</el-menu-item>
130               <el-menu-item index="/GPURent">GPU 租用采样统计</el-menu-item>
131               <el-menu-item index="/GPUUtilizationHeap">GPU 利用率堆积图</el-menu-item>
132               <el-menu-item index="/GPURentBenefit">GPU 租用效益统计</el-menu-item>
133               <!-- <el-menu-item index="/occupancyAnalysis">租用量分析</el-menu-item>
134               <el-menu-item index="/rentalFeeAnalysis">租赁费分析</el-menu-item> -->
135               <!-- <el-menu-item index="/rentalBenefitAnalysis">租用效益分析</el-menu-item> -->
136             </el-submenu>
137             <el-submenu index="2-2">
138               <template slot="title">
139                 <i class="el-icon-document"></i>
140                 <span>用户基本情况</span>
141               </template>
142               <el-menu-item index="/userGrow">用户增长统计</el-menu-item>
143               <el-menu-item index="/userRegister">用户注册时间分布</el-menu-item>
144               <el-menu-item index="/userInformat">用户活跃量统计</el-menu-item>
145               <el-menu-item index="/useTime">使用时长统计</el-menu-item>
146               <el-menu-item index="/userAttribute">用户属性统计</el-menu-item>
147               <el-menu-item index="/visitor">用户排行榜</el-menu-item>
148               <el-menu-item index="/visitStatistics">网站访问统计</el-menu-item>
149             </el-submenu>
150             <el-submenu index="2-7">
151               <template slot="title">
152                 <i class="el-icon-pie-chart"></i>
153                 <span>用户分布统计</span>
154               </template>
155               <el-menu-item index="/provinceStatistics">省份人数分布</el-menu-item>
156               <el-menu-item index="/cityStatistics">城市人数分布</el-menu-item>
157               <el-menu-item index="/schoolStatistics">学校人数分布</el-menu-item>
158             </el-submenu>
159             <el-submenu index="2-3">
160               <template slot="title">
161                 <i class="el-icon-document"></i>
162                 <span>用户 GPU 利用率</span>
163               </template>
164               <el-menu-item index="/rankingList">用户 GPU 利用率排行榜</el-menu-item>
165             </el-submenu>
166             <el-submenu index="2-4">
167               <template slot="title">
168                 <i class="el-icon-document"></i>
169                 <span>用户消费情况</span>
170               </template>
171               <el-menu-item index="/userExpense">消费类型统计</el-menu-item>
172               <el-menu-item index="/mainframeLease">主机租赁统计</el-menu-item>
173               <el-menu-item index="/incrementService">增值服务统计</el-menu-item>
174               <el-menu-item index="/ticketsUsed">消费券使用记录</el-menu-item>
175               <el-menu-item index="/codeList">AI 源码用户购买列表</el-menu-item>
176             </el-submenu>
177             <el-submenu index="2-5">
178               <template slot="title">
179                 <i class="el-icon-document"></i>
180                 <span>用户充值情况</span>
181               </template>
182               <el-menu-item index="/userRecharge">用户充值额统计</el-menu-item>
183               <el-menu-item index="/userRechargeType">用户充值渠道统计</el-menu-item>
184             </el-submenu>
185             <el-submenu index="2-6">
186               <template slot="title">
187                 <i class="el-icon-document"></i>
188                 <span>公司收支分析</span>
189               </template>
190               <el-menu-item index="/comparative">收支对比</el-menu-item>
191               <el-menu-item index="/income">收入统计</el-menu-item>
192               <el-menu-item index="/expenditureTow">支出统计</el-menu-item>
193             </el-submenu>
194           </el-submenu>
195           <el-submenu index='3'>
196             <template slot="title">
197               <i class="el-icon-s-promotion"></i>
198               <span>直达</span>
199             </template>
200             <!-- <el-menu-item index="/nonstop">快捷方式设置</el-menu-item> -->
201             <el-menu-item v-for='(item,index) in urlList' :index="`3-${index}`" :route="{path:item.nav_url,query:{copy:1}}" :key="index">{
     {item.nav_name}}</el-menu-item>
202           </el-submenu>
203         </el-menu>
204       </el-col>
205       <el-col :span="(24-width)" style="height: 100%">
206         <head-top v-on:changeMenu='openAMenu'></head-top>
207         <div class="content">
208           <keep-alive>
209             <router-view></router-view>
210           </keep-alive>
211           <div class="scrollbar"></div>
212         </div>
213       </el-col>
214     </el-row>
215   </div>
排版

◆消息提示:

小红点样式

.red-dots {
    display: inline-block;
    color: white;
    vertical-align: middle;
    margin-left: 5px;
    margin-top: -2px;
    width: 22px;
    height: 22px;
    line-height: 22px;
    text-align: center;
    border-radius: 15px;
    font-size: 10px;
    background-color: rgb(206, 43, 43);
  }

如何实现小红点的判断:

1 <template slot="title">
2                 <i class="el-icon-plus"></i>
3                 <span>设备管理</span>
4                 <span class="red-dots dot-little" v-show="btext.bool || storageSpace"></span>
5 </template>

 

 路由跳转

1 <el-menu-item index="/userExpense">消费类型统计</el-menu-item>
2               <el-menu-item index="/mainframeLease">主机租赁统计</el-menu-item>
3               <el-menu-item index="/incrementService">增值服务统计</el-menu-item>
4               <el-menu-item index="/ticketsUsed">消费券使用记录</el-menu-item>
5               <el-menu-item index="/codeList">AI 源码用户购买列表</el-menu-item>
路由跳转

 

  • 顶部导航栏功能的实现(后台)

排版代码:

 1 <template>
 2     <div class="header-container">
 3     <el-breadcrumb separator="/">
 4       <el-breadcrumb-item :to="{ path: '/manage' }">首页</el-breadcrumb-item>
 5       <el-breadcrumb-item v-for="item in $route.meta" :key="item.index">
 6         <span :class="{'is-link':item.index!==undefined}" @click="openMenu(item.index)">{
     {item.name}}</span>
 7       </el-breadcrumb-item>
 8     </el-breadcrumb>
 9         <div class="userInfo-box">
10       <template v-if="canAdd!==null">
11         <el-button class="addNonstop" size="small" type="primary" @click="setShortcut('post')" v-if="canAdd===1">添加直达</el-button>
12         <el-button class="addNonstop" size="small" type="warning" @click="setShortcut('delete')" v-if="canAdd===0">取消直达</el-button>
13       </template>
14             <img src='../assets/default.jpg' class="avator">
15             <ul class="userInfo">
16                 <li>{
     {username}}</li>
17                 <li>|</li>
18                 <li @click="loginOut">退出</li>
19             </ul>
20         </div>
21     </div>
22 </template>
排版代码

 

子组件向父组件传路由值

1 <el-breadcrumb-item v-for="item in $route.meta" :key="item.index">
2         <span :class="{'is-link':item.index!==undefined}" @click="openMenu(item.index)">{
    {item.name}}</span>
3       </el-breadcrumb-item>
1 openMenu(index){
2       if(index){
3         this.$emit('changeMenu',index);  //$emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数
4       }
5     }

父组件获取路由值

1 <head-top v-on:changeMenu='openTheMenu'></head-top>
//打开指定菜单
    openTheMenu(index) {
      this.$refs["homeMenu"].open(index);
    }

 

  • 订单查询功能(后台)

整个页面:

  1 <script>
  2 import Utils from "@/utils/utils";
  3 import { createNamespacedHelpers } from 'vuex'
  4 const { mapState, mapActions } = createNamespacedHelpers('financial')
  5 export default {
  6   data() {
  7     return {
  8       showPagination: false,
  9       pickerBeginDateBefore: {
 10         disabledDate: time => {
 11           if (this.end_date) {
 12             return (
 13               time.getTime() > this.end_date || time.getTime() > Date.now()
 14             );
 15           }
 16         }
 17       },
 18       pickerBeginDateAfter: {
 19         disabledDate: time => {
 20           if (this.begin_date) {
 21             return (
 22               time.getTime() < this.begin_date || time.getTime() > Date.now()
 23             );
 24           }
 25         }
 26       },
 27       origin_list: [
 28         "全部",
 29         "后台-淘宝-易学智能",
 30         "后台-淘宝-GPU远程租用",
 31         "平台-支付宝",
 32         "后台-淘宝充值",
 33         "后台-银行公账-深圳兴导",
 34         '后台-银行公账-湖南兴导',
 35         "后台-淘宝-国科机房",
 36         '平台-微信'
 37       ],
 38       time_list: [
 39         { name: "本日", val: "today" },
 40         { name: "本周", val: "this_week" },
 41         { name: "本月", val: "this_month" },
 42         { name: "上月", val: "last_month" },
 43         { name: "日期范围", val: "date_range" }
 44       ],
 45       add_list: [{
 46         name:"全部",
 47         id:0
 48       },{
 49         name:"充值",
 50         id:1
 51       },{
 52         name:"快递费",
 53         id:5
 54       },{
 55         name:"增值服务",
 56         id:6
 57       }],
 58       origin: 0,
 59       add_type: 0,
 60       time_type: "today",
 61       begin_date: new Date(2018,10,15),
 62       end_date: new Date(),
 63       total_data: {
 64         total: 0
 65       },
 66       table_loading: false,
 67       page_size: 20,
 68       order_by: null,
 69       order: null,
 70       input:null,
 71       order_number:null
 72     };
 73   },
 74   watch: {
 75     $route(to, from) {
 76       if (to.path === "/rechargeInfo" && from.path !== "/userDetails") {
 77         this.total_data = {};
 78         this.origin=0;
 79         this.add_type=0;
 80         this.time_type="today";
 81         this.begin_date=new Date(2018,10,15);
 82         this.end_date=new Date();
 83         this.showPagination = false;
 84         this.order = null;
 85         this.order_by = null;
 86         this.search(1);
 87       }
 88     }
 89   },
 90   created() {
 91     this.search(1);
 92   },
 93   methods: {
 94     ...mapActions(["rechargeListAPI", "downloadRechargeAPI"]),
 95     //分页
 96     changePage(value) {
 97       this.search(value);
 98       this.$refs['pageTwo'].internalCurrentPage = this.$refs['pageOne'].internalCurrentPage;//绑定页数
 99     },
100     changePageTwo(value){
101       this.search(value);
102       this.$refs['pageOne'].internalCurrentPage = this.$refs['pageTwo'].internalCurrentPage;
103     },
104     //排序
105     sortMethod(){
106       this.order_by = 'add_time';
107       this.order = this.order === 'desc'? 'asc': 'desc';
108       this.showPagination=false;
109       this.search(1);
110     },
111     //进入用户详情
112     searchOne(id) {
113       this.$router.push({ path: "userDetails?id=" + id, replace: true });
114     },
115     //查询充值明细
116     search(page) {
117       if (!Utils.checkToken(this)) return;
118       if(this.time_type==='date_range'&&(!this.begin_date||!this.end_date)){
119         return this.$message.error('请选择时间!');
120       }
121       this.table_loading = true;
122       this.rechargeListAPI({
123         origin: this.origin,
124         time_type: this.time_type,
125         add_type: this.add_type,
126         begin_date: Utils.formatDate(this.begin_date, "yyyy-MM-dd"),
127         end_date: Utils.formatDate(this.end_date, "yyyy-MM-dd"),
128         page: page,
129         page_size: this.page_size,
130         order_by: this.order_by,
131         order: this.order,
132         order_number:this.order_number
133       }).then(
134         ({body}) => {
135           this.total_data = body;
136           this.table_loading = false;
137           this.showPagination = true;
138         },
139         err => {
140           this.table_loading = false;
141           this.showPagination = true;
142           this.$message.error(err.msg);
143         }
144       );
145     },
146     //下载明细单
147     download(page) {
148       if (!Utils.checkToken(this)) return;
149       const loading = this.$loading();
150       this.downloadRechargeAPI({
151         origin: this.origin,
152         time_type: this.time_type,
153         add_type: this.add_type,
154         begin_date: Utils.formatDate(this.begin_date, "yyyy-MM-dd"),
155         end_date: Utils.formatDate(this.end_date, "yyyy-MM-dd"),
156         order: this.order,
157         order_by: this.order_by,
158       }).then(
159         res => {
160           loading.close();
161           const blob = res.data;
162           const fileName = decodeURI(res.headers.map["content-disposition"][0].split(";")[1].split("=")[1]) || '易学智能-充值明细单.xlsx';
163           if ("download" in document.createElement("a")) {
164             // 非IE下载
165             const elink = document.createElement("a");
166             elink.download = fileName;
167             elink.style.display = "none";
168             elink.href = URL.createObjectURL(blob);
169             document.body.appendChild(elink);
170             elink.click();
171             URL.revokeObjectURL(elink.href); // 释放URL 对象
172             document.body.removeChild(elink);
173           } else {
174             // IE10+下载
175             navigator.msSaveBlob(blob, fileName);
176           }
177          },
178         err => {
179           loading.close();
180           this.$message.error(err.msg);
181         }
182       );
183     },
184     //订单号获得焦点事件  //zcg
185     focus(){
186       this.time_type ='date_range'
187       this.search(1);
188     },
189     //订单号change事件
190     changeInput(value){
191       this.order_number =value
192       this.search(1);
193     }
194   }
195 };
196 </script>
197 <template>
198   <div>
199     <p class="title title-primary">充值明细查询</p>
200     <el-form label-width="100px" label-position="left">
201       <el-form-item label="来源:">
202         <el-radio-group v-model="origin" @change="showPagination=false,search(1)">
203           <el-radio v-for='(item,index) in origin_list' :key="index" :label="index">{
     {item}}</el-radio>
204         </el-radio-group>
205       </el-form-item>
206       <el-form-item label="充值类型:">
207         <el-radio-group v-model="add_type" @change="showPagination=false,search(1)">
208           <el-radio v-for='(item,index) in add_list' :key="index" :label="item.id">{
     {item.name}}</el-radio>
209         </el-radio-group>
210       </el-form-item>
211       <el-form-item label="时间类型:">
212         <el-radio-group v-model="time_type" @change="showPagination=false,search(1)">
213           <el-radio v-for='(item,index) in time_list' :key="index" :label="item.val">{
     {item.name}}</el-radio>
214         </el-radio-group>
215       </el-form-item>
216       <el-form-item label="起始日期:" v-show="time_type==='date_range'">
217         <el-date-picker v-model="begin_date" type="date" placeholder="开始时间" format="yyyy-MM-dd" :picker-options="pickerBeginDateBefore">
218         </el-date-picker>
219         <el-date-picker v-model="end_date" type="date" placeholder="结束时间" format="yyyy-MM-dd" :picker-options="pickerBeginDateAfter">
220         </el-date-picker>
221         <el-button type="primary" @click="showPagination=false,search(1)">查询记录</el-button>
222       </el-form-item>
223       <el-form-item  label="订单号:" class="nav-btns nav-input">
224         <el-input  placeholder="输入订单号"  clearable v-model="input" @focus="focus"   @input="changeInput"></el-input>
225       </el-form-item>
226       <el-form-item>
227         <el-button type="warning" @click="download">全部下载</el-button>
228       </el-form-item>
229     </el-form>
230     <el-pagination ref='pageOne' v-if="showPagination" :page-size="page_size" background layout="total,prev, pager, next" :total='total_data.total' @current-change="changePage"></el-pagination>
231     <el-table :data="total_data.data" v-loading="table_loading">
232         <el-table-column label="序号" type="index" width="100px">
233         </el-table-column>
234         <el-table-column label="用户名" prop="user_name">
235             <template slot-scope="scope">
236             <span @click="searchOne(scope.row.uid)" class="font-jump">{
     {scope.row.user_name}}</span>
237           </template>
238         </el-table-column>
239         <el-table-column label="充值时间" prop="add_time">
240           <template slot="header" slot-scope="scope">
241             <span @click="sortMethod('add_time')">充值时间
242               <i class="el-icon-sort" v-if="order_by!='add_time'"></i>
243               <template v-else>
244                 <i class="el-icon-sort-down" v-if="order =='desc'"></i>
245                 <i class="el-icon-sort-up" v-else></i>
246               </template>
247             </span>
248           </template>
249         </el-table-column>
250         <el-table-column label="订单号">
251             <template slot-scope="scope">
252                 <p>{
     {scope.row.order_number?scope.row.order_number:'无'}}</p>
253             </template>
254         </el-table-column>
255         <el-table-column label="来源" prop="origin">
256         </el-table-column>
257         <el-table-column label="备注">
258             <template slot-scope="scope">
259                 <p>{
     {scope.row.comment?scope.row.comment:'无'}}</p>
260             </template>
261         </el-table-column>
262         <el-table-column label="充值金额(元)" prop="receipt_amount">
263         </el-table-column>
264         <el-table-column label="操作人" prop="admin_username">
265         </el-table-column>
266     </el-table>
267     <el-pagination ref='pageTwo' v-if="showPagination" :page-size="page_size" background layout="total,prev, pager, next" :total='total_data.total' @current-change="changePageTwo"></el-pagination>
268   </div>
269 </template>
整个查询页面

排版:

1  <el-form-item  label="订单号:" class="nav-btns nav-input">
2         <el-input  placeholder="输入订单号"  clearable v-model="input" @focus="focus"   @input="changeInput"></el-input>
3  </el-form-item>
4  <el-form-item>
5         <el-button type="warning" @click="download">全部下载</el-button>
6  </el-form-item

功能的实现:

 1 1 focus(){
 2  2       this.time_type ='date_range'
 3  3       this.search(1);
 4  4     },
 5  5     //订单号change事件
 6  6     changeInput(value){
 7  7       this.order_number =value
 8  8       this.search(1);
 9  9     }
10 10   }

查询时间:

 1 search(page) {
 2       if (!Utils.checkToken(this)) return;
 3       if(this.time_type==='date_range'&&(!this.begin_date||!this.end_date)){
 4         return this.$message.error('请选择时间!');
 5       }
 6       this.table_loading = true;
 7       this.rechargeListAPI({
 8         origin: this.origin,
 9         time_type: this.time_type,
10         add_type: this.add_type,
11         begin_date: Utils.formatDate(this.begin_date, "yyyy-MM-dd"),
12         end_date: Utils.formatDate(this.end_date, "yyyy-MM-dd"),
13         page: page,
14         page_size: this.page_size,
15         order_by: this.order_by,
16         order: this.order,
17         order_number:this.order_number
18       }).then(
19         ({body}) => {
20           this.total_data = body;
21           this.table_loading = false;
22           this.showPagination = true;
23         },
24         err => {
25           this.table_loading = false;
26           this.showPagination = true;
27           this.$message.error(err.msg);
28         }
29       );
30     },

下载明细文件:

 1 download(page) {
 2       if (!Utils.checkToken(this)) return;
 3       const loading = this.$loading();
 4       this.downloadRechargeAPI({
 5         origin: this.origin,
 6         time_type: this.time_type,
 7         add_type: this.add_type,
 8         begin_date: Utils.formatDate(this.begin_date, "yyyy-MM-dd"),
 9         end_date: Utils.formatDate(this.end_date, "yyyy-MM-dd"),
10         order: this.order,
11         order_by: this.order_by,
12       }).then(
13         res => {
14           loading.close();
15           const blob = res.data;
16           const fileName = decodeURI(res.headers.map["content-disposition"][0].split(";")[1].split("=")[1]) || '易学智能-充值明细单.xlsx';
17           if ("download" in document.createElement("a")) {
18             // 非IE下载
19             const elink = document.createElement("a");
20             elink.download = fileName;
21             elink.style.display = "none";
22             elink.href = URL.createObjectURL(blob);
23             document.body.appendChild(elink);
24             elink.click();
25             URL.revokeObjectURL(elink.href); // 释放URL 对象
26             document.body.removeChild(elink);
27           } else {
28             // IE10+下载
29             navigator.msSaveBlob(blob, fileName);
30           }
31          },
32         err => {
33           loading.close();
34           this.$message.error(err.msg);
35         }
36       );
37     },
View Code

 

  1 const state = {
  2     billingList:{},
  3     billingOrders:{}
  4 }
  5 
  6 const actions = {
  7     /* 发票管理 */
  8     //开票待处理、已开票、已拒绝列表
  9     async billingInfoAPI({dispatch,commit},query) {
 10         return await dispatch('callingInterface',{
 11             request_method:'get',
 12             API_url:'gpu_admin/finance/bill/apply_list',
 13             query:{
 14                 params:query
 15             },
 16             callback:({body})=>{
 17                 commit('setState',{
 18                     childName:'financial',
 19                     name:'billingList',
 20                     val:body
 21                 },{root:true})
 22             }
 23         },{root:true})
 24     },
 25     //开票相关订单信息
 26     async billingOrdersInfoAPI({dispatch,commit},query) {
 27         return await dispatch('callingInterface',{
 28             request_method:'get',
 29             API_url:'gpu_admin/finance/bill/order_list',
 30             query:{
 31                 params:query
 32             },
 33             callback:({body})=>{
 34                 commit('setState',{
 35                     childName:'financial',
 36                     name:'billingOrders',
 37                     val:body
 38                 },{root:true})
 39             }
 40         },{root:true})
 41     },
 42     //开票完成信息提交
 43     async billingCompleteAPI({dispatch},query) {
 44         return await dispatch('callingInterface',{
 45             request_method:'post',
 46             API_url:'gpu_admin/finance/bill/dealt',
 47             query:query
 48         },{root:true})
 49     },
 50     //发票数据总计
 51     async billingAmountAPI({dispatch}) {
 52         return await dispatch('callingInterface',{
 53             request_method:'get',
 54             API_url:'gpu_admin/finance/billinfo'
 55         },{root:true})
 56     },
 57 
 58     /* 充值明细 */
 59     //充值明细记录
 60     async rechargeListAPI({dispatch},query) {
 61         return await dispatch('callingInterface',{
 62             request_method:'get',
 63             API_url:'gpu_admin/finance/recharge_list',
 64             query:{
 65                 params:query
 66             }
 67         },{root:true})
 68     },
 69     //下载充值明细
 70     async downloadRechargeAPI({dispatch},query) {
 71         return await dispatch('callingInterface',{
 72             request_method:'get',
 73             API_url:'gpu_admin/finance/recharge_list_excel',
 74             query:{
 75                 headers:{'Content-Type':'application/ms-excel'},
 76                 responseType:'blob',
 77                 params:query,
 78             }
 79         },{root:true})
 80     },
 81 
 82     /* 系统赠送 */
 83     //系统赠送明细记录
 84     async presentedListAPI({dispatch},query) {
 85         return await dispatch('callingInterface',{
 86             request_method:'get',
 87             API_url:'gpu_admin/finance/syspresented_list',
 88             query:{
 89                 params:query
 90             }
 91         },{root:true})
 92     },
 93     //下载系统赠送明细
 94     async downloadPresentedAPI({dispatch},query) {
 95         return await dispatch('callingInterface',{
 96             request_method:'get',
 97             API_url:'gpu_admin/finance/syspresented_list_excel',
 98             query:{
 99                 headers:{'Content-Type':'application/ms-excel'},
100                 responseType:'blob',
101                 params:query
102             }
103         },{root:true})
104     },
105     //支出信息
106     async expenditureAPI({dispatch},query) {
107         return await dispatch('callingInterface',{
108             request_method:'get',
109             API_url:'gpu_admin/and_payments/expenditure',
110             query:{
111                 params:query
112             },
113             flag : true
114         },{root:true})
115     },
116     //添加支出
117     async expenditureAddAPI({dispatch},query) {
118         return await dispatch('callingInterface',{
119             request_method:'post',
120             API_url:'gpu_admin/and_payments/expenditure',
121             query:query
122         },{root:true})
123     },
124     //用户名列表  
125     async usernamelistAPI({dispatch},query) {
126         return await dispatch('callingInterface',{
127             request_method:'get',
128             API_url:'gpu_admin/usernamelist',
129             query:{
130                 params:query
131             }
132         },{root:true})
133     },
134     //用户充值记录
135     async add_money_logAPI({dispatch},query) {
136         return await dispatch('callingInterface',{
137             request_method:'get',
138             API_url:'gpu_admin/and_payments/add_money_log',
139             query:{
140                 params:query
141             }
142         },{root:true})
143     },
144     
145 
146     //财务管理
147 
148     //收入信息 -充值信息
149     async incomeAPI({dispatch},query) {
150         return await dispatch('callingInterface',{
151             request_method:'get',
152             API_url:'gpu_admin/finance/income',
153             query:{
154                 params:query
155             }
156         },{root:true})
157     },
158 
159     //收入信息 -充值信息
160     async incomegraphAPI({dispatch},query) {
161         return await dispatch('callingInterface',{
162             request_method:'get',
163             API_url:'gpu_admin/finance/incomegraph',
164             query:{
165                 params:query
166             }
167         },{root:true})
168     },
169 
170     //收入每日/周/月信息
171     async incomedetailAPI({dispatch},query) {
172         return await dispatch('callingInterface',{
173             request_method:'get',
174             API_url:'gpu_admin/finance/incomedetail',
175             query:{
176                 params:query
177             }
178         },{root:true})
179     },
180 
181 }
182 
183 export default{
184     namespaced:true,
185     state,
186     actions
187 }
财政接口代码

调用接口JS代码:

 1 callingInterface({},{request_method,API_url,query,flag,callback}){
 2     //请求地址+API
 3     const url = localhost + API_url;
 4     //是否开启emulateJSON  
 5     const is_flag = flag!==undefined ? flag : false;
 6     //回调函数,处理提交mutaion修改state的操作
 7     const callMethod = callback!==undefined ? callback : (()=>{});
 8     console.log('请求传入参数query:', query)
 9 
10     return new Promise((resolve, reject) => {
11       Vue.http[request_method](url, query ,{
12         emulateJSON: is_flag
13       }).then(res => {
14         resolve(res);
15         callMethod(res);
16         console.log('请求成功:', res);
17       }, err => {
18         console.log('请求失败:', err)
19         reject(err.body)
20       })
21     })
22   },

 点击按钮查询不同的数据(利用v-model的双向绑定原理和v-on:change事件)

 1 <el-form-item label="来源:">
 2     <el-radio-group v-model="origin" @change="showPagination=false,search(1)">
 3           <el-radio v-for='(item,index) in origin_list' :key="index" :label="index">{
    {item}}</el-radio>
 4     </el-radio-group>
 5 </el-form-item>
 6 <el-form-item label="充值类型:">
 7    <el-radio-group v-model="add_type" @change="showPagination=false,search(1)">
 8           <el-radio v-for='(item,index) in add_list' :key="index" :label="item.id">{
    {item.name}}</el-radio>
 9    </el-radio-group>
10 </el-form-item>
11 <el-form-item label="时间类型:">
12    <el-radio-group v-model="time_type" @change="showPagination=false,search(1)">
13           <el-radio v-for='(item,index) in time_list' :key="index" :label="item.val">{
    {item.name}}</el-radio>
14    </el-radio-group>
15 </el-form-item>

 

 

 根据路由传值完成不同的详情页面:

 

在其他页面传值后跳转到详情页面

 

点击用户名 触发事件:

<el-table-column label="用户名">
          <template slot-scope="scope">
            <span @click="searchOne(scope.row.uid)" class="font-jump">{
    {scope.row.username}}</span> //点击触发查询事件
          </template>
</el-table-column>

查询事件:

searchOne(id) {
      this.$router.push({path:'userDetails?id='+id,replace:true});//路由就变成了详情页并且带id
    }

详情页面的获取信息功能:

1 getUserDetails(){
2       this.uid = this.$route.query.id;// 根据路由ID的不同,返回不同的数据
3       this.getUserInfo();
4       this.getExtraInfo();
5       this.getExpenseInfo();
6 },

getUserInfo:

 1  getUserInfo() {
 2       if (!Utils.checkToken(this)) return;
 3       this.pageLoading = true;
 4       this.userInfoDetailsAPI({//通过API接口获取数据
 5       uid: this.uid
 6       }).then(
 7         ({body}) => {
 8           this.pageLoading = false;
 9           this.sendData = Object.assign(this.sendData,{user_name:body.user_name,balance:body.balance})
10           this.userInfo = body;
11         },
12         err => {
13           this.pageLoading = false;
14           this.$message.error(err.msg);
15         }
16       );
17     }

监听:

 1 watch: {
 2     $route(to, from) {
 3       if (to.path === "/userDetails") {
 4         this.showPagination = false;
 5         this.record_type= 'expenseRecord';
 6         this.record_son_type= 0;
 7         this.pageInfo={
 8           page:1,
 9           page_size:10
10         };
11         this.date= [Utils.formatDate(new Date("2018/11/15"), "yyyy-MM-dd"), Utils.formatDate(new Date(), "yyyy-MM-dd")];
12         this.userInfo = {}
13         this.extraInfo = {}
14         this.expenseInfo = {}
15         this.sendData = {}
16         this.getUserDetails();
17       }
18 }

生命周期钩子函数:

1 created() {
2     this.getUserDetails();
3  },

 

 

  • 点击显示订单详情

 

 利用饿了么组件(不同之处:利用计算属性来获得数据)

 

 1 <el-dialog title="订单信息" :visible.sync="openOrderInfo" width="1000px" center :close-on-click-modal='false'>
 2          <el-table :data="billingOrders.data" border>
 3                 <el-table-column label="序号" type="index" width="100px">
 4                 </el-table-column>
 5                 <el-table-column label="可开票金额(元)" prop="available_bill">
 6                 </el-table-column>
 7                 <el-table-column label="实收金额(元)" prop="receipt_amount">
 8                 </el-table-column>
 9                 <el-table-column label="充值来源" prop="origin">
10                 </el-table-column>
11                 <el-table-column label="订单号" prop="order_number">
12                 </el-table-column>
13                 <el-table-column label="订单类型" prop="order_type">
14                 </el-table-column>
15                 <el-table-column label="充值时间" prop="add_time">
16                 </el-table-column>
17          </el-table>
18 </el-dialog>

 

数据获取(使用了命名空间):

1  import { createNamespacedHelpers } from 'vuex'
2  const { mapState, mapActions } = createNamespacedHelpers('financial')
3 
4  computed:{
5      ...mapState(['billingList','billingOrders'])
6    }

 

命名空间获取billingOrders值:(命名空间:将模块的空间名称字符串作为第一个参数传递给上述函数,这样所有绑定都会自动将该模块作为上下文。)

命名空间: 默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。

 1 async billingOrdersInfoAPI({dispatch,commit},query) {
 2         return await dispatch('callingInterface',{
 3             request_method:'get',
 4             API_url:'gpu_admin/finance/bill/order_list',
 5             query:{
 6                 params:query
 7             },
 8             callback:({body})=>{
 9                 commit('setState',{//到setstate去设置state的值
10                     childName:'financial',//字符串,为了setState可以[""]
11                     name:'billingOrders',//字符串,为了setState可以[""]
12                     val:body
13                 },{root:true})
14             }
15         },{root:true})
16     },

提交到setState:(mutations.js文件)

 1 const mutations = {
 2     //设置state的值
 3     setState(state,{name,val,childName}){
 4         if(childName!==undefined){
 5             state[childName][name] = val
 6         }else{
 7             state[name] = val
 8         }
 9     }
10 }
11 
12 export default{
13     mutations
14 }

 

 

如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。例如:

billingOrders来源:(接口获取)

 1 async billingOrdersInfoAPI({dispatch,commit},query) {
 2         return await dispatch('callingInterface',{
 3             request_method:'get',
 4             API_url:'gpu_admin/finance/bill/order_list',
 5             query:{
 6                 params:query
 7             },
 8             callback:({body})=>{
 9                 commit('setState',{
10                     childName:'financial',
11                     name:'billingOrders',//回调函数
12                     val:body
13                 },{root:true})
14             }
15         },{root:true})
16     },

 

命名来源:(Store下的index.js文件):

 1 import Vue from 'vue'
 2 import Vuex from 'vuex'
 3 
 4 import fooActions from './actions'
 5 import fooMutations from './mutations'
 6 import login from './modules/login'
 7 import realTimeData from './modules/real_time_data'
 8 import deploy from './modules/deploy'
 9 import device from './modules/device'
10 import financial from './modules/financial'
11 import userInfo from './modules/user_info'
12 import recommend from './modules/recommend'
13 import activity from './modules/activity'
14 import userLimit from './modules/user_limit'
15 import recharge from './modules/recharge'
16 import statistics from './modules/statistics'
17 import equipUsageInfo from './modules/equip_usage_info'
18 import userExpenseData from './modules/user_expense_data'
19 import market from './modules/market'
20 import GPUUseRatio from './modules/GPU_use_ratio'
21 import expenses from "./modules/expenses"
22 import userDistribution from "./modules/user_distribution"
23 // import createLogger from '../../../src/plugins/logger'
24 
25 Vue.use(Vuex)
26 const debug = process.env.NODE_ENV !== 'production'
27 
28 const state = {
29   applyData:{},
30   urlList:[]
31 }
32 
33 export default new Vuex.Store({
34   state:state,
35   actions:fooActions.actions,
36   mutations:fooMutations.mutations,
37   modules:{
38     login,
39     realTimeData,
40     deploy,
41     device,
42     financial,
43     userInfo,
44     recommend,
45     activity,
46     userLimit,
47     recharge,
48     statistics,
49     equipUsageInfo,
50     userExpenseData,
51     market,
52     GPUUseRatio,
53     expenses,
54     userDistribution
55   },
56   strict: debug,
57 //   plugins: debug ? [createLogger()] : []
58 })
Store文件夹下的index.js文件

若需要在全局命名空间内分发 action 或提交 mutation,将 { root: true } 作为第三参数传给 dispatch 或 commit 即可。

{root:true}    =====> 若需要在全局命名空间内分发 action 或提交 mutation,将  { root: true } 作为第三参数传给  dispatch 或  commit 即可。  

 未用命名空间:

 1 import { mapActions,mapState } from "vuex"
 2 computed: {
 3 ...mapState({
 4 deploy_status:state=>state.deploy.deploy_status,
 5 status_color:state=>state.deploy.status_color
 6 }),
 7 
 8 methods: {
 9          ...mapActions({
10              deployListAPI:'deploy/deployListAPI',
11              deployServerAPI:'deploy/deployServerAPI'
12     }),

回调接口;

 1 callingInterface({},{request_method,API_url,query,flag,callback}){
 2     //请求地址+API
 3     const url = localhost + API_url;
 4     //是否开启emulateJSON  
 5     const is_flag = flag!==undefined ? flag : false;
 6     //回调函数,处理提交mutaion修改state的操作
 7     const callMethod = callback!==undefined ? callback : (()=>{});
 8     console.log('请求传入参数query:', query)
 9 
10     return new Promise((resolve, reject) => {
11       Vue.http[request_method](url, query ,{
12         emulateJSON: is_flag
13       }).then(res => {
14         resolve(res);
15         callMethod(res); //如果传了callback,就有意义,如果没传callback 就是(){} 空函数,执行了也没效果
16         console.log('请求成功:', res);
17       }, err => {
18         console.log('请求失败:', err)
19         reject(err.body)
20       })
21     })
22   }

 

 

 

  •  画图:  =====>见另一篇博文 Echarts配置
  • 点击按钮触发申请处理表

 

模板代码:

1 <el-table-column label="操作" v-if="status==='apply'" key="t2" width="120">
2         <template slot-scope="scope"> // scope 是v-bind绑定数据(:data)后的固定写法 
3           <el-button @click="openForm(scope.row)" type="primary" size="small">处理</el-button>
4         </template>
5 </el-table-column>

点击事件代码:

 1 //打开处理申请的弹框
 2     openForm(row){
 3       this.formData = Object.assign({
 4         order:null//目标
 5       },{
 6         id:row.e_id,
 7         clearing:row.e_money, 
 8       })
 9       this.openUpdate = true;
10 },

点击后:

 

模板代码:

 1 <el-dialog title="申请处理" :visible.sync="openUpdate" width="400px" center @closed='clearData' :close-on-click-modal='false'>
        //model ====> 表单数据对象 2 <el-form :model="formData" :rules="deal_rules" ref='dealForm' label-width="100px" v-if="formData!==null"> 3 <el-form-item label="提现订单号" prop="order"> 4 <el-input v-model="formData.order"></el-input> 5 </el-form-item> 6 <el-form-item label="提现金额" prop="clearing"> 7 <el-input v-model="formData.clearing"></el-input> 8 </el-form-item> 9 </el-form> 10 <span slot="footer" class="dialog-footer"> 11 <el-button @click="openUpdate = false">取 消</el-button> 12 <el-button type="primary" @click="submitData('dealForm')">确 定</el-button> 13 </span> 14 </el-dialog>

 提交申请:

submitData(name){
      if(!Utils.checkToken(this))return;
      this.$refs[name].validate(valid=>{
        if(valid){
          let loading = this.$loading();
          this.withdrawHandleAPI({
            id:this.formData.id,
            clearing:this.formData.clearing,
            order:this.formData.order,
          }).then(({body})=>{
            loading.close();
            this.openUpdate = false;
            if(body.code===1000){
              this.$message.success(body.msg)
              this.getApplyInfo(this.page);
            }else{
              this.$message.error(body.msg)
            }
          },err=>{
            loading.close();
            this.$message.error(err.msg)
          })
        }
      })
    }

 

  •  权限:

  • 切换角色类型:

1 <el-radio-group v-model="record_type">
2         <el-radio-button :label="item" v-for="(item,index) in role_list" :key='index'></el-radio-button>
3 </el-radio-group>

 监听双向绑定额数据:

1 watch:{
2     //切换角色类型
3     record_type(newVal,oldVal){
4         this.showPagination = false;
5         this.getUserRoleList(1);
6     }
7   }

监听数据这里不是函数,而是一个固定写法,第一个参数是new值,第二个参数是old值(而且这里不用this)

  • 直达功能

添加直达

模板代码:

1 <template v-if="canAdd!==null">
2         <el-button class="addNonstop" size="small" type="primary" @click="setShortcut('post')" v-if="canAdd===1">添加直达</el-button>
3         <el-button class="addNonstop" size="small" type="warning" @click="setShortcut('delete')" v-if="canAdd===0">取消直达</el-button>
4 </template>

直达功能代码:

 1 setShortcut(method){
 2       if(!Utils.checkToken(this))return;
 3       const name = this.$route.meta[2].name? this.$route.meta[2].name: this.$route.meta[1].name;
 4       let query;
 5       if(method==='delete'){
 6         query = {
 7           method:method,
 8           data:{
 9             body:{
10               nav_name:name,
11               nav_url:this.$route.path
12             }
13           }
14         }
15       }else{
16         query = {
17           method:method,
18           data:{
19             nav_name:name,
20             nav_url:this.$route.path
21           }
22         }
23       }
24       this.updateShortcutAPI(query).then(
25         res => {
26           this.$message.success(res.body.msg);
27           this.shortcutListAPI()
28         },
29         err => {
30           this.$message.error(err.msg);
31         }
32       );
33     }
直达功能

$route为当前router跳转对象里面可以获取name、path、query、params等

$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法

 

  •  点击曲线获得数据
 1       const This = this;
 2       let mChart_line1 = This.$echarts.init(document.getElementById("mChart_line"));
 3       mChart_line1.getZr().off("click");   //  ZRender 一个轻量级的Canvas类库
 4       mChart_line1.getZr().on("click", params => {
 5         const pointInPixel = [params.offsetX, params.offsetY];
 6         if (mChart_line1.containPixel({ seriesIndex: [0] }, pointInPixel)) {
 7           //判断给定的点是否在指定的坐标系或者系列上
 8           let xIndex = mChart_line1.convertFromPixel({ seriesIndex: 0 }, [
 9             //转换像素坐标值到逻辑坐标系上的点
10             params.offsetX,
11             params.offsetY
12           ])[0]; /*事件处理代码书写位置*/
13           This.day =
14             This.date_type === "month"
15               ? This.total_data.date[xIndex] + "-01"
16               : This.total_data.date[xIndex];
17           This.showPagination = false;
18           this.getData()
19         }
20       });

 

  • 两种查询方式调同一个方法里面的接口: (一个传值,一个不传值) //即使是不同的地方点击事件,里面的参数也会保存。
 1 getInvoiceList(page){
 2             if(!Utils.checkToken(this))return; 
 3                 if (this.begin_date === null || this.end_date === null) {
 4             this.$message.error("请选择时间!");
 5             return;
 6           }
 7             this.table_loading = true;
 8             this.billingInfoAPI({
 9                 begin_date: Utils.formatDate(this.begin_date, "yyyy-MM-dd"),
10                 end_date: Utils.formatDate(this.end_date, "yyyy-MM-dd"),
11                 status: this.status,
12                 page: page,
13                 page_size: this.page_size,
14                 keyword:this.keyword
15             }).then(res=>{
16                 this.table_loading = false;
17                 this.showPagination = true;
18             },err=>{
19                 this.table_loading = false;
20                 this.showPagination = true;
21                 this.$message.error(err.msg);
22             })
23         },
传值的
  invoiceQuery() {
        this.showPagination = false;
        this.getInvoiceList(1);
    }
不传值的

 

遍历数据的三种写法:

1.v-for   

1 <el-form-item label="来源:">
2         <el-radio-group v-model="origin" @change="showPagination=false,search(1)">
3           <el-radio v-for='(item,index) in origin_list' :key="index" :label="index">{
    {item}}</el-radio>
4         </el-radio-group>
5 </el-form-item>

2.element 模板  利用v-bind绑定数据, 然后传个prop属性作为值。

1 <el-table border :data="userData" v-loading='tableLoadingOne'>
2       <el-table-column label="用户总数" prop="user_total_num"></el-table-column> 
3       <el-table-column label="总充值次数" prop="add_money_num"></el-table-column> 
4       <el-table-column label="充值总额(元)" prop="add_money_total"></el-table-column> 
5       <el-table-column label="总使用次数" prop="rent_num"></el-table-column> 
6       <el-table-column label="消费总额(易学币)" prop="cunsumption_money_total"></el-table-column> 
7 </el-table>
  • 2-1  如果需要对获取的值做个判断,可以在这个里面嵌套个 <template slot-scope = 'scope'> </template>  再用插值表达式判断

3.element表单组件,利用v-bind:model绑定数据,然后利用v-model双向绑定机制输出。

1 <el-form :model="editData" ref="editForm" :rules="rules" v-if="editData!==null" class="recharge-form" label-width="100px">
2                 <el-form-item label="策略编号" prop="policy_reference">
3                     <el-select v-model="editData.policy_reference" placeholder="请选择策略" :disabled="editTitle==='修改折扣'">
4                       <el-option v-for="(item,index) in idList" :key="index" :label="item" :value="item"></el-option>
5                    </el-select>
6           </el-form-item>
7 </el-form>
 

 

  •  通过JS适配移动端WEB页面
 1 function adaptation() {
    //通过JS适配移动端
 2     (function(doc, win) {
 3         var docEl = doc.documentElement,
 4             recalc = function() {
 5                 var clientWidth = docEl.clientWidth;
 6                 if (!clientWidth) return;
 7                 //&&!navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
 8                 if (clientWidth >= 640) {
 9                     docEl.style.fontSize = '100px';
10                 } else {
11                     docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';
12                 }
13             };
14         // if (!doc.addEventListener) return;
15         // doc.addEventListener('DOMContentLoaded', recalc, false);
16         recalc();
17     })(document, window);
18 }

 

 

 

 

待完成 :

  • 聊天室(前台)
  • 直播 (前台)
  • 支付功能(前台)

转载于:https://www.cnblogs.com/it-Ren/p/10968282.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30480651/article/details/98239477

智能推荐

已知num为无符号十进制整数,请写一非递归算法,该算法输出num对应的r进制的各位数字。要求算法中用到的栈采用线性链表存储结构(1<r<10)。-程序员宅基地

文章浏览阅读74次。思路:num%r得到末位r进制数,num/r得到num去掉末位r进制数后的数字。得到的末位r进制数采用头插法插入链表中,更新num的值,循环计算,直到num为0,最后输出链表。//重置,s指针与头指针指向同一处。//更新num的值,至num为0退出循环。//末位r进制数存入s数据域中。//头插法插入链表中(无头结点)//定义头指针为空,s指针。= NULL) //s不为空,输出链表,栈先入后出。

开始报名!CW32开发者扶持计划正式进行,将助力中国的大学教育及人才培养_cw32开发者扶持计划申请-程序员宅基地

文章浏览阅读176次。武汉芯源半导体积极参与推动中国的大学教育改革以及注重电子行业的人才培养,建立以企业为主体、市场为导向、产学研深度融合的技术创新体系。2023年3月,武汉芯源半导体开发者扶持计划正式开始进行,以打造更为丰富的CW32生态社区。_cw32开发者扶持计划申请

希捷硬盘开机不识别,进入系统后自动扫描硬件以识别显示_st2000dm001不认盘-程序员宅基地

文章浏览阅读5.7k次。2014年底买的一块2TB希捷机械硬盘ST2000DM001-1ER164,用了两年更换了主板、CPU等,后来出现开机不识别的情况,具体表现为:关机后开机,找不到硬盘,就进入BIOS了,只要在BIOS状态下待机半分钟左右再重启,硬盘就会出现。进入系统后,重启(这个过程中主板对硬盘始终处于供电状态),也不会出现不识别硬盘的现象。就好像是硬盘或主板上某个电容坏了一样,刚开始给硬盘通电的N秒钟内电容未能..._st2000dm001不认盘

ADO.NET包含主要对象以及其作用-程序员宅基地

文章浏览阅读1.5k次。ADO.NET的数据源不单单是DB,也可以是XML、ExcelADO.NET连接数据源有两种交互模式:连接模式和断开模式两个对应的组件:数据提供程序(数据提供者)&DataSetSqlConnectionStringBuilder——连接字符串Connection对象用于开启程序和数据库之间的连接public SqlConnection c..._列举ado.net在操作数据库时,常用的对象及作用

Android 自定义对话框不能铺满全屏_android dialog宽度不铺满-程序员宅基地

文章浏览阅读113次。【代码】Android 自定义对话框不能铺满全屏。_android dialog宽度不铺满

Redis的主从集群与哨兵模式_redis的主从和哨兵集群-程序员宅基地

文章浏览阅读331次。Redis的主从集群与哨兵模式Redis的主从模式全量同步增量同步Redis主从同步策略流程redis主从部署环境哨兵模式原理哨兵模式概述哨兵模式的作用哨兵模式项目部署Redis的主从模式1、Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。2、为了分担读压力,Redis支持主从复制,保证主数据库的数据内容和从数据库的内容完全一致。3、Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。全量同步Redis全量复制一般发_redis的主从和哨兵集群

随便推点

mysql utf-8的作用_为什么不建议在MySQL中使用UTF-8-程序员宅基地

文章浏览阅读116次。作者:brightwang原文:https://www.jianshu.com/p/ab9aa8d4df7d最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect string value: ‘😃 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“????..._mysql utf8的作用

MATLAB中对多张图片进行对比画图操作(包括RGB直方图、高斯+USM锐化后的图、HSV空间分量图及均衡化后的图)_matlab图像比较-程序员宅基地

文章浏览阅读278次。毕业这么久了,最近闲来准备把毕设过程中的代码整理公开一下,所有代码其实都是网上找的,但都是经过调试能跑通的,希望对需要的人有用。PS:里边很多注释不讲什么意思了,能看懂的自然能看懂。_matlab图像比较

16.libgdx根据配置文件生成布局(未完)-程序员宅基地

文章浏览阅读73次。思路:  screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来  跳转普通的screen,直接根据配置文件调整设置<layouts> <loyout screenId="0" bg="bg_start" name="start" defaultWinId="" bgm="" remark=""> ..._libgdx ui 布局

playwright-python 处理Text input、Checkboxs 和 radio buttons(三)_playwright checkbox-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏13次。playwright-python 处理Text input和Checkboxs 和 radio buttonsText input输入框输入元素,直接用fill方法即可,支持 ,,[contenteditable] 和<label>这些标签,如下代码:page.fill('#name', 'Peter');# 日期输入page.fill('#date', '2020-02-02')# 时间输入page.fill('#time', '13-15')# 本地日期时间输入p_playwright checkbox

windows10使用Cygwin64安装PHP Swoole扩展_win10 php 安装swoole-程序员宅基地

文章浏览阅读596次,点赞5次,收藏6次。这是我看到最最详细的安装说明文章了,必须要给赞!学习了,也配置了,成功的一批!真不知道还有什么可补充的了,在此做个推广,喜欢的小伙伴,走起!_win10 php 安装swoole

angular2里引入flexible.js(rem的布局)_angular 使用rem-程序员宅基地

文章浏览阅读1k次。今天想实现页面的自适应,本来用的是栅格,但效果不理想,就想起了rem布局。以前使用rem布局,都是在原生html里,还没在框架里使用过,百度没百度出来,就自己琢磨,不知道方法规范不规范,反正成功了,操作如下:1、下载flexible.js2、引入到angular项目里3、根据自己的需要修改细节3.1、在flexible.js里修改每份的像素,3.2、引入cssrem插件,在设置里设..._angular 使用rem

推荐文章

热门文章

相关标签