文章目录

  • shopping-project-商品列表显示及查看商品详情
    • 1 前后端环境的搭建
      • 1.1 设及技术
      • 1.2 前后端分离
        • 1.2.1 服务端项目
        • 1.2.2 客户端项目
    • 2 查看商品列表
      • 2.1 服务端
        • 2.1.1 创建商品model(此处仅有图书,后续会加入其他)
        • 2.1.2 创建BookController
        • 2.1.3 创建BookServcie
        • 2.1.4 创建BookMapper
        • 2.1.5 Postman测试接受数据是否成功
      • 2.2 客户端
        • 2.2.1 接收后端传来的数据及某些数据做出的相应处理
        • 2.2.2 前端模板部分及美化
    • 3 查看商品详情
      • 3.1 客户端
        • 3.1.1 给商品名路由链接,并配置路由
        • 3.1.2 在BookDesc.vue写商品详情页的前端模板及其美化
        • 3.1.3 配置路由传参
        • 3.1.4 接收后端传来的参数并做出处理
      • 3.2 服务端
        • 3.2.1 BookController里增加该功能
        • 3.2.2 BookService增加该功能
        • 3.2.3 BookMapper增加该功能
    • 4 查看图书评论信息
      • 4.1 服务端
        • 4.1.1 创建comment的model
        • 4.1.2 BookController里增加该功能
        • 4.1.3 BookService增加该功能
        • 4.1.4 创建CommentMapper
      • 4.2 客户端
        • 4.2.1 接收后端传来的数据,并做出处理
        • 4.2.2 前端显示
    • 5 对商品评论进行分页处理
      • 5.1 服务端
        • 5.1.1添加pagehelper依赖
        • 5.1.2 配置PageHelper
        • 5.1.3 创建公共类-分页参数类
        • 5.1.4 Service层写分页代码-BookServiceImpl类
        • 5.1.5 修改BookController
      • 5.2 客户端
        • 5.2.1 前端使用Element的分页插件
        • 5.2.2 前端定义分页参数,及向后端传递参数
    • 6 查看商品列表-基于Redis查询
      • 6.1 服务端
        • 6.1.1引入Redis依赖
        • 6.1.2 在Service层做处理-BookServiceImpl

shopping-project-商品列表显示及查看商品详情

1 前后端环境的搭建

1.1 设及技术

  • springBoot
  • mybatis
  • Redis
  • JWT
  • springSecurity
  • Vue+Element+Axios

1.2 前后端分离

1.2.1 服务端项目

  • myshopping-project-server

    1. 在IDEA创建springboot项目,添加相关依赖包

    2. 配置application.yml

      #配置服务器
      server:port: 80servlet:context-path: /
      spring:#配置数据源datasource:url: jdbc:mysql://localhost:3306/myshopping?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root#配置数据库连接池druid:max-active: 100min-idle: 10initial-size: 10max-wait: 1000
      #配置日志
      logging:level:root: infoweb: trace#mybatis配置
      mybatis:configuration:#日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#映射文件路径mapper-locations: /mapper/*Mapper.xml
      
    3. 写一个controller进行测试,运行

      成功

    4. 在核心配置类进行跨域配置

       @Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {/*** 进行跨域配置*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//当前应用所有资源可被访问.allowedOrigins("http://localhost:8080")//设置允许访问当前应用的项目.allowedMethods("*") //设置允许哪些请求方式进行跨域访问,默认情况只允许简单请求(get,post,head).allowCredentials(true);//是否允许使用凭证,是否允许使用session后cookie存储凭证信息}};}
      

1.2.2 客户端项目

  • myshopping-project-client

    1. 使用vue-cli构建项目

    2. 配置index.html页面布局

        <style>html {width: 100%;height: 100%;}body {width: 100%;height: 100%;margin: 0px;}</style>
      
    3. App.vue样式

      #app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;width: 100%;height: 100%;color: #2c3e50;
      }
      
    4. 关闭语法检测

      const { defineConfig } = require("@vue/cli-service");
      module.exports = defineConfig({transpileDependencies: true,lintOnSave:false
      });
      
    5. 测试运行

      成功…

    6. 配置axios

      • npm引入
       cnpm intall axios
      
      • 在main.js配置 axios
      import axios from "axios";
      //设置axios是Vue的属性
      Vue.prototype.$axios = axios.create({baseURL: 'https://localhost/',//设置axios请求的基础路径headers: { 'X-Requested-With': 'XMLHttpRequest' },//指定axios的请求为ajax请求withCredentials: true, // 跨域请求是否允许使用凭证
      });
      
      • 测试使用
      <template><div>  <button @click="test">测试</button></div>
      </template>
      <script>
      export default{methods:{test(){this.$axios.get('test/test01').then(response=>{alert(response.data);}).catch(error=>{alert(error)});},    }
      }
      </script>
      <style scoped>
      </style>
      
    7. 配置ElementUI

      • npm引入

        npm i element-ui -S
        
      • 在mian.js配置ElementUI

        import ElementUI from 'element-ui';
        import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);//设置Vue使用Element组件
        
      • 测试

        <el-button type="primary" @click="test">测试</el-button>
        

2 查看商品列表

2.1 服务端

2.1.1 创建商品model(此处仅有图书,后续会加入其他)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book implements Serializable {private Integer book_id;private String book_name;private Double book_price;private String book_image;private String book_desc;private Integer book_is_display;
}

2.1.2 创建BookController

@RestController
@RequestMapping("/book")
public class BookController {@Resourceprivate BookService bookService;@RequestMapping("/queryBooks")public List<Book> queryBook(){return bookService.queryBook();}
}

2.1.3 创建BookServcie

  • BookService接口
public interface BookService {/*** 获得所有图书,* @param isDisplay 表示是否上架 0表示上架 -1表示下架,没有参数表示所有商品* @return*/List<Book> queryBook(Integer... isDisplay);
}
  • BookServcieImpl
