使用ASP.NET Core开发信息采集系统将用户数据添加至企业微信
一、启动Visual Studio 2019,创建ASP.NET Core Web应用程序



二、在Models文件夹添加新项 Person.cs

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc; namespace 信息采集系统.Models
{
public class Person
{
[Display(Name = "编号")]
public int ID { get; set; }
[Display(Name = "姓名")]
[Required(ErrorMessage = "必须输入姓名")]
[Remote("CheckName", "MyValidation")]
public string Name { get; set; }
[Display(Name = "性别")]
public Gender Gender { get; set; }
[Display(Name = "手机号")]
[Required(ErrorMessage = "必须输入手机号码")]
[StringLength(11, ErrorMessage = "手机号码长度应为11位", MinimumLength = 11)]
public string Mobile { get; set; }
[Remote("CheckFatherName", "MyValidation")]
public string FatherName { get; set; }
[Remote("CheckMotherName", "MyValidation")]
public string MotherName { get; set; }
[Display(Name = "邀请码")]
[Required(ErrorMessage = "必须输入认证码")]
[Remote("CheckInvitationCode", "MyValidation")]
public string InvitationCode { get; set; }
}
public enum Gender
{
[Display(Name = "男")]
Male = 1,
[Display(Name = "女")]
Female = 2
}
}
三、在Controllers文件夹,添加“新搭建基架的项目”


点击数据上下文右侧的加号按钮,新建一个数据上下文类

