心理测评全系统设计与代码实现

您所在的位置:网站首页 心理评估流程图 心理测评全系统设计与代码实现

心理测评全系统设计与代码实现

2024-07-16 13:01:07| 来源: 网络整理| 查看: 265

心理测评设计与代码实现 一、数据库设计篇二、后台设计与实现(.Net Core)1、环境准备2、基类实现3、API服务4、预览截图 三、前端开发与实现(wx小程序)1、准备2、Coding wx3、上效果截图 四、评测报告测试1:PSTR规则与算法测试2:霍兰德职业兴趣测试- 介紹页面- 答题页- 评测结果展示

在这里插入图片描述

心理评测不同于考试系统, 答案是没有对错的,且都是选择题, 是根据被评测者所选的选项综合加权得分后,测试出被评测者的性格、爱好、职业等更近哪一种类型。 这里分别从数据库设计、后台代码实现、和小程序开发, 和评测报告的生成介绍

– 系统为本人从0开始搭建,持续同步更新, 欢迎各位大侠拍砖。

一、数据库设计篇

数据库— Mysql,表1:测评主表、表2:问题表、表3:回答选项表、表4:测试结果表、其它:报告、资源等

测评主表 CREATE TABLE `t_test_m` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(20) DEFAULT NULL COMMENT '问卷编码', `title` varchar(50) DEFAULT NULL COMMENT '问卷标题', `sub_title` varchar(50) DEFAULT NULL COMMENT '副标题', `sub_cn` varchar(30) DEFAULT NULL COMMENT '简称中文', `sub_en` varchar(30) DEFAULT NULL COMMENT '简称英文', `direction` text COMMENT '问卷说明(以MD读法保存)', `isfree` int(11) DEFAULT '1' COMMENT '是否免费(1免费,其它为收费)', `money` int(11) DEFAULT NULL COMMENT '收费金额,单位分', `thkMsg` text COMMENT '结束感谢语言', `ctime` datetime DEFAULT NULL COMMENT '添加时间', `startTime` datetime DEFAULT NULL COMMENT '开始时间', `endTime` datetime DEFAULT NULL, `editor` varchar(30) DEFAULT NULL COMMENT '添加人', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 问题表 CREATE TABLE `t_test_q` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(50) DEFAULT NULL COMMENT '问题编号', `qnum` varchar(100) NOT NULL COMMENT '题号', `title` varchar(100) NOT NULL COMMENT '测试标题', `direction` varchar(200) DEFAULT NULL COMMENT '描述', `m_code` varchar(50) DEFAULT NULL COMMENT '评测主表ID', `qtype` int(11) DEFAULT '1' COMMENT '该问题题型,1表示单选,9表示多选,0表示填空', `ctime` datetime DEFAULT NULL COMMENT '创建时间', `order` int(11) DEFAULT NULL COMMENT '排序号', `isdel` int(11) DEFAULT '0' COMMENT '是否删除 0否,1删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.问题选项表

