提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
环境搭建完,根据管理系统用户需要注册,实现登录然后将用户信息保存在本地中的需求,本章主要实现系统登录注册功能。

首先分析注册页面所要实现的功能,其功能包括账号、昵称、密码和二次确认密码。其中账号和昵称不能为空,密码和确认密码要一致。
在整个register页面的搭建过程中,我们需要使用ELementUI组件库。在编写注册页面前我们需要删除掉views下的home.vue和about.vue,并在App.vue中删除掉router-link的跳转
在src/router/index.js中先把创建项目自带的home和about路由删除掉,在routes中配置register路由。然后在views下创建register文件夹并在register文件夹下创建index.vue。最后我们在src/router/index.js通过import导入注册页面,(注意需注释掉路由方式即mode: “history”,)
import Vue from "vue";
import VueRouter from "vue-router";
import Register from "../views/register";
Vue.use(VueRouter);
const routes = [
{
path: "/register",
name: "register",
component: Register,
},
];
const router = new VueRouter({
// mode: "history",
base: process.env.BASE_URL,
routes,
});
export default router;
注册页面使用的是ElementUI组件库中的Form表单的自定义校验规则。
elementui表单链接
在elementui中选中Form表单,创建我们需要的账号、昵称、密码和确认密码。然后在data的return函数中传入ruleForm所包含的prop值,由于账号和昵称不为空,我们通过表单验证传入校验规则,在页面中加入该规则前带星号表示设立成功。对密码的二次校验,我们可以设立validatePass和validatePass2进行验证。最后将我们提交的数据验证提交。
<template>
<div class="register-container">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="register-ruleForm"
>
<h2 class="register-title">注册</h2>
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item label="昵称" prop="nickname">
<el-input v-model="ruleForm.nickname"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input
type="password"
v-model="ruleForm.checkPass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>提交</el-button
>
<el-button @click="goLogin('ruleForm')">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { register } from "@/api/login.js";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
if (this.ruleForm.checkPass !== "") {
this.$refs.ruleForm.validateField("checkPass");
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.ruleForm.pass) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
ruleForm: {
username: "",
nickname: "",
pass: "",
checkPass: "",
},
rules: {
username: [{ required: true, message: "请输入账号", trigger: "blur" }],
nickname: [{ required: true, message: "请输入昵称", trigger: "blur" }],
pass: [{ validator: validatePass, trigger: "blur" }],
checkPass: [{ validator: validatePass2, trigger: "blur" }],
},
};
},
components: {},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
// alert("submit!");
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
},
};
这里我们新建login.js文件来发送ajax请求传递前台验证提交的数据( username,nickname,password),并且获取后台响应前台数据得到的一个异步对象(request),我们可以在register下的index.vue导入使用axios方法( register)拿到后台响应的异步对象。
import request from "@/utils/request.js";
// 注册
export function register(username,nickname,password){ //这里的参数都是形参
return request({
method:"post",
url:"/user/register",
data:{ //需要向后台传输的数据是req,后台又会响应回来一个数据是res
username,
nickname,
password
}
})
}
我们在后台需要配置接口接受存储数据在数据库,并通过接口将数据返回给前台页面,首先通过npm init -y安装package.json,我们这里使用了express、mongoose、md5和body-parse。
安装指令为
npm i express blueimp-md5 body-parse mongoose@5.5.12
代码如下:导入需要使用的组件
var express = require("express");
var bodyParser = require("body-parser");
var path = require("path");
var router = require("./router.js")
var app=express();
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// 开发资源
app.use("./node_modules",express.static(path.join(__dirname,"./node_modules/")))
app.use(router);
app.listen(3000,function(){
console.log("running....");
})
这里使用的是mongoose数据库,我们创建数据库的规则对象。
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/msmstu');
//定义一个规则对象
var Schema = mongoose.Schema;
var userSchema = new Schema({
username:{
type:String,
required:true
},
password:{
type:String,
required:true
},
nickname:{
type:String,
required:true
},
token:{
type:String,
required:true
}
});
module.exports = mongoose.model('KeLi', userSchema);
var express = require("express");
var md5 = require("blueimp-md5");
var User = require("./User.js")
var router = express.Router()
// 注册
router.post("/user/register",function(req,res){
var body = req.body; //req里面包含的就是我们前台传递过来的数据
// console.log(body);
// res.send("666")
User.find({ //这里查询的是数据库中数据,find是mongoose中的方法
$or:[
{
username:body.username
},
{
nickname:body.nickname
}
]
},function(err,data){
// console.log("data1"+data);
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"serve error",
})
}
if(data.length !== 0){ //说明数据库中已有该数据
return res.status(200).json({
code:4000,
flag:false,
message:"账号或昵称已存在"
})
}
body.token = md5(md5(body.username)+"KeLi"); //设置一个token存入数据库中
new User(body).save(function(err,data){ //这里是新建User表对象用于存储body数据
// console.log("data2"+data);
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"存储失败",
})
}
return res.status(200).json({
code:2000,
flag:true,
message:"注册成功"
})
})
})
})
这里是注册功能的实现,注册使用post传递数据,路径是/user/register,这里body是响应req(前台传递过来的数据)的body,User.find是调用数据库然后使用find方法查找username或nickname其中一条就表示注册成功,当有err时报错,当data.length不为0时,表明数据库中已有该数据,然后我们对注册的进行加密,然后新建一个User表来存储该对象。
router.js
var express = require("express");
var md5 = require("blueimp-md5");
var User = require("./User.js")
var router = express.Router()
// 注册
router.post("/user/register",function(req,res){
var body = req.body; //req里面包含的就是我们前台传递过来的数据
// console.log(body);
// res.send("666")
User.find({ //这里查询的是数据库中数据,find是mongoose中的方法
$or:[
{
username:body.username
},
{
nickname:body.nickname
}
]
},function(err,data){
// console.log("data1"+data);
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"serve error",
})
}
if(data.length !== 0){ //说明数据库中已有该数据
return res.status(200).json({
code:4000,
flag:false,
message:"账号或昵称已存在"
})
}
body.token = md5(md5(body.username)+"KeLi"); //设置一个token存入数据库中
new User(body).save(function(err,data){ //这里是新建User表对象用于存储body数据
// console.log("data2"+data);
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"存储失败",
})
}
return res.status(200).json({
code:2000,
flag:true,
message:"注册成功"
})
})
})
})
我们在register的index.vue中调用api下的login.js封装的register方法,获取后台响应的异步对象,通过获取到的异步对象,调用获取异步对象的方法,传入参数(this.ruleForm.username,this.ruleForm.nickname,this.ruleForm.pass)。设置一个值resp获取response.data。判断resp上的flag值的布尔值是为true,是true注册成功,页面跳转到登录页面,否则弹出警告。
在登录按钮上设置一个goLogin方法。点击触发。
代码如下
<template>
<div class="register-container">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="register-ruleForm"
>
<h2 class="register-title">注册</h2>
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item label="昵称" prop="nickname">
<el-input v-model="ruleForm.nickname"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input
type="password"
v-model="ruleForm.checkPass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>提交</el-button
>
<el-button @click="goLogin('ruleForm')">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { register } from "@/api/login.js";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
if (this.ruleForm.checkPass !== "") {
this.$refs.ruleForm.validateField("checkPass");
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.ruleForm.pass) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
ruleForm: {
username: "",
nickname: "",
pass: "",
checkPass: "",
},
rules: {
username: [{ required: true, message: "请输入账号", trigger: "blur" }],
nickname: [{ required: true, message: "请输入昵称", trigger: "blur" }],
pass: [{ validator: validatePass, trigger: "blur" }],
checkPass: [{ validator: validatePass2, trigger: "blur" }],
},
};
},
components: {},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
// alert("submit!");
// 调用方法发送ajax请求
register(
this.ruleForm.username,
this.ruleForm.nickname,
this.ruleForm.pass
).then((response) => {
// console.log(response.data);
// 这里的逻辑是如果在后台的数据库中注册成功的话,通过flag的布尔值来判断是否进入登录页面
const resp = response.data;
if (resp.flag) {
// 调转到登录界面
this.$router.push("/login")
} else {
this.$message({
message: resp.message,
type: "warning",
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goLogin(){
// 跳转到登录页面,使用的时编程式的登陆跳转方法
this.$router.push("/login")
}
},
};
</script>
<style scoped>
.register-container {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
background: url("../../assets/bgu.gif");
background-size: cover;
}
.register-ruleForm {
width: 400px;
height: 500px;
margin: 150px auto;
padding: 20px;
background-color: aquamarine;
border-radius: 20px;
}
.register-title {
text-align: center;
background-color: rgb(55, 0, 255);
}
</style>
注意将.env.development的VUE_APP_SERVICE_URL = ‘http://localhost:3000’,这里要换成与后端匹配的3000端口。
登录主要实现用户登录和登录成功后来获取用户的信息存储在本地中
实现逻辑与注册基本相似,首先在router下的index.js配置路由,然后搭建登录页面,再后来在login.js配置Api.js文件用于发送ajax请求和获取异步对象,最后在后台服务的router.js中配置登录接口。
router下的index.js配置路由
const routes = [
{
path: "/register",
name: "register",
component: Register,
},
{
path: "/login",
name: "login",
component: Login,
},
];
搭建登录页面,登陆页面需要的是账号和密码。搭建页面如注册一样采用ElementUI的Form表单。(注意这里密码的校验规则与注册不同,只是实现密码不为空的规则)
<template>
<div class="login-container">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="login-ruleForm"
>
<h2 class="login-title">登录</h2>
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>提交</el-button
>
<el-button @click="goRegister('ruleForm')">注册</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
//import { login, getUserInfo } from "@/api/login.js";
export default {
data() {
return {
ruleForm: {
username: "",
pass: "",
},
rules: {
username: [{ required: true, message: "请输入账号", trigger: "blur" }],
pass: [{ required: true, message: "请输入昵称", trigger: "blur" }],
},
};
},
components: {},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
}
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goRegister() {
// 跳转到注册页面,使用的时编程式的登陆跳转方法
this.$router.push("/register");
},
},
};
</script>
<style scoped>
.login-container {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
background: url("../../assets/bgu.gif");
background-size: cover;
}
.login-ruleForm {
width: 400px;
height: 500px;
margin: 150px auto;
padding: 20px;
background-color: aquamarine;
border-radius: 20px;
}
.login-title {
text-align: center;
background-color: rgb(55, 0, 255);
}
</style>
在api下的login.js文件中发送登录的ajax请求。
// 登录
export function login(username,password){
return request({
method:"post",
url:"/user/login",
data:{
username,
password
}
})
}
后端服务在router.js中配置登录接口
router.post("/user/login",function(req,res){
var body = req.body;
console.log(body);
User.findOne({
username:body.username,
password:body.password
},function(err,data){
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"serve error登录失败",
})
}
if(!data){
return res.status(200).json({
code:4000,
flag:false,
message:"账号或密码不存在"
})
}
return res.status(200).json({
"code":2000,
"flag":true,
"message":"登录成功",
"data":{
token:data.token
}
})
})
});
这里是登录后端接口的实现,这里使用的是post接口。路径值为/user/login,获取到的是body,使用User用户表的findOne方法,这里与注册不同的是这里是要将username和password都要获取到,然后根据是否出错返回err,是否有数据,判断数据是否存在,最后如果数据匹配成功,返回一个"data",里面要传递一个token。
//登录
router.post("/user/login",function(req,res){
var body = req.body;
console.log(body);
User.findOne({
username:body.username,
password:body.password
},function(err,data){
if(err){
return res.status(500).json({
code:3000,
flag:false,
message:"serve error登录失败",
})
}
if(!data){
return res.status(200).json({
code:4000,
flag:false,
message:"账号或密码不存在"
})
}
return res.status(200).json({
"code":2000,
"flag":true,
"message":"登录成功",
"data":{
token:data.token
}
})
})
});
返回到前端的login下的index.vue中导入login方法,调用该方法判断登录是否成功。
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
login(this.ruleForm.username, this.ruleForm.pass).then((response) => {
const resp = response.data;
if (resp.flag) {
} else {
this.$message({
message: resp.message,
type: "warning",
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goRegister() {
// 跳转到注册页面,使用的时编程式的登陆跳转方法
this.$router.push("/register");
},
},
};
在后端配置获取用户的信息
router.get("/user/info",function (req,res) {
var body = req.query;
console.log(body);
User.findOne({
token: body.token
}, function (err, data) {
console.log(data);
if (err) {
return res.status(500).json({
code: 3000,
flag: false,
message: "server error"
})
}
if (!data) {
return res.status(200).json({
code: 4000,
flag: false,
message: "token不存在"
})
}
return res.json({
"code": 2000,
"flag": true,
"message": "成功获取用户信息",
"data": {
"nickname": data.nickname,
"id":data._id
}
})
})
});
这里使用的是get方法,获取的是req的query信息,通过User的findOne方法查找我们先前在登录接口设置的token值。然后判断是否获取用户信息成功,在用户信息中传入nickname和id两个值。
接下到前端页面的api下的login.js配置获取用户信息的axios
//获取用户信息
export function getUserInfo(token){
return request({
method:"get",
url:`/user/info?token=${token}`,
})
}
然后在views下的logn下的index.vue导入方法。
在登陆成功后通过getUserInfo将响应的data传入到respUser,在获取用户信息成功后,在本地存储用户信息,并且设置跳转到首页根目录。
import { login, getUserInfo } from "@/api/login.js";
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
login(this.ruleForm.username, this.ruleForm.pass).then((response) => {
const resp = response.data;
if (resp.flag) {
//登录成功则获取用户信息
getUserInfo(resp.data.token).then((response) => {
const respUser = response.data;
console.log(respUser);
if (respUser.flag) {
localStorage.setItem("msm-user",JSON.stringify(respUser.data));
localStorage.setItem("msm-token",resp.data.token)
this.$router.push("/")
} else {
this.$message({
message: respUser.message,
type: "warning",
});
}
});
} else {
this.$message({
message: resp.message,
type: "warning",
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goRegister() {
// 跳转到注册页面,使用的时编程式的登陆跳转方法
this.$router.push("/register");
},
},
};
本章主要实现的是用户的注册、登录。在登录匹配成功后,获取用户信息,并将信息存储在本地中。整体页面的搭建使用的是ElementUI组件库。
api下的login.js
//用于发送ajax请求
import request from "@/utils/request.js";
// 注册
export function register(username,nickname,password){ //这里的参数都是形参
return request({
method:"post",
url:"/user/register",
data:{ //需要向后台传输的数据是req,后台又会响应回来一个数据是res
username,
nickname,
password
}
})
}
// 登录
export function login(username,password){
return request({
method:"post",
url:"/user/login",
data:{
username,
password
}
})
}
//获取用户信息
export function getUserInfo(token){
return request({
method:"get",
url:`/user/info?token=${token}`,
})
}
router下的index.js
import Vue from "vue";
import VueRouter from "vue-router";
// import Register from "../views/register"
import Register from "../views/register";
import Login from "../views/login"
Vue.use(VueRouter);
const routes = [
{
path: "/register",
name: "register",
component: Register,
},
{
path: "/login",
name: "login",
component: Login,
},
];
const router = new VueRouter({
// mode: "history",
base: process.env.BASE_URL,
routes,
});
export default router;
views/login/index.vue
<template>
<div class="login-container">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="login-ruleForm"
>
<h2 class="login-title">登录</h2>
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>提交</el-button
>
<el-button @click="goRegister('ruleForm')">注册</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { login, getUserInfo } from "@/api/login.js";
export default {
data() {
return {
ruleForm: {
username: "",
pass: "",
},
rules: {
username: [{ required: true, message: "请输入账号", trigger: "blur" }],
pass: [{ required: true, message: "请输入昵称", trigger: "blur" }],
},
};
},
components: {},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
login(this.ruleForm.username, this.ruleForm.pass).then((response) => {
const resp = response.data;
if (resp.flag) {
//登录成功则获取用户信息
getUserInfo(resp.data.token).then((response) => {
const respUser = response.data;
console.log(respUser);
if (respUser.flag) {
localStorage.setItem("msm-user",JSON.stringify(respUser.data));
localStorage.setItem("msm-token",resp.data.token)
this.$router.push("/")
} else {
this.$message({
message: respUser.message,
type: "warning",
});
}
});
} else {
this.$message({
message: resp.message,
type: "warning",
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goRegister() {
// 跳转到注册页面,使用的时编程式的登陆跳转方法
this.$router.push("/register");
},
},
};
</script>
<style scoped>
.login-container {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
background: url("../../assets/bgu.gif");
background-size: cover;
}
.login-ruleForm {
width: 400px;
height: 500px;
margin: 150px auto;
padding: 20px;
background-color: aquamarine;
border-radius: 20px;
}
.login-title {
text-align: center;
background-color: rgb(55, 0, 255);
}
</style>
views/register/index.vue
<template>
<div class="register-container">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="register-ruleForm"
>
<h2 class="register-title">注册</h2>
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item label="昵称" prop="nickname">
<el-input v-model="ruleForm.nickname"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input
type="password"
v-model="ruleForm.checkPass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>提交</el-button
>
<el-button @click="goLogin('ruleForm')">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { register } from "@/api/login.js";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
if (this.ruleForm.checkPass !== "") {
this.$refs.ruleForm.validateField("checkPass");
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.ruleForm.pass) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
ruleForm: {
username: "",
nickname: "",
pass: "",
checkPass: "",
},
rules: {
username: [{ required: true, message: "请输入账号", trigger: "blur" }],
nickname: [{ required: true, message: "请输入昵称", trigger: "blur" }],
pass: [{ validator: validatePass, trigger: "blur" }],
checkPass: [{ validator: validatePass2, trigger: "blur" }],
},
};
},
components: {},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
// alert("submit!");
// 调用方法发送ajax请求
register(
this.ruleForm.username,
this.ruleForm.nickname,
this.ruleForm.pass
).then((response) => {
// console.log(response.data);
// 这里的逻辑是如果在后台的数据库中注册成功的话,通过flag的布尔值来判断是否进入登录页面
const resp = response.data;
if (resp.flag) {
// 调转到登录界面
this.$router.push("/login")
} else {
this.$message({
message: resp.message,
type: "warning",
});
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
goLogin(){
// 跳转到登录页面,使用的时编程式的登陆跳转方法
this.$router.push("/login")
}
},
};
</script>
<style scoped>
.register-container {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
background: url("../../assets/bgu.gif");
background-size: cover;
}
.register-ruleForm {
width: 400px;
height: 500px;
margin: 150px auto;
padding: 20px;
background-color: aquamarine;
border-radius: 20px;
}
.register-title {
text-align: center;
background-color: rgb(55, 0, 255);
}
</style>


如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU