diff --git a/challenges/database_challenges/README.md b/challenges/database_challenges/README.md new file mode 100644 index 000000000..d3bdfd6e6 --- /dev/null +++ b/challenges/database_challenges/README.md @@ -0,0 +1,6 @@ +# Headstorm database challenges Zhengran Jiang +Here are my codes for the database challenge. I use MySQL as the relational database language and python to display these commands. +There are test data generated by python and they are in the form of a list of dictionaries. The generate_test_data function generate a test file of size size. +I did not print the create database and tables statement in console since it did not specifically say so. However, these create statements are in the database.py file starting at line 49. To print them, uncomment line 80. + +The data visualization is in the form of an ER diagram in relational data model visualization.png diff --git a/challenges/database_challenges/database.py b/challenges/database_challenges/database.py new file mode 100644 index 000000000..1ce774ec6 --- /dev/null +++ b/challenges/database_challenges/database.py @@ -0,0 +1,109 @@ +import json +import random +import string + +def generate_phone_number(): + phone = ''.join(str(random.randint(0, 9)) for i in range(3)) + phone += "."+ ''.join(str(random.randint(0, 9)) for i in range(3)) + phone += "."+ ''.join(str(random.randint(0, 9)) for i in range(4)) + return phone + + +def generate_test_data(size): + nosql_data =[] + letters = string.ascii_lowercase + + + for i in range(1,size+1): + name = ''.join(random.choice(letters) for i in range(5)) + " " +''.join(random.choice(letters) for i in range(5)) + cellphone = generate_phone_number() + workphone = generate_phone_number() + email = name.replace(" ","")+ "@gmail.com" + address = ''.join(str(random.randint(0, 9)) for i in range(3)) + " Test Way, Dallas TX 75205" + basic_widget_order = random.randint(1, 100) + advanced_widget_order = random.randint(1, 100) + if random.randint(0,1)==0: + protection=False + else: + protection=True + pydict = { + "Record ID": i, + "Name": name, + "Cell Phone":cellphone, + "Work Phone": workphone, + "Email": email, + "Address":address, + "Basic Widget Order": basic_widget_order, + "Advanced Widget Order": advanced_widget_order, + "Protection": protection + } + nosql_data.append(pydict) + with open ("test.json","w") as outfile: + json.dump(nosql_data, outfile,indent=4) + +if __name__ =="__main__": + # generate_test_data(10) + with open ("test.json") as test: + test_data = json.load(test) + # print(json.dumps(test_data,indent=4)) + create_stmt = """ + create database if not exists headstorm_backend; + use headstorm_backend; + create table if not exists application_user ( + record_id Int auto_increment primary key, + username varchar(255) not null, + email varchar(255), + address varchar(255) + ); + create table if not exists application_phone_number( + phone_id Int auto_increment primary key, + record_id Int, + isWork tinyint(1) not null default 0, + contact varchar(15) not null, + foreign key (record_id) references application_user(record_id) + on update restrict + on delete cascade + ); + + create table if not exists application_order( + order_id int auto_increment primary key, + record_id int, + basic_widget_order int not null, + advanced_widget_order int not null, + protection tinyint(1) not null default 0, + foreign key (record_id) references application_user(record_id) + on update restrict + on delete cascade + ); + show tables; + """ + # print(create_stmt) + + for element in test_data: + insert_stmt_user = """ + insert into application_user( + record_id, username, email, address + ) + Values({0},\"{1}\",\"{2}\", \"{3}\"); + """ + print(insert_stmt_user.format(element["Record ID"], element["Name"], element["Email"],element["Address"])) + insert_stmt_phone_number =""" + insert into application_phone_number( + record_id, isWork,contact + ) + Values({0},{1},\"{2}\"); + """ + if element["Cell Phone"]!="": + print(insert_stmt_phone_number.format(element["Record ID"], 0, element["Cell Phone"])) + if element["Work Phone"]!="": + print(insert_stmt_phone_number.format(element["Record ID"], 1, element["Work Phone"])) + insert_stmt_order =""" + insert into application_order ( + record_id, basic_widget_order, advanced_widget_order,protection) + Values({0},{1},{2},{3}); + """ + if element["Protection"]: + protected =1 + else: + protected =0 + print(insert_stmt_order.format(element["Record ID"], element["Basic Widget Order"], element["Advanced Widget Order"],protected)) \ No newline at end of file diff --git a/challenges/database_challenges/relational data model visualization.png b/challenges/database_challenges/relational data model visualization.png new file mode 100644 index 000000000..b4f7bb3cc Binary files /dev/null and b/challenges/database_challenges/relational data model visualization.png differ diff --git a/challenges/database_challenges/test.json b/challenges/database_challenges/test.json new file mode 100644 index 000000000..c3ef3c58a --- /dev/null +++ b/challenges/database_challenges/test.json @@ -0,0 +1,112 @@ +[ + { + "Record ID": 1, + "Name": "nsphw kwgck", + "Cell Phone": "893.236.4843", + "Work Phone": "604.794.5320", + "Email": "nsphwkwgck@gmail.com", + "Address": "564 Test Way, Dallas TX 75205", + "Basic Widget Order": 11, + "Advanced Widget Order": 83, + "Protection": true + }, + { + "Record ID": 2, + "Name": "gixwk muaoc", + "Cell Phone": "199.564.9387", + "Work Phone": "360.421.3433", + "Email": "gixwkmuaoc@gmail.com", + "Address": "516 Test Way, Dallas TX 75205", + "Basic Widget Order": 3, + "Advanced Widget Order": 38, + "Protection": true + }, + { + "Record ID": 3, + "Name": "suzmv netbp", + "Cell Phone": "980.497.8755", + "Work Phone": "245.891.6646", + "Email": "suzmvnetbp@gmail.com", + "Address": "394 Test Way, Dallas TX 75205", + "Basic Widget Order": 48, + "Advanced Widget Order": 12, + "Protection": false + }, + { + "Record ID": 4, + "Name": "utenq sobmx", + "Cell Phone": "388.717.0782", + "Work Phone": "726.228.4275", + "Email": "utenqsobmx@gmail.com", + "Address": "631 Test Way, Dallas TX 75205", + "Basic Widget Order": 53, + "Advanced Widget Order": 56, + "Protection": false + }, + { + "Record ID": 5, + "Name": "kcddl qachd", + "Cell Phone": "362.386.2664", + "Work Phone": "682.940.5507", + "Email": "kcddlqachd@gmail.com", + "Address": "046 Test Way, Dallas TX 75205", + "Basic Widget Order": 28, + "Advanced Widget Order": 58, + "Protection": false + }, + { + "Record ID": 6, + "Name": "encoi nukxg", + "Cell Phone": "769.157.2534", + "Work Phone": "143.782.2238", + "Email": "encoinukxg@gmail.com", + "Address": "440 Test Way, Dallas TX 75205", + "Basic Widget Order": 94, + "Advanced Widget Order": 44, + "Protection": true + }, + { + "Record ID": 7, + "Name": "fiohg ugulh", + "Cell Phone": "566.452.2541", + "Work Phone": "799.030.0851", + "Email": "fiohgugulh@gmail.com", + "Address": "566 Test Way, Dallas TX 75205", + "Basic Widget Order": 50, + "Advanced Widget Order": 79, + "Protection": false + }, + { + "Record ID": 8, + "Name": "wbybs ytaoq", + "Cell Phone": "567.719.7844", + "Work Phone": "754.769.2508", + "Email": "wbybsytaoq@gmail.com", + "Address": "086 Test Way, Dallas TX 75205", + "Basic Widget Order": 51, + "Advanced Widget Order": 41, + "Protection": false + }, + { + "Record ID": 9, + "Name": "huzwc krusv", + "Cell Phone": "967.533.6333", + "Work Phone": "510.833.4167", + "Email": "huzwckrusv@gmail.com", + "Address": "721 Test Way, Dallas TX 75205", + "Basic Widget Order": 25, + "Advanced Widget Order": 93, + "Protection": false + }, + { + "Record ID": 10, + "Name": "ysrkm btdex", + "Cell Phone": "244.662.6300", + "Work Phone": "005.947.4162", + "Email": "ysrkmbtdex@gmail.com", + "Address": "351 Test Way, Dallas TX 75205", + "Basic Widget Order": 42, + "Advanced Widget Order": 47, + "Protection": true + } +] \ No newline at end of file diff --git a/challenges/frontend_challenges/README.md b/challenges/frontend_challenges/README.md new file mode 100644 index 000000000..39cfe4ca2 --- /dev/null +++ b/challenges/frontend_challenges/README.md @@ -0,0 +1,5 @@ +# Headstorm frontend challenges (Zhengran Jiang) +Here are my codes for the frontend challenges. Since it states to build a webiste quickly, I did not use any external JavaScript libraries like jQueries or React and keep my code minimal. + +Also, the frontend challenge states to use Google recaptcha v3 but the link directs to v2, so I assume that recaptcha v2 is the one that I should be using. + diff --git a/challenges/frontend_challenges/images/README.md b/challenges/frontend_challenges/images/README.md new file mode 100644 index 000000000..b815a980d --- /dev/null +++ b/challenges/frontend_challenges/images/README.md @@ -0,0 +1 @@ +Here is the favicon image. diff --git a/challenges/frontend_challenges/images/favicon.ico b/challenges/frontend_challenges/images/favicon.ico new file mode 100644 index 000000000..764d1c0b3 Binary files /dev/null and b/challenges/frontend_challenges/images/favicon.ico differ diff --git a/challenges/frontend_challenges/index.html b/challenges/frontend_challenges/index.html new file mode 100644 index 000000000..64887e4f9 --- /dev/null +++ b/challenges/frontend_challenges/index.html @@ -0,0 +1,73 @@ + + +
+ + + +