sales order system

2025-12-07 0 766

Sales Order System

Project no longer actively maintained, please see: Sales Order System 2.0 instead

Table of Contents

  • Summary
  • Development
    • Running Locally
    • Running Unit Tests
    • Running Integration Tests
    • Running End2End Tests
    • Code Quality Analysis – SonarQube
    • Running with MySQL
    • Running with MongoDB
  • Technical Overview
    • High Level Architecture
      • Back End
      • Front End
    • Database Design
    • Application Patterns
    • Declarative Programming
    • Security Issues
    • Testing
      • Integration Testing
      • End 2 End Testing
  • Team Members
  • Project Demo
  • Technology/Tool Stack

Summary

This is a very small full-stack web application that is used as a sample and is for pure demonstration purposes.

Development

Running Locally

  1. Checkout code
git clone https://gi**thub.com*/colinbut/sales-order-system.git
  1. Do a local build
mvn clean package

… will compile the sources, package up the war file

  1. Run application

go into the online-application directory and execute following command:

mvn tomcat7:run-war

uses maven tomcat7 plugin to run the application within an embedded Apache Tomcat web container

once the application loaded, navigate to:

http://*loc*alhos*t:8080/online-application/login

some sample credentials can be found configured in Spring\’s application-security.xml configuration file.

Running Unit Tests

mvn test

… this will run all unit test within the suite of tests

or

from your IDE, just navigate to the unit test class and click on the IDE\’s \’run\’ button

Running Integration Tests

mvn verify

… this will run all integration test within the suite of tests.

or

from your IDE, just navigate to the integration test class and click on the IDE\’s \’run\’ button

Running End2End Tests

[TBD]

Sonar – Code Quality Analysis

Use Sonar (SonarQube) to run code quality analysis on the project. A sonar-project.properties file provided.
Will need SonarQube server and Sonar Runner so need to download them both from the SonarQube website and follow the installation instructions.

Assuming Sonar is installed (with Sonar Runner on the environment path), on CLI run:

  1. Start the SonarQube Server
  2. Navigate to project root directory and execute:
sonar-runner

Running with MySQL

It is also possible to run with MySQL. You need MySQL to be installed. Download from the MySQL website and follow installation instructions.

  1. Start up MySQL server on your system
  2. Configure Spring\’s application-datasource.xml configuration file to connect to MySQL:

Uncomment below as specified:

<bean id=\”dataSource\” class=\”org.springframework.jdbc.datasource.DriverManagerDataSource\”>
<property name=\”driverClassName\” value=\”com.mysql.jdbc.Driver\” />
<property name=\”url\” value=\”jdbc:mysql://localhost:3306/sales_order_system\” />
<property name=\”username\” value=\”root\” />
<property name=\”password\” value=\”\” />
</bean>

<jdbc:initialize-database ignore-failures=\”DROPS\”>
<jdbc:script location=\”file:src/main/resources/scripts/db-drop-tables.sql\”/>
<jdbc:script location=\”file:src/main/resources/scripts/db-create.sql\”/>
</jdbc:initialize-database>\’>

    <!-- uncomment out for use with MySQL database -->
    <bean id=\"dataSource\" class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\">
        <property name=\"driverClassName\" value=\"com.mysql.jdbc.Driver\" />
        <property name=\"url\" value=\"jdbc:mysql://localhost:3306/sales_order_system\" />
        <property name=\"username\" value=\"root\" />
        <property name=\"password\" value=\"\" />
    </bean>

    <jdbc:initialize-database ignore-failures=\"DROPS\">
        <jdbc:script location=\"file:src/main/resources/scripts/db-drop-tables.sql\"/>
        <jdbc:script location=\"file:src/main/resources/scripts/db-create.sql\"/>
    </jdbc:initialize-database>

Running with MongoDB

Assumming MongoDB is installed on system. If not, can download it from MongoDB website and follow installation instructions.

Start up MongoDB Database Server:

./mongod

Open up MongoDB Database client:

./mongo

Load the mongodb javascript file which populates some sample data

