ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.NET经销商实战(十一)——筛选框遮蔽功能

2022-05-25 23:04:50  阅读:170  来源: 互联网

标签:string color await productInfo products 遮蔽 NET border 筛选


1.前端获取所有产品接口增加查询条件

增加搜索框查询条件,后端接口我只改ProductService了,剩下的增加一个入参即可,这里就不过多赘述了

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using DealerPlatform.Core.Repository;
using DealerPlatform.Domain.GlobalDto;
using DealerPlatform.Domain.Models;
using DealerPlatform.Service.ProductApp.Dto;
using DealerPlatform.Service.ProductApp.Vo;

namespace DealerPlatform.Service.ProductApp
{
	public partial class ProductService : IProductService
	{
		public ProductService(
			IRepository<Product> productRepo,
			IRepository<ProductSale> productSaleRepo,
			IRepository<ProductSaleAreaDiff> productSaleAreaDiffRepo,
			IRepository<ProductPhoto> productPhotoRepo,
			IMapper mapper)
		{
			ProductRepo = productRepo;
			ProductSaleRepo = productSaleRepo;
			ProductSaleAreaDiffRepo = productSaleAreaDiffRepo;
			ProductPhotoRepo = productPhotoRepo;
			Mapper = mapper;
		}

		public IRepository<Product> ProductRepo { get; }
		public IRepository<ProductSale> ProductSaleRepo { get; }
		public IRepository<ProductSaleAreaDiff> ProductSaleAreaDiffRepo { get; }
		public IRepository<ProductPhoto> ProductPhotoRepo { get; }
		public IMapper Mapper { get; }

