电信计费系列3-短信计费
7-1 电信计费系列3-短信计费
分数 50
全屏浏览题目
切换布局
作者 蔡轲
单位 南昌航空大学
实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。
输入:
输入信息包括两种类型
1、逐行输入南昌市手机用户开户的信息,每行一个用户。
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费)
例如:u-13305862264 3
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题只针对类型3-手机短信计费。
2、逐行输入本月某些用户的短信信息,短信的格式:
m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成)
m-18907910010 13305862264 welcome to jiangxi.
m-13305862264 18907910010 thank you.
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。
本题只考虑短信计费,不考虑通信费用以及月租费。
建议类图:
参见图1、2、3:
图1
图1中User是用户类,包括属性:
userRecords (用户记录)、balance(余额)、chargeMode(计费方式)、number(号码)。
ChargeMode是计费方式的抽象类:
chargeRules是计费方式所包含的各种计费规则的集合,ChargeRule类的定义见图3。
getMonthlyRent()方法用于返回月租(monthlyRent)。
UserRecords是用户记录类,保存用户各种通话、短信的记录,
各种计费规则将使用其中的部分或者全部记录。
其属性从上到下依次是:
市内拨打电话、省内(不含市内)拨打电话、省外拨打电话、
市内接听电话、省内(不含市内)接听电话、省外接听电话的记录
以及发送短信、接收短信的记录。
图2
图2中CommunicationRecord是抽象的通讯记录类:
包含callingNumber拨打号码、answerNumber接听号码两个属性。
CallRecord(通话记录)、MessageRecord(短信记录)是它的子类。
图3
图3是计费规则的相关类,这些类的核心方法是:
calCost(ArrayList callRecords)。
该方法针根据输入参数callRecords中的所有记录计算某用户的某一项费用;如市话费。
输入参数callRecords的约束条件:必须是某一个用户的符合计费规则要求的所有记录。
SendMessageRule是发送短信的计费规则类,用于计算发送短信的费用。
LandPhoneInCityRule、LandPhoneInProvinceRule、LandPhoneInLandRule三个类分别是座机拨打市内、省内、省外电话的计费规则类,用于实现这三种情况的费用计算。
(提示:可以从UserRecords类中获取各种类型的callRecords)。
注意:以上图中所定义的类不是限定要求,根据实际需要自行补充或修改。
输入样例:
在这里给出一组输入。例如:
u-18907910010 3
m-18907910010 13305862264 aaaaaaaaaaaaaaaaaaaaaaa
end
输出样例:
在这里给出相应的输出。例如:
18907910010 0.3 99.7
### 输入样例1:
在这里给出一组输入。例如:
u-18907910010 3
m-18907910010 13305862264 aaaaaaaaaaaa
m-18907910010 13305862264 aaaaaaa.
m-18907910010 13305862264 bb,bbbb
end
输出样例1:
在这里给出相应的输出。例如:
18907910010 0.5 99.5
代码长度限制
20 KB
时间限制
400 ms
内存限制
64 MB
我滴代码:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.text.ParseException;public class Main {public static void main(String[] args) {Outputtool outputtool = new Outputtool();Inputdeal inputdeal = new Inputdeal();ArrayList<User> users = new ArrayList<>();Scanner in = new Scanner(System.in);String input = in.nextLine();while (!input.equals("end")) {if (1 == inputdeal.check(input)) {inputdeal.writeUser(users, input);} else if (2 == inputdeal.check(input)) {inputdeal.writeRecord(users, input);}input = in.nextLine();}users.sort(new Comparator<User>() {@Overridepublic int compare(User u1, User u2) {if (u1.getNumber().charAt(0) == '0' && u2.getNumber().charAt(0) != '0') {return -1;} else if (u1.getNumber().charAt(0) != '0' && u2.getNumber().charAt(0) == '0') {return 1;}if (Double.parseDouble(u1.getNumber()) > Double.parseDouble(u2.getNumber())) {return 1;} else {return -1;}}});for (User u : users) {System.out.print(u.getNumber() + " ");outputtool.output(u.calCost());System.out.print(" ");outputtool.output(u.calBalance());System.out.println();}}}abstract class ChargeMode {protected ArrayList<ChargeRule> chargeRules = new ArrayList<>();public abstract double calCost(UserRecords userRecords);public abstract double getMonthlyRent();public ArrayList<ChargeRule> getChargeRules() {return chargeRules;}public void setChargeRules(ArrayList<ChargeRule> chargeRules) {this.chargeRules = chargeRules;}
}class UserRecords {private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();private ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();private ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();public void addCallingInCityRecords(CallRecord callRecord) {callingInCityRecords.add(callRecord);}public void addCallingInProvinceRecords(CallRecord callRecord) {callingInProvinceRecords.add(callRecord);}public void addCallingInLandRecords(CallRecord callRecord) {callingInLandRecords.add(callRecord);}public void addAnswerInCityRecords(CallRecord callRecord) {answerInCityRecords.add(callRecord);}public void aaddAnswerInProvinceRecords(CallRecord callRecord) {answerInProvinceRecords.add(callRecord);}public void addAnswerInLandRecords(CallRecord callRecord) {answerInLandRecords.add(callRecord);}public void addSendMessageRecords(MessageRecord callRecord) {sendMessageRecords.add(callRecord);}public void addReceiveMessageRecords(MessageRecord callRecord) {receiveMessageRecords.add(callRecord);}public ArrayList<CallRecord> getCallingInCityRecords() {return callingInCityRecords;}public void setCallingInCityRecords(ArrayList<CallRecord> callingInCityRecords) {this.callingInCityRecords = callingInCityRecords;}public ArrayList<CallRecord> getCallingInProvinceRecords() {return callingInProvinceRecords;}public void setCallingInProvinceRecords(ArrayList<CallRecord> callingInProvinceRecords) {this.callingInProvinceRecords = callingInProvinceRecords;}public ArrayList<CallRecord> getCallingInLandRecords() {return callingInLandRecords;}public void setCallingInLandRecords(ArrayList<CallRecord> callingInLandRecords) {this.callingInLandRecords = callingInLandRecords;}public ArrayList<CallRecord> getAnswerInCityRecords() {return answerInCityRecords;}public void setAnswerInCityRecords(ArrayList<CallRecord> answerInCityRecords) {this.answerInCityRecords = answerInCityRecords;}public ArrayList<CallRecord> getAnswerInProvinceRecords() {return answerInProvinceRecords;}public void setAnswerInProvinceRecords(ArrayList<CallRecord> answerInProvinceRecords) {this.answerInProvinceRecords = answerInProvinceRecords;}public ArrayList<CallRecord> getAnswerInLandRecords() {return answerInLandRecords;}public void setAnswerInLandRecords(ArrayList<CallRecord> answerInLandRecords) {this.answerInLandRecords = answerInLandRecords;}public ArrayList<MessageRecord> getSendMessageRecords() {return sendMessageRecords;}public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) {this.sendMessageRecords = sendMessageRecords;}public ArrayList<MessageRecord> getReceiveMessageRecords() {return receiveMessageRecords;}public void setReceiveMessageRecords(ArrayList<MessageRecord> receiveMessageRecords) {this.receiveMessageRecords = receiveMessageRecords;}}class LandlinePhoneCharging extends ChargeMode {private double monthlyRent = 20;public LandlinePhoneCharging() {super();chargeRules.add(new LandPhoneInCityRule());chargeRules.add(new LandPhoneInProvinceRule());chargeRules.add(new LandPhoneInlandRule());}@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (ChargeRule rule : chargeRules) {sumCost += rule.calCost(userRecords);}return sumCost;}@Overridepublic double getMonthlyRent() {return monthlyRent;}}class MobilePhoneCharging extends ChargeMode {private double monthlyRent = 15;public MobilePhoneCharging() {super();chargeRules.add(new MobilePhoneInCityRule());chargeRules.add(new MobilePhoneInProvinceRule());chargeRules.add(new MobilePhoneInlandRule());}@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (ChargeRule rule : chargeRules) {sumCost += rule.calCost(userRecords);}return sumCost;}@Overridepublic double getMonthlyRent() {return monthlyRent;}}class MobilePhoneMassageCharging extends ChargeMode {private double monthlyRent = 0;public MobilePhoneMassageCharging() {super();chargeRules.add(new MobilePhoneMessageRule());}@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (ChargeRule rule : chargeRules) {sumCost += rule.calCost(userRecords);}return sumCost;}@Overridepublic double getMonthlyRent() {return monthlyRent;}}class Inputdeal {public int check(String input) {if (input.matches("[u]-0791[0-9]{7,8}\\s[0]") || input.matches("[u]-1[0-9]{10}\\s[13]")) {return 1;} else if (input.matches("[m]-1[0-9]{10}\\s" + "1[0-9]{10}\\s" + "[0-9a-zA-Z\\s\\.,]+")) {return 2;}return 0;}public void writeUser(ArrayList<User> users, String input) {User usernew = new User();String[] inputs = input.split(" ");String num = inputs[0].substring(2);for (User i : users) {if (i.getNumber().equals(num)) {return;}}usernew.setNumber(num);int mode = Integer.parseInt(inputs[1]);if (mode == 0) {usernew.setChargeMode(new LandlinePhoneCharging());} else if (mode == 1) {usernew.setChargeMode(new MobilePhoneCharging());} else if (mode == 3) {usernew.setChargeMode(new MobilePhoneMassageCharging());}users.add(usernew);}public void writeRecord(ArrayList<User> users, String input) {String[] inputs = input.split(" ");inputs[0] = inputs[0].substring(2);User callu = null, answeru = null;String out = inputs[0];String in = "";if (inputs.length == 6) {in = inputs[1];} else if (inputs.length == 7) {in = inputs[1];} else if (inputs.length == 8) {in = inputs[2];} else {in = inputs[1];}for (User i : users) {if (i.getNumber().equals(out)) {callu = i;}if (i.getNumber().equals(in)) {answeru = i;}if (callu != null && answeru != null) {break;}}if (input.charAt(0) == 'm') {MessageRecord messageRecord = new MessageRecord(input);if (callu != null) {callu.getUserRecords().addSendMessageRecords(messageRecord);;}if (answeru != null) {callu.getUserRecords().addReceiveMessageRecords(messageRecord);}}}}abstract class CommunicationRecord {protected String callingNumber;protected String answerNumbe;public String getCallingNumber() {return callingNumber;}public void setCallingNumber(String callingNumber) {this.callingNumber = callingNumber;}public String getAnswerNumbe() {return answerNumbe;}public void setAnswerNumbe(String answerNumbe) {this.answerNumbe = answerNumbe;}}abstract class ChargeRule {abstract public double calCost(UserRecords userRecords);}class CallRecord extends CommunicationRecord {private Date startTime;private Date endTime;private String callingAddressAreaCode;private String answerAddressAreaCode;public String getCallType() {String type = "";if (callingAddressAreaCode.equals("0791")) {type = type.concat("1");} else if (callingAddressAreaCode.matches("^079[023456789]$") || callingAddressAreaCode.equals("0701")) {type = type.concat("2");} else {type = type.concat("3");}if (answerAddressAreaCode.equals("0791")) {type = type.concat("1");} else if (answerAddressAreaCode.matches("^079[023456789]$") || answerAddressAreaCode.equals("0701")) {type = type.concat("2");} else {type = type.concat("3");}return type;}public CallRecord(String[] inputs) {super();char type = inputs[0].charAt(0);String sd = null, st = null, ed = null, et = null;if (type == 't') {if (inputs.length == 6) {sd = inputs[2];st = inputs[3];ed = inputs[4];et = inputs[5];callingAddressAreaCode = inputs[0].substring(0, 4);answerAddressAreaCode = inputs[1].substring(0, 4);} else if (inputs.length == 7) {sd = inputs[3];st = inputs[4];ed = inputs[5];et = inputs[6];if (inputs[0].charAt(0) != '0') {if (inputs[2].length() == 10) {answerAddressAreaCode = inputs[2].substring(0, 3);} else {answerAddressAreaCode = inputs[2].substring(0, 4);}callingAddressAreaCode = inputs[1];} else {if (inputs[0].length() == 10) {callingAddressAreaCode = inputs[0].substring(0, 3);} else {callingAddressAreaCode = inputs[0].substring(0, 4);}answerAddressAreaCode = inputs[2];}} else if (inputs.length == 8) {sd = inputs[4];st = inputs[5];ed = inputs[6];et = inputs[7];callingAddressAreaCode = inputs[1];answerAddressAreaCode = inputs[3];}} else if (type == 'm') {}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault());try {startTime = simpleDateFormat.parse(sd + " " + st);endTime = simpleDateFormat.parse(ed + " " + et);} catch (ParseException e) {}}public CallRecord(Date startTime, Date endTime, String callingAddressAreaCode, String answerAddressAreaCode) {super();this.startTime = startTime;this.endTime = endTime;this.callingAddressAreaCode = callingAddressAreaCode;this.answerAddressAreaCode = answerAddressAreaCode;}public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}public String getCallingAddressAreaCode() {return callingAddressAreaCode;}public void setCallingAddressAreaCode(String callingAddressAreaCode) {this.callingAddressAreaCode = callingAddressAreaCode;}public String getAnswerAddressAreaCode() {return answerAddressAreaCode;}public void setAnswerAddressAreaCode(String answerAddressAreaCode) {this.answerAddressAreaCode = answerAddressAreaCode;}
}abstract class CallChargeRule extends ChargeRule {}class LandPhoneInCityRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInCityRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}if (call.getCallType().equals("11")) {sumCost += distanceM * 0.1;} else if (call.getCallType().equals("12")) {sumCost += distanceM * 0.3;} else if (call.getCallType().equals("13")) {sumCost += distanceM * 0.6;}}return sumCost;}}class LandPhoneInlandRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInLandRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}sumCost += distanceM * 0.6;}return sumCost;}}class LandPhoneInProvinceRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInProvinceRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}sumCost += distanceM * 0.3;}return sumCost;}}class MobilePhoneInCityRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInCityRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}if (call.getCallType().equals("11")) {sumCost += distanceM * 0.1;} else if (call.getCallType().equals("12")) {sumCost += distanceM * 0.2;} else if (call.getCallType().equals("13")) {sumCost += distanceM * 0.3;}}return sumCost;}}class MobilePhoneInlandRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInLandRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}sumCost += distanceM * 0.6;}for (CallRecord call : userRecords.getAnswerInLandRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}sumCost += distanceM * 0.3;}return sumCost;}}class MobilePhoneInProvinceRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;for (CallRecord call : userRecords.getCallingInProvinceRecords()) {double distanceS = (-call.getStartTime().getTime() + call.getEndTime().getTime()) / 1000;if (distanceS < 0) {continue;}double distanceM = (int) distanceS / 60;if (distanceS % 60 != 0) {distanceM += 1;}if (call.getCallType().equals("21")) {sumCost += distanceM * 0.3;} else if (call.getCallType().equals("22")) {sumCost += distanceM * 0.3;} else if (call.getCallType().equals("23")) {sumCost += distanceM * 0.3;}}return sumCost;}}class MobilePhoneMessageRule extends CallChargeRule {@Overridepublic double calCost(UserRecords userRecords) {double sumCost = 0;int number = 0;for (MessageRecord m : userRecords.getSendMessageRecords()) {int length = m.getMessage().length();if (length <= 10) {number++;} else {number += length / 10;if (length % 10 != 0) {number++;}}}if (number <= 3) {sumCost = number * 0.1;} else if (number <= 5) {sumCost = 0.3 + 0.2 * (number - 3);} else {sumCost = 0.7 + 0.3 * (number - 5);}return sumCost;}}class MessageRecord extends CommunicationRecord {private String message;public MessageRecord(String input) {super();this.message = input.substring(26);}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}class User {private UserRecords userRecords = new UserRecords();private double balance = 100;private ChargeMode chargeMode;private String number;public double calCost() {return chargeMode.calCost(userRecords);}public double calBalance() {return balance - chargeMode.getMonthlyRent() - chargeMode.calCost(userRecords);}public UserRecords getUserRecords() {return userRecords;}public void setUserRecords(UserRecords userRecords) {this.userRecords = userRecords;}public ChargeMode getChargeMode() {return chargeMode;}public void setChargeMode(ChargeMode chargeMode) {this.chargeMode = chargeMode;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}}class Outputtool {@SuppressWarnings("deprecation")public void output(double out) {
// java.text.DecimalFormat df=new java.text.DecimalFormat("#.##");
// String a=df.format(out);
// System.out.print(a);BigDecimal numb = new BigDecimal(out);out = numb.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();System.out.print(out);}
}
我滴总结:
前面的框架已经搭好,现在只需要在原有基础上增添短信了
没什么好嗦的。
新增短信计费,短信类重写了
短信类容截取输入内容28位后面的就行,
短信计费是分段计费,要注意一下。
我的类图
链接:https://pan.baidu.com/s/1F_6SSG2EtqNJdG6FgZKpsg?pwd=1111
提取码:1111
电信计费系列3-短信计费相关推荐
- 信息学奥赛一本通(1398:短信计费)
1398:短信计费 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 22811 通过数: 10561 [题目描述] 用手机发短信,一条短信资费为0.1元,但 ...
- 信息学奥赛一本通 1398:短信计费 | OpenJudge NOI 1.12 02:短信计费
[题目链接] ybt 1398:短信计费 OpenJudge NOI 1.12 02:短信计费 [题目考点] 1. 函数 2. <cmath>中的取整函数 向上取整 : double ce ...
- .net core实践系列之短信服务-架构优化
前言 通过前面的几篇文章,讲解了一个短信服务的架构设计与实现.然而初始方案并非100%完美的,我们仍可以对该架构做一些优化与调整. 同时我也希望通过这篇文章与大家分享一下,我的架构设计理念. 源码地址 ...
- .net core实践系列之短信服务-Api的SDK的实现与测试
前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替.但是为了说明调度任务使用实现也 ...
- .net core实践系列之短信服务-架构设计
前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...
- 短信计费(信息学奥赛一本通-T1398)
[题目描述] 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字).如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送.假 ...
- 信息学奥赛C++语言:短信计费
[题目描述] 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字).如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送.假 ...
- WZOI-219短信计费
题目描述: 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字).如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送.假设 ...
- .net core实践系列之短信服务-为什么选择.net core(开篇)
前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...
最新文章
- Struts2 项目搭建
- apache的es的原理_Elasticsearch的原理简介
- pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展
- Android版同步工具豌豆荚实测 电脑给手机按软件 截图
- SAP Commerce Cloud 切换 delivery mode 会触发 promotionresult 的删除
- LeetCode 1784. 检查二进制字符串字段
- Linux服务器运行环境搭建(二)——Redis数据库安装
- 硬币最小数量java
- Java面试题以及答案精选(架构师面试题)-Spring专题
- RxJS 系列之一 - Functional Programming 简介
- 导入导出mysql数据库
- 锐捷长ping_锐捷 ping 网关通 ping 机器不通
- oracle mysql认证考试流程_报考oraclemysql认证考试流程有些什么步骤
- 信号与系统(六)z变换
- linux目录显示蓝色,centos系统创建文件夹目录显示颜色
- 查看电脑ip地址是否被占用
- 关于软件产品化的几点思考【转】
- android中倒计时计算器,死亡计算器生命倒计时下载-死亡计算器生命倒计时软件下载 v8.8.0_5577安卓网...
- 遗传算法(包含选择、交叉、变异) MATLAB完整代码 中文注释详解
- 微信公众号分享网页注意点
热门文章
- 写点感想2:车载毫米波雷达产品研发架构
- intel edison固件更新
- Intel处理器家族及命名规则
- AutoIt vs QTP
- 写给父亲的语音计算器(‘(‘‘)‘括号优先级处理递归算法c#,一)
- 盖茨与鲍尔默愤而诉Google 李开复离职有内情 -- ,买skype来控制桌面建立渠道吧
- php中关于qq第三方登录
- 随想·手中没有红玫瑰
- web前端之过滤器的作用
- web 上传文件到ftp服务器,web 上传文件到ftp服务器上