load(\"mongodb.js\")

Technical Overview

High Level Architecture

The application is just a simplistic monolithic application built with several layers. In summary, back-end is written in Java which connects to a back-end in-memory relational database (HSQL). Can also connect to other relational databases (MySQL). Application is scafolded by Spring Framework. Model-View-Controller (MVC) architectural pattern is used to separate the front-end from the back-end. This is achieved by Spring Web MVC. This application would then be deployed on an embedded web container (Apache Tomcat).

Front End

The front-end is plainly JSP with a bit of JSTL here and there. Dandelion Databases also used to implement tables in the UI. Basic CSS for styling. Bootstrap provides the front-end framework for this.

Back End
  • The back-end is completely built using Java (Java 8 compiled)
  • It is bootstrapped by Spring Framework
  • Database is a RDBMS (Relational Database Management System):
    • default in memory-db (HSQL)
    • MySQL supported too
  • Spring Data JPA provides the Data Access Abstraction
    • Persistence done using JPA (Hibernate the implementation)
  • JSP serves front-end html content…

Databse Design

[TBD]

Application Patterns

Transaction Script Pattern

This application is very simple. It is a web application that currently provides basic CRUD operations. Everything operational is viewed as a business transaction which is executed down through the various layers. Therefore, an anemic domain model is used as opposed to a pure object-oriented domain model. This is sufficient and ideal because at this moment there is not much (if any) complex business logic processing that is required.

Service Layer Pattern

Defining the application\’s boundary and setting the available operations from the perspective of interfacing client layers (front-end). It encapsulates the application\’s business logic, controlling transactions and coor-dinating responses in the implementation of its operations.

e.g.

@Service(\"itemServiceImpl\")
@Transactional
public class ItemServiceImpl implements ItemService {

	@Autowired
	private ItemRepository itemRepository;
		
	...

}
Repository Pattern

An object-oriented view of the data store underneath providing an extra layer of abstraction (Spring Data JPA) in front of the data access capabilities of the Data Mapper pattern. Object Relational Mapping framework (Hibernate) is used to achieve this effect of mapping the differences between relational database tables and the domain model. JPA\’s entity manager encapsulates the data access element (Data Access Object pattern).

e.g. of a Spring Data JPA Repository

@Repository
public interface ItemRepository extends JpaRepository<Item, Integer> {

}

Declarative Programming

Spring Framework\’s annotation support (component scanning) is done to do this taking advantage of Spring Framework\’s core abilities – Dependency Injection provided by the Inversion of Control (IOC) container.

@Controller
public class OrderController {

	private static final Logger logger = LoggerFactory.getLogger(OrderController.class);

	@Autowired
	@Qualifier(\"orderServiceImpl\")
	private OrderService orderService;

	@Autowired
	@Qualifier(\"customerServiceImpl\")
	private CustomerService customerService;

	@Autowired
	@Qualifier(\"itemServiceImpl\")
	private ItemService itemService;

	@Autowired
	@Qualifier(\"orderFormValidator\")
	private OrderFormValidator orderFormValidator;

Another example from the Customer model object:

@Entity
@Table(name = \"customer\")
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(exclude = \"orders\")
@ToString
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = \"customer_id\")
    private int customerId;

	@NotNull(message = \"{error.null.firstname}\")
	@NotBlank(message = \"{error.blank.firstname}\")
	@NotEmpty(message = \"{error.empty.firstname}\")
	@Pattern(regexp = \"[a-zA-Z]*\", message = \"{error.invalid.firstname}\")
    @Column(name = \"customer_firstname\", nullable = false, length = 50)
	private String firstName;

	@NotNull(message = \"{error.null.lastname}\")
	@NotBlank(message = \"{error.blank.lastname}\")
	@NotEmpty(message = \"{error.empty.lastname}\")
	@Pattern(regexp = \"[a-zA-Z]*\", message = \"{error.invalid.lastname}\")
    @Column(name = \"customer_lastname\", nullable = false, length = 50)
	private String lastName;

Lombok Project used to generate getters/setters/toString/equals and hashcode to remove the boilerplate code

Security issues

The application enables login/logout feature which was implemented using the basic features of the Spring Security module of the Spring Framework.

The following application-security.xml Spring configuration file shows key security configurations:

<intercept-url pattern=\”/items\” access=\”ROLE_TEST_USER,ROLE_ADMIN\” />
<intercept-url pattern=\”/items/create\” access=\”ROLE_TEST_USER,ROLE_ADMIN\” />
<intercept-url pattern=\”/items/createItem\” access=\”ROLE_TEST_USER,ROLE_ADMIN\” />

….

<form-login
login-page=\”/login\”
default-target-url=\”/customers\”
authentication-failure-url=\”/login?error\”
username-parameter=\”username\”
password-parameter=\”password\”
/>

<logout logout-success-url=\”/login?logout\” />

<csrf/>

</http>

<authentication-manager>
<authentication-provider>
<user-service>

<user name=\”testUser\” password=\”password\” authorities=\”ROLE_TEST_USER\” />
<user name=\”admin\” password=\”password\” authorities=\”ROLE_ADMIN\” />
</user-service>
</authentication-provider>
</authentication-manager>

</beans:beans>\’>

<beans:beans xmlns=\"http://www.s*pringframe*wo*rk.org/schema/security\"
             xmlns:beans=\"http://www.spr*ing**framework.org/schema/beans\"
             xmlns:xsi=\"http://www.***w3.org/2001/XMLSchema-instance\"
             xsi:schemaLocation=\"http://www.spr*ing**framework.org/schema/beans
	http://www.spr*ing**framework.org/schema/beans/spring-beans-3.0.xsd
	http://www.s*pringframe*wo*rk.org/schema/security
	http://www.s*pringframe*wo*rk.org/schema/security/spring-security-3.2.xsd\">

    <http auto-config=\"true\">

        <!-- items -->
        <intercept-url pattern=\"/items\" access=\"ROLE_TEST_USER,ROLE_ADMIN\" />
        <intercept-url pattern=\"/items/create\" access=\"ROLE_TEST_USER,ROLE_ADMIN\" />
        <intercept-url pattern=\"/items/createItem\" access=\"ROLE_TEST_USER,ROLE_ADMIN\" />

        ....

        <form-login
            login-page=\"/login\"
            default-target-url=\"/customers\"
            authentication-failure-url=\"/login?error\"
            username-parameter=\"username\"
            password-parameter=\"password\"
        />

        <logout logout-success-url=\"/login?logout\" />

        <csrf/>

    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <!-- hard coding application user credentials - switch to DB or LDAP -->
                <user name=\"testUser\" password=\"password\" authorities=\"ROLE_TEST_USER\" />
                <user name=\"admin\" password=\"password\" authorities=\"ROLE_ADMIN\" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

Testing

Integration Testing

Integration Testing is implemented using Spring\’s Test Context Framework. An in-memory Database (HSQL) is used.

End 2 End Testing

End 2 End Testing (Acceptance Testing) is done using Cucumber-JVM. This is available under the test-automation sub module. The intent of this is to provide end to end automation of the full stack web application. Maybe, can integrate Selenium in the future which would allow automation of the web application on web browsers. But for now, cucumber tests are written in the back-end code. Acceptance criterias are written in the .feature files using the Gherkin language. This area needs improvement.
Note that End 2 End testing for this project is still WIP.

Team Members

ME (colin.but@outlook.com)

Project Demo

[TBD]

Technology/Tool Stack

Front End Back End Database Testing Other
HTML Java 8 HSQL (HyperSQL) JUnit SLF4j – Log4j
CSS Spring Core MySQL AssertJ Maven
JS Spring Web MVC MongoDB Mockito Tomcat
Bootstrap Spring Data JPA Cucumber-JVM SonarQube
JSP Spring Security Spring Test Context Lombok
JSTL JPA – Hibernate
Dandelion DataTables JTA
Bean Validation

下载源码

通过命令行克隆项目:

git clone https://github.com/colinbut/sales-order-system.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 sales order system https://www.zuozi.net/31386.html

kwerc
下一篇: kwerc
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务