		/// <summary>
		/// 获取商品数据
		/// </summary>
		/// <returns></returns>
		public async Task<IEnumerable<ProductDto>> GetProductDto(string searchText, string? productType, string systemNo, PageWithSortDto dto)
		{
			dto.Sort ??= "ProductName";
			// int skipNum = (pageIndex - 1) * pageSize;

			// var products = (from p in (await ProductRepo.GetListAsync())
			// 				orderby p.GetType().GetProperty(sort).GetValue(p)
			// 				select p).Skip(skipNum).Take(pageSize).ToList();
			//获取商品主档信息
			var products = await ProductRepo.GetListAsync(dto,
			s => (s.TypeNo == productType || string.IsNullOrWhiteSpace(productType))
			&& (s.SysNo == systemNo || string.IsNullOrWhiteSpace(systemNo))
			&& (s.ProductName.Contains(searchText) || string.IsNullOrWhiteSpace(searchText)));

			var dtos = Mapper.Map<List<ProductDto>>(products);
			var productPhotos = await GetProductPhotosByProductNo(dtos.Select(s => s.ProductNo).ToArray());
			var productSales = await GetProductSalesByProductNo(dtos.Select(s => s.ProductNo).ToArray());
			dtos.ForEach(s =>
			{
				s.ProductPhoto = productPhotos.FirstOrDefault(c => c.ProductNo == s.ProductNo);
				s.ProductSale = productSales.FirstOrDefault(c => c.ProductNo == s.ProductNo);
			});
			//根据productId取到属性
			return dtos;
		}
		public async Task<IEnumerable<ProductTypeVo>> GetProductType(string sysNo)
		{
			return await Task.Run(() =>
			{
				var productType = ProductRepo.GetQueryable().Where(s => s.SysNo == sysNo && !string.IsNullOrWhiteSpace(s.TypeName)).Select(s => new ProductTypeVo
				{
					TypeNo = s.TypeNo,
					TypeName = s.TypeName,
				}).Distinct().ToList();
				return productType;
			});
		}
		/// <summary>
		/// 商品类型查询列表
		/// </summary>
		/// <returns></returns>
		public async Task<List<BelongTypeVo>> GetBelongTypesAsync()
		{
			var data = ProductRepo.GetQueryable().Select(s => new BelongTypeVo
			{
				SysNo = s.SysNo,
				BelongTypeName = s.BelongTypeName,
				// BelongTypeNo = s.BelongTypeNo
			}).Distinct();
			return data.ToList();
		}
		/// <summary>
		/// 获取所有物品属性
		/// </summary>
		/// <param name="belongTypeNo"></param>
		/// <param name="TypeNo"></param>
		/// <returns></returns>
		public async Task<Dictionary<string, IEnumerable<string>>> GetProductProps(string belongTypeNo, string typeNo)
		{
			Dictionary<string, IEnumerable<string>> dicProductType = new();
			var products = await ProductRepo.GetListAsync(m => m.SysNo == belongTypeNo && (m.TypeNo == typeNo || string.IsNullOrWhiteSpace(typeNo)));
			dicProductType.Add("ProductBzgg|包装规格", products.Select(s => s.ProductBzgg).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductCd|产地", products.Select(s => s.ProductCd).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductCz|材质", products.Select(s => s.ProductCz).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductDj|等级", products.Select(s => s.ProductDj).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductGg|规格", products.Select(s => s.ProductGg).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductGy|工艺", products.Select(s => s.ProductGy).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductHb|环保", products.Select(s => s.ProductHb).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductHd|厚度", products.Select(s => s.ProductHd).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductHs|花色", products.Select(s => s.ProductHs).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductMc|面材", products.Select(s => s.ProductMc).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductPp|品牌", products.Select(s => s.ProductPp).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductXh|型号", products.Select(s => s.ProductXh).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			dicProductType.Add("ProductYs|颜色", products.Select(s => s.ProductYs).Distinct().Where(m => !string.IsNullOrEmpty(m)).ToList());
			return dicProductType;
		}
	}
}

2.前端产品列表界面如下:

ProductList.vue
<template>
  <div>
    <div class="search-pad">
      <input
        v-model="searchText"
        type="text"
        name=""
        id=""
        @focus="searchFocus()"
        @blur="searchBlur()"
        @input="search"
      />
      <button v-show="isShowSearchBtn">搜索</button>
      <button v-show="!isShowSearchBtn" @click="showRight()">筛选</button>
    </div>
    <div class="system-pad">
      <div
        v-for="belongType in belongTypes"
        :key="belongType.sysNo"
        :class="[
          'system-item',
          { 'system-select': systemIndex == belongType.sysNo },
        ]"
        @click="getSystemProduct(belongType.sysNo)"
      >
        <span>{{ belongType.belongTypeName }}</span>
      </div>
    </div>
    <div class="product-list">
      <ul>
        <li v-for="product in products" :key="product.id">
          <img :src="product.productPhoto?.productPhotoUrl" alt="" />
          <div>
            <p class="p-name">{{ product.productName }}</p>
            <p class="p-type">类别:{{ product.typeName }}</p>
            <p class="p-price">
              &yen;{{ tranPrice(product.productSale?.salePrice) }}/张
            </p>
          </div>
        </li>
      </ul>

      <div :class="['left-menu', { 'left-menu-show': isShowLeft }]">
        <div class="left-switch" @click="showLeft()">
          <img src="/img/dealerImgs/up.png" alt="" />
        </div>
        <ul>
          <li
            v-for="productType in productTypes"
            :key="productType.typeNo"
            @click="selectType(productType.typeNo)"
            :class="{ 'left-item-select': typeSelected == productType.typeNo }"
          >
            {{ productType.typeName }}
          </li>
        </ul>
      </div>
    </div>
    <div class="right-pad">
      <div class="list-pad">
        <ul class="f-type-list">
          <template v-for="(values, key) in productProps">
            <li v-if="values.length > 0" :key="key">
              <p>{{ formatKey(key) }}</p>
              <ul class="f-item-list">
                <li v-for="value in values" :key="value">
                  <span>{{ value }}</span>
                </li>
                <!-- <li><span class="prop-select">胡桃色</span></li> -->
              </ul>
              <div class="clear-tag"></div>
            </li>
          </template>
        </ul>
      </div>
      <div class="right-edit">
        <button
          @click="confirmFilter()"
          style="background-color: rgb(188, 0, 0); color: #fff"
        >
          确定
        </button>
        <button @click="hideRight()">取消</button>
      </div>
    </div>
    <div class="cover" v-show="isShowCover" @click="hideRight()"></div>
  </div>
</template>

<script lang="ts">
import { ref, onMounted, reactive, toRefs } from 'vue'
import {
  getProduct,
  getBelongType,
  getProductType,
  getProps,
} from '@/httpRequests/ProductListRequest'
import { IProductInfo } from '@/Interfaces/ProductList'

