在 foodie-dev-pojo 中的 com.imooc.pojo 包下面创建 UserBO 类,从前端传递到后端用于接收的数据体,定义为 xxxBO。
package com.imooc.pojo.bo;/*** Created by 92578 on 2020/8/16 13:57**/public class UserBO {private String username;private String password;private String confirmPassword;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getConfirmPassword() {return confirmPassword;}public void setConfirmPassword(String confirmPassword) {this.confirmPassword = confirmPassword;}}
在 foodie-dev-service 模块下面 UserService 接口添加新的接口 createUser
package com.imooc.service;import com.imooc.pojo.Users;import com.imooc.pojo.bo.UserBO;/*** @author 92578* @since 1.0*/public interface UserService {/*** 判断用户名是否存在** @param username 用户名* @return 是否存在*/public boolean queryUsernameIsExist(String username);/*** 创建用户* @param userBO* @return*/public Users createUser(UserBO userBO);}
在 foodie-dev-common 模块下的 com.imooc.utils 包里创建 MD5Utils 类
package com.imooc.utils;import org.apache.commons.codec.binary.Base64;import java.security.MessageDigest;public class MD5Utils {/*** @Title: MD5Utils.java* @Package com.imooc.utils* @Description: 对字符串进行md5加密*/public static String getMD5Str(String strValue) throws Exception {MessageDigest md5 = MessageDigest.getInstance("MD5");String newstr = Base64.encodeBase64String(md5.digest(strValue.getBytes()));return newstr;}public static void main(String[] args) {try {String md5 = getMD5Str("imooc");System.out.println(md5);} catch (Exception e) {e.printStackTrace();}}}
在 foodie-dev-common 模块下的 com.imooc.utils 包里创建 DateUtil 类
package com.imooc.utils;import java.text.*;import java.util.*;import org.apache.commons.lang3.StringUtils;public class DateUtil {/*** Base ISO 8601 Date format yyyyMMdd i.e., 20021225 for the 25th day of December in the year 2002*/public static final String ISO_DATE_FORMAT = "yyyyMMdd";/*** Expanded ISO 8601 Date format yyyy-MM-dd i.e., 2002-12-25 for the 25th day of December in the year 2002*/public static final String ISO_EXPANDED_DATE_FORMAT = "yyyy-MM-dd";/*** yyyy-MM-dd hh:mm:ss*/public static String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";public static String DATE_PATTERN = "yyyyMMddHHmmss";/*** 则个*/private static boolean LENIENT_DATE = false;private static Random random = new Random();private static final int ID_BYTES = 10;public synchronized static String generateId() {StringBuffer result = new StringBuffer();result = result.append(System.currentTimeMillis());for (int i = 0; i < ID_BYTES; i++) {result = result.append(random.nextInt(10));}return result.toString();}protected static final float normalizedJulian(float JD) {float f = Math.round(JD + 0.5f) - 0.5f;return f;}/*** Returns the Date from a julian. The Julian date will be converted to noon GMT,* such that it matches the nearest half-integer (i.e., a julian date of 1.4 gets* changed to 1.5, and 0.9 gets changed to 0.5.)** @param JD the Julian date* @return the Gregorian date*/public static final Date toDate(float JD) {/* To convert a Julian Day Number to a Gregorian date, assume that it is for 0 hours, Greenwich time (so* that it ends in 0.5). Do the following calculations, again dropping the fractional part of all* multiplicatons and divisions. Note: This method will not give dates accurately on the* Gregorian Proleptic Calendar, i.e., the calendar you get by extending the Gregorian* calendar backwards to years earlier than 1582. using the Gregorian leap year* rules. In particular, the method fails if Y<400. */float Z = (normalizedJulian(JD)) + 0.5f;float W = (int) ((Z - 1867216.25f) / 36524.25f);float X = (int) (W / 4f);float A = Z + 1 + W - X;float B = A + 1524;float C = (int) ((B - 122.1) / 365.25);float D = (int) (365.25f * C);float E = (int) ((B - D) / 30.6001);float F = (int) (30.6001f * E);int day = (int) (B - D - F);int month = (int) (E - 1);if (month > 12) {month = month - 12;}int year = (int) (C - 4715); //(if Month is January or February) or C-4716 (otherwise)if (month > 2) {year--;}Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);c.set(Calendar.MONTH, month - 1); // damn 0 offsetsc.set(Calendar.DATE, day);return c.getTime();}/*** Returns the days between two dates. Positive values indicate that* the second date is after the first, and negative values indicate, well,* the opposite. Relying on specific times is problematic.** @param early the "first date"* @param late the "second date"* @return the days between the two dates*/public static final int daysBetween(Date early, Date late) {Calendar c1 = Calendar.getInstance();Calendar c2 = Calendar.getInstance();c1.setTime(early);c2.setTime(late);return daysBetween(c1, c2);}/*** Returns the days between two dates. Positive values indicate that* the second date is after the first, and negative values indicate, well,* the opposite.** @param early* @param late* @return the days between two dates.*/public static final int daysBetween(Calendar early, Calendar late) {return (int) (toJulian(late) - toJulian(early));}/*** Return a Julian date based on the input parameter. This is* based from calculations found at* <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations* (Gregorian Calendar)</a>, provided by Bill Jeffrys.** @param c a calendar instance* @return the julian day number*/public static final float toJulian(Calendar c) {int Y = c.get(Calendar.YEAR);int M = c.get(Calendar.MONTH);int D = c.get(Calendar.DATE);int A = Y / 100;int B = A / 4;int C = 2 - A + B;float E = (int) (365.25f * (Y + 4716));float F = (int) (30.6001f * (M + 1));float JD = C + D + E + F - 1524.5f;return JD;}/*** Return a Julian date based on the input parameter. This is* based from calculations found at* <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations* (Gregorian Calendar)</a>, provided by Bill Jeffrys.** @param date* @return the julian day number*/public static final float toJulian(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);return toJulian(c);}/*** @param isoString* @param fmt* @param field Calendar.YEAR/Calendar.MONTH/Calendar.DATE* @param amount* @return* @throws ParseException*/public static final String dateIncrease(String isoString, String fmt,int field, int amount) {try {Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));cal.setTime(stringToDate(isoString, fmt, true));cal.add(field, amount);return dateToString(cal.getTime(), fmt);} catch (Exception ex) {return null;}}/*** Time Field Rolling function.* Rolls (up/down) a single unit of time on the given time field.** @param isoString* @param field the time field.* @param up Indicates if rolling up or rolling down the field value.* @param expanded use formating char's* @throws ParseException if an unknown field value is given.*/public static final String roll(String isoString, String fmt, int field,boolean up) throws ParseException {Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));cal.setTime(stringToDate(isoString, fmt));cal.roll(field, up);return dateToString(cal.getTime(), fmt);}/*** Time Field Rolling function.* Rolls (up/down) a single unit of time on the given time field.** @param isoString* @param field the time field.* @param up Indicates if rolling up or rolling down the field value.* @throws ParseException if an unknown field value is given.*/public static final String roll(String isoString, int field, boolean up) throwsParseException {return roll(isoString, DATETIME_PATTERN, field, up);}/*** java.util.Date** @param dateText* @param format* @param lenient* @return*/public static Date stringToDate(String dateText, String format,boolean lenient) {if (dateText == null) {return null;}DateFormat df = null;try {if (format == null) {df = new SimpleDateFormat();} else {df = new SimpleDateFormat(format);}// setLenient avoids allowing dates like 9/32/2001// which would otherwise parse to 10/2/2001df.setLenient(false);return df.parse(dateText);} catch (ParseException e) {return null;}}/*** @return Timestamp*/public static java.sql.Timestamp getCurrentTimestamp() {return new java.sql.Timestamp(new Date().getTime());}/*** java.util.Date** @param dateText* @param format* @return*/public static Date stringToDate(String dateString, String format) {return stringToDate(dateString, format, LENIENT_DATE);}/*** java.util.Date** @param dateText*/public static Date stringToDate(String dateString) {return stringToDate(dateString, ISO_EXPANDED_DATE_FORMAT, LENIENT_DATE);}/*** @param pattern* @param date* @return*/public static String dateToString(Date date, String pattern) {if (date == null) {return null;}try {SimpleDateFormat sfDate = new SimpleDateFormat(pattern);sfDate.setLenient(false);return sfDate.format(date);} catch (Exception e) {return null;}}/*** yyyy-MM-dd** @param date* @return*/public static String dateToString(Date date) {return dateToString(date, ISO_EXPANDED_DATE_FORMAT);}/*** @return*/public static Date getCurrentDateTime() {Calendar calNow = Calendar.getInstance();Date dtNow = calNow.getTime();return dtNow;}/*** @param pattern* @return*/public static String getCurrentDateString(String pattern) {return dateToString(getCurrentDateTime(), pattern);}/*** yyyy-MM-dd** @return*/public static String getCurrentDateString() {return dateToString(getCurrentDateTime(), ISO_EXPANDED_DATE_FORMAT);}/*** 返回固定格式的当前时间* yyyy-MM-dd hh:mm:ss** @param date* @return*/public static String dateToStringWithTime() {return dateToString(new Date(), DATETIME_PATTERN);}/*** yyyy-MM-dd hh:mm:ss** @param date* @return*/public static String dateToStringWithTime(Date date) {return dateToString(date, DATETIME_PATTERN);}/*** @param date* @param days* @return java.util.Date*/public static Date dateIncreaseByDay(Date date, int days) {Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));cal.setTime(date);cal.add(Calendar.DATE, days);return cal.getTime();}/*** @param date* @param days* @return java.util.Date*/public static Date dateIncreaseByMonth(Date date, int mnt) {Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));cal.setTime(date);cal.add(Calendar.MONTH, mnt);return cal.getTime();}/*** @param date* @param mnt* @return java.util.Date*/public static Date dateIncreaseByYear(Date date, int mnt) {Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));cal.setTime(date);cal.add(Calendar.YEAR, mnt);return cal.getTime();}/*** @param date yyyy-MM-dd* @param days* @return yyyy-MM-dd*/public static String dateIncreaseByDay(String date, int days) {return dateIncreaseByDay(date, ISO_DATE_FORMAT, days);}/*** @param date* @param fmt* @param days* @return*/public static String dateIncreaseByDay(String date, String fmt, int days) {return dateIncrease(date, fmt, Calendar.DATE, days);}/*** @param src* @param srcfmt* @param desfmt* @return*/public static String stringToString(String src, String srcfmt,String desfmt) {return dateToString(stringToDate(src, srcfmt), desfmt);}/*** @param date* @return string*/public static String getYear(Date date) {SimpleDateFormat formater = new SimpleDateFormat("yyyy");String cur_year = formater.format(date);return cur_year;}/*** @param date* @return string*/public static String getMonth(Date date) {SimpleDateFormat formater = new SimpleDateFormat("MM");String cur_month = formater.format(date);return cur_month;}/*** @param date* @return string*/public static String getDay(Date date) {SimpleDateFormat formater = new SimpleDateFormat("dd");String cur_day = formater.format(date);return cur_day;}public static int getDayInt(Date date) {SimpleDateFormat formater = new SimpleDateFormat("dd");String cur_day = formater.format(date);return Integer.valueOf(cur_day);}/*** @param date* @return string*/public static String getHour(Date date) {SimpleDateFormat formater = new SimpleDateFormat("HH");String cur_day = formater.format(date);return cur_day;}public static int getMinsFromDate(Date dt) {GregorianCalendar cal = new GregorianCalendar();cal.setTime(dt);int hour = cal.get(Calendar.HOUR_OF_DAY);int min = cal.get(Calendar.MINUTE);return ((hour * 60) + min);}/*** Function to convert String to Date Object. If invalid input then current or next day date* is returned (Added by Ali Naqvi on 2006-5-16).** @param str String input in YYYY-MM-DD HH:MM[:SS] format.* @param isExpiry boolean if set and input string is invalid then next day date is returned* @return Date*/public static Date convertToDate(String str, boolean isExpiry) {SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm");Date dt = null;try {dt = fmt.parse(str);} catch (ParseException ex) {Calendar cal = Calendar.getInstance();if (isExpiry) {cal.add(Calendar.DAY_OF_MONTH, 1);cal.set(Calendar.HOUR_OF_DAY, 23);cal.set(Calendar.MINUTE, 59);} else {cal.set(Calendar.HOUR_OF_DAY, 0);cal.set(Calendar.MINUTE, 0);}dt = cal.getTime();}return dt;}public static Date convertToDate(String str) {SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm");Date dt = null;try {dt = fmt.parse(str);} catch (ParseException ex) {dt = new Date();}return dt;}public static String dateFromat(Date date, int minute) {String dateFormat = null;int year = Integer.parseInt(getYear(date));int month = Integer.parseInt(getMonth(date));int day = Integer.parseInt(getDay(date));int hour = minute / 60;int min = minute % 60;dateFormat = String.valueOf(year)+(month > 9 ? String.valueOf(month) :"0" + String.valueOf(month))+(day > 9 ? String.valueOf(day) : "0" + String.valueOf(day))+ " "+(hour > 9 ? String.valueOf(hour) : "0" + String.valueOf(hour))+(min > 9 ? String.valueOf(min) : "0" + String.valueOf(min))+ "00";return dateFormat;}public static String sDateFormat() {return new SimpleDateFormat(DATE_PATTERN).format(Calendar.getInstance().getTime());}/*** @return* @Description: 获得本月的第一天日期* @author leechenxiang* @date 2017年5月31日 下午1:37:34*/public static String getFirstDateOfThisMonth() {SimpleDateFormat format = new SimpleDateFormat(ISO_EXPANDED_DATE_FORMAT);Calendar calendarFirst = Calendar.getInstance();calendarFirst = Calendar.getInstance();calendarFirst.add(Calendar.MONTH, 0);calendarFirst.set(Calendar.DAY_OF_MONTH, 1);String firstDate = format.format(calendarFirst.getTime());return firstDate;}/*** @return* @Description: 获得本月的最后一天日期* @author leechenxiang* @date 2017年5月31日 下午1:37:50*/public static String getLastDateOfThisMonth() {SimpleDateFormat format = new SimpleDateFormat(ISO_EXPANDED_DATE_FORMAT);Calendar calendarLast = Calendar.getInstance();calendarLast.setTime(new Date());calendarLast.getActualMaximum(Calendar.DAY_OF_MONTH);String lastDate = format.format(calendarLast.getTime());return lastDate;}/*** @Description: 判断字符串日期是否匹配指定的格式化日期*/public static boolean isValidDate(String strDate, String formatter) {SimpleDateFormat sdf = null;ParsePosition pos = new ParsePosition(0);if (StringUtils.isBlank(strDate) || StringUtils.isBlank(formatter)) {return false;}try {sdf = new SimpleDateFormat(formatter);sdf.setLenient(false);Date date = sdf.parse(strDate, pos);if (date == null) {return false;} else {if (pos.getIndex() > sdf.format(date).length()) {return false;}return true;}} catch (Exception e) {e.printStackTrace();return false;}}public static void main(String[] args) {// String timeDir=DateUtil.dateToString(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT);// System.out.println(timeDir);boolean flag = DateUtil.isValidDate("1990-10-32", DateUtil.ISO_EXPANDED_DATE_FORMAT);System.out.println(flag);}}
在 foodie-dev-common 模块下的 com.imooc.enums 包里创建 Sex 枚举
package com.imooc.enums;
/**
* 性别枚举
* Created by 92578 on 2020/8/16 20:38
**/
public enum Sex {
woman(0, "女"),
man(1, "男"),
secret(2, "保密");
public final Integer type;
public final String value;
Sex(Integer type, String value) {
this.type = type;
this.value = value;
}
}
前往 github 下载 id 生成框架代码,网址如下:https://github.com/bingoohuang/idworker-client
下载好后将源码放在 foodie-dev-common 模块的 src\main\java 下面
在 foodie-dev-api 模块中的 Application 类中添加包扫描路径,扫描刚刚添加的生成 id 框架源码,默认 Spring Boot 扫描的是 com.imooc 包下面的文件。
package com.imooc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import tk.mybatis.spring.annotation.MapperScan;
/**
* @author 92578
* @since 1.0
*/
@SpringBootApplication
// 扫描 mybatis 通用 mapper 所在的包
@MapperScan(basePackages = "com.imooc.mapper")
// 扫描所有包以及相关组件包
@ComponentScan(basePackages = {"com.imooc","org.n3r.idworker"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
完善 foodie-dev-service 模块下面的 UserServiceImpl 类,实现 createUser 方法
package com.imooc.service.impl;
import com.imooc.enums.Sex;
import com.imooc.mapper.UsersMapper;
import com.imooc.pojo.Users;
import com.imooc.pojo.bo.UserBO;
import com.imooc.service.UserService;
import com.imooc.utils.DateUtil;
import com.imooc.utils.MD5Utils;
import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.Date;
/**
* @author 92578
* @since 1.0
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UsersMapper usersMapper;
@Autowired
private Sid sid;
private static final String USER_FACE = "http://dp.gtimg.cn/discuzpic/0/discuz_x5_gamebbs_qq_com_forum_201306_19_1256219xc797y90heepdbh.jpg/0";
/**
* 判断用户名是否存在
*
* @param username 用户名
* @return 是否存在
*/
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public boolean queryUsernameIsExist(String username) {
Example userExample = new Example(Users.class);
Example.Criteria userCriteria = userExample.createCriteria();
userCriteria.andEqualTo("username", username);
Users result = usersMapper.selectOneByExample(userExample);
return result == null ? false : true;
}
/**
* 创建用户
*
* @param userBO
* @return
*/
@Transactional(propagation = Propagation.REQUIRED)
@Override
public Users createUser(UserBO userBO) {
String userId = sid.nextShort();
Users user = new Users();
user.setId(userId);
user.setUsername(userBO.getUsername());
try {
user.setPassword(MD5Utils.getMD5Str(userBO.getPassword()));
} catch (Exception e) {
e.printStackTrace();
}
// 默认用户昵称同用户名
user.setNickname(userBO.getUsername());
// 默认头像
user.setFace(USER_FACE);
// 默认生日
user.setBirthday(DateUtil.stringToDate("1900-01-01"));
// 默认性别为 保密
user.setSex(Sex.secret.type);
user.setCreatedTime(new Date());
user.setUpdatedTime(new Date());
usersMapper.insert(user);
return user;
}
}