修改StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext<PersonContext>(options =>
options.UseSqlServer(PersonContext.ConnectionString));
}
修改PersonContext.cs
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; namespace 信息采集系统.Models
{
public class PersonContext : DbContext
{
public static string ConnectionString
{
get
{
var path = AppDomain.CurrentDomain.BaseDirectory;
var DatabasePath = System.IO.Path.Combine(new string[] { path, "Person.mdf" });
var s = $"Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=Person;AttachDbFilename={DatabasePath};";
return s;
}
} public PersonContext (DbContextOptions<PersonContext> options)
: base(options)
{
} public DbSet<信息采集系统.Models.Person> Person { get; set; }
}
}
四、添加控制器MyValidationController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; namespace 信息采集系统.Controllers
{
public class MyValidationController : Controller
{
private Models.PersonContext _context { get; set; }
public MyValidationController(Models.PersonContext context)
{
this._context = context;
}
public JsonResult CheckName(string Name)
{
var chinese= Common.PinyinHelper.IsChineseString(Name);
if (chinese)
{
return Json(true);
}
else
{
return Json("姓名必须输入中文");
}
}
public JsonResult CheckFatherName(string FatherName)
{
var chinese = Common.PinyinHelper.IsChineseString(FatherName);
if (chinese)
{
return Json(true);
}
else
{
return Json("姓名必须输入中文");
}
} public JsonResult CheckMotherName(string MotherName)
{
var chinese = Common.PinyinHelper.IsChineseString(MotherName);
if (chinese)
{
return Json(true);
}
else
{
return Json("姓名必须输入中文");
}
}
public JsonResult CheckInvitationCode(string InvitationCode)
{
var b = Common.InvitationCode.IsValid(InvitationCode);
if (b)
{
var item = _context.Person.FirstOrDefault(x => x.InvitationCode == InvitationCode);
if (item == null)
{
return Json(true);
}
else
{
return Json($"此邀请码已被使用,使用人:{item.Name}");
}
}
else
{
return Json("错误的邀请码");
}
}
}
}
五、添加控制器Database.cs,用于创建数据库和删除数据库。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; namespace 信息采集系统.Controllers
{
public class DatabaseController : Controller
{
private Models.PersonContext _context { get; set; }
public DatabaseController(Models.PersonContext context)
{
this._context = context;
}
public string Create()
{
var isCreated = _context.Database.EnsureCreated();
return $"Create={isCreated}";
}
public string Delete()
{
var IsDeleted = _context.Database.EnsureDeleted();
return $"Create={IsDeleted}"; }
}
}
六、修改Views/Person/Create.cshtml,解决性别枚举类型无法列出枚举值的问题。
<select asp-for="Gender" asp-items="@Html.GetEnumSelectList(typeof(Gender))" class="form-control"></select>
七、修改StartUp.cs,增加配置文件读取
public static IConfiguration Config { get; set; }
public static string CorpId { get { return Config.GetSection("CorpId").Value; } }
public static string CorpSecret { get { return Config.GetSection("CorpSecret").Value; } }
public static long DefaultDepartment { get { return int.Parse(Config.GetSection("DefaultDepartment").Value); } }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
Config = configuration;
}
八、添加微信操作类AccessToken.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text; namespace 信息采集系统.Common
{
public class AccessToken : JsonObject<AccessToken>
{
[DataMember] public int errcode { get; set; }
[DataMember] public string errmsg { get; set; }
[DataMember] public string access_token { get; set; }
[DataMember] public int expires_in { get; set; }
public static AccessToken Update()
{
var CorpId = Startup.CorpId;
var Secret = Startup.CorpSecret;
var url = $"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CorpId}&corpsecret={Secret}";
var b = WebHelper.HttpGet(url);
var item = AccessToken.From(b);
return item;
}
}
}
添加微信操作类QiYeWeiXinUser.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text; namespace 信息采集系统.Common
{
public class QiYeWeiXinUser
{
[DataContract]
private class GetUserInfo : JsonObject<GetUserInfo>
{
[DataMember] public long errcode { get; set; }
[DataMember] public string errmsg { get; set; }
[DataMember] public string userid { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public long[] department { get; set; }
[DataMember] public string mobile { get; set; }
[DataMember] public string gender { get; set; }
[DataMember]public UserExtAttr extattr { get; set; }
}
[DataContract]
private class AddUserRequest : JsonObject<AddUserRequest>
{
[DataMember] public string userid { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public long[] department { get; set; }
[DataMember] public string mobile { get; set; }
[DataMember] public string gender { get; set; }
[DataMember]public UserExtAttr extattr { get; set; }
}
[DataContract]
public class AddUserResponse : JsonObject<AddUserResponse>
{
[DataMember] public long errcode { get; set; }
[DataMember] public string errmsg { get; set; } }
[DataContract]
public class UserExtAttr
{
[DataMember]public List<UserAttr> attrs { get; set; }
}
[DataContract]
public class UserAttr
{
[DataMember]public long type { get; set; }
[DataMember]public string name { get; set; }
[DataMember]public AttrText text { get; set; }
}
[DataContract]
public class AttrText
{
[DataMember]public string value { get; set; }
} public static bool Exist(string access_token, string userid)
{
var url = $"https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={userid}";
var web = System.Net.WebRequest.Create(url);
using (var responseStream = web.GetResponse().GetResponseStream())
{
var sr = new System.IO.StreamReader(responseStream);
var s = sr.ReadToEnd();
var b = System.Text.Encoding.UTF8.GetBytes(s);
var item = GetUserInfo.From(b);
if (item == null)
{
return false;
}
else
{
if (item.userid != userid)
{
return false;
}
else
{
return true;
}
}
} } public static bool Add(string accesstoken, string userid, string name, string mobile, string gender, long[] department,string fatherName,string motherName, out string errmsg)
{
var user = new AddUserRequest()
{
userid = userid,
name = name,
mobile = mobile,
gender = gender,
department = department,
extattr = new UserExtAttr()
{
attrs = new List<UserAttr>()
{
new UserAttr()
{
type = 0,
name = "父亲",
text = new AttrText() { value = fatherName }
},
new UserAttr()
{
type = 0,
name = "母亲",
text = new AttrText() { value = motherName }
}
}
}
}; var b = user.ToArray();
var url = $"https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token={accesstoken}";
var rb = WebHelper.HttpPost(url, b);
var response = AddUserResponse.From(rb);
if (response.errcode == 0)
{
errmsg = "";
return true;
}
else
{
errmsg = response.errmsg;
return false;
}
}
}
}
九、修改PersonController.cs
public async Task<IActionResult> Create([Bind("ID,FullName,Gender,Mobile,InvitationCode")] Student student)
{
if (ModelState.IsValid)
{
#region 添加到企业微信
var pinyin = PinyinHelper.GetPinyin(student.FullName);
var token = AccessToken.Update();
var index = 0;
var userid = "";
var exist = true;
while (exist)
{
if (index == 0)
{
userid = pinyin;
}
else
{
userid = $"{pinyin}{index}";
}
exist = QiYeWeiXinUser.Exist(token.access_token, userid);
}
string errmsg;
var success = QiYeWeiXinUser.Add(token.access_token, userid, student.FullName, student.Mobile, student.Gender.ToString(), new long[] { Startup.DefaultDepartment },out errmsg);
Console.WriteLine($"add user:{student.FullName}\t{userid}");
#endregion
if (success)
{
_context.Add(student);
await _context.SaveChangesAsync();
//return RedirectToAction(nameof(Index));
return RedirectToAction(nameof(QRCode));
}
else
{
return RedirectToAction(nameof(Error), new { errmsg });
}
}
return View(student);
}
10、修改appsettings.json,增加以下内容
"CorpId": "wx8da1???????06720",
"CorpSecret": "sc_LkWSzfKq2Y3x2??????????gMPlVtU5Ecx0zs",
"DefaultDepartment": "3",
使用ASP.NET Core开发信息采集系统将用户数据添加至企业微信的更多相关文章
- asp.net core系列 47 Identity 自定义用户数据
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
- [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件
本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...
- ASP.NET Core 开发-Logging 使用NLog 写日志文件
ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 .NET Core 和 ASP.NET Core . ASP.NET Core已经内置了日志支持,可以 ...
- ASP.Net Core开发(踩坑)指南
ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- ASP.NET Core 开发-中间件(Middleware)
ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...
- ASP.NET Core开发-Docker部署运行
ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...
- ASP.NET Core开发-后台任务利器Hangfire使用
ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...
- ASP.NET Core开发-读取配置文件Configuration
ASP.NET Core 是如何读取配置文件,今天我们来学习. ASP.NET Core的配置系统已经和之前版本的ASP.NET有所不同了,之前是依赖于System.Configuration和XML ...
随机推荐
- h5:vue3 + ts + vite + vuex + axios + vant4 + scss + postcss+mockjs+element-plus
模板地址:https://gitee.com/zhang_meng_lei/mobile-template-h5-vue3/tree/master 1.安装element-plus:yarn add ...
- mac SIP系统完整性保护关闭方法
许多Mac用户反应,装了部分软件后打不开,那可能是sip系统完整性没有关闭.下面我们就来看一下如何关闭sip系统完整性. 检查状态 在sip系统完整性关闭前,我们先检查是否启用了SIP系统完整性保护. ...
- Python3之并发(七)---线程同步队列(queue)
queue模块实现了多生产者,多消费者队列 queue模块的常用类和异常 queue.Queue(maxsize=0) 先进先出(FIFO)的队列, maxsize: 队列的大小(即队列的元素个数), ...
- Java基础——数组的初始化与赋值、循环遍历,Random随机数[大于等于0,小于所给值)
package com.zhao.demo; public class Demo05 { //数组的静态初始化 /*public static void main(String[] args) { i ...
- vagrant用密码连接ssh
1通过 ssh address连接 1:进去linux 2:修改配置文件信息 vi /etc/ssh/sshd_config 修改 passwordAuthentication no 改为 passw ...
- 使用vite创建vue3+ts项目完整流程
1.创建项目 npm init vite@latest 依次输入项目名称.选择vue.选择ts 2.引入依赖 cd 项目名称 npm install 3.启动项目 npm run dev 4.引入vu ...
- Position Based Dynamics【译】
绝大部分机翻,少部分手动矫正,仅供参考.本人水平有限,如有误翻,概不负责... Position Based Dynamics Abstract The most popular approaches ...
- UNIT FIVE TO EIGHT
内存单元间接表示 mov dl, [0] :直接寻址 mov bx, 0mov dl, [bx]:间接寻址 loop指令 1.语法 loop 标号 2.CPU执行指令过程 ① (cx) ← (cx) ...
- prophet安装(ubuntu16 python3.6)
ubuntu16 python3.6 (ubuntu16自带的python3是3.5 升级至3.6可参考https://blog.csdn.net/weixin_42544006/article/de ...
- Vue.sync修饰符与this.$emit('update:xxx', newXXX)
Vue通过prop进行双向数据绑定.子组件数据变化,一般只能通过 this.$emit(func, val) 回调父组件函数来传值给父组件. Vue2.3版本引入sync,作为一个事件绑定语法糖,当子 ...