export default {
  setup() {
    const pageController = reactive({
      isShowLeft: ref(false),
      isShowCover: ref(false),
      isShowSearchBtn: ref(false),
    })
    //IProductInfo
    const productInfo: IProductInfo = reactive({
      systemIndex: '1',
      products: [],
      belongTypes: [],
      productTypes: [],
      typeSelected: '',
      searchText: '',
      productProps: {},
      timer: 0,
      /**
       * 获取物品
       */
      getProducts: async (
        systemIndex: string,
        productType: string | null = null
      ) => {
        productInfo.products = await getProduct({
          searchText: null,
          systemNo: systemIndex,
          productType: productType,
          sort: 'ProductName',
          pageIndex: 1,
        })

        console.log(productInfo.products)
      },
      tranPrice: (price: number) => {
        if (price == null) {
          return '0.00'
        } else {
          return price.toFixed(2).toString()
        }
      },
      getBelongType: async () => {
        productInfo.belongTypes = await getBelongType()
        console.log(productInfo.belongTypes)
      },
      //
      getProductType: async (sysNo: string) => {
        productInfo.productTypes = await getProductType(sysNo)
      },
      //增加注释
      getSystemProduct: async (index: string) => {
        productInfo.systemIndex = index
        await productInfo.getProducts(index, null)
        await productInfo.getProductType(index)
        await productInfo.getProps(index, null)
      },
      getProps: async (belongTypeNo: string, typeNo: string | null = null) => {
        console.log('belongTypeNo:' + belongTypeNo)
        var res = await getProps({ belongTypeNo, typeNo })
        productInfo.productProps = res
        console.log(res)
      },
      formatKey: (key: string) => {
        return key.split('|')[1]
      },
      selectType: async (typeNo: string) => {
        if (productInfo.typeSelected == typeNo) {
          productInfo.typeSelected = ''
        } else {
          productInfo.typeSelected = typeNo
        }

        await productInfo.getProducts(
          productInfo.systemIndex,
          productInfo.typeSelected
        )
        console.log('productInfo.typeSelected: ' + productInfo.typeSelected)
      },
      search: async () => {
        clearTimeout(productInfo.timer)
        productInfo.timer = setTimeout(async () => {
          productInfo.products = await getProduct({
            searchText: productInfo.searchText,
            systemNo: productInfo.systemIndex,
            productType: productInfo.typeSelected,
            sort: 'ProductName',
            pageIndex: 1,
          })
        }, 1000)
      },
    })

    const showLeft = () => {
      pageController.isShowLeft = !pageController.isShowLeft
    }
    const searchFocus = () => {
      pageController.isShowSearchBtn = true
    }
    const searchBlur = () => {
      pageController.isShowSearchBtn = false
    }
    const confirmFilter = () => {}
    const showRight = () => {
      pageController.isShowCover = true
      var dom = document.querySelector('.right-pad') as HTMLElement
      dom.style.right = '0'
    }
    const hideRight = () => {
      pageController.isShowCover = false
      var dom = document.querySelector('.right-pad') as HTMLElement
      dom.style.right = '-85%'
    }
    onMounted(async () => {
      await productInfo.getProducts('bc', null)
      await productInfo.getBelongType()
      await productInfo.getProductType('1')
      await productInfo.getProps('1', null)
    })
    return {
      ...toRefs(pageController),
      ...toRefs(productInfo),
      showLeft,
      searchFocus,
      searchBlur,
      confirmFilter,
      showRight,
      hideRight,
    }
  },
}
</script>

<style lang="scss" scoped>
.i-search:after {
  background-color: #b70101 !important;
}

.search-pad {
  z-index: 10;
  position: fixed;
  width: 100%;
  padding: 6px 20px;
  background-color: #f0f0f0;
  display: flex;

  input {
    height: 28px;
    box-sizing: border-box;
    border: 1px solid #ddd;
    border-radius: 3px;
    flex: 1;
    outline: none;
  }

  button {
    background-color: transparent;
    width: 56px;
    border: 0 none;
    font-size: 14px;
    font-weight: bold;
    color: #333;
    outline: none;
  }
}