CREATE TABLE `t_test_a` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '选项ID', `q_code` varchar(50) NOT NULL COMMENT '问题Code', `direction` varchar(200) DEFAULT NULL COMMENT '选项描述', `score` int(11) DEFAULT NULL COMMENT '得分,用于计算', `iscorrect` int(11) DEFAULT '0' COMMENT '是否为正确的选项,0表示该回答无准答案,-1表示错误,1表示正确', `order` int(11) DEFAULT NULL COMMENT '排序', `isdel` int(11) DEFAULT NULL COMMENT '是否删除,0否,1是', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 评测结果 CREATE TABLE `t_test_r` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userid` varchar(50) DEFAULT NULL COMMENT '评测用户ID', `username` varchar(50) DEFAULT NULL COMMENT '用户名', `orgname` varchar(100) DEFAULT NULL COMMENT '所属组织', `mcode` varchar(50) DEFAULT NULL COMMENT '测试主表Code', `source` varchar(30) DEFAULT NULL COMMENT '评测来源:如小程序、官网、线下二维码', `resutJson` text COMMENT '评测结果, 以Json方式保存', `startTime` datetime DEFAULT NULL COMMENT '测试开始时间', `endTime` datetime DEFAULT NULL COMMENT '测试结束时间', `costTime` int(11) DEFAULT NULL COMMENT '耗时,单位秒。(注意耗时≠结束时间-开始时间)', `reportUrl` varchar(300) DEFAULT NULL COMMENT '评测报告地址:报告生成的地址, 或则预留好的文件地址', `reportText` text COMMENT '报告内容:以MarkDown格式保存', `ispay` int(11) DEFAULT '0' COMMENT '是否已支付,0未支付,1已支付', `amount` int(11) DEFAULT NULL COMMENT '实际支付金额', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

到此测试评系统数据库设计的主要几张表都已完成了, 接下来以“PSTR心理压力测试”案例导入数据, 完成SQL初始化数据。

主表:

INSERT INTO t_test_m ( CODE, title, sub_title, sub_cn, sub_en, direction, isfree, money, ctime, testminute, startTime, endTime, editor ) VALUES ('PSTR', '心理压力测试(PSTR专业版)', 'PSTR', '心理压力测试', 'PSTR', '压力既可以是你生活的助手也可以变成生活的阻碍。PSTR心理压力测试,帮助你了解自己面临的心理压力程度。' ,1 ,0 ,now() ,10 ,now() ,'2050-01-01', ' admin ' ) 问题表初始化数据 insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR1','1','____我受背痛之苦','','PSTR','1','2022-3-17','1','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR26','26','____我喝酒','','PSTR','1','2022-3-17','26','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR2','2','____我的睡眠不定且睡不安稳','','PSTR','1','2022-3-17','2','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR27','27','____我很自觉(自己需要、情绪、动机、计划、目标等)','','PSTR','1','2022-3-17','27','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR3','3','____我有头痛','','PSTR','1','2022-3-17','3','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR28','28','____我觉得己像四分五裂','','PSTR','1','2022-3-17','28','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR4','4','____我颚部疼痛','','PSTR','1','2022-3-17','4','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR29','29','____我的眼睛又酸又累','','PSTR','1','2022-3-17','29','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR5','5','____若须等候,我会不安','','PSTR','1','2022-3-17','5','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR30','30','____我的腿,或脚抽筋','','PSTR','1','2022-3-17','30','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR6','6','____我的後颈感到疼痛','','PSTR','1','2022-3-17','6','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR31','31','____我的心跳快速','','PSTR','1','2022-3-17','31','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR7','7','____我比多数人更神经紧张','','PSTR','1','2022-3-17','7','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR32','32','____我怕结识人','','PSTR','1','2022-3-17','32','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR8','8','____我很难入睡','','PSTR','1','2022-3-17','8','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR33','33','____我手脚冰冷','','PSTR','1','2022-3-17','33','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR9','9','____我的头感到紧或痛','','PSTR','1','2022-3-17','9','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR34','34','____我患便秘','','PSTR','1','2022-3-17','34','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR10','10','____我的胃有毛病','','PSTR','1','2022-3-17','10','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR35','35','____我发现自己很容易哭','','PSTR','1','2022-3-17','35','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR11','11','____我对自己没有信心','','PSTR','1','2022-3-17','11','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR36','36','____我消化不良','','PSTR','1','2022-3-17','36','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR12','12','____我对自己说话','','PSTR','1','2022-3-17','12','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR37','37','____我咬指甲','','PSTR','1','2022-3-17','37','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR13','13','____我忧虑财务问题','','PSTR','1','2022-3-17','13','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR38','38','____我耳中有嗡嗡声','','PSTR','1','2022-3-17','38','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR14','14','____与人见面时,我会窘怯','','PSTR','1','2022-3-17','14','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR39','39','____我小便频密','','PSTR','1','2022-3-17','39','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR15','15','____我怕发生可怕的事','','PSTR','1','2022-3-17','15','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR40','40','____我有胃溃疡的毛病','','PSTR','1','2022-3-17','40','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR16','16','____白天我觉得累','','PSTR','1','2022-3-17','16','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR41','41','____我有皮肤方面的毛病','','PSTR','1','2022-3-17','41','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR17','17','____下午我感到喉咙痛,','','PSTR','1','2022-3-17','17','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR42','42','____我未经医师指示使用各种但并非由於染上感冒药物','','PSTR','1','2022-3-17','42','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR18','18','____我心情不安、无法静坐','','PSTR','1','2022-3-17','18','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR43','43','____我的咽喉很紧','','PSTR','1','2022-3-17','43','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR19','19','____我感到非常口乾','','PSTR','1','2022-3-17','19','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR44','44','____我有十二指肠溃疡的毛病','','PSTR','1','2022-3-17','44','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR20','20','____我有心脏毛病','','PSTR','1','2022-3-17','20','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR45','45','____我担心我的工作','','PSTR','1','2022-3-17','45','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR21','21','____我觉得自己不是很有用','','PSTR','1','2022-3-17','21','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR46','46','____我口腔溃烂','','PSTR','1','2022-3-17','46','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR22','22','____我吸烟','','PSTR','1','2022-3-17','22','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR47','47','____我为琐事忧虑','','PSTR','1','2022-3-17','47','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR23','23','____我肚子不舒服','','PSTR','1','2022-3-17','23','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR48','48','____我呼吸浅促','','PSTR','1','2022-3-17','48','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR24','24','____我觉得不快乐','','PSTR','1','2022-3-17','24','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR49','49','____我觉得胸部紧迫','','PSTR','1','2022-3-17','49','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR25','25','____我流汗','','PSTR','1','2022-3-17','25','0'); insert into t_test_q(code,qnum,title,direction,m_code,qtype,ctime,`order`,isdel) values('PSTR50','50','____我发现难做决定','','PSTR','1','2022-3-17','50','0'); 问题选项表 insert into t_test_a(q_code,direction,score,iscorrect,`order`,isdel) values('PSTR1','从未',0,0,5,0); insert into t_test_a(q_code,direction,score,iscorrect,`order`,isdel) values('PSTR1','从未',0,0,5,0); …… -- 省掉248条

频率: 总是–4 经常–3 有时–2 很少–1 从未–0

问题选项表脚本没有撸完, 全部一样5个答案, 50道题共添加250条记录, 会不会有键盘侠认为我很250呢, 可以5条记录搞定的, 非要来一个250; 可能真是多余的, 但为了测评系统的通用性, 多存几条记录对数据库来说很easy。

二、后台设计与实现(.Net Core) 1、环境准备 Startup.cs public void ConfigureServices(IServiceCollection services) { //注册编码提供程序 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); //装载配置信息 object obj = Newtonsoft.Json.JsonConvert.DeserializeObject(System.IO.File.ReadAllText("appsettings.json")); services.AddDbContextPool(options => options.UseMySql(Configuration.GetConnectionString("MySqlConnection"))); //注入Controller services.AddControllers(); //增加Swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1.1.0", Title = "评测系统", Description = "", }); }); } appsettion "ConnectionStrings": { "MySqlConnection": "database=luqub;server=IP;port=3306;uid=root;password=abc0755..;CharSet=utf8;sslMode=None;Pooling=true" } 2、基类实现 接下来写一个BaseController.cs 基类 这里可以实现认证拦截, 日报记录等操作,IsDevelopment 用于在本地调试时不验证token using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; namespace yourspace { /// /// 控制器基类 /// [FilterException] [Produces("application/json")] [Route("api/[controller]")] [ApiController] public class BaseController : Controller { /// /// 服务器部署环境redis配置 /// public static string redisSeting = "IP:6380,password=***,poolsize=50,ssl=false,writeBuffer=10240"; private static bool isInit = false; public static bool IsDevelopment = false; /// /// 用户Token,用于关键接口校验 /// public string UserToken = ""; /// /// Redis操作类 /// public static CSRedis.CSRedisClient csredis = null; /// /// 执行控制器(Start)重写,拦截未登录认证的用户请求, Http中结尾带"_"则不需要登录访问 /// /// public override void OnActionExecuting(ActionExecutingContext context) { context.HttpContext.Items["StartTime"] = DateTime.Now; //获取请求头 if (!IsDevelopment && !context.HttpContext.Request.Path.Value.EndsWith('_')) { if (!isInit) { csredis = new CSRedis.CSRedisClient(redisSeting); RedisHelper.Initialization(csredis); //初始化 RedisHelper isInit = true; } if (!context.HttpContext.Request.Headers.ContainsKey("authorization")) { context.Result = Redirect("/api/Common/NoToken_"); } else { if (!RedisHelper.Exists(context.HttpContext.Request.Headers["authorization"][0])) { context.Result = Redirect("/api/Common/AuthError_"); } else { UserToken = context.HttpContext.Request.Headers["authorization"][0]; } } } } /// /// /// 执行控制器(End)重写,错误日志记录到文件、数据库,可选, 如请求量过大, 可修改为异步操作 /// /// public override void OnActionExecuted(ActionExecutedContext context) { string log = ""; if (context.Exception != null) { log = "[Error] " + DateTime.Now; Common.WriteErrorLogWP("请求出错", context.Exception); } else { log = "[Info] " + DateTime.Now; } if (context.HttpContext.Items["StartTime"]!=null) { log += " times:" + DateTime.Now.Subtract((DateTime)context.HttpContext.Items["StartTime"]).TotalMilliseconds; } log += " UserID:" + UserID + " Token:"+UserToken ; log += " Url:"+ context.HttpContext.Request.Path.Value; log += " Parms:" + context.HttpContext.Request.QueryString.Value; if (context.Exception != null) { log += "错误详情:"+ context.Exception; } Common.WriteLog(log); } private string _userid = null; /// /// 用户ID,前提需要有Token /// public string UserID { get { if (UserToken == "" && IsDevelopment) { _userid = "a36925400ddc872"; } if (_userid == null) { if (!isInit) { csredis = new CSRedis.CSRedisClient(redisSeting); RedisHelper.Initialization(csredis); //初始化 RedisHelper isInit = true; } string id = ""; Dictionary dic = new Dictionary(); Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject(RedisHelper.Get(UserToken)) as Newtonsoft.Json.Linq.JObject; Common.JObjectToDictionary(dic, obj); if (dic.Count > 0) { id = dic["USER_ID"].ToString(); } _userid = id; return id; } else { return _userid; } } } private Dictionary _userDic = null; public Dictionary UserDic { get { string userStrs = @"{ 'USER_ID': 'a36925400ddc872', 'USER_OPENID': 'oB9sa40jdG5atBx3PjpE6c', 'USER_WX_NAME': '评测用户1', 'USER_TYPE': '9', 'USER_STATUS': '1', 'USER_ISPAY': '0', 'TOKEN': 'b3cad2-525400ddc872' }"; if (IsDevelopment) { _userid = "a36925400ddc872"; Dictionary dic = new Dictionary(); Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject(userStrs) as Newtonsoft.Json.Linq.JObject; Common.JObjectToDictionary(dic, obj); _userDic = dic; } if (_userDic == null) { if (!isInit) { csredis = new CSRedis.CSRedisClient(redisSeting); RedisHelper.Initialization(csredis); //初始化 RedisHelper isInit = true; } Dictionary dic = new Dictionary(); Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject(RedisHelper.Get(UserToken)) as Newtonsoft.Json.Linq.JObject; Common.JObjectToDictionary(dic, obj); _userDic = dic; } return _userDic; } set { //在Redis中更新用户 if (!isInit) { csredis = new CSRedis.CSRedisClient(redisSeting); RedisHelper.Initialization(csredis); //初始化 RedisHelper isInit = true; } RedisHelper.Set(UserToken, value); _userDic = value; } } /// /// /// /// /// public override JsonResult Json(object data) { object retunData = data; if (data is ResultData || data is RowsData) { return base.Json(data); } else { ResultData rd = new ResultData() { code = "1", data = retunData, msg = (data is string) ? data.ToString() : "" }; return base.Json(rd); } } } } 3、API服务 API实现,创建一个MynatureController类 using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Data; namespace yourspace { public class MynatureController : BaseController { /// /// 评测试卷 /// /// /// [HttpGet("getPaper")] public JsonResult GetPaper(string mcode) { //直接上SQL string sql = @"SELECT id, `code`, title, sub_title, sub_cn, sub_en, direction, isfree, money, thkMsg, testminute, autosubmit FROM t_test_m WHERE `code` = @mcode AND now() BETWEEN startTime AND endTime"; DataTable dt = Common.GetDataTable(sql, new Dictionary() { { "mcode", mcode } }); return Json(dt.ToJson()); } /// /// 返回问题列表 /// /// 问卷编号 /// 是否随机出题 /// 取出问题号 /// [HttpGet("getQuestions")] public JsonResult GetQuestions(string mcode, bool random = true, int qnum = 0) { string sql; //随机出题 if (random) { sql = @"SELECT * FROM ( SELECT m_code, q.title, q.id, q.qnum, a.direction, a.score, a.`order` AS aorder, a.id AS aid FROM t_test_q q INNER JOIN t_test_a a ON q.`code` = a.q_code ) tb WHERE m_code = @mcode ORDER BY aorder, rand() "; } //顺序取, 当取题号为0时标示全部 else if (qnum == 0) { sql = @"SELECT * FROM ( SELECT m_code, q.title, q.id, q.qnum, a.direction, a.score, a.`order` AS aorder, a.id AS aid FROM t_test_q q INNER JOIN t_test_a a ON q.`code` = a.q_code ) tb WHERE m_code = @mcode ORDER BY qnum,aorder;"; } //指定题号 else { sql = @"SELECT * FROM ( SELECT m_code, q.title, q.id, q.qnum, a.direction, a.score, a.`order` AS aorder, a.id AS aid FROM t_test_q q INNER JOIN t_test_a a ON q.`code` = a.q_code ) tb WHERE m_code = @mcode and qnum=@qnum ORDER BY aorder"; } DataTable dt = Common.GetDataTable(sql, new Dictionary() { {"mcode", mcode},{"qnum",qnum} }); #region 组装返回Json格式 Dictionary pairs = new Dictionary(); foreach (DataRow dataRow in dt.Rows) { string key = "q" + dataRow["qnum"].ToString(); if (pairs.ContainsKey(key)) { Dictionary qdic = pairs[key] as Dictionary; List items = qdic["items"] as List; Dictionary cdic = new Dictionary(); cdic.Add("direction", dataRow["direction"].ToString()); cdic.Add("score", dataRow["score"].ToString()); cdic.Add("order", dataRow["aorder"].ToString()); cdic.Add("id", dataRow["aid"].ToString()); items.Add(cdic); } else { List items = new List(); Dictionary cdic = new Dictionary(); cdic.Add("direction", dataRow["direction"].ToString()); cdic.Add("score", dataRow["score"].ToString()); cdic.Add("order", dataRow["aorder"].ToString()); cdic.Add("id", dataRow["aid"].ToString()); items.Add(cdic); Dictionary qdic = new Dictionary(); qdic.Add("m_code", dataRow["m_code"].ToString()); qdic.Add("title", dataRow["title"].ToString()); qdic.Add("id", dataRow["id"].ToString()); qdic.Add("qnum", dataRow["qnum"].ToString()); qdic.Add("items", items); pairs.Add(key, qdic); } } List returList = new List(); foreach (var item in pairs) { returList.Add(item.Value); } #endregion return Json(returList); } } } 4、预览截图

在这里插入图片描述

到此数据准备与API接口已基本完成, 后面开始着手小程序开发了

三、前端开发与实现(wx小程序) 1、准备

为了布局灵活,维护简单,在wx小程序中的富文本我们将采用MarkDown格式来呈现。 这里我使用的是wemark, 可以去gitee下载 使用方式:

1、下载并拷贝wemark目录到小程序根目录 2、在页面的配置文件中引用wemark组件 { "usingComponents": { "wemark": "../wemark/wemark" } } 3、WXML中使用:


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