@Service
public class BookServiceImp implements BookService {@Resourceprivate BookMapper bookMapper;@Overridepublic List<Book> queryBook(Integer... isDisplay) {return bookMapper.queryBook(isDisplay);}
}

2.1.4 创建BookMapper

  • BookMapper接口
@Repository
public interface BookMapper {List<Book> queryBook(Integer... isDisplay);
}
  • BookMapper.Xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shopping.mapper.BookMapper"><select id="queryBook" resultType="com.shopping.model.Book">select * from myshopping.tbl_book<if test="isDisplay!=null and isDisplay.length!=0"><where>book_is_display=#{isDisplay[0]}</where></if></select>
</mapper>

2.1.5 Postman测试接受数据是否成功

成功

2.2 客户端

2.2.1 接收后端传来的数据及某些数据做出的相应处理

export default {data(){return{booksList:[],//商品数组num:1,//购买数量}},methods: {/*** 获得商品信息*/queryBooks(){this.$axios.get("book/queryBooks").then(response=>{this.booksList =response.data;}).catch(err=>{alert(err)})},/*** 截取书名,要求书名必须小于10* @param {} bookName */subBookName(bookName){if(bookName.length>=10){bookName=bookName.substring(0,10)+"..."; }return bookName;}},created(){this.queryBooks();}
}

2.2.2 前端模板部分及美化

<template><div class="index_container"><el-container><el-header>Header</el-header><el-main><el-row><el-col :span="6" v-for="(book,index) in booksList" :key="book.book_id"  :offset="index==0?0:0" ><el-card :body-style="{ padding: '0px'}" style="margin-left: 10px; margin-top: 20px;"><img :src="require('@/assets/images/books/'+book.book_image)" class="image"><div class="bottom"><div style="display: flex;"><div class="book_desc" ><div><el-tooltip class="item" effect="dark" :content="book.book_name" placement="top-start"><span>书名:{{ subBookName(book.book_name)}}</span></el-tooltip></div><div><span>单价:{{book.book_price}}¥</span></div></div><div class="book_car" ><i style="color: orange;font-size:40px;" class=el-icon-shopping-cart-full></i></div></div>    <div class="button_inputnumber" style="display: flex;"><div style="margin-top: 5px;"><el-input-number size="small" v-model="num" :min="1"></el-input-number></div>                       <div><el-button type="warning" >购买</el-button></div></div></div></el-card></el-col></el-row>  </el-main><el-footer>Footer</el-footer></el-container></div>
</template>
<style scoped>
.index_container{margin: 0px auto;width: 80%;}.el-header, .el-footer {background-color: #B3C0D1;color: #333;text-align: center;line-height: 60px;}.el-main {background-color: #E9EEF3;color: #333;}.book_desc{font-size: 13px;width:70%;}.book_car{width:30%;margin-top: 5px;}.book_desc div{margin-left: 10px;margin-top: 10px;}.button_inputnumber div{margin: auto;}.bottom {margin-top: 13px;line-height: 12px;}.image {height: 300px;width: 100%;display: block;}
</style>

3 查看商品详情

3.1 客户端

3.1.1 给商品名路由链接,并配置路由

Vue没有超链接<a herf="">标签不能使用,需使用路由连接<router-link to="">

 <router-link class="normal" to="/bookDesc">书名:{{ subBookName(book.book_name) }}       </router-link>
  • 配置路由
import BookDesc from "../views/BookDesc.vue"
const routes = [//配置图书详情页的路由{path: "/bookDesc",name: "bookDesc",component: BookDesc},];
  • 美化路由链接
.normal{display: block;color: black;text-decoration: none;
}.normal:hover{color: grey;
}
.normal:active{color: black;
}

3.1.2 在BookDesc.vue写商品详情页的前端模板及其美化

<template><div class="index_container"><el-container><el-header>Header</el-header><el-main><div class="desc-div"><h2 align="center">商品详情</h2><div class="goodsDesc"><div class="baseInfo"><div class="photo"><el-image :src="require('@/assets/images/books/' + book.book_image)"><div slot="placeholder" class="image-slot">加载中<span class="dot">...</span></div></el-image></div><div class="bookInfo"><p>书名:{{book.book_name}}</p><p>价格:{{book.book_price}}</p></div></div><div class="bookDesc"><p>图书详情:{{ book.book_desc}}</p></div><div class="book-comment"><p>图书评论</p><div class="comment-info" ><div class="comment-base-info"><label style="display:inline-block;width:70%">评论人:</label><label style="margin-right:20px">评论时间:</label></div><div class="comment-content"></div></div></div></div></div></el-main><el-footer>Footer</el-footer></el-container></div>
</template>
<style scoped>
.index_container {margin: 0px auto;width: 80%;}
.el-header,.el-footer {background-color: #b3c0d1;color: #333;text-align: center;line-height: 60px;
}
.el-header{display: flex;}.el-header .index-logo,.el-header .index-personal{width:50%}
.el-main {background-color: #fff;color: #333;
}.desc-div{width:100%;border: 0px solid red;}
.goodsDesc{width: 80%;margin:0 auto;border:1px solid blue;}
.baseInfo{display: flex;}.baseInfo .photo{width: 50%;text-align: center;margin-bottom:10px;}
.bookDesc>p{width:100%;height: 40px;line-height: 40px;padding-left:10px;box-sizing:border-box;color: #fff;background-color:darkgray;}.book-comment>p{width:100%;height: 40px;line-height: 40px;padding-left:10px;box-sizing:border-box;color: #fff;background-color:darkgray;margin-bottom: 0px;}
.comment-base-info{width:100%;height: 40px;line-height: 40px;padding-left:10px;box-sizing:border-box;color: #fff;background-color:yellowgreen}
.comment-content{padding:15px 10px;
}</style>

3.1.3 配置路由传参

具体问题详见:VUE中路由跳转传参问题

  • 通过query传递参数

     <router-link class="normal" :to="{path:'bookDesc',query:{'book':book}}">书名:{{ subBookName(book.book_name) }}</router-link>
    
  • 接受参数

     created() {let book=this.$route.query.book;}
    

3.1.4 接收后端传来的参数并做出处理

export default {data() {return {book:{}, }},methods: {//根据id查询书的信息queryBookById(book_id){this.$axios.get("/book/queryBookById").then(response=>{this.book=response.data;}).catch(error=>{alert(error)});}},created() {//获得Index.vue传来的值let book_id=this.$route.query.book_id;this.queryBookById(book_id)     }
}

3.2 服务端

3.2.1 BookController里增加该功能

@RequestMapping("/queryBookById")public Book queryBookById(Integer book_id){return bookService.queryBookById(book_id);}

3.2.2 BookService增加该功能

  • BookService接口
/*** 根据id查询图书信息* @param book_id* @return*/Book queryBookById(Integer book_id);
  • BookService接口实现
   @Overridepublic Book queryBookById(Integer book_id) {return bookMapper.queryBookById(book_id).get(0);}

3.2.3 BookMapper增加该功能

  • BookMapper接口
List<Book> queryBookById(Integer... book_ids);
  • BookMapper.xml
<select id="queryBookById" resultType="com.shopping.model.Book">select * from myshopping.tbl_bookwhere book_id in <foreach open="(" collection="book_ids" item="book_id" close=")" separator=",">#{book_id}</foreach>
</select>

4 查看图书评论信息

4.1 服务端

4.1.1 创建comment的model

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommentView implements Serializable {private Integer comment_id;private Integer user_id;private Integer book_id;private String comment_message;private Date comment_time;
}

4.1.2 BookController里增加该功能

 @RequestMapping("/queryCommentById")public List<CommentView> queryCommentById(Integer book_id){return bookService.queryCommentById(book_id);}

4.1.3 BookService增加该功能

  • BookService接口
  /*** 根据id查询图书评论* @param book_id* @return*/List<CommentView> queryCommentById(Integer book_id);
  • BookService接口实现
     @Resourceprivate CommentMapper commentMapper;@Overridepublic List<CommentView> queryCommentById(Integer book_id) {return commentMapper.queryCommentById(book_id);}

4.1.4 创建CommentMapper

  • CommentMapper接口
@Repository
public interface CommentMapper {List<CommentView> queryCommentById(Integer book_id);
}
  • CommentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shopping.mapper.CommentMapper"><select id="queryCommentById" resultType="com.shopping.model.view.CommentView">select tbl_comment.comment_id,tbl_comment.comment_message,tbl_comment.comment_time,user.user_namefrom myshopping.tbl_comment  join myshopping.tbl_user useron tbl_comment.user_id = user.user_idwhere tbl_comment.book_id=#{book_id}</select>
</mapper>

4.2 客户端

4.2.1 接收后端传来的数据,并做出处理

export default {data() {return {commentList:[], //图书评论}},methods: {/*** 根据图书编号查询评论* @param {} book_id */queryCommentById(book_id){this.$axios.get("/book/queryCommentById?book_id=" + book_id).then(response => {this.commentList = response.data;}) .catch(error => {alert(error)}); }       },created() {let book_id = this.$route.query.book_id;this.queryCommentById(book_id);   }
}

4.2.2 前端显示

<div class="book-comment"><p>图书评论</p>                <div class="comment-info" v-for="comment in commentList" :key="comment.comment_id"><div class="comment-base-info"><label style="display:inline-block;width:60%">评论人:{{comment.user_name}}             </label><label style="margin-right:20px">评论时间:{{comment.comment_time}}</label></div><div class="comment-content">{{ comment.comment_message }}</div></div><div class="comment-info" v-if="commentList.length==0"><div class="comment-content">暂无评论</div></div></div>

5 对商品评论进行分页处理

  • 基于程序分页(不用):一次性将数据查出,在程序进行逻辑处理实现分页
  • 基于数据库分页:根据分页的要求,一次查出一页数据mysql limit sqlserver top oracle rowNum

5.1 服务端

5.1.1添加pagehelper依赖

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version>
</dependency>

5.1.2 配置PageHelper

  pagehelper:#配置pagehelper方言,不同数据库生成sql语句不同helper-dialect: mysql#合理化配置,配置后访问的页码不存在则自动跳转到第一页reasonable: true#自动分页的配置,依据的是入参,如果参数中有pageNum,pageSize分页参数,则会自动分页.supportMethodsArguments: true

5.1.3 创建公共类-分页参数类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParams {private Integer pageSize;//每页记录数量private Integer pageNum;//当前页}

5.1.4 Service层写分页代码-BookServiceImpl类

    public Map<String, Object> queryCommentById(Integer book_id, PageParams pageParams) {//使用PageHelper实现分页//开始分页插件PageHelper.startPage(pageParams);List<CommentView> commentViews = commentMapper.queryCommentById(book_id);//将查询结果封装到PageInfo对象中,该对象是PageHelper提供的//该对象会根据commentViews来封装分页相关数据PageInfo<CommentView> pageInfo=new PageInfo<>(commentViews);//将分页需要返回的客户端数据封装到Map结合中Map<String,Object> map=new HashMap<>();map.put("total",pageInfo.getTotal());map.put("commentList",pageInfo.getList());
//        System.out.println(map.get("total")+"///"+map.get("commentList"));return map;}

5.1.5 修改BookController

  @RequestMapping("/queryCommentById")public Map<String, Object> queryCommentById(Integer book_id, PageParams pageParams){return bookService.queryCommentById(book_id,pageParams);}

5.2 客户端

5.2.1 前端使用Element的分页插件

<div class="pagination"><el-pagination background :page-size="pageParams.pageSize"      :current-page.sync="pageParams.pageNum" layout="prev, pager, next,jumper,->,total":total="total" @current-change="queryCommentByBookId(book.book_id)"></el-pagination>
</div>

5.2.2 前端定义分页参数,及向后端传递参数

export default {data() {return {commentList: [],//图书评论数组/*** 分页参数*/pageParams: {pageSize: 4,//每页显示的行数pageNum: 1//设置当前页},total: 0,//总行数}},methods: {/*** 根据图书编号获得该图书的所有评论信息*/queryCommentByBookId(book_id) {this.pageParams.book_id = book_id;//向对象中添加了一个属性this.$axios.get('book/queryCommentById', {params: this.pageParams}).then(response => {let map = response.data;this.total = map.total;//获得总记录数this.commentList = map.commentList;//获得查询的具体数据}).catch(error => {alert(error);})}},created() {//获得Index.vue传入的查询参数let book_id = this.$route.query.book_id;this.queryCommentByBookId(book_id);}
}

6 查看商品列表-基于Redis查询

  • 前端第一次获取数据,后端程序访问Redis,检测有无数据,若无数据,后端程序mysql中获取数据,mysql返回的数据,后端程序将数据一份保存在Redis中,一份在显示在前端
  • 第二次访问Redis,里面包含数据,后端程序直接从Redis中返回数据到前端
  • 数据库与Redis同步问题

    • 当数据库中的数据发生改变直接删除Redis中的数据
    • 当数据库中某条数据发生改变,修改Redis中该条数据

6.1 服务端

6.1.1引入Redis依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>${springboot-date-redis}</version>
</dependency>

6.1.2 在Service层做处理-BookServiceImpl

  • 思路

    1. 检测商品是否为上架商品

      ①如果传来的数据为0,则表示上架商品,默认从Redis中读取

      ②若传来数据不为0,则从数据库中读取

    2. 检测Redis是否包含上架商品

      ①若包含直接Redis中读取

      ②若不包含则从数据库中读取以上架商品

    3. 从数据库中获取已上架数据并向Redis中存储一份,然后返回

  • 采用hash存储商品信息显然更合适

  • 注入RedisTemplate

  private RedisTemplate redisTemplate;//构造器注入,并设置序列化Redis@Autowiredpublic BookServiceImpl(BookMapper bookMapper, CommentMapper commentMapper, RedisTemplate redisTemplate) {this.bookMapper = bookMapper;this.commentMapper = commentMapper;this.redisTemplate = redisTemplate;this.redisTemplate.setKeySerializer(new StringRedisSerializer());this.redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());}
  • 具体业务代码
    @Overridepublic List<Book> queryBook(Integer... isDisplay) {//从数据库获取数据List<Book> bookList = bookMapper.queryBook(isDisplay);Map<String,Object> booksMap=new HashMap<>();//检测商品是否上架if (isDisplay[0] == 0) {//获得hash操作对象HashOperations hashOperations = redisTemplate.opsForHash();//获得Redis中bookList中的数据Map bookListMap = hashOperations.entries("bookList");//检测Redis中是否存在数据,如不存在从数据库中获取数据if (bookListMap.size() == 0) {//遍历bookList,将bookList中数据转存到booksMap集合中for (Book book:bookList){booksMap.put("BOOKKEY:"+book.getBook_id(), book);}//将booksMap集合存到Redis中,RedisKey为BookListhashOperations.putAll("bookList",booksMap);return bookList;}else {//否则从Redis中直接获取数据Collection<Book> values = bookListMap.values();List<Book> bookLists=new ArrayList<>();for (Book book:values){bookLists.add(book);}return bookLists;}}else{return bookList;}}

微光集市-商品及其商品信息的显示(版本1.0)相关推荐

  1. 【JSP篇】——cookie之商品浏览记录的实现:4.显示商品的详细信息

    学习上一节:3.显示当前所有的商品效果与功能的实现 学习下一节:5.cookie实现前五条浏览记录 1.功能介绍 前面我们实现了商品所有信息的显示,接下来要实现某一商品详细信息的显示.那么我们就要思考 ...

  2. 创建购物车类,模拟购物车功能 1)添加商品到购物车(输入商品的编号和数量) 2)删除商品(删除购物车中的指定购物项) 3) 修改商品(修改商品的数量)4)显示所购买的商品信息(按商品的总价进行升序显

    import java.util.Objects;/*** @Author: 廾匸* @Date: 2020/11/18 18:32* @Description: 商品类* @version: 1.0 ...

  3. jeecg-boot:将单表列表页作为弹框,并且传递参数到解决方案(场景商品到明细信息维护)

    使用场景: 做商城到时候,需要维护商品到基础信息和其他附属信息,为了方便维护,进行其他附属信息维护到时候直接在商品到列表界面点击操作区域到连接弹出操作框进行操作. 比如: 以下以商品到相册为例进行讲解 ...

  4. ecshop简化虚拟商品购买收货人信息【ECSHOP购物车不存在实体商品电话改为非必须以及隐藏掉】

    插件简介 ECSHOP默认购买虚拟商品,收货人信息页面需要填写收货人.邮箱.电话.手机.这里我们做了简化处理,只需要填写收货人以及邮箱,其余的只有存在实体商品下才采用. 实测演示效果截图: 如果购物车 ...

  5. 商城-3 查询商品详情页信息

    查询商品详情页信息 上面章节完成了查询spu列表 在商品列表中选中商品后,会显示这个商品的详情信息 商品详情页我们需要显示的信息包括 根据spuId查询spu信息 根据spuId查询spuDetail ...

  6. 淘宝店铺商品管理解决方案-商品SKU信息获取和修改oAuth2.0接口接入解决方案

    商品管理对接方案: 从店铺宝贝管理场景出发,提供涵盖了宝贝主图.标题.属性信息.详情页海报等各个模块高效处理/优化的功能.并通过提供批量修改.自动补库存.定时上架.库存预警等功能帮助商家提高店铺经营效 ...

  7. 获取淘宝商品的SKU信息

    1 #region 获取商品SKU 2 /// <summary> 3 /// 获取获取访问令牌(授权→获取商品信息→获取SKU) 4 /// </summary> 5 pri ...

  8. php超市进销存单位换算,进销存软件如何设置商品单位换算比率小数显示位数?...

    进销存软件中支持多计量单位,可以添加商品辅助单位,即同一个商品存在多个不同的计量单位,这几个单位之间存在一定的换算关系,开单时不管输入哪一个单位,软件都可以根据换算比例来自动进行换算转换.辅助单位信息 ...

  9. excel不显示0_进销存软件如何设置仓库库存查询默认不显示库存为0的商品? 常见问题文章中心信管飞软件官网...

    信管飞仓库管理软件.信管飞RMS支持管理仓库库存,可在仓库库存查询界面查询当前商品库存数量,软件支持设置在仓库库存查询时默认不显示库存为0的商品,方便汇总有库存的商品信息.本文以信管飞RMS为例,示范 ...

最新文章

  1. RabbitMQ 入门系列(7)— 如何保证 RabbitMQ 高可用性
  2. web页,如何按回车获得焦点,触发web控件事件..?
  3. python物联网通信_物联网通信RESTDemo示例程序(Python版本)
  4. npm WARN saveError ENOENT: no such file or directory, open ‘/Users/....../package.json‘的解决办法
  5. php300云,概述 · PHP300Framework2.0 · 看云
  6. XunSearch的使用
  7. HTML5新增标签 0303
  8. 为什么我们一直赚不到钱?
  9. 考研(一):一段不错的经历之考研总结
  10. input 上传图片_selnium远程机上传图片遇到的坑-布布扣
  11. linux grep命令使用详解
  12. java 图片深度_图像的色彩值称为图像的颜色深度,黑白图像的颜色深度为( )位。...
  13. 质心公式_No.217 质心位置的求法(基础篇)
  14. 多层感知器(Muti-Layer Perception ,MLP)
  15. Cannot execute request on any known server或DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761
  16. 第三周 目标检测(Object detection)
  17. 安卓接入微信php处理,PHP对接微信公众号实现简单自动回复
  18. 打怪升级之FIFO读完了再读会坏掉嘛?
  19. 正则表达式之grep、egrep工具的使用方法
  20. Fiddler模拟发送POST请求

热门文章

  1. 系统镜像ISO、GHO、WIM、ESD的区别
  2. 互联网创业公司如何防御DDoS攻击?
  3. 痛失PC霸主的联想,刘军将迎来艰难之战
  4. 程序大咖的博客集锦_更新Unity3d
  5. Mac与Windows操作系统的区别
  6. Css、less和Sass(SCSS)的区别
  7. Sass、Scss、Less和Stylus区别总结
  8. 学生鲜花网页设计作品静态HTML网页模板源码 大学生鲜花商城网站制作 简单鲜花网站网页设计成品
  9. 如何嫁给年入百万的阿里人?
  10. 苹果手机语音备忘录在哪_玩转备忘录,只需要6个技巧!附赠苹果手机备忘录删除恢复技巧...