文章目录

  • 1.项目预计
    • 1.1小项目特点
    • 1.2大项目特点
    • 1.3 主要电商模式
  • 2. 青橙-需求分析与系统设计
    • 2.1 需求分析
    • 2.2 系统设计
      • 2.2.1 数据库分库设计
      • 2.2.3 系统架构图
  • 3. 通用mapper
    • 3.1 通用mapper简介
    • 3.2 通用mapper快速入门
      • 3.2.1 通用mapper与Spring集成
      • 3.2.2 实体类映射
      • 3.2.3 创建Mapper接口
  • 4. 青橙-工程搭建
    • 4.1 准备工作
    • 4.3 工程搭建
      • 4.3.1 父工程与公共模块
      • 4.3.2 服务层模块(商品)
      • 4.3.3 web层(管理后台)
  • 5. 青橙管理后台-品牌管理后端
    • 5.1 需求分析
    • 5.2 表结构分析
    • 5.3 代码实现
      • 5.3.1 品牌列表
      • 测试
      • 5.3.2 品牌分页列表
      • 5.3.3 品牌条件查询
      • 5.3.4 品牌条件+分页查询
      • 5.3.5 根据ID查询品牌
      • 5.3.6 品牌新增
      • 5.3.7 品牌修改
      • 5.3.8 品牌删除
  • 6. 公共异常处理

1.项目预计

序列1-地址:https://github.com/Jonekaka/javaweb-qingcheng-1-76/tree/master/qingchengcode/qingchengcode

1.1小项目特点

对于一些小项目ssm就够了,但是对于高并发的大项目
需要更多新技术的融合与赋能

1.2大项目特点

技术新,技术范围广-技术
分布式、集群、高并发、负载均衡、高可用-设备压力分担
海量数据-数据
业务复杂-业务
系统安全-安全
将多个小设备虚拟为一个超算

1.3 主要电商模式

B2B ( Business to Business)是指进行电子商务交易的供需双方都是商家(或企
业、公司),她(他)们使用了互联网的技术或各种商务网络平台,完成商务交易的
过程。电子商务是现代 B2B marketing的一种具体主要的表现形式。
案例:阿里巴巴、慧聪网

C2C即 Customer(Consumer) to Customer(Consumer),意思就是消费者个
人间的电子商务行为。比如一个消费者有一台电脑,通过网络进行交易,把它出售给
另外一个消费者,此种交易类型就称为C2C电子商务。
案例:淘宝、易趣、瓜子二手车

B2C是Business-to-Customer的缩写,而其中文简称为“商对客”。“商对客”是电子商
务的一种模式,也就是通常说的直接面向消费者销售产品和服务商业零售模式。这种
形式的电子商务一般以网络零售业为主,主要借助于互联网开展在线销售活动。B2C
即企业通过互联网为消费者提供一个新型的购物环境——网上商店,消费者通过网络
在网上购物、网上支付等消费行为。
注:本项目采用B2C模式

案例:唯品会、乐蜂网B2B2C是一种电子商务类型的网络购物商业模式,B是BUSINESS的简称,C是
CUSTOMER的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子
商务的企业,C则是表示消费者。
案例:京东商城、天猫商城

C2B(Consumer to Business,即消费者到企业),是互联网经济时代新的商业模
式。这一模式改变了原有生产者(企业和机构)和消费者的关系,是一种消费者贡献
价值(Create Value), 企业和机构消费价值(Consume Value)。
C2B模式和我们熟知的供需模式(DSM, Demand SupplyModel)恰恰相反,真正的
C2B 应该先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产
企业按需求组织生产。通常情况为消费者根据自身需求定制产品和价格,或主动参与
产品设计、生产和定价,产品、价格等彰显消费者的个性化需求,生产企业进行定制
化生产。
案例:海尔商城、 尚品宅配

O2O即Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联
网结合,让互联网成为线下交易的平台,这个概念最早来源于美国。O2O的概念非
常广泛,既可涉及到线上,又可涉及到线下,可以通称为O2O。主流商业管理课程均
对O2O这种新型的商业模式有所介绍及关注。
案例:美团、饿了吗

F2C指的是Factory to customer,即从厂商到消费者的电子商务模式。

2. 青橙-需求分析与系统设计

2.1 需求分析

《青橙》是一个全品类B2C电商平台(单品类就是只卖一类,比如衣服,化妆品),包含网站前台和管理后台两大部分。网站前台
包含主站频道(首页、搜索、购物车及支付)、用户中心、秒杀、优惠券等频道。管理
后台包含商品、订单、库存、用户、运营、统计、财务、设置等功能
后台


前台


等等,商品详情页,登录页,评论页

2.2 系统设计

