我是一家公司的开发人员,该公司的应用程序是用PHP和MySQL构建的.我们有大约300个用户使用bcrypt对其密码进行哈希处理并存储在users表中的用户.我们希望使用Angular和Firebase重建应用程序.
我的问题是,如何通过Firebase迁移这些用户并使用Firebase Auth.迁移配置文件信息很容易,但我想确保用户在登录新应用程序时仍然可以使用相同的电子邮件/密码.
以下是我想到的一些方法.在我看来,所有这些都很可怕.
A)创建一个使用bcrypt的自定义身份验证系统,然后只复制哈希值.这不是我想要的,因为我不想维护自定义身份验证解决方案.
B)每次用户登录旧系统时,从登录字段中获取密码,以明文形式存储,然后使用电子邮件/密码在Firebase中手动创建每个用户.在我们切换到新应用程序之前,这将要求100%的用户登录.这不太可能.这显然也是对隐私的侵犯.我敢肯定它违反了某种法律或标准.但它有效,这是最后的选择.
C)每次用户登录旧系统时,请以明文形式将电子邮件/密码发送到脚本,该脚本使用相同的用户/电子邮件自动创建新的Firebase用户.在我们切换到新应用程序之前,这将要求100%的用户登录.这不太可能.它比选项B更难建立.
这些选项都不是很好看.他们都有缺点.有更好的选择吗?如果不是,在B和C之间,哪个是最合法/合乎道德的?选项B诱惑我,因为它非常简单,但我不想破坏任何法律或失去我公司客户的信任.
我只见过在if语句中使用"==".那么"=="在这种情况下如何运作?
a = 5;
b = (a == 18 % 13);
Run Code Online (Sandbox Code Playgroud) 我已经阅读了有关此问题的所有问题,但我仍然没有找到答案.所以不要将其标记为重复.
我正在使用AngularFire和Angular 2以及Typescript.我正在使用FirebaseListObservable
从端点中提取24条最新记录的列表.这是我的代码:
import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2';
@Component({
selector: 'story-list',
templateUrl: './story-list.component.html',
styleUrls: ['./story-list.component.scss']
})
export class StoryListComponent {
stories: FirebaseListObservable<any[]>;
constructor(af: AngularFire) {
this.stories = af.database.list('/stories', {
query: {
limitToLast: 24
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这将按预期返回24个最新故事的列表,但是当我在页面上呈现它们时:
<p *ngFor="let story of stories | async">{{ story.title }}</p>
Run Code Online (Sandbox Code Playgroud)
它显示了最古老的故事,最新的故事在底部.我明白为什么会这样,而且我并没有声称这是一个问题,但我该如何扭转呢?我希望能够在查询中反转这一点,但如果这不可能,我会开放以某种方式在渲染中反转它.
无论您的答案是什么,请不要只链接到文档.没有AngularFire的文档可以完全解释这一点.我读过每一个字.请提供真实的工作代码.
但是,我绝对不会接受的一个解决方案是在创建时在记录中存储负数日期,然后根据该日期进行排序.这是我听过的最糟糕的解决方案,真正的数据库系统允许您在查询中执行此操作.所以请不要建议.
如果您有任何想法,我将不胜感激.我不想再使用其他产品,因为我喜欢Firebase.
javascript angularjs firebase angularfire firebase-realtime-database
注意:我没有在这里使用Flask-SQLAlchemy,我正在使用SQLAlchemy ORM
我在StackOverflow上看到了几个答案,说这是一种更新记录的方法:
session.query(FoobarModel).get(foobar_id).update({'name': 'New Foobar Name!'})
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误说:
AttributeError: 'FoobarModel' object has no attribute 'update'
Run Code Online (Sandbox Code Playgroud)
我能够像这样更新,但是:
foobar = session.query(FoobarModel).get(foobar_id)
foobar.name = 'New Foobar Name!'
session.commit()
session.flush()
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这样的事情(所以我不必写出每个属性):
new_foobar = {'name': 'New Foobar Name!'}
old_foobar = session.query(FoobarModel).get(foobar_id)
for property in new_foobar:
old_foobar[property] = new_foobar[property]
session.commit()
session.flush()
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误:
TypeError: 'FoobarModel' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
在做了一些挖掘之后我发现它是因为即使这样也行不通:
print(old_foobar['name'])
Run Code Online (Sandbox Code Playgroud)
哪个引发错误:
TypeError: 'FoobarModel' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
老实说,在我看来,第一种语法是最好的,但我无法让它发挥作用.有任何想法吗?
在MySQL中,如果我有两个这样的表:
appointments
appointment_id patient_id appointment_time
-------------------------------------------------------
1 42 2017-10-17 08:00:00
2 43 2017-10-17 08:30:00
Run Code Online (Sandbox Code Playgroud)
和
patients
patient_id name
---------------------------
42 Joe Smith
43 Sally Sue
44 Jim Bob
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样离开两个表
SELECT *
FROM appointments
LEFT JOIN patients ON appointments.patient_id = patients.patient_id
Run Code Online (Sandbox Code Playgroud)
我会得到这样的结果:
appointment_id patient_id appointment_time patient_id name
----------------------------------------------------------------------------------
1 42 2017-10-17 08:00:00 42 Joe Smith
2 43 2017-10-17 08:30:00 43 Sally Sue
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在Javascript(ES6 +)中,如果我有两个这样的对象数组:
const appointments = [
{
appointmentId: 1,
patientId: 42,
appointmentTime: '2017-10-17 08:00:00'
},
{
appointmentId: 2,
patientId: …
Run Code Online (Sandbox Code Playgroud) 这可能看起来不是一个有用的脚本,但我需要一些基本上允许用户单击页面上任意位置并且光标将转到文本区域的东西。
我如何想象这种情况是通过拥有但我不太了解 javascript 来做到这一点的。
当用户单击正文、段落、图像或正文内的任何内容时,光标将自动转到 textarea 并且他将能够输入它。
我知道这似乎对任何事情都没有用,但相信我,我有它的用处。谢谢您的帮助!!
我有一个脚本:
if(isset($_FILES['image'])){
$errors = array();
$allowed_ext = array('jpg', 'jpeg', 'png', 'gif');
$file_name = $_FILE['image']['name'];
$file_ext = strtolower(end(explode('.', $file_name)));
$file_size = $_FILE['image']['size'];
$file_tmp = $_FILE['image']['tmp_name'];
if(in_array($file_ext, $allowed_ext) === false){
$errors[] = 'Extension not allowed';
}
if($file_size > 2097152){
$errors[] = 'file size must be under 2mb';
}
if(empty($errors)){
if(move_uploaded_file($file_tmp, "../../img/usr/profile/.$file_name")){
echo 'File uploaded';
}
}else{
foreach($errors as $error){
echo $error, '<br>';
}
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.它应该将图像上传到某个目录.这是html:
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" name="submit" value="Update Info">
</form>
Run Code Online (Sandbox Code Playgroud)
当我点击提交时,屏幕顶部显示"不允许扩展"的错误.html和php在同一个文件中(我刚给你一个小片段.)我的代码有什么问题吗?谢谢!
javascript ×3
firebase ×2
angularfire ×1
angularjs ×1
bcrypt ×1
c ×1
c++ ×1
file ×1
image ×1
onclick ×1
php ×1
python ×1
sqlalchemy ×1
textarea ×1
upload ×1