.system-pad {
  z-index: 10;
  position: fixed;
  width: 100%;
  top: 40px;
  background-color: #fff;
  display: flex;

  .system-item {
    flex: 1;
    text-align: center;
    border-bottom: 1px #ddd solid;
    border-right: 1px transparent solid;
    border-left: 1px transparent solid;

    span {
      border: 0 none !important;
      background-color: #f0f2f5;
      margin: 6px 5px;
      font-size: 12px;
      font-weight: normal;
      text-align: center;
      border-radius: 4px;
      padding: 6px 0;
      display: block;
      height: 20px;
      line-height: 12px;
    }
  }

  .system-select {
    border-bottom: 1px transparent solid;
    border-right: 1px #ddd solid;
    border-left: 1px #ddd solid;

    span {
      background-color: transparent;
    }
  }
}

.product-list {
  padding-top: 75px;
  ul {
    background-color: #fff;

    li {
      list-style: none;
      height: 88px;
      padding-left: 108px;
      position: relative;

      img {
        height: 66px;
        width: 66px;
        background-color: #ccc;
        position: absolute;
        left: 28px;
        top: 11px;
      }

      div {
        padding: 10px 0;
        border-bottom: 1px solid #f0f0f0;
        padding-bottom: 12px;
        text-align-last: left;
        .p-name {
          font-size: 13px;
        }

        .p-type {
          font-size: 12px;
          color: #666;
          margin-top: 8px;
        }

        .p-price {
          font-size: 13px;
          color: #f23030;
          margin-top: 8px;
        }
      }
    }
  }

  .left-menu {
    position: fixed;
    height: calc(100% - 116px);
    left: -106px;
    width: 125px;
    background-color: #fff;
    top: 76px;
    border-radius: 0 18px 0 0;
    border: 1px solid #d7d7d7;
    overflow: hidden;
    transition: 0.5s;
    margin-bottom: 120px;

    .left-switch {
      width: 20px;
      background-color: #fff;
      position: absolute;
      right: 0;
      height: 100%;

      img {
        position: absolute;
        top: 42%;
        left: 2px;
        width: 20px;
        transform: rotate(90deg);
        transition: 0.5s;
      }
    }

    ul {
      position: absolute;
      height: 100%;
      width: 106px;
      background-color: #f0f0f0;
      overflow: auto;

      li {
        width: 106px;
        height: 50px;
        text-align: center;
        line-height: 50px;
        border-bottom: 1px solid #d7d7d7;
        padding: 0;
        font-size: 12px;
        color: #333;
      }

      li.left-item-select {
        background-color: #fff;
      }
    }
  }

  .left-menu-show {
    left: 0;

    .left-switch {
      img {
        transform: rotate(-90deg);
      }
    }
  }
}

.right-pad {
  position: fixed;
  /* right: -85%; */
  right: -85%;
  top: 0;
  width: 85%;
  height: 100%;
  background-color: #f7f7f7;
  z-index: 103;
  transition: 580ms;
  z-index: 101;

  ul {
    list-style: none;
    overflow: hidden;
  }
  .list-pad {
    overflow: auto;
    height: 100%;
    padding-bottom: 40px;
    .f-type-list {
      overflow: hidden;

      > li {
        padding: 10px;
        background-color: #fff;
        margin-bottom: 10px;

        .f-item-list {
          overflow: auto;
          display: flex;
          flex-wrap: wrap;

          li {
            flex-basis: 33.3%;

            span {
              display: block;
              margin-top: 10px;
              margin-right: 10px;
              background: #eee;
              border: 1px solid #eee;
              padding: 5px 0;
              text-align: center;
              border-radius: 6px;
              font-size: 13px;
              overflow: hidden;
              height: 39px;
            }

            .prop-select {
              border: 1px solid red;
              background: #fff;
              color: red;
            }
          }
        }

        p {
          font-size: 14px;
        }
      }
    }
  }
  .right-edit {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;

    button {
      float: left;
      height: 40px;
      width: 50%;
      line-height: 40px;
      text-align: center;
      border: 0px none;
    }
  }
}

.cover {
  position: fixed;
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  background-color: rgba(51, 51, 51, 0.36);
  z-index: 11;
}
</style>

主要修改了一些样式,及一些优化

标签:string,color,await,productInfo,products,遮蔽,NET,border,筛选
来源: https://www.cnblogs.com/humblexwang/p/16302689.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有