2.2.1 数据库分库设计

(1)商品库 qingcheng_goods
(2)订单库 qingcheng_order
(3)基础设置库 qingcheng_config
(4)运营库 qingcheng_business
(5)用户库 qingcheng_user
(6)系统库qingcheng_system
(7)支付库 qingcheng_pay
(8)短信库 qingcheng_sms
2.2.2 技术选型
主框架技术:SSM(通用mapper,比mybatis使用更加简单)+Dubbo(分布式框架)
前端技术: 网站后台 Vue.js+ElementUI(ui库) 网站前台采用Vue.js 和模板技术 thymeleaf
消息中间件技术: RabbitMQ
搜索中间件技术: elasticsearch
缓存中间件技术: redis
报表插件: echars
安全框架:SpringSecurity
单点登录中间件 :CAS

2.2.3 系统架构图

3. 通用mapper

3.1 通用mapper简介

对mybatis进行了进一步封装,解决mybatis存在的问题
通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增
删改查操作以及Example相关的单表操作。为什么要用通用mapper?我们这里列举一下
原生Mybatis的痛点:
1、mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
2、需要自己实现sql分页,select * from table where . . . limit 1,3
自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
3、数据库可移植性差:如果项目更换数据库,比如oracle–>mysql,mapper.xml中的
sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
4、生成的代码量过大。
5、批量操作,批量插入,批量更新,需要自写。
而这些,通过通用mapper就可以很轻松的解决了。

3.2 通用mapper快速入门

在线官方文档:https://gitee.com/free/Mapper/wikis/Home

3.2.1 通用mapper与Spring集成

官方的文档中介绍了通用mapper的三种使用方式 ,纯java使用方式、与Spring集成方
式、与SpringBoot集成方式。这里给大家介绍的是与Spring集成方式。

如果对语句抽象化,自动生成,自然能够避免表不同,数据库语法不同而带来的修改问题
同时也可以实现扩展功能,比如自动分页
也可以批量完成
实现数据库接口crud调用mapper提供的功能接口即可

(1)引入依赖
正常情况下,Spring 和 MyBatis 的集成环境中,应该已经存在下面的依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>版本号</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis‐spring</artifactId><version>版本号</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring‐context</artifactId><version>版本号</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring‐tx</artifactId><version>版本号</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring‐jdbc</artifactId><version>版本号</version></dependency>

集成通用 Mapper 在上面的基础上添加下面的依赖:

  <dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>最新版本</version></dependency>

(2)与spring集成
和通用 Mapper 以前版本一样,可以直接使用 tk.mybatis 提供
的 tk.mybatis.spring.mapper.MapperScannerConfigurer 进行配置,这个配置和
MyBatis 官方提供的 org.mybatis.spring.mapper.MapperScannerConfigurer 区别只是
第一层的包名, tk 和 org 。所以使用这种方式时,如果你项目已经使用 org. 进行了
配置,只需要改成 tk. 即可。

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="扫描包名"/></bean>

项目中采用的是这种xml的配置方式,通用mapper还提供了注解方式的配置,

3.2.2 实体类映射

实体类映射类似下列形式

