zoukankan      html  css  js  c++  java
  • scala语言实现客户信息管理系统

    写在前面

    到今天为止scala语言学的差不多了,按照惯例,写一个差不多的增删改查系统来练练手。

    需求分析

    模拟实现基于文本界面的《客户信息管理软件》。
    该软件能够实现对客户对象的插入、修改和删除,并能够打印客户明细表。
    项目采用分级菜单方式。

    可以看到,是一个十分常规的增删改查系统。我们首先看看题目中给出的界面:

    -----------------客户信息管理软件-----------------

    ​ 1 添 加 客 户
    ​ 2 修 改 客 户
    ​ 3 删 除 客 户
    ​ 4 客 户 列 表
    ​ 5 退 出

    ​ 请选择(1-5):_

    可以看到,整个系统的功能还是十分简单易懂的。我们就一个一个来吧

    详细设计

    在设计阶段,我们应该明确如何编写这样的系统。一般我们采用分层思想,首先设计一个Customer类,即Model层,表示数据的存储与传输,如下:

    /**
     * @Description: 客户model类
     * @author: LiuGe
     * @date: 2021/1/24
     */
    class Customer {
    
      // 属性
      var id: Int = _
      var name: String = _
      var gender: Char = _
      var age: Short = _
      var tel: String = _
      var email: String = _
    
      // 设计一个辅助构造器
      def this(id: Int, name: String, gender: Char, age: Short, tel: String, email: String) {
        this
        this.id = id
        this.name = name
        this.gender = gender
        this.age = age
        this.tel = tel
        this.email = email
      }
      def this(name: String, gender: Char, age: Short, tel: String, email: String) {
        this
        this.name = name
        this.gender = gender
        this.age = age
        this.tel = tel
        this.email = email
      }
    
      override def toString: String = {
        this.id + "		" + this.name + "		" + this.gender + "		" + this.age + "		" + this.tel + "		" + this.email
      }
    }
    

    这里我们写了两个辅助构造器,用来方便我们实例化该对象。重写了toString方法方便我们打印输出。

    之后,要有一个业务层来处理业务逻辑:

    import com.liuge.chapter15.customercrm.bean.Customer
    import scala.collection.mutable.ArrayBuffer
    import scala.util.control.Breaks.{break, breakable}
    /**
     * @Description:
     * @author: LiuGe
     * @date: 2021/1/24
     */
    class CustomerService {
    
      var customerNum = 1
      // customers是存放客户的,这里先初始化
      val customers: ArrayBuffer[Customer] =
        ArrayBuffer(new Customer(1, "tom", '男', 10, "100", "tom@qq.com"))
    
      def list(): ArrayBuffer[Customer] = {
        this.customers
      }
    
      def add(customer: Customer): Boolean = {
        // 设置id
        customerNum += 1
        customer.id = customerNum
        // 加入到customers
        customers += customer
        true
      }
      def delete(id: Int) :Boolean = {
        val index = findIndexById(id)
        if(index != -1){
          // 去删除
          customers.remove(index)
          true
        }else{
          false
        }
      }
      // 根据id找到index
      def findIndexById(id: Int): Int = {
        // 默认-1 找到就改成对应的,找不到就返回-1
        var index = -1
        // 遍历ArrayBuffer
        breakable{
          for (i <- customers.indices) {
            if(customers(i).id == id){
              index = i
              break()
            }
          }
        }
        index
      }
      def findCustomerById(id:Int):Any = {
        val index = findIndexById(id)
        if(index != -1){
          return customers(index)
        }
        false
      }
      def update(id:Int,customer: Customer):Boolean ={
        val index = findIndexById(id)
        if(index != -1){
          val customerFromArray = customers(index)
          if(customer.name != null && customer.name != ""){
            customerFromArray.name = customer.name
          }
          if (customer.gender == '男'  || customer.gender == '女') {
            customerFromArray.gender = customer.gender
          }
          if (customer.age >= 0) {
            customerFromArray.age = customer.age
          }
          if (customer.tel != null && customer.tel != "") {
            customerFromArray.tel = customer.tel
          }
          if (customer.email != null && customer.email != "") {
            customerFromArray.email = customer.email
          }
          return true
        }
        false
      }
    }
    
    

    这里我们使用了ArrayBuffer来存储数据,他有点类似于Java中的ArrayList,基本是一样的效果。

    之后,我们需要一个界面类来显示界面:

    import com.liuge.chapter15.customercrm.bean.Customer
    import com.liuge.chapter15.customercrm.service.CustomerService
    
    import scala.io.StdIn
    import scala.util.control.Breaks.{break, breakable}
    
    /**
     * @Description:
     * @author: LiuGe
     * @date: 2021/1/24
     */
    class CustomerView {
    
      // 定义一个循环变量,控制是否退出while
      var loop = true
      // 定义一个key,用于接收用户输入的选项
      var key = ' '
    
      var customerService = new CustomerService()
    
      /*
      -----------------客户信息管理软件-----------------
    
                         1 添 加 客 户
                         2 修 改 客 户
                         3 删 除 客 户
                         4 客 户 列 表
                         5 退      出
                         请选择(1-5):
    
       */
      def mainMenu(): Unit = {
        do {
          println("-----------------客户信息管理软件-----------------")
          println("1 添 加 客 户")
          println("2 修 改 客 户")
          println("3 删 除 客 户")
          println("4 客 户 列 表")
          println("5 退      出")
          println("请选择(1-5):")
          key = StdIn.readChar()
          key match {
            case '1' => this.add()
            case '2' => this.update()
            case '3' => this.delete()
            case '4' => this.list()
            case '5' => this.quit()
            case _ => println("请重新选择!")
          }
        } while (loop)
      }
    
      def quit(): Unit = {
        println("确认是否退出(Y/N):")
        var choice = ' '
        breakable {
          while (true) {
    
            choice = StdIn.readChar().toLower
            if (choice != 'y' || choice != 'n') {
              println("确认是否退出(Y/N):")
            }
            if (choice == 'n') {
              break()
            }
            if (choice == 'y') {
              this.loop = false
              break()
            }
          }
        }
      }
    
      /*
        ---------------------------客户列表---------------------------
      编号  姓名       性别    年龄   电话            邮箱
       1    张三       男      30     010-56253825   abc@email.com
       2    李四       女      23     010-56253825    lisi@ibm.com
       3    王芳       女      26     010-56253825   wang@163.com
      -------------------------客户列表完成-------------------------
    
     */
      def list(): Unit = {
        println()
        println("---------------------------客户列表---------------------------")
        println("编号		姓名		性别		年龄		电话		邮箱")
        // for循环遍历
        // 获取customers
        val customers = customerService.list()
        for (customer <- customers) {
          // 重写customer的toString方法
          println(customer)
        }
        println("-------------------------客户列表完成-------------------------")
      }
    
      def add(): Unit = {
        println("")
        println("---------------------添加客户---------------------")
        println("姓名:")
        val name = StdIn.readLine()
        println("性别:")
        val gender = StdIn.readChar()
        println("年龄:")
        val age = StdIn.readShort()
        println("电话:")
        val tel = StdIn.readLine()
        println("邮箱:")
        val email = StdIn.readLine()
        // 构建对象
        val customer = new Customer(name, gender, age, tel, email)
        customerService.add(customer)
        println("---------------------添加完成---------------------")
      }
    
      /*
      ---------------------删除客户---------------------
          请选择待删除客户编号(-1退出):1
          确认是否删除(Y/N):y
    ---------------------删除完成---------------------
    
       */
      def delete(): Unit = {
        println("")
        println("---------------------删除客户---------------------")
        println("请选择待删除客户编号(-1退出):")
        val id = StdIn.readInt()
        if (id == -1) {
          println("---------------------删除失败---------------------")
          return
        }
        println("确认是否删除(Y/N):")
        var choice = ' '
        breakable {
          do {
            choice = StdIn.readChar().toLower
            if (choice == 'y' || choice == 'n') {
              break()
            }
            println("确认是否删除(Y/N):")
          } while (true)
        }
        if (choice == 'y') {
          if (customerService.delete(id)) {
            println("---------------------删除完成---------------------")
            return
          }
        }
        println("---------------------删除失败---------------------")
      }
    
      def update(): Unit ={
        println("")
        println("---------------------修改客户---------------------")
        println("请选择待修改客户编号(-1退出):")
        val id = StdIn.readInt()
        if(id == -1){
          println("---------------------修改失败---------------------")
          return
        }
        val customerFromArray = customerService.findCustomerById(id)
        if(customerFromArray.isInstanceOf[Boolean]){
          println("---------------------该用户不存在---------------------")
          update()
        }else{
          val customerFromService = customerFromArray.asInstanceOf[Customer]
          var name = ""
          var gender = ' '
          var age : Short = -1
          var tel = ""
          var email = ""
          println(s"姓名(${customerFromService.name}):")
          name = StdIn.readLine()
          println(s"性别:(${customerFromService.gender}):")
          gender = StdIn.readChar()
          println(s"年龄:(${customerFromService.age}):")
          age = StdIn.readShort()
          println(s"电话:(${customerFromService.tel}):")
          tel = StdIn.readLine()
          println(s"邮箱:(${customerFromService.email}):")
          email = StdIn.readLine()
          // 构建对象
          val customer = new Customer(name, gender, age, tel, email)
          val isUpdated = customerService.update(id, customer)
          if(isUpdated){
            println("---------------------修改完成---------------------")
            return
          }
        }
        println("---------------------修改失败---------------------")
      }
    }
    
    

    该类主要就是负责界面的显示以及一些业务逻辑处理。

    最后的最后,我们为整个程序提供一个入口:

    import com.liuge.chapter15.customercrm.view.CustomerView
    
    /**
     * @Description:
     * @author: LiuGe
     * @date: 2021/1/24
     */
    object CustomerCrm {
    
      def main(args: Array[String]): Unit = {
        new CustomerView().mainMenu()
      }
    
    }
    
    

    总结

    总的来说,整个项目实现还是很简单的,主要是用来熟悉一下Scala的语法。主要编写的思路还是很简单,主要就是一些基本逻辑的处理了。

  • 相关阅读:
    PowerDesigner与Eclipse同步开发
    postdrop: create file maildrop/xxx: Permission denied
    mysql导出数据mysqldump用法
    mysql 存储过程中 limit之后使用分页变量,传入分页参数. 类似于微博游标分批次获取信息;问号参数类似于c#的string.format;问号占位符
    mysql 获取本周一的日期,本周日的日期
    mysql 游标 ,嵌套游标
    asp.net调用mysql 存储过程 带 out 返回值,返回刚插入数据库中的自增的ID,LAST_INSERT_ID() 的使用
    跨服务器,跨数据库,多表联合查询 / 如何用sql语句来查询表中哪些记录是重复的
    asp.net 使用mysql数据库,OUT parameter返回值为null的bug
    mysql 类型转换 cast 将 float 转换为 decimal
  • 原文地址:https://www.cnblogs.com/wushenjiang/p/14322236.html
Copyright © 2011-2022 走看看