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的语法。主要编写的思路还是很简单,主要就是一些基本逻辑的处理了。

原文地址:https://www.cnblogs.com/wushenjiang/p/14322236.html