@Table(name="tb_brand")public class Brand implements Serializable{@Idprivate Integer id;private String name;//getter and setter ....}

@Table是指定实体类对应的数据库表 @Id指的是主键映射。经过上面简单的配置后,相
当于就有了 MyBatis 中的关系映射了

3.2.3 创建Mapper接口

 public interface BrandMapper extends Mapper<Brand> {}

这里继承了 tk.mybatis.mapper.common.Mapper 接口,在接口上指定了泛型类
型 Brand 。当你继承了 Mapper 接口后,此时就已经有了针对 Brand 的大量方法,方
法如下:

等等》》》
这些方法中和 MBG 生成的大部分方法都一致,还有一部分 MBG 之外的常用方法。

基础接口select
List select(T record)
根据T对象中的属性名称查询,类似于select * from table where t.name=#{name} and
t.password = #{password}

T selectOne(T record)
根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
T selectByPrimaryKey(Object key)
根据主键查询 说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条
件使用等号
int selectCount(T record);
说明:根据实体中的属性查询总数,查询条件使用等号基础接口insert
int insert(T record);
说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
int insertSelective(T record);
说明:保存一个实体,null的属性不会保存,会使用数据库默认值

基础接口Update
int updateByPrimaryKey(T record);
说明:根据主键更新实体全部字段,null值会被更新
int updateByPrimaryKeySelective(T record);
说明:根据主键更新属性不为null的值

基础接口delete
int delete(T record);
说明:根据实体属性作为条件进行删除,查询条件使用等号
int deleteByPrimaryKey(Object key);
说明:根据主键字段进行删除,方法参数必须包含完整的主键属性

4. 青橙-工程搭建

4.1 准备工作

先进行环境准备
(1)配置maven本地仓库
(2)创建数据库表
(3)注册中心zookeeper
4.2 模块依赖关系图
我们的工程有三种模块:(1)公共模块(解决模块的重复问题,这里主要是服务层与web层的重复问题,以及模块重复带来的复杂性-面向对象的思想) (2)服务层模块 (3)web层模块。
公共模块主要由公共配置和公共类构成。模块依赖关系入下图:

4.3 工程搭建

4.3.1 父工程与公共模块

(1)创建父工程qingcheng_parent pom.xml
父工程没有代码,删掉src文件夹

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qingcheng</groupId><artifactId>qingcheng_parent</artifactId><version>1.0-SNAPSHOT</version><modules><module>qingcheng_common</module><module>qingcheng_common_service</module><module>qingcheng_common_web</module><module>qingcheng_pojo</module><module>qingcheng_interface</module><module>qingcheng_service_goods</module><module>qingcheng_web_manager</module></modules><packaging>pom</packaging><!-- 集中定义依赖版本号 --><properties><junit.version>4.12</junit.version><spring.version>5.0.5.RELEASE</spring.version><pagehelper.version>4.1.4</pagehelper.version><servlet-api.version>2.5</servlet-api.version><dubbo.version>2.6.0</dubbo.version><zookeeper.version>3.4.7</zookeeper.version><zkclient.version>0.1</zkclient.version><mybatis.version>3.4.5</mybatis.version><mybatis.spring.version>1.3.1</mybatis.spring.version><mybatis.paginator.version>1.2.15</mybatis.paginator.version><mysql.version>5.1.32</mysql.version><druid.version>1.0.9</druid.version><commons-fileupload.version>1.3.1</commons-fileupload.version><spring.security.version>5.0.5.RELEASE</spring.security.version><jackson.version>2.9.4</jackson.version></properties><!-- 依赖管理标签  必须加 --><dependencyManagement><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>${zookeeper.version}</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>${zkclient.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>${pagehelper.version}</version></dependency><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version></dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId><version>${mybatis.paginator.version}</version></dependency><!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><!-- 文件上传组件 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>${commons-fileupload.version}</version></dependency><!-- 安全框架 --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring.security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring.security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>${spring.security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-cas</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></exclusion></exclusions></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>xml-apis</groupId><artifactId>xml-apis</artifactId><version>1.4.01</version></dependency><!-- 缓存 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.0.5.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency><!--通用Mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>4.1.4</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.7</version></dependency><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.2.1</version></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>2.1.4.RELEASE</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet-api.version}</version><scope>provided</scope></dependency></dependencies><!--为了使用jdk1.8新特性,引入。--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build></project>

上面为父
这里仅仅是依赖版本的定义,并非真正的引入依赖
假如common将所有依赖吸收到自己哪里,其他类只需要引入common即可
(2)创建公共模块qingcheng_common,pom.xm
搭建公共模块,从最顶层开始搭建
提供基础参数

resources下创建applicationContext-common.xml

<!--用来加载所有文件名末尾属性为properties的文件--><context:property-placeholder location="classpath*:*.properties" />

resources下创建zk.properties
zk.properties

#配置zk连接地址地址,只要服务器建立,各个模块开放端口就会找到并连接
zk.address=127.0.0.1:2181

resources下创建log4j.properties
配置日志参数

(3)创建qingcheng_common_service ,pom.xml
搭建服务公共模块
依赖了common,这样就将其依赖拉进来了

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>qingcheng_parent</artifactId><groupId>com.qingcheng</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>qingcheng_common_service</artifactId><!--引入common依赖,传递依赖,--><dependencies><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_common</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId></dependency><!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><!--通用Mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId></dependency><!-- 缓存 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version></dependency></dependencies></project>

resources下创建applicationContext-dao.xml,mybatis的
数据库相关的配置,包括连接,事务管理,包扫描,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--数据源的一些配置--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="maxActive" value="10" /><property name="minIdle" value="5" /></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="plugins"><!--mybatis的插件,分页--><array><bean class="com.github.pagehelper.PageHelper"><property name="properties"><value>dialect=mysql</value></property></bean></array></property></bean><!--包扫描--><bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.qingcheng.dao" /></bean><!-- 事务管理器  --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!--开启事务控制的注解支持注意:此处必须加入proxy-target-class="true",需要进行事务控制,会由Spring框架产生代理对象,Dubbo需要将Service发布为服务,要求必须使用cglib创建代理对象。--><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/></beans>

resources下创建applicationContext-dubbo.xml,dubbo的
dubbo的配置,扫描common的配置文件,初始化

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--指定暴露服务的端口,如果不指定默认为20880--><dubbo:protocol name="dubbo" port="${dubbo.port}"/><dubbo:application name="${dubbo.application}" /><!--zk地址为common而来--><dubbo:registry protocol="zookeeper" address="${zk.address}" /><dubbo:annotation package="com.qingcheng.service" /><!--<context:annotation-config/>--><dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000"/>
</beans>

redis的
spring的redis配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:cache="http://www.springframework.org/schema/cache"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/beans/spring-cache.xsd"><!-- redis 相关配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  <property name="maxIdle" value="${redis.maxIdle}" />   <property name="maxWaitMillis" value="${redis.maxWait}" />  <property name="testOnBorrow" value="${redis.testOnBorrow}" />  </bean>  <!--spring data redis的配置,使用中会用到配置文件,已经添加--><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  <property name="connectionFactory" ref="jedisConnectionFactory" /></bean></beans>

这些公共模块的建立当然是为了服务相应的功能模块
(4)创建qingcheng_common_web模块,pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>qingcheng_parent</artifactId><groupId>com.qingcheng</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion>
<!--传递依赖--><artifactId>qingcheng_common_web</artifactId><dependencies><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_pojo</artifactId><version>1.0-SNAPSHOT</version></dependency><!--文件上传相关依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><!--spring安全依赖--><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency>
<!--阿里提供的存储对象依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency></dependencies></project>

resources下创建applicationContext-json.xml

<mvc:annotation‐driven>
<mvc:message‐converters register‐defaults="true">
<beanclass="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes" value="application/json"/><property name="features"><list><value>WriteMapNullValue</value><value>WriteDateUseDateFormat</value></list></property>
</bean>
</mvc:message‐converters>
</mvc:annotation‐driven>

resources下创建applicationContext-dubbo.xml

<!-- 引用dubbo 服务,为工程起名字 --><dubbo:application name="${dubbo.application}" /><!--对zk地址配置--><dubbo:registry protocol="zookeeper" address="${zk.address}"/><!--扫描所有控制器的类--><dubbo:annotation package="com.qingcheng.controller" />

下面两个模块也会被其他模块所引用,也可以归类为公共模块
(5)创建实体层模块qingcheng_pojo,pom.xml

<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence‐api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>

(6)创建服务接口层模块 qingcheng_interface ,pom.xml

<!--jpa注解-->
<dependency>
<groupId>com.qingcheng</groupId>
<artifactId>qingcheng_pojo</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>

4.3.2 服务层模块(商品)


其中一个为例子,其他一样
需要搭建很多的功能服务模块,为其服务

对于引用的tomcat7插件,因为要使用众多的服务,因此为每一个创建一个端口号,从9001递增
商品服务

在配置文件中注册dubbo的服务,每个注册的端口应该不同,否则起冲突,递增即可
dubbo.port=20881
dubbo.application=goods
以及连接数据库的参数
(1)创建qingcheng_service_goods模块,pom.xml

<dependencies><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_interface</artifactId><version>1.0‐SNAPSHOT</version></dependency><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_common_service</artifactId><version>1.0‐SNAPSHOT</version></dependency>
</dependencies>
<!--指定各个服务的端口,创建各自的服务器。从9001开始-->
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7‐maven‐plugin</artifactId><configuration><!‐‐ 指定端口 ‐‐><port>9001</port><!‐‐ 请求路径 ‐‐><path>/</path></configuration></plugin></plugins>
</build>

(2)创建webapp/WEB-INF/web.xml
服务模块依赖公共服务层,会扫描公共服务层所配置的文件,扫描依赖的依赖
每一个服务层对于配置文件来说,
仅仅是dubbo注册的端口与名字不同
数据库连接的不同

<!DOCTYPE web‐app PUBLIC
"‐//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web‐app_2_3.dtd" >
<web‐app>
<display‐name>Archetype Created Web Application</display‐name>
<!‐‐ 加载spring容器 ‐‐>
<context‐param>
<param‐name>contextConfigLocation</param‐name>
<param‐value>classpath*:applicationContext*.xml</param‐value>
</context‐param>
<listener>
<listener‐
class>org.springframework.web.context.ContextLoaderListener</listener‐
class>
</listener>
</web‐app>

(3)resources下创建dubbo.properties
配置功能区的端口与名字

dubbo.port=20881
dubbo.application=goods

(4)resources下创建db.properties
配置数据库连接信息

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/qingcheng_goods?
characterEncoding=utf‐8
jdbc.username=root
jdbc.password=123456

4.3.3 web层(管理后台)

(1)创建qingcheng_web_manager模块,pom.xml
既然要运行后台管理,就需要指定打包方式,
用到了之前创建的公共web模块,以及功能接口模块,
其实任何的服务模块以及web模块都需要实现功能接口

<dependencies><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_interface</artifactId><version>1.0‐SNAPSHOT</version></dependency><dependency><groupId>com.qingcheng</groupId><artifactId>qingcheng_common_web</artifactId><version>1.0‐SNAPSHOT</version></dependency>
</dependencies>
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7‐maven‐plugin</artifactId><configuration><!‐‐ 指定端口 ‐‐><port>9101</port><!‐‐ 请求路径 ‐‐><path>/</path></configuration></plugin></plugins>
</build>

(2)创建webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><display-name>Archetype Created Web Application</display-name><!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--安全框架的过滤器,暂时不用-->
<!--<filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping>
--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载,除了本身的,它所依赖的也能找到 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

(3)resources下创建dubbo.properties
web模块不用配置端口,
服务模块因为分布式的关系,需要配置端口

dubbo.application=manager

5. 青橙管理后台-品牌管理后端

5.1 需求分析

实现对品牌的基本操作(增删改查),只完成后端代码部分,并通过浏览器等工具完成
测试。

5.2 表结构分析

tb_brand 品牌表
就是品牌类别,图片地址时品牌的logo

字段名称 字段含义 字段类型 字段长度 备注
id 品牌id INT
name 品牌名称 VARCHAR
image 品牌图片地址 VARCHAR
letter 品牌的首字母 CHAR
seq 排序 INT

5.3 代码实现

5.3.1 品牌列表

url
/brand/findAll.do
http请求方式
GET
返回格式

[{"id": 品牌id,
"name": 品牌名称,
"image": 品牌图片地址,
"letter": 品牌的首字母,
"seq": 排序,
},
.......
]

代码实现:
(1)在qingcheng_pojo工程创建com.qingcheng.pojo包,包下创建实体类
为什么叫goods,因为,每个服务对象便于区分
序列化时为了网络传输数据的可靠性
如果实体类名字和表名仅仅是第一个字母大小写不同,无所谓,name可以不加
建立好数据类后添加访问层

@Table(name="tb_brand")
public class Brand implements Serializable{@Idprivate Integer id;//品牌idprivate String name;//品牌名称private String image;//品牌图片地址private String letter;//品牌的首字母private Integer seq;//排序
// getter and setter ......
}

(2)qingcheng_service_goods工程创建com.qingcheng.dao,包下创建数据访问层接

创建数据访问层,使用通用mapper实现基础的方法
毕竟这里是服务层啊,就是负责实现方法的

/*数据访问层,dao*/
public interface BrandMapper extends Mapper<Brand> {}

(3)qingcheng_interface工程创建com.qingcheng.service.goods包,包下创建业务接

/*** 品牌业务逻辑层*/
public interface BrandService {public List<Brand> findAll();
}

(4)qingcheng_service_goods工程创建com.qingcheng.service.impl包,包下创建类

@Service
public class BrandServiceImpl implements BrandService {@Autowiredprivate BrandMapper brandMapper;public List<Brand> findAll() {return brandMapper.selectAll();}
}

(5)qingcheng_web_manager工程创建com.qingcheng.controller.goods 包,包下创
建类

@RestController
@RequestMapping("/brand")
public class BrandController {@Reference/*注入远程的业务接口*/private BrandService brandService;@GetMapping("/findAll")public List<Brand> findAll(){return brandService.findAll();}
}

测试

开启,可以在虚拟机中,也可以本机,zk

安装inferface,pojo
如果变化也要重新安装
地址访问9101实际上是在向zk申请goods的功能服务,
开启service的tomcat7 run,开启,开启manager的tomcat7

浏览器输入:http://localhost:9101/brand/findAll.do
数据库返回数据,调用成功

web后台向zk申请goods的服务,goods继承了功能接口,实现了接口方法;接口调用了pojo数据对象
common配置了全局zk属性,公共服务层与web层则配置了基础的共用配置文件被相应的功能模块引用
web后台融合了公共web层,接口层
goods服务融合了公共service层,接口层,pojo层,就像金字塔一样
后台的每一个函数都是集大成者

5.3.2 品牌分页列表

接口定义:
url
/brand/findPage.do
http请求方式
GET
请求参数

参数 必选 类型 说明
page true int 页码
size true int 每页记录数

例子:
GET /brand/findPage.do?page=1&size=10
返回格式

{rows:[{"id": 品牌id,"name": 品牌名称,"image": 品牌图片地址,"letter": 品牌的首字母,"seq": 排序,},.......],total:100}

pojo是和数据库对应的类,entity是自己封装的类,实现自定义数据模块
创建类pojo,创建功能接口interface,创建实现manager,分步实现
代码实现:
(1)qingcheng_pojo创建com.qingcheng.entity包,包下创建类
用来承载分页查询的对象

/*** 分页结果* @param <T>*/
public class PageResult<T> implements Serializable {private Long total;//记录数private List<T> rows;//结果集public PageResult(Long total, List<T> rows) {this.total = total;this.rows = rows;}public PageResult() {}public Long getTotal() {return total;}public List<T> getRows() {return rows;}public void setRows(List<T> rows) {this.rows = rows;}public void setTotal(Long total) {this.total = total;}
}

(2)qingcheng_interface工程BrandService接口新增方法
使用github的分页插件实现自动分页,省力

指定用get方法请求,则只能get请求,requestmapping为通用请求
* 好处是参数直接可以输入page=size=方便多了

public PageResult<Brand> findPage(int page, int size);

(3)qingcheng_service_goods工程BrandServiceImpl新增方法

/*** 分页查询* @param page 页码* @param size 每页记录数* @return 分页结果*/
public PageResult<Brand> findPage(int page, int size) {PageHelper.startPage(page,size);Page<Brand> brands = (Page<Brand>) brandMapper.selectAll();return new PageResult<Brand>
(brands.getTotal(),brands.getResult());}

(4)qingcheng_web_manager工程BrandController新增方法

@GetMapping("/findPage")
public PageResult<Brand> findPage(int page, int size){return brandService.findPage(page, size);}

因为更新了interface与pojo,所以需要重新安装
启动工程,浏览器测试:http://localhost:9101/brand/findPage.do?page=1&size=10

使用postman查看

5.3.3 品牌条件查询

url
/brand/findList.do
http请求方式
POST
请求参数

参数 必选 类型 说明
searchMap true Map 条件对象,格式如实体对象

例子:

POST /brand/findList.do{"name": 品牌名称,"letter": 品牌的首字母}

返回格式

[{"id": 品牌id,"name": 品牌名称,"image": 品牌图片地址,"letter": 品牌的首字母,"seq": 排序,},.......]

代码实现:
(1)qingcheng_interface工程BrandService接口新增方法

public List<Brand> findList(Map<String, Object> searchMap);

(2)qingcheng_service_goods工程BrandServiceImpl新增方法
根据传过来的参数进行查询
根据输入的参数,创建查询条件

/*** 条件查询* @param searchMap 查询条件* @return*/
public List<Brand> findList(Map<String, Object> searchMap) {Example example = createExample(searchMap);return brandMapper.selectByExample(example);}
/*** 构建查询条件* @param searchMap* @return*/
private Example createExample(Map<String, Object> searchMap){Example example=new Example(Brand.class);Example.Criteria criteria = example.createCriteria();if(searchMap!=null){//名称条件if(searchMap.get("name")!=null &&!"".equals(searchMap.get("name"))){criteria.andLike("name","%"+(String)searchMap.get("name")+"%");}
//首字母if(searchMap.get("letter")!=null &&!"".equals(searchMap.get("letter"))){criteria.andEqualTo("letter",(String)searchMap.get("letter"));}}return example;}

(3)qingcheng_web_manager工程BrandController新增方法

 @PostMapping("/findList")/*加入注解,分解请求得到的json数据*//*之前都是get请求的,输入条件参数,现在post请求*/public List<Brand> findList( @RequestBody Map searchMap){return brandService.findList(searchMap);}

/之前都是get请求的,输入条件参数,现在post请求/
使用postman

以json方式请求,

多个条件加逗号即可

5.3.4 品牌条件+分页查询

写一个功能函数囊括以上两个功能即可
url
/brand/findPage.do
http请求方式
POST
请求参数

参数 必选 类型 说明
searchMap true Map 条件对象,格式如实体对象
page true int 页码(GET)
size true int 每页记录数(GET)

例子:

POST /brand/findPage.do?page=1&size=10{"name": 品牌名称,"letter": 品牌的首字母}

返回格式:

{rows:[{"id": 品牌id,"name": 品牌名称,"image": 品牌图片地址,"letter": 品牌的首字母,"seq": 排序},.......],total:100}

代码实现:
(1)qingcheng_interface工程BrandService接口新增方法

public PageResult<Brand> findPage(Map<String,Object> searchMap,int page,int size);

(2)qingcheng_service_goods工程BrandServiceImpl新增方法

/*** 分页+条件查询* @param searchMap* @param page* @param size* @return*/
public PageResult<Brand> findPage(Map<String, Object> searchMap, intpage, int size) {PageHelper.startPage(page,size);Example example = createExample(searchMap);Page<Brand> brands = (Page<Brand>)brandMapper.selectByExample(example);return new PageResult<Brand>
(brands.getTotal(),brands.getResult());}

(3)qingcheng_web_manager工程BrandController新增方法

@PostMapping("/findPage")
public PageResult<Brand> findPage(@RequestBody Map<String,Object>
searchMap,int page, int size){return brandService.findPage(searchMap,page,size);}

使用了多态,将findPage执行了分页与条件的多次编写

5.3.5 根据ID查询品牌

url
/brand/findById.do
http请求方式
GET
请求参数

参数 必选 类型 说明
id true int 主键

代码实现:
(1)qingcheng_interface工程BrandService接口新增方法

public Brand findById(Integer id);

(2)qingcheng_service_goods工程BrandServiceImpl新增方法
接口,实现,网址映射

/*** 根据Id查询* @param id* @return*/
public Brand findById(Integer id) {return brandMapper.selectByPrimaryKey(id);}

(3)qingcheng_web_manager工程BrandController新增方法

@GetMapping("/findById")
public Brand findById(Integer id){return brandService.findById(id);}

5.3.6 品牌新增

(1)qingcheng_pojo 新增类

/*** 返回前端的消息封装,正确错误都有信息了*/
public class Result implements Serializable {private Integer code;//返回的业务码 0:成功执行 1:发生错误private String message;//信息public Result(Integer code, String message) {this.code = code;this.message = message;}public Result() {this.code=0;this.message = "执行成功";}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

(2)qingcheng_interface工程BrandService接口新增方法

public void add(Brand brand);

(3)qingcheng_service_goods工程BrandServiceImpl新增方法

/*** 新增* @param brand*/
public void add(Brand brand) {brandMapper.insert(brand);}

(4)qingcheng_web_manager工程BrandController新增方法

@PostMapping("/add")
public Result add(@RequestBody Brand brand){brandService.add(brand);return new Result();}

5.3.7 品牌修改

对于修改的方法,
第一个根据条件更新,第二个是如果有null值会被忽略,如果包含null值会被覆盖还是忽略,第四个为忽略,更加实用,不覆盖该数据库原来的数据

(1)qingcheng_interface工程BrandService接口新增方法

public void update(Brand brand);

(2)qingcheng_service_goods工程BrandServiceImpl新增方法

/*** 修改* @param brand*/
public void update(Brand brand) {brandMapper.updateByPrimaryKeySelective(brand);}

(3)qingcheng_web_manager工程BrandController新增方法

@PostMapping("/update")
public Result update(@RequestBody Brand brand){brandService.update(brand);return new Result();}

5.3.8 品牌删除

url
/brand/delete.do
http请求方式
GET
请求参数

参数 必选 类型 说明
id true int 主键

例子:

GET /brand/delete.do?id=1

返回格式:

{code:0,message:""}

code为0表示成功,为1表示失败
代码实现:
(1)qingcheng_interface工程BrandService接口新增方法

public void delete(Integer id);

(2)qingcheng_service_goods工程BrandServiceImpl新增方法

/*** 删除* @param id*/
public void delete(Integer id) {brandMapper.deleteByPrimaryKey(id);}

(3)qingcheng_web_manager工程BrandController新增方法

@GetMapping("/delete")
public Result delete(Integer id){brandService.delete(id);return new Result();}

以上主要是为了尝试,通用mapper的方法

6. 公共异常处理

应该将项目所有的异常,进行统一管理
qingcheng_common_web工程创建com.qingcheng.controller包,包下创建类
加上注解,表示其是控制器通知类@ControllerAdvice
指定检测的异常类型,@ExceptionHandler(Exception.class)

/*** 统一异常处理类*/
@ControllerAdvice
public class BaseExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(Exception e) {e.printStackTrace();System.out.println("调用了公共异常处理类");return new Result(1,e.getMessage());}
}

当发生异常时候,会将状态码和异常捕捉进入Result类,在增删改查时返回Result类,推送到前端
注意回顾系统架构图,所有的都是围绕其展开
这里仅仅用zk和dubbo实现了功能的分布式 部署,mapper实现对数据库的增删改查,
界面的编写后续编号+项目功能模块为标题逐步更新
从0到1构建

javaweb-青橙项目-1-76相关推荐

  1. 青橙项目之品牌管理前端 day2

    学习掌握目标 1.Element-Ui组件了解与使用 2.ES6与ES5语法 3.品牌管理的前端代码 4.图片上传代码,本地和阿里云存储 5.掌握阿里云oss存储 未完成 1.ElementUI简介 ...

  2. javaweb-青橙项目-6-81

    文章目录 第6章 统计分析 学习目标 1. 商品类目销售分析表 1.1 需求分析 1.2 实现思路 1.3 代码实现 1.3.1 类目统计SQL语句 1.3.2 类目统计代码实现 1.3.3 定时任务 ...

  3. 青橙商城项目总结day03-04

    青橙商城项目总结 day03_模板与分类管理 设计模式:SSM;分库分表 技术栈:黑马架构师:vue:Element UI 学习目标: 1)使用"黑马架构师"完成代码生成 \1. ...

  4. 青橙商城项目总结day02

    青橙商城项目总结 day02_品牌管理前端与图片上传 技术栈:Element UI:ES6:Spring:OSS 学习目标: 1)ElementUI常用组件:https://element.eleme ...

  5. 阿里青橙奖名单公布,23位院士、2位图灵奖得主推荐

    9月9日,2020年阿里巴巴达摩院青橙奖获奖名单公布,梁文华等10位青年科学家获得达摩院的1000万元奖金.这群平均年龄不足32岁的科研后浪收到了中国工程院院士钟南山的鼓励:"你们处在最好的 ...

  6. 韦东奕陈杲同获达摩院青橙奖,90后数学新星光彩夺目,却说「没有黄金一代」...

    鱼羊 博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 南北两位90后数学新星,刚刚同时获颁百万奖金大奖. 就在今天公布的阿里达摩院青橙奖十人名单中,北大韦东奕和中科大陈杲的名字赫然在列. ...

  7. 未来教育python视频百度云-青橙课程 | 人工智能走进课堂,为未来教育高质量发展赋能!...

    原标题:青橙课程 | 人工智能走进课堂,为未来教育高质量发展赋能! 是不是有一种可能性,让真实的问题驱动学习,让认知的逻辑替代学科的轨迹,让思维的训练优先于机械的训练. 随着社会对创新人才的需求日益高 ...

  8. 阿里达摩院青橙奖“硬核10人”出炉,钟南山寄语青年科学家

    9月9日,2020年阿里巴巴达摩院青橙奖获奖名单公布,梁文华等10位青年科学家获得达摩院的1000万元奖金.这群平均年龄不足32岁的科研后浪收到了中国工程院院士钟南山的鼓励:"你们处在最好的 ...

  9. 北大韦神等十人获奖,均分1000万元,达摩院2021青橙奖出炉

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 机器之心报道 这些优秀的国内年轻学者覆盖了人工智能.生物学.数学等多个学科,他们将平分 1000 万元奖金. 今天上午,阿里巴巴达摩 ...

  10. “北大数学系扫地僧” 等十人获奖,均分1000万元,达摩院2021青橙奖出炉

    来源:机器之心 这些优秀的国内年轻学者覆盖了人工智能.生物学.数学等多个学科,他们将平分 1000 万元奖金. 昨天,阿里巴巴达摩院青橙奖第四届获奖名单正式揭晓.10 位获奖青年科学家将平分 1000 ...

最新文章

  1. Python有哪些作用
  2. 新建VHDL的Vivado工程
  3. Vue CLI安装 Vue项目创建 Vue Devtools安装
  4. 针式PKM的设计原则
  5. 科学函数计算机怎么关机,函数计算器的功能有哪些?关机是哪个键?
  6. ER studio 安装细节
  7. 加权平均数的例子_加权平均值计算器
  8. WIN11安装子系统
  9. Impala时间转换to_date、to_timestamp
  10. IIS发布 部署 ASP网站
  11. 我是漂移王-说明介绍
  12. 内外网通过公网IP访问DMZ主机
  13. 天龙单机服务器维护,天龙八部网游单机服务器修改资料(Dragon eight online games, single server, modify information).doc...
  14. 将 ICDAR 2015 的 Ground Truth 标注在图像数据上
  15. 剖析“Flash助手新鲜事 头条”弹窗小广告——Adobe竟和中国广告商同流合污!
  16. APP推广实战技能—— iOS100字符关键词覆盖!
  17. 期权二叉树定价参数的计算
  18. 52.甲乙混战 (15分)
  19. 解决CAD启动假死卡死
  20. ElementUI table实现复杂表格

热门文章

  1. 手把手教你制作一个简单的聊天机器人(图灵api)
  2. android edittext 输入长度,Android EditText限制输入字数的方法
  3. 八年级下计算机教师工作总结,有关于下学期初二数学教师工作总结
  4. K8s入门篇---centos7下的k8s搭建部署
  5. Eclipse-汉化
  6. 快播创始人王欣创办的云歌智能社交产品MT正式上线
  7. 华为od机试步数问题
  8. 最新去水印网页版源码
  9. 在同一主机上建立用户管理的复制数据库 笔记
  10. java中级面试要求